tmex-cli 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/runtime/server.js +95 -6
- package/package.json +1 -1
- package/resources/fe-dist/assets/{DevicePage-B9rZioAr.js → DevicePage-Di11uzbS.js} +8 -8
- package/resources/fe-dist/assets/{DevicePage-B9rZioAr.js.map → DevicePage-Di11uzbS.js.map} +1 -1
- package/resources/fe-dist/assets/{DevicesPage-Bco831ry.js → DevicesPage-dj7Pel6f.js} +2 -2
- package/resources/fe-dist/assets/{DevicesPage-Bco831ry.js.map → DevicesPage-dj7Pel6f.js.map} +1 -1
- package/resources/fe-dist/assets/{SettingsPage-BRs8Unfx.js → SettingsPage-DwpbDA_e.js} +2 -2
- package/resources/fe-dist/assets/{SettingsPage-BRs8Unfx.js.map → SettingsPage-DwpbDA_e.js.map} +1 -1
- package/resources/fe-dist/assets/{index-BhBqXsZI.js → index-61hq_aNX.js} +3 -3
- package/resources/fe-dist/assets/{index-BhBqXsZI.js.map → index-61hq_aNX.js.map} +1 -1
- package/resources/fe-dist/assets/{select-D70hG6p7.js → select-DI4HQZd4.js} +2 -2
- package/resources/fe-dist/assets/{select-D70hG6p7.js.map → select-DI4HQZd4.js.map} +1 -1
- package/resources/fe-dist/assets/{switch-DsyIGzyC.js → switch-DsfDIUrU.js} +2 -2
- package/resources/fe-dist/assets/{switch-DsyIGzyC.js.map → switch-DsfDIUrU.js.map} +1 -1
- package/resources/fe-dist/assets/{useValueChanged-CBb-JR7o.js → useValueChanged-AVaPYvln.js} +2 -2
- package/resources/fe-dist/assets/{useValueChanged-CBb-JR7o.js.map → useValueChanged-AVaPYvln.js.map} +1 -1
- package/resources/fe-dist/index.html +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevicePage-B9rZioAr.js","sources":["../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/arrow-down-to-line.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/keyboard.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/smartphone.js","../../../../packages/ghostty-terminal/src/canvas-renderer.ts","../../../../packages/ghostty-terminal/src/ghostty-keycodes.ts","../../../../packages/ghostty-terminal/src/render-state.ts","../../../../packages/ghostty-terminal/src/selection-model.ts","../../../../packages/ghostty-terminal/src/selection-clipboard.ts","../../../../packages/ghostty-terminal/src/assets/ghostty-vt.wasm?url","../../../../packages/ghostty-terminal/src/ghostty-wasm.ts","../../../../packages/ghostty-terminal/src/terminal.ts","../../src/components/terminal/theme.ts","../../src/components/terminal/normalization.ts","../../src/components/terminal/useMobileTouch.ts","../../src/utils/resizeSyncGuards.ts","../../src/components/terminal/useTerminalResize.ts","../../src/components/terminal/Terminal.tsx","../../src/utils/selectionGuards.ts","../../src/utils/site.ts","../../src/utils/terminalMeta.ts","../../src/pages/DevicePage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 17V3\", key: \"1cwfxf\" }],\n [\"path\", { d: \"m6 11 6 6 6-6\", key: \"12ii2o\" }],\n [\"path\", { d: \"M19 21H5\", key: \"150jfl\" }]\n];\nconst ArrowDownToLine = createLucideIcon(\"arrow-down-to-line\", __iconNode);\n\nexport { __iconNode, ArrowDownToLine as default };\n//# sourceMappingURL=arrow-down-to-line.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 8h.01\", key: \"1r9ogq\" }],\n [\"path\", { d: \"M12 12h.01\", key: \"1mp3jc\" }],\n [\"path\", { d: \"M14 8h.01\", key: \"1primd\" }],\n [\"path\", { d: \"M16 12h.01\", key: \"1l6xoz\" }],\n [\"path\", { d: \"M18 8h.01\", key: \"emo2bl\" }],\n [\"path\", { d: \"M6 8h.01\", key: \"x9i8wu\" }],\n [\"path\", { d: \"M7 16h10\", key: \"wp8him\" }],\n [\"path\", { d: \"M8 12h.01\", key: \"czm47f\" }],\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }]\n];\nconst Keyboard = createLucideIcon(\"keyboard\", __iconNode);\n\nexport { __iconNode, Keyboard as default };\n//# sourceMappingURL=keyboard.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n];\nconst Smartphone = createLucideIcon(\"smartphone\", __iconNode);\n\nexport { __iconNode, Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","import type {\n GhosttyCellDimensions,\n GhosttyColorRgb,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n GhosttySelectionRect,\n GhosttyTheme,\n} from './types';\n\ntype CanvasRendererOptions = {\n screenElement: HTMLElement;\n theme: GhosttyTheme;\n fontFamily: string;\n fontSize: number;\n};\n\ntype CanvasRendererFrame = {\n meta: GhosttyRenderSnapshotMeta;\n rows: GhosttyRenderRow[];\n cellDimensions: GhosttyCellDimensions;\n selectionRects?: GhosttySelectionRect[];\n selectionColor?: string;\n};\n\ntype CanvasRendererDebugState = {\n kind: 'canvas';\n frameCount: number;\n lastDrawnRows: number[];\n};\n\ntype CursorCell = {\n x: number;\n y: number;\n style: GhosttyRenderSnapshotMeta['cursor']['style'];\n};\n\nfunction colorToCss(color: GhosttyColorRgb): string {\n return `rgb(${color.r} ${color.g} ${color.b})`;\n}\n\nfunction ensureContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('2d canvas context unavailable');\n }\n\n return context;\n}\n\nexport class CanvasRenderer {\n readonly kind = 'canvas';\n\n private readonly mainCanvas: HTMLCanvasElement;\n private readonly selectionCanvas: HTMLCanvasElement;\n private readonly cursorCanvas: HTMLCanvasElement;\n private readonly mainContext: CanvasRenderingContext2D;\n private readonly selectionContext: CanvasRenderingContext2D;\n private readonly cursorContext: CanvasRenderingContext2D;\n private theme: GhosttyTheme;\n private readonly fontFamily: string;\n private readonly fontSize: number;\n private cellDimensions: GhosttyCellDimensions = { width: 9, height: 17 };\n private cols = 0;\n private rows = 0;\n private lastCursor: CursorCell | null = null;\n private frameCount = 0;\n private lastDrawnRows: number[] = [];\n private readonly colorCache = new Map<string, string>();\n private readonly fontCache = new Map<string, string>();\n private cursorBlinkVisible = true;\n private cursorBlinkTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: CanvasRendererOptions) {\n this.theme = options.theme;\n this.fontFamily = options.fontFamily;\n this.fontSize = options.fontSize;\n\n options.screenElement.style.position = 'relative';\n options.screenElement.style.overflow = 'hidden';\n\n this.mainCanvas = document.createElement('canvas');\n this.selectionCanvas = document.createElement('canvas');\n this.cursorCanvas = document.createElement('canvas');\n\n for (const [canvas, layer] of [\n [this.mainCanvas, 'main'],\n [this.selectionCanvas, 'selection'],\n [this.cursorCanvas, 'cursor'],\n ] as const) {\n canvas.dataset.layer = layer;\n canvas.style.position = 'absolute';\n canvas.style.inset = '0';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.pointerEvents = 'none';\n options.screenElement.appendChild(canvas);\n }\n\n this.mainContext = ensureContext(this.mainCanvas);\n this.selectionContext = ensureContext(this.selectionCanvas);\n this.cursorContext = ensureContext(this.cursorCanvas);\n }\n\n setTheme(theme: GhosttyTheme): void {\n this.theme = theme;\n this.colorCache.clear();\n }\n\n render(frame: CanvasRendererFrame): void {\n this.frameCount += 1;\n this.lastDrawnRows = [];\n this.cellDimensions = frame.cellDimensions;\n this.resize(frame.meta.cols, frame.meta.rows);\n this.drawSelection(frame.selectionRects ?? [], frame.selectionColor ?? this.theme.selectionBackground);\n\n if (frame.meta.dirty === 'clean') {\n this.drawCursor(frame.meta);\n return;\n }\n\n const drawAllRows = frame.meta.dirty === 'full';\n const targetRows = drawAllRows ? frame.rows : frame.rows.filter((row) => row.dirty);\n\n for (const row of targetRows) {\n this.drawRow(row, frame.meta.colors);\n this.lastDrawnRows.push(row.y);\n }\n\n this.drawCursor(frame.meta);\n }\n\n getDebugState(): CanvasRendererDebugState {\n return {\n kind: this.kind,\n frameCount: this.frameCount,\n lastDrawnRows: [...this.lastDrawnRows],\n };\n }\n\n dispose(): void {\n this.mainCanvas.remove();\n this.selectionCanvas.remove();\n this.cursorCanvas.remove();\n this.colorCache.clear();\n this.fontCache.clear();\n this.lastCursor = null;\n this.stopCursorBlink();\n }\n\n private startCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n return;\n }\n this.cursorBlinkTimer = setInterval(() => {\n this.cursorBlinkVisible = !this.cursorBlinkVisible;\n this.cursorCanvas.style.opacity = this.cursorBlinkVisible ? '1' : '0';\n }, 1000);\n }\n\n private stopCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n clearInterval(this.cursorBlinkTimer);\n this.cursorBlinkTimer = null;\n }\n this.cursorBlinkVisible = true;\n this.cursorCanvas.style.opacity = '1';\n }\n\n private resize(cols: number, rows: number): void {\n const nextCols = Math.max(1, cols);\n const nextRows = Math.max(1, rows);\n const width = nextCols * this.cellDimensions.width;\n const height = nextRows * this.cellDimensions.height;\n const dpr = Math.max(1, globalThis.devicePixelRatio ?? 1);\n\n if (this.cols === nextCols && this.rows === nextRows) {\n const cssWidth = `${width}px`;\n const cssHeight = `${height}px`;\n if (this.mainCanvas.style.width === cssWidth && this.mainCanvas.style.height === cssHeight) {\n return;\n }\n }\n\n this.cols = nextCols;\n this.rows = nextRows;\n\n for (const canvas of [this.mainCanvas, this.selectionCanvas, this.cursorCanvas]) {\n canvas.width = Math.max(1, Math.ceil(width * dpr));\n canvas.height = Math.max(1, Math.ceil(height * dpr));\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n\n for (const context of [this.mainContext, this.selectionContext, this.cursorContext]) {\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.textBaseline = 'top';\n context.imageSmoothingEnabled = false;\n }\n }\n\n private drawSelection(rects: GhosttySelectionRect[], color: string): void {\n this.selectionContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (rects.length === 0) {\n return;\n }\n\n this.selectionContext.fillStyle = color;\n for (const rect of rects) {\n this.selectionContext.fillRect(\n rect.x * this.cellDimensions.width,\n rect.row * this.cellDimensions.height,\n rect.width * this.cellDimensions.width,\n this.cellDimensions.height\n );\n }\n }\n\n private drawRow(row: GhosttyRenderRow, colors: GhosttyRenderSnapshotMeta['colors']): void {\n const y = row.y * this.cellDimensions.height;\n const width = this.cols * this.cellDimensions.width;\n const defaultBackground = this.toCss(colors.background);\n\n this.mainContext.clearRect(0, y, width, this.cellDimensions.height);\n this.mainContext.fillStyle = defaultBackground;\n this.mainContext.fillRect(0, y, width, this.cellDimensions.height);\n\n for (const cell of row.cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n const x = cell.x * this.cellDimensions.width;\n const bg = cell.style.inverse\n ? cell.fgColor ?? colors.foreground\n : cell.bgColor ?? colors.background;\n const fg = cell.style.inverse\n ? cell.bgColor ?? colors.background\n : cell.fgColor ?? colors.foreground;\n const cellWidth = cell.widthKind === 'wide' ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n\n if (bg.r !== colors.background.r || bg.g !== colors.background.g || bg.b !== colors.background.b) {\n this.mainContext.fillStyle = this.toCss(bg);\n this.mainContext.fillRect(x, y, cellWidth, this.cellDimensions.height);\n }\n\n if (!cell.text || cell.style.invisible) {\n continue;\n }\n\n this.mainContext.font = this.resolveFont(cell.style);\n this.mainContext.fillStyle = this.toCss(fg);\n this.mainContext.fillText(cell.text, x, y);\n\n if (cell.style.underline > 0) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.strikethrough) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height * 0.55,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.overline) {\n this.mainContext.fillRect(x, y + 1, Math.max(cellWidth - 1, 1), 1);\n }\n }\n }\n\n private drawCursor(meta: GhosttyRenderSnapshotMeta): void {\n const colors = meta.colors;\n const cursor = meta.cursor;\n const previous = this.lastCursor;\n this.cursorContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (!cursor.visible || cursor.x === null || cursor.y === null) {\n this.lastCursor = null;\n this.stopCursorBlink();\n return;\n }\n\n const x = cursor.x * this.cellDimensions.width;\n const y = cursor.y * this.cellDimensions.height;\n const width = cursor.wideTail ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n const cursorColor = colors.cursor ?? colors.foreground;\n const cssColor = this.toCss(cursorColor);\n\n this.cursorContext.fillStyle = cssColor;\n this.cursorContext.strokeStyle = cssColor;\n this.cursorContext.globalAlpha = 0.7;\n this.cursorContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(width - 1, 1),\n 2\n );\n this.cursorContext.globalAlpha = 1;\n\n this.startCursorBlink();\n\n this.lastCursor = {\n x: cursor.x,\n y: cursor.y,\n style: cursor.style,\n };\n\n if (\n previous &&\n (previous.x !== this.lastCursor.x ||\n previous.y !== this.lastCursor.y ||\n previous.style !== this.lastCursor.style)\n ) {\n this.lastDrawnRows.push(previous.y);\n }\n }\n\n private resolveFont(style: GhosttyRenderRow['cells'][number]['style']): string {\n const key = [\n style.italic ? 'italic' : 'normal',\n style.bold ? '700' : '400',\n `${this.fontSize}px`,\n this.fontFamily,\n ].join('|');\n\n const cached = this.fontCache.get(key);\n if (cached) {\n return cached;\n }\n\n const font = `${style.italic ? 'italic ' : ''}${style.bold ? '700 ' : ''}${this.fontSize}px ${this.fontFamily}`;\n this.fontCache.set(key, font);\n return font;\n }\n\n private toCss(color: GhosttyColorRgb): string {\n const key = `${color.r},${color.g},${color.b}`;\n const cached = this.colorCache.get(key);\n if (cached) {\n return cached;\n }\n\n const css = colorToCss(color);\n this.colorCache.set(key, css);\n return css;\n }\n}\n\nexport type { CanvasRendererDebugState, CanvasRendererFrame, CanvasRendererOptions };\n","const KEY_UNIDENTIFIED = 0;\n\nconst KEY_CODE_MAP: Record<string, number> = {\n Backquote: 1,\n Backslash: 2,\n BracketLeft: 3,\n BracketRight: 4,\n Comma: 5,\n Digit0: 6,\n Digit1: 7,\n Digit2: 8,\n Digit3: 9,\n Digit4: 10,\n Digit5: 11,\n Digit6: 12,\n Digit7: 13,\n Digit8: 14,\n Digit9: 15,\n Equal: 16,\n IntlBackslash: 17,\n IntlRo: 18,\n IntlYen: 19,\n KeyA: 20,\n KeyB: 21,\n KeyC: 22,\n KeyD: 23,\n KeyE: 24,\n KeyF: 25,\n KeyG: 26,\n KeyH: 27,\n KeyI: 28,\n KeyJ: 29,\n KeyK: 30,\n KeyL: 31,\n KeyM: 32,\n KeyN: 33,\n KeyO: 34,\n KeyP: 35,\n KeyQ: 36,\n KeyR: 37,\n KeyS: 38,\n KeyT: 39,\n KeyU: 40,\n KeyV: 41,\n KeyW: 42,\n KeyX: 43,\n KeyY: 44,\n KeyZ: 45,\n Minus: 46,\n Period: 47,\n Quote: 48,\n Semicolon: 49,\n Slash: 50,\n AltLeft: 51,\n AltRight: 52,\n Backspace: 53,\n CapsLock: 54,\n ContextMenu: 55,\n ControlLeft: 56,\n ControlRight: 57,\n Enter: 58,\n MetaLeft: 59,\n MetaRight: 60,\n ShiftLeft: 61,\n ShiftRight: 62,\n Space: 63,\n Tab: 64,\n Convert: 65,\n KanaMode: 66,\n NonConvert: 67,\n Delete: 68,\n End: 69,\n Help: 70,\n Home: 71,\n Insert: 72,\n PageDown: 73,\n PageUp: 74,\n ArrowDown: 75,\n ArrowLeft: 76,\n ArrowRight: 77,\n ArrowUp: 78,\n NumLock: 79,\n Numpad0: 80,\n Numpad1: 81,\n Numpad2: 82,\n Numpad3: 83,\n Numpad4: 84,\n Numpad5: 85,\n Numpad6: 86,\n Numpad7: 87,\n Numpad8: 88,\n Numpad9: 89,\n NumpadAdd: 90,\n NumpadBackspace: 91,\n NumpadClear: 92,\n NumpadClearEntry: 93,\n NumpadComma: 94,\n NumpadDecimal: 95,\n NumpadDivide: 96,\n NumpadEnter: 97,\n NumpadEqual: 98,\n NumpadMemoryAdd: 99,\n NumpadMemoryClear: 100,\n NumpadMemoryRecall: 101,\n NumpadMemoryStore: 102,\n NumpadMemorySubtract: 103,\n NumpadMultiply: 104,\n NumpadParenLeft: 105,\n NumpadParenRight: 106,\n NumpadSubtract: 107,\n NumpadSeparator: 108,\n NumpadUp: 109,\n NumpadDown: 110,\n NumpadRight: 111,\n NumpadLeft: 112,\n NumpadBegin: 113,\n NumpadHome: 114,\n NumpadEnd: 115,\n NumpadInsert: 116,\n NumpadDelete: 117,\n NumpadPageUp: 118,\n NumpadPageDown: 119,\n Escape: 120,\n F1: 121,\n F2: 122,\n F3: 123,\n F4: 124,\n F5: 125,\n F6: 126,\n F7: 127,\n F8: 128,\n F9: 129,\n F10: 130,\n F11: 131,\n F12: 132,\n F13: 133,\n F14: 134,\n F15: 135,\n F16: 136,\n F17: 137,\n F18: 138,\n F19: 139,\n F20: 140,\n F21: 141,\n F22: 142,\n F23: 143,\n F24: 144,\n F25: 145,\n Fn: 146,\n FnLock: 147,\n PrintScreen: 148,\n ScrollLock: 149,\n Pause: 150,\n BrowserBack: 151,\n BrowserFavorites: 152,\n BrowserForward: 153,\n BrowserHome: 154,\n BrowserRefresh: 155,\n BrowserSearch: 156,\n BrowserStop: 157,\n Eject: 158,\n LaunchApp1: 159,\n LaunchApp2: 160,\n LaunchMail: 161,\n MediaPlayPause: 162,\n MediaSelect: 163,\n MediaStop: 164,\n MediaTrackNext: 165,\n MediaTrackPrevious: 166,\n Power: 167,\n Sleep: 168,\n AudioVolumeDown: 169,\n AudioVolumeMute: 170,\n AudioVolumeUp: 171,\n WakeUp: 172,\n Copy: 173,\n Cut: 174,\n Paste: 175,\n};\n\nconst UNSHIFTED_CODEPOINTS: Record<string, string> = {\n Backquote: '`',\n Backslash: '\\\\',\n BracketLeft: '[',\n BracketRight: ']',\n Comma: ',',\n Equal: '=',\n Minus: '-',\n Period: '.',\n Quote: \"'\",\n Semicolon: ';',\n Slash: '/',\n Space: ' ',\n IntlBackslash: '\\\\',\n IntlYen: '¥',\n IntlRo: '\\\\',\n};\n\nfor (let index = 0; index <= 9; index += 1) {\n UNSHIFTED_CODEPOINTS[`Digit${index}`] = String(index);\n}\n\nfor (let index = 0; index < 26; index += 1) {\n const uppercase = String.fromCharCode(65 + index);\n const lowercase = String.fromCharCode(97 + index);\n UNSHIFTED_CODEPOINTS[`Key${uppercase}`] = lowercase;\n}\n\nexport function getGhosttyKeyCode(code: string): number {\n return KEY_CODE_MAP[code] ?? KEY_UNIDENTIFIED;\n}\n\nexport function getUnshiftedCodepoint(code: string): number | null {\n const value = UNSHIFTED_CODEPOINTS[code];\n return value ? value.codePointAt(0) ?? null : null;\n}\n","import type { GhosttyBindings } from './ghostty-wasm';\nimport type {\n GhosttyCellWidthKind,\n GhosttyColorRgb,\n GhosttyCursorVisualStyle,\n GhosttyRenderCell,\n GhosttyRenderCellStyle,\n GhosttyRenderDirtyState,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n} from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_INVALID_VALUE = -2;\n\nconst GHOSTTY_RENDER_STATE_DATA_COLS = 1;\nconst GHOSTTY_RENDER_STATE_DATA_ROWS = 2;\nconst GHOSTTY_RENDER_STATE_DATA_DIRTY = 3;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE = 10;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE = 11;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING = 12;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT = 13;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE = 14;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X = 15;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y = 16;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL = 17;\n\nconst GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY = 1;\nconst GHOSTTY_RENDER_STATE_ROW_DATA_RAW = 2;\n\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW = 1;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE = 2;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN = 3;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF = 4;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR = 5;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR = 6;\n\nconst GHOSTTY_ROW_DATA_WRAP = 1;\nconst GHOSTTY_ROW_DATA_WRAP_CONTINUATION = 2;\n\nconst GHOSTTY_CELL_DATA_WIDE = 3;\nconst GHOSTTY_CELL_DATA_HAS_TEXT = 4;\n\ntype GhosttyRenderStateResources = {\n bindings: GhosttyBindings;\n renderStateHandle: number;\n rowIteratorHandle: number;\n rowCellsHandle: number;\n snapshotVersion: number;\n disposed: boolean;\n cachedMeta: GhosttyRenderSnapshotMeta | null;\n};\n\nfunction ensureActive(resources: GhosttyRenderStateResources): void {\n if (resources.disposed || resources.renderStateHandle === 0) {\n throw new Error('render state resources already disposed');\n }\n}\n\nfunction resultToDirtyState(value: number): GhosttyRenderDirtyState {\n switch (value) {\n case 2:\n return 'full';\n case 1:\n return 'partial';\n default:\n return 'clean';\n }\n}\n\nfunction resultToCursorStyle(value: number): GhosttyCursorVisualStyle {\n switch (value) {\n case 0:\n return 'bar';\n case 2:\n return 'underline';\n case 3:\n return 'block-hollow';\n default:\n return 'block';\n }\n}\n\nfunction resultToCellWidthKind(value: number): GhosttyCellWidthKind {\n switch (value) {\n case 1:\n return 'wide';\n case 2:\n return 'spacer-tail';\n case 3:\n return 'spacer-head';\n default:\n return 'narrow';\n }\n}\n\nfunction readColorAt(bindings: GhosttyBindings, ptr: number): GhosttyColorRgb {\n return {\n r: bindings.view().getUint8(ptr),\n g: bindings.view().getUint8(ptr + 1),\n b: bindings.view().getUint8(ptr + 2),\n };\n}\n\nfunction readOptionalColor(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number\n): GhosttyColorRgb | null {\n const color = resources.bindings.allocStruct('GhosttyColorRgb');\n\n try {\n const result = read(color.ptr);\n if (result === GHOSTTY_INVALID_VALUE) {\n return null;\n }\n\n if (result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty optional color read failed with result ${result}`);\n }\n\n return readColorAt(resources.bindings, color.ptr);\n } finally {\n color.free();\n }\n}\n\nfunction readBool(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): boolean {\n const ptr = resources.bindings.allocU8();\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty bool read failed with result ${result}`);\n }\n\n return resources.bindings.readU8(ptr) !== 0;\n } finally {\n resources.bindings.freeU8(ptr);\n }\n}\n\nfunction readU16(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(2);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u16 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint16(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 2);\n }\n}\n\nfunction readU32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u32 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readEnumI32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty enum read failed with result ${result}`);\n }\n\n return resources.bindings.view().getInt32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readU64(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): bigint {\n const ptr = resources.bindings.allocBytes(8);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u64 read failed with result ${result}`);\n }\n\n return resources.bindings.readU64(ptr);\n } finally {\n resources.bindings.freeBytes(ptr, 8);\n }\n}\n\nfunction readStyle(resources: GhosttyRenderStateResources): GhosttyRenderCellStyle {\n const style = resources.bindings.allocStruct('GhosttyStyle');\n\n try {\n resources.bindings.setField(\n style.view,\n 'GhosttyStyle',\n 'size',\n resources.bindings.typeSize('GhosttyStyle')\n );\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE,\n style.ptr\n );\n\n const field = (name: string) => resources.bindings.field('GhosttyStyle', name).offset;\n return {\n bold: style.view.getUint8(field('bold')) !== 0,\n italic: style.view.getUint8(field('italic')) !== 0,\n faint: style.view.getUint8(field('faint')) !== 0,\n blink: style.view.getUint8(field('blink')) !== 0,\n inverse: style.view.getUint8(field('inverse')) !== 0,\n invisible: style.view.getUint8(field('invisible')) !== 0,\n strikethrough: style.view.getUint8(field('strikethrough')) !== 0,\n overline: style.view.getUint8(field('overline')) !== 0,\n underline: style.view.getInt32(field('underline'), true),\n };\n } finally {\n style.free();\n }\n}\n\nfunction readCodepoints(resources: GhosttyRenderStateResources): number[] {\n const graphemeLen = readU32(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN,\n ptr\n )\n );\n\n if (graphemeLen === 0) {\n return [];\n }\n\n const bufPtr = resources.bindings.allocBytes(graphemeLen * 4);\n\n try {\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF,\n bufPtr\n );\n\n const codepoints: number[] = [];\n for (let index = 0; index < graphemeLen; index += 1) {\n codepoints.push(resources.bindings.view().getUint32(bufPtr + index * 4, true));\n }\n\n return codepoints;\n } finally {\n resources.bindings.freeBytes(bufPtr, graphemeLen * 4);\n }\n}\n\nfunction codepointsToText(codepoints: number[]): string {\n if (codepoints.length === 0) {\n return '';\n }\n\n try {\n return String.fromCodePoint(...codepoints);\n } catch {\n return '';\n }\n}\n\nfunction buildRowText(cells: GhosttyRenderCell[]): string {\n let text = '';\n\n for (const cell of cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n if (cell.text) {\n text += cell.text;\n continue;\n }\n\n if (cell.widthKind === 'narrow') {\n text += ' ';\n }\n }\n\n return text;\n}\n\nfunction readMeta(resources: GhosttyRenderStateResources): GhosttyRenderSnapshotMeta {\n const colors = resources.bindings.allocStruct('GhosttyRenderStateColors');\n\n try {\n resources.bindings.setField(\n colors.view,\n 'GhosttyRenderStateColors',\n 'size',\n resources.bindings.typeSize('GhosttyRenderStateColors')\n );\n resources.bindings.getRenderStateColors(resources.renderStateHandle, colors.ptr);\n\n const paletteOffset = resources.bindings.field('GhosttyRenderStateColors', 'palette').offset;\n const palette: GhosttyColorRgb[] = [];\n for (let index = 0; index < 256; index += 1) {\n const colorOffset = colors.ptr + paletteOffset + index * 3;\n palette.push(readColorAt(resources.bindings, colorOffset));\n }\n\n const cursorHasValue =\n colors.view.getUint8(\n resources.bindings.field('GhosttyRenderStateColors', 'cursor_has_value').offset\n ) !== 0;\n\n const cursorViewportHasValue = readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE,\n ptr\n )\n );\n\n return {\n cols: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_COLS,\n ptr\n )\n ),\n rows: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_ROWS,\n ptr\n )\n ),\n dirty: resultToDirtyState(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_DIRTY,\n ptr\n )\n )\n ),\n colors: {\n background: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'background').offset\n ),\n foreground: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'foreground').offset\n ),\n cursor: cursorHasValue\n ? readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'cursor').offset\n )\n : null,\n palette,\n },\n cursor: {\n style: resultToCursorStyle(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE,\n ptr\n )\n )\n ),\n visible: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE,\n ptr\n )\n ),\n blinking: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING,\n ptr\n )\n ),\n passwordInput: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT,\n ptr\n )\n ),\n x: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X,\n ptr\n )\n )\n : null,\n y: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y,\n ptr\n )\n )\n : null,\n wideTail: cursorViewportHasValue\n ? readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL,\n ptr\n )\n )\n : false,\n },\n };\n } finally {\n colors.free();\n }\n}\n\nfunction readRow(resources: GhosttyRenderStateResources, rowIndex: number): GhosttyRenderRow {\n const rawRow = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_RAW,\n ptr\n )\n );\n resources.bindings.bindRenderStateRowCells(resources.rowIteratorHandle, resources.rowCellsHandle);\n\n const cells: GhosttyRenderCell[] = [];\n let x = 0;\n while (resources.bindings.nextRenderStateRowCell(resources.rowCellsHandle)) {\n const rawCell = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW,\n ptr\n )\n );\n const codepoints = readCodepoints(resources);\n const widthKind = resultToCellWidthKind(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_WIDE, ptr)\n )\n );\n const cell: GhosttyRenderCell = {\n x,\n text: codepointsToText(codepoints),\n codepoints,\n widthKind,\n hasText: readBool(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_HAS_TEXT, ptr)\n ),\n style: readStyle(resources),\n fgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR,\n ptr\n )\n ),\n bgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR,\n ptr\n )\n ),\n };\n cells.push(cell);\n x += 1;\n }\n\n return {\n y: rowIndex,\n dirty: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY,\n ptr\n )\n ),\n wrap: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP, ptr)\n ),\n wrapContinuation: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP_CONTINUATION, ptr)\n ),\n text: buildRowText(cells),\n cells,\n };\n}\n\nexport function createRenderState(bindings: GhosttyBindings): GhosttyRenderStateResources {\n return {\n bindings,\n renderStateHandle: bindings.createRenderState(),\n rowIteratorHandle: bindings.createRenderStateRowIterator(),\n rowCellsHandle: bindings.createRenderStateRowCells(),\n snapshotVersion: 0,\n disposed: false,\n cachedMeta: null,\n };\n}\n\nexport function updateRenderState(\n resources: GhosttyRenderStateResources,\n terminalHandle: number\n): void {\n ensureActive(resources);\n resources.bindings.updateRenderState(resources.renderStateHandle, terminalHandle);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n resources.snapshotVersion += 1;\n resources.cachedMeta = null;\n}\n\nexport function readRenderSnapshotMeta(\n resources: GhosttyRenderStateResources\n): GhosttyRenderSnapshotMeta {\n ensureActive(resources);\n if (!resources.cachedMeta) {\n resources.cachedMeta = readMeta(resources);\n }\n\n return resources.cachedMeta;\n}\n\nexport function* iterateRows(\n resources: GhosttyRenderStateResources\n): Generator<GhosttyRenderRow, void, undefined> {\n ensureActive(resources);\n const meta = readRenderSnapshotMeta(resources);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n\n let rowIndex = 0;\n while (\n rowIndex < meta.rows &&\n resources.bindings.nextRenderStateRowIterator(resources.rowIteratorHandle)\n ) {\n yield readRow(resources, rowIndex);\n rowIndex += 1;\n }\n}\n\nexport function disposeRenderStateResources(resources: GhosttyRenderStateResources): void {\n if (resources.disposed) {\n return;\n }\n\n resources.disposed = true;\n if (resources.rowCellsHandle !== 0) {\n resources.bindings.freeRenderStateRowCells(resources.rowCellsHandle);\n resources.rowCellsHandle = 0;\n }\n if (resources.rowIteratorHandle !== 0) {\n resources.bindings.freeRenderStateRowIterator(resources.rowIteratorHandle);\n resources.rowIteratorHandle = 0;\n }\n if (resources.renderStateHandle !== 0) {\n resources.bindings.freeRenderState(resources.renderStateHandle);\n resources.renderStateHandle = 0;\n }\n resources.cachedMeta = null;\n}\n\nexport type { GhosttyRenderStateResources };\n","import type { GhosttySelectionRect } from './types';\n\nexport type SelectionMode = 'character' | 'word' | 'line';\n\nexport type SelectionPoint = {\n line: number;\n col: number;\n};\n\nexport type SelectionState = {\n anchor: SelectionPoint | null;\n focus: SelectionPoint | null;\n mode: SelectionMode;\n};\n\ntype SelectionRange = {\n start: SelectionPoint;\n end: SelectionPoint;\n};\n\nfunction clampColumn(lineText: string, col: number): number {\n return Math.max(0, Math.min(Math.max(lineText.length - 1, 0), Math.floor(col)));\n}\n\nfunction normalizeRange(anchor: SelectionPoint, focus: SelectionPoint): SelectionRange {\n if (anchor.line < focus.line) {\n return { start: anchor, end: focus };\n }\n\n if (anchor.line > focus.line) {\n return { start: focus, end: anchor };\n }\n\n if (anchor.col <= focus.col) {\n return { start: anchor, end: focus };\n }\n\n return { start: focus, end: anchor };\n}\n\nfunction expandWord(line: number, col: number, lineText: string): SelectionRange {\n if (!lineText) {\n return {\n start: { line, col: 0 },\n end: { line, col: 0 },\n };\n }\n\n const safeCol = clampColumn(lineText, col);\n const isWordChar = (value: string) => /[\\p{L}\\p{N}_-]/u.test(value);\n const cursorChar = lineText[safeCol] ?? '';\n\n if (!isWordChar(cursorChar)) {\n return {\n start: { line, col: safeCol },\n end: { line, col: safeCol },\n };\n }\n\n let start = safeCol;\n let end = safeCol;\n while (start > 0 && isWordChar(lineText[start - 1] ?? '')) {\n start -= 1;\n }\n while (end + 1 < lineText.length && isWordChar(lineText[end + 1] ?? '')) {\n end += 1;\n }\n\n return {\n start: { line, col: start },\n end: { line, col: end },\n };\n}\n\nfunction expandLine(line: number, lineText: string): SelectionRange {\n const lastCol = Math.max(lineText.length - 1, 0);\n return {\n start: { line, col: 0 },\n end: { line, col: lastCol },\n };\n}\n\nfunction pointForMode(\n point: SelectionPoint,\n mode: SelectionMode,\n getLineText: (line: number) => string\n): SelectionRange {\n const lineText = getLineText(point.line);\n\n switch (mode) {\n case 'word':\n return expandWord(point.line, point.col, lineText);\n case 'line':\n return expandLine(point.line, lineText);\n default: {\n const safeCol = clampColumn(lineText, point.col);\n return {\n start: { line: point.line, col: safeCol },\n end: { line: point.line, col: safeCol },\n };\n }\n }\n}\n\nexport function createEmptySelectionState(): SelectionState {\n return {\n anchor: null,\n focus: null,\n mode: 'character',\n };\n}\n\nexport function hasSelection(state: SelectionState): boolean {\n return Boolean(state.anchor && state.focus);\n}\n\nexport function clearSelection(): SelectionState {\n return createEmptySelectionState();\n}\n\nexport function resolvePointerSelection(\n _previous: SelectionState,\n point: SelectionPoint & { mode: SelectionMode },\n getLineText: (line: number) => string\n): SelectionState {\n const expanded = pointForMode(point, point.mode, getLineText);\n return {\n anchor: expanded.start,\n focus: expanded.end,\n mode: point.mode,\n };\n}\n\nexport function updateSelectionFocus(\n state: SelectionState,\n point: SelectionPoint,\n getLineText: (line: number) => string\n): SelectionState {\n if (!state.anchor) {\n return state;\n }\n\n if (state.mode === 'line') {\n return {\n ...state,\n focus: expandLine(point.line, getLineText(point.line)).end,\n };\n }\n\n if (state.mode === 'word') {\n return {\n ...state,\n focus: pointForMode(point, 'word', getLineText).end,\n };\n }\n\n return {\n ...state,\n focus: {\n line: point.line,\n col: clampColumn(getLineText(point.line), point.col),\n },\n };\n}\n\nexport function getSelectionRange(state: SelectionState): SelectionRange | null {\n if (!state.anchor || !state.focus) {\n return null;\n }\n\n return normalizeRange(state.anchor, state.focus);\n}\n\nexport function serializeSelectionText(\n state: SelectionState,\n getLineText: (line: number) => string\n): string | null {\n const range = getSelectionRange(state);\n if (!range) {\n return null;\n }\n\n const segments: string[] = [];\n for (let line = range.start.line; line <= range.end.line; line += 1) {\n const text = getLineText(line);\n if (line === range.start.line && line === range.end.line) {\n segments.push(text.slice(range.start.col, range.end.col + 1));\n continue;\n }\n\n if (line === range.start.line) {\n segments.push(text.slice(range.start.col));\n continue;\n }\n\n if (line === range.end.line) {\n segments.push(text.slice(0, range.end.col + 1));\n continue;\n }\n\n segments.push(text);\n }\n\n return segments.join('\\n');\n}\n\nexport function projectSelectionRects(\n state: SelectionState,\n viewportStartLine: number,\n viewportRows: number,\n getLineText?: (line: number) => string\n): GhosttySelectionRect[] {\n const range = getSelectionRange(state);\n if (!range) {\n return [];\n }\n\n const viewportEndLine = viewportStartLine + viewportRows - 1;\n const rects: GhosttySelectionRect[] = [];\n for (\n let line = Math.max(range.start.line, viewportStartLine);\n line <= Math.min(range.end.line, viewportEndLine);\n line += 1\n ) {\n const row = line - viewportStartLine;\n if (line === range.start.line && line === range.end.line) {\n rects.push({\n row,\n x: range.start.col,\n width: range.end.col - range.start.col + 1,\n });\n continue;\n }\n\n if (line === range.start.line) {\n const lineWidth = getLineText ? Math.max(getLineText(line).length - range.start.col, 0) : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: range.start.col,\n width: lineWidth,\n });\n continue;\n }\n\n if (line === range.end.line) {\n rects.push({\n row,\n x: 0,\n width: range.end.col + 1,\n });\n continue;\n }\n\n const middleWidth = getLineText ? getLineText(line).length : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: 0,\n width: middleWidth,\n });\n }\n\n return rects;\n}\n","export function hasCopyModifier(event: KeyboardEvent): boolean {\n return (event.metaKey || event.ctrlKey) && !event.altKey;\n}\n\nexport function isCopyShortcut(event: KeyboardEvent): boolean {\n return hasCopyModifier(event) && event.key.toLowerCase() === 'c';\n}\n\nexport async function writeSelectionToClipboard(text: string): Promise<void> {\n if (!text) {\n return;\n }\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n}\n\nexport function writeSelectionToCopyEvent(event: ClipboardEvent, text: string): boolean {\n if (!text || !event.clipboardData) {\n return false;\n }\n\n event.clipboardData.setData('text/plain', text);\n event.preventDefault();\n return true;\n}\n","export default \"__VITE_ASSET__D7nLG8tf__\"","import ghosttyWasmUrl from './assets/ghostty-vt.wasm?url';\nimport type { GhosttyCellDimensions, GhosttyTheme } from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_OUT_OF_SPACE = -3;\n\nconst GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND = 11;\nconst GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND = 12;\nconst GHOSTTY_TERMINAL_OPT_COLOR_CURSOR = 13;\nconst GHOSTTY_TERMINAL_OPT_COLOR_PALETTE = 14;\n\nconst GHOSTTY_TERMINAL_DATA_COLS = 1;\nconst GHOSTTY_TERMINAL_DATA_ROWS = 2;\nconst GHOSTTY_TERMINAL_DATA_SCROLLBAR = 9;\nconst GHOSTTY_POINT_TAG_VIEWPORT = 1;\n\nconst GHOSTTY_SCROLL_VIEWPORT_TOP = 0;\nconst GHOSTTY_SCROLL_VIEWPORT_BOTTOM = 1;\nconst GHOSTTY_SCROLL_VIEWPORT_DELTA = 2;\n\nconst GHOSTTY_KEY_ACTION_RELEASE = 0;\nconst GHOSTTY_KEY_ACTION_PRESS = 1;\nconst GHOSTTY_KEY_ACTION_REPEAT = 2;\n\nconst GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL = 4;\n\nconst GHOSTTY_MODE_BRACKETED_PASTE = 2004;\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_UTF8_MOUSE = 1005;\nconst GHOSTTY_MODE_SGR_MOUSE = 1006;\nconst GHOSTTY_MODE_URXVT_MOUSE = 1015;\nconst GHOSTTY_MODE_SGR_PIXELS_MOUSE = 1016;\n\nconst GHOSTTY_FORMATTER_FORMAT_PLAIN = 0;\nconst GHOSTTY_FORMATTER_FORMAT_HTML = 2;\nconst WASM_USIZE_BYTES = 4;\n\ntype LayoutField = {\n offset: number;\n size: number;\n type: string;\n};\n\ntype LayoutType = {\n size: number;\n align: number;\n fields: Record<string, LayoutField>;\n};\n\ntype LayoutMap = Record<string, LayoutType>;\n\ntype GhosttyMouseEncodeOptions = {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n mods: number;\n x: number;\n y: number;\n anyButtonPressed: boolean;\n screenWidth: number;\n screenHeight: number;\n cellWidth: number;\n cellHeight: number;\n};\n\ntype GhosttyExports = WebAssembly.Exports & {\n memory: WebAssembly.Memory;\n ghostty_type_json: () => number;\n ghostty_alloc: (allocatorPtr: number, size: number, alignment: number) => number;\n ghostty_free: (allocatorPtr: number, ptr: number, len: number) => void;\n ghostty_wasm_alloc_opaque: () => number;\n ghostty_wasm_free_opaque: (ptr: number) => void;\n ghostty_wasm_alloc_u8: () => number;\n ghostty_wasm_free_u8: (ptr: number) => void;\n ghostty_wasm_alloc_u8_array: (len: number) => number;\n ghostty_wasm_free_u8_array: (ptr: number, len: number) => void;\n ghostty_wasm_alloc_usize: () => number;\n ghostty_wasm_free_usize: (ptr: number) => void;\n ghostty_terminal_new: (allocatorPtr: number, outTerminalPtr: number, optionsPtr: number) => number;\n ghostty_terminal_free: (terminal: number) => void;\n ghostty_terminal_reset: (terminal: number) => void;\n ghostty_terminal_resize: (\n terminal: number,\n cols: number,\n rows: number,\n cellWidthPx: number,\n cellHeightPx: number\n ) => number;\n ghostty_terminal_vt_write: (terminal: number, dataPtr: number, len: number) => void;\n ghostty_terminal_scroll_viewport: (terminal: number, behaviorPtr: number) => void;\n ghostty_terminal_set: (terminal: number, option: number, valuePtr: number) => number;\n ghostty_terminal_get: (terminal: number, data: number, outPtr: number) => number;\n ghostty_terminal_mode_get: (terminal: number, mode: number, outValuePtr: number) => number;\n ghostty_terminal_mode_set: (terminal: number, mode: number, enabled: number) => number;\n ghostty_terminal_grid_ref: (terminal: number, pointPtr: number, outRefPtr: number) => number;\n ghostty_render_state_new: (allocatorPtr: number, outStatePtr: number) => number;\n ghostty_render_state_free: (state: number) => void;\n ghostty_render_state_update: (state: number, terminal: number) => number;\n ghostty_render_state_get: (state: number, data: number, outPtr: number) => number;\n ghostty_render_state_set: (state: number, option: number, valuePtr: number) => number;\n ghostty_render_state_colors_get: (state: number, outColorsPtr: number) => number;\n ghostty_render_state_row_iterator_new: (allocatorPtr: number, outIteratorPtr: number) => number;\n ghostty_render_state_row_iterator_free: (iterator: number) => void;\n ghostty_render_state_row_iterator_next: (iterator: number) => number;\n ghostty_render_state_row_get: (iterator: number, data: number, outPtr: number) => number;\n ghostty_render_state_row_set: (iterator: number, option: number, valuePtr: number) => number;\n ghostty_render_state_row_cells_new: (allocatorPtr: number, outCellsPtr: number) => number;\n ghostty_render_state_row_cells_free: (cells: number) => void;\n ghostty_render_state_row_cells_next: (cells: number) => number;\n ghostty_render_state_row_cells_select: (cells: number, x: number) => number;\n ghostty_render_state_row_cells_get: (cells: number, data: number, outPtr: number) => number;\n ghostty_row_get: (row: bigint, data: number, outPtr: number) => number;\n ghostty_cell_get: (cell: bigint, data: number, outPtr: number) => number;\n ghostty_formatter_terminal_new: (\n allocatorPtr: number,\n outFormatterPtr: number,\n terminal: number,\n optionsPtr: number\n ) => number;\n ghostty_formatter_format_alloc: (\n formatter: number,\n allocatorPtr: number,\n outPtrPtr: number,\n outLenPtr: number\n ) => number;\n ghostty_formatter_free: (formatter: number) => void;\n ghostty_key_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_key_encoder_free: (encoder: number) => void;\n ghostty_key_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_mouse_encoder_free: (encoder: number) => void;\n ghostty_mouse_encoder_reset: (encoder: number) => void;\n ghostty_mouse_encoder_setopt: (encoder: number, option: number, valuePtr: number) => void;\n ghostty_mouse_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_mouse_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_mouse_event_free: (event: number) => void;\n ghostty_mouse_event_set_action: (event: number, action: number) => void;\n ghostty_mouse_event_set_button: (event: number, button: number) => void;\n ghostty_mouse_event_clear_button: (event: number) => void;\n ghostty_mouse_event_set_mods: (event: number, mods: number) => void;\n ghostty_mouse_event_set_position: (event: number, positionPtr: number) => void;\n ghostty_key_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_key_event_free: (event: number) => void;\n ghostty_key_event_set_action: (event: number, action: number) => void;\n ghostty_key_event_set_key: (event: number, key: number) => void;\n ghostty_key_event_set_mods: (event: number, mods: number) => void;\n ghostty_key_event_set_consumed_mods: (event: number, consumedMods: number) => void;\n ghostty_key_event_set_composing: (event: number, composing: number) => void;\n ghostty_key_event_set_utf8: (event: number, utf8Ptr: number, len: number) => void;\n ghostty_key_event_set_unshifted_codepoint: (event: number, codepoint: number) => void;\n ghostty_key_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_paste_encode: (\n dataPtr: number,\n dataLen: number,\n bracketed: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n};\n\nlet bindingsPromise: Promise<GhosttyBindings> | null = null;\n\nfunction assertResult(result: number, action: string): void {\n if (result === GHOSTTY_SUCCESS) {\n return;\n }\n\n throw new Error(`${action} failed with result ${result}`);\n}\n\nfunction parseHexRgb(hex: string): [number, number, number] {\n const normalized = hex.trim().replace(/^#/, '');\n if (normalized.length !== 6) {\n throw new Error(`expected #RRGGBB color, received: ${hex}`);\n }\n\n return [\n Number.parseInt(normalized.slice(0, 2), 16),\n Number.parseInt(normalized.slice(2, 4), 16),\n Number.parseInt(normalized.slice(4, 6), 16),\n ];\n}\n\nfunction createAnsi256Palette(theme: GhosttyTheme): Array<[number, number, number]> {\n const base16 = [\n theme.black,\n theme.red,\n theme.green,\n theme.yellow,\n theme.blue,\n theme.magenta,\n theme.cyan,\n theme.white,\n theme.brightBlack,\n theme.brightRed,\n theme.brightGreen,\n theme.brightYellow,\n theme.brightBlue,\n theme.brightMagenta,\n theme.brightCyan,\n theme.brightWhite,\n ].map(parseHexRgb);\n\n const palette = [...base16];\n const cube = [0, 95, 135, 175, 215, 255];\n\n for (const red of cube) {\n for (const green of cube) {\n for (const blue of cube) {\n palette.push([red, green, blue]);\n }\n }\n }\n\n for (let index = 0; index < 24; index += 1) {\n const value = 8 + index * 10;\n palette.push([value, value, value]);\n }\n\n return palette;\n}\n\nfunction encodeMouseModifierBits(mods: number): number {\n let encoded = 0;\n if (mods & (1 << 0)) encoded += 4;\n if (mods & (1 << 2)) encoded += 8;\n if (mods & (1 << 1)) encoded += 16;\n return encoded;\n}\n\nfunction encodeX10Byte(value: number): string | null {\n if (value < 0 || value > 223) {\n return null;\n }\n\n return String.fromCharCode(value + 32);\n}\n\nfunction mouseButtonCode(button: number | null | undefined): number | null {\n switch (button) {\n case 1:\n return 0;\n case 3:\n return 1;\n case 2:\n return 2;\n case 4:\n return 64;\n case 5:\n return 65;\n case 6:\n return 66;\n case 7:\n return 67;\n case 8:\n return 128;\n case 9:\n return 129;\n case null:\n case undefined:\n return 3;\n default:\n return null;\n }\n}\n\nexport function keyboardEventToGhosttyMods(event: KeyboardEvent): number {\n let mods = 0;\n\n if (event.shiftKey) mods |= 1 << 0;\n if (event.ctrlKey) mods |= 1 << 1;\n if (event.altKey) mods |= 1 << 2;\n if (event.metaKey) mods |= 1 << 3;\n if (event.getModifierState?.('CapsLock')) mods |= 1 << 4;\n if (event.getModifierState?.('NumLock')) mods |= 1 << 5;\n\n return mods;\n}\n\nclass StructAllocation {\n constructor(\n private readonly bindings: GhosttyBindings,\n readonly typeName: string,\n readonly ptr: number\n ) {}\n\n get view(): DataView {\n return this.bindings.view(this.ptr, this.bindings.typeSize(this.typeName));\n }\n\n free(): void {\n this.bindings.freeBytes(this.ptr, this.bindings.typeSize(this.typeName));\n }\n}\n\nexport class GhosttyBindings {\n readonly exports: GhosttyExports;\n readonly layout: LayoutMap;\n\n private readonly decoder = new TextDecoder();\n private readonly encoder = new TextEncoder();\n\n constructor(exports: GhosttyExports, layout: LayoutMap) {\n this.exports = exports;\n this.layout = layout;\n }\n\n buffer(): ArrayBuffer {\n return this.exports.memory.buffer;\n }\n\n bytes(ptr = 0, len = this.buffer().byteLength - ptr): Uint8Array {\n return new Uint8Array(this.buffer(), ptr, len);\n }\n\n view(ptr = 0, len = this.buffer().byteLength - ptr): DataView {\n return new DataView(this.buffer(), ptr, len);\n }\n\n typeSize(typeName: string): number {\n const type = this.layout[typeName];\n if (!type) {\n throw new Error(`unknown ghostty type: ${typeName}`);\n }\n\n return type.size;\n }\n\n field(typeName: string, fieldName: string): LayoutField {\n const type = this.layout[typeName];\n const field = type?.fields[fieldName];\n if (!type || !field) {\n throw new Error(`unknown ghostty field: ${typeName}.${fieldName}`);\n }\n\n return field;\n }\n\n allocStruct(typeName: string): StructAllocation {\n const ptr = this.allocBytes(this.typeSize(typeName));\n this.bytes(ptr, this.typeSize(typeName)).fill(0);\n return new StructAllocation(this, typeName, ptr);\n }\n\n allocBytes(len: number): number {\n return this.exports.ghostty_wasm_alloc_u8_array(len);\n }\n\n freeBytes(ptr: number, len: number): void {\n this.exports.ghostty_wasm_free_u8_array(ptr, len);\n }\n\n allocOpaque(): number {\n return this.exports.ghostty_wasm_alloc_opaque();\n }\n\n freeOpaque(ptr: number): void {\n this.exports.ghostty_wasm_free_opaque(ptr);\n }\n\n allocU8(): number {\n return this.exports.ghostty_wasm_alloc_u8();\n }\n\n freeU8(ptr: number): void {\n this.exports.ghostty_wasm_free_u8(ptr);\n }\n\n allocUsize(): number {\n return this.exports.ghostty_wasm_alloc_usize();\n }\n\n freeUsize(ptr: number): void {\n this.exports.ghostty_wasm_free_usize(ptr);\n }\n\n readPointer(ptr: number): number {\n return this.view().getUint32(ptr, true);\n }\n\n readU8(ptr: number): number {\n return this.view().getUint8(ptr);\n }\n\n readUsize(ptr: number): number {\n if (WASM_USIZE_BYTES === 4) {\n return this.view().getUint32(ptr, true);\n }\n\n return Number(this.view().getBigUint64(ptr, true));\n }\n\n readU64(ptr: number): bigint {\n return this.view().getBigUint64(ptr, true);\n }\n\n setField(target: DataView, typeName: string, fieldName: string, value: number | boolean): void {\n const field = this.field(typeName, fieldName);\n const offset = field.offset;\n\n switch (field.type) {\n case 'u8':\n case 'bool':\n target.setUint8(offset, Number(value));\n return;\n case 'u16':\n target.setUint16(offset, Number(value), true);\n return;\n case 'u32':\n target.setUint32(offset, Number(value), true);\n return;\n case 'u64':\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'usize':\n if (WASM_USIZE_BYTES === 4) {\n target.setUint32(offset, Number(value), true);\n return;\n }\n\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'i32':\n case 'enum':\n target.setInt32(offset, Number(value), true);\n return;\n default:\n throw new Error(`unsupported field type ${typeName}.${fieldName}: ${field.type}`);\n }\n }\n\n writeString(data: string): { ptr: number; len: number; free: () => void } {\n const encoded = this.encoder.encode(data);\n const ptr = this.allocBytes(encoded.length);\n this.bytes(ptr, encoded.length).set(encoded);\n\n return {\n ptr,\n len: encoded.length,\n free: () => this.freeBytes(ptr, encoded.length),\n };\n }\n\n writeBytes(data: Uint8Array): { ptr: number; len: number; free: () => void } {\n const ptr = this.allocBytes(data.length);\n this.bytes(ptr, data.length).set(data);\n\n return {\n ptr,\n len: data.length,\n free: () => this.freeBytes(ptr, data.length),\n };\n }\n\n readOwnedUtf8(ptr: number, len: number): string {\n return this.decoder.decode(this.bytes(ptr, len));\n }\n\n createTerminal(cols: number, rows: number, scrollback: number): number {\n const options = this.allocStruct('GhosttyTerminalOptions');\n this.setField(options.view, 'GhosttyTerminalOptions', 'cols', cols);\n this.setField(options.view, 'GhosttyTerminalOptions', 'rows', rows);\n this.setField(options.view, 'GhosttyTerminalOptions', 'max_scrollback', scrollback);\n\n const termPtrPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_new(0, termPtrPtr, options.ptr),\n 'ghostty_terminal_new'\n );\n return this.readPointer(termPtrPtr);\n } finally {\n options.free();\n this.freeOpaque(termPtrPtr);\n }\n }\n\n freeTerminal(terminal: number): void {\n this.exports.ghostty_terminal_free(terminal);\n }\n\n writeVt(terminal: number, data: string | Uint8Array): void {\n const bytes = typeof data === 'string' ? this.encoder.encode(data) : data;\n const allocation = this.writeBytes(bytes);\n\n try {\n this.exports.ghostty_terminal_vt_write(terminal, allocation.ptr, allocation.len);\n } finally {\n allocation.free();\n }\n }\n\n resetTerminal(terminal: number): void {\n this.exports.ghostty_terminal_reset(terminal);\n }\n\n resizeTerminal(\n terminal: number,\n cols: number,\n rows: number,\n cell: GhosttyCellDimensions\n ): void {\n assertResult(\n this.exports.ghostty_terminal_resize(\n terminal,\n cols,\n rows,\n Math.max(1, Math.round(cell.width)),\n Math.max(1, Math.round(cell.height))\n ),\n 'ghostty_terminal_resize'\n );\n }\n\n scrollViewportDelta(terminal: number, delta: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_DELTA\n );\n behavior.view.setBigInt64(\n this.field('GhosttyTerminalScrollViewport', 'value').offset,\n BigInt(delta),\n true\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportTop(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_TOP\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportBottom(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_BOTTOM\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n setTerminalTheme(terminal: number, theme: GhosttyTheme): void {\n const foreground = this.allocStruct('GhosttyColorRgb');\n const background = this.allocStruct('GhosttyColorRgb');\n const cursor = this.allocStruct('GhosttyColorRgb');\n const paletteColors = createAnsi256Palette(theme);\n const palettePtr = this.allocBytes(paletteColors.length * 3);\n\n const assignRgb = (target: StructAllocation, value: string) => {\n const [red, green, blue] = parseHexRgb(value);\n this.setField(target.view, 'GhosttyColorRgb', 'r', red);\n this.setField(target.view, 'GhosttyColorRgb', 'g', green);\n this.setField(target.view, 'GhosttyColorRgb', 'b', blue);\n };\n\n assignRgb(foreground, theme.foreground);\n assignRgb(background, theme.background);\n assignRgb(cursor, theme.cursor);\n\n const paletteBytes = this.bytes(palettePtr, paletteColors.length * 3);\n paletteColors.forEach(([red, green, blue], index) => {\n const offset = index * 3;\n paletteBytes[offset] = red;\n paletteBytes[offset + 1] = green;\n paletteBytes[offset + 2] = blue;\n });\n\n try {\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND,\n foreground.ptr\n ),\n 'ghostty_terminal_set(foreground)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND,\n background.ptr\n ),\n 'ghostty_terminal_set(background)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(terminal, GHOSTTY_TERMINAL_OPT_COLOR_CURSOR, cursor.ptr),\n 'ghostty_terminal_set(cursor)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_PALETTE,\n palettePtr\n ),\n 'ghostty_terminal_set(palette)'\n );\n } finally {\n foreground.free();\n background.free();\n cursor.free();\n this.freeBytes(palettePtr, paletteColors.length * 3);\n }\n }\n\n readTerminalSize(terminal: number): { cols: number; rows: number } {\n const colsPtr = this.allocBytes(2);\n const rowsPtr = this.allocBytes(2);\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_COLS, colsPtr),\n 'ghostty_terminal_get(cols)'\n );\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_ROWS, rowsPtr),\n 'ghostty_terminal_get(rows)'\n );\n return {\n cols: this.view().getUint16(colsPtr, true),\n rows: this.view().getUint16(rowsPtr, true),\n };\n } finally {\n this.freeBytes(colsPtr, 2);\n this.freeBytes(rowsPtr, 2);\n }\n }\n\n readScrollbar(terminal: number): { total: number; offset: number; len: number } {\n const scrollbar = this.allocStruct('GhosttyTerminalScrollbar');\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_SCROLLBAR, scrollbar.ptr),\n 'ghostty_terminal_get(scrollbar)'\n );\n\n return {\n total: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'total').offset,\n true\n )\n ),\n offset: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'offset').offset,\n true\n )\n ),\n len: Number(\n scrollbar.view.getBigUint64(this.field('GhosttyTerminalScrollbar', 'len').offset, true)\n ),\n };\n } finally {\n scrollbar.free();\n }\n }\n\n isTerminalModeEnabled(terminal: number, mode: number): boolean {\n const valuePtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_mode_get(terminal, mode, valuePtr),\n 'ghostty_terminal_mode_get'\n );\n return this.readU8(valuePtr) !== 0;\n } finally {\n this.freeU8(valuePtr);\n }\n }\n\n setTerminalMode(terminal: number, mode: number, enabled: boolean): void {\n assertResult(\n this.exports.ghostty_terminal_mode_set(terminal, mode, enabled ? 1 : 0),\n 'ghostty_terminal_mode_set'\n );\n }\n\n createFormatter(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean; selectionPtr?: number | null }\n ): number {\n const formatterOptions = this.allocStruct('GhosttyFormatterTerminalOptions');\n const extraOffset = this.field('GhosttyFormatterTerminalOptions', 'extra').offset;\n const extraView = this.view(\n formatterOptions.ptr + extraOffset,\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n const screenOffset = this.field('GhosttyFormatterTerminalExtra', 'screen').offset;\n const screenView = this.view(\n formatterOptions.ptr + extraOffset + screenOffset,\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const outFormatterPtr = this.allocOpaque();\n\n try {\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'size',\n this.typeSize('GhosttyFormatterTerminalOptions')\n );\n this.setField(formatterOptions.view, 'GhosttyFormatterTerminalOptions', 'emit', emit);\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'unwrap',\n options.unwrap\n );\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'trim',\n options.trim\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'size',\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'palette',\n options.includePalette\n );\n this.setField(\n screenView,\n 'GhosttyFormatterScreenExtra',\n 'size',\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const selectionOffset = this.field('GhosttyFormatterTerminalOptions', 'selection').offset;\n formatterOptions.view.setUint32(selectionOffset, options.selectionPtr ?? 0, true);\n\n assertResult(\n this.exports.ghostty_formatter_terminal_new(\n 0,\n outFormatterPtr,\n terminal,\n formatterOptions.ptr\n ),\n 'ghostty_formatter_terminal_new'\n );\n\n return this.readPointer(outFormatterPtr);\n } finally {\n formatterOptions.free();\n this.freeOpaque(outFormatterPtr);\n }\n }\n\n freeFormatter(formatter: number): void {\n this.exports.ghostty_formatter_free(formatter);\n }\n\n private resolveViewportGridRef(\n terminal: number,\n x: number,\n y: number\n ): StructAllocation | null {\n const point = this.allocStruct('GhosttyPoint');\n const outRef = this.allocStruct('GhosttyGridRef');\n\n try {\n this.setField(point.view, 'GhosttyPoint', 'tag', GHOSTTY_POINT_TAG_VIEWPORT);\n const coordOffset = this.field('GhosttyPoint', 'value').offset;\n const coordView = this.view(\n point.ptr + coordOffset,\n this.typeSize('GhosttyPointCoordinate')\n );\n this.setField(coordView, 'GhosttyPointCoordinate', 'x', x);\n this.setField(coordView, 'GhosttyPointCoordinate', 'y', y);\n\n const result = this.exports.ghostty_terminal_grid_ref(terminal, point.ptr, outRef.ptr);\n if (result !== GHOSTTY_SUCCESS) {\n outRef.free();\n return null;\n }\n\n return outRef;\n } finally {\n point.free();\n }\n }\n\n private createViewportSelection(\n terminal: number,\n cols: number,\n rows: number\n ): StructAllocation | null {\n const safeCols = Math.max(1, Math.floor(cols));\n const safeRows = Math.max(1, Math.floor(rows));\n const start = this.resolveViewportGridRef(terminal, 0, 0);\n if (!start) {\n return null;\n }\n\n let end: StructAllocation | null = null;\n for (let row = safeRows - 1; row >= 0; row -= 1) {\n end = this.resolveViewportGridRef(terminal, safeCols - 1, row);\n if (end) {\n break;\n }\n }\n\n if (!end) {\n start.free();\n return null;\n }\n\n const selection = this.allocStruct('GhosttySelection');\n try {\n this.setField(selection.view, 'GhosttySelection', 'size', this.typeSize('GhosttySelection'));\n this.setField(selection.view, 'GhosttySelection', 'rectangle', false);\n\n const startOffset = this.field('GhosttySelection', 'start').offset;\n const endOffset = this.field('GhosttySelection', 'end').offset;\n this.bytes(selection.ptr + startOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(start.ptr, this.typeSize('GhosttyGridRef'))\n );\n this.bytes(selection.ptr + endOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(end.ptr, this.typeSize('GhosttyGridRef'))\n );\n\n return selection;\n } finally {\n start.free();\n end.free();\n }\n }\n\n formatViewport(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean },\n viewport: { cols: number; rows: number }\n ): string {\n const terminalSize = this.readTerminalSize(terminal);\n const selection = this.createViewportSelection(\n terminal,\n Math.max(1, Math.min(terminalSize.cols, viewport.cols)),\n Math.max(1, Math.min(terminalSize.rows, viewport.rows))\n );\n const formatter = this.createFormatter(terminal, emit, {\n ...options,\n selectionPtr: selection?.ptr ?? null,\n });\n\n try {\n return this.formatFormatter(formatter);\n } finally {\n this.freeFormatter(formatter);\n selection?.free();\n }\n }\n\n formatFormatter(formatter: number): string {\n const outPtrPtr = this.allocOpaque();\n const outLenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_formatter_format_alloc(formatter, 0, outPtrPtr, outLenPtr),\n 'ghostty_formatter_format_alloc'\n );\n\n const outPtr = this.readPointer(outPtrPtr);\n const outLen = this.readUsize(outLenPtr);\n const memoryByteLength = this.buffer().byteLength;\n\n try {\n if (outLen === 0 || outPtr === 0) {\n return '';\n }\n\n if (outPtr < 0 || outPtr > memoryByteLength || outLen > memoryByteLength - outPtr) {\n throw new Error(\n `ghostty_formatter_format_alloc returned invalid slice ptr=${outPtr} len=${outLen} mem=${memoryByteLength}`\n );\n }\n\n return this.readOwnedUtf8(outPtr, outLen);\n } finally {\n if (outLen > 0 && outPtr !== 0) {\n this.exports.ghostty_free(0, outPtr, outLen);\n }\n }\n } finally {\n this.freeOpaque(outPtrPtr);\n this.freeUsize(outLenPtr);\n }\n }\n\n createRenderState(): number {\n const outStatePtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_render_state_new(0, outStatePtr), 'ghostty_render_state_new');\n return this.readPointer(outStatePtr);\n } finally {\n this.freeOpaque(outStatePtr);\n }\n }\n\n freeRenderState(state: number): void {\n this.exports.ghostty_render_state_free(state);\n }\n\n updateRenderState(state: number, terminal: number): void {\n assertResult(\n this.exports.ghostty_render_state_update(state, terminal),\n 'ghostty_render_state_update'\n );\n }\n\n getRenderStateValueResult(state: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_get(state, data, outPtr);\n }\n\n getRenderStateValue(state: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateValueResult(state, data, outPtr), 'ghostty_render_state_get');\n }\n\n setRenderStateValue(state: number, option: number, valuePtr: number): void {\n assertResult(this.exports.ghostty_render_state_set(state, option, valuePtr), 'ghostty_render_state_set');\n }\n\n getRenderStateColors(state: number, outColorsPtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_colors_get(state, outColorsPtr),\n 'ghostty_render_state_colors_get'\n );\n }\n\n createRenderStateRowIterator(): number {\n const outIteratorPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_iterator_new(0, outIteratorPtr),\n 'ghostty_render_state_row_iterator_new'\n );\n return this.readPointer(outIteratorPtr);\n } finally {\n this.freeOpaque(outIteratorPtr);\n }\n }\n\n freeRenderStateRowIterator(iterator: number): void {\n this.exports.ghostty_render_state_row_iterator_free(iterator);\n }\n\n bindRenderStateRowIterator(state: number, iterator: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, iterator, true);\n this.getRenderStateValue(state, 4, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowIterator(iterator: number): boolean {\n return this.exports.ghostty_render_state_row_iterator_next(iterator) !== 0;\n }\n\n getRenderStateRowValueResult(iterator: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_get(iterator, data, outPtr);\n }\n\n getRenderStateRowValue(iterator: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateRowValueResult(iterator, data, outPtr), 'ghostty_render_state_row_get');\n }\n\n setRenderStateRowValue(iterator: number, option: number, valuePtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_set(iterator, option, valuePtr),\n 'ghostty_render_state_row_set'\n );\n }\n\n createRenderStateRowCells(): number {\n const outCellsPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_cells_new(0, outCellsPtr),\n 'ghostty_render_state_row_cells_new'\n );\n return this.readPointer(outCellsPtr);\n } finally {\n this.freeOpaque(outCellsPtr);\n }\n }\n\n freeRenderStateRowCells(cells: number): void {\n this.exports.ghostty_render_state_row_cells_free(cells);\n }\n\n bindRenderStateRowCells(iterator: number, cells: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, cells, true);\n this.getRenderStateRowValue(iterator, 3, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowCell(cells: number): boolean {\n return this.exports.ghostty_render_state_row_cells_next(cells) !== 0;\n }\n\n selectRenderStateRowCell(cells: number, x: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_cells_select(cells, x),\n 'ghostty_render_state_row_cells_select'\n );\n }\n\n getRenderStateRowCellValueResult(cells: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_cells_get(cells, data, outPtr);\n }\n\n getRenderStateRowCellValue(cells: number, data: number, outPtr: number): void {\n assertResult(\n this.getRenderStateRowCellValueResult(cells, data, outPtr),\n 'ghostty_render_state_row_cells_get'\n );\n }\n\n getRawRowValueResult(row: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_row_get(row, data, outPtr);\n }\n\n getRawRowValue(row: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawRowValueResult(row, data, outPtr), 'ghostty_row_get');\n }\n\n getRawCellValueResult(cell: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_cell_get(cell, data, outPtr);\n }\n\n getRawCellValue(cell: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawCellValueResult(cell, data, outPtr), 'ghostty_cell_get');\n }\n\n createKeyEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_key_encoder_new(0, outEncoderPtr), 'ghostty_key_encoder_new');\n return this.readPointer(outEncoderPtr);\n } finally {\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeKeyEncoder(encoder: number): void {\n this.exports.ghostty_key_encoder_free(encoder);\n }\n\n createMouseEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n const trackLastCellPtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_mouse_encoder_new(0, outEncoderPtr),\n 'ghostty_mouse_encoder_new'\n );\n const encoder = this.readPointer(outEncoderPtr);\n this.view().setUint8(trackLastCellPtr, 1);\n this.exports.ghostty_mouse_encoder_setopt(\n encoder,\n GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL,\n trackLastCellPtr\n );\n return encoder;\n } finally {\n this.freeU8(trackLastCellPtr);\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_free(encoder);\n }\n\n resetMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_reset(encoder);\n }\n\n encodeMouseEvent(\n encoder: number,\n terminal: number,\n options: GhosttyMouseEncodeOptions\n ): string | null {\n void encoder;\n\n const trackingAny = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_ANY_MOUSE);\n const trackingButton = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BUTTON_MOUSE);\n const trackingNormal = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_NORMAL_MOUSE);\n const trackingX10 = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_X10_MOUSE);\n\n if (!trackingAny && !trackingButton && !trackingNormal && !trackingX10) {\n return null;\n }\n\n if (options.action === 'motion' && !(trackingAny || (trackingButton && options.anyButtonPressed))) {\n return null;\n }\n\n if (trackingX10 && options.action !== 'press') {\n return null;\n }\n\n if (!trackingAny && !trackingButton && !trackingX10 && options.action === 'motion') {\n return null;\n }\n\n const baseCode = mouseButtonCode(options.button);\n if (baseCode === null) {\n return null;\n }\n\n const column = Math.max(1, Math.floor(options.x / Math.max(1, options.cellWidth)) + 1);\n const row = Math.max(1, Math.floor(options.y / Math.max(1, options.cellHeight)) + 1);\n const pixelX = Math.round(options.x + 1);\n const pixelY = Math.round(options.y + 1);\n\n let code =\n options.action === 'release' &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE) &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)\n ? 3\n : baseCode;\n\n if (options.action === 'motion') {\n code += 32;\n }\n\n code += encodeMouseModifierBits(options.mods);\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${pixelX};${pixelY}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${column};${row}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_URXVT_MOUSE)) {\n return `\\u001b[${code};${column};${row}M`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_UTF8_MOUSE) || trackingNormal || trackingButton || trackingAny || trackingX10) {\n const encodedCode = encodeX10Byte(code);\n const encodedColumn = encodeX10Byte(column);\n const encodedRow = encodeX10Byte(row);\n if (!encodedCode || !encodedColumn || !encodedRow) {\n return null;\n }\n return `\\u001b[M${encodedCode}${encodedColumn}${encodedRow}`;\n }\n\n return null;\n }\n\n encodeKeyEvent(\n encoder: number,\n terminal: number,\n options: {\n action: 'press' | 'repeat' | 'release';\n keyCode: number;\n mods: number;\n composing: boolean;\n utf8?: string | null;\n unshiftedCodepoint?: number | null;\n }\n ): string | null {\n if (options.keyCode <= 0) {\n return null;\n }\n\n const eventPtrPtr = this.allocOpaque();\n let eventHandle = 0;\n let utf8Allocation: { ptr: number; len: number; free: () => void } | null = null;\n\n try {\n assertResult(this.exports.ghostty_key_event_new(0, eventPtrPtr), 'ghostty_key_event_new');\n eventHandle = this.readPointer(eventPtrPtr);\n this.exports.ghostty_key_encoder_setopt_from_terminal(encoder, terminal);\n this.exports.ghostty_key_event_set_action(\n eventHandle,\n options.action === 'release'\n ? GHOSTTY_KEY_ACTION_RELEASE\n : options.action === 'repeat'\n ? GHOSTTY_KEY_ACTION_REPEAT\n : GHOSTTY_KEY_ACTION_PRESS\n );\n this.exports.ghostty_key_event_set_key(eventHandle, options.keyCode);\n this.exports.ghostty_key_event_set_mods(eventHandle, options.mods);\n this.exports.ghostty_key_event_set_consumed_mods(eventHandle, 0);\n this.exports.ghostty_key_event_set_composing(eventHandle, options.composing ? 1 : 0);\n\n if (options.utf8) {\n utf8Allocation = this.writeString(options.utf8);\n this.exports.ghostty_key_event_set_utf8(\n eventHandle,\n utf8Allocation.ptr,\n utf8Allocation.len\n );\n }\n\n if (typeof options.unshiftedCodepoint === 'number') {\n this.exports.ghostty_key_event_set_unshifted_codepoint(\n eventHandle,\n options.unshiftedCodepoint\n );\n }\n\n return this.encodeKeyHandle(encoder, eventHandle);\n } finally {\n utf8Allocation?.free();\n if (eventHandle !== 0) {\n this.exports.ghostty_key_event_free(eventHandle);\n }\n this.freeOpaque(eventPtrPtr);\n }\n }\n\n private encodeKeyHandle(encoder: number, eventHandle: number): string | null {\n const requiredPtr = this.allocUsize();\n\n try {\n const sizeResult = this.exports.ghostty_key_encoder_encode(encoder, eventHandle, 0, 0, requiredPtr);\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_key_encoder_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return null;\n }\n\n const bufferPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_key_encoder_encode(\n encoder,\n eventHandle,\n bufferPtr,\n required,\n writtenPtr\n ),\n 'ghostty_key_encoder_encode'\n );\n\n const written = this.readUsize(writtenPtr);\n if (written === 0) {\n return null;\n }\n\n return this.readOwnedUtf8(bufferPtr, written);\n } finally {\n this.freeBytes(bufferPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n this.freeUsize(requiredPtr);\n }\n }\n\n encodePaste(terminal: number, data: string): string {\n const input = this.writeString(data);\n const requiredPtr = this.allocUsize();\n\n try {\n const bracketed = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BRACKETED_PASTE);\n const sizeResult = this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n 0,\n 0,\n requiredPtr\n );\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_paste_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return '';\n }\n\n const outputPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n outputPtr,\n required,\n writtenPtr\n ),\n 'ghostty_paste_encode'\n );\n\n return this.readOwnedUtf8(outputPtr, this.readUsize(writtenPtr));\n } finally {\n this.freeBytes(outputPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n input.free();\n this.freeUsize(requiredPtr);\n }\n }\n}\n\nasync function loadGhosttyWasmBytes(source: string): Promise<ArrayBuffer> {\n const isFilePath =\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../') ||\n /^[A-Za-z]:[\\\\/]/.test(source);\n\n if (isFilePath && typeof Bun !== 'undefined') {\n return Bun.file(source).arrayBuffer();\n }\n\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`failed to load ghostty wasm: ${response.status} ${response.statusText}`);\n }\n\n return response.arrayBuffer();\n}\n\nexport async function getGhosttyBindings(): Promise<GhosttyBindings> {\n if (!bindingsPromise) {\n bindingsPromise = (async () => {\n const wasmBytes = await loadGhosttyWasmBytes(ghosttyWasmUrl);\n const wasmModule = await WebAssembly.instantiate(wasmBytes, {\n env: {\n log() {\n // ignore wasm logs in production usage\n },\n },\n });\n\n const exports = wasmModule.instance.exports as GhosttyExports;\n const bytes = new Uint8Array(exports.memory.buffer);\n const typeJsonPtr = exports.ghostty_type_json();\n let end = typeJsonPtr;\n\n while (bytes[end] !== 0) {\n end += 1;\n }\n\n const layout = JSON.parse(\n new TextDecoder().decode(bytes.subarray(typeJsonPtr, end))\n ) as LayoutMap;\n\n return new GhosttyBindings(exports, layout);\n })();\n }\n\n return bindingsPromise;\n}\n\nexport {\n GHOSTTY_FORMATTER_FORMAT_HTML,\n GHOSTTY_FORMATTER_FORMAT_PLAIN,\n GHOSTTY_KEY_ACTION_PRESS,\n GHOSTTY_KEY_ACTION_RELEASE,\n GHOSTTY_KEY_ACTION_REPEAT,\n};\n","import { CanvasRenderer } from './canvas-renderer';\nimport { getGhosttyKeyCode, getUnshiftedCodepoint } from './ghostty-keycodes';\nimport {\n createRenderState,\n disposeRenderStateResources,\n iterateRows,\n readRenderSnapshotMeta,\n updateRenderState,\n type GhosttyRenderStateResources,\n} from './render-state';\nimport {\n clearSelection as resetSelectionData,\n createEmptySelectionState,\n hasSelection,\n projectSelectionRects,\n resolvePointerSelection,\n serializeSelectionText,\n updateSelectionFocus,\n type SelectionMode,\n type SelectionPoint,\n type SelectionState,\n} from './selection-model';\nimport {\n isCopyShortcut,\n writeSelectionToClipboard,\n writeSelectionToCopyEvent,\n} from './selection-clipboard';\nimport {\n getGhosttyBindings,\n keyboardEventToGhosttyMods,\n type GhosttyBindings,\n} from './ghostty-wasm';\nimport type {\n CompatibleBufferLine,\n CompatibleTerminalBuffer,\n CompatibleTerminalLike,\n GhosttyCellDimensions,\n GhosttyRenderRow,\n GhosttyTerminalModeSnapshot,\n GhosttyTerminalInitOptions,\n GhosttyTerminalSize,\n GhosttyViewportGesture,\n TerminalDisposable,\n} from './types';\n\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\nconst DEFAULT_CELL_WIDTH = 9;\nconst DEFAULT_CELL_HEIGHT = 17;\nconst AUTO_SCROLL_INTERVAL_MS = 48;\nconst TERMINAL_ENGINE = 'ghostty-official';\n\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_ALT_SCROLL = 1007;\nconst GHOSTTY_MODE_ALT_SCREEN = 1047;\nconst GHOSTTY_MODE_ALT_SCREEN_SAVE = 1049;\n\nconst MOUSE_TRACKING_MODES: readonly number[] = [\n GHOSTTY_MODE_X10_MOUSE,\n GHOSTTY_MODE_NORMAL_MOUSE,\n GHOSTTY_MODE_BUTTON_MOUSE,\n GHOSTTY_MODE_ANY_MOUSE,\n];\n\nconst GHOSTTY_MOUSE_BUTTON_LEFT = 1;\nconst GHOSTTY_MOUSE_BUTTON_MIDDLE = 3;\nconst GHOSTTY_MOUSE_BUTTON_RIGHT = 2;\nconst GHOSTTY_MOUSE_BUTTON_FOUR = 4;\nconst GHOSTTY_MOUSE_BUTTON_FIVE = 5;\n\ntype PointerDragState = {\n active: boolean;\n moved: boolean;\n mode: SelectionMode;\n lastClientX: number | null;\n lastClientY: number | null;\n};\n\ntype InputRoutingState = {\n mouseReporting: boolean;\n altScroll: boolean;\n};\n\nclass BufferLine implements CompatibleBufferLine {\n constructor(private readonly content: string) {}\n\n translateToString(trimRight: boolean): string {\n return trimRight ? this.content.replace(/\\s+$/u, '') : this.content;\n }\n}\n\nclass TerminalBuffer implements CompatibleTerminalBuffer {\n active = {\n baseY: 0,\n viewportY: 0,\n length: DEFAULT_ROWS,\n getLine: (index: number): CompatibleBufferLine | null => {\n const relativeIndex = index - this.active.viewportY;\n const line = this.visibleLines[relativeIndex];\n return typeof line === 'string' ? new BufferLine(line) : null;\n },\n };\n\n private visibleLines: string[] = Array.from({ length: DEFAULT_ROWS }, () => '');\n\n setViewport(viewportY: number, baseY: number, length: number, lines: string[]): void {\n this.active.viewportY = viewportY;\n this.active.baseY = baseY;\n this.active.length = length;\n this.visibleLines = lines;\n }\n}\n\nfunction shouldEncodeOnKeyDown(event: KeyboardEvent): boolean {\n const isPlainText = event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey;\n if (isPlainText) {\n return false;\n }\n\n return true;\n}\n\nfunction normalizeVisibleLines(rows: GhosttyRenderRow[], expectedRows: number): string[] {\n const lines = rows.slice(0, expectedRows).map((row) => row.text);\n while (lines.length < expectedRows) {\n lines.push('');\n }\n return lines;\n}\n\nfunction pointerLikeEventToGhosttyMods(event: {\n shiftKey?: boolean;\n ctrlKey?: boolean;\n altKey?: boolean;\n metaKey?: boolean;\n}): number {\n return keyboardEventToGhosttyMods({\n shiftKey: Boolean(event.shiftKey),\n ctrlKey: Boolean(event.ctrlKey),\n altKey: Boolean(event.altKey),\n metaKey: Boolean(event.metaKey),\n getModifierState: () => false,\n } as unknown as KeyboardEvent);\n}\n\nexport class FitAddon {\n private terminal: GhosttyTerminalController | null = null;\n\n activate(terminal: CompatibleTerminalLike): void {\n this.terminal = terminal instanceof GhosttyTerminalController ? terminal : null;\n }\n\n fit(): void {\n const proposed = this.proposeDimensions();\n if (!this.terminal || !proposed) {\n return;\n }\n\n this.terminal.resize(proposed.cols, proposed.rows);\n }\n\n proposeDimensions(): GhosttyTerminalSize | null {\n return this.terminal?.measureSizeFromElement() ?? null;\n }\n\n dispose(): void {\n this.terminal = null;\n }\n}\n\nexport class GhosttyTerminalController implements CompatibleTerminalLike {\n readonly buffer = new TerminalBuffer();\n readonly _core = {\n _renderService: {\n dimensions: {\n css: {\n cell: {\n width: DEFAULT_CELL_WIDTH,\n height: DEFAULT_CELL_HEIGHT,\n },\n },\n },\n },\n };\n\n readonly options: GhosttyTerminalInitOptions;\n\n element: HTMLElement | null = null;\n textarea: HTMLElement | null = null;\n cols = DEFAULT_COLS;\n rows = DEFAULT_ROWS;\n\n private readonly bindings: GhosttyBindings;\n private readonly terminalHandle: number;\n private readonly keyEncoderHandle: number;\n private readonly mouseEncoderHandle: number;\n private readonly renderState: GhosttyRenderStateResources;\n private readonly dataListeners = new Set<(data: string) => void>();\n private readonly addons = new Set<{ dispose: () => void }>();\n private screenElement: HTMLDivElement | null = null;\n private renderer: CanvasRenderer | null = null;\n private renderRaf: number | null = null;\n private disposed = false;\n private disableStdin: boolean;\n private customKeyEventHandler: (event: KeyboardEvent) => boolean = () => true;\n private imeIsComposing = false;\n private lastCompositionCommit: { data: string; at: number } | null = null;\n private selectionState: SelectionState = createEmptySelectionState();\n private readonly lineCache = new Map<number, string>();\n private lastViewportOffset = 0;\n private lastViewportRows = DEFAULT_ROWS;\n private lastRenderedRows: GhosttyRenderRow[] = [];\n private pointerDrag: PointerDragState = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n private autoScrollTimer: ReturnType<typeof setInterval> | null = null;\n private readonly domEventDisposers: Array<() => void> = [];\n private copyShortcutSuppressed = false;\n private scrollbarThumb: HTMLDivElement | null = null;\n private scrollbarFadeTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly pressedMouseButtons = new Set<number>();\n private wheelPixelDelta = 0;\n private mouseDragActive = false;\n\n private constructor(\n bindings: GhosttyBindings,\n terminalHandle: number,\n keyEncoderHandle: number,\n mouseEncoderHandle: number,\n renderState: GhosttyRenderStateResources,\n options: GhosttyTerminalInitOptions\n ) {\n this.bindings = bindings;\n this.terminalHandle = terminalHandle;\n this.keyEncoderHandle = keyEncoderHandle;\n this.mouseEncoderHandle = mouseEncoderHandle;\n this.renderState = renderState;\n this.options = options;\n this.disableStdin = Boolean(options.disableStdin);\n }\n\n static async create(options: GhosttyTerminalInitOptions): Promise<GhosttyTerminalController> {\n const bindings = await getGhosttyBindings();\n const terminalHandle = bindings.createTerminal(DEFAULT_COLS, DEFAULT_ROWS, options.scrollback);\n let keyEncoderHandle = 0;\n let mouseEncoderHandle = 0;\n let renderState: GhosttyRenderStateResources | null = null;\n\n try {\n bindings.setTerminalTheme(terminalHandle, options.theme);\n keyEncoderHandle = bindings.createKeyEncoder();\n mouseEncoderHandle = bindings.createMouseEncoder();\n renderState = createRenderState(bindings);\n\n return new GhosttyTerminalController(\n bindings,\n terminalHandle,\n keyEncoderHandle,\n mouseEncoderHandle,\n renderState,\n options\n );\n } catch (error) {\n if (renderState) {\n disposeRenderStateResources(renderState);\n }\n if (keyEncoderHandle !== 0) {\n bindings.freeKeyEncoder(keyEncoderHandle);\n }\n if (mouseEncoderHandle !== 0) {\n bindings.freeMouseEncoder(mouseEncoderHandle);\n }\n bindings.freeTerminal(terminalHandle);\n throw error;\n }\n }\n\n open(container: HTMLElement): void {\n if (this.disposed || this.element) {\n return;\n }\n\n const root = document.createElement('div');\n root.className = 'xterm';\n root.style.position = 'absolute';\n root.style.inset = '0';\n root.style.overflow = 'hidden';\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.backgroundColor = this.options.theme.background;\n root.style.color = this.options.theme.foreground;\n root.style.fontFamily = this.options.fontFamily;\n root.style.fontSize = `${this.options.fontSize}px`;\n root.style.lineHeight = '1.2';\n\n const viewport = document.createElement('div');\n viewport.className = 'xterm-viewport';\n viewport.style.width = '100%';\n viewport.style.height = '100%';\n viewport.style.overflow = 'hidden';\n viewport.style.position = 'relative';\n\n const screen = document.createElement('div');\n screen.className = 'xterm-screen';\n screen.style.width = '100%';\n screen.style.height = '100%';\n screen.style.position = 'relative';\n screen.style.userSelect = 'none';\n screen.style.webkitUserSelect = 'none';\n screen.style.backgroundColor = this.options.theme.background;\n\n const textarea = document.createElement('div');\n textarea.className = 'xterm-helper-textarea';\n textarea.setAttribute('aria-label', 'Terminal Input');\n textarea.setAttribute('role', 'textbox');\n textarea.setAttribute('contenteditable', 'true');\n textarea.setAttribute('autocorrect', 'off');\n textarea.setAttribute('autocapitalize', 'off');\n textarea.setAttribute('spellcheck', 'false');\n textarea.style.position = 'absolute';\n textarea.style.opacity = '1';\n textarea.style.pointerEvents = 'none';\n textarea.style.left = '0';\n textarea.style.top = '0';\n textarea.style.minWidth = '1px';\n textarea.style.minHeight = '1px';\n textarea.style.whiteSpace = 'pre';\n textarea.style.border = '0';\n textarea.style.padding = '0';\n textarea.style.margin = '0';\n textarea.style.color = this.options.theme.foreground;\n textarea.style.backgroundColor = 'transparent';\n textarea.style.caretColor = 'transparent';\n textarea.style.overflow = 'visible';\n textarea.style.outline = 'none';\n textarea.style.boxShadow = 'none';\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n textarea.style.userSelect = 'text';\n textarea.style.webkitUserSelect = 'text';\n\n const scrollbarTrack = document.createElement('div');\n scrollbarTrack.className = 'xterm-scrollbar-track';\n scrollbarTrack.style.position = 'absolute';\n scrollbarTrack.style.top = '0';\n scrollbarTrack.style.right = '0';\n scrollbarTrack.style.width = '8px';\n scrollbarTrack.style.height = '100%';\n scrollbarTrack.style.backgroundColor = 'transparent';\n scrollbarTrack.style.pointerEvents = 'none';\n\n const scrollbarThumb = document.createElement('div');\n scrollbarThumb.className = 'xterm-scrollbar-thumb';\n scrollbarThumb.style.position = 'absolute';\n scrollbarThumb.style.top = '0';\n scrollbarThumb.style.right = '0';\n scrollbarThumb.style.width = '6px';\n scrollbarThumb.style.marginRight = '1px';\n scrollbarThumb.style.borderRadius = '3px';\n scrollbarThumb.style.backgroundColor = 'rgba(128, 128, 128, 0.5)';\n scrollbarThumb.style.pointerEvents = 'none';\n scrollbarThumb.style.transition = 'opacity 0.15s ease';\n scrollbarThumb.style.opacity = '0';\n\n scrollbarTrack.appendChild(scrollbarThumb);\n\n viewport.appendChild(screen);\n root.appendChild(viewport);\n root.appendChild(textarea);\n root.appendChild(scrollbarTrack);\n container.appendChild(root);\n\n this.element = root;\n this.screenElement = screen;\n this.textarea = textarea;\n this.scrollbarThumb = scrollbarThumb;\n this.renderer = new CanvasRenderer({\n screenElement: screen,\n theme: this.options.theme,\n fontFamily: this.options.fontFamily,\n fontSize: this.options.fontSize,\n });\n\n this.syncInputState();\n this.bindDomEvents();\n this.updateCellDimensions();\n\n const measured = this.measureSizeFromElement();\n if (measured) {\n this.resize(measured.cols, measured.rows);\n } else {\n this.render();\n }\n }\n\n loadAddon(addon: { activate: (terminal: CompatibleTerminalLike) => void; dispose: () => void }): void {\n addon.activate(this);\n this.addons.add(addon);\n }\n\n onData(callback: (data: string) => void): TerminalDisposable {\n this.dataListeners.add(callback);\n return {\n dispose: () => {\n this.dataListeners.delete(callback);\n },\n };\n }\n\n attachCustomKeyEventHandler(callback: (event: KeyboardEvent) => boolean): void {\n this.customKeyEventHandler = callback;\n }\n\n write(data: string | Uint8Array): void {\n if (this.disposed) {\n return;\n }\n\n const prevAltScreen = this.isAltScreenActive();\n this.bindings.writeVt(this.terminalHandle, data);\n const nextAltScreen = this.isAltScreenActive();\n if (prevAltScreen && !nextAltScreen) {\n this.clearMouseTrackingModes();\n }\n this.scheduleRender();\n }\n\n clearMouseTrackingModes(): void {\n if (this.disposed) {\n return;\n }\n for (const mode of MOUSE_TRACKING_MODES) {\n this.bindings.setTerminalMode(this.terminalHandle, mode, false);\n }\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.pressedMouseButtons.clear();\n this.mouseDragActive = false;\n }\n\n private isAltScreenActive(): boolean {\n return (\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE)\n );\n }\n\n reset(): void {\n if (this.disposed) {\n return;\n }\n\n this.lineCache.clear();\n this.clearSelectionState(false);\n this.bindings.resetTerminal(this.terminalHandle);\n this.scheduleRender();\n }\n\n refresh(): void {\n if (this.disposed) {\n return;\n }\n\n this.render();\n }\n\n resize(cols: number, rows: number): void {\n if (this.disposed) {\n return;\n }\n\n const nextCols = Math.max(2, Math.floor(cols));\n const nextRows = Math.max(2, Math.floor(rows));\n this.cols = nextCols;\n this.rows = nextRows;\n this.clearSelectionState(false);\n this.bindings.resizeTerminal(this.terminalHandle, nextCols, nextRows, this.cellDimensions());\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.scheduleRender();\n }\n\n scrollLines(amount: number): void {\n if (this.disposed || amount === 0) {\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, amount);\n this.render();\n }\n\n scrollToTop(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportTop(this.terminalHandle);\n this.render();\n }\n\n scrollToBottom(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportBottom(this.terminalHandle);\n this.render();\n }\n\n exportModeSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE),\n mouseNormal: this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE),\n mouseButton: this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE),\n mouseAny: this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE),\n mouseUtf8: this.isModeEnabled(1005),\n mouseSgr: this.isModeEnabled(1006),\n mouseSgrPixels: this.isModeEnabled(1016),\n mouseUrxvt: this.isModeEnabled(1015),\n altScroll: this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n altScreen1047: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN),\n altScreen1049: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE),\n };\n }\n\n restoreModeSnapshot(snapshot: GhosttyTerminalModeSnapshot): void {\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_X10_MOUSE, snapshot.mouseX10);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_NORMAL_MOUSE, snapshot.mouseNormal);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_BUTTON_MOUSE, snapshot.mouseButton);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ANY_MOUSE, snapshot.mouseAny);\n this.bindings.setTerminalMode(this.terminalHandle, 1005, snapshot.mouseUtf8);\n this.bindings.setTerminalMode(this.terminalHandle, 1006, snapshot.mouseSgr);\n this.bindings.setTerminalMode(this.terminalHandle, 1016, snapshot.mouseSgrPixels);\n this.bindings.setTerminalMode(this.terminalHandle, 1015, snapshot.mouseUrxvt);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCROLL, snapshot.altScroll);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN, snapshot.altScreen1047);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN_SAVE, snapshot.altScreen1049);\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n }\n\n handleViewportGesture(gesture: GhosttyViewportGesture): boolean {\n if (this.disposed || gesture.deltaY === 0) {\n return false;\n }\n\n const lines = this.gestureToLines(gesture);\n if (lines === 0) {\n return false;\n }\n\n const routing = this.getInputRoutingState();\n if (routing.mouseReporting) {\n const button = lines < 0 ? GHOSTTY_MOUSE_BUTTON_FOUR : GHOSTTY_MOUSE_BUTTON_FIVE;\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n consumed =\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: gesture.clientX,\n clientY: gesture.clientY,\n mods: pointerLikeEventToGhosttyMods(gesture),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n }) || consumed;\n }\n return consumed;\n }\n\n if (routing.altScroll) {\n return this.emitAltScrollInput(lines);\n }\n\n this.scrollLines(lines);\n return true;\n }\n\n paste(data: string): void {\n if (this.disposed || this.disableStdin || !data) {\n return;\n }\n\n const encoded = this.bindings.encodePaste(this.terminalHandle, data);\n if (!encoded) {\n return;\n }\n\n this.emitData(encoded);\n }\n\n focus(): void {\n this.textarea?.focus({ preventScroll: true });\n }\n\n getRendererKind(): string {\n return this.renderer?.kind ?? 'unknown';\n }\n\n setTheme(theme: GhosttyTerminalInitOptions['theme']): void {\n this.bindings.setTerminalTheme(this.terminalHandle, theme);\n this.options.theme = theme;\n\n if (this.element) {\n this.element.style.backgroundColor = theme.background;\n this.element.style.color = theme.foreground;\n }\n\n if (this.screenElement) {\n this.screenElement.style.backgroundColor = theme.background;\n }\n\n this.renderer?.setTheme(theme);\n this.scheduleRender();\n }\n\n setDisableStdin(disabled: boolean): void {\n this.disableStdin = disabled;\n this.syncInputState();\n }\n\n measureSizeFromElement(): GhosttyTerminalSize | null {\n const element = this.element;\n if (!element) {\n return null;\n }\n\n const rect = element.getBoundingClientRect();\n const { width, height } = this.cellDimensions();\n if (rect.width === 0 || rect.height === 0 || width <= 0 || height <= 0) {\n return null;\n }\n\n return {\n cols: Math.max(2, Math.floor(rect.width / width)),\n rows: Math.max(2, Math.floor(rect.height / height)),\n };\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (this.renderRaf !== null) {\n cancelAnimationFrame(this.renderRaf);\n this.renderRaf = null;\n }\n\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n this.clearDomEventListeners();\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n this.scrollbarFadeTimer = null;\n }\n\n for (const addon of this.addons) {\n addon.dispose();\n }\n this.addons.clear();\n\n this.renderer?.dispose();\n this.renderer = null;\n\n this.element?.remove();\n this.element = null;\n this.screenElement = null;\n this.textarea = null;\n this.scrollbarThumb = null;\n\n disposeRenderStateResources(this.renderState);\n this.bindings.freeMouseEncoder(this.mouseEncoderHandle);\n this.bindings.freeKeyEncoder(this.keyEncoderHandle);\n this.bindings.freeTerminal(this.terminalHandle);\n }\n\n private cellDimensions(): GhosttyCellDimensions {\n return this._core._renderService.dimensions.css.cell;\n }\n\n private syncInputState(): void {\n if (!this.textarea) {\n return;\n }\n\n (this.textarea as any).readOnly = this.disableStdin;\n this.textarea.tabIndex = this.disableStdin ? -1 : 0;\n if (this.disableStdin && document.activeElement === this.textarea) {\n this.textarea.blur();\n }\n }\n\n private bindDomEvents(): void {\n const root = this.element;\n const textarea = this.textarea;\n if (!root || !textarea) {\n return;\n }\n\n root.addEventListener('click', () => {\n if (!this.disableStdin) {\n this.focus();\n }\n });\n\n const selectSurface = this.screenElement ?? root;\n selectSurface.addEventListener('mousedown', (event) => {\n if (!(event instanceof MouseEvent)) {\n return;\n }\n\n if (!this.disableStdin) {\n this.focus();\n }\n\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button === null) {\n return;\n }\n this.clearSelectionState();\n this.pressedMouseButtons.add(button);\n this.mouseDragActive = true;\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: true,\n });\n event.preventDefault();\n return;\n }\n\n if (event.button !== 0) {\n return;\n }\n\n this.mouseDragActive = true;\n this.beginPointerSelection(event);\n event.preventDefault();\n });\n\n root.addEventListener(\n 'wheel',\n (event) => {\n if (\n this.handleViewportGesture({\n source: 'wheel',\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n altKey: event.altKey,\n metaKey: event.metaKey,\n })\n ) {\n event.preventDefault();\n }\n },\n { passive: false }\n );\n\n const dragEventTarget =\n typeof window !== 'undefined' && typeof window.addEventListener === 'function'\n ? window\n : null;\n if (dragEventTarget) {\n const moveListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n if (this.getInputRoutingState().mouseReporting) {\n this.emitMouseInput({\n action: 'motion',\n button: this.mouseButtonFromButtons(event.buttons),\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0 || event.buttons > 0,\n });\n return;\n }\n this.updatePointerSelection(event);\n };\n const upListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n this.mouseDragActive = false;\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button !== null) {\n this.pressedMouseButtons.delete(button);\n }\n this.emitMouseInput({\n action: 'release',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n });\n return;\n }\n this.finishPointerSelection(event);\n };\n dragEventTarget.addEventListener('mousemove', moveListener);\n dragEventTarget.addEventListener('mouseup', upListener);\n this.domEventDisposers.push(() => {\n dragEventTarget.removeEventListener('mousemove', moveListener);\n dragEventTarget.removeEventListener('mouseup', upListener);\n });\n }\n\n textarea.addEventListener('keydown', (event) => {\n const selectionText = this.getSelectionText();\n if (selectionText && isCopyShortcut(event)) {\n this.copyShortcutSuppressed = true;\n event.preventDefault();\n void writeSelectionToClipboard(selectionText).catch(() => {});\n this.clearTextarea();\n return;\n }\n\n if (!this.customKeyEventHandler(event)) {\n return;\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n if (event.keyCode === 229) {\n return;\n }\n\n if (!shouldEncodeOnKeyDown(event)) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, event.repeat ? 'repeat' : 'press');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('keyup', (event) => {\n if (this.copyShortcutSuppressed) {\n const key = event.key.toLowerCase();\n if (key === 'c') {\n event.preventDefault();\n return;\n }\n\n if (key === 'control' || key === 'meta' || key === 'os') {\n this.copyShortcutSuppressed = false;\n event.preventDefault();\n return;\n }\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, 'release');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('compositionstart', () => {\n this.imeIsComposing = true;\n this.lastCompositionCommit = null;\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionupdate', () => {\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionend', (event) => {\n this.imeIsComposing = false;\n const finalData = event.data ?? '';\n if (finalData) {\n this.lastCompositionCommit = { data: finalData, at: Date.now() };\n this.emitData(finalData);\n this.clearTextarea();\n }\n });\n\n textarea.addEventListener('beforeinput', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n if (event.inputType === 'insertFromPaste') {\n return;\n }\n\n const data = event.data ?? '';\n if (!data) {\n return;\n }\n\n if (event.isComposing || this.imeIsComposing) {\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n event.preventDefault();\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n\n event.preventDefault();\n this.emitData(data);\n this.clearTextarea();\n });\n\n textarea.addEventListener('paste', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n const text = event.clipboardData?.getData('text/plain') ?? '';\n if (!text) {\n return;\n }\n\n event.preventDefault();\n this.paste(text);\n this.clearTextarea();\n });\n\n textarea.addEventListener('copy', (event) => {\n const selectionText = this.getSelectionText();\n if (!selectionText) {\n return;\n }\n\n writeSelectionToCopyEvent(event, selectionText);\n });\n\n textarea.addEventListener('input', () => {\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const data = textarea.textContent ?? '';\n if (!data) {\n this.clearTextarea();\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n this.emitData(data);\n this.clearTextarea();\n });\n }\n\n private encodeKeyboardEvent(\n event: KeyboardEvent,\n action: 'press' | 'repeat' | 'release'\n ): string | null {\n const keyCode = getGhosttyKeyCode(event.code);\n if (keyCode === 0) {\n return null;\n }\n\n const utf8 =\n event.key.length === 1 && !event.ctrlKey && !event.metaKey ? event.key : null;\n\n return this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action,\n keyCode,\n mods: keyboardEventToGhosttyMods(event),\n composing: event.isComposing,\n utf8,\n unshiftedCodepoint: getUnshiftedCodepoint(event.code),\n });\n }\n\n private getInputRoutingState(): InputRoutingState {\n const mouseReporting =\n this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE);\n const altScreen =\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE);\n\n return {\n mouseReporting,\n altScroll: !mouseReporting && altScreen && this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n };\n }\n\n private gestureToLines(gesture: GhosttyViewportGesture): number {\n const cellHeight = this.cellDimensions().height || DEFAULT_CELL_HEIGHT;\n\n if (gesture.source === 'wheel') {\n if (gesture.deltaMode === 1) {\n this.wheelPixelDelta = 0;\n return gesture.deltaY > 0 ? Math.ceil(gesture.deltaY) : Math.floor(gesture.deltaY);\n }\n\n if (gesture.deltaMode === 2) {\n this.wheelPixelDelta = 0;\n const pageLines = Math.max(1, this.rows);\n const scaled = gesture.deltaY * pageLines;\n return scaled > 0 ? Math.ceil(scaled) : Math.floor(scaled);\n }\n\n this.wheelPixelDelta += gesture.deltaY;\n const lines =\n this.wheelPixelDelta > 0\n ? Math.floor(this.wheelPixelDelta / cellHeight)\n : Math.ceil(this.wheelPixelDelta / cellHeight);\n if (lines !== 0) {\n this.wheelPixelDelta -= lines * cellHeight;\n }\n return lines;\n }\n\n return gesture.deltaY > 0\n ? Math.ceil(gesture.deltaY / cellHeight)\n : Math.floor(gesture.deltaY / cellHeight);\n }\n\n private isModeEnabled(mode: number): boolean {\n return this.bindings.isTerminalModeEnabled(this.terminalHandle, mode);\n }\n\n private mouseButtonFromEvent(event: MouseEvent): number | null {\n switch (event.button) {\n case 0:\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n case 1:\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n case 2:\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n default:\n return null;\n }\n }\n\n private mouseButtonFromButtons(buttons: number): number | null {\n if (buttons & 1) {\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n }\n if (buttons & 4) {\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n }\n if (buttons & 2) {\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n }\n\n return null;\n }\n\n private pointerPositionFromClient(clientX: number, clientY: number): { x: number; y: number } | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const width = Math.max(1, rect.width);\n const height = Math.max(1, rect.height);\n return {\n x: Math.max(0, Math.min(width - 1, clientX - rect.left)),\n y: Math.max(0, Math.min(height - 1, clientY - rect.top)),\n };\n }\n\n private emitMouseInput(options: {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n clientX: number;\n clientY: number;\n mods: number;\n anyButtonPressed: boolean;\n }): boolean {\n if (this.disableStdin) {\n return false;\n }\n\n const position = this.pointerPositionFromClient(options.clientX, options.clientY);\n if (!position) {\n return false;\n }\n\n const cell = this.cellDimensions();\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return false;\n }\n\n const payload = this.bindings.encodeMouseEvent(this.mouseEncoderHandle, this.terminalHandle, {\n action: options.action,\n button: options.button,\n mods: options.mods,\n x: position.x,\n y: position.y,\n anyButtonPressed: options.anyButtonPressed,\n screenWidth: Math.max(1, Math.round(rect.width)),\n screenHeight: Math.max(1, Math.round(rect.height)),\n cellWidth: Math.max(1, Math.round(cell.width || DEFAULT_CELL_WIDTH)),\n cellHeight: Math.max(1, Math.round(cell.height || DEFAULT_CELL_HEIGHT)),\n });\n if (!payload) {\n return false;\n }\n\n this.emitData(payload);\n return true;\n }\n\n private emitAltScrollInput(lines: number): boolean {\n const keyCode = getGhosttyKeyCode(lines < 0 ? 'ArrowUp' : 'ArrowDown');\n if (keyCode === 0) {\n return false;\n }\n\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n const payload = this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action: 'press',\n keyCode,\n mods: 0,\n composing: false,\n utf8: null,\n unshiftedCodepoint: null,\n });\n if (!payload) {\n continue;\n }\n this.emitData(payload);\n consumed = true;\n }\n\n return consumed;\n }\n\n private emitData(data: string): void {\n for (const listener of this.dataListeners) {\n listener(data);\n }\n }\n\n private clearTextarea(): void {\n if (this.textarea) {\n this.textarea.textContent = '';\n }\n }\n\n private syncTextareaPositionToCursor(): void {\n const textarea = this.textarea;\n const screen = this.screenElement;\n if (!textarea || !screen) {\n return;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return;\n }\n\n const renderState = createRenderState(this.bindings);\n let cursorX = 0;\n let cursorY = 0;\n try {\n updateRenderState(renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(renderState);\n if (meta.cursor.x !== null && meta.cursor.y !== null) {\n cursorX = meta.cursor.x;\n cursorY = meta.cursor.y;\n }\n } finally {\n disposeRenderStateResources(renderState);\n }\n\n const left = cursorX * width;\n const top = cursorY * height;\n\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.width = `${Math.max(1, width)}px`;\n textarea.style.height = `${Math.max(1, height)}px`;\n textarea.style.lineHeight = `${height}px`;\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n }\n\n private scheduleRender(): void {\n if (this.renderRaf !== null) {\n return;\n }\n\n this.renderRaf = requestAnimationFrame(() => {\n this.renderRaf = null;\n this.render();\n });\n }\n\n private render(): void {\n if (this.disposed || !this.screenElement || !this.renderer) {\n return;\n }\n\n const scrollbar = this.bindings.readScrollbar(this.terminalHandle);\n const viewportRows = Math.max(1, scrollbar.len || this.rows);\n\n updateRenderState(this.renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(this.renderState);\n const rows = Array.from(iterateRows(this.renderState));\n\n this.cols = Math.max(2, meta.cols);\n this.rows = Math.max(2, meta.rows || viewportRows);\n this.lastViewportOffset = scrollbar.offset;\n this.lastViewportRows = this.rows;\n this.lastRenderedRows = rows;\n\n for (const row of rows) {\n this.lineCache.set(scrollbar.offset + row.y, row.text);\n }\n\n const selectionRects = projectSelectionRects(\n this.selectionState,\n this.lastViewportOffset,\n this.lastViewportRows,\n (line) => this.getLineText(line)\n );\n const selectionText = this.getSelectionText();\n\n this.renderer.render({\n meta,\n rows,\n cellDimensions: this.cellDimensions(),\n selectionRects,\n selectionColor: this.options.theme.selectionBackground,\n });\n\n const visibleLines = normalizeVisibleLines(rows, this.rows);\n const baseY = Math.max(0, scrollbar.total - scrollbar.len);\n this.buffer.setViewport(scrollbar.offset, baseY, scrollbar.total, visibleLines);\n this.updateSelectionTextProbe(selectionText);\n this.updateScrollbar(scrollbar);\n }\n\n private updateScrollbar(scrollbar: { total: number; offset: number; len: number }): void {\n const thumb = this.scrollbarThumb;\n if (!thumb) {\n return;\n }\n\n const trackHeight = this.screenElement?.clientHeight ?? 0;\n if (trackHeight === 0 || scrollbar.total <= scrollbar.len) {\n thumb.style.opacity = '0';\n return;\n }\n\n const ratio = scrollbar.len / scrollbar.total;\n const thumbHeight = Math.max(20, ratio * trackHeight);\n const scrollRatio = scrollbar.offset / Math.max(1, scrollbar.total - scrollbar.len);\n const thumbTop = scrollRatio * (trackHeight - thumbHeight);\n\n thumb.style.height = `${thumbHeight}px`;\n thumb.style.transform = `translateY(${thumbTop}px)`;\n thumb.style.opacity = '1';\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n }\n this.scrollbarFadeTimer = setTimeout(() => {\n thumb.style.opacity = '0';\n }, 800);\n }\n\n private updateCellDimensions(): void {\n if (!this.element) {\n return;\n }\n\n const probe = document.createElement('span');\n probe.textContent = 'WWWWWWWWWW';\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n probe.style.whiteSpace = 'pre';\n probe.style.fontFamily = this.options.fontFamily;\n probe.style.fontSize = `${this.options.fontSize}px`;\n probe.style.lineHeight = '1.2';\n\n this.element.appendChild(probe);\n const rect = probe.getBoundingClientRect();\n probe.remove();\n\n this._core._renderService.dimensions.css.cell.width =\n rect.width > 0 ? rect.width / 10 : DEFAULT_CELL_WIDTH;\n this._core._renderService.dimensions.css.cell.height =\n rect.height > 0 ? rect.height : DEFAULT_CELL_HEIGHT;\n }\n\n private clearSelectionState(repaint = true): void {\n this.selectionState = resetSelectionData();\n this.pressedMouseButtons.clear();\n this.wheelPixelDelta = 0;\n this.pointerDrag = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n this.copyShortcutSuppressed = false;\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n\n if (repaint && this.screenElement && this.renderer) {\n this.render();\n }\n }\n\n private beginPointerSelection(event: MouseEvent): void {\n const point = this.hitTest(event.clientX, event.clientY);\n if (!point) {\n return;\n }\n\n const mode = this.selectionModeFromClickDetail(event.detail);\n this.pointerDrag = {\n active: true,\n moved: false,\n mode,\n lastClientX: event.clientX,\n lastClientY: event.clientY,\n };\n this.selectionState = resolvePointerSelection(\n this.selectionState,\n {\n ...point,\n mode,\n },\n (line) => this.getLineText(line)\n );\n this.updateAutoScroll();\n this.render();\n }\n\n private updatePointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active) {\n return;\n }\n\n const point = this.hitTest(event.clientX, event.clientY);\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n\n if (point) {\n this.pointerDrag.moved = true;\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.render();\n }\n\n this.updateAutoScroll();\n }\n\n private finishPointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active || event.button !== 0) {\n return;\n }\n\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n this.stopAutoScroll();\n\n const shouldClear =\n this.pointerDrag.mode === 'character' &&\n !this.pointerDrag.moved &&\n this.selectionState.anchor?.line === this.selectionState.focus?.line &&\n this.selectionState.anchor?.col === this.selectionState.focus?.col;\n this.pointerDrag.active = false;\n\n if (shouldClear) {\n this.clearSelectionState();\n return;\n }\n\n this.render();\n }\n\n private selectionModeFromClickDetail(detail: number): SelectionMode {\n if (detail >= 3) {\n return 'line';\n }\n if (detail === 2) {\n return 'word';\n }\n return 'character';\n }\n\n private hitTest(clientX: number, clientY: number): SelectionPoint | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return null;\n }\n\n const relativeX = clientX - rect.left;\n const relativeY = clientY - rect.top;\n const maxCol = Math.max(this.cols - 1, 0);\n const maxRow = Math.max(this.lastViewportRows - 1, 0);\n const col = Math.max(0, Math.min(maxCol, Math.floor(relativeX / width)));\n const row = Math.max(0, Math.min(maxRow, Math.floor(relativeY / height)));\n\n return {\n line: this.lastViewportOffset + row,\n col,\n };\n }\n\n private getLineText(line: number): string {\n const cached = this.lineCache.get(line);\n if (typeof cached === 'string') {\n return cached;\n }\n\n const visibleIndex = line - this.lastViewportOffset;\n const visibleRow = this.lastRenderedRows[visibleIndex];\n return visibleRow?.text ?? '';\n }\n\n private getSelectionText(): string | null {\n if (!hasSelection(this.selectionState)) {\n return null;\n }\n\n return serializeSelectionText(this.selectionState, (line) => this.getLineText(line));\n }\n\n private updateSelectionTextProbe(value: string | null): void {\n (globalThis as { __tmexE2eTerminalSelectionText?: string | null }).__tmexE2eTerminalSelectionText =\n value;\n }\n\n private updateAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n const outsideViewport =\n this.pointerDrag.lastClientY < rect.top || this.pointerDrag.lastClientY > rect.bottom;\n if (!outsideViewport) {\n this.stopAutoScroll();\n return;\n }\n\n if (this.autoScrollTimer !== null) {\n return;\n }\n\n this.autoScrollTimer = setInterval(() => {\n this.stepAutoScroll();\n }, AUTO_SCROLL_INTERVAL_MS);\n }\n\n private stepAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientX === null || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n let delta = 0;\n if (this.pointerDrag.lastClientY < rect.top) {\n delta = -1;\n } else if (this.pointerDrag.lastClientY > rect.bottom) {\n delta = 1;\n }\n\n if (delta === 0) {\n this.stopAutoScroll();\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, delta);\n this.render();\n\n const point = this.hitTest(this.pointerDrag.lastClientX, this.pointerDrag.lastClientY);\n if (!point) {\n return;\n }\n\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.pointerDrag.moved = true;\n this.render();\n }\n\n private stopAutoScroll(): void {\n if (this.autoScrollTimer === null) {\n return;\n }\n\n clearInterval(this.autoScrollTimer);\n this.autoScrollTimer = null;\n }\n\n private clearDomEventListeners(): void {\n while (this.domEventDisposers.length > 0) {\n const dispose = this.domEventDisposers.pop();\n dispose?.();\n }\n }\n}\n\nexport async function createTerminalController(\n options: GhosttyTerminalInitOptions\n): Promise<GhosttyTerminalController> {\n return GhosttyTerminalController.create(options);\n}\n\nexport { TERMINAL_ENGINE };\n","/**\n * seoul256.vim color scheme\n * https://github.com/junegunn/seoul256.vim\n * https://github.com/mikker/seoul256-iTerm\n *\n * Dark theme uses seoul256-iTerm colors\n * Light theme uses seoul256.vim colors\n */\n\n/**\n * seoul256-light - Seoul Colors Light\n * From seoul256.vim: Background 253 (#E1E1E1), Foreground 239 (#616161)\n */\nexport const XTERM_THEME_LIGHT = {\n background: '#e1e1e1',\n foreground: '#616161',\n cursor: '#616161',\n selectionBackground: 'rgba(97, 97, 97, 0.25)',\n // ANSI colors\n black: '#171717',\n red: '#bf2172',\n green: '#009799',\n yellow: '#9a7200',\n blue: '#007299',\n magenta: '#9b1d72',\n cyan: '#007173',\n white: '#d9d9d9',\n // Bright colors\n brightBlack: '#4e4e4e',\n brightRed: '#e12672',\n brightGreen: '#00bddf',\n brightYellow: '#ffdd00',\n brightBlue: '#7299bc',\n brightMagenta: '#e17899',\n brightCyan: '#6fbcbd',\n brightWhite: '#f1f1f1',\n};\n\n/**\n * seoul256-dark - Seoul Colors Dark\n * From seoul256-iTerm: https://github.com/mikker/seoul256-iTerm\n */\nexport const XTERM_THEME_DARK = {\n background: '#262626',\n foreground: '#d0d0d0',\n cursor: '#c5c5c5',\n selectionBackground: 'rgba(197, 197, 197, 0.25)',\n // ANSI colors (from iTerm colors)\n black: '#000000',\n red: '#ba3c3c',\n green: '#5d876d',\n yellow: '#d5a54e',\n blue: '#887c8d',\n magenta: '#cd6d6d',\n cyan: '#618484',\n white: '#cfcdc3',\n // Bright colors (from iTerm colors)\n brightBlack: '#000000',\n brightRed: '#ea7171',\n brightGreen: '#7aab7a',\n brightYellow: '#d1d194',\n brightBlue: '#afa3b5',\n brightMagenta: '#e29f9f',\n brightCyan: '#a0aea3',\n brightWhite: '#d0d0d0',\n};\n\nexport const XTERM_FONT_FAMILY =\n '\"JetBrains Mono\", \"SF Mono\", Menlo, Monaco, Consolas, \"Liberation Mono\", \"Noto Sans Mono CJK SC\", \"Source Han Mono SC\", \"Sarasa Mono SC\", \"Noto Color Emoji\", \"Apple Color Emoji\", \"Segoe UI Emoji\", monospace';\n\n// 别名导出,保持兼容性\nexport const XTERM_THEME_MIDNIGHT_AMETHYST = XTERM_THEME_DARK;\nexport const XTERM_THEME_DAWN_AMETHYST = XTERM_THEME_LIGHT;\n","export function normalizeHistoryForTerminal(data: string): string {\n if (!data) return data;\n const canonical = data.replace(/\\r\\n/g, '\\n');\n const trimmed = canonical.endsWith('\\n') ? canonical.slice(0, -1) : canonical;\n return trimmed.replace(/\\n/g, '\\r\\n');\n}\n\nconst ALT_SCREEN_HISTORY_PREAMBLE = '\\x1b[?1049h\\x1b[H\\x1b[2J';\n\nexport function wrapAlternateScreenHistory(data: string): string {\n return ALT_SCREEN_HISTORY_PREAMBLE + normalizeHistoryForTerminal(data);\n}\n\nexport function normalizeLiveOutputForTerminal(\n data: Uint8Array,\n previousEndedWithCR: boolean\n): { normalized: Uint8Array; endedWithCR: boolean } {\n let prevWasCR = previousEndedWithCR;\n let extraCRCount = 0;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n extraCRCount += 1;\n }\n prevWasCR = byte === 0x0d;\n }\n\n const endedWithCR = prevWasCR;\n if (extraCRCount === 0) {\n return { normalized: data, endedWithCR };\n }\n\n const normalized = new Uint8Array(data.length + extraCRCount);\n let writeIndex = 0;\n prevWasCR = previousEndedWithCR;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n normalized[writeIndex] = 0x0d;\n writeIndex += 1;\n }\n normalized[writeIndex] = byte;\n writeIndex += 1;\n prevWasCR = byte === 0x0d;\n }\n\n return { normalized, endedWithCR };\n}\n","import { useEffect, useRef } from 'react';\n\ninterface TerminalScroller {\n scrollLines: (amount: number) => void;\n handleViewportGesture?: (gesture: {\n source: 'touch';\n deltaY: number;\n clientX: number;\n clientY: number;\n }) => boolean;\n buffer?: {\n active?: {\n viewportY?: number;\n };\n };\n}\n\nconst TOUCH_SCROLL_GAIN = 1.3;\nconst SCROLLBAR_TOUCH_HOTZONE_PX = 36;\n\nexport function useMobileTouch(\n containerRef: React.RefObject<HTMLElement | null>,\n getTerminal?: () => TerminalScroller | null\n) {\n const isActiveRef = useRef(false);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const isMobile =\n window.innerWidth < 768 || navigator.maxTouchPoints > 0 || 'ontouchstart' in window;\n if (!isMobile) return;\n\n isActiveRef.current = true;\n let lastTouchY = 0;\n let touchId: number | null = null;\n let bypassCustomScroll = false;\n let pendingPixelDelta = 0;\n\n const isScrollbarElement = (target: Element | null): boolean => {\n if (!target) return false;\n return Boolean(\n target.closest('.scrollbar') ||\n target.closest('.slider') ||\n target.closest('.xterm-scroll-area')\n );\n };\n\n const shouldBypassCustomScroll = (\n clientX: number,\n clientY: number,\n eventTarget: EventTarget | null\n ): boolean => {\n const directTarget = eventTarget instanceof Element ? eventTarget : null;\n if (isScrollbarElement(directTarget)) {\n return true;\n }\n\n const pointTarget = document.elementFromPoint(clientX, clientY);\n if (isScrollbarElement(pointTarget)) {\n return true;\n }\n\n const xtermRoot = container.querySelector('.xterm');\n if (!(xtermRoot instanceof HTMLElement)) {\n return false;\n }\n\n const rect = xtermRoot.getBoundingClientRect();\n const insideX = clientX >= rect.left && clientX <= rect.right;\n const insideY = clientY >= rect.top && clientY <= rect.bottom;\n if (!insideX || !insideY) {\n return false;\n }\n\n return clientX >= rect.right - SCROLLBAR_TOUCH_HOTZONE_PX;\n };\n\n const findScrollTargets = (): HTMLElement[] => {\n const candidates = [\n container.querySelector('.xterm-viewport'),\n container.querySelector('.xterm-scrollable-element'),\n ];\n\n return candidates.filter((el): el is HTMLElement => el instanceof HTMLElement);\n };\n\n const findTouchById = (touchList: TouchList): Touch | null => {\n if (touchId === null) return null;\n for (let i = 0; i < touchList.length; i += 1) {\n const touch = touchList.item(i);\n if (touch && touch.identifier === touchId) {\n return touch;\n }\n }\n return null;\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n if (event.touches.length !== 1) return;\n const touch = event.touches.item(0);\n if (!touch) return;\n\n touchId = touch.identifier;\n lastTouchY = touch.clientY;\n pendingPixelDelta = 0;\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n const touch = findTouchById(event.touches) ?? event.touches.item(0);\n if (!touch) return;\n if (!bypassCustomScroll) {\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n if (bypassCustomScroll) {\n pendingPixelDelta = 0;\n }\n }\n if (bypassCustomScroll) return;\n\n const currentY = touch.clientY;\n const deltaY = lastTouchY - currentY;\n lastTouchY = currentY;\n\n if (deltaY === 0) return;\n\n let didScroll = false;\n let atTopWhilePullingDown = false;\n const terminal = getTerminal?.() ?? null;\n\n if (terminal) {\n const core = (terminal as any)?._core;\n const lineHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 18;\n pendingPixelDelta += deltaY * TOUCH_SCROLL_GAIN;\n const linesToScroll =\n pendingPixelDelta > 0\n ? Math.floor(pendingPixelDelta / lineHeight)\n : Math.ceil(pendingPixelDelta / lineHeight);\n\n if (typeof terminal.handleViewportGesture === 'function') {\n if (linesToScroll !== 0) {\n didScroll = terminal.handleViewportGesture({\n source: 'touch',\n deltaY: linesToScroll * lineHeight,\n clientX: touch.clientX,\n clientY: touch.clientY,\n });\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n } else {\n if (linesToScroll !== 0) {\n const beforeViewportY = terminal.buffer?.active?.viewportY ?? 0;\n terminal.scrollLines(linesToScroll);\n const afterViewportY = terminal.buffer?.active?.viewportY ?? 0;\n didScroll = beforeViewportY !== afterViewportY;\n atTopWhilePullingDown = linesToScroll < 0 && beforeViewportY <= 0 && afterViewportY <= 0;\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n }\n } else {\n const scrollTargets = findScrollTargets();\n if (scrollTargets.length === 0) return;\n\n for (const target of scrollTargets) {\n const previousScrollTop = target.scrollTop;\n target.scrollTop += deltaY;\n const nextScrollTop = target.scrollTop;\n\n if (Math.abs(nextScrollTop - previousScrollTop) > 0) {\n didScroll = true;\n }\n if (deltaY < 0 && nextScrollTop <= 0) {\n atTopWhilePullingDown = true;\n }\n }\n if (!didScroll) {\n const xtermRoot = container.querySelector('.xterm');\n if (xtermRoot instanceof HTMLElement) {\n const wheelEvent = new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n deltaMode: WheelEvent.DOM_DELTA_PIXEL,\n deltaY,\n });\n const dispatched = xtermRoot.dispatchEvent(wheelEvent);\n didScroll = wheelEvent.defaultPrevented || !dispatched;\n }\n }\n }\n\n if (!event.cancelable) return;\n if (didScroll || atTopWhilePullingDown) {\n event.preventDefault();\n }\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n if (touchId === null) return;\n const endedTouch = findTouchById(event.changedTouches);\n if (!endedTouch) return;\n touchId = null;\n pendingPixelDelta = 0;\n bypassCustomScroll = false;\n };\n\n container.addEventListener('touchstart', handleTouchStart, { passive: true });\n container.addEventListener('touchmove', handleTouchMove, { passive: false });\n container.addEventListener('touchend', handleTouchEnd, { passive: true });\n container.addEventListener('touchcancel', handleTouchEnd, { passive: true });\n\n return () => {\n isActiveRef.current = false;\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('touchend', handleTouchEnd);\n container.removeEventListener('touchcancel', handleTouchEnd);\n };\n }, [containerRef, getTerminal]);\n\n return isActiveRef;\n}\n","export interface TerminalSizeSnapshot {\n cols: number;\n rows: number;\n}\n\nexport interface TimedTerminalSizeSnapshot extends TerminalSizeSnapshot {\n at: number;\n}\n\ninterface ViewportRestoreSyncInput {\n currentSize: TerminalSizeSnapshot;\n containerSize: TerminalSizeSnapshot;\n force?: boolean;\n}\n\ninterface RemotePaneSizeGuardInput {\n now: number;\n remoteSize: TerminalSizeSnapshot;\n pendingLocalSize: TimedTerminalSizeSnapshot | null;\n ttlMs?: number;\n}\n\nexport function shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n ttlMs = 2000,\n}: RemotePaneSizeGuardInput): boolean {\n if (!pendingLocalSize) {\n return true;\n }\n\n if (now - pendingLocalSize.at > ttlMs) {\n return true;\n }\n\n return pendingLocalSize.cols === remoteSize.cols && pendingLocalSize.rows === remoteSize.rows;\n}\n\ninterface ForceLocalSizeSyncInput extends RemotePaneSizeGuardInput {\n containerSize: TerminalSizeSnapshot | null;\n}\n\nexport function shouldForceLocalSizeSync({\n now: _now,\n remoteSize: _remoteSize,\n pendingLocalSize: _pendingLocalSize,\n containerSize: _containerSize,\n ttlMs: _ttlMs = 2000,\n}: ForceLocalSizeSyncInput): boolean {\n return false;\n}\n\nexport function shouldSyncOnViewportRestore({\n currentSize,\n containerSize,\n force = false,\n}: ViewportRestoreSyncInput): boolean {\n if (force) {\n return true;\n }\n\n return currentSize.cols !== containerSize.cols || currentSize.rows !== containerSize.rows;\n}\n","import { shouldSyncOnViewportRestore } from '@/utils/resizeSyncGuards';\nimport type { CompatibleTerminalLike } from 'ghostty-terminal';\nimport type { FitAddon } from 'ghostty-terminal';\nimport { useCallback, useEffect, useRef } from 'react';\n\ninterface UseTerminalResizeOptions {\n deviceId: string;\n paneId: string;\n deviceConnected: boolean;\n isSelectionInvalid: boolean;\n onResize: (cols: number, rows: number) => void;\n onSync: (cols: number, rows: number) => void;\n /** 获取容器尺寸的回调函数,用于 fitAddon 失败时的回退计算 */\n getContainerRect?: () => { width: number; height: number } | null;\n}\n\nexport function useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect,\n}: UseTerminalResizeOptions) {\n const resizeRaf = useRef<number | null>(null);\n const resizeTimer = useRef<number | null>(null);\n const lastReportedSize = useRef<{ cols: number; rows: number } | null>(null);\n const pendingLocalSize = useRef<{ cols: number; rows: number; at: number } | null>(null);\n const suppressLocalResizeUntil = useRef(0);\n const postSelectResizeTimers = useRef<number[]>([]);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const terminalRef = useRef<CompatibleTerminalLike | null>(null);\n const getContainerRectRef = useRef(getContainerRect);\n const viewportRestorePendingRef = useRef(false);\n\n // Use refs to store callbacks to avoid dependency cycles\n const onResizeRef = useRef(onResize);\n const onSyncRef = useRef(onSync);\n\n // Update refs when callbacks change\n useEffect(() => {\n onResizeRef.current = onResize;\n }, [onResize]);\n\n useEffect(() => {\n onSyncRef.current = onSync;\n }, [onSync]);\n\n useEffect(() => {\n getContainerRectRef.current = getContainerRect;\n }, [getContainerRect]);\n\n const measureTerminalSize = useCallback((): { cols: number; rows: number } | null => {\n const term = terminalRef.current;\n const fitAddon = fitAddonRef.current;\n if (!term || !fitAddon || !term.element) {\n return null;\n }\n\n let cols: number;\n\n try {\n const proposed = fitAddon.proposeDimensions();\n if (!proposed) {\n throw new Error('fitAddon.proposeDimensions() returned null');\n }\n cols = Math.max(2, proposed.cols);\n } catch {\n const core = (term as any)._core;\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n const rect = getContainerRectRef.current?.();\n if (!rect || rect.width === 0) {\n return null;\n }\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const containerRect = getContainerRectRef.current?.();\n if (!containerRect || containerRect.height === 0) {\n return null;\n }\n const core = (term as any)._core;\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(containerRect.height / cellHeight));\n\n return { cols, rows };\n }, []);\n\n const applyTerminalSize = useCallback((cols: number, rows: number): void => {\n const term = terminalRef.current;\n if (!term) {\n return;\n }\n if (term.cols === cols && term.rows === rows) {\n return;\n }\n term.resize(cols, rows);\n }, []);\n\n const reportSize = useCallback(\n (kind: 'resize' | 'sync', force = false) => {\n // sync 操作即使在 isSelectionInvalid 时也应该执行,因为尺寸同步是基础功能\n // isSelectionInvalid 主要影响用户输入,不应该阻止终端尺寸同步\n if (!deviceId || !paneId || !deviceConnected) {\n return false;\n }\n if (isSelectionInvalid && kind !== 'sync') {\n return false;\n }\n\n if (!force && Date.now() < suppressLocalResizeUntil.current) {\n return false;\n }\n\n const term = terminalRef.current;\n if (!term) {\n return false;\n }\n\n const measuredSize = measureTerminalSize();\n if (!measuredSize) {\n return false;\n }\n const { cols, rows } = measuredSize;\n // Debug: console.log('[resize] success:', { kind, cols, rows, force });\n const lastSize = lastReportedSize.current;\n\n if (!force && lastSize && lastSize.cols === cols && lastSize.rows === rows) {\n applyTerminalSize(cols, rows);\n return true;\n }\n\n applyTerminalSize(cols, rows);\n\n if (kind === 'sync') {\n onSyncRef.current(cols, rows);\n } else {\n onResizeRef.current(cols, rows);\n }\n\n lastReportedSize.current = { cols, rows };\n pendingLocalSize.current = { cols, rows, at: Date.now() };\n return true;\n },\n // Only depend on stable values, not the callbacks\n [applyTerminalSize, deviceConnected, deviceId, isSelectionInvalid, measureTerminalSize, paneId]\n );\n\n const scheduleResize = useCallback(\n (\n kind: 'resize' | 'sync' = 'resize',\n options: { immediate?: boolean; force?: boolean } = {}\n ) => {\n const { immediate = false, force = false } = options;\n\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n resizeTimer.current = null;\n }\n\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n resizeRaf.current = null;\n }\n\n const run = () => {\n resizeRaf.current = requestAnimationFrame(() => {\n resizeRaf.current = null;\n reportSize(kind, force);\n });\n };\n\n if (immediate) {\n run();\n return;\n }\n\n resizeTimer.current = window.setTimeout(() => {\n resizeTimer.current = null;\n run();\n }, 150);\n },\n [reportSize]\n );\n\n const clearPostSelectResizeTimers = useCallback(() => {\n for (const id of postSelectResizeTimers.current) {\n window.clearTimeout(id);\n }\n postSelectResizeTimers.current = [];\n }, []);\n\n const runPostSelectResize = useCallback(() => {\n clearPostSelectResizeTimers();\n scheduleResize('sync', { immediate: true, force: true });\n\n const retryId = window.setTimeout(() => {\n scheduleResize('sync', { immediate: true, force: true });\n }, 60);\n postSelectResizeTimers.current.push(retryId);\n\n if (typeof document !== 'undefined' && 'fonts' in document && document.fonts?.ready) {\n document.fonts.ready\n .then(() => {\n scheduleResize('sync', { immediate: true, force: true });\n })\n .catch(() => {\n // ignore\n });\n }\n }, [clearPostSelectResizeTimers, scheduleResize]);\n\n // 浏览器窗口 resize 处理 - 共享 scheduleResize 的防抖\n useEffect(() => {\n let rafId: number | null = null;\n const handleWindowResize = () => {\n // 使用 RAF 确保在布局完成后执行,并与 ResizeObserver 协调\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n };\n\n window.addEventListener('resize', handleWindowResize);\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n const handleViewportRestore = () => {\n const term = terminalRef.current;\n const containerSize = measureTerminalSize();\n if (!term || !containerSize) {\n return;\n }\n\n const shouldSync = shouldSyncOnViewportRestore({\n currentSize: { cols: Math.max(2, term.cols), rows: Math.max(2, term.rows) },\n containerSize,\n });\n if (!shouldSync) {\n term.refresh?.();\n return;\n }\n\n scheduleResize('sync', { force: true });\n };\n\n const handleVisibilityChange = () => {\n if (document.visibilityState !== 'visible') {\n viewportRestorePendingRef.current = true;\n return;\n }\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n const handleWindowBlur = () => {\n viewportRestorePendingRef.current = true;\n };\n\n const handleWindowFocus = () => {\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('blur', handleWindowBlur);\n window.addEventListener('focus', handleWindowFocus);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('blur', handleWindowBlur);\n window.removeEventListener('focus', handleWindowFocus);\n };\n }, [measureTerminalSize, scheduleResize]);\n\n // 清理\n useEffect(() => {\n return () => {\n clearPostSelectResizeTimers();\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n }\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n }\n };\n }, [clearPostSelectResizeTimers]);\n\n const setFitAddon = useCallback((addon: FitAddon | null) => {\n fitAddonRef.current = addon;\n }, []);\n\n const setTerminal = useCallback((terminal: CompatibleTerminalLike | null) => {\n terminalRef.current = terminal;\n }, []);\n\n return {\n scheduleResize,\n runPostSelectResize,\n clearPostSelectResizeTimers,\n setFitAddon,\n setTerminal,\n lastReportedSize,\n pendingLocalSize,\n suppressLocalResizeUntil,\n };\n}\n","import {\n FitAddon,\n TERMINAL_ENGINE,\n createTerminalController,\n type CompatibleTerminalLike,\n type GhosttyTerminalModeSnapshot,\n} from 'ghostty-terminal';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTmuxStore } from '@/stores/tmux';\nimport { type SelectCallbacks, getSelectStateMachine } from '@/ws-borsh';\nimport { XTERM_FONT_FAMILY, XTERM_THEME_DARK, XTERM_THEME_LIGHT } from './theme';\nimport {\n normalizeHistoryForTerminal,\n normalizeLiveOutputForTerminal,\n wrapAlternateScreenHistory,\n} from './normalization';\nimport type { TerminalProps, TerminalRef } from './types';\nimport { useMobileTouch } from './useMobileTouch';\nimport { useTerminalResize } from './useTerminalResize';\n\nconst TERMINAL_CONFIG = {\n fontFamily: XTERM_FONT_FAMILY,\n fontSize: 13,\n scrollback: 10000,\n};\n\nconst TERMINAL_MODE_CACHE_KEY = 'tmex:terminal-mode-cache';\n\nfunction readTerminalModeCache(\n deviceId: string,\n paneId: string\n): GhosttyTerminalModeSnapshot | null {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>;\n return parsed[`${deviceId}:${paneId}`] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeTerminalModeCache(\n deviceId: string,\n paneId: string,\n snapshot: GhosttyTerminalModeSnapshot | null\n): void {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n const parsed = raw ? (JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>) : {};\n const key = `${deviceId}:${paneId}`;\n if (snapshot) {\n parsed[key] = snapshot;\n } else {\n delete parsed[key];\n }\n sessionStorage.setItem(TERMINAL_MODE_CACHE_KEY, JSON.stringify(parsed));\n } catch {\n // ignore storage failures\n }\n}\n\nfunction createAlternateScreenFallbackSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: false,\n mouseNormal: true,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n };\n}\n\nfunction reconcileRecoveredModes(\n cached: GhosttyTerminalModeSnapshot | null,\n alternateScreen: boolean\n): GhosttyTerminalModeSnapshot | null {\n if (!alternateScreen) {\n if (!cached) return null;\n return {\n ...cached,\n mouseX10: false,\n mouseNormal: false,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScreen1047: false,\n altScreen1049: false,\n };\n }\n\n const fallback = createAlternateScreenFallbackSnapshot();\n if (!cached) {\n return fallback;\n }\n\n const hasTrackingMode = cached.mouseNormal || cached.mouseButton || cached.mouseAny;\n\n return {\n ...cached,\n mouseX10: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n mouseNormal: hasTrackingMode ? cached.mouseNormal : fallback.mouseNormal,\n };\n}\n\nfunction setE2eTerminalProbe(terminal: CompatibleTerminalLike): void {\n const g = globalThis as any;\n g.__tmexE2eXterm = terminal;\n g.__tmexE2eTerminal = terminal;\n g.__tmexE2eTerminalEngine = TERMINAL_ENGINE;\n g.__tmexE2eTerminalRenderer = terminal.getRendererKind?.() ?? null;\n}\n\nfunction clearE2eTerminalProbe(terminal: CompatibleTerminalLike | null): void {\n if (!terminal) {\n return;\n }\n\n const g = globalThis as any;\n if (g.__tmexE2eTerminal !== terminal && g.__tmexE2eXterm !== terminal) {\n return;\n }\n\n g.__tmexE2eXterm = null;\n g.__tmexE2eTerminal = null;\n g.__tmexE2eTerminalEngine = null;\n g.__tmexE2eTerminalRenderer = null;\n g.__tmexE2eTerminalSelectionText = null;\n}\n\nexport const Terminal = forwardRef<TerminalRef, TerminalProps>(\n (\n { deviceId, paneId, theme, inputMode, deviceConnected, isSelectionInvalid, onResize, onSync },\n ref\n ) => {\n const [instance, setInstance] = useState<CompatibleTerminalLike | null>(null);\n const sendInput = useTmuxStore((state) => state.sendInput);\n\n const terminalTheme = useMemo(() => {\n switch (theme) {\n case 'light':\n return XTERM_THEME_LIGHT;\n default:\n return XTERM_THEME_DARK;\n }\n }, [theme]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const mountRef = useRef<HTMLDivElement>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const currentDeviceIdRef = useRef(deviceId);\n const currentPaneIdRef = useRef(paneId);\n const attachedDeviceIdRef = useRef(deviceId);\n const attachedPaneIdRef = useRef(paneId);\n const canWriteRef = useRef(deviceConnected && !isSelectionInvalid);\n const currentInputModeRef = useRef(inputMode);\n const currentTerminalThemeRef = useRef(terminalTheme);\n const liveOutputEndedWithCR = useRef(false);\n const keepShortHistoryVisibleRef = useRef(false);\n const lastTerminalInstanceRef = useRef<CompatibleTerminalLike | null>(null);\n const skipNextDetachPersistRef = useRef(false);\n\n const persistTerminalModes = useCallback(\n (terminal: CompatibleTerminalLike | null, targetDeviceId: string, targetPaneId: string) => {\n if (!terminal?.exportModeSnapshot || !targetDeviceId || !targetPaneId) {\n return;\n }\n writeTerminalModeCache(targetDeviceId, targetPaneId, terminal.exportModeSnapshot());\n },\n []\n );\n\n const getTerminalForTouch = useCallback(() => instance, [instance]);\n useMobileTouch(containerRef, getTerminalForTouch);\n\n useEffect(() => {\n currentDeviceIdRef.current = deviceId;\n currentPaneIdRef.current = paneId;\n keepShortHistoryVisibleRef.current = false;\n }, [deviceId, paneId]);\n\n useEffect(() => {\n canWriteRef.current = deviceConnected && !isSelectionInvalid;\n }, [deviceConnected, isSelectionInvalid]);\n\n useEffect(() => {\n currentInputModeRef.current = inputMode;\n }, [inputMode]);\n\n useEffect(() => {\n currentTerminalThemeRef.current = terminalTheme;\n }, [terminalTheme]);\n\n const sendTerminalInput = useCallback(\n (data: string) => {\n if (!data || inputMode !== 'direct') {\n return;\n }\n if (!canWriteRef.current) {\n return;\n }\n\n const activeDeviceId = currentDeviceIdRef.current;\n const activePaneId = currentPaneIdRef.current;\n if (!activeDeviceId || !activePaneId) {\n return;\n }\n\n sendInput(activeDeviceId, activePaneId, data, false);\n },\n [inputMode, sendInput]\n );\n\n const { pendingLocalSize, scheduleResize, runPostSelectResize, setFitAddon, setTerminal } =\n useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect: () => {\n const el = containerRef.current;\n if (!el) return null;\n const rect = el.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n },\n });\n\n useEffect(() => {\n let cancelled = false;\n let createdTerminal: Awaited<ReturnType<typeof createTerminalController>> | null = null;\n\n void createTerminalController({\n ...TERMINAL_CONFIG,\n theme: currentTerminalThemeRef.current,\n disableStdin: currentInputModeRef.current === 'editor',\n }).then((terminal) => {\n if (cancelled) {\n terminal.dispose();\n return;\n }\n\n createdTerminal = terminal;\n if (mountRef.current) {\n terminal.open(mountRef.current);\n }\n setE2eTerminalProbe(terminal);\n setInstance(terminal);\n });\n\n return () => {\n cancelled = true;\n setInstance(null);\n clearE2eTerminalProbe(createdTerminal);\n createdTerminal?.dispose();\n };\n }, []);\n\n useEffect(() => {\n if (!instance || !('setTheme' in instance)) {\n return;\n }\n\n (instance as any).setTheme(terminalTheme);\n }, [instance, terminalTheme]);\n\n useEffect(() => {\n if (!instance || !('setDisableStdin' in instance)) {\n return;\n }\n\n (instance as any).setDisableStdin(inputMode === 'editor');\n }, [instance, inputMode]);\n\n const callbacks: SelectCallbacks = useMemo(() => {\n if (!instance) {\n return {};\n }\n\n return {\n onResetTerminal: (targetDeviceId) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n skipNextDetachPersistRef.current = true;\n instance.reset();\n liveOutputEndedWithCR.current = false;\n runPostSelectResize();\n },\n onApplyHistory: (targetDeviceId, data, alternateScreen) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n const recoveredModes = reconcileRecoveredModes(\n readTerminalModeCache(currentDeviceIdRef.current, currentPaneIdRef.current),\n alternateScreen\n );\n if (recoveredModes) {\n instance.restoreModeSnapshot?.(recoveredModes);\n }\n const payload = alternateScreen\n ? wrapAlternateScreenHistory(data)\n : normalizeHistoryForTerminal(data);\n keepShortHistoryVisibleRef.current = true;\n instance.write(payload);\n skipNextDetachPersistRef.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onFlushBuffer: (targetDeviceId, buffer) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n for (const chunk of buffer) {\n const normalized = normalizeLiveOutputForTerminal(chunk, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n }\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onOutput: (targetDeviceId, targetPaneId, data) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n if (currentPaneIdRef.current !== targetPaneId) return;\n const normalized = normalizeLiveOutputForTerminal(data, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n };\n }, [instance, persistTerminalModes, runPostSelectResize]);\n\n useEffect(() => {\n if (!instance) {\n lastTerminalInstanceRef.current = null;\n } else if (lastTerminalInstanceRef.current !== instance) {\n liveOutputEndedWithCR.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n lastTerminalInstanceRef.current = instance;\n }\n }, [instance]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) {\n return;\n }\n\n return () => {\n if (skipNextDetachPersistRef.current) {\n skipNextDetachPersistRef.current = false;\n return;\n }\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n };\n }, [deviceId, instance, paneId, persistTerminalModes]);\n\n useEffect(() => {\n getSelectStateMachine(callbacks);\n }, [callbacks]);\n\n useEffect(() => {\n return () => {\n getSelectStateMachine({});\n };\n }, []);\n\n useEffect(() => {\n if (!instance) {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n return;\n }\n\n const fitAddon = new FitAddon();\n instance.loadAddon(fitAddon);\n fitAddonRef.current = fitAddon;\n setFitAddon(fitAddon);\n setTerminal(instance);\n\n runPostSelectResize();\n\n return () => {\n try {\n fitAddon.dispose();\n } finally {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n }\n };\n }, [instance, runPostSelectResize, setFitAddon, setTerminal]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n let rafId: number | null = null;\n const ro = new ResizeObserver(() => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n });\n ro.observe(el);\n return () => {\n ro.disconnect();\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) return;\n\n const disposable = instance.onData((data) => {\n if (!deviceConnected || isSelectionInvalid) return;\n sendTerminalInput(data);\n });\n\n instance.attachCustomKeyEventHandler((domEvent) => {\n if (!deviceConnected || isSelectionInvalid) return true;\n if (domEvent.type !== 'keydown') return true;\n if (inputMode !== 'direct') return true;\n\n if (domEvent.shiftKey && domEvent.key === 'Enter') {\n domEvent.preventDefault();\n sendTerminalInput('\\x1b[13;2u');\n return false;\n }\n\n return true;\n });\n\n return () => {\n disposable.dispose();\n instance.attachCustomKeyEventHandler(() => true);\n };\n }, [\n instance,\n deviceConnected,\n isSelectionInvalid,\n inputMode,\n sendTerminalInput,\n deviceId,\n paneId,\n ]);\n\n useImperativeHandle(\n ref,\n () => ({\n write: (data) => instance?.write(data),\n reset: () => {\n instance?.reset();\n liveOutputEndedWithCR.current = false;\n },\n scrollToBottom: () => instance?.scrollToBottom(),\n resize: (cols, rows) => instance?.resize(cols, rows),\n getTerminal: () => instance ?? null,\n getSize: () => {\n if (!instance) return null;\n return { cols: Math.max(2, instance.cols), rows: Math.max(2, instance.rows) };\n },\n runPostSelectResize: () => runPostSelectResize(),\n scheduleResize: (kind, options) => scheduleResize(kind, options),\n calculateSizeFromContainer: () => {\n const container = containerRef.current;\n const term = instance;\n const fitAddon = fitAddonRef.current;\n if (!container || !term) return null;\n\n const rect = container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n const core = term._core;\n let cols: number;\n if (fitAddon) {\n try {\n const dims = fitAddon.proposeDimensions();\n if (dims) {\n cols = Math.max(2, dims.cols);\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } catch {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(rect.height / cellHeight));\n\n return { cols, rows };\n },\n getPendingLocalSize: () => pendingLocalSize.current,\n }),\n [instance, pendingLocalSize, runPostSelectResize, scheduleResize]\n );\n\n return (\n <div\n ref={containerRef}\n className=\"h-full w-full relative\"\n style={{ backgroundColor: terminalTheme.background }}\n data-terminal-engine={TERMINAL_ENGINE}\n >\n <div ref={mountRef} className=\"absolute inset-0\" />\n </div>\n );\n }\n);\n\nTerminal.displayName = 'Terminal';\n","export interface PaneSelection {\n windowId: string;\n paneId: string;\n}\n\nexport interface TimedPaneSelection extends PaneSelection {\n at: number;\n}\n\nexport const RECENT_SELECT_REQUEST_TTL_MS = 1200;\nexport const PENDING_USER_SELECTION_TTL_MS = 2000;\n\nfunction matchesPaneSelection(\n left: PaneSelection | null | undefined,\n right: PaneSelection | null | undefined\n): boolean {\n if (!left || !right) {\n return false;\n }\n return left.windowId === right.windowId && left.paneId === right.paneId;\n}\n\nfunction getLatestRecentSelectRequest(\n recentSelectRequests: TimedPaneSelection[],\n now: number\n): TimedPaneSelection | null {\n const recentRequests = recentSelectRequests.filter(\n (request) => now - request.at < RECENT_SELECT_REQUEST_TTL_MS\n );\n if (recentRequests.length === 0) {\n return null;\n }\n return recentRequests.reduce((latest, request) => (request.at > latest.at ? request : latest));\n}\n\nexport function resolvePendingUserSelection(\n pendingUserSelection: TimedPaneSelection | null | undefined,\n now = Date.now()\n): TimedPaneSelection | null {\n if (!pendingUserSelection) {\n return null;\n }\n if (now - pendingUserSelection.at > PENDING_USER_SELECTION_TTL_MS) {\n return null;\n }\n return pendingUserSelection;\n}\n\nexport function shouldIgnoreActivePaneEvent(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n activePaneFromEvent: PaneSelection;\n currentRoute: PaneSelection | null | undefined;\n recentSelectRequests: TimedPaneSelection[];\n lastHandledActive: PaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n if (matchesPaneSelection(params.currentRoute, params.activePaneFromEvent)) {\n return true;\n }\n\n if (matchesPaneSelection(params.lastHandledActive, params.activePaneFromEvent)) {\n return true;\n }\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (\n pendingUserSelection &&\n !matchesPaneSelection(pendingUserSelection, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldSkipSnapshotFollow(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n snapshotActive: PaneSelection;\n recentSelectRequests: TimedPaneSelection[];\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (pendingUserSelection && !matchesPaneSelection(pendingUserSelection, params.snapshotActive)) {\n return true;\n }\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.snapshotActive)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldTrackPendingRouteSelection(params: {\n now?: number;\n routeTarget: PaneSelection;\n snapshotActive: PaneSelection | null | undefined;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n\n if (pendingUserSelection && matchesPaneSelection(pendingUserSelection, params.routeTarget)) {\n return false;\n }\n\n if (params.snapshotActive && matchesPaneSelection(params.snapshotActive, params.routeTarget)) {\n return false;\n }\n\n return true;\n}\n","import { useSiteStore } from '../stores/site';\n\nexport function getSiteNameFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteName || 'tmex';\n}\n\nexport function getSiteUrlFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteUrl || window.location.origin;\n}\n","import { getSiteNameFallback } from './site';\n\ninterface TerminalLabelInput {\n paneIdx?: number | null;\n windowIdx?: number | null;\n paneTitle?: string | null;\n windowName?: string | null;\n deviceName?: string | null;\n}\n\nfunction toSafeText(value: string | null | undefined): string {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : '?';\n}\n\nexport function buildTerminalLabel({\n paneIdx,\n windowIdx,\n paneTitle,\n windowName,\n deviceName,\n}: TerminalLabelInput): string {\n const safeWindowIdx = windowIdx ?? '?';\n const safePaneIdx = paneIdx ?? '?';\n const safePaneTitle = toSafeText(paneTitle ?? windowName);\n const safeDeviceName = toSafeText(deviceName);\n return `${safeWindowIdx}/${safePaneIdx}: ${safePaneTitle}@${safeDeviceName}`;\n}\n\nexport function buildBrowserTitle(label?: string | null): string {\n const siteName = getSiteNameFallback();\n if (!label?.trim()) {\n return siteName;\n }\n return `[${siteName}]${label}`;\n}\n","import { Terminal as TerminalComponent, type TerminalRef } from '@/components/terminal';\nimport { XTERM_THEME_DARK, XTERM_THEME_LIGHT } from '@/components/terminal/theme';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/alert-dialog';\nimport { Button } from '@/components/ui/button';\nimport { Switch } from '@/components/ui/switch';\nimport { useQuery } from '@tanstack/react-query';\nimport type { Device } from '@tmex/shared';\nimport {\n ArrowDownToLine,\n Keyboard,\n Loader2,\n RefreshCw,\n Send,\n Smartphone,\n Trash2,\n} from 'lucide-react';\nimport { type FocusEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useSiteStore } from '../stores/site';\nimport { useTmuxStore } from '../stores/tmux';\nimport { useUIStore } from '../stores/ui';\nimport { shouldApplyRemotePaneSize } from '../utils/resizeSyncGuards';\nimport {\n type TimedPaneSelection,\n resolvePendingUserSelection,\n shouldIgnoreActivePaneEvent,\n shouldSkipSnapshotFollow,\n shouldTrackPendingRouteSelection,\n} from '../utils/selectionGuards';\nimport { buildBrowserTitle, buildTerminalLabel } from '../utils/terminalMeta';\nimport { decodePaneIdFromUrlParam, encodePaneIdForUrl } from '../utils/tmuxUrl';\n\ninterface EditorShortcut {\n key: string;\n label: string;\n payload: string;\n}\n\nfunction isIOSMobileBrowser(): boolean {\n if (typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent;\n const isIOSDevice = /iPad|iPhone|iPod/.test(userAgent);\n const isTouchMac = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return isIOSDevice || isTouchMac;\n}\n\nconst EDITOR_SHORTCUTS: EditorShortcut[] = [\n { key: 'enter', label: 'ENTER', payload: '\\r' },\n { key: 'ctrl-c', label: 'CTRL-C', payload: '\\u0003' },\n { key: 'ctrl-d', label: 'CTRL-D', payload: '\\u0004' },\n { key: 'up', label: '↑', payload: '\\u001b[A' },\n { key: 'down', label: '↓', payload: '\\u001b[B' },\n { key: 'left', label: '←', payload: '\\u001b[D' },\n { key: 'right', label: '→', payload: '\\u001b[C' },\n { key: 'shift-enter', label: 'SHIFT+ENTER', payload: '\\x1b[13;2u' },\n { key: 'tab', label: 'TAB', payload: '\\u0009' },\n { key: 'backspace', label: 'BACKSPACE', payload: '\\u0008' },\n { key: 'esc', label: 'ESC', payload: '\\u001b' },\n { key: 'delete', label: 'DELETE', payload: '\\u007f' },\n { key: ':', label: ':', payload: ':' },\n { key: '/', label: '/', payload: '/' },\n { key: \"'\", label: \"'\", payload: \"'\" },\n { key: '\"', label: '\"', payload: '\"' },\n { key: '`', label: '`', payload: '`' },\n];\n\n// ShortcutsBar 组件 - 使用 memo 避免不必要的重绘\ninterface ShortcutsBarProps {\n onSend: (payload: string) => void;\n onFocusEditor?: () => void;\n disabled: boolean;\n isMobile: boolean;\n inputMode: 'direct' | 'editor';\n}\n\nconst ShortcutsBar = memo(function ShortcutsBar({\n onSend,\n onFocusEditor,\n disabled,\n isMobile,\n inputMode,\n}: ShortcutsBarProps) {\n return (\n <div\n className=\"terminal-shortcuts-strip my-2 bg-muted rounded-xl\"\n data-testid=\"terminal-shortcuts-strip\"\n >\n <div\n className=\"shortcut-row flex items-center gap-1.5 p-2 overflow-x-auto scrollbar-thin\"\n data-testid=\"editor-shortcuts-row\"\n >\n {EDITOR_SHORTCUTS.map((shortcut) => (\n <Button\n key={shortcut.key}\n variant=\"secondary\"\n size=\"sm\"\n className=\"h-7 min-w-9 px-2.5 rounded-full text-[11px] font-medium tracking-wide shrink-0 [@media(any-pointer:coarse)]:h-9 [@media(any-pointer:coarse)]:min-w-10 [@media(any-pointer:coarse)]:px-3\"\n title={shortcut.label}\n aria-label={shortcut.label}\n data-testid={`editor-shortcut-${shortcut.key}`}\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n onSend(shortcut.payload);\n if (isMobile && inputMode === 'editor') {\n onFocusEditor?.();\n }\n }}\n disabled={disabled}\n >\n {shortcut.label}\n </Button>\n ))}\n </div>\n </div>\n );\n});\n\nexport default function DevicePage() {\n const { t } = useTranslation();\n const { deviceId, windowId, paneId } = useParams();\n const navigate = useNavigate();\n const terminalContainerRef = useRef<HTMLDivElement>(null);\n const editorContainerRef = useRef<HTMLDivElement | null>(null);\n const editorTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const terminalRef = useRef<TerminalRef>(null);\n const autoSelected = useRef(false);\n const iosAddressBarCollapseTried = useRef(false);\n // Track user-initiated navigation to prevent auto-redirect overwriting it\n const userInitiatedSelectionRef = useRef<TimedPaneSelection | null>(null);\n\n const selectPane = useTmuxStore((state) => state.selectPane);\n\n const snapshot = useTmuxStore((state) => (deviceId ? state.snapshots[deviceId] : undefined));\n const deviceError = useTmuxStore((state) =>\n deviceId ? state.deviceErrors?.[deviceId] : undefined\n );\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const resolvedPaneId = useMemo(() => decodePaneIdFromUrlParam(paneId), [paneId]);\n const draftKey = useMemo(\n () => (deviceId && resolvedPaneId ? `${deviceId}:${resolvedPaneId}` : null),\n [deviceId, resolvedPaneId]\n );\n\n const [isMobile, setIsMobile] = useState(false);\n const [editorText, setEditorText] = useState('');\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const isComposingRef = useRef(false);\n // Loading state - false when connected and has pane\n const isLoading = !deviceConnected || !resolvedPaneId;\n const [keyboardInsetBottom, setKeyboardInsetBottom] = useState(0);\n const [editorDockHeight, setEditorDockHeight] = useState(0);\n const [isSending, setIsSending] = useState(false);\n const inputMode = useUIStore((state) => state.inputMode);\n const uiTheme = useUIStore((state) => state.theme);\n const editorSendWithEnter = useUIStore((state) => state.editorSendWithEnter);\n const setEditorSendWithEnter = useUIStore((state) => state.setEditorSendWithEnter);\n const addEditorHistory = useUIStore((state) => state.addEditorHistory);\n const setEditorDraft = useUIStore((state) => state.setEditorDraft);\n const removeEditorDraft = useUIStore((state) => state.removeEditorDraft);\n const paneEditorDraft = useUIStore((state) =>\n draftKey ? (state.editorDrafts[draftKey] ?? '') : ''\n );\n const isIOSBrowser = useMemo(() => isIOSMobileBrowser(), []);\n const shouldDockEditor = isMobile && inputMode === 'editor' && isIOSBrowser && isEditorFocused;\n\n const windows = snapshot?.session?.windows;\n const terminalTheme = uiTheme === 'light' ? XTERM_THEME_LIGHT : XTERM_THEME_DARK;\n\n const { data: devicesData } = useQuery({\n queryKey: ['devices'],\n queryFn: async () => {\n const res = await fetch('/api/devices');\n if (!res.ok) {\n throw new Error('Failed to fetch devices');\n }\n return res.json() as Promise<{ devices: Device[] }>;\n },\n throwOnError: false,\n });\n\n const currentDevice = useMemo(() => {\n if (!deviceId) {\n return undefined;\n }\n return devicesData?.devices.find((device) => device.id === deviceId);\n }, [deviceId, devicesData?.devices]);\n\n const selectedWindow = useMemo(() => {\n if (!windowId || !windows) return undefined;\n return windows.find((win) => win.id === windowId);\n }, [windowId, windows]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((pane) => pane.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const hasWindowSnapshot = Boolean(windows);\n const isWindowMissing = hasWindowSnapshot && Boolean(windowId) && !selectedWindow;\n const isPaneMissing =\n hasWindowSnapshot &&\n Boolean(windowId) &&\n Boolean(resolvedPaneId) &&\n Boolean(selectedWindow) &&\n !selectedPane;\n\n const invalidSelectionMessage = isWindowMissing\n ? t('wsError.checkGateway')\n : isPaneMissing\n ? t('wsError.checkGateway')\n : null;\n\n const isSelectionInvalid = Boolean(invalidSelectionMessage);\n const canInteractWithPane = Boolean(deviceConnected && resolvedPaneId && !isSelectionInvalid);\n\n const terminalTopbarLabel = useMemo(() => {\n if (!selectedWindow || !selectedPane) {\n return null;\n }\n const deviceName = currentDevice?.name ?? deviceId;\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName,\n });\n }, [currentDevice?.name, deviceId, selectedPane, selectedWindow]);\n\n const snapshotActiveSelection = useMemo(() => {\n if (!windows || windows.length === 0) {\n return null;\n }\n const activeWindow = windows.find((win) => win.active);\n const activePane = activeWindow?.panes.find((pane) => pane.active);\n if (!activeWindow || !activePane) {\n return null;\n }\n return { windowId: activeWindow.id, paneId: activePane.id };\n }, [windows]);\n\n // Handle resize from terminal - use store directly to avoid unstable callback deps\n const handleResize = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().resizePane(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n // Handle sync from terminal\n const handleSync = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().syncPaneSize(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n const getSelectSize = useCallback(\n (targetWindowId?: string, targetPaneId?: string) => {\n const terminal = terminalRef.current;\n const terminalSize =\n terminal?.calculateSizeFromContainer() ?? terminal?.getSize() ?? undefined;\n if (terminalSize) {\n return terminalSize;\n }\n\n if (!targetWindowId || !targetPaneId || !windows) {\n return undefined;\n }\n\n const targetWindow = windows.find((window) => window.id === targetWindowId);\n const targetPane = targetWindow?.panes.find((pane) => pane.id === targetPaneId);\n if (!targetPane || targetPane.width <= 1 || targetPane.height <= 1) {\n return undefined;\n }\n\n return {\n cols: targetPane.width,\n rows: targetPane.height,\n };\n },\n [windows]\n );\n\n // Mobile detection\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768 || 'ontouchstart' in window);\n };\n\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // iOS address bar collapse\n useEffect(() => {\n if (!isMobile || !isIOSBrowser || iosAddressBarCollapseTried.current) {\n return;\n }\n\n iosAddressBarCollapseTried.current = true;\n const collapseAddressBar = () => {\n window.scrollTo(0, 1);\n };\n\n const rafId = window.requestAnimationFrame(collapseAddressBar);\n const timerA = window.setTimeout(collapseAddressBar, 120);\n const timerB = window.setTimeout(collapseAddressBar, 420);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerA);\n window.clearTimeout(timerB);\n };\n }, [isIOSBrowser, isMobile]);\n\n // Reset editor focus when switching modes\n useEffect(() => {\n if (inputMode !== 'editor') {\n setIsEditorFocused(false);\n }\n }, [inputMode]);\n\n // iOS keyboard inset handling\n useEffect(() => {\n if (!(isMobile && isIOSBrowser && inputMode === 'editor' && isEditorFocused)) {\n setKeyboardInsetBottom(0);\n return;\n }\n\n let frameId: number | null = null;\n const updateKeyboardInset = () => {\n const viewport = window.visualViewport;\n const viewportHeight = viewport?.height ?? window.innerHeight;\n const offsetTop = viewport?.offsetTop ?? 0;\n const nextInset = Math.max(0, Math.round(window.innerHeight - viewportHeight - offsetTop));\n setKeyboardInsetBottom(nextInset);\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateKeyboardInset();\n });\n };\n\n updateKeyboardInset();\n\n window.visualViewport?.addEventListener('resize', scheduleUpdate);\n window.visualViewport?.addEventListener('scroll', scheduleUpdate);\n window.addEventListener('resize', scheduleUpdate);\n\n return () => {\n window.visualViewport?.removeEventListener('resize', scheduleUpdate);\n window.visualViewport?.removeEventListener('scroll', scheduleUpdate);\n window.removeEventListener('resize', scheduleUpdate);\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n };\n }, [inputMode, isEditorFocused, isIOSBrowser, isMobile]);\n\n // Editor dock height handling\n useEffect(() => {\n if (!shouldDockEditor) {\n setEditorDockHeight(0);\n return;\n }\n\n const editorContainer = editorContainerRef.current;\n if (!editorContainer) {\n return;\n }\n\n const updateEditorHeight = () => {\n setEditorDockHeight(Math.ceil(editorContainer.getBoundingClientRect().height));\n };\n\n updateEditorHeight();\n const observer = new ResizeObserver(updateEditorHeight);\n observer.observe(editorContainer);\n\n return () => observer.disconnect();\n }, [shouldDockEditor]);\n\n // Ensure device is connected when viewing (GlobalDeviceProvider handles actual connection)\n // This effect resets auto-selection logic and related refs when deviceId changes\n useEffect(() => {\n if (!deviceId) return;\n autoSelected.current = false;\n lastHandledActiveRef.current = null;\n lastSnapshotActiveRef.current = null;\n userInitiatedSelectionRef.current = null;\n recentSelectRequestsRef.current = [];\n }, [deviceId]);\n\n // Reset autoSelected when device connection changes\n useEffect(() => {\n if (!deviceConnected) {\n autoSelected.current = false;\n }\n }, [deviceConnected]);\n\n // Handle window/pane changes - both external and from sidebar navigation\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId) return;\n\n // If snapshot not yet arrived, don't navigate (loading state)\n if (!windows) {\n return;\n }\n\n // If no windows left (all closed), navigate to fallback\n if (windows.length === 0) {\n navigate('/devices', { replace: true });\n return;\n }\n\n // Find the target window\n const targetWindow = windows.find((w) => w.id === windowId);\n if (!targetWindow) {\n // Window doesn't exist in snapshot yet.\n // Wait for snapshot to arrive. Don't redirect to another window,\n // as the user may have explicitly navigated to this specific window.\n return;\n }\n\n // If no paneId in URL, select the active pane in this window\n if (!resolvedPaneId) {\n const targetPane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (targetPane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(targetPane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n\n // Check if current pane exists in the window\n const currentPane = targetWindow.panes.find((p) => p.id === resolvedPaneId);\n if (!currentPane) {\n // Pane was closed, navigate to active pane in same window\n const activePane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (activePane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n }, [deviceId, deviceConnected, windows, windowId, resolvedPaneId, navigate]);\n\n // Auto-select pane on initial load only\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n // If we already have window and pane selected, skip\n if (windowId && resolvedPaneId) return;\n // If autoSelect already done, skip\n if (autoSelected.current) return;\n\n // Select the active window's active pane (initial load)\n const activeWindow = windows.find((win) => win.active) ?? windows[0];\n const activePane = activeWindow.panes.find((pane) => pane.active) ?? activeWindow.panes[0];\n if (!activePane) return;\n\n autoSelected.current = true;\n navigate(\n `/devices/${deviceId}/windows/${activeWindow.id}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }, [deviceConnected, deviceId, navigate, resolvedPaneId, windowId, windows]);\n\n // Select pane when ready\n useEffect(() => {\n if (!deviceId || !windowId || !resolvedPaneId) return;\n // Allow sending TMUX_SELECT before WS is READY: borsh client will queue messages and flush on READY.\n // Note: We don't check isSelectionInvalid here because when user navigates via URL,\n // the snapshot may not yet reflect the new window, but we should still send the select command.\n if (isLoading || !deviceConnected) return;\n\n // Short-circuit: if already selected, don't send again\n const currentSelected = useTmuxStore.getState().selectedPanes[deviceId];\n if (\n currentSelected &&\n currentSelected.windowId === windowId &&\n currentSelected.paneId === resolvedPaneId\n ) {\n return;\n }\n\n const size = getSelectSize(windowId, resolvedPaneId);\n recordSelectRequest(windowId, resolvedPaneId);\n selectPane(deviceId, windowId, resolvedPaneId, size);\n }, [deviceConnected, deviceId, getSelectSize, isLoading, resolvedPaneId, selectPane, windowId]);\n\n // Treat explicit route selection as authoritative until snapshot/runtime catches up.\n useEffect(() => {\n if (!deviceId || !deviceConnected || !windowId || !resolvedPaneId) {\n return;\n }\n\n const routeTarget = { windowId, paneId: resolvedPaneId };\n if (\n !shouldTrackPendingRouteSelection({\n routeTarget,\n snapshotActive: snapshotActiveSelection,\n pendingUserSelection: userInitiatedSelectionRef.current,\n })\n ) {\n return;\n }\n\n userInitiatedSelectionRef.current = {\n windowId: routeTarget.windowId,\n paneId: routeTarget.paneId,\n at: Date.now(),\n };\n }, [deviceConnected, deviceId, resolvedPaneId, snapshotActiveSelection, windowId]);\n\n const recentSelectRequestsRef = useRef<Array<{ windowId: string; paneId: string; at: number }>>(\n []\n );\n const recordSelectRequest = useCallback((windowId: string, paneId: string) => {\n const now = Date.now();\n const next = [\n ...recentSelectRequestsRef.current.filter((r) => now - r.at < 2000),\n { windowId, paneId, at: now },\n ];\n recentSelectRequestsRef.current = next.slice(-8);\n }, []);\n\n // Subscribe to activePaneFromEvent for this device\n const activePaneFromEvent = useTmuxStore((state) =>\n deviceId ? state.activePaneFromEvent[deviceId] : undefined\n );\n\n // Follow active pane from event/tmux pane-active\n const lastHandledActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId || !resolvedPaneId) return;\n if (!activePaneFromEvent) return;\n\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldIgnoreActivePaneEvent({\n now,\n pendingUserSelection,\n activePaneFromEvent,\n currentRoute: { windowId, paneId: resolvedPaneId },\n recentSelectRequests: recentSelectRequestsRef.current,\n lastHandledActive: lastHandledActiveRef.current,\n })\n ) {\n return;\n }\n\n lastHandledActiveRef.current = { ...activePaneFromEvent };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === activePaneFromEvent.windowId &&\n pendingUserSelection.paneId === activePaneFromEvent.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // Send selectPane to gateway first\n const size = getSelectSize(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n recordSelectRequest(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n selectPane(deviceId, activePaneFromEvent.windowId, activePaneFromEvent.paneId, size);\n\n // Navigate to new URL\n navigate(\n `/devices/${deviceId}/windows/${activePaneFromEvent.windowId}/panes/${encodePaneIdForUrl(activePaneFromEvent.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windowId,\n resolvedPaneId,\n activePaneFromEvent,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Fallback: follow active from snapshot (for environments without pane-active event)\n const lastSnapshotActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n\n // Avoid snapshot-driven \"bounce back\" shortly after we send TMUX_SELECT.\n const recentRequests = recentSelectRequestsRef.current;\n const activeWindow = windows.find((w) => w.active);\n if (!activeWindow) return;\n\n const activePane = activeWindow.panes.find((p) => p.active);\n if (!activePane) return;\n\n const currentActive = { windowId: activeWindow.id, paneId: activePane.id };\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldSkipSnapshotFollow({\n now,\n pendingUserSelection,\n snapshotActive: currentActive,\n recentSelectRequests: recentRequests,\n })\n ) {\n return;\n }\n\n // Only follow when active actually changes\n if (\n lastSnapshotActiveRef.current &&\n lastSnapshotActiveRef.current.windowId === currentActive.windowId &&\n lastSnapshotActiveRef.current.paneId === currentActive.paneId\n ) {\n return;\n }\n\n // Update ref\n lastSnapshotActiveRef.current = { ...currentActive };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === currentActive.windowId &&\n pendingUserSelection.paneId === currentActive.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // If current URL matches, no need to navigate\n if (windowId === currentActive.windowId && resolvedPaneId === currentActive.paneId) {\n return;\n }\n\n // Send selectPane and navigate\n const size = getSelectSize(currentActive.windowId, currentActive.paneId);\n recordSelectRequest(currentActive.windowId, currentActive.paneId);\n selectPane(deviceId, currentActive.windowId, currentActive.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${currentActive.windowId}/panes/${encodePaneIdForUrl(currentActive.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windows,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Force-follow snapshot active after a user-initiated createWindow.\n // Wait for a snapshot whose active differs from the URL (proving the new\n // window is reflected), then navigate there.\n const pendingCreateWindowAt = useTmuxStore((state) =>\n deviceId ? state.pendingCreateWindowAt[deviceId] : undefined\n );\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!pendingCreateWindowAt) return;\n\n const ttlMs = 5000;\n const elapsed = Date.now() - pendingCreateWindowAt;\n if (elapsed > ttlMs) {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n return;\n }\n\n if (!snapshotActiveSelection) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n const target = snapshotActiveSelection;\n if (windowId === target.windowId && resolvedPaneId === target.paneId) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n userInitiatedSelectionRef.current = {\n windowId: target.windowId,\n paneId: target.paneId,\n at: Date.now(),\n };\n const size = getSelectSize(target.windowId, target.paneId);\n recordSelectRequest(target.windowId, target.paneId);\n selectPane(deviceId, target.windowId, target.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${target.windowId}/panes/${encodePaneIdForUrl(target.paneId)}`,\n { replace: true }\n );\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, [\n deviceId,\n deviceConnected,\n pendingCreateWindowAt,\n snapshotActiveSelection,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Sync pane size from remote\n useEffect(() => {\n if (!canInteractWithPane || !selectedPane || isLoading) return;\n\n const terminal = terminalRef.current;\n const term = terminal?.getTerminal();\n if (!term) return;\n\n const remoteCols = Math.max(2, Math.floor(selectedPane.width || 0));\n const remoteRows = Math.max(2, Math.floor(selectedPane.height || 0));\n if (!remoteCols || !remoteRows) return;\n\n const now = Date.now();\n const remoteSize = { cols: remoteCols, rows: remoteRows };\n const pendingLocalSize = terminal?.getPendingLocalSize() ?? null;\n if (\n !shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n })\n ) {\n return;\n }\n\n if (term.cols === remoteCols && term.rows === remoteRows) {\n return;\n }\n\n term.resize(remoteCols, remoteRows);\n }, [canInteractWithPane, isLoading, selectedPane]);\n\n // Scroll to bottom on input mode change\n useEffect(() => {\n void inputMode;\n const rafId = window.requestAnimationFrame(() => {\n terminalRef.current?.scrollToBottom();\n });\n const timerId = window.setTimeout(() => {\n terminalRef.current?.scrollToBottom();\n }, 120);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerId);\n };\n }, [inputMode]);\n\n // Device error toast\n useEffect(() => {\n if (!deviceError?.message) {\n return;\n }\n\n toast.error(deviceError.message);\n }, [deviceError?.message]);\n\n // Page title\n useEffect(() => {\n document.title = buildBrowserTitle(terminalTopbarLabel);\n return () => {\n document.title = siteName;\n };\n }, [siteName, terminalTopbarLabel]);\n\n // Jump to latest event\n useEffect(() => {\n const handler = () => {\n terminalRef.current?.scrollToBottom();\n };\n\n window.addEventListener('tmex:jump-to-latest', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:jump-to-latest', handler as EventListener);\n };\n }, []);\n\n // Listen for user-initiated selection from sidebar\n useEffect(() => {\n const handler = (\n event: CustomEvent<{ deviceId: string; windowId: string; paneId: string }>\n ) => {\n const { deviceId: eventDeviceId, windowId, paneId } = event.detail;\n // Only track if it's for the current device\n // Note: when switching devices, refs are reset in the deviceId effect above\n if (eventDeviceId === deviceId) {\n userInitiatedSelectionRef.current = { windowId, paneId, at: Date.now() };\n }\n };\n\n window.addEventListener('tmex:user-initiated-selection', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:user-initiated-selection', handler as EventListener);\n };\n }, [deviceId]);\n\n // Sync editor draft\n useEffect(() => {\n setEditorText(paneEditorDraft);\n }, [paneEditorDraft]);\n\n const handleSendShortcut = useCallback(\n (payload: string) => {\n if (!deviceId || !resolvedPaneId || !canInteractWithPane) {\n return;\n }\n\n // Send directly to the terminal's input handler\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n },\n [canInteractWithPane, deviceId, resolvedPaneId]\n );\n\n const handleEditorSend = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const payload = editorSendWithEnter ? `${editorText}\\r` : editorText;\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorSendWithEnter,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorSendLineByLine = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const lines = editorText.split(/\\r?\\n/);\n const store = useTmuxStore.getState();\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n store.sendInput(deviceId, resolvedPaneId, `${line}\\r`, false);\n }\n\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorFocus = useCallback(\n (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsEditorFocused(true);\n\n if (!(isMobile && isIOSBrowser)) {\n return;\n }\n\n const target = event.currentTarget;\n window.requestAnimationFrame(() => {\n target.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n });\n window.setTimeout(() => {\n window.scrollTo(0, 1);\n }, 60);\n },\n [isIOSBrowser, isMobile]\n );\n\n const handleEditorBlur = useCallback(() => {\n setIsEditorFocused(false);\n }, []);\n\n // 聚焦编辑器回调 - 必须在所有早期 return 之前定义\n const handleFocusEditor = useCallback(() => {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }, []);\n\n if (!deviceId) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <div className=\"rounded-lg border border-dashed border-border px-4 py-3 text-sm text-muted-foreground\">\n {t('device.noDevices')}\n </div>\n </div>\n );\n }\n\n const showConnecting = !deviceConnected && !deviceError;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\" data-testid=\"device-page\">\n <div\n className={`flex-1 relative overflow-hidden min-h-0 min-w-0 ${\n isMobile && inputMode === 'editor' && !shouldDockEditor ? 'pb-1' : ''\n }`}\n style={{\n paddingBottom: shouldDockEditor ? `${editorDockHeight + 60}px` : undefined,\n }}\n >\n <div\n className=\"h-full px-3 py-1 min-h-0 min-w-0 w-full relative flex rounded-xl\"\n style={{ backgroundColor: terminalTheme.background }}\n >\n {deviceConnected && resolvedPaneId ? (\n <div ref={terminalContainerRef} className=\"flex-1 h-full min-h-0 w-full\">\n <TerminalComponent\n key={`${deviceId}:${resolvedPaneId}`}\n ref={terminalRef}\n deviceId={deviceId}\n paneId={resolvedPaneId}\n theme={uiTheme}\n inputMode={inputMode}\n deviceConnected={deviceConnected}\n isSelectionInvalid={isSelectionInvalid}\n onResize={handleResize}\n onSync={handleSync}\n />\n </div>\n ) : (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center p-8 text-center\">\n <div className=\"max-w-sm space-y-4\">\n {!deviceConnected ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">🔌</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('device.disconnected')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('device.connectToStart')}</p>\n </>\n ) : !windowId ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">📋</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('window.noWindowSelected')}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('window.selectWindowToStart')}\n </p>\n </>\n ) : (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-lg font-medium\">{t('terminal.connecting')}</h3>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n\n {showConnecting && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-background/85 backdrop-blur-sm\"\n data-testid=\"terminal-status-overlay\"\n >\n <div className=\"flex flex-col items-center gap-2 rounded-lg border border-border bg-card/90 px-4 py-3 shadow-sm\">\n <div className=\"h-7 w-7 rounded-full border-2 border-primary border-t-transparent animate-spin\" />\n <span className=\"text-xs text-muted-foreground\" data-testid=\"terminal-status-text\">\n {t('terminal.connecting')}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* 快捷键栏:PC端和移动端 direct 模式都在终端下方 */}\n {inputMode === 'direct' && (\n <div className=\"\">\n <ShortcutsBar\n onSend={handleSendShortcut}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n </div>\n )}\n\n {inputMode === 'editor' && (\n <div\n ref={editorContainerRef}\n className={`editor-mode-input bg-card/85 backdrop-blur-sm ${\n shouldDockEditor ? 'fixed left-0 right-0 z-50' : ''\n }`}\n style={shouldDockEditor ? { bottom: `${keyboardInsetBottom}px` } : undefined}\n >\n {/* 移动端 editor 模式:快捷键栏在编辑器上方 */}\n {isMobile && (\n <ShortcutsBar\n onSend={handleSendShortcut}\n onFocusEditor={handleFocusEditor}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n )}\n <textarea\n ref={editorTextareaRef}\n data-testid=\"editor-input\"\n className=\"min-h-[88px] max-h-[28vh] w-full resize-y rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground shadow-xs outline-none transition-colors focus:border-ring\"\n value={editorText}\n onChange={(e) => {\n const nextText = e.target.value;\n setEditorText(nextText);\n if (!draftKey) {\n return;\n }\n if (nextText) {\n setEditorDraft(draftKey, nextText);\n return;\n }\n removeEditorDraft(draftKey);\n }}\n placeholder={t('terminal.inputPlaceholder')}\n onFocus={handleEditorFocus}\n onBlur={handleEditorBlur}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n }}\n />\n <div className=\"actions mt-2\">\n <div\n className=\"send-row flex flex-wrap items-center justify-end gap-2\"\n data-testid=\"editor-send-row\"\n >\n <div\n className=\"send-with-enter-toggle mr-auto flex items-center gap-2 text-xs text-muted-foreground\"\n data-testid=\"editor-send-with-enter-toggle\"\n >\n <Switch\n size=\"sm\"\n checked={editorSendWithEnter}\n onCheckedChange={(checked) => setEditorSendWithEnter(Boolean(checked))}\n />\n <span>{t('terminal.editorSendWithEnter')}</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n data-testid=\"editor-clear\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n setEditorText('');\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n title={t('terminal.clear')}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('terminal.clear')}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n data-testid=\"editor-send-line-by-line\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSendLineByLine();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('terminal.editorSendLineByLine')}\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n data-testid=\"editor-send\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSend();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('common.send')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// Page title component - shows terminal label\nexport function PageTitle() {\n const { deviceId, windowId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const snapshots = useTmuxStore((state) => state.snapshots);\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const snapshot = deviceId ? snapshots[deviceId] : undefined;\n const selectedWindow = useMemo(() => {\n if (!windowId || !snapshot?.session?.windows) return undefined;\n return snapshot.session.windows.find((w) => w.id === windowId);\n }, [windowId, snapshot]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((p) => p.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const title = useMemo(() => {\n if (selectedWindow && selectedPane) {\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName: siteName,\n });\n }\n return deviceId ?? '';\n }, [selectedWindow, selectedPane, siteName, deviceId]);\n\n return <>{title}</>;\n}\n\n// Page actions component - shows input mode toggle, jump to latest and refresh page\nexport function PageActions() {\n const { t } = useTranslation();\n const { deviceId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const inputMode = useUIStore((state) => state.inputMode);\n const setInputMode = useUIStore((state) => state.setInputMode);\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n\n const [showRefreshConfirm, setShowRefreshConfirm] = useState(false);\n\n const canInteract = Boolean(resolvedPaneId && deviceConnected);\n\n const handleToggleInputMode = () => {\n const newMode = inputMode === 'direct' ? 'editor' : 'direct';\n setInputMode(newMode);\n };\n\n const handleJumpToLatest = () => {\n window.dispatchEvent(new CustomEvent('tmex:jump-to-latest'));\n };\n\n const handleRefreshClick = () => {\n setShowRefreshConfirm(true);\n };\n\n const handleConfirmRefresh = () => {\n window.location.reload();\n };\n\n return (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleRefreshClick}\n aria-label={t('nav.refreshPage')}\n title={t('nav.refreshPage')}\n >\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleToggleInputMode}\n disabled={!canInteract}\n data-testid=\"terminal-input-mode-toggle\"\n aria-label={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n title={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n >\n {inputMode === 'direct' ? (\n <Keyboard className=\"h-4 w-4\" />\n ) : (\n <Smartphone className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleJumpToLatest}\n disabled={!canInteract}\n aria-label={t('nav.jumpToLatest')}\n title={t('nav.jumpToLatest')}\n >\n <ArrowDownToLine className=\"h-4 w-4\" />\n </Button>\n\n <AlertDialog open={showRefreshConfirm} onOpenChange={setShowRefreshConfirm}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t('nav.refreshPage')}</AlertDialogTitle>\n <AlertDialogDescription>{t('nav.refreshPageConfirm')}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setShowRefreshConfirm(false)}>\n {t('common.cancel')}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleConfirmRefresh}>\n {t('common.confirm')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"],"names":["__iconNode","ArrowDownToLine","createLucideIcon","Keyboard","RefreshCw","Smartphone","colorToCss","color","ensureContext","canvas","context","CanvasRenderer","options","__publicField","layer","theme","frame","targetRows","row","cols","rows","nextCols","nextRows","width","height","dpr","cssWidth","cssHeight","rects","rect","colors","y","defaultBackground","cell","x","bg","fg","cellWidth","meta","cursor","previous","cursorColor","cssColor","style","key","cached","font","css","KEY_UNIDENTIFIED","KEY_CODE_MAP","UNSHIFTED_CODEPOINTS","index","uppercase","lowercase","getGhosttyKeyCode","code","getUnshiftedCodepoint","value","GHOSTTY_SUCCESS","GHOSTTY_INVALID_VALUE","GHOSTTY_RENDER_STATE_DATA_COLS","GHOSTTY_RENDER_STATE_DATA_ROWS","GHOSTTY_RENDER_STATE_DATA_DIRTY","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING","GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL","GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY","GHOSTTY_RENDER_STATE_ROW_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR","GHOSTTY_ROW_DATA_WRAP","GHOSTTY_ROW_DATA_WRAP_CONTINUATION","GHOSTTY_CELL_DATA_WIDE","GHOSTTY_CELL_DATA_HAS_TEXT","ensureActive","resources","resultToDirtyState","resultToCursorStyle","resultToCellWidthKind","readColorAt","bindings","ptr","readOptionalColor","read","result","readBool","readU16","readU32","readEnumI32","readU64","readStyle","field","name","readCodepoints","graphemeLen","bufPtr","codepoints","codepointsToText","buildRowText","cells","text","readMeta","paletteOffset","palette","colorOffset","cursorHasValue","cursorViewportHasValue","readRow","rowIndex","rawRow","rawCell","widthKind","createRenderState","updateRenderState","terminalHandle","readRenderSnapshotMeta","iterateRows","disposeRenderStateResources","clampColumn","lineText","col","normalizeRange","anchor","focus","expandWord","line","safeCol","isWordChar","cursorChar","start","end","expandLine","lastCol","pointForMode","point","mode","getLineText","createEmptySelectionState","hasSelection","state","clearSelection","resolvePointerSelection","_previous","expanded","updateSelectionFocus","getSelectionRange","serializeSelectionText","range","segments","projectSelectionRects","viewportStartLine","viewportRows","viewportEndLine","lineWidth","middleWidth","hasCopyModifier","event","isCopyShortcut","writeSelectionToClipboard","_a","writeSelectionToCopyEvent","ghosttyWasmUrl","GHOSTTY_OUT_OF_SPACE","GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND","GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND","GHOSTTY_TERMINAL_OPT_COLOR_CURSOR","GHOSTTY_TERMINAL_OPT_COLOR_PALETTE","GHOSTTY_TERMINAL_DATA_COLS","GHOSTTY_TERMINAL_DATA_ROWS","GHOSTTY_TERMINAL_DATA_SCROLLBAR","GHOSTTY_POINT_TAG_VIEWPORT","GHOSTTY_SCROLL_VIEWPORT_TOP","GHOSTTY_SCROLL_VIEWPORT_BOTTOM","GHOSTTY_SCROLL_VIEWPORT_DELTA","GHOSTTY_KEY_ACTION_RELEASE","GHOSTTY_KEY_ACTION_PRESS","GHOSTTY_KEY_ACTION_REPEAT","GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL","GHOSTTY_MODE_BRACKETED_PASTE","GHOSTTY_MODE_X10_MOUSE","GHOSTTY_MODE_NORMAL_MOUSE","GHOSTTY_MODE_BUTTON_MOUSE","GHOSTTY_MODE_ANY_MOUSE","GHOSTTY_MODE_UTF8_MOUSE","GHOSTTY_MODE_SGR_MOUSE","GHOSTTY_MODE_URXVT_MOUSE","GHOSTTY_MODE_SGR_PIXELS_MOUSE","bindingsPromise","assertResult","action","parseHexRgb","hex","normalized","createAnsi256Palette","cube","red","green","blue","encodeMouseModifierBits","mods","encoded","encodeX10Byte","mouseButtonCode","button","keyboardEventToGhosttyMods","_b","StructAllocation","typeName","GhosttyBindings","exports","layout","len","type","fieldName","target","offset","data","scrollback","termPtrPtr","terminal","bytes","allocation","delta","behavior","foreground","background","paletteColors","palettePtr","assignRgb","paletteBytes","colsPtr","rowsPtr","scrollbar","valuePtr","enabled","emit","formatterOptions","extraOffset","extraView","screenOffset","screenView","outFormatterPtr","selectionOffset","formatter","outRef","coordOffset","coordView","safeCols","safeRows","selection","startOffset","endOffset","viewport","terminalSize","outPtrPtr","outLenPtr","outPtr","outLen","memoryByteLength","outStatePtr","option","outColorsPtr","outIteratorPtr","iterator","outCellsPtr","outEncoderPtr","encoder","trackLastCellPtr","trackingAny","trackingButton","trackingNormal","trackingX10","baseCode","column","pixelX","pixelY","suffix","encodedCode","encodedColumn","encodedRow","eventPtrPtr","eventHandle","utf8Allocation","requiredPtr","sizeResult","required","bufferPtr","writtenPtr","written","input","bracketed","outputPtr","loadGhosttyWasmBytes","source","response","getGhosttyBindings","wasmBytes","typeJsonPtr","DEFAULT_COLS","DEFAULT_ROWS","DEFAULT_CELL_WIDTH","DEFAULT_CELL_HEIGHT","AUTO_SCROLL_INTERVAL_MS","TERMINAL_ENGINE","GHOSTTY_MODE_ALT_SCROLL","GHOSTTY_MODE_ALT_SCREEN","GHOSTTY_MODE_ALT_SCREEN_SAVE","MOUSE_TRACKING_MODES","GHOSTTY_MOUSE_BUTTON_LEFT","GHOSTTY_MOUSE_BUTTON_MIDDLE","GHOSTTY_MOUSE_BUTTON_RIGHT","GHOSTTY_MOUSE_BUTTON_FOUR","GHOSTTY_MOUSE_BUTTON_FIVE","BufferLine","content","trimRight","TerminalBuffer","relativeIndex","viewportY","baseY","length","lines","shouldEncodeOnKeyDown","normalizeVisibleLines","expectedRows","pointerLikeEventToGhosttyMods","FitAddon","GhosttyTerminalController","proposed","keyEncoderHandle","mouseEncoderHandle","renderState","error","container","root","screen","textarea","scrollbarTrack","scrollbarThumb","measured","addon","callback","prevAltScreen","nextAltScreen","amount","snapshot","gesture","routing","consumed","disabled","element","dragEventTarget","moveListener","upListener","selectionText","payload","finalData","recentCompositionCommit","keyCode","utf8","mouseReporting","altScreen","cellHeight","pageLines","scaled","buttons","clientX","clientY","position","listener","cursorX","cursorY","left","top","selectionRects","visibleLines","thumb","trackHeight","ratio","thumbHeight","thumbTop","probe","repaint","resetSelectionData","shouldClear","_c","_d","detail","relativeX","relativeY","maxCol","maxRow","visibleIndex","visibleRow","dispose","createTerminalController","XTERM_THEME_LIGHT","XTERM_THEME_DARK","XTERM_FONT_FAMILY","normalizeHistoryForTerminal","canonical","ALT_SCREEN_HISTORY_PREAMBLE","wrapAlternateScreenHistory","normalizeLiveOutputForTerminal","previousEndedWithCR","prevWasCR","extraCRCount","byte","endedWithCR","writeIndex","TOUCH_SCROLL_GAIN","SCROLLBAR_TOUCH_HOTZONE_PX","useMobileTouch","containerRef","getTerminal","isActiveRef","useRef","useEffect","lastTouchY","touchId","bypassCustomScroll","pendingPixelDelta","isScrollbarElement","shouldBypassCustomScroll","eventTarget","directTarget","pointTarget","xtermRoot","insideX","insideY","findScrollTargets","el","findTouchById","touchList","i","touch","handleTouchStart","handleTouchMove","currentY","deltaY","didScroll","atTopWhilePullingDown","core","lineHeight","linesToScroll","beforeViewportY","_f","_e","afterViewportY","_h","_g","scrollTargets","previousScrollTop","nextScrollTop","wheelEvent","dispatched","handleTouchEnd","shouldApplyRemotePaneSize","now","remoteSize","pendingLocalSize","ttlMs","shouldSyncOnViewportRestore","currentSize","containerSize","force","useTerminalResize","deviceId","paneId","deviceConnected","isSelectionInvalid","onResize","onSync","getContainerRect","resizeRaf","resizeTimer","lastReportedSize","suppressLocalResizeUntil","postSelectResizeTimers","fitAddonRef","terminalRef","getContainerRectRef","viewportRestorePendingRef","onResizeRef","onSyncRef","measureTerminalSize","useCallback","term","fitAddon","containerRect","_j","_i","applyTerminalSize","reportSize","kind","measuredSize","lastSize","scheduleResize","immediate","run","clearPostSelectResizeTimers","id","runPostSelectResize","retryId","rafId","handleWindowResize","handleViewportRestore","handleVisibilityChange","handleWindowBlur","handleWindowFocus","setFitAddon","setTerminal","TERMINAL_CONFIG","TERMINAL_MODE_CACHE_KEY","readTerminalModeCache","raw","writeTerminalModeCache","parsed","createAlternateScreenFallbackSnapshot","reconcileRecoveredModes","alternateScreen","fallback","hasTrackingMode","setE2eTerminalProbe","g","clearE2eTerminalProbe","Terminal","forwardRef","inputMode","ref","instance","setInstance","useState","sendInput","useTmuxStore","terminalTheme","useMemo","mountRef","currentDeviceIdRef","currentPaneIdRef","attachedDeviceIdRef","attachedPaneIdRef","canWriteRef","currentInputModeRef","currentTerminalThemeRef","liveOutputEndedWithCR","keepShortHistoryVisibleRef","lastTerminalInstanceRef","skipNextDetachPersistRef","persistTerminalModes","targetDeviceId","targetPaneId","getTerminalForTouch","sendTerminalInput","activeDeviceId","activePaneId","cancelled","createdTerminal","callbacks","recoveredModes","buffer","chunk","getSelectStateMachine","ro","disposable","domEvent","useImperativeHandle","dims","_l","_k","_p","_o","_n","_m","jsx","RECENT_SELECT_REQUEST_TTL_MS","PENDING_USER_SELECTION_TTL_MS","matchesPaneSelection","right","getLatestRecentSelectRequest","recentSelectRequests","recentRequests","request","latest","resolvePendingUserSelection","pendingUserSelection","shouldIgnoreActivePaneEvent","params","latestRecentSelectRequest","shouldSkipSnapshotFollow","shouldTrackPendingRouteSelection","getSiteNameFallback","settings","useSiteStore","toSafeText","trimmed","buildTerminalLabel","paneIdx","windowIdx","paneTitle","windowName","deviceName","safeWindowIdx","safePaneIdx","safePaneTitle","safeDeviceName","buildBrowserTitle","label","siteName","isIOSMobileBrowser","userAgent","isIOSDevice","isTouchMac","EDITOR_SHORTCUTS","ShortcutsBar","memo","onSend","onFocusEditor","isMobile","shortcut","Button","e","DevicePage","t","useTranslation","windowId","useParams","navigate","useNavigate","terminalContainerRef","editorContainerRef","editorTextareaRef","autoSelected","iosAddressBarCollapseTried","userInitiatedSelectionRef","selectPane","deviceError","resolvedPaneId","decodePaneIdFromUrlParam","draftKey","setIsMobile","editorText","setEditorText","isEditorFocused","setIsEditorFocused","isComposingRef","isLoading","keyboardInsetBottom","setKeyboardInsetBottom","editorDockHeight","setEditorDockHeight","isSending","setIsSending","useUIStore","uiTheme","editorSendWithEnter","setEditorSendWithEnter","addEditorHistory","setEditorDraft","removeEditorDraft","paneEditorDraft","isIOSBrowser","shouldDockEditor","windows","devicesData","useQuery","res","currentDevice","device","selectedWindow","win","selectedPane","pane","hasWindowSnapshot","canInteractWithPane","terminalTopbarLabel","snapshotActiveSelection","activeWindow","activePane","handleResize","handleSync","getSelectSize","targetWindowId","targetWindow","window","targetPane","checkMobile","collapseAddressBar","timerA","timerB","frameId","updateKeyboardInset","viewportHeight","offsetTop","nextInset","scheduleUpdate","editorContainer","updateEditorHeight","observer","lastHandledActiveRef","lastSnapshotActiveRef","recentSelectRequestsRef","w","p","encodePaneIdForUrl","currentSelected","size","recordSelectRequest","routeTarget","next","r","activePaneFromEvent","currentActive","pendingCreateWindowAt","elapsed","timer","remoteCols","remoteRows","timerId","toast","handler","eventDeviceId","handleSendShortcut","handleEditorSend","handleEditorSendLineByLine","store","handleEditorFocus","handleEditorBlur","handleFocusEditor","showConnecting","jsxs","TerminalComponent","Fragment","Loader2","nextText","Switch","checked","Trash2","Send","PageTitle","snapshots","title","PageActions","setInputMode","showRefreshConfirm","setShowRefreshConfirm","canInteract","handleToggleInputMode","handleJumpToLatest","handleRefreshClick","handleConfirmRefresh","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
1
|
+
{"version":3,"file":"DevicePage-Di11uzbS.js","sources":["../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/arrow-down-to-line.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/keyboard.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/smartphone.js","../../../../packages/ghostty-terminal/src/canvas-renderer.ts","../../../../packages/ghostty-terminal/src/ghostty-keycodes.ts","../../../../packages/ghostty-terminal/src/render-state.ts","../../../../packages/ghostty-terminal/src/selection-model.ts","../../../../packages/ghostty-terminal/src/selection-clipboard.ts","../../../../packages/ghostty-terminal/src/assets/ghostty-vt.wasm?url","../../../../packages/ghostty-terminal/src/ghostty-wasm.ts","../../../../packages/ghostty-terminal/src/terminal.ts","../../src/components/terminal/theme.ts","../../src/components/terminal/normalization.ts","../../src/components/terminal/useMobileTouch.ts","../../src/utils/resizeSyncGuards.ts","../../src/components/terminal/useTerminalResize.ts","../../src/components/terminal/Terminal.tsx","../../src/utils/selectionGuards.ts","../../src/utils/site.ts","../../src/utils/terminalMeta.ts","../../src/pages/DevicePage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 17V3\", key: \"1cwfxf\" }],\n [\"path\", { d: \"m6 11 6 6 6-6\", key: \"12ii2o\" }],\n [\"path\", { d: \"M19 21H5\", key: \"150jfl\" }]\n];\nconst ArrowDownToLine = createLucideIcon(\"arrow-down-to-line\", __iconNode);\n\nexport { __iconNode, ArrowDownToLine as default };\n//# sourceMappingURL=arrow-down-to-line.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 8h.01\", key: \"1r9ogq\" }],\n [\"path\", { d: \"M12 12h.01\", key: \"1mp3jc\" }],\n [\"path\", { d: \"M14 8h.01\", key: \"1primd\" }],\n [\"path\", { d: \"M16 12h.01\", key: \"1l6xoz\" }],\n [\"path\", { d: \"M18 8h.01\", key: \"emo2bl\" }],\n [\"path\", { d: \"M6 8h.01\", key: \"x9i8wu\" }],\n [\"path\", { d: \"M7 16h10\", key: \"wp8him\" }],\n [\"path\", { d: \"M8 12h.01\", key: \"czm47f\" }],\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }]\n];\nconst Keyboard = createLucideIcon(\"keyboard\", __iconNode);\n\nexport { __iconNode, Keyboard as default };\n//# sourceMappingURL=keyboard.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n];\nconst Smartphone = createLucideIcon(\"smartphone\", __iconNode);\n\nexport { __iconNode, Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","import type {\n GhosttyCellDimensions,\n GhosttyColorRgb,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n GhosttySelectionRect,\n GhosttyTheme,\n} from './types';\n\ntype CanvasRendererOptions = {\n screenElement: HTMLElement;\n theme: GhosttyTheme;\n fontFamily: string;\n fontSize: number;\n};\n\ntype CanvasRendererFrame = {\n meta: GhosttyRenderSnapshotMeta;\n rows: GhosttyRenderRow[];\n cellDimensions: GhosttyCellDimensions;\n selectionRects?: GhosttySelectionRect[];\n selectionColor?: string;\n};\n\ntype CanvasRendererDebugState = {\n kind: 'canvas';\n frameCount: number;\n lastDrawnRows: number[];\n};\n\ntype CursorCell = {\n x: number;\n y: number;\n style: GhosttyRenderSnapshotMeta['cursor']['style'];\n};\n\nfunction colorToCss(color: GhosttyColorRgb): string {\n return `rgb(${color.r} ${color.g} ${color.b})`;\n}\n\nfunction ensureContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('2d canvas context unavailable');\n }\n\n return context;\n}\n\nexport class CanvasRenderer {\n readonly kind = 'canvas';\n\n private readonly mainCanvas: HTMLCanvasElement;\n private readonly selectionCanvas: HTMLCanvasElement;\n private readonly cursorCanvas: HTMLCanvasElement;\n private readonly mainContext: CanvasRenderingContext2D;\n private readonly selectionContext: CanvasRenderingContext2D;\n private readonly cursorContext: CanvasRenderingContext2D;\n private theme: GhosttyTheme;\n private readonly fontFamily: string;\n private readonly fontSize: number;\n private cellDimensions: GhosttyCellDimensions = { width: 9, height: 17 };\n private cols = 0;\n private rows = 0;\n private lastCursor: CursorCell | null = null;\n private frameCount = 0;\n private lastDrawnRows: number[] = [];\n private readonly colorCache = new Map<string, string>();\n private readonly fontCache = new Map<string, string>();\n private cursorBlinkVisible = true;\n private cursorBlinkTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: CanvasRendererOptions) {\n this.theme = options.theme;\n this.fontFamily = options.fontFamily;\n this.fontSize = options.fontSize;\n\n options.screenElement.style.position = 'relative';\n options.screenElement.style.overflow = 'hidden';\n\n this.mainCanvas = document.createElement('canvas');\n this.selectionCanvas = document.createElement('canvas');\n this.cursorCanvas = document.createElement('canvas');\n\n for (const [canvas, layer] of [\n [this.mainCanvas, 'main'],\n [this.selectionCanvas, 'selection'],\n [this.cursorCanvas, 'cursor'],\n ] as const) {\n canvas.dataset.layer = layer;\n canvas.style.position = 'absolute';\n canvas.style.inset = '0';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.pointerEvents = 'none';\n options.screenElement.appendChild(canvas);\n }\n\n this.mainContext = ensureContext(this.mainCanvas);\n this.selectionContext = ensureContext(this.selectionCanvas);\n this.cursorContext = ensureContext(this.cursorCanvas);\n }\n\n setTheme(theme: GhosttyTheme): void {\n this.theme = theme;\n this.colorCache.clear();\n }\n\n render(frame: CanvasRendererFrame): void {\n this.frameCount += 1;\n this.lastDrawnRows = [];\n this.cellDimensions = frame.cellDimensions;\n this.resize(frame.meta.cols, frame.meta.rows);\n this.drawSelection(frame.selectionRects ?? [], frame.selectionColor ?? this.theme.selectionBackground);\n\n if (frame.meta.dirty === 'clean') {\n this.drawCursor(frame.meta);\n return;\n }\n\n const drawAllRows = frame.meta.dirty === 'full';\n const targetRows = drawAllRows ? frame.rows : frame.rows.filter((row) => row.dirty);\n\n for (const row of targetRows) {\n this.drawRow(row, frame.meta.colors);\n this.lastDrawnRows.push(row.y);\n }\n\n this.drawCursor(frame.meta);\n }\n\n getDebugState(): CanvasRendererDebugState {\n return {\n kind: this.kind,\n frameCount: this.frameCount,\n lastDrawnRows: [...this.lastDrawnRows],\n };\n }\n\n dispose(): void {\n this.mainCanvas.remove();\n this.selectionCanvas.remove();\n this.cursorCanvas.remove();\n this.colorCache.clear();\n this.fontCache.clear();\n this.lastCursor = null;\n this.stopCursorBlink();\n }\n\n private startCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n return;\n }\n this.cursorBlinkTimer = setInterval(() => {\n this.cursorBlinkVisible = !this.cursorBlinkVisible;\n this.cursorCanvas.style.opacity = this.cursorBlinkVisible ? '1' : '0';\n }, 1000);\n }\n\n private stopCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n clearInterval(this.cursorBlinkTimer);\n this.cursorBlinkTimer = null;\n }\n this.cursorBlinkVisible = true;\n this.cursorCanvas.style.opacity = '1';\n }\n\n private resize(cols: number, rows: number): void {\n const nextCols = Math.max(1, cols);\n const nextRows = Math.max(1, rows);\n const width = nextCols * this.cellDimensions.width;\n const height = nextRows * this.cellDimensions.height;\n const dpr = Math.max(1, globalThis.devicePixelRatio ?? 1);\n\n if (this.cols === nextCols && this.rows === nextRows) {\n const cssWidth = `${width}px`;\n const cssHeight = `${height}px`;\n if (this.mainCanvas.style.width === cssWidth && this.mainCanvas.style.height === cssHeight) {\n return;\n }\n }\n\n this.cols = nextCols;\n this.rows = nextRows;\n\n for (const canvas of [this.mainCanvas, this.selectionCanvas, this.cursorCanvas]) {\n canvas.width = Math.max(1, Math.ceil(width * dpr));\n canvas.height = Math.max(1, Math.ceil(height * dpr));\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n\n for (const context of [this.mainContext, this.selectionContext, this.cursorContext]) {\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.textBaseline = 'top';\n context.imageSmoothingEnabled = false;\n }\n }\n\n private drawSelection(rects: GhosttySelectionRect[], color: string): void {\n this.selectionContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (rects.length === 0) {\n return;\n }\n\n this.selectionContext.fillStyle = color;\n for (const rect of rects) {\n this.selectionContext.fillRect(\n rect.x * this.cellDimensions.width,\n rect.row * this.cellDimensions.height,\n rect.width * this.cellDimensions.width,\n this.cellDimensions.height\n );\n }\n }\n\n private drawRow(row: GhosttyRenderRow, colors: GhosttyRenderSnapshotMeta['colors']): void {\n const y = row.y * this.cellDimensions.height;\n const width = this.cols * this.cellDimensions.width;\n const defaultBackground = this.toCss(colors.background);\n\n this.mainContext.clearRect(0, y, width, this.cellDimensions.height);\n this.mainContext.fillStyle = defaultBackground;\n this.mainContext.fillRect(0, y, width, this.cellDimensions.height);\n\n for (const cell of row.cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n const x = cell.x * this.cellDimensions.width;\n const bg = cell.style.inverse\n ? cell.fgColor ?? colors.foreground\n : cell.bgColor ?? colors.background;\n const fg = cell.style.inverse\n ? cell.bgColor ?? colors.background\n : cell.fgColor ?? colors.foreground;\n const cellWidth = cell.widthKind === 'wide' ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n\n if (bg.r !== colors.background.r || bg.g !== colors.background.g || bg.b !== colors.background.b) {\n this.mainContext.fillStyle = this.toCss(bg);\n this.mainContext.fillRect(x, y, cellWidth, this.cellDimensions.height);\n }\n\n if (!cell.text || cell.style.invisible) {\n continue;\n }\n\n this.mainContext.font = this.resolveFont(cell.style);\n this.mainContext.fillStyle = this.toCss(fg);\n this.mainContext.fillText(cell.text, x, y);\n\n if (cell.style.underline > 0) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.strikethrough) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height * 0.55,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.overline) {\n this.mainContext.fillRect(x, y + 1, Math.max(cellWidth - 1, 1), 1);\n }\n }\n }\n\n private drawCursor(meta: GhosttyRenderSnapshotMeta): void {\n const colors = meta.colors;\n const cursor = meta.cursor;\n const previous = this.lastCursor;\n this.cursorContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (!cursor.visible || cursor.x === null || cursor.y === null) {\n this.lastCursor = null;\n this.stopCursorBlink();\n return;\n }\n\n const x = cursor.x * this.cellDimensions.width;\n const y = cursor.y * this.cellDimensions.height;\n const width = cursor.wideTail ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n const cursorColor = colors.cursor ?? colors.foreground;\n const cssColor = this.toCss(cursorColor);\n\n this.cursorContext.fillStyle = cssColor;\n this.cursorContext.strokeStyle = cssColor;\n this.cursorContext.globalAlpha = 0.7;\n this.cursorContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(width - 1, 1),\n 2\n );\n this.cursorContext.globalAlpha = 1;\n\n this.startCursorBlink();\n\n this.lastCursor = {\n x: cursor.x,\n y: cursor.y,\n style: cursor.style,\n };\n\n if (\n previous &&\n (previous.x !== this.lastCursor.x ||\n previous.y !== this.lastCursor.y ||\n previous.style !== this.lastCursor.style)\n ) {\n this.lastDrawnRows.push(previous.y);\n }\n }\n\n private resolveFont(style: GhosttyRenderRow['cells'][number]['style']): string {\n const key = [\n style.italic ? 'italic' : 'normal',\n style.bold ? '700' : '400',\n `${this.fontSize}px`,\n this.fontFamily,\n ].join('|');\n\n const cached = this.fontCache.get(key);\n if (cached) {\n return cached;\n }\n\n const font = `${style.italic ? 'italic ' : ''}${style.bold ? '700 ' : ''}${this.fontSize}px ${this.fontFamily}`;\n this.fontCache.set(key, font);\n return font;\n }\n\n private toCss(color: GhosttyColorRgb): string {\n const key = `${color.r},${color.g},${color.b}`;\n const cached = this.colorCache.get(key);\n if (cached) {\n return cached;\n }\n\n const css = colorToCss(color);\n this.colorCache.set(key, css);\n return css;\n }\n}\n\nexport type { CanvasRendererDebugState, CanvasRendererFrame, CanvasRendererOptions };\n","const KEY_UNIDENTIFIED = 0;\n\nconst KEY_CODE_MAP: Record<string, number> = {\n Backquote: 1,\n Backslash: 2,\n BracketLeft: 3,\n BracketRight: 4,\n Comma: 5,\n Digit0: 6,\n Digit1: 7,\n Digit2: 8,\n Digit3: 9,\n Digit4: 10,\n Digit5: 11,\n Digit6: 12,\n Digit7: 13,\n Digit8: 14,\n Digit9: 15,\n Equal: 16,\n IntlBackslash: 17,\n IntlRo: 18,\n IntlYen: 19,\n KeyA: 20,\n KeyB: 21,\n KeyC: 22,\n KeyD: 23,\n KeyE: 24,\n KeyF: 25,\n KeyG: 26,\n KeyH: 27,\n KeyI: 28,\n KeyJ: 29,\n KeyK: 30,\n KeyL: 31,\n KeyM: 32,\n KeyN: 33,\n KeyO: 34,\n KeyP: 35,\n KeyQ: 36,\n KeyR: 37,\n KeyS: 38,\n KeyT: 39,\n KeyU: 40,\n KeyV: 41,\n KeyW: 42,\n KeyX: 43,\n KeyY: 44,\n KeyZ: 45,\n Minus: 46,\n Period: 47,\n Quote: 48,\n Semicolon: 49,\n Slash: 50,\n AltLeft: 51,\n AltRight: 52,\n Backspace: 53,\n CapsLock: 54,\n ContextMenu: 55,\n ControlLeft: 56,\n ControlRight: 57,\n Enter: 58,\n MetaLeft: 59,\n MetaRight: 60,\n ShiftLeft: 61,\n ShiftRight: 62,\n Space: 63,\n Tab: 64,\n Convert: 65,\n KanaMode: 66,\n NonConvert: 67,\n Delete: 68,\n End: 69,\n Help: 70,\n Home: 71,\n Insert: 72,\n PageDown: 73,\n PageUp: 74,\n ArrowDown: 75,\n ArrowLeft: 76,\n ArrowRight: 77,\n ArrowUp: 78,\n NumLock: 79,\n Numpad0: 80,\n Numpad1: 81,\n Numpad2: 82,\n Numpad3: 83,\n Numpad4: 84,\n Numpad5: 85,\n Numpad6: 86,\n Numpad7: 87,\n Numpad8: 88,\n Numpad9: 89,\n NumpadAdd: 90,\n NumpadBackspace: 91,\n NumpadClear: 92,\n NumpadClearEntry: 93,\n NumpadComma: 94,\n NumpadDecimal: 95,\n NumpadDivide: 96,\n NumpadEnter: 97,\n NumpadEqual: 98,\n NumpadMemoryAdd: 99,\n NumpadMemoryClear: 100,\n NumpadMemoryRecall: 101,\n NumpadMemoryStore: 102,\n NumpadMemorySubtract: 103,\n NumpadMultiply: 104,\n NumpadParenLeft: 105,\n NumpadParenRight: 106,\n NumpadSubtract: 107,\n NumpadSeparator: 108,\n NumpadUp: 109,\n NumpadDown: 110,\n NumpadRight: 111,\n NumpadLeft: 112,\n NumpadBegin: 113,\n NumpadHome: 114,\n NumpadEnd: 115,\n NumpadInsert: 116,\n NumpadDelete: 117,\n NumpadPageUp: 118,\n NumpadPageDown: 119,\n Escape: 120,\n F1: 121,\n F2: 122,\n F3: 123,\n F4: 124,\n F5: 125,\n F6: 126,\n F7: 127,\n F8: 128,\n F9: 129,\n F10: 130,\n F11: 131,\n F12: 132,\n F13: 133,\n F14: 134,\n F15: 135,\n F16: 136,\n F17: 137,\n F18: 138,\n F19: 139,\n F20: 140,\n F21: 141,\n F22: 142,\n F23: 143,\n F24: 144,\n F25: 145,\n Fn: 146,\n FnLock: 147,\n PrintScreen: 148,\n ScrollLock: 149,\n Pause: 150,\n BrowserBack: 151,\n BrowserFavorites: 152,\n BrowserForward: 153,\n BrowserHome: 154,\n BrowserRefresh: 155,\n BrowserSearch: 156,\n BrowserStop: 157,\n Eject: 158,\n LaunchApp1: 159,\n LaunchApp2: 160,\n LaunchMail: 161,\n MediaPlayPause: 162,\n MediaSelect: 163,\n MediaStop: 164,\n MediaTrackNext: 165,\n MediaTrackPrevious: 166,\n Power: 167,\n Sleep: 168,\n AudioVolumeDown: 169,\n AudioVolumeMute: 170,\n AudioVolumeUp: 171,\n WakeUp: 172,\n Copy: 173,\n Cut: 174,\n Paste: 175,\n};\n\nconst UNSHIFTED_CODEPOINTS: Record<string, string> = {\n Backquote: '`',\n Backslash: '\\\\',\n BracketLeft: '[',\n BracketRight: ']',\n Comma: ',',\n Equal: '=',\n Minus: '-',\n Period: '.',\n Quote: \"'\",\n Semicolon: ';',\n Slash: '/',\n Space: ' ',\n IntlBackslash: '\\\\',\n IntlYen: '¥',\n IntlRo: '\\\\',\n};\n\nfor (let index = 0; index <= 9; index += 1) {\n UNSHIFTED_CODEPOINTS[`Digit${index}`] = String(index);\n}\n\nfor (let index = 0; index < 26; index += 1) {\n const uppercase = String.fromCharCode(65 + index);\n const lowercase = String.fromCharCode(97 + index);\n UNSHIFTED_CODEPOINTS[`Key${uppercase}`] = lowercase;\n}\n\nexport function getGhosttyKeyCode(code: string): number {\n return KEY_CODE_MAP[code] ?? KEY_UNIDENTIFIED;\n}\n\nexport function getUnshiftedCodepoint(code: string): number | null {\n const value = UNSHIFTED_CODEPOINTS[code];\n return value ? value.codePointAt(0) ?? null : null;\n}\n","import type { GhosttyBindings } from './ghostty-wasm';\nimport type {\n GhosttyCellWidthKind,\n GhosttyColorRgb,\n GhosttyCursorVisualStyle,\n GhosttyRenderCell,\n GhosttyRenderCellStyle,\n GhosttyRenderDirtyState,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n} from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_INVALID_VALUE = -2;\n\nconst GHOSTTY_RENDER_STATE_DATA_COLS = 1;\nconst GHOSTTY_RENDER_STATE_DATA_ROWS = 2;\nconst GHOSTTY_RENDER_STATE_DATA_DIRTY = 3;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE = 10;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE = 11;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING = 12;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT = 13;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE = 14;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X = 15;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y = 16;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL = 17;\n\nconst GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY = 1;\nconst GHOSTTY_RENDER_STATE_ROW_DATA_RAW = 2;\n\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW = 1;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE = 2;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN = 3;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF = 4;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR = 5;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR = 6;\n\nconst GHOSTTY_ROW_DATA_WRAP = 1;\nconst GHOSTTY_ROW_DATA_WRAP_CONTINUATION = 2;\n\nconst GHOSTTY_CELL_DATA_WIDE = 3;\nconst GHOSTTY_CELL_DATA_HAS_TEXT = 4;\n\ntype GhosttyRenderStateResources = {\n bindings: GhosttyBindings;\n renderStateHandle: number;\n rowIteratorHandle: number;\n rowCellsHandle: number;\n snapshotVersion: number;\n disposed: boolean;\n cachedMeta: GhosttyRenderSnapshotMeta | null;\n};\n\nfunction ensureActive(resources: GhosttyRenderStateResources): void {\n if (resources.disposed || resources.renderStateHandle === 0) {\n throw new Error('render state resources already disposed');\n }\n}\n\nfunction resultToDirtyState(value: number): GhosttyRenderDirtyState {\n switch (value) {\n case 2:\n return 'full';\n case 1:\n return 'partial';\n default:\n return 'clean';\n }\n}\n\nfunction resultToCursorStyle(value: number): GhosttyCursorVisualStyle {\n switch (value) {\n case 0:\n return 'bar';\n case 2:\n return 'underline';\n case 3:\n return 'block-hollow';\n default:\n return 'block';\n }\n}\n\nfunction resultToCellWidthKind(value: number): GhosttyCellWidthKind {\n switch (value) {\n case 1:\n return 'wide';\n case 2:\n return 'spacer-tail';\n case 3:\n return 'spacer-head';\n default:\n return 'narrow';\n }\n}\n\nfunction readColorAt(bindings: GhosttyBindings, ptr: number): GhosttyColorRgb {\n return {\n r: bindings.view().getUint8(ptr),\n g: bindings.view().getUint8(ptr + 1),\n b: bindings.view().getUint8(ptr + 2),\n };\n}\n\nfunction readOptionalColor(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number\n): GhosttyColorRgb | null {\n const color = resources.bindings.allocStruct('GhosttyColorRgb');\n\n try {\n const result = read(color.ptr);\n if (result === GHOSTTY_INVALID_VALUE) {\n return null;\n }\n\n if (result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty optional color read failed with result ${result}`);\n }\n\n return readColorAt(resources.bindings, color.ptr);\n } finally {\n color.free();\n }\n}\n\nfunction readBool(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): boolean {\n const ptr = resources.bindings.allocU8();\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty bool read failed with result ${result}`);\n }\n\n return resources.bindings.readU8(ptr) !== 0;\n } finally {\n resources.bindings.freeU8(ptr);\n }\n}\n\nfunction readU16(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(2);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u16 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint16(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 2);\n }\n}\n\nfunction readU32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u32 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readEnumI32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty enum read failed with result ${result}`);\n }\n\n return resources.bindings.view().getInt32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readU64(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): bigint {\n const ptr = resources.bindings.allocBytes(8);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u64 read failed with result ${result}`);\n }\n\n return resources.bindings.readU64(ptr);\n } finally {\n resources.bindings.freeBytes(ptr, 8);\n }\n}\n\nfunction readStyle(resources: GhosttyRenderStateResources): GhosttyRenderCellStyle {\n const style = resources.bindings.allocStruct('GhosttyStyle');\n\n try {\n resources.bindings.setField(\n style.view,\n 'GhosttyStyle',\n 'size',\n resources.bindings.typeSize('GhosttyStyle')\n );\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE,\n style.ptr\n );\n\n const field = (name: string) => resources.bindings.field('GhosttyStyle', name).offset;\n return {\n bold: style.view.getUint8(field('bold')) !== 0,\n italic: style.view.getUint8(field('italic')) !== 0,\n faint: style.view.getUint8(field('faint')) !== 0,\n blink: style.view.getUint8(field('blink')) !== 0,\n inverse: style.view.getUint8(field('inverse')) !== 0,\n invisible: style.view.getUint8(field('invisible')) !== 0,\n strikethrough: style.view.getUint8(field('strikethrough')) !== 0,\n overline: style.view.getUint8(field('overline')) !== 0,\n underline: style.view.getInt32(field('underline'), true),\n };\n } finally {\n style.free();\n }\n}\n\nfunction readCodepoints(resources: GhosttyRenderStateResources): number[] {\n const graphemeLen = readU32(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN,\n ptr\n )\n );\n\n if (graphemeLen === 0) {\n return [];\n }\n\n const bufPtr = resources.bindings.allocBytes(graphemeLen * 4);\n\n try {\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF,\n bufPtr\n );\n\n const codepoints: number[] = [];\n for (let index = 0; index < graphemeLen; index += 1) {\n codepoints.push(resources.bindings.view().getUint32(bufPtr + index * 4, true));\n }\n\n return codepoints;\n } finally {\n resources.bindings.freeBytes(bufPtr, graphemeLen * 4);\n }\n}\n\nfunction codepointsToText(codepoints: number[]): string {\n if (codepoints.length === 0) {\n return '';\n }\n\n try {\n return String.fromCodePoint(...codepoints);\n } catch {\n return '';\n }\n}\n\nfunction buildRowText(cells: GhosttyRenderCell[]): string {\n let text = '';\n\n for (const cell of cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n if (cell.text) {\n text += cell.text;\n continue;\n }\n\n if (cell.widthKind === 'narrow') {\n text += ' ';\n }\n }\n\n return text;\n}\n\nfunction readMeta(resources: GhosttyRenderStateResources): GhosttyRenderSnapshotMeta {\n const colors = resources.bindings.allocStruct('GhosttyRenderStateColors');\n\n try {\n resources.bindings.setField(\n colors.view,\n 'GhosttyRenderStateColors',\n 'size',\n resources.bindings.typeSize('GhosttyRenderStateColors')\n );\n resources.bindings.getRenderStateColors(resources.renderStateHandle, colors.ptr);\n\n const paletteOffset = resources.bindings.field('GhosttyRenderStateColors', 'palette').offset;\n const palette: GhosttyColorRgb[] = [];\n for (let index = 0; index < 256; index += 1) {\n const colorOffset = colors.ptr + paletteOffset + index * 3;\n palette.push(readColorAt(resources.bindings, colorOffset));\n }\n\n const cursorHasValue =\n colors.view.getUint8(\n resources.bindings.field('GhosttyRenderStateColors', 'cursor_has_value').offset\n ) !== 0;\n\n const cursorViewportHasValue = readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE,\n ptr\n )\n );\n\n return {\n cols: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_COLS,\n ptr\n )\n ),\n rows: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_ROWS,\n ptr\n )\n ),\n dirty: resultToDirtyState(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_DIRTY,\n ptr\n )\n )\n ),\n colors: {\n background: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'background').offset\n ),\n foreground: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'foreground').offset\n ),\n cursor: cursorHasValue\n ? readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'cursor').offset\n )\n : null,\n palette,\n },\n cursor: {\n style: resultToCursorStyle(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE,\n ptr\n )\n )\n ),\n visible: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE,\n ptr\n )\n ),\n blinking: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING,\n ptr\n )\n ),\n passwordInput: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT,\n ptr\n )\n ),\n x: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X,\n ptr\n )\n )\n : null,\n y: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y,\n ptr\n )\n )\n : null,\n wideTail: cursorViewportHasValue\n ? readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL,\n ptr\n )\n )\n : false,\n },\n };\n } finally {\n colors.free();\n }\n}\n\nfunction readRow(resources: GhosttyRenderStateResources, rowIndex: number): GhosttyRenderRow {\n const rawRow = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_RAW,\n ptr\n )\n );\n resources.bindings.bindRenderStateRowCells(resources.rowIteratorHandle, resources.rowCellsHandle);\n\n const cells: GhosttyRenderCell[] = [];\n let x = 0;\n while (resources.bindings.nextRenderStateRowCell(resources.rowCellsHandle)) {\n const rawCell = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW,\n ptr\n )\n );\n const codepoints = readCodepoints(resources);\n const widthKind = resultToCellWidthKind(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_WIDE, ptr)\n )\n );\n const cell: GhosttyRenderCell = {\n x,\n text: codepointsToText(codepoints),\n codepoints,\n widthKind,\n hasText: readBool(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_HAS_TEXT, ptr)\n ),\n style: readStyle(resources),\n fgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR,\n ptr\n )\n ),\n bgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR,\n ptr\n )\n ),\n };\n cells.push(cell);\n x += 1;\n }\n\n return {\n y: rowIndex,\n dirty: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY,\n ptr\n )\n ),\n wrap: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP, ptr)\n ),\n wrapContinuation: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP_CONTINUATION, ptr)\n ),\n text: buildRowText(cells),\n cells,\n };\n}\n\nexport function createRenderState(bindings: GhosttyBindings): GhosttyRenderStateResources {\n return {\n bindings,\n renderStateHandle: bindings.createRenderState(),\n rowIteratorHandle: bindings.createRenderStateRowIterator(),\n rowCellsHandle: bindings.createRenderStateRowCells(),\n snapshotVersion: 0,\n disposed: false,\n cachedMeta: null,\n };\n}\n\nexport function updateRenderState(\n resources: GhosttyRenderStateResources,\n terminalHandle: number\n): void {\n ensureActive(resources);\n resources.bindings.updateRenderState(resources.renderStateHandle, terminalHandle);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n resources.snapshotVersion += 1;\n resources.cachedMeta = null;\n}\n\nexport function readRenderSnapshotMeta(\n resources: GhosttyRenderStateResources\n): GhosttyRenderSnapshotMeta {\n ensureActive(resources);\n if (!resources.cachedMeta) {\n resources.cachedMeta = readMeta(resources);\n }\n\n return resources.cachedMeta;\n}\n\nexport function* iterateRows(\n resources: GhosttyRenderStateResources\n): Generator<GhosttyRenderRow, void, undefined> {\n ensureActive(resources);\n const meta = readRenderSnapshotMeta(resources);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n\n let rowIndex = 0;\n while (\n rowIndex < meta.rows &&\n resources.bindings.nextRenderStateRowIterator(resources.rowIteratorHandle)\n ) {\n yield readRow(resources, rowIndex);\n rowIndex += 1;\n }\n}\n\nexport function disposeRenderStateResources(resources: GhosttyRenderStateResources): void {\n if (resources.disposed) {\n return;\n }\n\n resources.disposed = true;\n if (resources.rowCellsHandle !== 0) {\n resources.bindings.freeRenderStateRowCells(resources.rowCellsHandle);\n resources.rowCellsHandle = 0;\n }\n if (resources.rowIteratorHandle !== 0) {\n resources.bindings.freeRenderStateRowIterator(resources.rowIteratorHandle);\n resources.rowIteratorHandle = 0;\n }\n if (resources.renderStateHandle !== 0) {\n resources.bindings.freeRenderState(resources.renderStateHandle);\n resources.renderStateHandle = 0;\n }\n resources.cachedMeta = null;\n}\n\nexport type { GhosttyRenderStateResources };\n","import type { GhosttySelectionRect } from './types';\n\nexport type SelectionMode = 'character' | 'word' | 'line';\n\nexport type SelectionPoint = {\n line: number;\n col: number;\n};\n\nexport type SelectionState = {\n anchor: SelectionPoint | null;\n focus: SelectionPoint | null;\n mode: SelectionMode;\n};\n\ntype SelectionRange = {\n start: SelectionPoint;\n end: SelectionPoint;\n};\n\nfunction clampColumn(lineText: string, col: number): number {\n return Math.max(0, Math.min(Math.max(lineText.length - 1, 0), Math.floor(col)));\n}\n\nfunction normalizeRange(anchor: SelectionPoint, focus: SelectionPoint): SelectionRange {\n if (anchor.line < focus.line) {\n return { start: anchor, end: focus };\n }\n\n if (anchor.line > focus.line) {\n return { start: focus, end: anchor };\n }\n\n if (anchor.col <= focus.col) {\n return { start: anchor, end: focus };\n }\n\n return { start: focus, end: anchor };\n}\n\nfunction expandWord(line: number, col: number, lineText: string): SelectionRange {\n if (!lineText) {\n return {\n start: { line, col: 0 },\n end: { line, col: 0 },\n };\n }\n\n const safeCol = clampColumn(lineText, col);\n const isWordChar = (value: string) => /[\\p{L}\\p{N}_-]/u.test(value);\n const cursorChar = lineText[safeCol] ?? '';\n\n if (!isWordChar(cursorChar)) {\n return {\n start: { line, col: safeCol },\n end: { line, col: safeCol },\n };\n }\n\n let start = safeCol;\n let end = safeCol;\n while (start > 0 && isWordChar(lineText[start - 1] ?? '')) {\n start -= 1;\n }\n while (end + 1 < lineText.length && isWordChar(lineText[end + 1] ?? '')) {\n end += 1;\n }\n\n return {\n start: { line, col: start },\n end: { line, col: end },\n };\n}\n\nfunction expandLine(line: number, lineText: string): SelectionRange {\n const lastCol = Math.max(lineText.length - 1, 0);\n return {\n start: { line, col: 0 },\n end: { line, col: lastCol },\n };\n}\n\nfunction pointForMode(\n point: SelectionPoint,\n mode: SelectionMode,\n getLineText: (line: number) => string\n): SelectionRange {\n const lineText = getLineText(point.line);\n\n switch (mode) {\n case 'word':\n return expandWord(point.line, point.col, lineText);\n case 'line':\n return expandLine(point.line, lineText);\n default: {\n const safeCol = clampColumn(lineText, point.col);\n return {\n start: { line: point.line, col: safeCol },\n end: { line: point.line, col: safeCol },\n };\n }\n }\n}\n\nexport function createEmptySelectionState(): SelectionState {\n return {\n anchor: null,\n focus: null,\n mode: 'character',\n };\n}\n\nexport function hasSelection(state: SelectionState): boolean {\n return Boolean(state.anchor && state.focus);\n}\n\nexport function clearSelection(): SelectionState {\n return createEmptySelectionState();\n}\n\nexport function resolvePointerSelection(\n _previous: SelectionState,\n point: SelectionPoint & { mode: SelectionMode },\n getLineText: (line: number) => string\n): SelectionState {\n const expanded = pointForMode(point, point.mode, getLineText);\n return {\n anchor: expanded.start,\n focus: expanded.end,\n mode: point.mode,\n };\n}\n\nexport function updateSelectionFocus(\n state: SelectionState,\n point: SelectionPoint,\n getLineText: (line: number) => string\n): SelectionState {\n if (!state.anchor) {\n return state;\n }\n\n if (state.mode === 'line') {\n return {\n ...state,\n focus: expandLine(point.line, getLineText(point.line)).end,\n };\n }\n\n if (state.mode === 'word') {\n return {\n ...state,\n focus: pointForMode(point, 'word', getLineText).end,\n };\n }\n\n return {\n ...state,\n focus: {\n line: point.line,\n col: clampColumn(getLineText(point.line), point.col),\n },\n };\n}\n\nexport function getSelectionRange(state: SelectionState): SelectionRange | null {\n if (!state.anchor || !state.focus) {\n return null;\n }\n\n return normalizeRange(state.anchor, state.focus);\n}\n\nexport function serializeSelectionText(\n state: SelectionState,\n getLineText: (line: number) => string\n): string | null {\n const range = getSelectionRange(state);\n if (!range) {\n return null;\n }\n\n const segments: string[] = [];\n for (let line = range.start.line; line <= range.end.line; line += 1) {\n const text = getLineText(line);\n if (line === range.start.line && line === range.end.line) {\n segments.push(text.slice(range.start.col, range.end.col + 1));\n continue;\n }\n\n if (line === range.start.line) {\n segments.push(text.slice(range.start.col));\n continue;\n }\n\n if (line === range.end.line) {\n segments.push(text.slice(0, range.end.col + 1));\n continue;\n }\n\n segments.push(text);\n }\n\n return segments.join('\\n');\n}\n\nexport function projectSelectionRects(\n state: SelectionState,\n viewportStartLine: number,\n viewportRows: number,\n getLineText?: (line: number) => string\n): GhosttySelectionRect[] {\n const range = getSelectionRange(state);\n if (!range) {\n return [];\n }\n\n const viewportEndLine = viewportStartLine + viewportRows - 1;\n const rects: GhosttySelectionRect[] = [];\n for (\n let line = Math.max(range.start.line, viewportStartLine);\n line <= Math.min(range.end.line, viewportEndLine);\n line += 1\n ) {\n const row = line - viewportStartLine;\n if (line === range.start.line && line === range.end.line) {\n rects.push({\n row,\n x: range.start.col,\n width: range.end.col - range.start.col + 1,\n });\n continue;\n }\n\n if (line === range.start.line) {\n const lineWidth = getLineText ? Math.max(getLineText(line).length - range.start.col, 0) : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: range.start.col,\n width: lineWidth,\n });\n continue;\n }\n\n if (line === range.end.line) {\n rects.push({\n row,\n x: 0,\n width: range.end.col + 1,\n });\n continue;\n }\n\n const middleWidth = getLineText ? getLineText(line).length : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: 0,\n width: middleWidth,\n });\n }\n\n return rects;\n}\n","export function hasCopyModifier(event: KeyboardEvent): boolean {\n return (event.metaKey || event.ctrlKey) && !event.altKey;\n}\n\nexport function isCopyShortcut(event: KeyboardEvent): boolean {\n return hasCopyModifier(event) && event.key.toLowerCase() === 'c';\n}\n\nexport async function writeSelectionToClipboard(text: string): Promise<void> {\n if (!text) {\n return;\n }\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n}\n\nexport function writeSelectionToCopyEvent(event: ClipboardEvent, text: string): boolean {\n if (!text || !event.clipboardData) {\n return false;\n }\n\n event.clipboardData.setData('text/plain', text);\n event.preventDefault();\n return true;\n}\n","export default \"__VITE_ASSET__D7nLG8tf__\"","import ghosttyWasmUrl from './assets/ghostty-vt.wasm?url';\nimport type { GhosttyCellDimensions, GhosttyTheme } from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_OUT_OF_SPACE = -3;\n\nconst GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND = 11;\nconst GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND = 12;\nconst GHOSTTY_TERMINAL_OPT_COLOR_CURSOR = 13;\nconst GHOSTTY_TERMINAL_OPT_COLOR_PALETTE = 14;\n\nconst GHOSTTY_TERMINAL_DATA_COLS = 1;\nconst GHOSTTY_TERMINAL_DATA_ROWS = 2;\nconst GHOSTTY_TERMINAL_DATA_SCROLLBAR = 9;\nconst GHOSTTY_POINT_TAG_VIEWPORT = 1;\n\nconst GHOSTTY_SCROLL_VIEWPORT_TOP = 0;\nconst GHOSTTY_SCROLL_VIEWPORT_BOTTOM = 1;\nconst GHOSTTY_SCROLL_VIEWPORT_DELTA = 2;\n\nconst GHOSTTY_KEY_ACTION_RELEASE = 0;\nconst GHOSTTY_KEY_ACTION_PRESS = 1;\nconst GHOSTTY_KEY_ACTION_REPEAT = 2;\n\nconst GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL = 4;\n\nconst GHOSTTY_MODE_BRACKETED_PASTE = 2004;\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_UTF8_MOUSE = 1005;\nconst GHOSTTY_MODE_SGR_MOUSE = 1006;\nconst GHOSTTY_MODE_URXVT_MOUSE = 1015;\nconst GHOSTTY_MODE_SGR_PIXELS_MOUSE = 1016;\n\nconst GHOSTTY_FORMATTER_FORMAT_PLAIN = 0;\nconst GHOSTTY_FORMATTER_FORMAT_HTML = 2;\nconst WASM_USIZE_BYTES = 4;\n\ntype LayoutField = {\n offset: number;\n size: number;\n type: string;\n};\n\ntype LayoutType = {\n size: number;\n align: number;\n fields: Record<string, LayoutField>;\n};\n\ntype LayoutMap = Record<string, LayoutType>;\n\ntype GhosttyMouseEncodeOptions = {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n mods: number;\n x: number;\n y: number;\n anyButtonPressed: boolean;\n screenWidth: number;\n screenHeight: number;\n cellWidth: number;\n cellHeight: number;\n};\n\ntype GhosttyExports = WebAssembly.Exports & {\n memory: WebAssembly.Memory;\n ghostty_type_json: () => number;\n ghostty_alloc: (allocatorPtr: number, size: number, alignment: number) => number;\n ghostty_free: (allocatorPtr: number, ptr: number, len: number) => void;\n ghostty_wasm_alloc_opaque: () => number;\n ghostty_wasm_free_opaque: (ptr: number) => void;\n ghostty_wasm_alloc_u8: () => number;\n ghostty_wasm_free_u8: (ptr: number) => void;\n ghostty_wasm_alloc_u8_array: (len: number) => number;\n ghostty_wasm_free_u8_array: (ptr: number, len: number) => void;\n ghostty_wasm_alloc_usize: () => number;\n ghostty_wasm_free_usize: (ptr: number) => void;\n ghostty_terminal_new: (allocatorPtr: number, outTerminalPtr: number, optionsPtr: number) => number;\n ghostty_terminal_free: (terminal: number) => void;\n ghostty_terminal_reset: (terminal: number) => void;\n ghostty_terminal_resize: (\n terminal: number,\n cols: number,\n rows: number,\n cellWidthPx: number,\n cellHeightPx: number\n ) => number;\n ghostty_terminal_vt_write: (terminal: number, dataPtr: number, len: number) => void;\n ghostty_terminal_scroll_viewport: (terminal: number, behaviorPtr: number) => void;\n ghostty_terminal_set: (terminal: number, option: number, valuePtr: number) => number;\n ghostty_terminal_get: (terminal: number, data: number, outPtr: number) => number;\n ghostty_terminal_mode_get: (terminal: number, mode: number, outValuePtr: number) => number;\n ghostty_terminal_mode_set: (terminal: number, mode: number, enabled: number) => number;\n ghostty_terminal_grid_ref: (terminal: number, pointPtr: number, outRefPtr: number) => number;\n ghostty_render_state_new: (allocatorPtr: number, outStatePtr: number) => number;\n ghostty_render_state_free: (state: number) => void;\n ghostty_render_state_update: (state: number, terminal: number) => number;\n ghostty_render_state_get: (state: number, data: number, outPtr: number) => number;\n ghostty_render_state_set: (state: number, option: number, valuePtr: number) => number;\n ghostty_render_state_colors_get: (state: number, outColorsPtr: number) => number;\n ghostty_render_state_row_iterator_new: (allocatorPtr: number, outIteratorPtr: number) => number;\n ghostty_render_state_row_iterator_free: (iterator: number) => void;\n ghostty_render_state_row_iterator_next: (iterator: number) => number;\n ghostty_render_state_row_get: (iterator: number, data: number, outPtr: number) => number;\n ghostty_render_state_row_set: (iterator: number, option: number, valuePtr: number) => number;\n ghostty_render_state_row_cells_new: (allocatorPtr: number, outCellsPtr: number) => number;\n ghostty_render_state_row_cells_free: (cells: number) => void;\n ghostty_render_state_row_cells_next: (cells: number) => number;\n ghostty_render_state_row_cells_select: (cells: number, x: number) => number;\n ghostty_render_state_row_cells_get: (cells: number, data: number, outPtr: number) => number;\n ghostty_row_get: (row: bigint, data: number, outPtr: number) => number;\n ghostty_cell_get: (cell: bigint, data: number, outPtr: number) => number;\n ghostty_formatter_terminal_new: (\n allocatorPtr: number,\n outFormatterPtr: number,\n terminal: number,\n optionsPtr: number\n ) => number;\n ghostty_formatter_format_alloc: (\n formatter: number,\n allocatorPtr: number,\n outPtrPtr: number,\n outLenPtr: number\n ) => number;\n ghostty_formatter_free: (formatter: number) => void;\n ghostty_key_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_key_encoder_free: (encoder: number) => void;\n ghostty_key_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_mouse_encoder_free: (encoder: number) => void;\n ghostty_mouse_encoder_reset: (encoder: number) => void;\n ghostty_mouse_encoder_setopt: (encoder: number, option: number, valuePtr: number) => void;\n ghostty_mouse_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_mouse_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_mouse_event_free: (event: number) => void;\n ghostty_mouse_event_set_action: (event: number, action: number) => void;\n ghostty_mouse_event_set_button: (event: number, button: number) => void;\n ghostty_mouse_event_clear_button: (event: number) => void;\n ghostty_mouse_event_set_mods: (event: number, mods: number) => void;\n ghostty_mouse_event_set_position: (event: number, positionPtr: number) => void;\n ghostty_key_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_key_event_free: (event: number) => void;\n ghostty_key_event_set_action: (event: number, action: number) => void;\n ghostty_key_event_set_key: (event: number, key: number) => void;\n ghostty_key_event_set_mods: (event: number, mods: number) => void;\n ghostty_key_event_set_consumed_mods: (event: number, consumedMods: number) => void;\n ghostty_key_event_set_composing: (event: number, composing: number) => void;\n ghostty_key_event_set_utf8: (event: number, utf8Ptr: number, len: number) => void;\n ghostty_key_event_set_unshifted_codepoint: (event: number, codepoint: number) => void;\n ghostty_key_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_paste_encode: (\n dataPtr: number,\n dataLen: number,\n bracketed: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n};\n\nlet bindingsPromise: Promise<GhosttyBindings> | null = null;\n\nfunction assertResult(result: number, action: string): void {\n if (result === GHOSTTY_SUCCESS) {\n return;\n }\n\n throw new Error(`${action} failed with result ${result}`);\n}\n\nfunction parseHexRgb(hex: string): [number, number, number] {\n const normalized = hex.trim().replace(/^#/, '');\n if (normalized.length !== 6) {\n throw new Error(`expected #RRGGBB color, received: ${hex}`);\n }\n\n return [\n Number.parseInt(normalized.slice(0, 2), 16),\n Number.parseInt(normalized.slice(2, 4), 16),\n Number.parseInt(normalized.slice(4, 6), 16),\n ];\n}\n\nfunction createAnsi256Palette(theme: GhosttyTheme): Array<[number, number, number]> {\n const base16 = [\n theme.black,\n theme.red,\n theme.green,\n theme.yellow,\n theme.blue,\n theme.magenta,\n theme.cyan,\n theme.white,\n theme.brightBlack,\n theme.brightRed,\n theme.brightGreen,\n theme.brightYellow,\n theme.brightBlue,\n theme.brightMagenta,\n theme.brightCyan,\n theme.brightWhite,\n ].map(parseHexRgb);\n\n const palette = [...base16];\n const cube = [0, 95, 135, 175, 215, 255];\n\n for (const red of cube) {\n for (const green of cube) {\n for (const blue of cube) {\n palette.push([red, green, blue]);\n }\n }\n }\n\n for (let index = 0; index < 24; index += 1) {\n const value = 8 + index * 10;\n palette.push([value, value, value]);\n }\n\n return palette;\n}\n\nfunction encodeMouseModifierBits(mods: number): number {\n let encoded = 0;\n if (mods & (1 << 0)) encoded += 4;\n if (mods & (1 << 2)) encoded += 8;\n if (mods & (1 << 1)) encoded += 16;\n return encoded;\n}\n\nfunction encodeX10Byte(value: number): string | null {\n if (value < 0 || value > 223) {\n return null;\n }\n\n return String.fromCharCode(value + 32);\n}\n\nfunction mouseButtonCode(button: number | null | undefined): number | null {\n switch (button) {\n case 1:\n return 0;\n case 3:\n return 1;\n case 2:\n return 2;\n case 4:\n return 64;\n case 5:\n return 65;\n case 6:\n return 66;\n case 7:\n return 67;\n case 8:\n return 128;\n case 9:\n return 129;\n case null:\n case undefined:\n return 3;\n default:\n return null;\n }\n}\n\nexport function keyboardEventToGhosttyMods(event: KeyboardEvent): number {\n let mods = 0;\n\n if (event.shiftKey) mods |= 1 << 0;\n if (event.ctrlKey) mods |= 1 << 1;\n if (event.altKey) mods |= 1 << 2;\n if (event.metaKey) mods |= 1 << 3;\n if (event.getModifierState?.('CapsLock')) mods |= 1 << 4;\n if (event.getModifierState?.('NumLock')) mods |= 1 << 5;\n\n return mods;\n}\n\nclass StructAllocation {\n constructor(\n private readonly bindings: GhosttyBindings,\n readonly typeName: string,\n readonly ptr: number\n ) {}\n\n get view(): DataView {\n return this.bindings.view(this.ptr, this.bindings.typeSize(this.typeName));\n }\n\n free(): void {\n this.bindings.freeBytes(this.ptr, this.bindings.typeSize(this.typeName));\n }\n}\n\nexport class GhosttyBindings {\n readonly exports: GhosttyExports;\n readonly layout: LayoutMap;\n\n private readonly decoder = new TextDecoder();\n private readonly encoder = new TextEncoder();\n\n constructor(exports: GhosttyExports, layout: LayoutMap) {\n this.exports = exports;\n this.layout = layout;\n }\n\n buffer(): ArrayBuffer {\n return this.exports.memory.buffer;\n }\n\n bytes(ptr = 0, len = this.buffer().byteLength - ptr): Uint8Array {\n return new Uint8Array(this.buffer(), ptr, len);\n }\n\n view(ptr = 0, len = this.buffer().byteLength - ptr): DataView {\n return new DataView(this.buffer(), ptr, len);\n }\n\n typeSize(typeName: string): number {\n const type = this.layout[typeName];\n if (!type) {\n throw new Error(`unknown ghostty type: ${typeName}`);\n }\n\n return type.size;\n }\n\n field(typeName: string, fieldName: string): LayoutField {\n const type = this.layout[typeName];\n const field = type?.fields[fieldName];\n if (!type || !field) {\n throw new Error(`unknown ghostty field: ${typeName}.${fieldName}`);\n }\n\n return field;\n }\n\n allocStruct(typeName: string): StructAllocation {\n const ptr = this.allocBytes(this.typeSize(typeName));\n this.bytes(ptr, this.typeSize(typeName)).fill(0);\n return new StructAllocation(this, typeName, ptr);\n }\n\n allocBytes(len: number): number {\n return this.exports.ghostty_wasm_alloc_u8_array(len);\n }\n\n freeBytes(ptr: number, len: number): void {\n this.exports.ghostty_wasm_free_u8_array(ptr, len);\n }\n\n allocOpaque(): number {\n return this.exports.ghostty_wasm_alloc_opaque();\n }\n\n freeOpaque(ptr: number): void {\n this.exports.ghostty_wasm_free_opaque(ptr);\n }\n\n allocU8(): number {\n return this.exports.ghostty_wasm_alloc_u8();\n }\n\n freeU8(ptr: number): void {\n this.exports.ghostty_wasm_free_u8(ptr);\n }\n\n allocUsize(): number {\n return this.exports.ghostty_wasm_alloc_usize();\n }\n\n freeUsize(ptr: number): void {\n this.exports.ghostty_wasm_free_usize(ptr);\n }\n\n readPointer(ptr: number): number {\n return this.view().getUint32(ptr, true);\n }\n\n readU8(ptr: number): number {\n return this.view().getUint8(ptr);\n }\n\n readUsize(ptr: number): number {\n if (WASM_USIZE_BYTES === 4) {\n return this.view().getUint32(ptr, true);\n }\n\n return Number(this.view().getBigUint64(ptr, true));\n }\n\n readU64(ptr: number): bigint {\n return this.view().getBigUint64(ptr, true);\n }\n\n setField(target: DataView, typeName: string, fieldName: string, value: number | boolean): void {\n const field = this.field(typeName, fieldName);\n const offset = field.offset;\n\n switch (field.type) {\n case 'u8':\n case 'bool':\n target.setUint8(offset, Number(value));\n return;\n case 'u16':\n target.setUint16(offset, Number(value), true);\n return;\n case 'u32':\n target.setUint32(offset, Number(value), true);\n return;\n case 'u64':\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'usize':\n if (WASM_USIZE_BYTES === 4) {\n target.setUint32(offset, Number(value), true);\n return;\n }\n\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'i32':\n case 'enum':\n target.setInt32(offset, Number(value), true);\n return;\n default:\n throw new Error(`unsupported field type ${typeName}.${fieldName}: ${field.type}`);\n }\n }\n\n writeString(data: string): { ptr: number; len: number; free: () => void } {\n const encoded = this.encoder.encode(data);\n const ptr = this.allocBytes(encoded.length);\n this.bytes(ptr, encoded.length).set(encoded);\n\n return {\n ptr,\n len: encoded.length,\n free: () => this.freeBytes(ptr, encoded.length),\n };\n }\n\n writeBytes(data: Uint8Array): { ptr: number; len: number; free: () => void } {\n const ptr = this.allocBytes(data.length);\n this.bytes(ptr, data.length).set(data);\n\n return {\n ptr,\n len: data.length,\n free: () => this.freeBytes(ptr, data.length),\n };\n }\n\n readOwnedUtf8(ptr: number, len: number): string {\n return this.decoder.decode(this.bytes(ptr, len));\n }\n\n createTerminal(cols: number, rows: number, scrollback: number): number {\n const options = this.allocStruct('GhosttyTerminalOptions');\n this.setField(options.view, 'GhosttyTerminalOptions', 'cols', cols);\n this.setField(options.view, 'GhosttyTerminalOptions', 'rows', rows);\n this.setField(options.view, 'GhosttyTerminalOptions', 'max_scrollback', scrollback);\n\n const termPtrPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_new(0, termPtrPtr, options.ptr),\n 'ghostty_terminal_new'\n );\n return this.readPointer(termPtrPtr);\n } finally {\n options.free();\n this.freeOpaque(termPtrPtr);\n }\n }\n\n freeTerminal(terminal: number): void {\n this.exports.ghostty_terminal_free(terminal);\n }\n\n writeVt(terminal: number, data: string | Uint8Array): void {\n const bytes = typeof data === 'string' ? this.encoder.encode(data) : data;\n const allocation = this.writeBytes(bytes);\n\n try {\n this.exports.ghostty_terminal_vt_write(terminal, allocation.ptr, allocation.len);\n } finally {\n allocation.free();\n }\n }\n\n resetTerminal(terminal: number): void {\n this.exports.ghostty_terminal_reset(terminal);\n }\n\n resizeTerminal(\n terminal: number,\n cols: number,\n rows: number,\n cell: GhosttyCellDimensions\n ): void {\n assertResult(\n this.exports.ghostty_terminal_resize(\n terminal,\n cols,\n rows,\n Math.max(1, Math.round(cell.width)),\n Math.max(1, Math.round(cell.height))\n ),\n 'ghostty_terminal_resize'\n );\n }\n\n scrollViewportDelta(terminal: number, delta: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_DELTA\n );\n behavior.view.setBigInt64(\n this.field('GhosttyTerminalScrollViewport', 'value').offset,\n BigInt(delta),\n true\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportTop(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_TOP\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportBottom(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_BOTTOM\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n setTerminalTheme(terminal: number, theme: GhosttyTheme): void {\n const foreground = this.allocStruct('GhosttyColorRgb');\n const background = this.allocStruct('GhosttyColorRgb');\n const cursor = this.allocStruct('GhosttyColorRgb');\n const paletteColors = createAnsi256Palette(theme);\n const palettePtr = this.allocBytes(paletteColors.length * 3);\n\n const assignRgb = (target: StructAllocation, value: string) => {\n const [red, green, blue] = parseHexRgb(value);\n this.setField(target.view, 'GhosttyColorRgb', 'r', red);\n this.setField(target.view, 'GhosttyColorRgb', 'g', green);\n this.setField(target.view, 'GhosttyColorRgb', 'b', blue);\n };\n\n assignRgb(foreground, theme.foreground);\n assignRgb(background, theme.background);\n assignRgb(cursor, theme.cursor);\n\n const paletteBytes = this.bytes(palettePtr, paletteColors.length * 3);\n paletteColors.forEach(([red, green, blue], index) => {\n const offset = index * 3;\n paletteBytes[offset] = red;\n paletteBytes[offset + 1] = green;\n paletteBytes[offset + 2] = blue;\n });\n\n try {\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND,\n foreground.ptr\n ),\n 'ghostty_terminal_set(foreground)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND,\n background.ptr\n ),\n 'ghostty_terminal_set(background)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(terminal, GHOSTTY_TERMINAL_OPT_COLOR_CURSOR, cursor.ptr),\n 'ghostty_terminal_set(cursor)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_PALETTE,\n palettePtr\n ),\n 'ghostty_terminal_set(palette)'\n );\n } finally {\n foreground.free();\n background.free();\n cursor.free();\n this.freeBytes(palettePtr, paletteColors.length * 3);\n }\n }\n\n readTerminalSize(terminal: number): { cols: number; rows: number } {\n const colsPtr = this.allocBytes(2);\n const rowsPtr = this.allocBytes(2);\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_COLS, colsPtr),\n 'ghostty_terminal_get(cols)'\n );\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_ROWS, rowsPtr),\n 'ghostty_terminal_get(rows)'\n );\n return {\n cols: this.view().getUint16(colsPtr, true),\n rows: this.view().getUint16(rowsPtr, true),\n };\n } finally {\n this.freeBytes(colsPtr, 2);\n this.freeBytes(rowsPtr, 2);\n }\n }\n\n readScrollbar(terminal: number): { total: number; offset: number; len: number } {\n const scrollbar = this.allocStruct('GhosttyTerminalScrollbar');\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_SCROLLBAR, scrollbar.ptr),\n 'ghostty_terminal_get(scrollbar)'\n );\n\n return {\n total: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'total').offset,\n true\n )\n ),\n offset: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'offset').offset,\n true\n )\n ),\n len: Number(\n scrollbar.view.getBigUint64(this.field('GhosttyTerminalScrollbar', 'len').offset, true)\n ),\n };\n } finally {\n scrollbar.free();\n }\n }\n\n isTerminalModeEnabled(terminal: number, mode: number): boolean {\n const valuePtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_mode_get(terminal, mode, valuePtr),\n 'ghostty_terminal_mode_get'\n );\n return this.readU8(valuePtr) !== 0;\n } finally {\n this.freeU8(valuePtr);\n }\n }\n\n setTerminalMode(terminal: number, mode: number, enabled: boolean): void {\n assertResult(\n this.exports.ghostty_terminal_mode_set(terminal, mode, enabled ? 1 : 0),\n 'ghostty_terminal_mode_set'\n );\n }\n\n createFormatter(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean; selectionPtr?: number | null }\n ): number {\n const formatterOptions = this.allocStruct('GhosttyFormatterTerminalOptions');\n const extraOffset = this.field('GhosttyFormatterTerminalOptions', 'extra').offset;\n const extraView = this.view(\n formatterOptions.ptr + extraOffset,\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n const screenOffset = this.field('GhosttyFormatterTerminalExtra', 'screen').offset;\n const screenView = this.view(\n formatterOptions.ptr + extraOffset + screenOffset,\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const outFormatterPtr = this.allocOpaque();\n\n try {\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'size',\n this.typeSize('GhosttyFormatterTerminalOptions')\n );\n this.setField(formatterOptions.view, 'GhosttyFormatterTerminalOptions', 'emit', emit);\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'unwrap',\n options.unwrap\n );\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'trim',\n options.trim\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'size',\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'palette',\n options.includePalette\n );\n this.setField(\n screenView,\n 'GhosttyFormatterScreenExtra',\n 'size',\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const selectionOffset = this.field('GhosttyFormatterTerminalOptions', 'selection').offset;\n formatterOptions.view.setUint32(selectionOffset, options.selectionPtr ?? 0, true);\n\n assertResult(\n this.exports.ghostty_formatter_terminal_new(\n 0,\n outFormatterPtr,\n terminal,\n formatterOptions.ptr\n ),\n 'ghostty_formatter_terminal_new'\n );\n\n return this.readPointer(outFormatterPtr);\n } finally {\n formatterOptions.free();\n this.freeOpaque(outFormatterPtr);\n }\n }\n\n freeFormatter(formatter: number): void {\n this.exports.ghostty_formatter_free(formatter);\n }\n\n private resolveViewportGridRef(\n terminal: number,\n x: number,\n y: number\n ): StructAllocation | null {\n const point = this.allocStruct('GhosttyPoint');\n const outRef = this.allocStruct('GhosttyGridRef');\n\n try {\n this.setField(point.view, 'GhosttyPoint', 'tag', GHOSTTY_POINT_TAG_VIEWPORT);\n const coordOffset = this.field('GhosttyPoint', 'value').offset;\n const coordView = this.view(\n point.ptr + coordOffset,\n this.typeSize('GhosttyPointCoordinate')\n );\n this.setField(coordView, 'GhosttyPointCoordinate', 'x', x);\n this.setField(coordView, 'GhosttyPointCoordinate', 'y', y);\n\n const result = this.exports.ghostty_terminal_grid_ref(terminal, point.ptr, outRef.ptr);\n if (result !== GHOSTTY_SUCCESS) {\n outRef.free();\n return null;\n }\n\n return outRef;\n } finally {\n point.free();\n }\n }\n\n private createViewportSelection(\n terminal: number,\n cols: number,\n rows: number\n ): StructAllocation | null {\n const safeCols = Math.max(1, Math.floor(cols));\n const safeRows = Math.max(1, Math.floor(rows));\n const start = this.resolveViewportGridRef(terminal, 0, 0);\n if (!start) {\n return null;\n }\n\n let end: StructAllocation | null = null;\n for (let row = safeRows - 1; row >= 0; row -= 1) {\n end = this.resolveViewportGridRef(terminal, safeCols - 1, row);\n if (end) {\n break;\n }\n }\n\n if (!end) {\n start.free();\n return null;\n }\n\n const selection = this.allocStruct('GhosttySelection');\n try {\n this.setField(selection.view, 'GhosttySelection', 'size', this.typeSize('GhosttySelection'));\n this.setField(selection.view, 'GhosttySelection', 'rectangle', false);\n\n const startOffset = this.field('GhosttySelection', 'start').offset;\n const endOffset = this.field('GhosttySelection', 'end').offset;\n this.bytes(selection.ptr + startOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(start.ptr, this.typeSize('GhosttyGridRef'))\n );\n this.bytes(selection.ptr + endOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(end.ptr, this.typeSize('GhosttyGridRef'))\n );\n\n return selection;\n } finally {\n start.free();\n end.free();\n }\n }\n\n formatViewport(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean },\n viewport: { cols: number; rows: number }\n ): string {\n const terminalSize = this.readTerminalSize(terminal);\n const selection = this.createViewportSelection(\n terminal,\n Math.max(1, Math.min(terminalSize.cols, viewport.cols)),\n Math.max(1, Math.min(terminalSize.rows, viewport.rows))\n );\n const formatter = this.createFormatter(terminal, emit, {\n ...options,\n selectionPtr: selection?.ptr ?? null,\n });\n\n try {\n return this.formatFormatter(formatter);\n } finally {\n this.freeFormatter(formatter);\n selection?.free();\n }\n }\n\n formatFormatter(formatter: number): string {\n const outPtrPtr = this.allocOpaque();\n const outLenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_formatter_format_alloc(formatter, 0, outPtrPtr, outLenPtr),\n 'ghostty_formatter_format_alloc'\n );\n\n const outPtr = this.readPointer(outPtrPtr);\n const outLen = this.readUsize(outLenPtr);\n const memoryByteLength = this.buffer().byteLength;\n\n try {\n if (outLen === 0 || outPtr === 0) {\n return '';\n }\n\n if (outPtr < 0 || outPtr > memoryByteLength || outLen > memoryByteLength - outPtr) {\n throw new Error(\n `ghostty_formatter_format_alloc returned invalid slice ptr=${outPtr} len=${outLen} mem=${memoryByteLength}`\n );\n }\n\n return this.readOwnedUtf8(outPtr, outLen);\n } finally {\n if (outLen > 0 && outPtr !== 0) {\n this.exports.ghostty_free(0, outPtr, outLen);\n }\n }\n } finally {\n this.freeOpaque(outPtrPtr);\n this.freeUsize(outLenPtr);\n }\n }\n\n createRenderState(): number {\n const outStatePtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_render_state_new(0, outStatePtr), 'ghostty_render_state_new');\n return this.readPointer(outStatePtr);\n } finally {\n this.freeOpaque(outStatePtr);\n }\n }\n\n freeRenderState(state: number): void {\n this.exports.ghostty_render_state_free(state);\n }\n\n updateRenderState(state: number, terminal: number): void {\n assertResult(\n this.exports.ghostty_render_state_update(state, terminal),\n 'ghostty_render_state_update'\n );\n }\n\n getRenderStateValueResult(state: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_get(state, data, outPtr);\n }\n\n getRenderStateValue(state: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateValueResult(state, data, outPtr), 'ghostty_render_state_get');\n }\n\n setRenderStateValue(state: number, option: number, valuePtr: number): void {\n assertResult(this.exports.ghostty_render_state_set(state, option, valuePtr), 'ghostty_render_state_set');\n }\n\n getRenderStateColors(state: number, outColorsPtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_colors_get(state, outColorsPtr),\n 'ghostty_render_state_colors_get'\n );\n }\n\n createRenderStateRowIterator(): number {\n const outIteratorPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_iterator_new(0, outIteratorPtr),\n 'ghostty_render_state_row_iterator_new'\n );\n return this.readPointer(outIteratorPtr);\n } finally {\n this.freeOpaque(outIteratorPtr);\n }\n }\n\n freeRenderStateRowIterator(iterator: number): void {\n this.exports.ghostty_render_state_row_iterator_free(iterator);\n }\n\n bindRenderStateRowIterator(state: number, iterator: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, iterator, true);\n this.getRenderStateValue(state, 4, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowIterator(iterator: number): boolean {\n return this.exports.ghostty_render_state_row_iterator_next(iterator) !== 0;\n }\n\n getRenderStateRowValueResult(iterator: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_get(iterator, data, outPtr);\n }\n\n getRenderStateRowValue(iterator: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateRowValueResult(iterator, data, outPtr), 'ghostty_render_state_row_get');\n }\n\n setRenderStateRowValue(iterator: number, option: number, valuePtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_set(iterator, option, valuePtr),\n 'ghostty_render_state_row_set'\n );\n }\n\n createRenderStateRowCells(): number {\n const outCellsPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_cells_new(0, outCellsPtr),\n 'ghostty_render_state_row_cells_new'\n );\n return this.readPointer(outCellsPtr);\n } finally {\n this.freeOpaque(outCellsPtr);\n }\n }\n\n freeRenderStateRowCells(cells: number): void {\n this.exports.ghostty_render_state_row_cells_free(cells);\n }\n\n bindRenderStateRowCells(iterator: number, cells: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, cells, true);\n this.getRenderStateRowValue(iterator, 3, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowCell(cells: number): boolean {\n return this.exports.ghostty_render_state_row_cells_next(cells) !== 0;\n }\n\n selectRenderStateRowCell(cells: number, x: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_cells_select(cells, x),\n 'ghostty_render_state_row_cells_select'\n );\n }\n\n getRenderStateRowCellValueResult(cells: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_cells_get(cells, data, outPtr);\n }\n\n getRenderStateRowCellValue(cells: number, data: number, outPtr: number): void {\n assertResult(\n this.getRenderStateRowCellValueResult(cells, data, outPtr),\n 'ghostty_render_state_row_cells_get'\n );\n }\n\n getRawRowValueResult(row: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_row_get(row, data, outPtr);\n }\n\n getRawRowValue(row: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawRowValueResult(row, data, outPtr), 'ghostty_row_get');\n }\n\n getRawCellValueResult(cell: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_cell_get(cell, data, outPtr);\n }\n\n getRawCellValue(cell: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawCellValueResult(cell, data, outPtr), 'ghostty_cell_get');\n }\n\n createKeyEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_key_encoder_new(0, outEncoderPtr), 'ghostty_key_encoder_new');\n return this.readPointer(outEncoderPtr);\n } finally {\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeKeyEncoder(encoder: number): void {\n this.exports.ghostty_key_encoder_free(encoder);\n }\n\n createMouseEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n const trackLastCellPtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_mouse_encoder_new(0, outEncoderPtr),\n 'ghostty_mouse_encoder_new'\n );\n const encoder = this.readPointer(outEncoderPtr);\n this.view().setUint8(trackLastCellPtr, 1);\n this.exports.ghostty_mouse_encoder_setopt(\n encoder,\n GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL,\n trackLastCellPtr\n );\n return encoder;\n } finally {\n this.freeU8(trackLastCellPtr);\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_free(encoder);\n }\n\n resetMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_reset(encoder);\n }\n\n encodeMouseEvent(\n encoder: number,\n terminal: number,\n options: GhosttyMouseEncodeOptions\n ): string | null {\n void encoder;\n\n const trackingAny = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_ANY_MOUSE);\n const trackingButton = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BUTTON_MOUSE);\n const trackingNormal = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_NORMAL_MOUSE);\n const trackingX10 = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_X10_MOUSE);\n\n if (!trackingAny && !trackingButton && !trackingNormal && !trackingX10) {\n return null;\n }\n\n if (options.action === 'motion' && !(trackingAny || (trackingButton && options.anyButtonPressed))) {\n return null;\n }\n\n if (trackingX10 && options.action !== 'press') {\n return null;\n }\n\n if (!trackingAny && !trackingButton && !trackingX10 && options.action === 'motion') {\n return null;\n }\n\n const baseCode = mouseButtonCode(options.button);\n if (baseCode === null) {\n return null;\n }\n\n const column = Math.max(1, Math.floor(options.x / Math.max(1, options.cellWidth)) + 1);\n const row = Math.max(1, Math.floor(options.y / Math.max(1, options.cellHeight)) + 1);\n const pixelX = Math.round(options.x + 1);\n const pixelY = Math.round(options.y + 1);\n\n let code =\n options.action === 'release' &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE) &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)\n ? 3\n : baseCode;\n\n if (options.action === 'motion') {\n code += 32;\n }\n\n code += encodeMouseModifierBits(options.mods);\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${pixelX};${pixelY}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${column};${row}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_URXVT_MOUSE)) {\n return `\\u001b[${code};${column};${row}M`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_UTF8_MOUSE) || trackingNormal || trackingButton || trackingAny || trackingX10) {\n const encodedCode = encodeX10Byte(code);\n const encodedColumn = encodeX10Byte(column);\n const encodedRow = encodeX10Byte(row);\n if (!encodedCode || !encodedColumn || !encodedRow) {\n return null;\n }\n return `\\u001b[M${encodedCode}${encodedColumn}${encodedRow}`;\n }\n\n return null;\n }\n\n encodeKeyEvent(\n encoder: number,\n terminal: number,\n options: {\n action: 'press' | 'repeat' | 'release';\n keyCode: number;\n mods: number;\n composing: boolean;\n utf8?: string | null;\n unshiftedCodepoint?: number | null;\n }\n ): string | null {\n if (options.keyCode <= 0) {\n return null;\n }\n\n const eventPtrPtr = this.allocOpaque();\n let eventHandle = 0;\n let utf8Allocation: { ptr: number; len: number; free: () => void } | null = null;\n\n try {\n assertResult(this.exports.ghostty_key_event_new(0, eventPtrPtr), 'ghostty_key_event_new');\n eventHandle = this.readPointer(eventPtrPtr);\n this.exports.ghostty_key_encoder_setopt_from_terminal(encoder, terminal);\n this.exports.ghostty_key_event_set_action(\n eventHandle,\n options.action === 'release'\n ? GHOSTTY_KEY_ACTION_RELEASE\n : options.action === 'repeat'\n ? GHOSTTY_KEY_ACTION_REPEAT\n : GHOSTTY_KEY_ACTION_PRESS\n );\n this.exports.ghostty_key_event_set_key(eventHandle, options.keyCode);\n this.exports.ghostty_key_event_set_mods(eventHandle, options.mods);\n this.exports.ghostty_key_event_set_consumed_mods(eventHandle, 0);\n this.exports.ghostty_key_event_set_composing(eventHandle, options.composing ? 1 : 0);\n\n if (options.utf8) {\n utf8Allocation = this.writeString(options.utf8);\n this.exports.ghostty_key_event_set_utf8(\n eventHandle,\n utf8Allocation.ptr,\n utf8Allocation.len\n );\n }\n\n if (typeof options.unshiftedCodepoint === 'number') {\n this.exports.ghostty_key_event_set_unshifted_codepoint(\n eventHandle,\n options.unshiftedCodepoint\n );\n }\n\n return this.encodeKeyHandle(encoder, eventHandle);\n } finally {\n utf8Allocation?.free();\n if (eventHandle !== 0) {\n this.exports.ghostty_key_event_free(eventHandle);\n }\n this.freeOpaque(eventPtrPtr);\n }\n }\n\n private encodeKeyHandle(encoder: number, eventHandle: number): string | null {\n const requiredPtr = this.allocUsize();\n\n try {\n const sizeResult = this.exports.ghostty_key_encoder_encode(encoder, eventHandle, 0, 0, requiredPtr);\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_key_encoder_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return null;\n }\n\n const bufferPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_key_encoder_encode(\n encoder,\n eventHandle,\n bufferPtr,\n required,\n writtenPtr\n ),\n 'ghostty_key_encoder_encode'\n );\n\n const written = this.readUsize(writtenPtr);\n if (written === 0) {\n return null;\n }\n\n return this.readOwnedUtf8(bufferPtr, written);\n } finally {\n this.freeBytes(bufferPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n this.freeUsize(requiredPtr);\n }\n }\n\n encodePaste(terminal: number, data: string): string {\n const input = this.writeString(data);\n const requiredPtr = this.allocUsize();\n\n try {\n const bracketed = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BRACKETED_PASTE);\n const sizeResult = this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n 0,\n 0,\n requiredPtr\n );\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_paste_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return '';\n }\n\n const outputPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n outputPtr,\n required,\n writtenPtr\n ),\n 'ghostty_paste_encode'\n );\n\n return this.readOwnedUtf8(outputPtr, this.readUsize(writtenPtr));\n } finally {\n this.freeBytes(outputPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n input.free();\n this.freeUsize(requiredPtr);\n }\n }\n}\n\nasync function loadGhosttyWasmBytes(source: string): Promise<ArrayBuffer> {\n const isFilePath =\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../') ||\n /^[A-Za-z]:[\\\\/]/.test(source);\n\n if (isFilePath && typeof Bun !== 'undefined') {\n return Bun.file(source).arrayBuffer();\n }\n\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`failed to load ghostty wasm: ${response.status} ${response.statusText}`);\n }\n\n return response.arrayBuffer();\n}\n\nexport async function getGhosttyBindings(): Promise<GhosttyBindings> {\n if (!bindingsPromise) {\n bindingsPromise = (async () => {\n const wasmBytes = await loadGhosttyWasmBytes(ghosttyWasmUrl);\n const wasmModule = await WebAssembly.instantiate(wasmBytes, {\n env: {\n log() {\n // ignore wasm logs in production usage\n },\n },\n });\n\n const exports = wasmModule.instance.exports as GhosttyExports;\n const bytes = new Uint8Array(exports.memory.buffer);\n const typeJsonPtr = exports.ghostty_type_json();\n let end = typeJsonPtr;\n\n while (bytes[end] !== 0) {\n end += 1;\n }\n\n const layout = JSON.parse(\n new TextDecoder().decode(bytes.subarray(typeJsonPtr, end))\n ) as LayoutMap;\n\n return new GhosttyBindings(exports, layout);\n })();\n }\n\n return bindingsPromise;\n}\n\nexport {\n GHOSTTY_FORMATTER_FORMAT_HTML,\n GHOSTTY_FORMATTER_FORMAT_PLAIN,\n GHOSTTY_KEY_ACTION_PRESS,\n GHOSTTY_KEY_ACTION_RELEASE,\n GHOSTTY_KEY_ACTION_REPEAT,\n};\n","import { CanvasRenderer } from './canvas-renderer';\nimport { getGhosttyKeyCode, getUnshiftedCodepoint } from './ghostty-keycodes';\nimport {\n createRenderState,\n disposeRenderStateResources,\n iterateRows,\n readRenderSnapshotMeta,\n updateRenderState,\n type GhosttyRenderStateResources,\n} from './render-state';\nimport {\n clearSelection as resetSelectionData,\n createEmptySelectionState,\n hasSelection,\n projectSelectionRects,\n resolvePointerSelection,\n serializeSelectionText,\n updateSelectionFocus,\n type SelectionMode,\n type SelectionPoint,\n type SelectionState,\n} from './selection-model';\nimport {\n isCopyShortcut,\n writeSelectionToClipboard,\n writeSelectionToCopyEvent,\n} from './selection-clipboard';\nimport {\n getGhosttyBindings,\n keyboardEventToGhosttyMods,\n type GhosttyBindings,\n} from './ghostty-wasm';\nimport type {\n CompatibleBufferLine,\n CompatibleTerminalBuffer,\n CompatibleTerminalLike,\n GhosttyCellDimensions,\n GhosttyRenderRow,\n GhosttyTerminalModeSnapshot,\n GhosttyTerminalInitOptions,\n GhosttyTerminalSize,\n GhosttyViewportGesture,\n TerminalDisposable,\n} from './types';\n\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\nconst DEFAULT_CELL_WIDTH = 9;\nconst DEFAULT_CELL_HEIGHT = 17;\nconst AUTO_SCROLL_INTERVAL_MS = 48;\nconst TERMINAL_ENGINE = 'ghostty-official';\n\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_ALT_SCROLL = 1007;\nconst GHOSTTY_MODE_ALT_SCREEN = 1047;\nconst GHOSTTY_MODE_ALT_SCREEN_SAVE = 1049;\n\nconst MOUSE_TRACKING_MODES: readonly number[] = [\n GHOSTTY_MODE_X10_MOUSE,\n GHOSTTY_MODE_NORMAL_MOUSE,\n GHOSTTY_MODE_BUTTON_MOUSE,\n GHOSTTY_MODE_ANY_MOUSE,\n];\n\nconst GHOSTTY_MOUSE_BUTTON_LEFT = 1;\nconst GHOSTTY_MOUSE_BUTTON_MIDDLE = 3;\nconst GHOSTTY_MOUSE_BUTTON_RIGHT = 2;\nconst GHOSTTY_MOUSE_BUTTON_FOUR = 4;\nconst GHOSTTY_MOUSE_BUTTON_FIVE = 5;\n\ntype PointerDragState = {\n active: boolean;\n moved: boolean;\n mode: SelectionMode;\n lastClientX: number | null;\n lastClientY: number | null;\n};\n\ntype InputRoutingState = {\n mouseReporting: boolean;\n altScroll: boolean;\n};\n\nclass BufferLine implements CompatibleBufferLine {\n constructor(private readonly content: string) {}\n\n translateToString(trimRight: boolean): string {\n return trimRight ? this.content.replace(/\\s+$/u, '') : this.content;\n }\n}\n\nclass TerminalBuffer implements CompatibleTerminalBuffer {\n active = {\n baseY: 0,\n viewportY: 0,\n length: DEFAULT_ROWS,\n getLine: (index: number): CompatibleBufferLine | null => {\n const relativeIndex = index - this.active.viewportY;\n const line = this.visibleLines[relativeIndex];\n return typeof line === 'string' ? new BufferLine(line) : null;\n },\n };\n\n private visibleLines: string[] = Array.from({ length: DEFAULT_ROWS }, () => '');\n\n setViewport(viewportY: number, baseY: number, length: number, lines: string[]): void {\n this.active.viewportY = viewportY;\n this.active.baseY = baseY;\n this.active.length = length;\n this.visibleLines = lines;\n }\n}\n\nfunction shouldEncodeOnKeyDown(event: KeyboardEvent): boolean {\n const isPlainText = event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey;\n if (isPlainText) {\n return false;\n }\n\n return true;\n}\n\nfunction normalizeVisibleLines(rows: GhosttyRenderRow[], expectedRows: number): string[] {\n const lines = rows.slice(0, expectedRows).map((row) => row.text);\n while (lines.length < expectedRows) {\n lines.push('');\n }\n return lines;\n}\n\nfunction pointerLikeEventToGhosttyMods(event: {\n shiftKey?: boolean;\n ctrlKey?: boolean;\n altKey?: boolean;\n metaKey?: boolean;\n}): number {\n return keyboardEventToGhosttyMods({\n shiftKey: Boolean(event.shiftKey),\n ctrlKey: Boolean(event.ctrlKey),\n altKey: Boolean(event.altKey),\n metaKey: Boolean(event.metaKey),\n getModifierState: () => false,\n } as unknown as KeyboardEvent);\n}\n\nexport class FitAddon {\n private terminal: GhosttyTerminalController | null = null;\n\n activate(terminal: CompatibleTerminalLike): void {\n this.terminal = terminal instanceof GhosttyTerminalController ? terminal : null;\n }\n\n fit(): void {\n const proposed = this.proposeDimensions();\n if (!this.terminal || !proposed) {\n return;\n }\n\n this.terminal.resize(proposed.cols, proposed.rows);\n }\n\n proposeDimensions(): GhosttyTerminalSize | null {\n return this.terminal?.measureSizeFromElement() ?? null;\n }\n\n dispose(): void {\n this.terminal = null;\n }\n}\n\nexport class GhosttyTerminalController implements CompatibleTerminalLike {\n readonly buffer = new TerminalBuffer();\n readonly _core = {\n _renderService: {\n dimensions: {\n css: {\n cell: {\n width: DEFAULT_CELL_WIDTH,\n height: DEFAULT_CELL_HEIGHT,\n },\n },\n },\n },\n };\n\n readonly options: GhosttyTerminalInitOptions;\n\n element: HTMLElement | null = null;\n textarea: HTMLElement | null = null;\n cols = DEFAULT_COLS;\n rows = DEFAULT_ROWS;\n\n private readonly bindings: GhosttyBindings;\n private readonly terminalHandle: number;\n private readonly keyEncoderHandle: number;\n private readonly mouseEncoderHandle: number;\n private readonly renderState: GhosttyRenderStateResources;\n private readonly dataListeners = new Set<(data: string) => void>();\n private readonly addons = new Set<{ dispose: () => void }>();\n private screenElement: HTMLDivElement | null = null;\n private renderer: CanvasRenderer | null = null;\n private renderRaf: number | null = null;\n private disposed = false;\n private disableStdin: boolean;\n private customKeyEventHandler: (event: KeyboardEvent) => boolean = () => true;\n private imeIsComposing = false;\n private lastCompositionCommit: { data: string; at: number } | null = null;\n private selectionState: SelectionState = createEmptySelectionState();\n private readonly lineCache = new Map<number, string>();\n private lastViewportOffset = 0;\n private lastViewportRows = DEFAULT_ROWS;\n private lastRenderedRows: GhosttyRenderRow[] = [];\n private pointerDrag: PointerDragState = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n private autoScrollTimer: ReturnType<typeof setInterval> | null = null;\n private readonly domEventDisposers: Array<() => void> = [];\n private copyShortcutSuppressed = false;\n private scrollbarThumb: HTMLDivElement | null = null;\n private scrollbarFadeTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly pressedMouseButtons = new Set<number>();\n private wheelPixelDelta = 0;\n private mouseDragActive = false;\n\n private constructor(\n bindings: GhosttyBindings,\n terminalHandle: number,\n keyEncoderHandle: number,\n mouseEncoderHandle: number,\n renderState: GhosttyRenderStateResources,\n options: GhosttyTerminalInitOptions\n ) {\n this.bindings = bindings;\n this.terminalHandle = terminalHandle;\n this.keyEncoderHandle = keyEncoderHandle;\n this.mouseEncoderHandle = mouseEncoderHandle;\n this.renderState = renderState;\n this.options = options;\n this.disableStdin = Boolean(options.disableStdin);\n }\n\n static async create(options: GhosttyTerminalInitOptions): Promise<GhosttyTerminalController> {\n const bindings = await getGhosttyBindings();\n const terminalHandle = bindings.createTerminal(DEFAULT_COLS, DEFAULT_ROWS, options.scrollback);\n let keyEncoderHandle = 0;\n let mouseEncoderHandle = 0;\n let renderState: GhosttyRenderStateResources | null = null;\n\n try {\n bindings.setTerminalTheme(terminalHandle, options.theme);\n keyEncoderHandle = bindings.createKeyEncoder();\n mouseEncoderHandle = bindings.createMouseEncoder();\n renderState = createRenderState(bindings);\n\n return new GhosttyTerminalController(\n bindings,\n terminalHandle,\n keyEncoderHandle,\n mouseEncoderHandle,\n renderState,\n options\n );\n } catch (error) {\n if (renderState) {\n disposeRenderStateResources(renderState);\n }\n if (keyEncoderHandle !== 0) {\n bindings.freeKeyEncoder(keyEncoderHandle);\n }\n if (mouseEncoderHandle !== 0) {\n bindings.freeMouseEncoder(mouseEncoderHandle);\n }\n bindings.freeTerminal(terminalHandle);\n throw error;\n }\n }\n\n open(container: HTMLElement): void {\n if (this.disposed || this.element) {\n return;\n }\n\n const root = document.createElement('div');\n root.className = 'xterm';\n root.style.position = 'absolute';\n root.style.inset = '0';\n root.style.overflow = 'hidden';\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.backgroundColor = this.options.theme.background;\n root.style.color = this.options.theme.foreground;\n root.style.fontFamily = this.options.fontFamily;\n root.style.fontSize = `${this.options.fontSize}px`;\n root.style.lineHeight = '1.2';\n\n const viewport = document.createElement('div');\n viewport.className = 'xterm-viewport';\n viewport.style.width = '100%';\n viewport.style.height = '100%';\n viewport.style.overflow = 'hidden';\n viewport.style.position = 'relative';\n\n const screen = document.createElement('div');\n screen.className = 'xterm-screen';\n screen.style.width = '100%';\n screen.style.height = '100%';\n screen.style.position = 'relative';\n screen.style.userSelect = 'none';\n screen.style.webkitUserSelect = 'none';\n screen.style.backgroundColor = this.options.theme.background;\n\n const textarea = document.createElement('div');\n textarea.className = 'xterm-helper-textarea';\n textarea.setAttribute('aria-label', 'Terminal Input');\n textarea.setAttribute('role', 'textbox');\n textarea.setAttribute('contenteditable', 'true');\n textarea.setAttribute('autocorrect', 'off');\n textarea.setAttribute('autocapitalize', 'off');\n textarea.setAttribute('spellcheck', 'false');\n textarea.style.position = 'absolute';\n textarea.style.opacity = '1';\n textarea.style.pointerEvents = 'none';\n textarea.style.left = '0';\n textarea.style.top = '0';\n textarea.style.minWidth = '1px';\n textarea.style.minHeight = '1px';\n textarea.style.whiteSpace = 'pre';\n textarea.style.border = '0';\n textarea.style.padding = '0';\n textarea.style.margin = '0';\n textarea.style.color = this.options.theme.foreground;\n textarea.style.backgroundColor = 'transparent';\n textarea.style.caretColor = 'transparent';\n textarea.style.overflow = 'visible';\n textarea.style.outline = 'none';\n textarea.style.boxShadow = 'none';\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n textarea.style.userSelect = 'text';\n textarea.style.webkitUserSelect = 'text';\n\n const scrollbarTrack = document.createElement('div');\n scrollbarTrack.className = 'xterm-scrollbar-track';\n scrollbarTrack.style.position = 'absolute';\n scrollbarTrack.style.top = '0';\n scrollbarTrack.style.right = '0';\n scrollbarTrack.style.width = '8px';\n scrollbarTrack.style.height = '100%';\n scrollbarTrack.style.backgroundColor = 'transparent';\n scrollbarTrack.style.pointerEvents = 'none';\n\n const scrollbarThumb = document.createElement('div');\n scrollbarThumb.className = 'xterm-scrollbar-thumb';\n scrollbarThumb.style.position = 'absolute';\n scrollbarThumb.style.top = '0';\n scrollbarThumb.style.right = '0';\n scrollbarThumb.style.width = '6px';\n scrollbarThumb.style.marginRight = '1px';\n scrollbarThumb.style.borderRadius = '3px';\n scrollbarThumb.style.backgroundColor = 'rgba(128, 128, 128, 0.5)';\n scrollbarThumb.style.pointerEvents = 'none';\n scrollbarThumb.style.transition = 'opacity 0.15s ease';\n scrollbarThumb.style.opacity = '0';\n\n scrollbarTrack.appendChild(scrollbarThumb);\n\n viewport.appendChild(screen);\n root.appendChild(viewport);\n root.appendChild(textarea);\n root.appendChild(scrollbarTrack);\n container.appendChild(root);\n\n this.element = root;\n this.screenElement = screen;\n this.textarea = textarea;\n this.scrollbarThumb = scrollbarThumb;\n this.renderer = new CanvasRenderer({\n screenElement: screen,\n theme: this.options.theme,\n fontFamily: this.options.fontFamily,\n fontSize: this.options.fontSize,\n });\n\n this.syncInputState();\n this.bindDomEvents();\n this.updateCellDimensions();\n\n const measured = this.measureSizeFromElement();\n if (measured) {\n this.resize(measured.cols, measured.rows);\n } else {\n this.render();\n }\n }\n\n loadAddon(addon: { activate: (terminal: CompatibleTerminalLike) => void; dispose: () => void }): void {\n addon.activate(this);\n this.addons.add(addon);\n }\n\n onData(callback: (data: string) => void): TerminalDisposable {\n this.dataListeners.add(callback);\n return {\n dispose: () => {\n this.dataListeners.delete(callback);\n },\n };\n }\n\n attachCustomKeyEventHandler(callback: (event: KeyboardEvent) => boolean): void {\n this.customKeyEventHandler = callback;\n }\n\n write(data: string | Uint8Array): void {\n if (this.disposed) {\n return;\n }\n\n const prevAltScreen = this.isAltScreenActive();\n this.bindings.writeVt(this.terminalHandle, data);\n const nextAltScreen = this.isAltScreenActive();\n if (prevAltScreen && !nextAltScreen) {\n this.clearMouseTrackingModes();\n }\n this.scheduleRender();\n }\n\n clearMouseTrackingModes(): void {\n if (this.disposed) {\n return;\n }\n for (const mode of MOUSE_TRACKING_MODES) {\n this.bindings.setTerminalMode(this.terminalHandle, mode, false);\n }\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.pressedMouseButtons.clear();\n this.mouseDragActive = false;\n }\n\n private isAltScreenActive(): boolean {\n return (\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE)\n );\n }\n\n reset(): void {\n if (this.disposed) {\n return;\n }\n\n this.lineCache.clear();\n this.clearSelectionState(false);\n this.bindings.resetTerminal(this.terminalHandle);\n this.scheduleRender();\n }\n\n refresh(): void {\n if (this.disposed) {\n return;\n }\n\n this.render();\n }\n\n resize(cols: number, rows: number): void {\n if (this.disposed) {\n return;\n }\n\n const nextCols = Math.max(2, Math.floor(cols));\n const nextRows = Math.max(2, Math.floor(rows));\n this.cols = nextCols;\n this.rows = nextRows;\n this.clearSelectionState(false);\n this.bindings.resizeTerminal(this.terminalHandle, nextCols, nextRows, this.cellDimensions());\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.scheduleRender();\n }\n\n scrollLines(amount: number): void {\n if (this.disposed || amount === 0) {\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, amount);\n this.render();\n }\n\n scrollToTop(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportTop(this.terminalHandle);\n this.render();\n }\n\n scrollToBottom(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportBottom(this.terminalHandle);\n this.render();\n }\n\n exportModeSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE),\n mouseNormal: this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE),\n mouseButton: this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE),\n mouseAny: this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE),\n mouseUtf8: this.isModeEnabled(1005),\n mouseSgr: this.isModeEnabled(1006),\n mouseSgrPixels: this.isModeEnabled(1016),\n mouseUrxvt: this.isModeEnabled(1015),\n altScroll: this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n altScreen1047: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN),\n altScreen1049: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE),\n };\n }\n\n restoreModeSnapshot(snapshot: GhosttyTerminalModeSnapshot): void {\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_X10_MOUSE, snapshot.mouseX10);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_NORMAL_MOUSE, snapshot.mouseNormal);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_BUTTON_MOUSE, snapshot.mouseButton);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ANY_MOUSE, snapshot.mouseAny);\n this.bindings.setTerminalMode(this.terminalHandle, 1005, snapshot.mouseUtf8);\n this.bindings.setTerminalMode(this.terminalHandle, 1006, snapshot.mouseSgr);\n this.bindings.setTerminalMode(this.terminalHandle, 1016, snapshot.mouseSgrPixels);\n this.bindings.setTerminalMode(this.terminalHandle, 1015, snapshot.mouseUrxvt);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCROLL, snapshot.altScroll);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN, snapshot.altScreen1047);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN_SAVE, snapshot.altScreen1049);\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n }\n\n handleViewportGesture(gesture: GhosttyViewportGesture): boolean {\n if (this.disposed || gesture.deltaY === 0) {\n return false;\n }\n\n const lines = this.gestureToLines(gesture);\n if (lines === 0) {\n return false;\n }\n\n const routing = this.getInputRoutingState();\n if (routing.mouseReporting) {\n const button = lines < 0 ? GHOSTTY_MOUSE_BUTTON_FOUR : GHOSTTY_MOUSE_BUTTON_FIVE;\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n consumed =\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: gesture.clientX,\n clientY: gesture.clientY,\n mods: pointerLikeEventToGhosttyMods(gesture),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n }) || consumed;\n }\n return consumed;\n }\n\n if (routing.altScroll) {\n return this.emitAltScrollInput(lines);\n }\n\n this.scrollLines(lines);\n return true;\n }\n\n paste(data: string): void {\n if (this.disposed || this.disableStdin || !data) {\n return;\n }\n\n const encoded = this.bindings.encodePaste(this.terminalHandle, data);\n if (!encoded) {\n return;\n }\n\n this.emitData(encoded);\n }\n\n focus(): void {\n this.textarea?.focus({ preventScroll: true });\n }\n\n getRendererKind(): string {\n return this.renderer?.kind ?? 'unknown';\n }\n\n setTheme(theme: GhosttyTerminalInitOptions['theme']): void {\n this.bindings.setTerminalTheme(this.terminalHandle, theme);\n this.options.theme = theme;\n\n if (this.element) {\n this.element.style.backgroundColor = theme.background;\n this.element.style.color = theme.foreground;\n }\n\n if (this.screenElement) {\n this.screenElement.style.backgroundColor = theme.background;\n }\n\n this.renderer?.setTheme(theme);\n this.scheduleRender();\n }\n\n setDisableStdin(disabled: boolean): void {\n this.disableStdin = disabled;\n this.syncInputState();\n }\n\n measureSizeFromElement(): GhosttyTerminalSize | null {\n const element = this.element;\n if (!element) {\n return null;\n }\n\n const rect = element.getBoundingClientRect();\n const { width, height } = this.cellDimensions();\n if (rect.width === 0 || rect.height === 0 || width <= 0 || height <= 0) {\n return null;\n }\n\n return {\n cols: Math.max(2, Math.floor(rect.width / width)),\n rows: Math.max(2, Math.floor(rect.height / height)),\n };\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (this.renderRaf !== null) {\n cancelAnimationFrame(this.renderRaf);\n this.renderRaf = null;\n }\n\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n this.clearDomEventListeners();\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n this.scrollbarFadeTimer = null;\n }\n\n for (const addon of this.addons) {\n addon.dispose();\n }\n this.addons.clear();\n\n this.renderer?.dispose();\n this.renderer = null;\n\n this.element?.remove();\n this.element = null;\n this.screenElement = null;\n this.textarea = null;\n this.scrollbarThumb = null;\n\n disposeRenderStateResources(this.renderState);\n this.bindings.freeMouseEncoder(this.mouseEncoderHandle);\n this.bindings.freeKeyEncoder(this.keyEncoderHandle);\n this.bindings.freeTerminal(this.terminalHandle);\n }\n\n private cellDimensions(): GhosttyCellDimensions {\n return this._core._renderService.dimensions.css.cell;\n }\n\n private syncInputState(): void {\n if (!this.textarea) {\n return;\n }\n\n (this.textarea as any).readOnly = this.disableStdin;\n this.textarea.tabIndex = this.disableStdin ? -1 : 0;\n if (this.disableStdin && document.activeElement === this.textarea) {\n this.textarea.blur();\n }\n }\n\n private bindDomEvents(): void {\n const root = this.element;\n const textarea = this.textarea;\n if (!root || !textarea) {\n return;\n }\n\n root.addEventListener('click', () => {\n if (!this.disableStdin) {\n this.focus();\n }\n });\n\n const selectSurface = this.screenElement ?? root;\n selectSurface.addEventListener('mousedown', (event) => {\n if (!(event instanceof MouseEvent)) {\n return;\n }\n\n if (!this.disableStdin) {\n this.focus();\n }\n\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button === null) {\n return;\n }\n this.clearSelectionState();\n this.pressedMouseButtons.add(button);\n this.mouseDragActive = true;\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: true,\n });\n event.preventDefault();\n return;\n }\n\n if (event.button !== 0) {\n return;\n }\n\n this.mouseDragActive = true;\n this.beginPointerSelection(event);\n event.preventDefault();\n });\n\n root.addEventListener(\n 'wheel',\n (event) => {\n if (\n this.handleViewportGesture({\n source: 'wheel',\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n altKey: event.altKey,\n metaKey: event.metaKey,\n })\n ) {\n event.preventDefault();\n }\n },\n { passive: false }\n );\n\n const dragEventTarget =\n typeof window !== 'undefined' && typeof window.addEventListener === 'function'\n ? window\n : null;\n if (dragEventTarget) {\n const moveListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n if (this.getInputRoutingState().mouseReporting) {\n this.emitMouseInput({\n action: 'motion',\n button: this.mouseButtonFromButtons(event.buttons),\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0 || event.buttons > 0,\n });\n return;\n }\n this.updatePointerSelection(event);\n };\n const upListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n this.mouseDragActive = false;\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button !== null) {\n this.pressedMouseButtons.delete(button);\n }\n this.emitMouseInput({\n action: 'release',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n });\n return;\n }\n this.finishPointerSelection(event);\n };\n dragEventTarget.addEventListener('mousemove', moveListener);\n dragEventTarget.addEventListener('mouseup', upListener);\n this.domEventDisposers.push(() => {\n dragEventTarget.removeEventListener('mousemove', moveListener);\n dragEventTarget.removeEventListener('mouseup', upListener);\n });\n }\n\n textarea.addEventListener('keydown', (event) => {\n const selectionText = this.getSelectionText();\n if (selectionText && isCopyShortcut(event)) {\n this.copyShortcutSuppressed = true;\n event.preventDefault();\n void writeSelectionToClipboard(selectionText).catch(() => {});\n this.clearTextarea();\n return;\n }\n\n if (!this.customKeyEventHandler(event)) {\n return;\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n if (event.keyCode === 229) {\n return;\n }\n\n if (!shouldEncodeOnKeyDown(event)) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, event.repeat ? 'repeat' : 'press');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('keyup', (event) => {\n if (this.copyShortcutSuppressed) {\n const key = event.key.toLowerCase();\n if (key === 'c') {\n event.preventDefault();\n return;\n }\n\n if (key === 'control' || key === 'meta' || key === 'os') {\n this.copyShortcutSuppressed = false;\n event.preventDefault();\n return;\n }\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, 'release');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('compositionstart', () => {\n this.imeIsComposing = true;\n this.lastCompositionCommit = null;\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionupdate', () => {\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionend', (event) => {\n this.imeIsComposing = false;\n const finalData = event.data ?? '';\n if (finalData) {\n this.lastCompositionCommit = { data: finalData, at: Date.now() };\n this.emitData(finalData);\n this.clearTextarea();\n }\n });\n\n textarea.addEventListener('beforeinput', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n if (event.inputType === 'insertFromPaste') {\n return;\n }\n\n const data = event.data ?? '';\n if (!data) {\n return;\n }\n\n if (event.isComposing || this.imeIsComposing) {\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n event.preventDefault();\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n\n event.preventDefault();\n this.emitData(data);\n this.clearTextarea();\n });\n\n textarea.addEventListener('paste', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n const text = event.clipboardData?.getData('text/plain') ?? '';\n if (!text) {\n return;\n }\n\n event.preventDefault();\n this.paste(text);\n this.clearTextarea();\n });\n\n textarea.addEventListener('copy', (event) => {\n const selectionText = this.getSelectionText();\n if (!selectionText) {\n return;\n }\n\n writeSelectionToCopyEvent(event, selectionText);\n });\n\n textarea.addEventListener('input', () => {\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const data = textarea.textContent ?? '';\n if (!data) {\n this.clearTextarea();\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n this.emitData(data);\n this.clearTextarea();\n });\n }\n\n private encodeKeyboardEvent(\n event: KeyboardEvent,\n action: 'press' | 'repeat' | 'release'\n ): string | null {\n const keyCode = getGhosttyKeyCode(event.code);\n if (keyCode === 0) {\n return null;\n }\n\n const utf8 =\n event.key.length === 1 && !event.ctrlKey && !event.metaKey ? event.key : null;\n\n return this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action,\n keyCode,\n mods: keyboardEventToGhosttyMods(event),\n composing: event.isComposing,\n utf8,\n unshiftedCodepoint: getUnshiftedCodepoint(event.code),\n });\n }\n\n private getInputRoutingState(): InputRoutingState {\n const mouseReporting =\n this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE);\n const altScreen =\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE);\n\n return {\n mouseReporting,\n altScroll: !mouseReporting && altScreen && this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n };\n }\n\n private gestureToLines(gesture: GhosttyViewportGesture): number {\n const cellHeight = this.cellDimensions().height || DEFAULT_CELL_HEIGHT;\n\n if (gesture.source === 'wheel') {\n if (gesture.deltaMode === 1) {\n this.wheelPixelDelta = 0;\n return gesture.deltaY > 0 ? Math.ceil(gesture.deltaY) : Math.floor(gesture.deltaY);\n }\n\n if (gesture.deltaMode === 2) {\n this.wheelPixelDelta = 0;\n const pageLines = Math.max(1, this.rows);\n const scaled = gesture.deltaY * pageLines;\n return scaled > 0 ? Math.ceil(scaled) : Math.floor(scaled);\n }\n\n this.wheelPixelDelta += gesture.deltaY;\n const lines =\n this.wheelPixelDelta > 0\n ? Math.floor(this.wheelPixelDelta / cellHeight)\n : Math.ceil(this.wheelPixelDelta / cellHeight);\n if (lines !== 0) {\n this.wheelPixelDelta -= lines * cellHeight;\n }\n return lines;\n }\n\n return gesture.deltaY > 0\n ? Math.ceil(gesture.deltaY / cellHeight)\n : Math.floor(gesture.deltaY / cellHeight);\n }\n\n private isModeEnabled(mode: number): boolean {\n return this.bindings.isTerminalModeEnabled(this.terminalHandle, mode);\n }\n\n private mouseButtonFromEvent(event: MouseEvent): number | null {\n switch (event.button) {\n case 0:\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n case 1:\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n case 2:\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n default:\n return null;\n }\n }\n\n private mouseButtonFromButtons(buttons: number): number | null {\n if (buttons & 1) {\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n }\n if (buttons & 4) {\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n }\n if (buttons & 2) {\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n }\n\n return null;\n }\n\n private pointerPositionFromClient(clientX: number, clientY: number): { x: number; y: number } | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const width = Math.max(1, rect.width);\n const height = Math.max(1, rect.height);\n return {\n x: Math.max(0, Math.min(width - 1, clientX - rect.left)),\n y: Math.max(0, Math.min(height - 1, clientY - rect.top)),\n };\n }\n\n private emitMouseInput(options: {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n clientX: number;\n clientY: number;\n mods: number;\n anyButtonPressed: boolean;\n }): boolean {\n if (this.disableStdin) {\n return false;\n }\n\n const position = this.pointerPositionFromClient(options.clientX, options.clientY);\n if (!position) {\n return false;\n }\n\n const cell = this.cellDimensions();\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return false;\n }\n\n const payload = this.bindings.encodeMouseEvent(this.mouseEncoderHandle, this.terminalHandle, {\n action: options.action,\n button: options.button,\n mods: options.mods,\n x: position.x,\n y: position.y,\n anyButtonPressed: options.anyButtonPressed,\n screenWidth: Math.max(1, Math.round(rect.width)),\n screenHeight: Math.max(1, Math.round(rect.height)),\n cellWidth: Math.max(1, Math.round(cell.width || DEFAULT_CELL_WIDTH)),\n cellHeight: Math.max(1, Math.round(cell.height || DEFAULT_CELL_HEIGHT)),\n });\n if (!payload) {\n return false;\n }\n\n this.emitData(payload);\n return true;\n }\n\n private emitAltScrollInput(lines: number): boolean {\n const keyCode = getGhosttyKeyCode(lines < 0 ? 'ArrowUp' : 'ArrowDown');\n if (keyCode === 0) {\n return false;\n }\n\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n const payload = this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action: 'press',\n keyCode,\n mods: 0,\n composing: false,\n utf8: null,\n unshiftedCodepoint: null,\n });\n if (!payload) {\n continue;\n }\n this.emitData(payload);\n consumed = true;\n }\n\n return consumed;\n }\n\n private emitData(data: string): void {\n for (const listener of this.dataListeners) {\n listener(data);\n }\n }\n\n private clearTextarea(): void {\n if (this.textarea) {\n this.textarea.textContent = '';\n }\n }\n\n private syncTextareaPositionToCursor(): void {\n const textarea = this.textarea;\n const screen = this.screenElement;\n if (!textarea || !screen) {\n return;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return;\n }\n\n const renderState = createRenderState(this.bindings);\n let cursorX = 0;\n let cursorY = 0;\n try {\n updateRenderState(renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(renderState);\n if (meta.cursor.x !== null && meta.cursor.y !== null) {\n cursorX = meta.cursor.x;\n cursorY = meta.cursor.y;\n }\n } finally {\n disposeRenderStateResources(renderState);\n }\n\n const left = cursorX * width;\n const top = cursorY * height;\n\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.width = `${Math.max(1, width)}px`;\n textarea.style.height = `${Math.max(1, height)}px`;\n textarea.style.lineHeight = `${height}px`;\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n }\n\n private scheduleRender(): void {\n if (this.renderRaf !== null) {\n return;\n }\n\n this.renderRaf = requestAnimationFrame(() => {\n this.renderRaf = null;\n this.render();\n });\n }\n\n private render(): void {\n if (this.disposed || !this.screenElement || !this.renderer) {\n return;\n }\n\n const scrollbar = this.bindings.readScrollbar(this.terminalHandle);\n const viewportRows = Math.max(1, scrollbar.len || this.rows);\n\n updateRenderState(this.renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(this.renderState);\n const rows = Array.from(iterateRows(this.renderState));\n\n this.cols = Math.max(2, meta.cols);\n this.rows = Math.max(2, meta.rows || viewportRows);\n this.lastViewportOffset = scrollbar.offset;\n this.lastViewportRows = this.rows;\n this.lastRenderedRows = rows;\n\n for (const row of rows) {\n this.lineCache.set(scrollbar.offset + row.y, row.text);\n }\n\n const selectionRects = projectSelectionRects(\n this.selectionState,\n this.lastViewportOffset,\n this.lastViewportRows,\n (line) => this.getLineText(line)\n );\n const selectionText = this.getSelectionText();\n\n this.renderer.render({\n meta,\n rows,\n cellDimensions: this.cellDimensions(),\n selectionRects,\n selectionColor: this.options.theme.selectionBackground,\n });\n\n const visibleLines = normalizeVisibleLines(rows, this.rows);\n const baseY = Math.max(0, scrollbar.total - scrollbar.len);\n this.buffer.setViewport(scrollbar.offset, baseY, scrollbar.total, visibleLines);\n this.updateSelectionTextProbe(selectionText);\n this.updateScrollbar(scrollbar);\n }\n\n private updateScrollbar(scrollbar: { total: number; offset: number; len: number }): void {\n const thumb = this.scrollbarThumb;\n if (!thumb) {\n return;\n }\n\n const trackHeight = this.screenElement?.clientHeight ?? 0;\n if (trackHeight === 0 || scrollbar.total <= scrollbar.len) {\n thumb.style.opacity = '0';\n return;\n }\n\n const ratio = scrollbar.len / scrollbar.total;\n const thumbHeight = Math.max(20, ratio * trackHeight);\n const scrollRatio = scrollbar.offset / Math.max(1, scrollbar.total - scrollbar.len);\n const thumbTop = scrollRatio * (trackHeight - thumbHeight);\n\n thumb.style.height = `${thumbHeight}px`;\n thumb.style.transform = `translateY(${thumbTop}px)`;\n thumb.style.opacity = '1';\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n }\n this.scrollbarFadeTimer = setTimeout(() => {\n thumb.style.opacity = '0';\n }, 800);\n }\n\n private updateCellDimensions(): void {\n if (!this.element) {\n return;\n }\n\n const probe = document.createElement('span');\n probe.textContent = 'WWWWWWWWWW';\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n probe.style.whiteSpace = 'pre';\n probe.style.fontFamily = this.options.fontFamily;\n probe.style.fontSize = `${this.options.fontSize}px`;\n probe.style.lineHeight = '1.2';\n\n this.element.appendChild(probe);\n const rect = probe.getBoundingClientRect();\n probe.remove();\n\n this._core._renderService.dimensions.css.cell.width =\n rect.width > 0 ? rect.width / 10 : DEFAULT_CELL_WIDTH;\n this._core._renderService.dimensions.css.cell.height =\n rect.height > 0 ? rect.height : DEFAULT_CELL_HEIGHT;\n }\n\n private clearSelectionState(repaint = true): void {\n this.selectionState = resetSelectionData();\n this.pressedMouseButtons.clear();\n this.wheelPixelDelta = 0;\n this.pointerDrag = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n this.copyShortcutSuppressed = false;\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n\n if (repaint && this.screenElement && this.renderer) {\n this.render();\n }\n }\n\n private beginPointerSelection(event: MouseEvent): void {\n const point = this.hitTest(event.clientX, event.clientY);\n if (!point) {\n return;\n }\n\n const mode = this.selectionModeFromClickDetail(event.detail);\n this.pointerDrag = {\n active: true,\n moved: false,\n mode,\n lastClientX: event.clientX,\n lastClientY: event.clientY,\n };\n this.selectionState = resolvePointerSelection(\n this.selectionState,\n {\n ...point,\n mode,\n },\n (line) => this.getLineText(line)\n );\n this.updateAutoScroll();\n this.render();\n }\n\n private updatePointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active) {\n return;\n }\n\n const point = this.hitTest(event.clientX, event.clientY);\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n\n if (point) {\n this.pointerDrag.moved = true;\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.render();\n }\n\n this.updateAutoScroll();\n }\n\n private finishPointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active || event.button !== 0) {\n return;\n }\n\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n this.stopAutoScroll();\n\n const shouldClear =\n this.pointerDrag.mode === 'character' &&\n !this.pointerDrag.moved &&\n this.selectionState.anchor?.line === this.selectionState.focus?.line &&\n this.selectionState.anchor?.col === this.selectionState.focus?.col;\n this.pointerDrag.active = false;\n\n if (shouldClear) {\n this.clearSelectionState();\n return;\n }\n\n this.render();\n }\n\n private selectionModeFromClickDetail(detail: number): SelectionMode {\n if (detail >= 3) {\n return 'line';\n }\n if (detail === 2) {\n return 'word';\n }\n return 'character';\n }\n\n private hitTest(clientX: number, clientY: number): SelectionPoint | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return null;\n }\n\n const relativeX = clientX - rect.left;\n const relativeY = clientY - rect.top;\n const maxCol = Math.max(this.cols - 1, 0);\n const maxRow = Math.max(this.lastViewportRows - 1, 0);\n const col = Math.max(0, Math.min(maxCol, Math.floor(relativeX / width)));\n const row = Math.max(0, Math.min(maxRow, Math.floor(relativeY / height)));\n\n return {\n line: this.lastViewportOffset + row,\n col,\n };\n }\n\n private getLineText(line: number): string {\n const cached = this.lineCache.get(line);\n if (typeof cached === 'string') {\n return cached;\n }\n\n const visibleIndex = line - this.lastViewportOffset;\n const visibleRow = this.lastRenderedRows[visibleIndex];\n return visibleRow?.text ?? '';\n }\n\n private getSelectionText(): string | null {\n if (!hasSelection(this.selectionState)) {\n return null;\n }\n\n return serializeSelectionText(this.selectionState, (line) => this.getLineText(line));\n }\n\n private updateSelectionTextProbe(value: string | null): void {\n (globalThis as { __tmexE2eTerminalSelectionText?: string | null }).__tmexE2eTerminalSelectionText =\n value;\n }\n\n private updateAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n const outsideViewport =\n this.pointerDrag.lastClientY < rect.top || this.pointerDrag.lastClientY > rect.bottom;\n if (!outsideViewport) {\n this.stopAutoScroll();\n return;\n }\n\n if (this.autoScrollTimer !== null) {\n return;\n }\n\n this.autoScrollTimer = setInterval(() => {\n this.stepAutoScroll();\n }, AUTO_SCROLL_INTERVAL_MS);\n }\n\n private stepAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientX === null || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n let delta = 0;\n if (this.pointerDrag.lastClientY < rect.top) {\n delta = -1;\n } else if (this.pointerDrag.lastClientY > rect.bottom) {\n delta = 1;\n }\n\n if (delta === 0) {\n this.stopAutoScroll();\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, delta);\n this.render();\n\n const point = this.hitTest(this.pointerDrag.lastClientX, this.pointerDrag.lastClientY);\n if (!point) {\n return;\n }\n\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.pointerDrag.moved = true;\n this.render();\n }\n\n private stopAutoScroll(): void {\n if (this.autoScrollTimer === null) {\n return;\n }\n\n clearInterval(this.autoScrollTimer);\n this.autoScrollTimer = null;\n }\n\n private clearDomEventListeners(): void {\n while (this.domEventDisposers.length > 0) {\n const dispose = this.domEventDisposers.pop();\n dispose?.();\n }\n }\n}\n\nexport async function createTerminalController(\n options: GhosttyTerminalInitOptions\n): Promise<GhosttyTerminalController> {\n return GhosttyTerminalController.create(options);\n}\n\nexport { TERMINAL_ENGINE };\n","/**\n * seoul256.vim color scheme\n * https://github.com/junegunn/seoul256.vim\n * https://github.com/mikker/seoul256-iTerm\n *\n * Dark theme uses seoul256-iTerm colors\n * Light theme uses seoul256.vim colors\n */\n\n/**\n * seoul256-light - Seoul Colors Light\n * From seoul256.vim: Background 253 (#E1E1E1), Foreground 239 (#616161)\n */\nexport const XTERM_THEME_LIGHT = {\n background: '#e1e1e1',\n foreground: '#616161',\n cursor: '#616161',\n selectionBackground: 'rgba(97, 97, 97, 0.25)',\n // ANSI colors\n black: '#171717',\n red: '#bf2172',\n green: '#009799',\n yellow: '#9a7200',\n blue: '#007299',\n magenta: '#9b1d72',\n cyan: '#007173',\n white: '#d9d9d9',\n // Bright colors\n brightBlack: '#4e4e4e',\n brightRed: '#e12672',\n brightGreen: '#00bddf',\n brightYellow: '#ffdd00',\n brightBlue: '#7299bc',\n brightMagenta: '#e17899',\n brightCyan: '#6fbcbd',\n brightWhite: '#f1f1f1',\n};\n\n/**\n * seoul256-dark - Seoul Colors Dark\n * From seoul256-iTerm: https://github.com/mikker/seoul256-iTerm\n */\nexport const XTERM_THEME_DARK = {\n background: '#262626',\n foreground: '#d0d0d0',\n cursor: '#c5c5c5',\n selectionBackground: 'rgba(197, 197, 197, 0.25)',\n // ANSI colors (from iTerm colors)\n black: '#000000',\n red: '#ba3c3c',\n green: '#5d876d',\n yellow: '#d5a54e',\n blue: '#887c8d',\n magenta: '#cd6d6d',\n cyan: '#618484',\n white: '#cfcdc3',\n // Bright colors (from iTerm colors)\n brightBlack: '#000000',\n brightRed: '#ea7171',\n brightGreen: '#7aab7a',\n brightYellow: '#d1d194',\n brightBlue: '#afa3b5',\n brightMagenta: '#e29f9f',\n brightCyan: '#a0aea3',\n brightWhite: '#d0d0d0',\n};\n\nexport const XTERM_FONT_FAMILY =\n '\"JetBrains Mono\", \"SF Mono\", Menlo, Monaco, Consolas, \"Liberation Mono\", \"Noto Sans Mono CJK SC\", \"Source Han Mono SC\", \"Sarasa Mono SC\", \"Noto Color Emoji\", \"Apple Color Emoji\", \"Segoe UI Emoji\", monospace';\n\n// 别名导出,保持兼容性\nexport const XTERM_THEME_MIDNIGHT_AMETHYST = XTERM_THEME_DARK;\nexport const XTERM_THEME_DAWN_AMETHYST = XTERM_THEME_LIGHT;\n","export function normalizeHistoryForTerminal(data: string): string {\n if (!data) return data;\n const canonical = data.replace(/\\r\\n/g, '\\n');\n const trimmed = canonical.endsWith('\\n') ? canonical.slice(0, -1) : canonical;\n return trimmed.replace(/\\n/g, '\\r\\n');\n}\n\nconst ALT_SCREEN_HISTORY_PREAMBLE = '\\x1b[?1049h\\x1b[H\\x1b[2J';\n\nexport function wrapAlternateScreenHistory(data: string): string {\n return ALT_SCREEN_HISTORY_PREAMBLE + normalizeHistoryForTerminal(data);\n}\n\nexport function normalizeLiveOutputForTerminal(\n data: Uint8Array,\n previousEndedWithCR: boolean\n): { normalized: Uint8Array; endedWithCR: boolean } {\n let prevWasCR = previousEndedWithCR;\n let extraCRCount = 0;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n extraCRCount += 1;\n }\n prevWasCR = byte === 0x0d;\n }\n\n const endedWithCR = prevWasCR;\n if (extraCRCount === 0) {\n return { normalized: data, endedWithCR };\n }\n\n const normalized = new Uint8Array(data.length + extraCRCount);\n let writeIndex = 0;\n prevWasCR = previousEndedWithCR;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n normalized[writeIndex] = 0x0d;\n writeIndex += 1;\n }\n normalized[writeIndex] = byte;\n writeIndex += 1;\n prevWasCR = byte === 0x0d;\n }\n\n return { normalized, endedWithCR };\n}\n","import { useEffect, useRef } from 'react';\n\ninterface TerminalScroller {\n scrollLines: (amount: number) => void;\n handleViewportGesture?: (gesture: {\n source: 'touch';\n deltaY: number;\n clientX: number;\n clientY: number;\n }) => boolean;\n buffer?: {\n active?: {\n viewportY?: number;\n };\n };\n}\n\nconst TOUCH_SCROLL_GAIN = 1.3;\nconst SCROLLBAR_TOUCH_HOTZONE_PX = 36;\n\nexport function useMobileTouch(\n containerRef: React.RefObject<HTMLElement | null>,\n getTerminal?: () => TerminalScroller | null\n) {\n const isActiveRef = useRef(false);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const isMobile =\n window.innerWidth < 768 || navigator.maxTouchPoints > 0 || 'ontouchstart' in window;\n if (!isMobile) return;\n\n isActiveRef.current = true;\n let lastTouchY = 0;\n let touchId: number | null = null;\n let bypassCustomScroll = false;\n let pendingPixelDelta = 0;\n\n const isScrollbarElement = (target: Element | null): boolean => {\n if (!target) return false;\n return Boolean(\n target.closest('.scrollbar') ||\n target.closest('.slider') ||\n target.closest('.xterm-scroll-area')\n );\n };\n\n const shouldBypassCustomScroll = (\n clientX: number,\n clientY: number,\n eventTarget: EventTarget | null\n ): boolean => {\n const directTarget = eventTarget instanceof Element ? eventTarget : null;\n if (isScrollbarElement(directTarget)) {\n return true;\n }\n\n const pointTarget = document.elementFromPoint(clientX, clientY);\n if (isScrollbarElement(pointTarget)) {\n return true;\n }\n\n const xtermRoot = container.querySelector('.xterm');\n if (!(xtermRoot instanceof HTMLElement)) {\n return false;\n }\n\n const rect = xtermRoot.getBoundingClientRect();\n const insideX = clientX >= rect.left && clientX <= rect.right;\n const insideY = clientY >= rect.top && clientY <= rect.bottom;\n if (!insideX || !insideY) {\n return false;\n }\n\n return clientX >= rect.right - SCROLLBAR_TOUCH_HOTZONE_PX;\n };\n\n const findScrollTargets = (): HTMLElement[] => {\n const candidates = [\n container.querySelector('.xterm-viewport'),\n container.querySelector('.xterm-scrollable-element'),\n ];\n\n return candidates.filter((el): el is HTMLElement => el instanceof HTMLElement);\n };\n\n const findTouchById = (touchList: TouchList): Touch | null => {\n if (touchId === null) return null;\n for (let i = 0; i < touchList.length; i += 1) {\n const touch = touchList.item(i);\n if (touch && touch.identifier === touchId) {\n return touch;\n }\n }\n return null;\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n if (event.touches.length !== 1) return;\n const touch = event.touches.item(0);\n if (!touch) return;\n\n touchId = touch.identifier;\n lastTouchY = touch.clientY;\n pendingPixelDelta = 0;\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n const touch = findTouchById(event.touches) ?? event.touches.item(0);\n if (!touch) return;\n if (!bypassCustomScroll) {\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n if (bypassCustomScroll) {\n pendingPixelDelta = 0;\n }\n }\n if (bypassCustomScroll) return;\n\n const currentY = touch.clientY;\n const deltaY = lastTouchY - currentY;\n lastTouchY = currentY;\n\n if (deltaY === 0) return;\n\n let didScroll = false;\n let atTopWhilePullingDown = false;\n const terminal = getTerminal?.() ?? null;\n\n if (terminal) {\n const core = (terminal as any)?._core;\n const lineHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 18;\n pendingPixelDelta += deltaY * TOUCH_SCROLL_GAIN;\n const linesToScroll =\n pendingPixelDelta > 0\n ? Math.floor(pendingPixelDelta / lineHeight)\n : Math.ceil(pendingPixelDelta / lineHeight);\n\n if (typeof terminal.handleViewportGesture === 'function') {\n if (linesToScroll !== 0) {\n didScroll = terminal.handleViewportGesture({\n source: 'touch',\n deltaY: linesToScroll * lineHeight,\n clientX: touch.clientX,\n clientY: touch.clientY,\n });\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n } else {\n if (linesToScroll !== 0) {\n const beforeViewportY = terminal.buffer?.active?.viewportY ?? 0;\n terminal.scrollLines(linesToScroll);\n const afterViewportY = terminal.buffer?.active?.viewportY ?? 0;\n didScroll = beforeViewportY !== afterViewportY;\n atTopWhilePullingDown = linesToScroll < 0 && beforeViewportY <= 0 && afterViewportY <= 0;\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n }\n } else {\n const scrollTargets = findScrollTargets();\n if (scrollTargets.length === 0) return;\n\n for (const target of scrollTargets) {\n const previousScrollTop = target.scrollTop;\n target.scrollTop += deltaY;\n const nextScrollTop = target.scrollTop;\n\n if (Math.abs(nextScrollTop - previousScrollTop) > 0) {\n didScroll = true;\n }\n if (deltaY < 0 && nextScrollTop <= 0) {\n atTopWhilePullingDown = true;\n }\n }\n if (!didScroll) {\n const xtermRoot = container.querySelector('.xterm');\n if (xtermRoot instanceof HTMLElement) {\n const wheelEvent = new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n deltaMode: WheelEvent.DOM_DELTA_PIXEL,\n deltaY,\n });\n const dispatched = xtermRoot.dispatchEvent(wheelEvent);\n didScroll = wheelEvent.defaultPrevented || !dispatched;\n }\n }\n }\n\n if (!event.cancelable) return;\n if (didScroll || atTopWhilePullingDown) {\n event.preventDefault();\n }\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n if (touchId === null) return;\n const endedTouch = findTouchById(event.changedTouches);\n if (!endedTouch) return;\n touchId = null;\n pendingPixelDelta = 0;\n bypassCustomScroll = false;\n };\n\n container.addEventListener('touchstart', handleTouchStart, { passive: true });\n container.addEventListener('touchmove', handleTouchMove, { passive: false });\n container.addEventListener('touchend', handleTouchEnd, { passive: true });\n container.addEventListener('touchcancel', handleTouchEnd, { passive: true });\n\n return () => {\n isActiveRef.current = false;\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('touchend', handleTouchEnd);\n container.removeEventListener('touchcancel', handleTouchEnd);\n };\n }, [containerRef, getTerminal]);\n\n return isActiveRef;\n}\n","export interface TerminalSizeSnapshot {\n cols: number;\n rows: number;\n}\n\nexport interface TimedTerminalSizeSnapshot extends TerminalSizeSnapshot {\n at: number;\n}\n\ninterface ViewportRestoreSyncInput {\n currentSize: TerminalSizeSnapshot;\n containerSize: TerminalSizeSnapshot;\n force?: boolean;\n}\n\ninterface RemotePaneSizeGuardInput {\n now: number;\n remoteSize: TerminalSizeSnapshot;\n pendingLocalSize: TimedTerminalSizeSnapshot | null;\n ttlMs?: number;\n}\n\nexport function shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n ttlMs = 2000,\n}: RemotePaneSizeGuardInput): boolean {\n if (!pendingLocalSize) {\n return true;\n }\n\n if (now - pendingLocalSize.at > ttlMs) {\n return true;\n }\n\n return pendingLocalSize.cols === remoteSize.cols && pendingLocalSize.rows === remoteSize.rows;\n}\n\ninterface ForceLocalSizeSyncInput extends RemotePaneSizeGuardInput {\n containerSize: TerminalSizeSnapshot | null;\n}\n\nexport function shouldForceLocalSizeSync({\n now: _now,\n remoteSize: _remoteSize,\n pendingLocalSize: _pendingLocalSize,\n containerSize: _containerSize,\n ttlMs: _ttlMs = 2000,\n}: ForceLocalSizeSyncInput): boolean {\n return false;\n}\n\nexport function shouldSyncOnViewportRestore({\n currentSize,\n containerSize,\n force = false,\n}: ViewportRestoreSyncInput): boolean {\n if (force) {\n return true;\n }\n\n return currentSize.cols !== containerSize.cols || currentSize.rows !== containerSize.rows;\n}\n","import { shouldSyncOnViewportRestore } from '@/utils/resizeSyncGuards';\nimport type { CompatibleTerminalLike } from 'ghostty-terminal';\nimport type { FitAddon } from 'ghostty-terminal';\nimport { useCallback, useEffect, useRef } from 'react';\n\ninterface UseTerminalResizeOptions {\n deviceId: string;\n paneId: string;\n deviceConnected: boolean;\n isSelectionInvalid: boolean;\n onResize: (cols: number, rows: number) => void;\n onSync: (cols: number, rows: number) => void;\n /** 获取容器尺寸的回调函数,用于 fitAddon 失败时的回退计算 */\n getContainerRect?: () => { width: number; height: number } | null;\n}\n\nexport function useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect,\n}: UseTerminalResizeOptions) {\n const resizeRaf = useRef<number | null>(null);\n const resizeTimer = useRef<number | null>(null);\n const lastReportedSize = useRef<{ cols: number; rows: number } | null>(null);\n const pendingLocalSize = useRef<{ cols: number; rows: number; at: number } | null>(null);\n const suppressLocalResizeUntil = useRef(0);\n const postSelectResizeTimers = useRef<number[]>([]);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const terminalRef = useRef<CompatibleTerminalLike | null>(null);\n const getContainerRectRef = useRef(getContainerRect);\n const viewportRestorePendingRef = useRef(false);\n\n // Use refs to store callbacks to avoid dependency cycles\n const onResizeRef = useRef(onResize);\n const onSyncRef = useRef(onSync);\n\n // Update refs when callbacks change\n useEffect(() => {\n onResizeRef.current = onResize;\n }, [onResize]);\n\n useEffect(() => {\n onSyncRef.current = onSync;\n }, [onSync]);\n\n useEffect(() => {\n getContainerRectRef.current = getContainerRect;\n }, [getContainerRect]);\n\n const measureTerminalSize = useCallback((): { cols: number; rows: number } | null => {\n const term = terminalRef.current;\n const fitAddon = fitAddonRef.current;\n if (!term || !fitAddon || !term.element) {\n return null;\n }\n\n let cols: number;\n\n try {\n const proposed = fitAddon.proposeDimensions();\n if (!proposed) {\n throw new Error('fitAddon.proposeDimensions() returned null');\n }\n cols = Math.max(2, proposed.cols);\n } catch {\n const core = (term as any)._core;\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n const rect = getContainerRectRef.current?.();\n if (!rect || rect.width === 0) {\n return null;\n }\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const containerRect = getContainerRectRef.current?.();\n if (!containerRect || containerRect.height === 0) {\n return null;\n }\n const core = (term as any)._core;\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(containerRect.height / cellHeight));\n\n return { cols, rows };\n }, []);\n\n const applyTerminalSize = useCallback((cols: number, rows: number): void => {\n const term = terminalRef.current;\n if (!term) {\n return;\n }\n if (term.cols === cols && term.rows === rows) {\n return;\n }\n term.resize(cols, rows);\n }, []);\n\n const reportSize = useCallback(\n (kind: 'resize' | 'sync', force = false) => {\n // sync 操作即使在 isSelectionInvalid 时也应该执行,因为尺寸同步是基础功能\n // isSelectionInvalid 主要影响用户输入,不应该阻止终端尺寸同步\n if (!deviceId || !paneId || !deviceConnected) {\n return false;\n }\n if (isSelectionInvalid && kind !== 'sync') {\n return false;\n }\n\n if (!force && Date.now() < suppressLocalResizeUntil.current) {\n return false;\n }\n\n const term = terminalRef.current;\n if (!term) {\n return false;\n }\n\n const measuredSize = measureTerminalSize();\n if (!measuredSize) {\n return false;\n }\n const { cols, rows } = measuredSize;\n // Debug: console.log('[resize] success:', { kind, cols, rows, force });\n const lastSize = lastReportedSize.current;\n\n if (!force && lastSize && lastSize.cols === cols && lastSize.rows === rows) {\n applyTerminalSize(cols, rows);\n return true;\n }\n\n applyTerminalSize(cols, rows);\n\n if (kind === 'sync') {\n onSyncRef.current(cols, rows);\n } else {\n onResizeRef.current(cols, rows);\n }\n\n lastReportedSize.current = { cols, rows };\n pendingLocalSize.current = { cols, rows, at: Date.now() };\n return true;\n },\n // Only depend on stable values, not the callbacks\n [applyTerminalSize, deviceConnected, deviceId, isSelectionInvalid, measureTerminalSize, paneId]\n );\n\n const scheduleResize = useCallback(\n (\n kind: 'resize' | 'sync' = 'resize',\n options: { immediate?: boolean; force?: boolean } = {}\n ) => {\n const { immediate = false, force = false } = options;\n\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n resizeTimer.current = null;\n }\n\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n resizeRaf.current = null;\n }\n\n const run = () => {\n resizeRaf.current = requestAnimationFrame(() => {\n resizeRaf.current = null;\n reportSize(kind, force);\n });\n };\n\n if (immediate) {\n run();\n return;\n }\n\n resizeTimer.current = window.setTimeout(() => {\n resizeTimer.current = null;\n run();\n }, 150);\n },\n [reportSize]\n );\n\n const clearPostSelectResizeTimers = useCallback(() => {\n for (const id of postSelectResizeTimers.current) {\n window.clearTimeout(id);\n }\n postSelectResizeTimers.current = [];\n }, []);\n\n const runPostSelectResize = useCallback(() => {\n clearPostSelectResizeTimers();\n scheduleResize('sync', { immediate: true, force: true });\n\n const retryId = window.setTimeout(() => {\n scheduleResize('sync', { immediate: true, force: true });\n }, 60);\n postSelectResizeTimers.current.push(retryId);\n\n if (typeof document !== 'undefined' && 'fonts' in document && document.fonts?.ready) {\n document.fonts.ready\n .then(() => {\n scheduleResize('sync', { immediate: true, force: true });\n })\n .catch(() => {\n // ignore\n });\n }\n }, [clearPostSelectResizeTimers, scheduleResize]);\n\n // 浏览器窗口 resize 处理 - 共享 scheduleResize 的防抖\n useEffect(() => {\n let rafId: number | null = null;\n const handleWindowResize = () => {\n // 使用 RAF 确保在布局完成后执行,并与 ResizeObserver 协调\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n };\n\n window.addEventListener('resize', handleWindowResize);\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n const handleViewportRestore = () => {\n const term = terminalRef.current;\n const containerSize = measureTerminalSize();\n if (!term || !containerSize) {\n return;\n }\n\n const shouldSync = shouldSyncOnViewportRestore({\n currentSize: { cols: Math.max(2, term.cols), rows: Math.max(2, term.rows) },\n containerSize,\n });\n if (!shouldSync) {\n term.refresh?.();\n return;\n }\n\n scheduleResize('sync', { force: true });\n };\n\n const handleVisibilityChange = () => {\n if (document.visibilityState !== 'visible') {\n viewportRestorePendingRef.current = true;\n return;\n }\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n const handleWindowBlur = () => {\n viewportRestorePendingRef.current = true;\n };\n\n const handleWindowFocus = () => {\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('blur', handleWindowBlur);\n window.addEventListener('focus', handleWindowFocus);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('blur', handleWindowBlur);\n window.removeEventListener('focus', handleWindowFocus);\n };\n }, [measureTerminalSize, scheduleResize]);\n\n // 清理\n useEffect(() => {\n return () => {\n clearPostSelectResizeTimers();\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n }\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n }\n };\n }, [clearPostSelectResizeTimers]);\n\n const setFitAddon = useCallback((addon: FitAddon | null) => {\n fitAddonRef.current = addon;\n }, []);\n\n const setTerminal = useCallback((terminal: CompatibleTerminalLike | null) => {\n terminalRef.current = terminal;\n }, []);\n\n return {\n scheduleResize,\n runPostSelectResize,\n clearPostSelectResizeTimers,\n setFitAddon,\n setTerminal,\n lastReportedSize,\n pendingLocalSize,\n suppressLocalResizeUntil,\n };\n}\n","import {\n FitAddon,\n TERMINAL_ENGINE,\n createTerminalController,\n type CompatibleTerminalLike,\n type GhosttyTerminalModeSnapshot,\n} from 'ghostty-terminal';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTmuxStore } from '@/stores/tmux';\nimport { type SelectCallbacks, getSelectStateMachine } from '@/ws-borsh';\nimport { XTERM_FONT_FAMILY, XTERM_THEME_DARK, XTERM_THEME_LIGHT } from './theme';\nimport {\n normalizeHistoryForTerminal,\n normalizeLiveOutputForTerminal,\n wrapAlternateScreenHistory,\n} from './normalization';\nimport type { TerminalProps, TerminalRef } from './types';\nimport { useMobileTouch } from './useMobileTouch';\nimport { useTerminalResize } from './useTerminalResize';\n\nconst TERMINAL_CONFIG = {\n fontFamily: XTERM_FONT_FAMILY,\n fontSize: 13,\n scrollback: 10000,\n};\n\nconst TERMINAL_MODE_CACHE_KEY = 'tmex:terminal-mode-cache';\n\nfunction readTerminalModeCache(\n deviceId: string,\n paneId: string\n): GhosttyTerminalModeSnapshot | null {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>;\n return parsed[`${deviceId}:${paneId}`] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeTerminalModeCache(\n deviceId: string,\n paneId: string,\n snapshot: GhosttyTerminalModeSnapshot | null\n): void {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n const parsed = raw ? (JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>) : {};\n const key = `${deviceId}:${paneId}`;\n if (snapshot) {\n parsed[key] = snapshot;\n } else {\n delete parsed[key];\n }\n sessionStorage.setItem(TERMINAL_MODE_CACHE_KEY, JSON.stringify(parsed));\n } catch {\n // ignore storage failures\n }\n}\n\nfunction createAlternateScreenFallbackSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: false,\n mouseNormal: true,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n };\n}\n\nfunction reconcileRecoveredModes(\n cached: GhosttyTerminalModeSnapshot | null,\n alternateScreen: boolean\n): GhosttyTerminalModeSnapshot | null {\n if (!alternateScreen) {\n if (!cached) return null;\n return {\n ...cached,\n mouseX10: false,\n mouseNormal: false,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScreen1047: false,\n altScreen1049: false,\n };\n }\n\n const fallback = createAlternateScreenFallbackSnapshot();\n if (!cached) {\n return fallback;\n }\n\n const hasTrackingMode = cached.mouseNormal || cached.mouseButton || cached.mouseAny;\n\n return {\n ...cached,\n mouseX10: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n mouseNormal: hasTrackingMode ? cached.mouseNormal : fallback.mouseNormal,\n };\n}\n\nfunction setE2eTerminalProbe(terminal: CompatibleTerminalLike): void {\n const g = globalThis as any;\n g.__tmexE2eXterm = terminal;\n g.__tmexE2eTerminal = terminal;\n g.__tmexE2eTerminalEngine = TERMINAL_ENGINE;\n g.__tmexE2eTerminalRenderer = terminal.getRendererKind?.() ?? null;\n}\n\nfunction clearE2eTerminalProbe(terminal: CompatibleTerminalLike | null): void {\n if (!terminal) {\n return;\n }\n\n const g = globalThis as any;\n if (g.__tmexE2eTerminal !== terminal && g.__tmexE2eXterm !== terminal) {\n return;\n }\n\n g.__tmexE2eXterm = null;\n g.__tmexE2eTerminal = null;\n g.__tmexE2eTerminalEngine = null;\n g.__tmexE2eTerminalRenderer = null;\n g.__tmexE2eTerminalSelectionText = null;\n}\n\nexport const Terminal = forwardRef<TerminalRef, TerminalProps>(\n (\n { deviceId, paneId, theme, inputMode, deviceConnected, isSelectionInvalid, onResize, onSync },\n ref\n ) => {\n const [instance, setInstance] = useState<CompatibleTerminalLike | null>(null);\n const sendInput = useTmuxStore((state) => state.sendInput);\n\n const terminalTheme = useMemo(() => {\n switch (theme) {\n case 'light':\n return XTERM_THEME_LIGHT;\n default:\n return XTERM_THEME_DARK;\n }\n }, [theme]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const mountRef = useRef<HTMLDivElement>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const currentDeviceIdRef = useRef(deviceId);\n const currentPaneIdRef = useRef(paneId);\n const attachedDeviceIdRef = useRef(deviceId);\n const attachedPaneIdRef = useRef(paneId);\n const canWriteRef = useRef(deviceConnected && !isSelectionInvalid);\n const currentInputModeRef = useRef(inputMode);\n const currentTerminalThemeRef = useRef(terminalTheme);\n const liveOutputEndedWithCR = useRef(false);\n const keepShortHistoryVisibleRef = useRef(false);\n const lastTerminalInstanceRef = useRef<CompatibleTerminalLike | null>(null);\n const skipNextDetachPersistRef = useRef(false);\n\n const persistTerminalModes = useCallback(\n (terminal: CompatibleTerminalLike | null, targetDeviceId: string, targetPaneId: string) => {\n if (!terminal?.exportModeSnapshot || !targetDeviceId || !targetPaneId) {\n return;\n }\n writeTerminalModeCache(targetDeviceId, targetPaneId, terminal.exportModeSnapshot());\n },\n []\n );\n\n const getTerminalForTouch = useCallback(() => instance, [instance]);\n useMobileTouch(containerRef, getTerminalForTouch);\n\n useEffect(() => {\n currentDeviceIdRef.current = deviceId;\n currentPaneIdRef.current = paneId;\n keepShortHistoryVisibleRef.current = false;\n }, [deviceId, paneId]);\n\n useEffect(() => {\n canWriteRef.current = deviceConnected && !isSelectionInvalid;\n }, [deviceConnected, isSelectionInvalid]);\n\n useEffect(() => {\n currentInputModeRef.current = inputMode;\n }, [inputMode]);\n\n useEffect(() => {\n currentTerminalThemeRef.current = terminalTheme;\n }, [terminalTheme]);\n\n const sendTerminalInput = useCallback(\n (data: string) => {\n if (!data || inputMode !== 'direct') {\n return;\n }\n if (!canWriteRef.current) {\n return;\n }\n\n const activeDeviceId = currentDeviceIdRef.current;\n const activePaneId = currentPaneIdRef.current;\n if (!activeDeviceId || !activePaneId) {\n return;\n }\n\n sendInput(activeDeviceId, activePaneId, data, false);\n },\n [inputMode, sendInput]\n );\n\n const { pendingLocalSize, scheduleResize, runPostSelectResize, setFitAddon, setTerminal } =\n useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect: () => {\n const el = containerRef.current;\n if (!el) return null;\n const rect = el.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n },\n });\n\n useEffect(() => {\n let cancelled = false;\n let createdTerminal: Awaited<ReturnType<typeof createTerminalController>> | null = null;\n\n void createTerminalController({\n ...TERMINAL_CONFIG,\n theme: currentTerminalThemeRef.current,\n disableStdin: currentInputModeRef.current === 'editor',\n }).then((terminal) => {\n if (cancelled) {\n terminal.dispose();\n return;\n }\n\n createdTerminal = terminal;\n if (mountRef.current) {\n terminal.open(mountRef.current);\n }\n setE2eTerminalProbe(terminal);\n setInstance(terminal);\n });\n\n return () => {\n cancelled = true;\n setInstance(null);\n clearE2eTerminalProbe(createdTerminal);\n createdTerminal?.dispose();\n };\n }, []);\n\n useEffect(() => {\n if (!instance || !('setTheme' in instance)) {\n return;\n }\n\n (instance as any).setTheme(terminalTheme);\n }, [instance, terminalTheme]);\n\n useEffect(() => {\n if (!instance || !('setDisableStdin' in instance)) {\n return;\n }\n\n (instance as any).setDisableStdin(inputMode === 'editor');\n }, [instance, inputMode]);\n\n const callbacks: SelectCallbacks = useMemo(() => {\n if (!instance) {\n return {};\n }\n\n return {\n onResetTerminal: (targetDeviceId) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n skipNextDetachPersistRef.current = true;\n instance.reset();\n liveOutputEndedWithCR.current = false;\n runPostSelectResize();\n },\n onApplyHistory: (targetDeviceId, data, alternateScreen) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n const recoveredModes = reconcileRecoveredModes(\n readTerminalModeCache(currentDeviceIdRef.current, currentPaneIdRef.current),\n alternateScreen\n );\n if (recoveredModes) {\n instance.restoreModeSnapshot?.(recoveredModes);\n }\n const payload = alternateScreen\n ? wrapAlternateScreenHistory(data)\n : normalizeHistoryForTerminal(data);\n keepShortHistoryVisibleRef.current = true;\n instance.write(payload);\n skipNextDetachPersistRef.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onFlushBuffer: (targetDeviceId, buffer) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n for (const chunk of buffer) {\n const normalized = normalizeLiveOutputForTerminal(chunk, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n }\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onOutput: (targetDeviceId, targetPaneId, data) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n if (currentPaneIdRef.current !== targetPaneId) return;\n const normalized = normalizeLiveOutputForTerminal(data, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n };\n }, [instance, persistTerminalModes, runPostSelectResize]);\n\n useEffect(() => {\n if (!instance) {\n lastTerminalInstanceRef.current = null;\n } else if (lastTerminalInstanceRef.current !== instance) {\n liveOutputEndedWithCR.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n lastTerminalInstanceRef.current = instance;\n }\n }, [instance]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) {\n return;\n }\n\n return () => {\n if (skipNextDetachPersistRef.current) {\n skipNextDetachPersistRef.current = false;\n return;\n }\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n };\n }, [deviceId, instance, paneId, persistTerminalModes]);\n\n useEffect(() => {\n getSelectStateMachine(callbacks);\n }, [callbacks]);\n\n useEffect(() => {\n return () => {\n getSelectStateMachine({});\n };\n }, []);\n\n useEffect(() => {\n if (!instance) {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n return;\n }\n\n const fitAddon = new FitAddon();\n instance.loadAddon(fitAddon);\n fitAddonRef.current = fitAddon;\n setFitAddon(fitAddon);\n setTerminal(instance);\n\n runPostSelectResize();\n\n return () => {\n try {\n fitAddon.dispose();\n } finally {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n }\n };\n }, [instance, runPostSelectResize, setFitAddon, setTerminal]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n let rafId: number | null = null;\n const ro = new ResizeObserver(() => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n });\n ro.observe(el);\n return () => {\n ro.disconnect();\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) return;\n\n const disposable = instance.onData((data) => {\n if (!deviceConnected || isSelectionInvalid) return;\n sendTerminalInput(data);\n });\n\n instance.attachCustomKeyEventHandler((domEvent) => {\n if (!deviceConnected || isSelectionInvalid) return true;\n if (domEvent.type !== 'keydown') return true;\n if (inputMode !== 'direct') return true;\n\n if (domEvent.shiftKey && domEvent.key === 'Enter') {\n domEvent.preventDefault();\n sendTerminalInput('\\x1b[13;2u');\n return false;\n }\n\n return true;\n });\n\n return () => {\n disposable.dispose();\n instance.attachCustomKeyEventHandler(() => true);\n };\n }, [\n instance,\n deviceConnected,\n isSelectionInvalid,\n inputMode,\n sendTerminalInput,\n deviceId,\n paneId,\n ]);\n\n useImperativeHandle(\n ref,\n () => ({\n write: (data) => instance?.write(data),\n reset: () => {\n instance?.reset();\n liveOutputEndedWithCR.current = false;\n },\n scrollToBottom: () => instance?.scrollToBottom(),\n resize: (cols, rows) => instance?.resize(cols, rows),\n getTerminal: () => instance ?? null,\n getSize: () => {\n if (!instance) return null;\n return { cols: Math.max(2, instance.cols), rows: Math.max(2, instance.rows) };\n },\n runPostSelectResize: () => runPostSelectResize(),\n scheduleResize: (kind, options) => scheduleResize(kind, options),\n calculateSizeFromContainer: () => {\n const container = containerRef.current;\n const term = instance;\n const fitAddon = fitAddonRef.current;\n if (!container || !term) return null;\n\n const rect = container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n const core = term._core;\n let cols: number;\n if (fitAddon) {\n try {\n const dims = fitAddon.proposeDimensions();\n if (dims) {\n cols = Math.max(2, dims.cols);\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } catch {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(rect.height / cellHeight));\n\n return { cols, rows };\n },\n getPendingLocalSize: () => pendingLocalSize.current,\n }),\n [instance, pendingLocalSize, runPostSelectResize, scheduleResize]\n );\n\n return (\n <div\n ref={containerRef}\n className=\"h-full w-full relative\"\n style={{ backgroundColor: terminalTheme.background }}\n data-terminal-engine={TERMINAL_ENGINE}\n >\n <div ref={mountRef} className=\"absolute inset-0\" />\n </div>\n );\n }\n);\n\nTerminal.displayName = 'Terminal';\n","export interface PaneSelection {\n windowId: string;\n paneId: string;\n}\n\nexport interface TimedPaneSelection extends PaneSelection {\n at: number;\n}\n\nexport const RECENT_SELECT_REQUEST_TTL_MS = 1200;\nexport const PENDING_USER_SELECTION_TTL_MS = 2000;\n\nfunction matchesPaneSelection(\n left: PaneSelection | null | undefined,\n right: PaneSelection | null | undefined\n): boolean {\n if (!left || !right) {\n return false;\n }\n return left.windowId === right.windowId && left.paneId === right.paneId;\n}\n\nfunction getLatestRecentSelectRequest(\n recentSelectRequests: TimedPaneSelection[],\n now: number\n): TimedPaneSelection | null {\n const recentRequests = recentSelectRequests.filter(\n (request) => now - request.at < RECENT_SELECT_REQUEST_TTL_MS\n );\n if (recentRequests.length === 0) {\n return null;\n }\n return recentRequests.reduce((latest, request) => (request.at > latest.at ? request : latest));\n}\n\nexport function resolvePendingUserSelection(\n pendingUserSelection: TimedPaneSelection | null | undefined,\n now = Date.now()\n): TimedPaneSelection | null {\n if (!pendingUserSelection) {\n return null;\n }\n if (now - pendingUserSelection.at > PENDING_USER_SELECTION_TTL_MS) {\n return null;\n }\n return pendingUserSelection;\n}\n\nexport function shouldIgnoreActivePaneEvent(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n activePaneFromEvent: PaneSelection;\n currentRoute: PaneSelection | null | undefined;\n recentSelectRequests: TimedPaneSelection[];\n lastHandledActive: PaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n if (matchesPaneSelection(params.currentRoute, params.activePaneFromEvent)) {\n return true;\n }\n\n if (matchesPaneSelection(params.lastHandledActive, params.activePaneFromEvent)) {\n return true;\n }\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (\n pendingUserSelection &&\n !matchesPaneSelection(pendingUserSelection, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldSkipSnapshotFollow(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n snapshotActive: PaneSelection;\n recentSelectRequests: TimedPaneSelection[];\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (pendingUserSelection && !matchesPaneSelection(pendingUserSelection, params.snapshotActive)) {\n return true;\n }\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.snapshotActive)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldTrackPendingRouteSelection(params: {\n now?: number;\n routeTarget: PaneSelection;\n snapshotActive: PaneSelection | null | undefined;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n\n if (pendingUserSelection && matchesPaneSelection(pendingUserSelection, params.routeTarget)) {\n return false;\n }\n\n if (params.snapshotActive && matchesPaneSelection(params.snapshotActive, params.routeTarget)) {\n return false;\n }\n\n return true;\n}\n","import { useSiteStore } from '../stores/site';\n\nexport function getSiteNameFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteName || 'tmex';\n}\n\nexport function getSiteUrlFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteUrl || window.location.origin;\n}\n","import { getSiteNameFallback } from './site';\n\ninterface TerminalLabelInput {\n paneIdx?: number | null;\n windowIdx?: number | null;\n paneTitle?: string | null;\n windowName?: string | null;\n deviceName?: string | null;\n}\n\nfunction toSafeText(value: string | null | undefined): string {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : '?';\n}\n\nexport function buildTerminalLabel({\n paneIdx,\n windowIdx,\n paneTitle,\n windowName,\n deviceName,\n}: TerminalLabelInput): string {\n const safeWindowIdx = windowIdx ?? '?';\n const safePaneIdx = paneIdx ?? '?';\n const safePaneTitle = toSafeText(paneTitle ?? windowName);\n const safeDeviceName = toSafeText(deviceName);\n return `${safeWindowIdx}/${safePaneIdx}: ${safePaneTitle}@${safeDeviceName}`;\n}\n\nexport function buildBrowserTitle(label?: string | null): string {\n const siteName = getSiteNameFallback();\n if (!label?.trim()) {\n return siteName;\n }\n return `[${siteName}]${label}`;\n}\n","import { Terminal as TerminalComponent, type TerminalRef } from '@/components/terminal';\nimport { XTERM_THEME_DARK, XTERM_THEME_LIGHT } from '@/components/terminal/theme';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/alert-dialog';\nimport { Button } from '@/components/ui/button';\nimport { Switch } from '@/components/ui/switch';\nimport { useQuery } from '@tanstack/react-query';\nimport type { Device } from '@tmex/shared';\nimport {\n ArrowDownToLine,\n Keyboard,\n Loader2,\n RefreshCw,\n Send,\n Smartphone,\n Trash2,\n} from 'lucide-react';\nimport { type FocusEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useSiteStore } from '../stores/site';\nimport { useTmuxStore } from '../stores/tmux';\nimport { useUIStore } from '../stores/ui';\nimport { shouldApplyRemotePaneSize } from '../utils/resizeSyncGuards';\nimport {\n type TimedPaneSelection,\n resolvePendingUserSelection,\n shouldIgnoreActivePaneEvent,\n shouldSkipSnapshotFollow,\n shouldTrackPendingRouteSelection,\n} from '../utils/selectionGuards';\nimport { buildBrowserTitle, buildTerminalLabel } from '../utils/terminalMeta';\nimport { decodePaneIdFromUrlParam, encodePaneIdForUrl } from '../utils/tmuxUrl';\n\ninterface EditorShortcut {\n key: string;\n label: string;\n payload: string;\n}\n\nfunction isIOSMobileBrowser(): boolean {\n if (typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent;\n const isIOSDevice = /iPad|iPhone|iPod/.test(userAgent);\n const isTouchMac = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return isIOSDevice || isTouchMac;\n}\n\nconst EDITOR_SHORTCUTS: EditorShortcut[] = [\n { key: 'enter', label: 'ENTER', payload: '\\r' },\n { key: 'ctrl-c', label: 'CTRL-C', payload: '\\u0003' },\n { key: 'ctrl-d', label: 'CTRL-D', payload: '\\u0004' },\n { key: 'up', label: '↑', payload: '\\u001b[A' },\n { key: 'down', label: '↓', payload: '\\u001b[B' },\n { key: 'left', label: '←', payload: '\\u001b[D' },\n { key: 'right', label: '→', payload: '\\u001b[C' },\n { key: 'shift-enter', label: 'SHIFT+ENTER', payload: '\\x1b[13;2u' },\n { key: 'tab', label: 'TAB', payload: '\\u0009' },\n { key: 'backspace', label: 'BACKSPACE', payload: '\\u0008' },\n { key: 'esc', label: 'ESC', payload: '\\u001b' },\n { key: 'delete', label: 'DELETE', payload: '\\u007f' },\n { key: ':', label: ':', payload: ':' },\n { key: '/', label: '/', payload: '/' },\n { key: \"'\", label: \"'\", payload: \"'\" },\n { key: '\"', label: '\"', payload: '\"' },\n { key: '`', label: '`', payload: '`' },\n];\n\n// ShortcutsBar 组件 - 使用 memo 避免不必要的重绘\ninterface ShortcutsBarProps {\n onSend: (payload: string) => void;\n onFocusEditor?: () => void;\n disabled: boolean;\n isMobile: boolean;\n inputMode: 'direct' | 'editor';\n}\n\nconst ShortcutsBar = memo(function ShortcutsBar({\n onSend,\n onFocusEditor,\n disabled,\n isMobile,\n inputMode,\n}: ShortcutsBarProps) {\n return (\n <div\n className=\"terminal-shortcuts-strip my-2 bg-muted rounded-xl\"\n data-testid=\"terminal-shortcuts-strip\"\n >\n <div\n className=\"shortcut-row flex items-center gap-1.5 p-2 overflow-x-auto scrollbar-thin\"\n data-testid=\"editor-shortcuts-row\"\n >\n {EDITOR_SHORTCUTS.map((shortcut) => (\n <Button\n key={shortcut.key}\n variant=\"secondary\"\n size=\"sm\"\n className=\"h-7 min-w-9 px-2.5 rounded-full text-[11px] font-medium tracking-wide shrink-0 [@media(any-pointer:coarse)]:h-9 [@media(any-pointer:coarse)]:min-w-10 [@media(any-pointer:coarse)]:px-3\"\n title={shortcut.label}\n aria-label={shortcut.label}\n data-testid={`editor-shortcut-${shortcut.key}`}\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n onSend(shortcut.payload);\n if (isMobile && inputMode === 'editor') {\n onFocusEditor?.();\n }\n }}\n disabled={disabled}\n >\n {shortcut.label}\n </Button>\n ))}\n </div>\n </div>\n );\n});\n\nexport default function DevicePage() {\n const { t } = useTranslation();\n const { deviceId, windowId, paneId } = useParams();\n const navigate = useNavigate();\n const terminalContainerRef = useRef<HTMLDivElement>(null);\n const editorContainerRef = useRef<HTMLDivElement | null>(null);\n const editorTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const terminalRef = useRef<TerminalRef>(null);\n const autoSelected = useRef(false);\n const iosAddressBarCollapseTried = useRef(false);\n // Track user-initiated navigation to prevent auto-redirect overwriting it\n const userInitiatedSelectionRef = useRef<TimedPaneSelection | null>(null);\n\n const selectPane = useTmuxStore((state) => state.selectPane);\n\n const snapshot = useTmuxStore((state) => (deviceId ? state.snapshots[deviceId] : undefined));\n const deviceError = useTmuxStore((state) =>\n deviceId ? state.deviceErrors?.[deviceId] : undefined\n );\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const resolvedPaneId = useMemo(() => decodePaneIdFromUrlParam(paneId), [paneId]);\n const draftKey = useMemo(\n () => (deviceId && resolvedPaneId ? `${deviceId}:${resolvedPaneId}` : null),\n [deviceId, resolvedPaneId]\n );\n\n const [isMobile, setIsMobile] = useState(false);\n const [editorText, setEditorText] = useState('');\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const isComposingRef = useRef(false);\n // Loading state - false when connected and has pane\n const isLoading = !deviceConnected || !resolvedPaneId;\n const [keyboardInsetBottom, setKeyboardInsetBottom] = useState(0);\n const [editorDockHeight, setEditorDockHeight] = useState(0);\n const [isSending, setIsSending] = useState(false);\n const inputMode = useUIStore((state) => state.inputMode);\n const uiTheme = useUIStore((state) => state.theme);\n const editorSendWithEnter = useUIStore((state) => state.editorSendWithEnter);\n const setEditorSendWithEnter = useUIStore((state) => state.setEditorSendWithEnter);\n const addEditorHistory = useUIStore((state) => state.addEditorHistory);\n const setEditorDraft = useUIStore((state) => state.setEditorDraft);\n const removeEditorDraft = useUIStore((state) => state.removeEditorDraft);\n const paneEditorDraft = useUIStore((state) =>\n draftKey ? (state.editorDrafts[draftKey] ?? '') : ''\n );\n const isIOSBrowser = useMemo(() => isIOSMobileBrowser(), []);\n const shouldDockEditor = isMobile && inputMode === 'editor' && isIOSBrowser && isEditorFocused;\n\n const windows = snapshot?.session?.windows;\n const terminalTheme = uiTheme === 'light' ? XTERM_THEME_LIGHT : XTERM_THEME_DARK;\n\n const { data: devicesData } = useQuery({\n queryKey: ['devices'],\n queryFn: async () => {\n const res = await fetch('/api/devices');\n if (!res.ok) {\n throw new Error('Failed to fetch devices');\n }\n return res.json() as Promise<{ devices: Device[] }>;\n },\n throwOnError: false,\n });\n\n const currentDevice = useMemo(() => {\n if (!deviceId) {\n return undefined;\n }\n return devicesData?.devices.find((device) => device.id === deviceId);\n }, [deviceId, devicesData?.devices]);\n\n const selectedWindow = useMemo(() => {\n if (!windowId || !windows) return undefined;\n return windows.find((win) => win.id === windowId);\n }, [windowId, windows]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((pane) => pane.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const hasWindowSnapshot = Boolean(windows);\n const isWindowMissing = hasWindowSnapshot && Boolean(windowId) && !selectedWindow;\n const isPaneMissing =\n hasWindowSnapshot &&\n Boolean(windowId) &&\n Boolean(resolvedPaneId) &&\n Boolean(selectedWindow) &&\n !selectedPane;\n\n const invalidSelectionMessage = isWindowMissing\n ? t('wsError.checkGateway')\n : isPaneMissing\n ? t('wsError.checkGateway')\n : null;\n\n const isSelectionInvalid = Boolean(invalidSelectionMessage);\n const canInteractWithPane = Boolean(deviceConnected && resolvedPaneId && !isSelectionInvalid);\n\n const terminalTopbarLabel = useMemo(() => {\n if (!selectedWindow || !selectedPane) {\n return null;\n }\n const deviceName = currentDevice?.name ?? deviceId;\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName,\n });\n }, [currentDevice?.name, deviceId, selectedPane, selectedWindow]);\n\n const snapshotActiveSelection = useMemo(() => {\n if (!windows || windows.length === 0) {\n return null;\n }\n const activeWindow = windows.find((win) => win.active);\n const activePane = activeWindow?.panes.find((pane) => pane.active);\n if (!activeWindow || !activePane) {\n return null;\n }\n return { windowId: activeWindow.id, paneId: activePane.id };\n }, [windows]);\n\n // Handle resize from terminal - use store directly to avoid unstable callback deps\n const handleResize = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().resizePane(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n // Handle sync from terminal\n const handleSync = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().syncPaneSize(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n const getSelectSize = useCallback(\n (targetWindowId?: string, targetPaneId?: string) => {\n const terminal = terminalRef.current;\n const terminalSize =\n terminal?.calculateSizeFromContainer() ?? terminal?.getSize() ?? undefined;\n if (terminalSize) {\n return terminalSize;\n }\n\n if (!targetWindowId || !targetPaneId || !windows) {\n return undefined;\n }\n\n const targetWindow = windows.find((window) => window.id === targetWindowId);\n const targetPane = targetWindow?.panes.find((pane) => pane.id === targetPaneId);\n if (!targetPane || targetPane.width <= 1 || targetPane.height <= 1) {\n return undefined;\n }\n\n return {\n cols: targetPane.width,\n rows: targetPane.height,\n };\n },\n [windows]\n );\n\n // Mobile detection\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768 || 'ontouchstart' in window);\n };\n\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // iOS address bar collapse\n useEffect(() => {\n if (!isMobile || !isIOSBrowser || iosAddressBarCollapseTried.current) {\n return;\n }\n\n iosAddressBarCollapseTried.current = true;\n const collapseAddressBar = () => {\n window.scrollTo(0, 1);\n };\n\n const rafId = window.requestAnimationFrame(collapseAddressBar);\n const timerA = window.setTimeout(collapseAddressBar, 120);\n const timerB = window.setTimeout(collapseAddressBar, 420);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerA);\n window.clearTimeout(timerB);\n };\n }, [isIOSBrowser, isMobile]);\n\n // Reset editor focus when switching modes\n useEffect(() => {\n if (inputMode !== 'editor') {\n setIsEditorFocused(false);\n }\n }, [inputMode]);\n\n // iOS keyboard inset handling\n useEffect(() => {\n if (!(isMobile && isIOSBrowser && inputMode === 'editor' && isEditorFocused)) {\n setKeyboardInsetBottom(0);\n return;\n }\n\n let frameId: number | null = null;\n const updateKeyboardInset = () => {\n const viewport = window.visualViewport;\n const viewportHeight = viewport?.height ?? window.innerHeight;\n const offsetTop = viewport?.offsetTop ?? 0;\n const nextInset = Math.max(0, Math.round(window.innerHeight - viewportHeight - offsetTop));\n setKeyboardInsetBottom(nextInset);\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateKeyboardInset();\n });\n };\n\n updateKeyboardInset();\n\n window.visualViewport?.addEventListener('resize', scheduleUpdate);\n window.visualViewport?.addEventListener('scroll', scheduleUpdate);\n window.addEventListener('resize', scheduleUpdate);\n\n return () => {\n window.visualViewport?.removeEventListener('resize', scheduleUpdate);\n window.visualViewport?.removeEventListener('scroll', scheduleUpdate);\n window.removeEventListener('resize', scheduleUpdate);\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n };\n }, [inputMode, isEditorFocused, isIOSBrowser, isMobile]);\n\n // Editor dock height handling\n useEffect(() => {\n if (!shouldDockEditor) {\n setEditorDockHeight(0);\n return;\n }\n\n const editorContainer = editorContainerRef.current;\n if (!editorContainer) {\n return;\n }\n\n const updateEditorHeight = () => {\n setEditorDockHeight(Math.ceil(editorContainer.getBoundingClientRect().height));\n };\n\n updateEditorHeight();\n const observer = new ResizeObserver(updateEditorHeight);\n observer.observe(editorContainer);\n\n return () => observer.disconnect();\n }, [shouldDockEditor]);\n\n // Ensure device is connected when viewing (GlobalDeviceProvider handles actual connection)\n // This effect resets auto-selection logic and related refs when deviceId changes\n useEffect(() => {\n if (!deviceId) return;\n autoSelected.current = false;\n lastHandledActiveRef.current = null;\n lastSnapshotActiveRef.current = null;\n userInitiatedSelectionRef.current = null;\n recentSelectRequestsRef.current = [];\n }, [deviceId]);\n\n // Reset autoSelected when device connection changes\n useEffect(() => {\n if (!deviceConnected) {\n autoSelected.current = false;\n }\n }, [deviceConnected]);\n\n // Handle window/pane changes - both external and from sidebar navigation\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId) return;\n\n // If snapshot not yet arrived, don't navigate (loading state)\n if (!windows) {\n return;\n }\n\n // If no windows left (all closed), navigate to fallback\n if (windows.length === 0) {\n navigate('/devices', { replace: true });\n return;\n }\n\n // Find the target window\n const targetWindow = windows.find((w) => w.id === windowId);\n if (!targetWindow) {\n // Window doesn't exist in snapshot yet.\n // Wait for snapshot to arrive. Don't redirect to another window,\n // as the user may have explicitly navigated to this specific window.\n return;\n }\n\n // If no paneId in URL, select the active pane in this window\n if (!resolvedPaneId) {\n const targetPane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (targetPane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(targetPane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n\n // Check if current pane exists in the window\n const currentPane = targetWindow.panes.find((p) => p.id === resolvedPaneId);\n if (!currentPane) {\n // Pane was closed, navigate to active pane in same window\n const activePane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (activePane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n }, [deviceId, deviceConnected, windows, windowId, resolvedPaneId, navigate]);\n\n // Auto-select pane on initial load only\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n // If we already have window and pane selected, skip\n if (windowId && resolvedPaneId) return;\n // If autoSelect already done, skip\n if (autoSelected.current) return;\n\n // Select the active window's active pane (initial load)\n const activeWindow = windows.find((win) => win.active) ?? windows[0];\n const activePane = activeWindow.panes.find((pane) => pane.active) ?? activeWindow.panes[0];\n if (!activePane) return;\n\n autoSelected.current = true;\n navigate(\n `/devices/${deviceId}/windows/${activeWindow.id}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }, [deviceConnected, deviceId, navigate, resolvedPaneId, windowId, windows]);\n\n // 跟踪当前 Terminal 实例已下发过的 SELECT_START:device/pane 变化时 Terminal 重挂载,\n // 需要让下面的 select 效果重新派发(否则切到其他 device 再切回会命中短路、终端空白)\n const lastDispatchedSelectRef = useRef<string | null>(null);\n useEffect(() => {\n lastDispatchedSelectRef.current = null;\n }, [deviceId, resolvedPaneId]);\n\n // Select pane when ready\n useEffect(() => {\n if (!deviceId || !windowId || !resolvedPaneId) return;\n // Allow sending TMUX_SELECT before WS is READY: borsh client will queue messages and flush on READY.\n // Note: We don't check isSelectionInvalid here because when user navigates via URL,\n // the snapshot may not yet reflect the new window, but we should still send the select command.\n if (isLoading || !deviceConnected) return;\n\n const dispatchKey = `${deviceId}:${windowId}:${resolvedPaneId}`;\n if (lastDispatchedSelectRef.current === dispatchKey) {\n return;\n }\n lastDispatchedSelectRef.current = dispatchKey;\n\n const size = getSelectSize(windowId, resolvedPaneId);\n recordSelectRequest(windowId, resolvedPaneId);\n selectPane(deviceId, windowId, resolvedPaneId, size);\n }, [deviceConnected, deviceId, getSelectSize, isLoading, resolvedPaneId, selectPane, windowId]);\n\n // Treat explicit route selection as authoritative until snapshot/runtime catches up.\n useEffect(() => {\n if (!deviceId || !deviceConnected || !windowId || !resolvedPaneId) {\n return;\n }\n\n const routeTarget = { windowId, paneId: resolvedPaneId };\n if (\n !shouldTrackPendingRouteSelection({\n routeTarget,\n snapshotActive: snapshotActiveSelection,\n pendingUserSelection: userInitiatedSelectionRef.current,\n })\n ) {\n return;\n }\n\n userInitiatedSelectionRef.current = {\n windowId: routeTarget.windowId,\n paneId: routeTarget.paneId,\n at: Date.now(),\n };\n }, [deviceConnected, deviceId, resolvedPaneId, snapshotActiveSelection, windowId]);\n\n const recentSelectRequestsRef = useRef<Array<{ windowId: string; paneId: string; at: number }>>(\n []\n );\n const recordSelectRequest = useCallback((windowId: string, paneId: string) => {\n const now = Date.now();\n const next = [\n ...recentSelectRequestsRef.current.filter((r) => now - r.at < 2000),\n { windowId, paneId, at: now },\n ];\n recentSelectRequestsRef.current = next.slice(-8);\n }, []);\n\n // Subscribe to activePaneFromEvent for this device\n const activePaneFromEvent = useTmuxStore((state) =>\n deviceId ? state.activePaneFromEvent[deviceId] : undefined\n );\n\n // Follow active pane from event/tmux pane-active\n const lastHandledActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId || !resolvedPaneId) return;\n if (!activePaneFromEvent) return;\n\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldIgnoreActivePaneEvent({\n now,\n pendingUserSelection,\n activePaneFromEvent,\n currentRoute: { windowId, paneId: resolvedPaneId },\n recentSelectRequests: recentSelectRequestsRef.current,\n lastHandledActive: lastHandledActiveRef.current,\n })\n ) {\n return;\n }\n\n lastHandledActiveRef.current = { ...activePaneFromEvent };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === activePaneFromEvent.windowId &&\n pendingUserSelection.paneId === activePaneFromEvent.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // Send selectPane to gateway first\n const size = getSelectSize(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n recordSelectRequest(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n selectPane(deviceId, activePaneFromEvent.windowId, activePaneFromEvent.paneId, size);\n\n // Navigate to new URL\n navigate(\n `/devices/${deviceId}/windows/${activePaneFromEvent.windowId}/panes/${encodePaneIdForUrl(activePaneFromEvent.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windowId,\n resolvedPaneId,\n activePaneFromEvent,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Fallback: follow active from snapshot (for environments without pane-active event)\n const lastSnapshotActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n\n // Avoid snapshot-driven \"bounce back\" shortly after we send TMUX_SELECT.\n const recentRequests = recentSelectRequestsRef.current;\n const activeWindow = windows.find((w) => w.active);\n if (!activeWindow) return;\n\n const activePane = activeWindow.panes.find((p) => p.active);\n if (!activePane) return;\n\n const currentActive = { windowId: activeWindow.id, paneId: activePane.id };\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldSkipSnapshotFollow({\n now,\n pendingUserSelection,\n snapshotActive: currentActive,\n recentSelectRequests: recentRequests,\n })\n ) {\n return;\n }\n\n // Only follow when active actually changes\n if (\n lastSnapshotActiveRef.current &&\n lastSnapshotActiveRef.current.windowId === currentActive.windowId &&\n lastSnapshotActiveRef.current.paneId === currentActive.paneId\n ) {\n return;\n }\n\n // Update ref\n lastSnapshotActiveRef.current = { ...currentActive };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === currentActive.windowId &&\n pendingUserSelection.paneId === currentActive.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // If current URL matches, no need to navigate\n if (windowId === currentActive.windowId && resolvedPaneId === currentActive.paneId) {\n return;\n }\n\n // Send selectPane and navigate\n const size = getSelectSize(currentActive.windowId, currentActive.paneId);\n recordSelectRequest(currentActive.windowId, currentActive.paneId);\n selectPane(deviceId, currentActive.windowId, currentActive.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${currentActive.windowId}/panes/${encodePaneIdForUrl(currentActive.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windows,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Force-follow snapshot active after a user-initiated createWindow.\n // Wait for a snapshot whose active differs from the URL (proving the new\n // window is reflected), then navigate there.\n const pendingCreateWindowAt = useTmuxStore((state) =>\n deviceId ? state.pendingCreateWindowAt[deviceId] : undefined\n );\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!pendingCreateWindowAt) return;\n\n const ttlMs = 5000;\n const elapsed = Date.now() - pendingCreateWindowAt;\n if (elapsed > ttlMs) {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n return;\n }\n\n if (!snapshotActiveSelection) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n const target = snapshotActiveSelection;\n if (windowId === target.windowId && resolvedPaneId === target.paneId) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n userInitiatedSelectionRef.current = {\n windowId: target.windowId,\n paneId: target.paneId,\n at: Date.now(),\n };\n const size = getSelectSize(target.windowId, target.paneId);\n recordSelectRequest(target.windowId, target.paneId);\n selectPane(deviceId, target.windowId, target.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${target.windowId}/panes/${encodePaneIdForUrl(target.paneId)}`,\n { replace: true }\n );\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, [\n deviceId,\n deviceConnected,\n pendingCreateWindowAt,\n snapshotActiveSelection,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Sync pane size from remote\n useEffect(() => {\n if (!canInteractWithPane || !selectedPane || isLoading) return;\n\n const terminal = terminalRef.current;\n const term = terminal?.getTerminal();\n if (!term) return;\n\n const remoteCols = Math.max(2, Math.floor(selectedPane.width || 0));\n const remoteRows = Math.max(2, Math.floor(selectedPane.height || 0));\n if (!remoteCols || !remoteRows) return;\n\n const now = Date.now();\n const remoteSize = { cols: remoteCols, rows: remoteRows };\n const pendingLocalSize = terminal?.getPendingLocalSize() ?? null;\n if (\n !shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n })\n ) {\n return;\n }\n\n if (term.cols === remoteCols && term.rows === remoteRows) {\n return;\n }\n\n term.resize(remoteCols, remoteRows);\n }, [canInteractWithPane, isLoading, selectedPane]);\n\n // Scroll to bottom on input mode change\n useEffect(() => {\n void inputMode;\n const rafId = window.requestAnimationFrame(() => {\n terminalRef.current?.scrollToBottom();\n });\n const timerId = window.setTimeout(() => {\n terminalRef.current?.scrollToBottom();\n }, 120);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerId);\n };\n }, [inputMode]);\n\n // Device error toast\n useEffect(() => {\n if (!deviceError?.message) {\n return;\n }\n\n toast.error(deviceError.message);\n }, [deviceError?.message]);\n\n // Page title\n useEffect(() => {\n document.title = buildBrowserTitle(terminalTopbarLabel);\n return () => {\n document.title = siteName;\n };\n }, [siteName, terminalTopbarLabel]);\n\n // Jump to latest event\n useEffect(() => {\n const handler = () => {\n terminalRef.current?.scrollToBottom();\n };\n\n window.addEventListener('tmex:jump-to-latest', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:jump-to-latest', handler as EventListener);\n };\n }, []);\n\n // Listen for user-initiated selection from sidebar\n useEffect(() => {\n const handler = (\n event: CustomEvent<{ deviceId: string; windowId: string; paneId: string }>\n ) => {\n const { deviceId: eventDeviceId, windowId, paneId } = event.detail;\n // Only track if it's for the current device\n // Note: when switching devices, refs are reset in the deviceId effect above\n if (eventDeviceId === deviceId) {\n userInitiatedSelectionRef.current = { windowId, paneId, at: Date.now() };\n }\n };\n\n window.addEventListener('tmex:user-initiated-selection', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:user-initiated-selection', handler as EventListener);\n };\n }, [deviceId]);\n\n // Sync editor draft\n useEffect(() => {\n setEditorText(paneEditorDraft);\n }, [paneEditorDraft]);\n\n const handleSendShortcut = useCallback(\n (payload: string) => {\n if (!deviceId || !resolvedPaneId || !canInteractWithPane) {\n return;\n }\n\n // Send directly to the terminal's input handler\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n },\n [canInteractWithPane, deviceId, resolvedPaneId]\n );\n\n const handleEditorSend = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const payload = editorSendWithEnter ? `${editorText}\\r` : editorText;\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorSendWithEnter,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorSendLineByLine = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const lines = editorText.split(/\\r?\\n/);\n const store = useTmuxStore.getState();\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n store.sendInput(deviceId, resolvedPaneId, `${line}\\r`, false);\n }\n\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorFocus = useCallback(\n (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsEditorFocused(true);\n\n if (!(isMobile && isIOSBrowser)) {\n return;\n }\n\n const target = event.currentTarget;\n window.requestAnimationFrame(() => {\n target.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n });\n window.setTimeout(() => {\n window.scrollTo(0, 1);\n }, 60);\n },\n [isIOSBrowser, isMobile]\n );\n\n const handleEditorBlur = useCallback(() => {\n setIsEditorFocused(false);\n }, []);\n\n // 聚焦编辑器回调 - 必须在所有早期 return 之前定义\n const handleFocusEditor = useCallback(() => {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }, []);\n\n if (!deviceId) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <div className=\"rounded-lg border border-dashed border-border px-4 py-3 text-sm text-muted-foreground\">\n {t('device.noDevices')}\n </div>\n </div>\n );\n }\n\n const showConnecting = !deviceConnected && !deviceError;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\" data-testid=\"device-page\">\n <div\n className={`flex-1 relative overflow-hidden min-h-0 min-w-0 ${\n isMobile && inputMode === 'editor' && !shouldDockEditor ? 'pb-1' : ''\n }`}\n style={{\n paddingBottom: shouldDockEditor ? `${editorDockHeight + 60}px` : undefined,\n }}\n >\n <div\n className=\"h-full px-3 py-1 min-h-0 min-w-0 w-full relative flex rounded-xl\"\n style={{ backgroundColor: terminalTheme.background }}\n >\n {deviceConnected && resolvedPaneId ? (\n <div ref={terminalContainerRef} className=\"flex-1 h-full min-h-0 w-full\">\n <TerminalComponent\n key={`${deviceId}:${resolvedPaneId}`}\n ref={terminalRef}\n deviceId={deviceId}\n paneId={resolvedPaneId}\n theme={uiTheme}\n inputMode={inputMode}\n deviceConnected={deviceConnected}\n isSelectionInvalid={isSelectionInvalid}\n onResize={handleResize}\n onSync={handleSync}\n />\n </div>\n ) : (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center p-8 text-center\">\n <div className=\"max-w-sm space-y-4\">\n {!deviceConnected ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">🔌</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('device.disconnected')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('device.connectToStart')}</p>\n </>\n ) : !windowId ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">📋</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('window.noWindowSelected')}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('window.selectWindowToStart')}\n </p>\n </>\n ) : (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-lg font-medium\">{t('terminal.connecting')}</h3>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n\n {showConnecting && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-background/85 backdrop-blur-sm\"\n data-testid=\"terminal-status-overlay\"\n >\n <div className=\"flex flex-col items-center gap-2 rounded-lg border border-border bg-card/90 px-4 py-3 shadow-sm\">\n <div className=\"h-7 w-7 rounded-full border-2 border-primary border-t-transparent animate-spin\" />\n <span className=\"text-xs text-muted-foreground\" data-testid=\"terminal-status-text\">\n {t('terminal.connecting')}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* 快捷键栏:PC端和移动端 direct 模式都在终端下方 */}\n {inputMode === 'direct' && (\n <div className=\"\">\n <ShortcutsBar\n onSend={handleSendShortcut}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n </div>\n )}\n\n {inputMode === 'editor' && (\n <div\n ref={editorContainerRef}\n className={`editor-mode-input bg-card/85 backdrop-blur-sm ${\n shouldDockEditor ? 'fixed left-0 right-0 z-50' : ''\n }`}\n style={shouldDockEditor ? { bottom: `${keyboardInsetBottom}px` } : undefined}\n >\n {/* 移动端 editor 模式:快捷键栏在编辑器上方 */}\n {isMobile && (\n <ShortcutsBar\n onSend={handleSendShortcut}\n onFocusEditor={handleFocusEditor}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n )}\n <textarea\n ref={editorTextareaRef}\n data-testid=\"editor-input\"\n className=\"min-h-[88px] max-h-[28vh] w-full resize-y rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground shadow-xs outline-none transition-colors focus:border-ring\"\n value={editorText}\n onChange={(e) => {\n const nextText = e.target.value;\n setEditorText(nextText);\n if (!draftKey) {\n return;\n }\n if (nextText) {\n setEditorDraft(draftKey, nextText);\n return;\n }\n removeEditorDraft(draftKey);\n }}\n placeholder={t('terminal.inputPlaceholder')}\n onFocus={handleEditorFocus}\n onBlur={handleEditorBlur}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n }}\n />\n <div className=\"actions mt-2\">\n <div\n className=\"send-row flex flex-wrap items-center justify-end gap-2\"\n data-testid=\"editor-send-row\"\n >\n <div\n className=\"send-with-enter-toggle mr-auto flex items-center gap-2 text-xs text-muted-foreground\"\n data-testid=\"editor-send-with-enter-toggle\"\n >\n <Switch\n size=\"sm\"\n checked={editorSendWithEnter}\n onCheckedChange={(checked) => setEditorSendWithEnter(Boolean(checked))}\n />\n <span>{t('terminal.editorSendWithEnter')}</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n data-testid=\"editor-clear\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n setEditorText('');\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n title={t('terminal.clear')}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('terminal.clear')}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n data-testid=\"editor-send-line-by-line\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSendLineByLine();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('terminal.editorSendLineByLine')}\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n data-testid=\"editor-send\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSend();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('common.send')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// Page title component - shows terminal label\nexport function PageTitle() {\n const { deviceId, windowId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const snapshots = useTmuxStore((state) => state.snapshots);\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const snapshot = deviceId ? snapshots[deviceId] : undefined;\n const selectedWindow = useMemo(() => {\n if (!windowId || !snapshot?.session?.windows) return undefined;\n return snapshot.session.windows.find((w) => w.id === windowId);\n }, [windowId, snapshot]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((p) => p.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const title = useMemo(() => {\n if (selectedWindow && selectedPane) {\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName: siteName,\n });\n }\n return deviceId ?? '';\n }, [selectedWindow, selectedPane, siteName, deviceId]);\n\n return <>{title}</>;\n}\n\n// Page actions component - shows input mode toggle, jump to latest and refresh page\nexport function PageActions() {\n const { t } = useTranslation();\n const { deviceId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const inputMode = useUIStore((state) => state.inputMode);\n const setInputMode = useUIStore((state) => state.setInputMode);\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n\n const [showRefreshConfirm, setShowRefreshConfirm] = useState(false);\n\n const canInteract = Boolean(resolvedPaneId && deviceConnected);\n\n const handleToggleInputMode = () => {\n const newMode = inputMode === 'direct' ? 'editor' : 'direct';\n setInputMode(newMode);\n };\n\n const handleJumpToLatest = () => {\n window.dispatchEvent(new CustomEvent('tmex:jump-to-latest'));\n };\n\n const handleRefreshClick = () => {\n setShowRefreshConfirm(true);\n };\n\n const handleConfirmRefresh = () => {\n window.location.reload();\n };\n\n return (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleRefreshClick}\n aria-label={t('nav.refreshPage')}\n title={t('nav.refreshPage')}\n >\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleToggleInputMode}\n disabled={!canInteract}\n data-testid=\"terminal-input-mode-toggle\"\n aria-label={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n title={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n >\n {inputMode === 'direct' ? (\n <Keyboard className=\"h-4 w-4\" />\n ) : (\n <Smartphone className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleJumpToLatest}\n disabled={!canInteract}\n aria-label={t('nav.jumpToLatest')}\n title={t('nav.jumpToLatest')}\n >\n <ArrowDownToLine className=\"h-4 w-4\" />\n </Button>\n\n <AlertDialog open={showRefreshConfirm} onOpenChange={setShowRefreshConfirm}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t('nav.refreshPage')}</AlertDialogTitle>\n <AlertDialogDescription>{t('nav.refreshPageConfirm')}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setShowRefreshConfirm(false)}>\n {t('common.cancel')}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleConfirmRefresh}>\n {t('common.confirm')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"],"names":["__iconNode","ArrowDownToLine","createLucideIcon","Keyboard","RefreshCw","Smartphone","colorToCss","color","ensureContext","canvas","context","CanvasRenderer","options","__publicField","layer","theme","frame","targetRows","row","cols","rows","nextCols","nextRows","width","height","dpr","cssWidth","cssHeight","rects","rect","colors","y","defaultBackground","cell","x","bg","fg","cellWidth","meta","cursor","previous","cursorColor","cssColor","style","key","cached","font","css","KEY_UNIDENTIFIED","KEY_CODE_MAP","UNSHIFTED_CODEPOINTS","index","uppercase","lowercase","getGhosttyKeyCode","code","getUnshiftedCodepoint","value","GHOSTTY_SUCCESS","GHOSTTY_INVALID_VALUE","GHOSTTY_RENDER_STATE_DATA_COLS","GHOSTTY_RENDER_STATE_DATA_ROWS","GHOSTTY_RENDER_STATE_DATA_DIRTY","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING","GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL","GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY","GHOSTTY_RENDER_STATE_ROW_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR","GHOSTTY_ROW_DATA_WRAP","GHOSTTY_ROW_DATA_WRAP_CONTINUATION","GHOSTTY_CELL_DATA_WIDE","GHOSTTY_CELL_DATA_HAS_TEXT","ensureActive","resources","resultToDirtyState","resultToCursorStyle","resultToCellWidthKind","readColorAt","bindings","ptr","readOptionalColor","read","result","readBool","readU16","readU32","readEnumI32","readU64","readStyle","field","name","readCodepoints","graphemeLen","bufPtr","codepoints","codepointsToText","buildRowText","cells","text","readMeta","paletteOffset","palette","colorOffset","cursorHasValue","cursorViewportHasValue","readRow","rowIndex","rawRow","rawCell","widthKind","createRenderState","updateRenderState","terminalHandle","readRenderSnapshotMeta","iterateRows","disposeRenderStateResources","clampColumn","lineText","col","normalizeRange","anchor","focus","expandWord","line","safeCol","isWordChar","cursorChar","start","end","expandLine","lastCol","pointForMode","point","mode","getLineText","createEmptySelectionState","hasSelection","state","clearSelection","resolvePointerSelection","_previous","expanded","updateSelectionFocus","getSelectionRange","serializeSelectionText","range","segments","projectSelectionRects","viewportStartLine","viewportRows","viewportEndLine","lineWidth","middleWidth","hasCopyModifier","event","isCopyShortcut","writeSelectionToClipboard","_a","writeSelectionToCopyEvent","ghosttyWasmUrl","GHOSTTY_OUT_OF_SPACE","GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND","GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND","GHOSTTY_TERMINAL_OPT_COLOR_CURSOR","GHOSTTY_TERMINAL_OPT_COLOR_PALETTE","GHOSTTY_TERMINAL_DATA_COLS","GHOSTTY_TERMINAL_DATA_ROWS","GHOSTTY_TERMINAL_DATA_SCROLLBAR","GHOSTTY_POINT_TAG_VIEWPORT","GHOSTTY_SCROLL_VIEWPORT_TOP","GHOSTTY_SCROLL_VIEWPORT_BOTTOM","GHOSTTY_SCROLL_VIEWPORT_DELTA","GHOSTTY_KEY_ACTION_RELEASE","GHOSTTY_KEY_ACTION_PRESS","GHOSTTY_KEY_ACTION_REPEAT","GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL","GHOSTTY_MODE_BRACKETED_PASTE","GHOSTTY_MODE_X10_MOUSE","GHOSTTY_MODE_NORMAL_MOUSE","GHOSTTY_MODE_BUTTON_MOUSE","GHOSTTY_MODE_ANY_MOUSE","GHOSTTY_MODE_UTF8_MOUSE","GHOSTTY_MODE_SGR_MOUSE","GHOSTTY_MODE_URXVT_MOUSE","GHOSTTY_MODE_SGR_PIXELS_MOUSE","bindingsPromise","assertResult","action","parseHexRgb","hex","normalized","createAnsi256Palette","cube","red","green","blue","encodeMouseModifierBits","mods","encoded","encodeX10Byte","mouseButtonCode","button","keyboardEventToGhosttyMods","_b","StructAllocation","typeName","GhosttyBindings","exports","layout","len","type","fieldName","target","offset","data","scrollback","termPtrPtr","terminal","bytes","allocation","delta","behavior","foreground","background","paletteColors","palettePtr","assignRgb","paletteBytes","colsPtr","rowsPtr","scrollbar","valuePtr","enabled","emit","formatterOptions","extraOffset","extraView","screenOffset","screenView","outFormatterPtr","selectionOffset","formatter","outRef","coordOffset","coordView","safeCols","safeRows","selection","startOffset","endOffset","viewport","terminalSize","outPtrPtr","outLenPtr","outPtr","outLen","memoryByteLength","outStatePtr","option","outColorsPtr","outIteratorPtr","iterator","outCellsPtr","outEncoderPtr","encoder","trackLastCellPtr","trackingAny","trackingButton","trackingNormal","trackingX10","baseCode","column","pixelX","pixelY","suffix","encodedCode","encodedColumn","encodedRow","eventPtrPtr","eventHandle","utf8Allocation","requiredPtr","sizeResult","required","bufferPtr","writtenPtr","written","input","bracketed","outputPtr","loadGhosttyWasmBytes","source","response","getGhosttyBindings","wasmBytes","typeJsonPtr","DEFAULT_COLS","DEFAULT_ROWS","DEFAULT_CELL_WIDTH","DEFAULT_CELL_HEIGHT","AUTO_SCROLL_INTERVAL_MS","TERMINAL_ENGINE","GHOSTTY_MODE_ALT_SCROLL","GHOSTTY_MODE_ALT_SCREEN","GHOSTTY_MODE_ALT_SCREEN_SAVE","MOUSE_TRACKING_MODES","GHOSTTY_MOUSE_BUTTON_LEFT","GHOSTTY_MOUSE_BUTTON_MIDDLE","GHOSTTY_MOUSE_BUTTON_RIGHT","GHOSTTY_MOUSE_BUTTON_FOUR","GHOSTTY_MOUSE_BUTTON_FIVE","BufferLine","content","trimRight","TerminalBuffer","relativeIndex","viewportY","baseY","length","lines","shouldEncodeOnKeyDown","normalizeVisibleLines","expectedRows","pointerLikeEventToGhosttyMods","FitAddon","GhosttyTerminalController","proposed","keyEncoderHandle","mouseEncoderHandle","renderState","error","container","root","screen","textarea","scrollbarTrack","scrollbarThumb","measured","addon","callback","prevAltScreen","nextAltScreen","amount","snapshot","gesture","routing","consumed","disabled","element","dragEventTarget","moveListener","upListener","selectionText","payload","finalData","recentCompositionCommit","keyCode","utf8","mouseReporting","altScreen","cellHeight","pageLines","scaled","buttons","clientX","clientY","position","listener","cursorX","cursorY","left","top","selectionRects","visibleLines","thumb","trackHeight","ratio","thumbHeight","thumbTop","probe","repaint","resetSelectionData","shouldClear","_c","_d","detail","relativeX","relativeY","maxCol","maxRow","visibleIndex","visibleRow","dispose","createTerminalController","XTERM_THEME_LIGHT","XTERM_THEME_DARK","XTERM_FONT_FAMILY","normalizeHistoryForTerminal","canonical","ALT_SCREEN_HISTORY_PREAMBLE","wrapAlternateScreenHistory","normalizeLiveOutputForTerminal","previousEndedWithCR","prevWasCR","extraCRCount","byte","endedWithCR","writeIndex","TOUCH_SCROLL_GAIN","SCROLLBAR_TOUCH_HOTZONE_PX","useMobileTouch","containerRef","getTerminal","isActiveRef","useRef","useEffect","lastTouchY","touchId","bypassCustomScroll","pendingPixelDelta","isScrollbarElement","shouldBypassCustomScroll","eventTarget","directTarget","pointTarget","xtermRoot","insideX","insideY","findScrollTargets","el","findTouchById","touchList","i","touch","handleTouchStart","handleTouchMove","currentY","deltaY","didScroll","atTopWhilePullingDown","core","lineHeight","linesToScroll","beforeViewportY","_f","_e","afterViewportY","_h","_g","scrollTargets","previousScrollTop","nextScrollTop","wheelEvent","dispatched","handleTouchEnd","shouldApplyRemotePaneSize","now","remoteSize","pendingLocalSize","ttlMs","shouldSyncOnViewportRestore","currentSize","containerSize","force","useTerminalResize","deviceId","paneId","deviceConnected","isSelectionInvalid","onResize","onSync","getContainerRect","resizeRaf","resizeTimer","lastReportedSize","suppressLocalResizeUntil","postSelectResizeTimers","fitAddonRef","terminalRef","getContainerRectRef","viewportRestorePendingRef","onResizeRef","onSyncRef","measureTerminalSize","useCallback","term","fitAddon","containerRect","_j","_i","applyTerminalSize","reportSize","kind","measuredSize","lastSize","scheduleResize","immediate","run","clearPostSelectResizeTimers","id","runPostSelectResize","retryId","rafId","handleWindowResize","handleViewportRestore","handleVisibilityChange","handleWindowBlur","handleWindowFocus","setFitAddon","setTerminal","TERMINAL_CONFIG","TERMINAL_MODE_CACHE_KEY","readTerminalModeCache","raw","writeTerminalModeCache","parsed","createAlternateScreenFallbackSnapshot","reconcileRecoveredModes","alternateScreen","fallback","hasTrackingMode","setE2eTerminalProbe","g","clearE2eTerminalProbe","Terminal","forwardRef","inputMode","ref","instance","setInstance","useState","sendInput","useTmuxStore","terminalTheme","useMemo","mountRef","currentDeviceIdRef","currentPaneIdRef","attachedDeviceIdRef","attachedPaneIdRef","canWriteRef","currentInputModeRef","currentTerminalThemeRef","liveOutputEndedWithCR","keepShortHistoryVisibleRef","lastTerminalInstanceRef","skipNextDetachPersistRef","persistTerminalModes","targetDeviceId","targetPaneId","getTerminalForTouch","sendTerminalInput","activeDeviceId","activePaneId","cancelled","createdTerminal","callbacks","recoveredModes","buffer","chunk","getSelectStateMachine","ro","disposable","domEvent","useImperativeHandle","dims","_l","_k","_p","_o","_n","_m","jsx","RECENT_SELECT_REQUEST_TTL_MS","PENDING_USER_SELECTION_TTL_MS","matchesPaneSelection","right","getLatestRecentSelectRequest","recentSelectRequests","recentRequests","request","latest","resolvePendingUserSelection","pendingUserSelection","shouldIgnoreActivePaneEvent","params","latestRecentSelectRequest","shouldSkipSnapshotFollow","shouldTrackPendingRouteSelection","getSiteNameFallback","settings","useSiteStore","toSafeText","trimmed","buildTerminalLabel","paneIdx","windowIdx","paneTitle","windowName","deviceName","safeWindowIdx","safePaneIdx","safePaneTitle","safeDeviceName","buildBrowserTitle","label","siteName","isIOSMobileBrowser","userAgent","isIOSDevice","isTouchMac","EDITOR_SHORTCUTS","ShortcutsBar","memo","onSend","onFocusEditor","isMobile","shortcut","Button","e","DevicePage","t","useTranslation","windowId","useParams","navigate","useNavigate","terminalContainerRef","editorContainerRef","editorTextareaRef","autoSelected","iosAddressBarCollapseTried","userInitiatedSelectionRef","selectPane","deviceError","resolvedPaneId","decodePaneIdFromUrlParam","draftKey","setIsMobile","editorText","setEditorText","isEditorFocused","setIsEditorFocused","isComposingRef","isLoading","keyboardInsetBottom","setKeyboardInsetBottom","editorDockHeight","setEditorDockHeight","isSending","setIsSending","useUIStore","uiTheme","editorSendWithEnter","setEditorSendWithEnter","addEditorHistory","setEditorDraft","removeEditorDraft","paneEditorDraft","isIOSBrowser","shouldDockEditor","windows","devicesData","useQuery","res","currentDevice","device","selectedWindow","win","selectedPane","pane","hasWindowSnapshot","canInteractWithPane","terminalTopbarLabel","snapshotActiveSelection","activeWindow","activePane","handleResize","handleSync","getSelectSize","targetWindowId","targetWindow","window","targetPane","checkMobile","collapseAddressBar","timerA","timerB","frameId","updateKeyboardInset","viewportHeight","offsetTop","nextInset","scheduleUpdate","editorContainer","updateEditorHeight","observer","lastHandledActiveRef","lastSnapshotActiveRef","recentSelectRequestsRef","w","p","encodePaneIdForUrl","lastDispatchedSelectRef","dispatchKey","size","recordSelectRequest","routeTarget","next","r","activePaneFromEvent","currentActive","pendingCreateWindowAt","elapsed","timer","remoteCols","remoteRows","timerId","toast","handler","eventDeviceId","handleSendShortcut","handleEditorSend","handleEditorSendLineByLine","store","handleEditorFocus","handleEditorBlur","handleFocusEditor","showConnecting","jsxs","TerminalComponent","Fragment","Loader2","nextText","Switch","checked","Trash2","Send","PageTitle","snapshots","title","PageActions","setInputMode","showRefreshConfirm","setShowRefreshConfirm","canInteract","handleToggleInputMode","handleJumpToLatest","handleRefreshClick","handleConfirmRefresh","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"ifAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,EACMC,GAAkBC,GAAiB,qBAAsBF,EAAU,ECdzE;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,CAChF,EACMG,GAAWD,GAAiB,WAAYF,EAAU,ECpBxD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,qDAAsD,IAAK,QAAQ,CAAE,EACnF,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,sDAAuD,IAAK,QAAQ,CAAE,EACpF,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,EACMI,GAAYF,GAAiB,aAAcF,EAAU,ECf3D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACvF,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,EACMK,GAAaH,GAAiB,aAAcF,EAAU,ECuB5D,SAASM,GAAWC,EAAgC,CAClD,MAAO,OAAOA,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIA,EAAM,CAAC,GAC7C,CAEA,SAASC,GAAcC,EAAqD,CAC1E,MAAMC,EAAUD,EAAO,WAAW,IAAI,EACtC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,+BAA+B,EAGjD,OAAOA,CACT,CAEO,MAAMC,EAAe,CAuB1B,YAAYC,EAAgC,CAtBnCC,EAAA,YAAO,UAECA,EAAA,mBACAA,EAAA,wBACAA,EAAA,qBACAA,EAAA,oBACAA,EAAA,yBACAA,EAAA,sBACTA,EAAA,cACSA,EAAA,mBACAA,EAAA,iBACTA,EAAA,sBAAwC,CAAE,MAAO,EAAG,OAAQ,EAAA,GAC5DA,EAAA,YAAO,GACPA,EAAA,YAAO,GACPA,EAAA,kBAAgC,MAChCA,EAAA,kBAAa,GACbA,EAAA,qBAA0B,CAAA,GACjBA,EAAA,sBAAiB,KACjBA,EAAA,qBAAgB,KACzBA,EAAA,0BAAqB,IACrBA,EAAA,wBAA0D,MAGhE,KAAK,MAAQD,EAAQ,MACrB,KAAK,WAAaA,EAAQ,WAC1B,KAAK,SAAWA,EAAQ,SAExBA,EAAQ,cAAc,MAAM,SAAW,WACvCA,EAAQ,cAAc,MAAM,SAAW,SAEvC,KAAK,WAAa,SAAS,cAAc,QAAQ,EACjD,KAAK,gBAAkB,SAAS,cAAc,QAAQ,EACtD,KAAK,aAAe,SAAS,cAAc,QAAQ,EAEnD,SAAW,CAACH,EAAQK,CAAK,GAAK,CAC5B,CAAC,KAAK,WAAY,MAAM,EACxB,CAAC,KAAK,gBAAiB,WAAW,EAClC,CAAC,KAAK,aAAc,QAAQ,CAAA,EAE5BL,EAAO,QAAQ,MAAQK,EACvBL,EAAO,MAAM,SAAW,WACxBA,EAAO,MAAM,MAAQ,IACrBA,EAAO,MAAM,MAAQ,OACrBA,EAAO,MAAM,OAAS,OACtBA,EAAO,MAAM,cAAgB,OAC7BG,EAAQ,cAAc,YAAYH,CAAM,EAG1C,KAAK,YAAcD,GAAc,KAAK,UAAU,EAChD,KAAK,iBAAmBA,GAAc,KAAK,eAAe,EAC1D,KAAK,cAAgBA,GAAc,KAAK,YAAY,CACtD,CAEA,SAASO,EAA2B,CAClC,KAAK,MAAQA,EACb,KAAK,WAAW,MAAA,CAClB,CAEA,OAAOC,EAAkC,CAOvC,GANA,KAAK,YAAc,EACnB,KAAK,cAAgB,CAAA,EACrB,KAAK,eAAiBA,EAAM,eAC5B,KAAK,OAAOA,EAAM,KAAK,KAAMA,EAAM,KAAK,IAAI,EAC5C,KAAK,cAAcA,EAAM,gBAAkB,CAAA,EAAIA,EAAM,gBAAkB,KAAK,MAAM,mBAAmB,EAEjGA,EAAM,KAAK,QAAU,QAAS,CAChC,KAAK,WAAWA,EAAM,IAAI,EAC1B,MACF,CAGA,MAAMC,EADcD,EAAM,KAAK,QAAU,OACRA,EAAM,KAAOA,EAAM,KAAK,OAAQE,GAAQA,EAAI,KAAK,EAElF,UAAWA,KAAOD,EAChB,KAAK,QAAQC,EAAKF,EAAM,KAAK,MAAM,EACnC,KAAK,cAAc,KAAKE,EAAI,CAAC,EAG/B,KAAK,WAAWF,EAAM,IAAI,CAC5B,CAEA,eAA0C,CACxC,MAAO,CACL,KAAM,KAAK,KACX,WAAY,KAAK,WACjB,cAAe,CAAC,GAAG,KAAK,aAAa,CAAA,CAEzC,CAEA,SAAgB,CACd,KAAK,WAAW,OAAA,EAChB,KAAK,gBAAgB,OAAA,EACrB,KAAK,aAAa,OAAA,EAClB,KAAK,WAAW,MAAA,EAChB,KAAK,UAAU,MAAA,EACf,KAAK,WAAa,KAClB,KAAK,gBAAA,CACP,CAEQ,kBAAyB,CAC3B,KAAK,mBAGT,KAAK,iBAAmB,YAAY,IAAM,CACxC,KAAK,mBAAqB,CAAC,KAAK,mBAChC,KAAK,aAAa,MAAM,QAAU,KAAK,mBAAqB,IAAM,GACpE,EAAG,GAAI,EACT,CAEQ,iBAAwB,CAC1B,KAAK,mBACP,cAAc,KAAK,gBAAgB,EACnC,KAAK,iBAAmB,MAE1B,KAAK,mBAAqB,GAC1B,KAAK,aAAa,MAAM,QAAU,GACpC,CAEQ,OAAOG,EAAcC,EAAoB,CAC/C,MAAMC,EAAW,KAAK,IAAI,EAAGF,CAAI,EAC3BG,EAAW,KAAK,IAAI,EAAGF,CAAI,EAC3BG,EAAQF,EAAW,KAAK,eAAe,MACvCG,EAASF,EAAW,KAAK,eAAe,OACxCG,EAAM,KAAK,IAAI,EAAG,WAAW,kBAAoB,CAAC,EAExD,GAAI,KAAK,OAASJ,GAAY,KAAK,OAASC,EAAU,CACpD,MAAMI,EAAW,GAAGH,CAAK,KACnBI,EAAY,GAAGH,CAAM,KAC3B,GAAI,KAAK,WAAW,MAAM,QAAUE,GAAY,KAAK,WAAW,MAAM,SAAWC,EAC/E,MAEJ,CAEA,KAAK,KAAON,EACZ,KAAK,KAAOC,EAEZ,UAAWb,IAAU,CAAC,KAAK,WAAY,KAAK,gBAAiB,KAAK,YAAY,EAC5EA,EAAO,MAAQ,KAAK,IAAI,EAAG,KAAK,KAAKc,EAAQE,CAAG,CAAC,EACjDhB,EAAO,OAAS,KAAK,IAAI,EAAG,KAAK,KAAKe,EAASC,CAAG,CAAC,EACnDhB,EAAO,MAAM,MAAQ,GAAGc,CAAK,KAC7Bd,EAAO,MAAM,OAAS,GAAGe,CAAM,KAGjC,UAAWd,IAAW,CAAC,KAAK,YAAa,KAAK,iBAAkB,KAAK,aAAa,EAChFA,EAAQ,aAAae,EAAK,EAAG,EAAGA,EAAK,EAAG,CAAC,EACzCf,EAAQ,aAAe,MACvBA,EAAQ,sBAAwB,EAEpC,CAEQ,cAAckB,EAA+BrB,EAAqB,CAQxE,GAPA,KAAK,iBAAiB,UACpB,EACA,EACA,KAAK,KAAO,KAAK,eAAe,MAChC,KAAK,KAAO,KAAK,eAAe,MAAA,EAG9BqB,EAAM,SAAW,EAIrB,MAAK,iBAAiB,UAAYrB,EAClC,UAAWsB,KAAQD,EACjB,KAAK,iBAAiB,SACpBC,EAAK,EAAI,KAAK,eAAe,MAC7BA,EAAK,IAAM,KAAK,eAAe,OAC/BA,EAAK,MAAQ,KAAK,eAAe,MACjC,KAAK,eAAe,MAAA,EAG1B,CAEQ,QAAQX,EAAuBY,EAAmD,CACxF,MAAMC,EAAIb,EAAI,EAAI,KAAK,eAAe,OAChCK,EAAQ,KAAK,KAAO,KAAK,eAAe,MACxCS,EAAoB,KAAK,MAAMF,EAAO,UAAU,EAEtD,KAAK,YAAY,UAAU,EAAGC,EAAGR,EAAO,KAAK,eAAe,MAAM,EAClE,KAAK,YAAY,UAAYS,EAC7B,KAAK,YAAY,SAAS,EAAGD,EAAGR,EAAO,KAAK,eAAe,MAAM,EAEjE,UAAWU,KAAQf,EAAI,MAAO,CAC5B,GAAIe,EAAK,YAAc,eAAiBA,EAAK,YAAc,cACzD,SAGF,MAAMC,EAAID,EAAK,EAAI,KAAK,eAAe,MACjCE,EAAKF,EAAK,MAAM,QAClBA,EAAK,SAAWH,EAAO,WACvBG,EAAK,SAAWH,EAAO,WACrBM,EAAKH,EAAK,MAAM,QAClBA,EAAK,SAAWH,EAAO,WACvBG,EAAK,SAAWH,EAAO,WACrBO,EAAYJ,EAAK,YAAc,OAAS,KAAK,eAAe,MAAQ,EAAI,KAAK,eAAe,OAE9FE,EAAG,IAAML,EAAO,WAAW,GAAKK,EAAG,IAAML,EAAO,WAAW,GAAKK,EAAG,IAAML,EAAO,WAAW,KAC7F,KAAK,YAAY,UAAY,KAAK,MAAMK,CAAE,EAC1C,KAAK,YAAY,SAASD,EAAGH,EAAGM,EAAW,KAAK,eAAe,MAAM,GAGnE,GAACJ,EAAK,MAAQA,EAAK,MAAM,aAI7B,KAAK,YAAY,KAAO,KAAK,YAAYA,EAAK,KAAK,EACnD,KAAK,YAAY,UAAY,KAAK,MAAMG,CAAE,EAC1C,KAAK,YAAY,SAASH,EAAK,KAAMC,EAAGH,CAAC,EAErCE,EAAK,MAAM,UAAY,GACzB,KAAK,YAAY,SACfC,EACAH,EAAI,KAAK,eAAe,OAAS,EACjC,KAAK,IAAIM,EAAY,EAAG,CAAC,EACzB,CAAA,EAIAJ,EAAK,MAAM,eACb,KAAK,YAAY,SACfC,EACAH,EAAI,KAAK,eAAe,OAAS,IACjC,KAAK,IAAIM,EAAY,EAAG,CAAC,EACzB,CAAA,EAIAJ,EAAK,MAAM,UACb,KAAK,YAAY,SAASC,EAAGH,EAAI,EAAG,KAAK,IAAIM,EAAY,EAAG,CAAC,EAAG,CAAC,EAErE,CACF,CAEQ,WAAWC,EAAuC,CACxD,MAAMR,EAASQ,EAAK,OACdC,EAASD,EAAK,OACdE,EAAW,KAAK,WAQtB,GAPA,KAAK,cAAc,UACjB,EACA,EACA,KAAK,KAAO,KAAK,eAAe,MAChC,KAAK,KAAO,KAAK,eAAe,MAAA,EAG9B,CAACD,EAAO,SAAWA,EAAO,IAAM,MAAQA,EAAO,IAAM,KAAM,CAC7D,KAAK,WAAa,KAClB,KAAK,gBAAA,EACL,MACF,CAEA,MAAML,EAAIK,EAAO,EAAI,KAAK,eAAe,MACnCR,EAAIQ,EAAO,EAAI,KAAK,eAAe,OACnChB,EAAQgB,EAAO,SAAW,KAAK,eAAe,MAAQ,EAAI,KAAK,eAAe,MAC9EE,EAAcX,EAAO,QAAUA,EAAO,WACtCY,EAAW,KAAK,MAAMD,CAAW,EAEvC,KAAK,cAAc,UAAYC,EAC/B,KAAK,cAAc,YAAcA,EACjC,KAAK,cAAc,YAAc,GACjC,KAAK,cAAc,SACjBR,EACAH,EAAI,KAAK,eAAe,OAAS,EACjC,KAAK,IAAIR,EAAQ,EAAG,CAAC,EACrB,CAAA,EAEF,KAAK,cAAc,YAAc,EAEjC,KAAK,iBAAA,EAEL,KAAK,WAAa,CAChB,EAAGgB,EAAO,EACV,EAAGA,EAAO,EACV,MAAOA,EAAO,KAAA,EAIdC,IACCA,EAAS,IAAM,KAAK,WAAW,GAC9BA,EAAS,IAAM,KAAK,WAAW,GAC/BA,EAAS,QAAU,KAAK,WAAW,QAErC,KAAK,cAAc,KAAKA,EAAS,CAAC,CAEtC,CAEQ,YAAYG,EAA2D,CAC7E,MAAMC,EAAM,CACVD,EAAM,OAAS,SAAW,SAC1BA,EAAM,KAAO,MAAQ,MACrB,GAAG,KAAK,QAAQ,KAChB,KAAK,UAAA,EACL,KAAK,GAAG,EAEJE,EAAS,KAAK,UAAU,IAAID,CAAG,EACrC,GAAIC,EACF,OAAOA,EAGT,MAAMC,EAAO,GAAGH,EAAM,OAAS,UAAY,EAAE,GAAGA,EAAM,KAAO,OAAS,EAAE,GAAG,KAAK,QAAQ,MAAM,KAAK,UAAU,GAC7G,YAAK,UAAU,IAAIC,EAAKE,CAAI,EACrBA,CACT,CAEQ,MAAMvC,EAAgC,CAC5C,MAAMqC,EAAM,GAAGrC,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIA,EAAM,CAAC,GACtCsC,EAAS,KAAK,WAAW,IAAID,CAAG,EACtC,GAAIC,EACF,OAAOA,EAGT,MAAME,EAAMzC,GAAWC,CAAK,EAC5B,YAAK,WAAW,IAAIqC,EAAKG,CAAG,EACrBA,CACT,CACF,CC5WA,MAAMC,GAAmB,EAEnBC,GAAuC,CAC3C,UAAW,EACX,UAAW,EACX,YAAa,EACb,aAAc,EACd,MAAO,EACP,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,OAAQ,GACR,OAAQ,GACR,OAAQ,GACR,OAAQ,GACR,OAAQ,GACR,OAAQ,GACR,MAAO,GACP,cAAe,GACf,OAAQ,GACR,QAAS,GACT,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,MAAO,GACP,OAAQ,GACR,MAAO,GACP,UAAW,GACX,MAAO,GACP,QAAS,GACT,SAAU,GACV,UAAW,GACX,SAAU,GACV,YAAa,GACb,YAAa,GACb,aAAc,GACd,MAAO,GACP,SAAU,GACV,UAAW,GACX,UAAW,GACX,WAAY,GACZ,MAAO,GACP,IAAK,GACL,QAAS,GACT,SAAU,GACV,WAAY,GACZ,OAAQ,GACR,IAAK,GACL,KAAM,GACN,KAAM,GACN,OAAQ,GACR,SAAU,GACV,OAAQ,GACR,UAAW,GACX,UAAW,GACX,WAAY,GACZ,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,UAAW,GACX,gBAAiB,GACjB,YAAa,GACb,iBAAkB,GAClB,YAAa,GACb,cAAe,GACf,aAAc,GACd,YAAa,GACb,YAAa,GACb,gBAAiB,GACjB,kBAAmB,IACnB,mBAAoB,IACpB,kBAAmB,IACnB,qBAAsB,IACtB,eAAgB,IAChB,gBAAiB,IACjB,iBAAkB,IAClB,eAAgB,IAChB,gBAAiB,IACjB,SAAU,IACV,WAAY,IACZ,YAAa,IACb,WAAY,IACZ,YAAa,IACb,WAAY,IACZ,UAAW,IACX,aAAc,IACd,aAAc,IACd,aAAc,IACd,eAAgB,IAChB,OAAQ,IACR,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,GAAI,IACJ,OAAQ,IACR,YAAa,IACb,WAAY,IACZ,MAAO,IACP,YAAa,IACb,iBAAkB,IAClB,eAAgB,IAChB,YAAa,IACb,eAAgB,IAChB,cAAe,IACf,YAAa,IACb,MAAO,IACP,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,eAAgB,IAChB,YAAa,IACb,UAAW,IACX,eAAgB,IAChB,mBAAoB,IACpB,MAAO,IACP,MAAO,IACP,gBAAiB,IACjB,gBAAiB,IACjB,cAAe,IACf,OAAQ,IACR,KAAM,IACN,IAAK,IACL,MAAO,GACT,EAEMC,GAA+C,CACnD,UAAW,IACX,UAAW,KACX,YAAa,IACb,aAAc,IACd,MAAO,IACP,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,UAAW,IACX,MAAO,IACP,MAAO,IACP,cAAe,KACf,QAAS,IACT,OAAQ,IACV,EAEA,QAASC,EAAQ,EAAGA,GAAS,EAAGA,GAAS,EACvCD,GAAqB,QAAQC,CAAK,EAAE,EAAI,OAAOA,CAAK,EAGtD,QAASA,EAAQ,EAAGA,EAAQ,GAAIA,GAAS,EAAG,CAC1C,MAAMC,EAAY,OAAO,aAAa,GAAKD,CAAK,EAC1CE,EAAY,OAAO,aAAa,GAAKF,CAAK,EAChDD,GAAqB,MAAME,CAAS,EAAE,EAAIC,CAC5C,CAEO,SAASC,GAAkBC,EAAsB,CACtD,OAAON,GAAaM,CAAI,GAAKP,EAC/B,CAEO,SAASQ,GAAsBD,EAA6B,CACjE,MAAME,EAAQP,GAAqBK,CAAI,EACvC,OAAOE,EAAQA,EAAM,YAAY,CAAC,GAAK,KAAO,IAChD,CC3MA,MAAMC,GAAkB,EAClBC,GAAwB,GAExBC,GAAiC,EACjCC,GAAiC,EACjCC,GAAkC,EAClCC,GAAgD,GAChDC,GAA2C,GAC3CC,GAA4C,GAC5CC,GAAkD,GAClDC,GAAsD,GACtDC,GAA8C,GAC9CC,GAA8C,GAC9CC,GAAsD,GAEtDC,GAAsC,EACtCC,GAAoC,EAEpCC,GAA0C,EAC1CC,GAA4C,EAC5CC,GAAoD,EACpDC,GAAoD,EACpDC,GAA+C,EAC/CC,GAA+C,EAE/CC,GAAwB,EACxBC,GAAqC,EAErCC,GAAyB,EACzBC,GAA6B,EAYnC,SAASC,GAAaC,EAA8C,CAClE,GAAIA,EAAU,UAAYA,EAAU,oBAAsB,EACxD,MAAM,IAAI,MAAM,yCAAyC,CAE7D,CAEA,SAASC,GAAmB5B,EAAwC,CAClE,OAAQA,EAAA,CACN,IAAK,GACH,MAAO,OACT,IAAK,GACH,MAAO,UACT,QACE,MAAO,OAAA,CAEb,CAEA,SAAS6B,GAAoB7B,EAAyC,CACpE,OAAQA,EAAA,CACN,IAAK,GACH,MAAO,MACT,IAAK,GACH,MAAO,YACT,IAAK,GACH,MAAO,eACT,QACE,MAAO,OAAA,CAEb,CAEA,SAAS8B,GAAsB9B,EAAqC,CAClE,OAAQA,EAAA,CACN,IAAK,GACH,MAAO,OACT,IAAK,GACH,MAAO,cACT,IAAK,GACH,MAAO,cACT,QACE,MAAO,QAAA,CAEb,CAEA,SAAS+B,GAAYC,EAA2BC,EAA8B,CAC5E,MAAO,CACL,EAAGD,EAAS,OAAO,SAASC,CAAG,EAC/B,EAAGD,EAAS,KAAA,EAAO,SAASC,EAAM,CAAC,EACnC,EAAGD,EAAS,KAAA,EAAO,SAASC,EAAM,CAAC,CAAA,CAEvC,CAEA,SAASC,GACPP,EACAQ,EACwB,CACxB,MAAMrF,EAAQ6E,EAAU,SAAS,YAAY,iBAAiB,EAE9D,GAAI,CACF,MAAMS,EAASD,EAAKrF,EAAM,GAAG,EAC7B,GAAIsF,IAAWlC,GACb,OAAO,KAGT,GAAIkC,IAAWnC,GACb,MAAM,IAAI,MAAM,kDAAkDmC,CAAM,EAAE,EAG5E,OAAOL,GAAYJ,EAAU,SAAU7E,EAAM,GAAG,CAClD,QAAA,CACEA,EAAM,KAAA,CACR,CACF,CAEA,SAASuF,GACPV,EACAQ,EACS,CACT,MAAMF,EAAMN,EAAU,SAAS,QAAA,EAE/B,GAAI,CACF,MAAMS,EAASD,EAAKF,CAAG,EACvB,GAAI,OAAOG,GAAW,UAAYA,IAAWnC,GAC3C,MAAM,IAAI,MAAM,wCAAwCmC,CAAM,EAAE,EAGlE,OAAOT,EAAU,SAAS,OAAOM,CAAG,IAAM,CAC5C,QAAA,CACEN,EAAU,SAAS,OAAOM,CAAG,CAC/B,CACF,CAEA,SAASK,GACPX,EACAQ,EACQ,CACR,MAAMF,EAAMN,EAAU,SAAS,WAAW,CAAC,EAE3C,GAAI,CACF,MAAMS,EAASD,EAAKF,CAAG,EACvB,GAAI,OAAOG,GAAW,UAAYA,IAAWnC,GAC3C,MAAM,IAAI,MAAM,uCAAuCmC,CAAM,EAAE,EAGjE,OAAOT,EAAU,SAAS,KAAA,EAAO,UAAUM,EAAK,EAAI,CACtD,QAAA,CACEN,EAAU,SAAS,UAAUM,EAAK,CAAC,CACrC,CACF,CAEA,SAASM,GACPZ,EACAQ,EACQ,CACR,MAAMF,EAAMN,EAAU,SAAS,WAAW,CAAC,EAE3C,GAAI,CACF,MAAMS,EAASD,EAAKF,CAAG,EACvB,GAAI,OAAOG,GAAW,UAAYA,IAAWnC,GAC3C,MAAM,IAAI,MAAM,uCAAuCmC,CAAM,EAAE,EAGjE,OAAOT,EAAU,SAAS,KAAA,EAAO,UAAUM,EAAK,EAAI,CACtD,QAAA,CACEN,EAAU,SAAS,UAAUM,EAAK,CAAC,CACrC,CACF,CAEA,SAASO,GACPb,EACAQ,EACQ,CACR,MAAMF,EAAMN,EAAU,SAAS,WAAW,CAAC,EAE3C,GAAI,CACF,MAAMS,EAASD,EAAKF,CAAG,EACvB,GAAI,OAAOG,GAAW,UAAYA,IAAWnC,GAC3C,MAAM,IAAI,MAAM,wCAAwCmC,CAAM,EAAE,EAGlE,OAAOT,EAAU,SAAS,KAAA,EAAO,SAASM,EAAK,EAAI,CACrD,QAAA,CACEN,EAAU,SAAS,UAAUM,EAAK,CAAC,CACrC,CACF,CAEA,SAASQ,GACPd,EACAQ,EACQ,CACR,MAAMF,EAAMN,EAAU,SAAS,WAAW,CAAC,EAE3C,GAAI,CACF,MAAMS,EAASD,EAAKF,CAAG,EACvB,GAAI,OAAOG,GAAW,UAAYA,IAAWnC,GAC3C,MAAM,IAAI,MAAM,uCAAuCmC,CAAM,EAAE,EAGjE,OAAOT,EAAU,SAAS,QAAQM,CAAG,CACvC,QAAA,CACEN,EAAU,SAAS,UAAUM,EAAK,CAAC,CACrC,CACF,CAEA,SAASS,GAAUf,EAAgE,CACjF,MAAMzC,EAAQyC,EAAU,SAAS,YAAY,cAAc,EAE3D,GAAI,CACFA,EAAU,SAAS,SACjBzC,EAAM,KACN,eACA,OACAyC,EAAU,SAAS,SAAS,cAAc,CAAA,EAE5CA,EAAU,SAAS,2BACjBA,EAAU,eACVV,GACA/B,EAAM,GAAA,EAGR,MAAMyD,EAASC,GAAiBjB,EAAU,SAAS,MAAM,eAAgBiB,CAAI,EAAE,OAC/E,MAAO,CACL,KAAM1D,EAAM,KAAK,SAASyD,EAAM,MAAM,CAAC,IAAM,EAC7C,OAAQzD,EAAM,KAAK,SAASyD,EAAM,QAAQ,CAAC,IAAM,EACjD,MAAOzD,EAAM,KAAK,SAASyD,EAAM,OAAO,CAAC,IAAM,EAC/C,MAAOzD,EAAM,KAAK,SAASyD,EAAM,OAAO,CAAC,IAAM,EAC/C,QAASzD,EAAM,KAAK,SAASyD,EAAM,SAAS,CAAC,IAAM,EACnD,UAAWzD,EAAM,KAAK,SAASyD,EAAM,WAAW,CAAC,IAAM,EACvD,cAAezD,EAAM,KAAK,SAASyD,EAAM,eAAe,CAAC,IAAM,EAC/D,SAAUzD,EAAM,KAAK,SAASyD,EAAM,UAAU,CAAC,IAAM,EACrD,UAAWzD,EAAM,KAAK,SAASyD,EAAM,WAAW,EAAG,EAAI,CAAA,CAE3D,QAAA,CACEzD,EAAM,KAAA,CACR,CACF,CAEA,SAAS2D,GAAelB,EAAkD,CACxE,MAAMmB,EAAcP,GAAQZ,EAAYM,GACtCN,EAAU,SAAS,iCACjBA,EAAU,eACVT,GACAe,CAAA,CACF,EAGF,GAAIa,IAAgB,EAClB,MAAO,CAAA,EAGT,MAAMC,EAASpB,EAAU,SAAS,WAAWmB,EAAc,CAAC,EAE5D,GAAI,CACFnB,EAAU,SAAS,2BACjBA,EAAU,eACVR,GACA4B,CAAA,EAGF,MAAMC,EAAuB,CAAA,EAC7B,QAAStD,EAAQ,EAAGA,EAAQoD,EAAapD,GAAS,EAChDsD,EAAW,KAAKrB,EAAU,SAAS,KAAA,EAAO,UAAUoB,EAASrD,EAAQ,EAAG,EAAI,CAAC,EAG/E,OAAOsD,CACT,QAAA,CACErB,EAAU,SAAS,UAAUoB,EAAQD,EAAc,CAAC,CACtD,CACF,CAEA,SAASG,GAAiBD,EAA8B,CACtD,GAAIA,EAAW,SAAW,EACxB,MAAO,GAGT,GAAI,CACF,OAAO,OAAO,cAAc,GAAGA,CAAU,CAC3C,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAASE,GAAaC,EAAoC,CACxD,IAAIC,EAAO,GAEX,UAAW5E,KAAQ2E,EACjB,GAAI,EAAA3E,EAAK,YAAc,eAAiBA,EAAK,YAAc,eAI3D,IAAIA,EAAK,KAAM,CACb4E,GAAQ5E,EAAK,KACb,QACF,CAEIA,EAAK,YAAc,WACrB4E,GAAQ,KAIZ,OAAOA,CACT,CAEA,SAASC,GAAS1B,EAAmE,CACnF,MAAMtD,EAASsD,EAAU,SAAS,YAAY,0BAA0B,EAExE,GAAI,CACFA,EAAU,SAAS,SACjBtD,EAAO,KACP,2BACA,OACAsD,EAAU,SAAS,SAAS,0BAA0B,CAAA,EAExDA,EAAU,SAAS,qBAAqBA,EAAU,kBAAmBtD,EAAO,GAAG,EAE/E,MAAMiF,EAAgB3B,EAAU,SAAS,MAAM,2BAA4B,SAAS,EAAE,OAChF4B,EAA6B,CAAA,EACnC,QAAS7D,EAAQ,EAAGA,EAAQ,IAAKA,GAAS,EAAG,CAC3C,MAAM8D,EAAcnF,EAAO,IAAMiF,EAAgB5D,EAAQ,EACzD6D,EAAQ,KAAKxB,GAAYJ,EAAU,SAAU6B,CAAW,CAAC,CAC3D,CAEA,MAAMC,EACJpF,EAAO,KAAK,SACVsD,EAAU,SAAS,MAAM,2BAA4B,kBAAkB,EAAE,MAAA,IACrE,EAEF+B,EAAyBrB,GAASV,EAAYM,GAClDN,EAAU,SAAS,0BACjBA,EAAU,kBACVjB,GACAuB,CAAA,CACF,EAGF,MAAO,CACL,KAAMK,GAAQX,EAAYM,GACxBN,EAAU,SAAS,0BACjBA,EAAU,kBACVxB,GACA8B,CAAA,CACF,EAEF,KAAMK,GAAQX,EAAYM,GACxBN,EAAU,SAAS,0BACjBA,EAAU,kBACVvB,GACA6B,CAAA,CACF,EAEF,MAAOL,GACLY,GAAYb,EAAYM,GACtBN,EAAU,SAAS,0BACjBA,EAAU,kBACVtB,GACA4B,CAAA,CACF,CACF,EAEF,OAAQ,CACN,WAAYF,GACVJ,EAAU,SACVtD,EAAO,IAAMsD,EAAU,SAAS,MAAM,2BAA4B,YAAY,EAAE,MAAA,EAElF,WAAYI,GACVJ,EAAU,SACVtD,EAAO,IAAMsD,EAAU,SAAS,MAAM,2BAA4B,YAAY,EAAE,MAAA,EAElF,OAAQ8B,EACJ1B,GACEJ,EAAU,SACVtD,EAAO,IAAMsD,EAAU,SAAS,MAAM,2BAA4B,QAAQ,EAAE,MAAA,EAE9E,KACJ,QAAA4B,CAAA,EAEF,OAAQ,CACN,MAAO1B,GACLW,GAAYb,EAAYM,GACtBN,EAAU,SAAS,0BACjBA,EAAU,kBACVrB,GACA2B,CAAA,CACF,CACF,EAEF,QAASI,GAASV,EAAYM,GAC5BN,EAAU,SAAS,0BACjBA,EAAU,kBACVpB,GACA0B,CAAA,CACF,EAEF,SAAUI,GAASV,EAAYM,GAC7BN,EAAU,SAAS,0BACjBA,EAAU,kBACVnB,GACAyB,CAAA,CACF,EAEF,cAAeI,GAASV,EAAYM,GAClCN,EAAU,SAAS,0BACjBA,EAAU,kBACVlB,GACAwB,CAAA,CACF,EAEF,EAAGyB,EACCpB,GAAQX,EAAYM,GAClBN,EAAU,SAAS,0BACjBA,EAAU,kBACVhB,GACAsB,CAAA,CACF,EAEF,KACJ,EAAGyB,EACCpB,GAAQX,EAAYM,GAClBN,EAAU,SAAS,0BACjBA,EAAU,kBACVf,GACAqB,CAAA,CACF,EAEF,KACJ,SAAUyB,EACNrB,GAASV,EAAYM,GACnBN,EAAU,SAAS,0BACjBA,EAAU,kBACVd,GACAoB,CAAA,CACF,EAEF,EAAA,CACN,CAEJ,QAAA,CACE5D,EAAO,KAAA,CACT,CACF,CAEA,SAASsF,GAAQhC,EAAwCiC,EAAoC,CAC3F,MAAMC,EAASpB,GAAQd,EAAYM,GACjCN,EAAU,SAAS,6BACjBA,EAAU,kBACVZ,GACAkB,CAAA,CACF,EAEFN,EAAU,SAAS,wBAAwBA,EAAU,kBAAmBA,EAAU,cAAc,EAEhG,MAAMwB,EAA6B,CAAA,EACnC,IAAI1E,EAAI,EACR,KAAOkD,EAAU,SAAS,uBAAuBA,EAAU,cAAc,GAAG,CAC1E,MAAMmC,EAAUrB,GAAQd,EAAYM,GAClCN,EAAU,SAAS,iCACjBA,EAAU,eACVX,GACAiB,CAAA,CACF,EAEIe,EAAaH,GAAelB,CAAS,EACrCoC,EAAYjC,GAChBU,GAAYb,EAAYM,GACtBN,EAAU,SAAS,sBAAsBmC,EAAStC,GAAwBS,CAAG,CAAA,CAC/E,EAEIzD,EAA0B,CAC9B,EAAAC,EACA,KAAMwE,GAAiBD,CAAU,EACjC,WAAAA,EACA,UAAAe,EACA,QAAS1B,GAASV,EAAYM,GAC5BN,EAAU,SAAS,sBAAsBmC,EAASrC,GAA4BQ,CAAG,CAAA,EAEnF,MAAOS,GAAUf,CAAS,EAC1B,QAASO,GAAkBP,EAAYM,GACrCN,EAAU,SAAS,iCACjBA,EAAU,eACVN,GACAY,CAAA,CACF,EAEF,QAASC,GAAkBP,EAAYM,GACrCN,EAAU,SAAS,iCACjBA,EAAU,eACVP,GACAa,CAAA,CACF,CACF,EAEFkB,EAAM,KAAK3E,CAAI,EACfC,GAAK,CACP,CAEA,MAAO,CACL,EAAGmF,EACH,MAAOvB,GAASV,EAAYM,GAC1BN,EAAU,SAAS,6BACjBA,EAAU,kBACVb,GACAmB,CAAA,CACF,EAEF,KAAMI,GAASV,EAAYM,GACzBN,EAAU,SAAS,qBAAqBkC,EAAQvC,GAAuBW,CAAG,CAAA,EAE5E,iBAAkBI,GAASV,EAAYM,GACrCN,EAAU,SAAS,qBAAqBkC,EAAQtC,GAAoCU,CAAG,CAAA,EAEzF,KAAMiB,GAAaC,CAAK,EACxB,MAAAA,CAAA,CAEJ,CAEO,SAASa,GAAkBhC,EAAwD,CACxF,MAAO,CACL,SAAAA,EACA,kBAAmBA,EAAS,kBAAA,EAC5B,kBAAmBA,EAAS,6BAAA,EAC5B,eAAgBA,EAAS,0BAAA,EACzB,gBAAiB,EACjB,SAAU,GACV,WAAY,IAAA,CAEhB,CAEO,SAASiC,GACdtC,EACAuC,EACM,CACNxC,GAAaC,CAAS,EACtBA,EAAU,SAAS,kBAAkBA,EAAU,kBAAmBuC,CAAc,EAChFvC,EAAU,SAAS,2BACjBA,EAAU,kBACVA,EAAU,iBAAA,EAEZA,EAAU,iBAAmB,EAC7BA,EAAU,WAAa,IACzB,CAEO,SAASwC,GACdxC,EAC2B,CAC3B,OAAAD,GAAaC,CAAS,EACjBA,EAAU,aACbA,EAAU,WAAa0B,GAAS1B,CAAS,GAGpCA,EAAU,UACnB,CAEO,SAAUyC,GACfzC,EAC8C,CAC9CD,GAAaC,CAAS,EACtB,MAAM9C,EAAOsF,GAAuBxC,CAAS,EAC7CA,EAAU,SAAS,2BACjBA,EAAU,kBACVA,EAAU,iBAAA,EAGZ,IAAIiC,EAAW,EACf,KACEA,EAAW/E,EAAK,MAChB8C,EAAU,SAAS,2BAA2BA,EAAU,iBAAiB,GAEzE,MAAMgC,GAAQhC,EAAWiC,CAAQ,EACjCA,GAAY,CAEhB,CAEO,SAASS,GAA4B1C,EAA8C,CACpFA,EAAU,WAIdA,EAAU,SAAW,GACjBA,EAAU,iBAAmB,IAC/BA,EAAU,SAAS,wBAAwBA,EAAU,cAAc,EACnEA,EAAU,eAAiB,GAEzBA,EAAU,oBAAsB,IAClCA,EAAU,SAAS,2BAA2BA,EAAU,iBAAiB,EACzEA,EAAU,kBAAoB,GAE5BA,EAAU,oBAAsB,IAClCA,EAAU,SAAS,gBAAgBA,EAAU,iBAAiB,EAC9DA,EAAU,kBAAoB,GAEhCA,EAAU,WAAa,KACzB,CCvkBA,SAAS2C,GAAYC,EAAkBC,EAAqB,CAC1D,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,IAAID,EAAS,OAAS,EAAG,CAAC,EAAG,KAAK,MAAMC,CAAG,CAAC,CAAC,CAChF,CAEA,SAASC,GAAeC,EAAwBC,EAAuC,CACrF,OAAID,EAAO,KAAOC,EAAM,KACf,CAAE,MAAOD,EAAQ,IAAKC,CAAA,EAG3BD,EAAO,KAAOC,EAAM,KACf,CAAE,MAAOA,EAAO,IAAKD,CAAA,EAG1BA,EAAO,KAAOC,EAAM,IACf,CAAE,MAAOD,EAAQ,IAAKC,CAAA,EAGxB,CAAE,MAAOA,EAAO,IAAKD,CAAA,CAC9B,CAEA,SAASE,GAAWC,EAAcL,EAAaD,EAAkC,CAC/E,GAAI,CAACA,EACH,MAAO,CACL,MAAO,CAAE,KAAAM,EAAM,IAAK,CAAA,EACpB,IAAK,CAAE,KAAAA,EAAM,IAAK,CAAA,CAAE,EAIxB,MAAMC,EAAUR,GAAYC,EAAUC,CAAG,EACnCO,EAAc/E,GAAkB,kBAAkB,KAAKA,CAAK,EAC5DgF,EAAaT,EAASO,CAAO,GAAK,GAExC,GAAI,CAACC,EAAWC,CAAU,EACxB,MAAO,CACL,MAAO,CAAE,KAAAH,EAAM,IAAKC,CAAA,EACpB,IAAK,CAAE,KAAAD,EAAM,IAAKC,CAAA,CAAQ,EAI9B,IAAIG,EAAQH,EACRI,EAAMJ,EACV,KAAOG,EAAQ,GAAKF,EAAWR,EAASU,EAAQ,CAAC,GAAK,EAAE,GACtDA,GAAS,EAEX,KAAOC,EAAM,EAAIX,EAAS,QAAUQ,EAAWR,EAASW,EAAM,CAAC,GAAK,EAAE,GACpEA,GAAO,EAGT,MAAO,CACL,MAAO,CAAE,KAAAL,EAAM,IAAKI,CAAA,EACpB,IAAK,CAAE,KAAAJ,EAAM,IAAKK,CAAA,CAAI,CAE1B,CAEA,SAASC,GAAWN,EAAcN,EAAkC,CAClE,MAAMa,EAAU,KAAK,IAAIb,EAAS,OAAS,EAAG,CAAC,EAC/C,MAAO,CACL,MAAO,CAAE,KAAAM,EAAM,IAAK,CAAA,EACpB,IAAK,CAAE,KAAAA,EAAM,IAAKO,CAAA,CAAQ,CAE9B,CAEA,SAASC,GACPC,EACAC,EACAC,EACgB,CAChB,MAAMjB,EAAWiB,EAAYF,EAAM,IAAI,EAEvC,OAAQC,EAAA,CACN,IAAK,OACH,OAAOX,GAAWU,EAAM,KAAMA,EAAM,IAAKf,CAAQ,EACnD,IAAK,OACH,OAAOY,GAAWG,EAAM,KAAMf,CAAQ,EACxC,QAAS,CACP,MAAMO,EAAUR,GAAYC,EAAUe,EAAM,GAAG,EAC/C,MAAO,CACL,MAAO,CAAE,KAAMA,EAAM,KAAM,IAAKR,CAAA,EAChC,IAAK,CAAE,KAAMQ,EAAM,KAAM,IAAKR,CAAA,CAAQ,CAE1C,CAAA,CAEJ,CAEO,SAASW,IAA4C,CAC1D,MAAO,CACL,OAAQ,KACR,MAAO,KACP,KAAM,WAAA,CAEV,CAEO,SAASC,GAAaC,EAAgC,CAC3D,MAAO,GAAQA,EAAM,QAAUA,EAAM,MACvC,CAEO,SAASC,IAAiC,CAC/C,OAAOH,GAAA,CACT,CAEO,SAASI,GACdC,EACAR,EACAE,EACgB,CAChB,MAAMO,EAAWV,GAAaC,EAAOA,EAAM,KAAME,CAAW,EAC5D,MAAO,CACL,OAAQO,EAAS,MACjB,MAAOA,EAAS,IAChB,KAAMT,EAAM,IAAA,CAEhB,CAEO,SAASU,GACdL,EACAL,EACAE,EACgB,CAChB,OAAKG,EAAM,OAIPA,EAAM,OAAS,OACV,CACL,GAAGA,EACH,MAAOR,GAAWG,EAAM,KAAME,EAAYF,EAAM,IAAI,CAAC,EAAE,GAAA,EAIvDK,EAAM,OAAS,OACV,CACL,GAAGA,EACH,MAAON,GAAaC,EAAO,OAAQE,CAAW,EAAE,GAAA,EAI7C,CACL,GAAGG,EACH,MAAO,CACL,KAAML,EAAM,KACZ,IAAKhB,GAAYkB,EAAYF,EAAM,IAAI,EAAGA,EAAM,GAAG,CAAA,CACrD,EAtBOK,CAwBX,CAEO,SAASM,GAAkBN,EAA8C,CAC9E,MAAI,CAACA,EAAM,QAAU,CAACA,EAAM,MACnB,KAGFlB,GAAekB,EAAM,OAAQA,EAAM,KAAK,CACjD,CAEO,SAASO,GACdP,EACAH,EACe,CACf,MAAMW,EAAQF,GAAkBN,CAAK,EACrC,GAAI,CAACQ,EACH,OAAO,KAGT,MAAMC,EAAqB,CAAA,EAC3B,QAASvB,EAAOsB,EAAM,MAAM,KAAMtB,GAAQsB,EAAM,IAAI,KAAMtB,GAAQ,EAAG,CACnE,MAAMzB,EAAOoC,EAAYX,CAAI,EAC7B,GAAIA,IAASsB,EAAM,MAAM,MAAQtB,IAASsB,EAAM,IAAI,KAAM,CACxDC,EAAS,KAAKhD,EAAK,MAAM+C,EAAM,MAAM,IAAKA,EAAM,IAAI,IAAM,CAAC,CAAC,EAC5D,QACF,CAEA,GAAItB,IAASsB,EAAM,MAAM,KAAM,CAC7BC,EAAS,KAAKhD,EAAK,MAAM+C,EAAM,MAAM,GAAG,CAAC,EACzC,QACF,CAEA,GAAItB,IAASsB,EAAM,IAAI,KAAM,CAC3BC,EAAS,KAAKhD,EAAK,MAAM,EAAG+C,EAAM,IAAI,IAAM,CAAC,CAAC,EAC9C,QACF,CAEAC,EAAS,KAAKhD,CAAI,CACpB,CAEA,OAAOgD,EAAS,KAAK;AAAA,CAAI,CAC3B,CAEO,SAASC,GACdV,EACAW,EACAC,EACAf,EACwB,CACxB,MAAMW,EAAQF,GAAkBN,CAAK,EACrC,GAAI,CAACQ,EACH,MAAO,CAAA,EAGT,MAAMK,EAAkBF,EAAoBC,EAAe,EACrDpI,EAAgC,CAAA,EACtC,QACM0G,EAAO,KAAK,IAAIsB,EAAM,MAAM,KAAMG,CAAiB,EACvDzB,GAAQ,KAAK,IAAIsB,EAAM,IAAI,KAAMK,CAAe,EAChD3B,GAAQ,EACR,CACA,MAAMpH,EAAMoH,EAAOyB,EACnB,GAAIzB,IAASsB,EAAM,MAAM,MAAQtB,IAASsB,EAAM,IAAI,KAAM,CACxDhI,EAAM,KAAK,CACT,IAAAV,EACA,EAAG0I,EAAM,MAAM,IACf,MAAOA,EAAM,IAAI,IAAMA,EAAM,MAAM,IAAM,CAAA,CAC1C,EACD,QACF,CAEA,GAAItB,IAASsB,EAAM,MAAM,KAAM,CAC7B,MAAMM,EAAYjB,EAAc,KAAK,IAAIA,EAAYX,CAAI,EAAE,OAASsB,EAAM,MAAM,IAAK,CAAC,EAAI,OAAO,iBACjGhI,EAAM,KAAK,CACT,IAAAV,EACA,EAAG0I,EAAM,MAAM,IACf,MAAOM,CAAA,CACR,EACD,QACF,CAEA,GAAI5B,IAASsB,EAAM,IAAI,KAAM,CAC3BhI,EAAM,KAAK,CACT,IAAAV,EACA,EAAG,EACH,MAAO0I,EAAM,IAAI,IAAM,CAAA,CACxB,EACD,QACF,CAEA,MAAMO,EAAclB,EAAcA,EAAYX,CAAI,EAAE,OAAS,OAAO,iBACpE1G,EAAM,KAAK,CACT,IAAAV,EACA,EAAG,EACH,MAAOiJ,CAAA,CACR,CACH,CAEA,OAAOvI,CACT,CCtQO,SAASwI,GAAgBC,EAA+B,CAC7D,OAAQA,EAAM,SAAWA,EAAM,UAAY,CAACA,EAAM,MACpD,CAEO,SAASC,GAAeD,EAA+B,CAC5D,OAAOD,GAAgBC,CAAK,GAAKA,EAAM,IAAI,gBAAkB,GAC/D,CAEA,eAAsBE,GAA0B1D,EAA6B,OACtEA,GAID,OAAO,UAAc,MAAe2D,EAAA,UAAU,YAAV,MAAAA,EAAqB,WAC3D,MAAM,UAAU,UAAU,UAAU3D,CAAI,CAE5C,CAEO,SAAS4D,GAA0BJ,EAAuBxD,EAAuB,CACtF,MAAI,CAACA,GAAQ,CAACwD,EAAM,cACX,IAGTA,EAAM,cAAc,QAAQ,aAAcxD,CAAI,EAC9CwD,EAAM,eAAA,EACC,GACT,CC1BA,MAAAK,GAAe,mCCGThH,GAAkB,EAClBiH,GAAuB,GAEvBC,GAAwC,GACxCC,GAAwC,GACxCC,GAAoC,GACpCC,GAAqC,GAErCC,GAA6B,EAC7BC,GAA6B,EAC7BC,GAAkC,EAClCC,GAA6B,EAE7BC,GAA8B,EAC9BC,GAAiC,EACjCC,GAAgC,EAEhCC,GAA6B,EAC7BC,GAA2B,EAC3BC,GAA4B,EAE5BC,GAA4C,EAE5CC,GAA+B,KAC/BC,GAAyB,EACzBC,GAA4B,IAC5BC,GAA4B,KAC5BC,GAAyB,KACzBC,GAA0B,KAC1BC,GAAyB,KACzBC,GAA2B,KAC3BC,GAAgC,KA8ItC,IAAIC,GAAmD,KAEvD,SAASC,EAAaxG,EAAgByG,EAAsB,CAC1D,GAAIzG,IAAWnC,GAIf,MAAM,IAAI,MAAM,GAAG4I,CAAM,uBAAuBzG,CAAM,EAAE,CAC1D,CAEA,SAAS0G,GAAYC,EAAuC,CAC1D,MAAMC,EAAaD,EAAI,KAAA,EAAO,QAAQ,KAAM,EAAE,EAC9C,GAAIC,EAAW,SAAW,EACxB,MAAM,IAAI,MAAM,qCAAqCD,CAAG,EAAE,EAG5D,MAAO,CACL,OAAO,SAASC,EAAW,MAAM,EAAG,CAAC,EAAG,EAAE,EAC1C,OAAO,SAASA,EAAW,MAAM,EAAG,CAAC,EAAG,EAAE,EAC1C,OAAO,SAASA,EAAW,MAAM,EAAG,CAAC,EAAG,EAAE,CAAA,CAE9C,CAEA,SAASC,GAAqB3L,EAAsD,CAoBlF,MAAMiG,EAAU,CAAC,GAnBF,CACbjG,EAAM,MACNA,EAAM,IACNA,EAAM,MACNA,EAAM,OACNA,EAAM,KACNA,EAAM,QACNA,EAAM,KACNA,EAAM,MACNA,EAAM,YACNA,EAAM,UACNA,EAAM,YACNA,EAAM,aACNA,EAAM,WACNA,EAAM,cACNA,EAAM,WACNA,EAAM,WAAA,EACN,IAAIwL,EAAW,CAES,EACpBI,EAAO,CAAC,EAAG,GAAI,IAAK,IAAK,IAAK,GAAG,EAEvC,UAAWC,KAAOD,EAChB,UAAWE,KAASF,EAClB,UAAWG,KAAQH,EACjB3F,EAAQ,KAAK,CAAC4F,EAAKC,EAAOC,CAAI,CAAC,EAKrC,QAAS3J,EAAQ,EAAGA,EAAQ,GAAIA,GAAS,EAAG,CAC1C,MAAMM,EAAQ,EAAIN,EAAQ,GAC1B6D,EAAQ,KAAK,CAACvD,EAAOA,EAAOA,CAAK,CAAC,CACpC,CAEA,OAAOuD,CACT,CAEA,SAAS+F,GAAwBC,EAAsB,CACrD,IAAIC,EAAU,EACd,OAAID,EAAQ,IAASC,GAAW,GAC5BD,EAAQ,IAASC,GAAW,GAC5BD,EAAQ,IAASC,GAAW,IACzBA,CACT,CAEA,SAASC,GAAczJ,EAA8B,CACnD,OAAIA,EAAQ,GAAKA,EAAQ,IAChB,KAGF,OAAO,aAAaA,EAAQ,EAAE,CACvC,CAEA,SAAS0J,GAAgBC,EAAkD,CACzE,OAAQA,EAAA,CACN,IAAK,GACH,MAAO,GACT,IAAK,GACH,MAAO,GACT,IAAK,GACH,MAAO,GACT,IAAK,GACH,MAAO,IACT,IAAK,GACH,MAAO,IACT,IAAK,GACH,MAAO,IACT,IAAK,GACH,MAAO,IACT,IAAK,GACH,MAAO,KACT,IAAK,GACH,MAAO,KACT,KAAK,KACL,KAAK,OACH,MAAO,GACT,QACE,OAAO,IAAA,CAEb,CAEO,SAASC,GAA2BhD,EAA8B,SACvE,IAAI2C,EAAO,EAEX,OAAI3C,EAAM,WAAU2C,GAAQ,GACxB3C,EAAM,UAAS2C,GAAQ,GACvB3C,EAAM,SAAQ2C,GAAQ,GACtB3C,EAAM,UAAS2C,GAAQ,IACvBxC,EAAAH,EAAM,mBAAN,MAAAG,EAAA,KAAAH,EAAyB,iBAAqB,KAC9CiD,EAAAjD,EAAM,mBAAN,MAAAiD,EAAA,KAAAjD,EAAyB,gBAAoB,IAE1C2C,CACT,CAEA,MAAMO,EAAiB,CACrB,YACmB9H,EACR+H,EACA9H,EACT,CAHiB,KAAA,SAAAD,EACR,KAAA,SAAA+H,EACA,KAAA,IAAA9H,CACR,CAEH,IAAI,MAAiB,CACnB,OAAO,KAAK,SAAS,KAAK,KAAK,IAAK,KAAK,SAAS,SAAS,KAAK,QAAQ,CAAC,CAC3E,CAEA,MAAa,CACX,KAAK,SAAS,UAAU,KAAK,IAAK,KAAK,SAAS,SAAS,KAAK,QAAQ,CAAC,CACzE,CACF,CAEO,MAAM+H,EAAgB,CAO3B,YAAYC,EAAyBC,EAAmB,CAN/C9M,EAAA,gBACAA,EAAA,eAEQA,EAAA,eAAU,IAAI,aACdA,EAAA,eAAU,IAAI,aAG7B,KAAK,QAAU6M,EACf,KAAK,OAASC,CAChB,CAEA,QAAsB,CACpB,OAAO,KAAK,QAAQ,OAAO,MAC7B,CAEA,MAAMjI,EAAM,EAAGkI,EAAM,KAAK,OAAA,EAAS,WAAalI,EAAiB,CAC/D,OAAO,IAAI,WAAW,KAAK,OAAA,EAAUA,EAAKkI,CAAG,CAC/C,CAEA,KAAKlI,EAAM,EAAGkI,EAAM,KAAK,OAAA,EAAS,WAAalI,EAAe,CAC5D,OAAO,IAAI,SAAS,KAAK,OAAA,EAAUA,EAAKkI,CAAG,CAC7C,CAEA,SAASJ,EAA0B,CACjC,MAAMK,EAAO,KAAK,OAAOL,CAAQ,EACjC,GAAI,CAACK,EACH,MAAM,IAAI,MAAM,yBAAyBL,CAAQ,EAAE,EAGrD,OAAOK,EAAK,IACd,CAEA,MAAML,EAAkBM,EAAgC,CACtD,MAAMD,EAAO,KAAK,OAAOL,CAAQ,EAC3BpH,EAAQyH,GAAA,YAAAA,EAAM,OAAOC,GAC3B,GAAI,CAACD,GAAQ,CAACzH,EACZ,MAAM,IAAI,MAAM,0BAA0BoH,CAAQ,IAAIM,CAAS,EAAE,EAGnE,OAAO1H,CACT,CAEA,YAAYoH,EAAoC,CAC9C,MAAM9H,EAAM,KAAK,WAAW,KAAK,SAAS8H,CAAQ,CAAC,EACnD,YAAK,MAAM9H,EAAK,KAAK,SAAS8H,CAAQ,CAAC,EAAE,KAAK,CAAC,EACxC,IAAID,GAAiB,KAAMC,EAAU9H,CAAG,CACjD,CAEA,WAAWkI,EAAqB,CAC9B,OAAO,KAAK,QAAQ,4BAA4BA,CAAG,CACrD,CAEA,UAAUlI,EAAakI,EAAmB,CACxC,KAAK,QAAQ,2BAA2BlI,EAAKkI,CAAG,CAClD,CAEA,aAAsB,CACpB,OAAO,KAAK,QAAQ,0BAAA,CACtB,CAEA,WAAWlI,EAAmB,CAC5B,KAAK,QAAQ,yBAAyBA,CAAG,CAC3C,CAEA,SAAkB,CAChB,OAAO,KAAK,QAAQ,sBAAA,CACtB,CAEA,OAAOA,EAAmB,CACxB,KAAK,QAAQ,qBAAqBA,CAAG,CACvC,CAEA,YAAqB,CACnB,OAAO,KAAK,QAAQ,yBAAA,CACtB,CAEA,UAAUA,EAAmB,CAC3B,KAAK,QAAQ,wBAAwBA,CAAG,CAC1C,CAEA,YAAYA,EAAqB,CAC/B,OAAO,KAAK,KAAA,EAAO,UAAUA,EAAK,EAAI,CACxC,CAEA,OAAOA,EAAqB,CAC1B,OAAO,KAAK,OAAO,SAASA,CAAG,CACjC,CAEA,UAAUA,EAAqB,CAE3B,OAAO,KAAK,KAAA,EAAO,UAAUA,EAAK,EAAI,CAI1C,CAEA,QAAQA,EAAqB,CAC3B,OAAO,KAAK,KAAA,EAAO,aAAaA,EAAK,EAAI,CAC3C,CAEA,SAASqI,EAAkBP,EAAkBM,EAAmBrK,EAA+B,CAC7F,MAAM2C,EAAQ,KAAK,MAAMoH,EAAUM,CAAS,EACtCE,EAAS5H,EAAM,OAErB,OAAQA,EAAM,KAAA,CACZ,IAAK,KACL,IAAK,OACH2H,EAAO,SAASC,EAAQ,OAAOvK,CAAK,CAAC,EACrC,OACF,IAAK,MACHsK,EAAO,UAAUC,EAAQ,OAAOvK,CAAK,EAAG,EAAI,EAC5C,OACF,IAAK,MACHsK,EAAO,UAAUC,EAAQ,OAAOvK,CAAK,EAAG,EAAI,EAC5C,OACF,IAAK,MACHsK,EAAO,aAAaC,EAAQ,OAAOvK,CAAK,EAAG,EAAI,EAC/C,OACF,IAAK,QACyB,CAC1BsK,EAAO,UAAUC,EAAQ,OAAOvK,CAAK,EAAG,EAAI,EAC5C,MACF,CAIF,IAAK,MACL,IAAK,OACHsK,EAAO,SAASC,EAAQ,OAAOvK,CAAK,EAAG,EAAI,EAC3C,OACF,QACE,MAAM,IAAI,MAAM,0BAA0B+J,CAAQ,IAAIM,CAAS,KAAK1H,EAAM,IAAI,EAAE,CAAA,CAEtF,CAEA,YAAY6H,EAA8D,CACxE,MAAMhB,EAAU,KAAK,QAAQ,OAAOgB,CAAI,EAClCvI,EAAM,KAAK,WAAWuH,EAAQ,MAAM,EAC1C,YAAK,MAAMvH,EAAKuH,EAAQ,MAAM,EAAE,IAAIA,CAAO,EAEpC,CACL,IAAAvH,EACA,IAAKuH,EAAQ,OACb,KAAM,IAAM,KAAK,UAAUvH,EAAKuH,EAAQ,MAAM,CAAA,CAElD,CAEA,WAAWgB,EAAkE,CAC3E,MAAMvI,EAAM,KAAK,WAAWuI,EAAK,MAAM,EACvC,YAAK,MAAMvI,EAAKuI,EAAK,MAAM,EAAE,IAAIA,CAAI,EAE9B,CACL,IAAAvI,EACA,IAAKuI,EAAK,OACV,KAAM,IAAM,KAAK,UAAUvI,EAAKuI,EAAK,MAAM,CAAA,CAE/C,CAEA,cAAcvI,EAAakI,EAAqB,CAC9C,OAAO,KAAK,QAAQ,OAAO,KAAK,MAAMlI,EAAKkI,CAAG,CAAC,CACjD,CAEA,eAAezM,EAAcC,EAAc8M,EAA4B,CACrE,MAAMtN,EAAU,KAAK,YAAY,wBAAwB,EACzD,KAAK,SAASA,EAAQ,KAAM,yBAA0B,OAAQO,CAAI,EAClE,KAAK,SAASP,EAAQ,KAAM,yBAA0B,OAAQQ,CAAI,EAClE,KAAK,SAASR,EAAQ,KAAM,yBAA0B,iBAAkBsN,CAAU,EAElF,MAAMC,EAAa,KAAK,YAAA,EAExB,GAAI,CACF,OAAA9B,EACE,KAAK,QAAQ,qBAAqB,EAAG8B,EAAYvN,EAAQ,GAAG,EAC5D,sBAAA,EAEK,KAAK,YAAYuN,CAAU,CACpC,QAAA,CACEvN,EAAQ,KAAA,EACR,KAAK,WAAWuN,CAAU,CAC5B,CACF,CAEA,aAAaC,EAAwB,CACnC,KAAK,QAAQ,sBAAsBA,CAAQ,CAC7C,CAEA,QAAQA,EAAkBH,EAAiC,CACzD,MAAMI,EAAQ,OAAOJ,GAAS,SAAW,KAAK,QAAQ,OAAOA,CAAI,EAAIA,EAC/DK,EAAa,KAAK,WAAWD,CAAK,EAExC,GAAI,CACF,KAAK,QAAQ,0BAA0BD,EAAUE,EAAW,IAAKA,EAAW,GAAG,CACjF,QAAA,CACEA,EAAW,KAAA,CACb,CACF,CAEA,cAAcF,EAAwB,CACpC,KAAK,QAAQ,uBAAuBA,CAAQ,CAC9C,CAEA,eACEA,EACAjN,EACAC,EACAa,EACM,CACNoK,EACE,KAAK,QAAQ,wBACX+B,EACAjN,EACAC,EACA,KAAK,IAAI,EAAG,KAAK,MAAMa,EAAK,KAAK,CAAC,EAClC,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAK,MAAM,CAAC,CAAA,EAErC,yBAAA,CAEJ,CAEA,oBAAoBmM,EAAkBG,EAAqB,CACzD,MAAMC,EAAW,KAAK,YAAY,+BAA+B,EAEjE,GAAI,CACF,KAAK,SACHA,EAAS,KACT,gCACA,MACAlD,EAAA,EAEFkD,EAAS,KAAK,YACZ,KAAK,MAAM,gCAAiC,OAAO,EAAE,OACrD,OAAOD,CAAK,EACZ,EAAA,EAEF,KAAK,QAAQ,iCAAiCH,EAAUI,EAAS,GAAG,CACtE,QAAA,CACEA,EAAS,KAAA,CACX,CACF,CAEA,kBAAkBJ,EAAwB,CACxC,MAAMI,EAAW,KAAK,YAAY,+BAA+B,EAEjE,GAAI,CACF,KAAK,SACHA,EAAS,KACT,gCACA,MACApD,EAAA,EAEF,KAAK,QAAQ,iCAAiCgD,EAAUI,EAAS,GAAG,CACtE,QAAA,CACEA,EAAS,KAAA,CACX,CACF,CAEA,qBAAqBJ,EAAwB,CAC3C,MAAMI,EAAW,KAAK,YAAY,+BAA+B,EAEjE,GAAI,CACF,KAAK,SACHA,EAAS,KACT,gCACA,MACAnD,EAAA,EAEF,KAAK,QAAQ,iCAAiC+C,EAAUI,EAAS,GAAG,CACtE,QAAA,CACEA,EAAS,KAAA,CACX,CACF,CAEA,iBAAiBJ,EAAkBrN,EAA2B,CAC5D,MAAM0N,EAAa,KAAK,YAAY,iBAAiB,EAC/CC,EAAa,KAAK,YAAY,iBAAiB,EAC/CnM,EAAS,KAAK,YAAY,iBAAiB,EAC3CoM,EAAgBjC,GAAqB3L,CAAK,EAC1C6N,EAAa,KAAK,WAAWD,EAAc,OAAS,CAAC,EAErDE,EAAY,CAACd,EAA0BtK,IAAkB,CAC7D,KAAM,CAACmJ,EAAKC,EAAOC,CAAI,EAAIP,GAAY9I,CAAK,EAC5C,KAAK,SAASsK,EAAO,KAAM,kBAAmB,IAAKnB,CAAG,EACtD,KAAK,SAASmB,EAAO,KAAM,kBAAmB,IAAKlB,CAAK,EACxD,KAAK,SAASkB,EAAO,KAAM,kBAAmB,IAAKjB,CAAI,CACzD,EAEA+B,EAAUJ,EAAY1N,EAAM,UAAU,EACtC8N,EAAUH,EAAY3N,EAAM,UAAU,EACtC8N,EAAUtM,EAAQxB,EAAM,MAAM,EAE9B,MAAM+N,EAAe,KAAK,MAAMF,EAAYD,EAAc,OAAS,CAAC,EACpEA,EAAc,QAAQ,CAAC,CAAC/B,EAAKC,EAAOC,CAAI,EAAG3J,IAAU,CACnD,MAAM6K,EAAS7K,EAAQ,EACvB2L,EAAad,CAAM,EAAIpB,EACvBkC,EAAad,EAAS,CAAC,EAAInB,EAC3BiC,EAAad,EAAS,CAAC,EAAIlB,CAC7B,CAAC,EAED,GAAI,CACFT,EACE,KAAK,QAAQ,qBACX+B,EACAxD,GACA6D,EAAW,GAAA,EAEb,kCAAA,EAEFpC,EACE,KAAK,QAAQ,qBACX+B,EACAvD,GACA6D,EAAW,GAAA,EAEb,kCAAA,EAEFrC,EACE,KAAK,QAAQ,qBAAqB+B,EAAUtD,GAAmCvI,EAAO,GAAG,EACzF,8BAAA,EAEF8J,EACE,KAAK,QAAQ,qBACX+B,EACArD,GACA6D,CAAA,EAEF,+BAAA,CAEJ,QAAA,CACEH,EAAW,KAAA,EACXC,EAAW,KAAA,EACXnM,EAAO,KAAA,EACP,KAAK,UAAUqM,EAAYD,EAAc,OAAS,CAAC,CACrD,CACF,CAEA,iBAAiBP,EAAkD,CACjE,MAAMW,EAAU,KAAK,WAAW,CAAC,EAC3BC,EAAU,KAAK,WAAW,CAAC,EAEjC,GAAI,CACF,OAAA3C,EACE,KAAK,QAAQ,qBAAqB+B,EAAUpD,GAA4B+D,CAAO,EAC/E,4BAAA,EAEF1C,EACE,KAAK,QAAQ,qBAAqB+B,EAAUnD,GAA4B+D,CAAO,EAC/E,4BAAA,EAEK,CACL,KAAM,KAAK,KAAA,EAAO,UAAUD,EAAS,EAAI,EACzC,KAAM,KAAK,KAAA,EAAO,UAAUC,EAAS,EAAI,CAAA,CAE7C,QAAA,CACE,KAAK,UAAUD,EAAS,CAAC,EACzB,KAAK,UAAUC,EAAS,CAAC,CAC3B,CACF,CAEA,cAAcZ,EAAkE,CAC9E,MAAMa,EAAY,KAAK,YAAY,0BAA0B,EAE7D,GAAI,CACF,OAAA5C,EACE,KAAK,QAAQ,qBAAqB+B,EAAUlD,GAAiC+D,EAAU,GAAG,EAC1F,iCAAA,EAGK,CACL,MAAO,OACLA,EAAU,KAAK,aACb,KAAK,MAAM,2BAA4B,OAAO,EAAE,OAChD,EAAA,CACF,EAEF,OAAQ,OACNA,EAAU,KAAK,aACb,KAAK,MAAM,2BAA4B,QAAQ,EAAE,OACjD,EAAA,CACF,EAEF,IAAK,OACHA,EAAU,KAAK,aAAa,KAAK,MAAM,2BAA4B,KAAK,EAAE,OAAQ,EAAI,CAAA,CACxF,CAEJ,QAAA,CACEA,EAAU,KAAA,CACZ,CACF,CAEA,sBAAsBb,EAAkBpF,EAAuB,CAC7D,MAAMkG,EAAW,KAAK,QAAA,EAEtB,GAAI,CACF,OAAA7C,EACE,KAAK,QAAQ,0BAA0B+B,EAAUpF,EAAMkG,CAAQ,EAC/D,2BAAA,EAEK,KAAK,OAAOA,CAAQ,IAAM,CACnC,QAAA,CACE,KAAK,OAAOA,CAAQ,CACtB,CACF,CAEA,gBAAgBd,EAAkBpF,EAAcmG,EAAwB,CACtE9C,EACE,KAAK,QAAQ,0BAA0B+B,EAAUpF,EAAMmG,EAAU,EAAI,CAAC,EACtE,2BAAA,CAEJ,CAEA,gBACEf,EACAgB,EACAxO,EACQ,CACR,MAAMyO,EAAmB,KAAK,YAAY,iCAAiC,EACrEC,EAAc,KAAK,MAAM,kCAAmC,OAAO,EAAE,OACrEC,EAAY,KAAK,KACrBF,EAAiB,IAAMC,EACvB,KAAK,SAAS,+BAA+B,CAAA,EAEzCE,EAAe,KAAK,MAAM,gCAAiC,QAAQ,EAAE,OACrEC,EAAa,KAAK,KACtBJ,EAAiB,IAAMC,EAAcE,EACrC,KAAK,SAAS,6BAA6B,CAAA,EAEvCE,EAAkB,KAAK,YAAA,EAE7B,GAAI,CACF,KAAK,SACHL,EAAiB,KACjB,kCACA,OACA,KAAK,SAAS,iCAAiC,CAAA,EAEjD,KAAK,SAASA,EAAiB,KAAM,kCAAmC,OAAQD,CAAI,EACpF,KAAK,SACHC,EAAiB,KACjB,kCACA,SACAzO,EAAQ,MAAA,EAEV,KAAK,SACHyO,EAAiB,KACjB,kCACA,OACAzO,EAAQ,IAAA,EAEV,KAAK,SACH2O,EACA,gCACA,OACA,KAAK,SAAS,+BAA+B,CAAA,EAE/C,KAAK,SACHA,EACA,gCACA,UACA3O,EAAQ,cAAA,EAEV,KAAK,SACH6O,EACA,8BACA,OACA,KAAK,SAAS,6BAA6B,CAAA,EAE7C,MAAME,EAAkB,KAAK,MAAM,kCAAmC,WAAW,EAAE,OACnF,OAAAN,EAAiB,KAAK,UAAUM,EAAiB/O,EAAQ,cAAgB,EAAG,EAAI,EAEhFyL,EACE,KAAK,QAAQ,+BACX,EACAqD,EACAtB,EACAiB,EAAiB,GAAA,EAEnB,gCAAA,EAGK,KAAK,YAAYK,CAAe,CACzC,QAAA,CACEL,EAAiB,KAAA,EACjB,KAAK,WAAWK,CAAe,CACjC,CACF,CAEA,cAAcE,EAAyB,CACrC,KAAK,QAAQ,uBAAuBA,CAAS,CAC/C,CAEQ,uBACNxB,EACAlM,EACAH,EACyB,CACzB,MAAMgH,EAAQ,KAAK,YAAY,cAAc,EACvC8G,EAAS,KAAK,YAAY,gBAAgB,EAEhD,GAAI,CACF,KAAK,SAAS9G,EAAM,KAAM,eAAgB,MAAOoC,EAA0B,EAC3E,MAAM2E,EAAc,KAAK,MAAM,eAAgB,OAAO,EAAE,OAClDC,EAAY,KAAK,KACrBhH,EAAM,IAAM+G,EACZ,KAAK,SAAS,wBAAwB,CAAA,EAMxC,OAJA,KAAK,SAASC,EAAW,yBAA0B,IAAK7N,CAAC,EACzD,KAAK,SAAS6N,EAAW,yBAA0B,IAAKhO,CAAC,EAE1C,KAAK,QAAQ,0BAA0BqM,EAAUrF,EAAM,IAAK8G,EAAO,GAAG,IACtEnM,IACbmM,EAAO,KAAA,EACA,MAGFA,CACT,QAAA,CACE9G,EAAM,KAAA,CACR,CACF,CAEQ,wBACNqF,EACAjN,EACAC,EACyB,CACzB,MAAM4O,EAAW,KAAK,IAAI,EAAG,KAAK,MAAM7O,CAAI,CAAC,EACvC8O,EAAW,KAAK,IAAI,EAAG,KAAK,MAAM7O,CAAI,CAAC,EACvCsH,EAAQ,KAAK,uBAAuB0F,EAAU,EAAG,CAAC,EACxD,GAAI,CAAC1F,EACH,OAAO,KAGT,IAAIC,EAA+B,KACnC,QAASzH,EAAM+O,EAAW,EAAG/O,GAAO,IAClCyH,EAAM,KAAK,uBAAuByF,EAAU4B,EAAW,EAAG9O,CAAG,EACzD,CAAAyH,GAFiCzH,GAAO,EAE5C,CAKF,GAAI,CAACyH,EACH,OAAAD,EAAM,KAAA,EACC,KAGT,MAAMwH,EAAY,KAAK,YAAY,kBAAkB,EACrD,GAAI,CACF,KAAK,SAASA,EAAU,KAAM,mBAAoB,OAAQ,KAAK,SAAS,kBAAkB,CAAC,EAC3F,KAAK,SAASA,EAAU,KAAM,mBAAoB,YAAa,EAAK,EAEpE,MAAMC,EAAc,KAAK,MAAM,mBAAoB,OAAO,EAAE,OACtDC,EAAY,KAAK,MAAM,mBAAoB,KAAK,EAAE,OACxD,YAAK,MAAMF,EAAU,IAAMC,EAAa,KAAK,SAAS,gBAAgB,CAAC,EAAE,IACvE,KAAK,MAAMzH,EAAM,IAAK,KAAK,SAAS,gBAAgB,CAAC,CAAA,EAEvD,KAAK,MAAMwH,EAAU,IAAME,EAAW,KAAK,SAAS,gBAAgB,CAAC,EAAE,IACrE,KAAK,MAAMzH,EAAI,IAAK,KAAK,SAAS,gBAAgB,CAAC,CAAA,EAG9CuH,CACT,QAAA,CACExH,EAAM,KAAA,EACNC,EAAI,KAAA,CACN,CACF,CAEA,eACEyF,EACAgB,EACAxO,EACAyP,EACQ,CACR,MAAMC,EAAe,KAAK,iBAAiBlC,CAAQ,EAC7C8B,EAAY,KAAK,wBACrB9B,EACA,KAAK,IAAI,EAAG,KAAK,IAAIkC,EAAa,KAAMD,EAAS,IAAI,CAAC,EACtD,KAAK,IAAI,EAAG,KAAK,IAAIC,EAAa,KAAMD,EAAS,IAAI,CAAC,CAAA,EAElDT,EAAY,KAAK,gBAAgBxB,EAAUgB,EAAM,CACrD,GAAGxO,EACH,cAAcsP,GAAA,YAAAA,EAAW,MAAO,IAAA,CACjC,EAED,GAAI,CACF,OAAO,KAAK,gBAAgBN,CAAS,CACvC,QAAA,CACE,KAAK,cAAcA,CAAS,EAC5BM,GAAA,MAAAA,EAAW,MACb,CACF,CAEA,gBAAgBN,EAA2B,CACzC,MAAMW,EAAY,KAAK,YAAA,EACjBC,EAAY,KAAK,WAAA,EAEvB,GAAI,CACFnE,EACE,KAAK,QAAQ,+BAA+BuD,EAAW,EAAGW,EAAWC,CAAS,EAC9E,gCAAA,EAGF,MAAMC,EAAS,KAAK,YAAYF,CAAS,EACnCG,EAAS,KAAK,UAAUF,CAAS,EACjCG,EAAmB,KAAK,OAAA,EAAS,WAEvC,GAAI,CACF,GAAID,IAAW,GAAKD,IAAW,EAC7B,MAAO,GAGT,GAAIA,EAAS,GAAKA,EAASE,GAAoBD,EAASC,EAAmBF,EACzE,MAAM,IAAI,MACR,6DAA6DA,CAAM,QAAQC,CAAM,QAAQC,CAAgB,EAAA,EAI7G,OAAO,KAAK,cAAcF,EAAQC,CAAM,CAC1C,QAAA,CACMA,EAAS,GAAKD,IAAW,GAC3B,KAAK,QAAQ,aAAa,EAAGA,EAAQC,CAAM,CAE/C,CACF,QAAA,CACE,KAAK,WAAWH,CAAS,EACzB,KAAK,UAAUC,CAAS,CAC1B,CACF,CAEA,mBAA4B,CAC1B,MAAMI,EAAc,KAAK,YAAA,EAEzB,GAAI,CACF,OAAAvE,EAAa,KAAK,QAAQ,yBAAyB,EAAGuE,CAAW,EAAG,0BAA0B,EACvF,KAAK,YAAYA,CAAW,CACrC,QAAA,CACE,KAAK,WAAWA,CAAW,CAC7B,CACF,CAEA,gBAAgBxH,EAAqB,CACnC,KAAK,QAAQ,0BAA0BA,CAAK,CAC9C,CAEA,kBAAkBA,EAAegF,EAAwB,CACvD/B,EACE,KAAK,QAAQ,4BAA4BjD,EAAOgF,CAAQ,EACxD,6BAAA,CAEJ,CAEA,0BAA0BhF,EAAe6E,EAAcwC,EAAwB,CAC7E,OAAO,KAAK,QAAQ,yBAAyBrH,EAAO6E,EAAMwC,CAAM,CAClE,CAEA,oBAAoBrH,EAAe6E,EAAcwC,EAAsB,CACrEpE,EAAa,KAAK,0BAA0BjD,EAAO6E,EAAMwC,CAAM,EAAG,0BAA0B,CAC9F,CAEA,oBAAoBrH,EAAeyH,EAAgB3B,EAAwB,CACzE7C,EAAa,KAAK,QAAQ,yBAAyBjD,EAAOyH,EAAQ3B,CAAQ,EAAG,0BAA0B,CACzG,CAEA,qBAAqB9F,EAAe0H,EAA4B,CAC9DzE,EACE,KAAK,QAAQ,gCAAgCjD,EAAO0H,CAAY,EAChE,iCAAA,CAEJ,CAEA,8BAAuC,CACrC,MAAMC,EAAiB,KAAK,YAAA,EAE5B,GAAI,CACF,OAAA1E,EACE,KAAK,QAAQ,sCAAsC,EAAG0E,CAAc,EACpE,uCAAA,EAEK,KAAK,YAAYA,CAAc,CACxC,QAAA,CACE,KAAK,WAAWA,CAAc,CAChC,CACF,CAEA,2BAA2BC,EAAwB,CACjD,KAAK,QAAQ,uCAAuCA,CAAQ,CAC9D,CAEA,2BAA2B5H,EAAe4H,EAAwB,CAChE,MAAMP,EAAS,KAAK,YAAA,EAEpB,GAAI,CACF,KAAK,KAAKA,EAAQ,CAAC,EAAE,UAAU,EAAGO,EAAU,EAAI,EAChD,KAAK,oBAAoB5H,EAAO,EAAGqH,CAAM,CAC3C,QAAA,CACE,KAAK,WAAWA,CAAM,CACxB,CACF,CAEA,2BAA2BO,EAA2B,CACpD,OAAO,KAAK,QAAQ,uCAAuCA,CAAQ,IAAM,CAC3E,CAEA,6BAA6BA,EAAkB/C,EAAcwC,EAAwB,CACnF,OAAO,KAAK,QAAQ,6BAA6BO,EAAU/C,EAAMwC,CAAM,CACzE,CAEA,uBAAuBO,EAAkB/C,EAAcwC,EAAsB,CAC3EpE,EAAa,KAAK,6BAA6B2E,EAAU/C,EAAMwC,CAAM,EAAG,8BAA8B,CACxG,CAEA,uBAAuBO,EAAkBH,EAAgB3B,EAAwB,CAC/E7C,EACE,KAAK,QAAQ,6BAA6B2E,EAAUH,EAAQ3B,CAAQ,EACpE,8BAAA,CAEJ,CAEA,2BAAoC,CAClC,MAAM+B,EAAc,KAAK,YAAA,EAEzB,GAAI,CACF,OAAA5E,EACE,KAAK,QAAQ,mCAAmC,EAAG4E,CAAW,EAC9D,oCAAA,EAEK,KAAK,YAAYA,CAAW,CACrC,QAAA,CACE,KAAK,WAAWA,CAAW,CAC7B,CACF,CAEA,wBAAwBrK,EAAqB,CAC3C,KAAK,QAAQ,oCAAoCA,CAAK,CACxD,CAEA,wBAAwBoK,EAAkBpK,EAAqB,CAC7D,MAAM6J,EAAS,KAAK,YAAA,EAEpB,GAAI,CACF,KAAK,KAAKA,EAAQ,CAAC,EAAE,UAAU,EAAG7J,EAAO,EAAI,EAC7C,KAAK,uBAAuBoK,EAAU,EAAGP,CAAM,CACjD,QAAA,CACE,KAAK,WAAWA,CAAM,CACxB,CACF,CAEA,uBAAuB7J,EAAwB,CAC7C,OAAO,KAAK,QAAQ,oCAAoCA,CAAK,IAAM,CACrE,CAEA,yBAAyBA,EAAe1E,EAAiB,CACvDmK,EACE,KAAK,QAAQ,sCAAsCzF,EAAO1E,CAAC,EAC3D,uCAAA,CAEJ,CAEA,iCAAiC0E,EAAeqH,EAAcwC,EAAwB,CACpF,OAAO,KAAK,QAAQ,mCAAmC7J,EAAOqH,EAAMwC,CAAM,CAC5E,CAEA,2BAA2B7J,EAAeqH,EAAcwC,EAAsB,CAC5EpE,EACE,KAAK,iCAAiCzF,EAAOqH,EAAMwC,CAAM,EACzD,oCAAA,CAEJ,CAEA,qBAAqBvP,EAAa+M,EAAcwC,EAAwB,CACtE,OAAO,KAAK,QAAQ,gBAAgBvP,EAAK+M,EAAMwC,CAAM,CACvD,CAEA,eAAevP,EAAa+M,EAAcwC,EAAsB,CAC9DpE,EAAa,KAAK,qBAAqBnL,EAAK+M,EAAMwC,CAAM,EAAG,iBAAiB,CAC9E,CAEA,sBAAsBxO,EAAcgM,EAAcwC,EAAwB,CACxE,OAAO,KAAK,QAAQ,iBAAiBxO,EAAMgM,EAAMwC,CAAM,CACzD,CAEA,gBAAgBxO,EAAcgM,EAAcwC,EAAsB,CAChEpE,EAAa,KAAK,sBAAsBpK,EAAMgM,EAAMwC,CAAM,EAAG,kBAAkB,CACjF,CAEA,kBAA2B,CACzB,MAAMS,EAAgB,KAAK,YAAA,EAE3B,GAAI,CACF,OAAA7E,EAAa,KAAK,QAAQ,wBAAwB,EAAG6E,CAAa,EAAG,yBAAyB,EACvF,KAAK,YAAYA,CAAa,CACvC,QAAA,CACE,KAAK,WAAWA,CAAa,CAC/B,CACF,CAEA,eAAeC,EAAuB,CACpC,KAAK,QAAQ,yBAAyBA,CAAO,CAC/C,CAEA,oBAA6B,CAC3B,MAAMD,EAAgB,KAAK,YAAA,EACrBE,EAAmB,KAAK,QAAA,EAE9B,GAAI,CACF/E,EACE,KAAK,QAAQ,0BAA0B,EAAG6E,CAAa,EACvD,2BAAA,EAEF,MAAMC,EAAU,KAAK,YAAYD,CAAa,EAC9C,YAAK,KAAA,EAAO,SAASE,EAAkB,CAAC,EACxC,KAAK,QAAQ,6BACXD,EACAzF,GACA0F,CAAA,EAEKD,CACT,QAAA,CACE,KAAK,OAAOC,CAAgB,EAC5B,KAAK,WAAWF,CAAa,CAC/B,CACF,CAEA,iBAAiBC,EAAuB,CACtC,KAAK,QAAQ,2BAA2BA,CAAO,CACjD,CAEA,kBAAkBA,EAAuB,CACvC,KAAK,QAAQ,4BAA4BA,CAAO,CAClD,CAEA,iBACEA,EACA/C,EACAxN,EACe,CAGf,MAAMyQ,EAAc,KAAK,sBAAsBjD,EAAUrC,EAAsB,EACzEuF,EAAiB,KAAK,sBAAsBlD,EAAUtC,EAAyB,EAC/EyF,EAAiB,KAAK,sBAAsBnD,EAAUvC,EAAyB,EAC/E2F,EAAc,KAAK,sBAAsBpD,EAAUxC,EAAsB,EAc/E,GAZI,CAACyF,GAAe,CAACC,GAAkB,CAACC,GAAkB,CAACC,GAIvD5Q,EAAQ,SAAW,UAAY,EAAEyQ,GAAgBC,GAAkB1Q,EAAQ,mBAI3E4Q,GAAe5Q,EAAQ,SAAW,SAIlC,CAACyQ,GAAe,CAACC,GAAkB,CAACE,GAAe5Q,EAAQ,SAAW,SACxE,OAAO,KAGT,MAAM6Q,EAAWtE,GAAgBvM,EAAQ,MAAM,EAC/C,GAAI6Q,IAAa,KACf,OAAO,KAGT,MAAMC,EAAS,KAAK,IAAI,EAAG,KAAK,MAAM9Q,EAAQ,EAAI,KAAK,IAAI,EAAGA,EAAQ,SAAS,CAAC,EAAI,CAAC,EAC/EM,EAAM,KAAK,IAAI,EAAG,KAAK,MAAMN,EAAQ,EAAI,KAAK,IAAI,EAAGA,EAAQ,UAAU,CAAC,EAAI,CAAC,EAC7E+Q,EAAS,KAAK,MAAM/Q,EAAQ,EAAI,CAAC,EACjCgR,EAAS,KAAK,MAAMhR,EAAQ,EAAI,CAAC,EAEvC,IAAI2C,EACF3C,EAAQ,SAAW,WACnB,CAAC,KAAK,sBAAsBwN,EAAUnC,EAAsB,GAC5D,CAAC,KAAK,sBAAsBmC,EAAUjC,EAA6B,EAC/D,EACAsF,EAQN,GANI7Q,EAAQ,SAAW,WACrB2C,GAAQ,IAGVA,GAAQwJ,GAAwBnM,EAAQ,IAAI,EAExC,KAAK,sBAAsBwN,EAAUjC,EAA6B,EAAG,CACvE,MAAM0F,EAASjR,EAAQ,SAAW,UAAY,IAAM,IACpD,MAAO,SAAW2C,CAAI,IAAIoO,CAAM,IAAIC,CAAM,GAAGC,CAAM,EACrD,CAEA,GAAI,KAAK,sBAAsBzD,EAAUnC,EAAsB,EAAG,CAChE,MAAM4F,EAASjR,EAAQ,SAAW,UAAY,IAAM,IACpD,MAAO,SAAW2C,CAAI,IAAImO,CAAM,IAAIxQ,CAAG,GAAG2Q,CAAM,EAClD,CAEA,GAAI,KAAK,sBAAsBzD,EAAUlC,EAAwB,EAC/D,MAAO,QAAU3I,CAAI,IAAImO,CAAM,IAAIxQ,CAAG,IAGxC,GAAI,KAAK,sBAAsBkN,EAAUpC,EAAuB,GAAKuF,GAAkBD,GAAkBD,GAAeG,EAAa,CACnI,MAAMM,EAAc5E,GAAc3J,CAAI,EAChCwO,EAAgB7E,GAAcwE,CAAM,EACpCM,EAAa9E,GAAchM,CAAG,EACpC,MAAI,CAAC4Q,GAAe,CAACC,GAAiB,CAACC,EAC9B,KAEF,SAAWF,CAAW,GAAGC,CAAa,GAAGC,CAAU,EAC5D,CAEA,OAAO,IACT,CAEA,eACEb,EACA/C,EACAxN,EAQe,CACf,GAAIA,EAAQ,SAAW,EACrB,OAAO,KAGT,MAAMqR,EAAc,KAAK,YAAA,EACzB,IAAIC,EAAc,EACdC,EAAwE,KAE5E,GAAI,CACF,OAAA9F,EAAa,KAAK,QAAQ,sBAAsB,EAAG4F,CAAW,EAAG,uBAAuB,EACxFC,EAAc,KAAK,YAAYD,CAAW,EAC1C,KAAK,QAAQ,yCAAyCd,EAAS/C,CAAQ,EACvE,KAAK,QAAQ,6BACX8D,EACAtR,EAAQ,SAAW,UACf2K,GACA3K,EAAQ,SAAW,SACjB6K,GACAD,EAAA,EAER,KAAK,QAAQ,0BAA0B0G,EAAatR,EAAQ,OAAO,EACnE,KAAK,QAAQ,2BAA2BsR,EAAatR,EAAQ,IAAI,EACjE,KAAK,QAAQ,oCAAoCsR,EAAa,CAAC,EAC/D,KAAK,QAAQ,gCAAgCA,EAAatR,EAAQ,UAAY,EAAI,CAAC,EAE/EA,EAAQ,OACVuR,EAAiB,KAAK,YAAYvR,EAAQ,IAAI,EAC9C,KAAK,QAAQ,2BACXsR,EACAC,EAAe,IACfA,EAAe,GAAA,GAIf,OAAOvR,EAAQ,oBAAuB,UACxC,KAAK,QAAQ,0CACXsR,EACAtR,EAAQ,kBAAA,EAIL,KAAK,gBAAgBuQ,EAASe,CAAW,CAClD,QAAA,CACEC,GAAA,MAAAA,EAAgB,OACZD,IAAgB,GAClB,KAAK,QAAQ,uBAAuBA,CAAW,EAEjD,KAAK,WAAWD,CAAW,CAC7B,CACF,CAEQ,gBAAgBd,EAAiBe,EAAoC,CAC3E,MAAME,EAAc,KAAK,WAAA,EAEzB,GAAI,CACF,MAAMC,EAAa,KAAK,QAAQ,2BAA2BlB,EAASe,EAAa,EAAG,EAAGE,CAAW,EAC9FC,IAAe1H,IAAwB0H,IAAe3O,IACxD2I,EAAagG,EAAY,kCAAkC,EAG7D,MAAMC,EAAW,KAAK,IAAI,EAAG,KAAK,UAAUF,CAAW,CAAC,EACxD,GAAIE,IAAa,EACf,OAAO,KAGT,MAAMC,EAAY,KAAK,WAAWD,CAAQ,EACpCE,EAAa,KAAK,WAAA,EAExB,GAAI,CACFnG,EACE,KAAK,QAAQ,2BACX8E,EACAe,EACAK,EACAD,EACAE,CAAA,EAEF,4BAAA,EAGF,MAAMC,EAAU,KAAK,UAAUD,CAAU,EACzC,OAAIC,IAAY,EACP,KAGF,KAAK,cAAcF,EAAWE,CAAO,CAC9C,QAAA,CACE,KAAK,UAAUF,EAAWD,CAAQ,EAClC,KAAK,UAAUE,CAAU,CAC3B,CACF,QAAA,CACE,KAAK,UAAUJ,CAAW,CAC5B,CACF,CAEA,YAAYhE,EAAkBH,EAAsB,CAClD,MAAMyE,EAAQ,KAAK,YAAYzE,CAAI,EAC7BmE,EAAc,KAAK,WAAA,EAEzB,GAAI,CACF,MAAMO,EAAY,KAAK,sBAAsBvE,EAAUzC,EAA4B,EAC7E0G,EAAa,KAAK,QAAQ,qBAC9BK,EAAM,IACNA,EAAM,IACNC,EAAY,EAAI,EAChB,EACA,EACAP,CAAA,EAEEC,IAAe1H,IAAwB0H,IAAe3O,IACxD2I,EAAagG,EAAY,4BAA4B,EAGvD,MAAMC,EAAW,KAAK,IAAI,EAAG,KAAK,UAAUF,CAAW,CAAC,EACxD,GAAIE,IAAa,EACf,MAAO,GAGT,MAAMM,EAAY,KAAK,WAAWN,CAAQ,EACpCE,EAAa,KAAK,WAAA,EAExB,GAAI,CACF,OAAAnG,EACE,KAAK,QAAQ,qBACXqG,EAAM,IACNA,EAAM,IACNC,EAAY,EAAI,EAChBC,EACAN,EACAE,CAAA,EAEF,sBAAA,EAGK,KAAK,cAAcI,EAAW,KAAK,UAAUJ,CAAU,CAAC,CACjE,QAAA,CACE,KAAK,UAAUI,EAAWN,CAAQ,EAClC,KAAK,UAAUE,CAAU,CAC3B,CACF,QAAA,CACEE,EAAM,KAAA,EACN,KAAK,UAAUN,CAAW,CAC5B,CACF,CACF,CAEA,eAAeS,GAAqBC,EAAsC,CAOxE,IALEA,EAAO,WAAW,GAAG,GACrBA,EAAO,WAAW,IAAI,GACtBA,EAAO,WAAW,KAAK,GACvB,kBAAkB,KAAKA,CAAM,IAEb,OAAO,IAAQ,IAC/B,OAAO,IAAI,KAAKA,CAAM,EAAE,YAAA,EAG1B,MAAMC,EAAW,MAAM,MAAMD,CAAM,EACnC,GAAI,CAACC,EAAS,GACZ,MAAM,IAAI,MAAM,gCAAgCA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAG1F,OAAOA,EAAS,YAAA,CAClB,CAEA,eAAsBC,IAA+C,CACnE,OAAK5G,KACHA,IAAmB,SAAY,CAC7B,MAAM6G,EAAY,MAAMJ,GAAqBnI,EAAc,EASrDgD,GARa,MAAM,YAAY,YAAYuF,EAAW,CAC1D,IAAK,CACH,KAAM,CAEN,CAAA,CACF,CACD,GAE0B,SAAS,QAC9B5E,EAAQ,IAAI,WAAWX,EAAQ,OAAO,MAAM,EAC5CwF,EAAcxF,EAAQ,kBAAA,EAC5B,IAAI/E,EAAMuK,EAEV,KAAO7E,EAAM1F,CAAG,IAAM,GACpBA,GAAO,EAGT,MAAMgF,EAAS,KAAK,MAClB,IAAI,cAAc,OAAOU,EAAM,SAAS6E,EAAavK,CAAG,CAAC,CAAA,EAG3D,OAAO,IAAI8E,GAAgBC,EAASC,CAAM,CAC5C,GAAA,GAGKvB,EACT,CCt2CA,MAAM+G,GAAe,GACfC,GAAe,GACfC,GAAqB,EACrBC,GAAsB,GACtBC,GAA0B,GAC1BC,GAAkB,mBAElB5H,GAAyB,EACzBC,GAA4B,IAC5BC,GAA4B,KAC5BC,GAAyB,KACzB0H,GAA0B,KAC1BC,GAA0B,KAC1BC,GAA+B,KAE/BC,GAA0C,CAC9ChI,GACAC,GACAC,GACAC,EACF,EAEM8H,GAA4B,EAC5BC,GAA8B,EAC9BC,GAA6B,EAC7BC,GAA4B,EAC5BC,GAA4B,EAelC,MAAMC,EAA2C,CAC/C,YAA6BC,EAAiB,CAAjB,KAAA,QAAAA,CAAkB,CAE/C,kBAAkBC,EAA4B,CAC5C,OAAOA,EAAY,KAAK,QAAQ,QAAQ,QAAS,EAAE,EAAI,KAAK,OAC9D,CACF,CAEA,MAAMC,EAAmD,CAAzD,cACExT,EAAA,cAAS,CACP,MAAO,EACP,UAAW,EACX,OAAQuS,GACR,QAAUjQ,GAA+C,CACvD,MAAMmR,EAAgBnR,EAAQ,KAAK,OAAO,UACpCmF,EAAO,KAAK,aAAagM,CAAa,EAC5C,OAAO,OAAOhM,GAAS,SAAW,IAAI4L,GAAW5L,CAAI,EAAI,IAC3D,CAAA,GAGMzH,EAAA,oBAAyB,MAAM,KAAK,CAAE,OAAQuS,EAAA,EAAgB,IAAM,EAAE,GAE9E,YAAYmB,EAAmBC,EAAeC,EAAgBC,EAAuB,CACnF,KAAK,OAAO,UAAYH,EACxB,KAAK,OAAO,MAAQC,EACpB,KAAK,OAAO,OAASC,EACrB,KAAK,aAAeC,CACtB,CACF,CAEA,SAASC,GAAsBtK,EAA+B,CAE5D,MADoB,EAAAA,EAAM,IAAI,SAAW,GAAK,CAACA,EAAM,SAAW,CAACA,EAAM,QAAU,CAACA,EAAM,QAM1F,CAEA,SAASuK,GAAsBxT,EAA0ByT,EAAgC,CACvF,MAAMH,EAAQtT,EAAK,MAAM,EAAGyT,CAAY,EAAE,IAAK3T,GAAQA,EAAI,IAAI,EAC/D,KAAOwT,EAAM,OAASG,GACpBH,EAAM,KAAK,EAAE,EAEf,OAAOA,CACT,CAEA,SAASI,GAA8BzK,EAK5B,CACT,OAAOgD,GAA2B,CAChC,SAAU,EAAQhD,EAAM,SACxB,QAAS,EAAQA,EAAM,QACvB,OAAQ,EAAQA,EAAM,OACtB,QAAS,EAAQA,EAAM,QACvB,iBAAkB,IAAM,EAAA,CACG,CAC/B,CAEO,MAAM0K,EAAS,CAAf,cACGlU,EAAA,gBAA6C,MAErD,SAASuN,EAAwC,CAC/C,KAAK,SAAWA,aAAoB4G,GAA4B5G,EAAW,IAC7E,CAEA,KAAY,CACV,MAAM6G,EAAW,KAAK,kBAAA,EAClB,CAAC,KAAK,UAAY,CAACA,GAIvB,KAAK,SAAS,OAAOA,EAAS,KAAMA,EAAS,IAAI,CACnD,CAEA,mBAAgD,OAC9C,QAAOzK,EAAA,KAAK,WAAL,YAAAA,EAAe,2BAA4B,IACpD,CAEA,SAAgB,CACd,KAAK,SAAW,IAClB,CACF,CAEO,MAAMwK,EAA4D,CA0D/D,YACNvP,EACAkC,EACAuN,EACAC,EACAC,EACAxU,EACA,CAhEOC,EAAA,cAAS,IAAIwT,IACbxT,EAAA,aAAQ,CACf,eAAgB,CACd,WAAY,CACV,IAAK,CACH,KAAM,CACJ,MAAOwS,GACP,OAAQC,EAAA,CACV,CACF,CACF,CACF,GAGOzS,EAAA,gBAETA,EAAA,eAA8B,MAC9BA,EAAA,gBAA+B,MAC/BA,EAAA,YAAOsS,IACPtS,EAAA,YAAOuS,IAEUvS,EAAA,iBACAA,EAAA,uBACAA,EAAA,yBACAA,EAAA,2BACAA,EAAA,oBACAA,EAAA,yBAAoB,KACpBA,EAAA,kBAAa,KACtBA,EAAA,qBAAuC,MACvCA,EAAA,gBAAkC,MAClCA,EAAA,iBAA2B,MAC3BA,EAAA,gBAAW,IACXA,EAAA,qBACAA,EAAA,6BAA2D,IAAM,IACjEA,EAAA,sBAAiB,IACjBA,EAAA,6BAA6D,MAC7DA,EAAA,sBAAiCqI,GAAA,GACxBrI,EAAA,qBAAgB,KACzBA,EAAA,0BAAqB,GACrBA,EAAA,wBAAmBuS,IACnBvS,EAAA,wBAAuC,CAAA,GACvCA,EAAA,mBAAgC,CACtC,OAAQ,GACR,MAAO,GACP,KAAM,YACN,YAAa,KACb,YAAa,IAAA,GAEPA,EAAA,uBAAyD,MAChDA,EAAA,yBAAuC,CAAA,GAChDA,EAAA,8BAAyB,IACzBA,EAAA,sBAAwC,MACxCA,EAAA,0BAA2D,MAClDA,EAAA,+BAA0B,KACnCA,EAAA,uBAAkB,GAClBA,EAAA,uBAAkB,IAUxB,KAAK,SAAW4E,EAChB,KAAK,eAAiBkC,EACtB,KAAK,iBAAmBuN,EACxB,KAAK,mBAAqBC,EAC1B,KAAK,YAAcC,EACnB,KAAK,QAAUxU,EACf,KAAK,aAAe,EAAQA,EAAQ,YACtC,CAEA,aAAa,OAAOA,EAAyE,CAC3F,MAAM6E,EAAW,MAAMuN,GAAA,EACjBrL,EAAiBlC,EAAS,eAAe0N,GAAcC,GAAcxS,EAAQ,UAAU,EAC7F,IAAIsU,EAAmB,EACnBC,EAAqB,EACrBC,EAAkD,KAEtD,GAAI,CACF,OAAA3P,EAAS,iBAAiBkC,EAAgB/G,EAAQ,KAAK,EACvDsU,EAAmBzP,EAAS,iBAAA,EAC5B0P,EAAqB1P,EAAS,mBAAA,EAC9B2P,EAAc3N,GAAkBhC,CAAQ,EAEjC,IAAIuP,GACPvP,EACAkC,EACAuN,EACAC,EACAC,EACAxU,CAAA,CAEN,OAASyU,EAAO,CACd,MAAID,GACFtN,GAA4BsN,CAAW,EAErCF,IAAqB,GACvBzP,EAAS,eAAeyP,CAAgB,EAEtCC,IAAuB,GACzB1P,EAAS,iBAAiB0P,CAAkB,EAE9C1P,EAAS,aAAakC,CAAc,EAC9B0N,CACR,CACF,CAEA,KAAKC,EAA8B,CACjC,GAAI,KAAK,UAAY,KAAK,QACxB,OAGF,MAAMC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,QACjBA,EAAK,MAAM,SAAW,WACtBA,EAAK,MAAM,MAAQ,IACnBA,EAAK,MAAM,SAAW,SACtBA,EAAK,MAAM,MAAQ,OACnBA,EAAK,MAAM,OAAS,OACpBA,EAAK,MAAM,gBAAkB,KAAK,QAAQ,MAAM,WAChDA,EAAK,MAAM,MAAQ,KAAK,QAAQ,MAAM,WACtCA,EAAK,MAAM,WAAa,KAAK,QAAQ,WACrCA,EAAK,MAAM,SAAW,GAAG,KAAK,QAAQ,QAAQ,KAC9CA,EAAK,MAAM,WAAa,MAExB,MAAMlF,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,iBACrBA,EAAS,MAAM,MAAQ,OACvBA,EAAS,MAAM,OAAS,OACxBA,EAAS,MAAM,SAAW,SAC1BA,EAAS,MAAM,SAAW,WAE1B,MAAMmF,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,eACnBA,EAAO,MAAM,MAAQ,OACrBA,EAAO,MAAM,OAAS,OACtBA,EAAO,MAAM,SAAW,WACxBA,EAAO,MAAM,WAAa,OAC1BA,EAAO,MAAM,iBAAmB,OAChCA,EAAO,MAAM,gBAAkB,KAAK,QAAQ,MAAM,WAElD,MAAMC,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,wBACrBA,EAAS,aAAa,aAAc,gBAAgB,EACpDA,EAAS,aAAa,OAAQ,SAAS,EACvCA,EAAS,aAAa,kBAAmB,MAAM,EAC/CA,EAAS,aAAa,cAAe,KAAK,EAC1CA,EAAS,aAAa,iBAAkB,KAAK,EAC7CA,EAAS,aAAa,aAAc,OAAO,EAC3CA,EAAS,MAAM,SAAW,WAC1BA,EAAS,MAAM,QAAU,IACzBA,EAAS,MAAM,cAAgB,OAC/BA,EAAS,MAAM,KAAO,IACtBA,EAAS,MAAM,IAAM,IACrBA,EAAS,MAAM,SAAW,MAC1BA,EAAS,MAAM,UAAY,MAC3BA,EAAS,MAAM,WAAa,MAC5BA,EAAS,MAAM,OAAS,IACxBA,EAAS,MAAM,QAAU,IACzBA,EAAS,MAAM,OAAS,IACxBA,EAAS,MAAM,MAAQ,KAAK,QAAQ,MAAM,WAC1CA,EAAS,MAAM,gBAAkB,cACjCA,EAAS,MAAM,WAAa,cAC5BA,EAAS,MAAM,SAAW,UAC1BA,EAAS,MAAM,QAAU,OACzBA,EAAS,MAAM,UAAY,OAC3BA,EAAS,MAAM,WAAa,KAAK,QAAQ,WACzCA,EAAS,MAAM,SAAW,GAAG,KAAK,QAAQ,QAAQ,KAClDA,EAAS,MAAM,WAAa,OAC5BA,EAAS,MAAM,iBAAmB,OAElC,MAAMC,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,wBAC3BA,EAAe,MAAM,SAAW,WAChCA,EAAe,MAAM,IAAM,IAC3BA,EAAe,MAAM,MAAQ,IAC7BA,EAAe,MAAM,MAAQ,MAC7BA,EAAe,MAAM,OAAS,OAC9BA,EAAe,MAAM,gBAAkB,cACvCA,EAAe,MAAM,cAAgB,OAErC,MAAMC,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,wBAC3BA,EAAe,MAAM,SAAW,WAChCA,EAAe,MAAM,IAAM,IAC3BA,EAAe,MAAM,MAAQ,IAC7BA,EAAe,MAAM,MAAQ,MAC7BA,EAAe,MAAM,YAAc,MACnCA,EAAe,MAAM,aAAe,MACpCA,EAAe,MAAM,gBAAkB,2BACvCA,EAAe,MAAM,cAAgB,OACrCA,EAAe,MAAM,WAAa,qBAClCA,EAAe,MAAM,QAAU,IAE/BD,EAAe,YAAYC,CAAc,EAEzCtF,EAAS,YAAYmF,CAAM,EAC3BD,EAAK,YAAYlF,CAAQ,EACzBkF,EAAK,YAAYE,CAAQ,EACzBF,EAAK,YAAYG,CAAc,EAC/BJ,EAAU,YAAYC,CAAI,EAE1B,KAAK,QAAUA,EACf,KAAK,cAAgBC,EACrB,KAAK,SAAWC,EAChB,KAAK,eAAiBE,EACtB,KAAK,SAAW,IAAIhV,GAAe,CACjC,cAAe6U,EACf,MAAO,KAAK,QAAQ,MACpB,WAAY,KAAK,QAAQ,WACzB,SAAU,KAAK,QAAQ,QAAA,CACxB,EAED,KAAK,eAAA,EACL,KAAK,cAAA,EACL,KAAK,qBAAA,EAEL,MAAMI,EAAW,KAAK,uBAAA,EAClBA,EACF,KAAK,OAAOA,EAAS,KAAMA,EAAS,IAAI,EAExC,KAAK,OAAA,CAET,CAEA,UAAUC,EAA4F,CACpGA,EAAM,SAAS,IAAI,EACnB,KAAK,OAAO,IAAIA,CAAK,CACvB,CAEA,OAAOC,EAAsD,CAC3D,YAAK,cAAc,IAAIA,CAAQ,EACxB,CACL,QAAS,IAAM,CACb,KAAK,cAAc,OAAOA,CAAQ,CACpC,CAAA,CAEJ,CAEA,4BAA4BA,EAAmD,CAC7E,KAAK,sBAAwBA,CAC/B,CAEA,MAAM7H,EAAiC,CACrC,GAAI,KAAK,SACP,OAGF,MAAM8H,EAAgB,KAAK,kBAAA,EAC3B,KAAK,SAAS,QAAQ,KAAK,eAAgB9H,CAAI,EAC/C,MAAM+H,EAAgB,KAAK,kBAAA,EACvBD,GAAiB,CAACC,GACpB,KAAK,wBAAA,EAEP,KAAK,eAAA,CACP,CAEA,yBAAgC,CAC9B,GAAI,MAAK,SAGT,WAAWhN,KAAQ4K,GACjB,KAAK,SAAS,gBAAgB,KAAK,eAAgB5K,EAAM,EAAK,EAEhE,KAAK,SAAS,kBAAkB,KAAK,kBAAkB,EACvD,KAAK,oBAAoB,MAAA,EACzB,KAAK,gBAAkB,GACzB,CAEQ,mBAA6B,CACnC,OACE,KAAK,cAAc0K,EAAuB,GAC1C,KAAK,cAAcC,EAA4B,CAEnD,CAEA,OAAc,CACR,KAAK,WAIT,KAAK,UAAU,MAAA,EACf,KAAK,oBAAoB,EAAK,EAC9B,KAAK,SAAS,cAAc,KAAK,cAAc,EAC/C,KAAK,eAAA,EACP,CAEA,SAAgB,CACV,KAAK,UAIT,KAAK,OAAA,CACP,CAEA,OAAOxS,EAAcC,EAAoB,CACvC,GAAI,KAAK,SACP,OAGF,MAAMC,EAAW,KAAK,IAAI,EAAG,KAAK,MAAMF,CAAI,CAAC,EACvCG,EAAW,KAAK,IAAI,EAAG,KAAK,MAAMF,CAAI,CAAC,EAC7C,KAAK,KAAOC,EACZ,KAAK,KAAOC,EACZ,KAAK,oBAAoB,EAAK,EAC9B,KAAK,SAAS,eAAe,KAAK,eAAgBD,EAAUC,EAAU,KAAK,gBAAgB,EAC3F,KAAK,SAAS,kBAAkB,KAAK,kBAAkB,EACvD,KAAK,eAAA,CACP,CAEA,YAAY2U,EAAsB,CAC5B,KAAK,UAAYA,IAAW,IAIhC,KAAK,SAAS,oBAAoB,KAAK,eAAgBA,CAAM,EAC7D,KAAK,OAAA,EACP,CAEA,aAAoB,CACd,KAAK,WAIT,KAAK,SAAS,kBAAkB,KAAK,cAAc,EACnD,KAAK,OAAA,EACP,CAEA,gBAAuB,CACjB,KAAK,WAIT,KAAK,SAAS,qBAAqB,KAAK,cAAc,EACtD,KAAK,OAAA,EACP,CAEA,oBAAkD,CAChD,MAAO,CACL,SAAU,KAAK,cAAcrK,EAAsB,EACnD,YAAa,KAAK,cAAcC,EAAyB,EACzD,YAAa,KAAK,cAAcC,EAAyB,EACzD,SAAU,KAAK,cAAcC,EAAsB,EACnD,UAAW,KAAK,cAAc,IAAI,EAClC,SAAU,KAAK,cAAc,IAAI,EACjC,eAAgB,KAAK,cAAc,IAAI,EACvC,WAAY,KAAK,cAAc,IAAI,EACnC,UAAW,KAAK,cAAc0H,EAAuB,EACrD,cAAe,KAAK,cAAcC,EAAuB,EACzD,cAAe,KAAK,cAAcC,EAA4B,CAAA,CAElE,CAEA,oBAAoBuC,EAA6C,CAC/D,KAAK,SAAS,gBAAgB,KAAK,eAAgBtK,GAAwBsK,EAAS,QAAQ,EAC5F,KAAK,SAAS,gBAAgB,KAAK,eAAgBrK,GAA2BqK,EAAS,WAAW,EAClG,KAAK,SAAS,gBAAgB,KAAK,eAAgBpK,GAA2BoK,EAAS,WAAW,EAClG,KAAK,SAAS,gBAAgB,KAAK,eAAgBnK,GAAwBmK,EAAS,QAAQ,EAC5F,KAAK,SAAS,gBAAgB,KAAK,eAAgB,KAAMA,EAAS,SAAS,EAC3E,KAAK,SAAS,gBAAgB,KAAK,eAAgB,KAAMA,EAAS,QAAQ,EAC1E,KAAK,SAAS,gBAAgB,KAAK,eAAgB,KAAMA,EAAS,cAAc,EAChF,KAAK,SAAS,gBAAgB,KAAK,eAAgB,KAAMA,EAAS,UAAU,EAC5E,KAAK,SAAS,gBAAgB,KAAK,eAAgBzC,GAAyByC,EAAS,SAAS,EAC9F,KAAK,SAAS,gBAAgB,KAAK,eAAgBxC,GAAyBwC,EAAS,aAAa,EAClG,KAAK,SAAS,gBAAgB,KAAK,eAAgBvC,GAA8BuC,EAAS,aAAa,EACvG,KAAK,SAAS,kBAAkB,KAAK,kBAAkB,CACzD,CAEA,sBAAsBC,EAA0C,CAC9D,GAAI,KAAK,UAAYA,EAAQ,SAAW,EACtC,MAAO,GAGT,MAAMzB,EAAQ,KAAK,eAAeyB,CAAO,EACzC,GAAIzB,IAAU,EACZ,MAAO,GAGT,MAAM0B,EAAU,KAAK,qBAAA,EACrB,GAAIA,EAAQ,eAAgB,CAC1B,MAAMhJ,EAASsH,EAAQ,EAAIV,GAA4BC,GACvD,IAAIoC,EAAW,GACf,QAASlT,EAAQ,EAAGA,EAAQ,KAAK,IAAIuR,CAAK,EAAGvR,GAAS,EACpDkT,EACE,KAAK,eAAe,CAClB,OAAQ,QACR,OAAAjJ,EACA,QAAS+I,EAAQ,QACjB,QAASA,EAAQ,QACjB,KAAMrB,GAA8BqB,CAAO,EAC3C,iBAAkB,KAAK,oBAAoB,KAAO,CAAA,CACnD,GAAKE,EAEV,OAAOA,CACT,CAEA,OAAID,EAAQ,UACH,KAAK,mBAAmB1B,CAAK,GAGtC,KAAK,YAAYA,CAAK,EACf,GACT,CAEA,MAAMzG,EAAoB,CACxB,GAAI,KAAK,UAAY,KAAK,cAAgB,CAACA,EACzC,OAGF,MAAMhB,EAAU,KAAK,SAAS,YAAY,KAAK,eAAgBgB,CAAI,EAC9DhB,GAIL,KAAK,SAASA,CAAO,CACvB,CAEA,OAAc,QACZzC,EAAA,KAAK,WAAL,MAAAA,EAAe,MAAM,CAAE,cAAe,IACxC,CAEA,iBAA0B,OACxB,QAAOA,EAAA,KAAK,WAAL,YAAAA,EAAe,OAAQ,SAChC,CAEA,SAASzJ,EAAkD,OACzD,KAAK,SAAS,iBAAiB,KAAK,eAAgBA,CAAK,EACzD,KAAK,QAAQ,MAAQA,EAEjB,KAAK,UACP,KAAK,QAAQ,MAAM,gBAAkBA,EAAM,WAC3C,KAAK,QAAQ,MAAM,MAAQA,EAAM,YAG/B,KAAK,gBACP,KAAK,cAAc,MAAM,gBAAkBA,EAAM,aAGnDyJ,EAAA,KAAK,WAAL,MAAAA,EAAe,SAASzJ,GACxB,KAAK,eAAA,CACP,CAEA,gBAAgBuV,EAAyB,CACvC,KAAK,aAAeA,EACpB,KAAK,eAAA,CACP,CAEA,wBAAqD,CACnD,MAAMC,EAAU,KAAK,QACrB,GAAI,CAACA,EACH,OAAO,KAGT,MAAM1U,EAAO0U,EAAQ,sBAAA,EACf,CAAE,MAAAhV,EAAO,OAAAC,GAAW,KAAK,eAAA,EAC/B,OAAIK,EAAK,QAAU,GAAKA,EAAK,SAAW,GAAKN,GAAS,GAAKC,GAAU,EAC5D,KAGF,CACL,KAAM,KAAK,IAAI,EAAG,KAAK,MAAMK,EAAK,MAAQN,CAAK,CAAC,EAChD,KAAM,KAAK,IAAI,EAAG,KAAK,MAAMM,EAAK,OAASL,CAAM,CAAC,CAAA,CAEtD,CAEA,SAAgB,SACd,GAAI,MAAK,SAIT,MAAK,SAAW,GAEZ,KAAK,YAAc,OACrB,qBAAqB,KAAK,SAAS,EACnC,KAAK,UAAY,MAGnB,KAAK,eAAA,EACL,KAAK,yBAAyB,IAAI,EAClC,KAAK,uBAAA,EAED,KAAK,qBACP,aAAa,KAAK,kBAAkB,EACpC,KAAK,mBAAqB,MAG5B,UAAWqU,KAAS,KAAK,OACvBA,EAAM,QAAA,EAER,KAAK,OAAO,MAAA,GAEZrL,EAAA,KAAK,WAAL,MAAAA,EAAe,UACf,KAAK,SAAW,MAEhB8C,EAAA,KAAK,UAAL,MAAAA,EAAc,SACd,KAAK,QAAU,KACf,KAAK,cAAgB,KACrB,KAAK,SAAW,KAChB,KAAK,eAAiB,KAEtBxF,GAA4B,KAAK,WAAW,EAC5C,KAAK,SAAS,iBAAiB,KAAK,kBAAkB,EACtD,KAAK,SAAS,eAAe,KAAK,gBAAgB,EAClD,KAAK,SAAS,aAAa,KAAK,cAAc,EAChD,CAEQ,gBAAwC,CAC9C,OAAO,KAAK,MAAM,eAAe,WAAW,IAAI,IAClD,CAEQ,gBAAuB,CACxB,KAAK,WAIT,KAAK,SAAiB,SAAW,KAAK,aACvC,KAAK,SAAS,SAAW,KAAK,aAAe,GAAK,EAC9C,KAAK,cAAgB,SAAS,gBAAkB,KAAK,UACvD,KAAK,SAAS,KAAA,EAElB,CAEQ,eAAsB,CAC5B,MAAMyN,EAAO,KAAK,QACZE,EAAW,KAAK,SACtB,GAAI,CAACF,GAAQ,CAACE,EACZ,OAGFF,EAAK,iBAAiB,QAAS,IAAM,CAC9B,KAAK,cACR,KAAK,MAAA,CAET,CAAC,GAEqB,KAAK,eAAiBA,GAC9B,iBAAiB,YAAclL,GAAU,CACrD,GAAMA,aAAiB,WAQvB,IAJK,KAAK,cACR,KAAK,MAAA,EAGH,KAAK,qBAAA,EAAuB,eAAgB,CAC9C,MAAM+C,EAAS,KAAK,qBAAqB/C,CAAK,EAC9C,GAAI+C,IAAW,KACb,OAEF,KAAK,oBAAA,EACL,KAAK,oBAAoB,IAAIA,CAAM,EACnC,KAAK,gBAAkB,GACvB,KAAK,eAAe,CAClB,OAAQ,QACR,OAAAA,EACA,QAAS/C,EAAM,QACf,QAASA,EAAM,QACf,KAAMyK,GAA8BzK,CAAK,EACzC,iBAAkB,EAAA,CACnB,EACDA,EAAM,eAAA,EACN,MACF,CAEIA,EAAM,SAAW,IAIrB,KAAK,gBAAkB,GACvB,KAAK,sBAAsBA,CAAK,EAChCA,EAAM,eAAA,GACR,CAAC,EAEDkL,EAAK,iBACH,QACClL,GAAU,CAEP,KAAK,sBAAsB,CACzB,OAAQ,QACR,OAAQA,EAAM,OACd,UAAWA,EAAM,UACjB,QAASA,EAAM,QACf,QAASA,EAAM,QACf,SAAUA,EAAM,SAChB,QAASA,EAAM,QACf,OAAQA,EAAM,OACd,QAASA,EAAM,OAAA,CAChB,GAEDA,EAAM,eAAA,CAEV,EACA,CAAE,QAAS,EAAA,CAAM,EAGnB,MAAMmM,EACJ,OAAO,OAAW,KAAe,OAAO,OAAO,kBAAqB,WAChE,OACA,KACN,GAAIA,EAAiB,CACnB,MAAMC,EAAgBpM,GAAsB,CAC1C,GAAK,KAAK,gBAGV,IAAI,KAAK,qBAAA,EAAuB,eAAgB,CAC9C,KAAK,eAAe,CAClB,OAAQ,SACR,OAAQ,KAAK,uBAAuBA,EAAM,OAAO,EACjD,QAASA,EAAM,QACf,QAASA,EAAM,QACf,KAAMyK,GAA8BzK,CAAK,EACzC,iBAAkB,KAAK,oBAAoB,KAAO,GAAKA,EAAM,QAAU,CAAA,CACxE,EACD,MACF,CACA,KAAK,uBAAuBA,CAAK,EACnC,EACMqM,EAAcrM,GAAsB,CACxC,GAAK,KAAK,gBAIV,IADA,KAAK,gBAAkB,GACnB,KAAK,qBAAA,EAAuB,eAAgB,CAC9C,MAAM+C,EAAS,KAAK,qBAAqB/C,CAAK,EAC1C+C,IAAW,MACb,KAAK,oBAAoB,OAAOA,CAAM,EAExC,KAAK,eAAe,CAClB,OAAQ,UACR,OAAAA,EACA,QAAS/C,EAAM,QACf,QAASA,EAAM,QACf,KAAMyK,GAA8BzK,CAAK,EACzC,iBAAkB,KAAK,oBAAoB,KAAO,CAAA,CACnD,EACD,MACF,CACA,KAAK,uBAAuBA,CAAK,EACnC,EACAmM,EAAgB,iBAAiB,YAAaC,CAAY,EAC1DD,EAAgB,iBAAiB,UAAWE,CAAU,EACtD,KAAK,kBAAkB,KAAK,IAAM,CAChCF,EAAgB,oBAAoB,YAAaC,CAAY,EAC7DD,EAAgB,oBAAoB,UAAWE,CAAU,CAC3D,CAAC,CACH,CAEAjB,EAAS,iBAAiB,UAAYpL,GAAU,CAC9C,MAAMsM,EAAgB,KAAK,iBAAA,EAC3B,GAAIA,GAAiBrM,GAAeD,CAAK,EAAG,CAC1C,KAAK,uBAAyB,GAC9BA,EAAM,eAAA,EACDE,GAA0BoM,CAAa,EAAE,MAAM,IAAM,CAAC,CAAC,EAC5D,KAAK,cAAA,EACL,MACF,CAcA,GAZI,CAAC,KAAK,sBAAsBtM,CAAK,GAIjC,KAAK,cAAgB,KAAK,gBAI1BA,EAAM,UAAY,KAIlB,CAACsK,GAAsBtK,CAAK,EAC9B,OAGF,MAAMuM,EAAU,KAAK,oBAAoBvM,EAAOA,EAAM,OAAS,SAAW,OAAO,EAC5EuM,IAILvM,EAAM,eAAA,EACN,KAAK,SAASuM,CAAO,EACrB,KAAK,cAAA,EACP,CAAC,EAEDnB,EAAS,iBAAiB,QAAUpL,GAAU,CAC5C,GAAI,KAAK,uBAAwB,CAC/B,MAAMzH,EAAMyH,EAAM,IAAI,YAAA,EACtB,GAAIzH,IAAQ,IAAK,CACfyH,EAAM,eAAA,EACN,MACF,CAEA,GAAIzH,IAAQ,WAAaA,IAAQ,QAAUA,IAAQ,KAAM,CACvD,KAAK,uBAAyB,GAC9ByH,EAAM,eAAA,EACN,MACF,CACF,CAEA,GAAI,KAAK,cAAgB,KAAK,eAC5B,OAGF,MAAMuM,EAAU,KAAK,oBAAoBvM,EAAO,SAAS,EACpDuM,IAILvM,EAAM,eAAA,EACN,KAAK,SAASuM,CAAO,EACrB,KAAK,cAAA,EACP,CAAC,EAEDnB,EAAS,iBAAiB,mBAAoB,IAAM,CAClD,KAAK,eAAiB,GACtB,KAAK,sBAAwB,KAC7B,KAAK,6BAAA,CACP,CAAC,EAEDA,EAAS,iBAAiB,oBAAqB,IAAM,CACnD,KAAK,6BAAA,CACP,CAAC,EAEDA,EAAS,iBAAiB,iBAAmBpL,GAAU,CACrD,KAAK,eAAiB,GACtB,MAAMwM,EAAYxM,EAAM,MAAQ,GAC5BwM,IACF,KAAK,sBAAwB,CAAE,KAAMA,EAAW,GAAI,KAAK,KAAI,EAC7D,KAAK,SAASA,CAAS,EACvB,KAAK,cAAA,EAET,CAAC,EAEDpB,EAAS,iBAAiB,cAAgBpL,GAAU,CAKlD,GAJI,KAAK,cAILA,EAAM,YAAc,kBACtB,OAGF,MAAM4D,EAAO5D,EAAM,MAAQ,GAK3B,GAJI,CAAC4D,GAID5D,EAAM,aAAe,KAAK,eAC5B,OAGF,MAAMyM,EAA0B,KAAK,sBACrC,GACEA,GACAA,EAAwB,OAAS7I,GACjC,KAAK,MAAQ6I,EAAwB,GAAK,GAC1C,CACA,KAAK,sBAAwB,KAC7BzM,EAAM,eAAA,EACN,KAAK,cAAA,EACL,MACF,CAEA,KAAK,sBAAwB,KAE7BA,EAAM,eAAA,EACN,KAAK,SAAS4D,CAAI,EAClB,KAAK,cAAA,CACP,CAAC,EAEDwH,EAAS,iBAAiB,QAAUpL,GAAU,OAC5C,GAAI,KAAK,aACP,OAGF,MAAMxD,IAAO2D,EAAAH,EAAM,gBAAN,YAAAG,EAAqB,QAAQ,gBAAiB,GACtD3D,IAILwD,EAAM,eAAA,EACN,KAAK,MAAMxD,CAAI,EACf,KAAK,cAAA,EACP,CAAC,EAED4O,EAAS,iBAAiB,OAASpL,GAAU,CAC3C,MAAMsM,EAAgB,KAAK,iBAAA,EACtBA,GAILlM,GAA0BJ,EAAOsM,CAAa,CAChD,CAAC,EAEDlB,EAAS,iBAAiB,QAAS,IAAM,CACvC,GAAI,KAAK,cAAgB,KAAK,eAC5B,OAGF,MAAMxH,EAAOwH,EAAS,aAAe,GACrC,GAAI,CAACxH,EAAM,CACT,KAAK,cAAA,EACL,MACF,CAEA,MAAM6I,EAA0B,KAAK,sBACrC,GACEA,GACAA,EAAwB,OAAS7I,GACjC,KAAK,MAAQ6I,EAAwB,GAAK,GAC1C,CACA,KAAK,sBAAwB,KAC7B,KAAK,cAAA,EACL,MACF,CAEA,KAAK,sBAAwB,KAC7B,KAAK,SAAS7I,CAAI,EAClB,KAAK,cAAA,CACP,CAAC,CACH,CAEQ,oBACN5D,EACAiC,EACe,CACf,MAAMyK,EAAUzT,GAAkB+G,EAAM,IAAI,EAC5C,GAAI0M,IAAY,EACd,OAAO,KAGT,MAAMC,EACJ3M,EAAM,IAAI,SAAW,GAAK,CAACA,EAAM,SAAW,CAACA,EAAM,QAAUA,EAAM,IAAM,KAE3E,OAAO,KAAK,SAAS,eAAe,KAAK,iBAAkB,KAAK,eAAgB,CAC9E,OAAAiC,EACA,QAAAyK,EACA,KAAM1J,GAA2BhD,CAAK,EACtC,UAAWA,EAAM,YACjB,KAAA2M,EACA,mBAAoBxT,GAAsB6G,EAAM,IAAI,CAAA,CACrD,CACH,CAEQ,sBAA0C,CAChD,MAAM4M,EACJ,KAAK,cAAcrL,EAAsB,GACzC,KAAK,cAAcC,EAAyB,GAC5C,KAAK,cAAcC,EAAyB,GAC5C,KAAK,cAAcC,EAAsB,EACrCmL,EACJ,KAAK,cAAcxD,EAAuB,GAC1C,KAAK,cAAcC,EAA4B,EAEjD,MAAO,CACL,eAAAsD,EACA,UAAW,CAACA,GAAkBC,GAAa,KAAK,cAAczD,EAAuB,CAAA,CAEzF,CAEQ,eAAe0C,EAAyC,CAC9D,MAAMgB,EAAa,KAAK,eAAA,EAAiB,QAAU7D,GAEnD,GAAI6C,EAAQ,SAAW,QAAS,CAC9B,GAAIA,EAAQ,YAAc,EACxB,YAAK,gBAAkB,EAChBA,EAAQ,OAAS,EAAI,KAAK,KAAKA,EAAQ,MAAM,EAAI,KAAK,MAAMA,EAAQ,MAAM,EAGnF,GAAIA,EAAQ,YAAc,EAAG,CAC3B,KAAK,gBAAkB,EACvB,MAAMiB,EAAY,KAAK,IAAI,EAAG,KAAK,IAAI,EACjCC,EAASlB,EAAQ,OAASiB,EAChC,OAAOC,EAAS,EAAI,KAAK,KAAKA,CAAM,EAAI,KAAK,MAAMA,CAAM,CAC3D,CAEA,KAAK,iBAAmBlB,EAAQ,OAChC,MAAMzB,EACJ,KAAK,gBAAkB,EACnB,KAAK,MAAM,KAAK,gBAAkByC,CAAU,EAC5C,KAAK,KAAK,KAAK,gBAAkBA,CAAU,EACjD,OAAIzC,IAAU,IACZ,KAAK,iBAAmBA,EAAQyC,GAE3BzC,CACT,CAEA,OAAOyB,EAAQ,OAAS,EACpB,KAAK,KAAKA,EAAQ,OAASgB,CAAU,EACrC,KAAK,MAAMhB,EAAQ,OAASgB,CAAU,CAC5C,CAEQ,cAAcnO,EAAuB,CAC3C,OAAO,KAAK,SAAS,sBAAsB,KAAK,eAAgBA,CAAI,CACtE,CAEQ,qBAAqBqB,EAAkC,CAC7D,OAAQA,EAAM,OAAA,CACZ,IAAK,GACH,OAAOwJ,GACT,IAAK,GACH,OAAOC,GACT,IAAK,GACH,OAAOC,GACT,QACE,OAAO,IAAA,CAEb,CAEQ,uBAAuBuD,EAAgC,CAC7D,OAAIA,EAAU,EACLzD,GAELyD,EAAU,EACLxD,GAELwD,EAAU,EACLvD,GAGF,IACT,CAEQ,0BAA0BwD,EAAiBC,EAAkD,OACnG,MAAM3V,GAAO2I,EAAA,KAAK,gBAAL,YAAAA,EAAoB,wBACjC,GAAI,CAAC3I,EACH,OAAO,KAGT,MAAMN,EAAQ,KAAK,IAAI,EAAGM,EAAK,KAAK,EAC9BL,EAAS,KAAK,IAAI,EAAGK,EAAK,MAAM,EACtC,MAAO,CACL,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIN,EAAQ,EAAGgW,EAAU1V,EAAK,IAAI,CAAC,EACvD,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIL,EAAS,EAAGgW,EAAU3V,EAAK,GAAG,CAAC,CAAA,CAE3D,CAEQ,eAAejB,EAOX,OACV,GAAI,KAAK,aACP,MAAO,GAGT,MAAM6W,EAAW,KAAK,0BAA0B7W,EAAQ,QAASA,EAAQ,OAAO,EAChF,GAAI,CAAC6W,EACH,MAAO,GAGT,MAAMxV,EAAO,KAAK,eAAA,EACZJ,GAAO2I,EAAA,KAAK,gBAAL,YAAAA,EAAoB,wBACjC,GAAI,CAAC3I,EACH,MAAO,GAGT,MAAM+U,EAAU,KAAK,SAAS,iBAAiB,KAAK,mBAAoB,KAAK,eAAgB,CAC3F,OAAQhW,EAAQ,OAChB,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,EAAG6W,EAAS,EACZ,EAAGA,EAAS,EACZ,iBAAkB7W,EAAQ,iBAC1B,YAAa,KAAK,IAAI,EAAG,KAAK,MAAMiB,EAAK,KAAK,CAAC,EAC/C,aAAc,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAK,MAAM,CAAC,EACjD,UAAW,KAAK,IAAI,EAAG,KAAK,MAAMI,EAAK,OAASoR,EAAkB,CAAC,EACnE,WAAY,KAAK,IAAI,EAAG,KAAK,MAAMpR,EAAK,QAAUqR,EAAmB,CAAC,CAAA,CACvE,EACD,OAAKsD,GAIL,KAAK,SAASA,CAAO,EACd,IAJE,EAKX,CAEQ,mBAAmBlC,EAAwB,CACjD,MAAMqC,EAAUzT,GAAkBoR,EAAQ,EAAI,UAAY,WAAW,EACrE,GAAIqC,IAAY,EACd,MAAO,GAGT,IAAIV,EAAW,GACf,QAASlT,EAAQ,EAAGA,EAAQ,KAAK,IAAIuR,CAAK,EAAGvR,GAAS,EAAG,CACvD,MAAMyT,EAAU,KAAK,SAAS,eAAe,KAAK,iBAAkB,KAAK,eAAgB,CACvF,OAAQ,QACR,QAAAG,EACA,KAAM,EACN,UAAW,GACX,KAAM,KACN,mBAAoB,IAAA,CACrB,EACIH,IAGL,KAAK,SAASA,CAAO,EACrBP,EAAW,GACb,CAEA,OAAOA,CACT,CAEQ,SAASpI,EAAoB,CACnC,UAAWyJ,KAAY,KAAK,cAC1BA,EAASzJ,CAAI,CAEjB,CAEQ,eAAsB,CACxB,KAAK,WACP,KAAK,SAAS,YAAc,GAEhC,CAEQ,8BAAqC,CAC3C,MAAMwH,EAAW,KAAK,SAChBD,EAAS,KAAK,cACpB,GAAI,CAACC,GAAY,CAACD,EAChB,OAGF,KAAM,CAAE,MAAAjU,EAAO,OAAAC,GAAW,KAAK,eAAA,EAC/B,GAAID,GAAS,GAAKC,GAAU,EAC1B,OAGF,MAAM4T,EAAc3N,GAAkB,KAAK,QAAQ,EACnD,IAAIkQ,EAAU,EACVC,EAAU,EACd,GAAI,CACFlQ,GAAkB0N,EAAa,KAAK,cAAc,EAClD,MAAM9S,EAAOsF,GAAuBwN,CAAW,EAC3C9S,EAAK,OAAO,IAAM,MAAQA,EAAK,OAAO,IAAM,OAC9CqV,EAAUrV,EAAK,OAAO,EACtBsV,EAAUtV,EAAK,OAAO,EAE1B,QAAA,CACEwF,GAA4BsN,CAAW,CACzC,CAEA,MAAMyC,EAAOF,EAAUpW,EACjBuW,EAAMF,EAAUpW,EAEtBiU,EAAS,MAAM,KAAO,GAAGoC,CAAI,KAC7BpC,EAAS,MAAM,IAAM,GAAGqC,CAAG,KAC3BrC,EAAS,MAAM,MAAQ,GAAG,KAAK,IAAI,EAAGlU,CAAK,CAAC,KAC5CkU,EAAS,MAAM,OAAS,GAAG,KAAK,IAAI,EAAGjU,CAAM,CAAC,KAC9CiU,EAAS,MAAM,WAAa,GAAGjU,CAAM,KACrCiU,EAAS,MAAM,WAAa,KAAK,QAAQ,WACzCA,EAAS,MAAM,SAAW,GAAG,KAAK,QAAQ,QAAQ,IACpD,CAEQ,gBAAuB,CACzB,KAAK,YAAc,OAIvB,KAAK,UAAY,sBAAsB,IAAM,CAC3C,KAAK,UAAY,KACjB,KAAK,OAAA,CACP,CAAC,EACH,CAEQ,QAAe,CACrB,GAAI,KAAK,UAAY,CAAC,KAAK,eAAiB,CAAC,KAAK,SAChD,OAGF,MAAMxG,EAAY,KAAK,SAAS,cAAc,KAAK,cAAc,EAC3DjF,EAAe,KAAK,IAAI,EAAGiF,EAAU,KAAO,KAAK,IAAI,EAE3DvH,GAAkB,KAAK,YAAa,KAAK,cAAc,EACvD,MAAMpF,EAAOsF,GAAuB,KAAK,WAAW,EAC9CxG,EAAO,MAAM,KAAKyG,GAAY,KAAK,WAAW,CAAC,EAErD,KAAK,KAAO,KAAK,IAAI,EAAGvF,EAAK,IAAI,EACjC,KAAK,KAAO,KAAK,IAAI,EAAGA,EAAK,MAAQ0H,CAAY,EACjD,KAAK,mBAAqBiF,EAAU,OACpC,KAAK,iBAAmB,KAAK,KAC7B,KAAK,iBAAmB7N,EAExB,UAAWF,KAAOE,EAChB,KAAK,UAAU,IAAI6N,EAAU,OAAS/N,EAAI,EAAGA,EAAI,IAAI,EAGvD,MAAM6W,EAAiBjO,GACrB,KAAK,eACL,KAAK,mBACL,KAAK,iBACJxB,GAAS,KAAK,YAAYA,CAAI,CAAA,EAE3BqO,EAAgB,KAAK,iBAAA,EAE3B,KAAK,SAAS,OAAO,CACnB,KAAArU,EACA,KAAAlB,EACA,eAAgB,KAAK,eAAA,EACrB,eAAA2W,EACA,eAAgB,KAAK,QAAQ,MAAM,mBAAA,CACpC,EAED,MAAMC,EAAepD,GAAsBxT,EAAM,KAAK,IAAI,EACpDoT,EAAQ,KAAK,IAAI,EAAGvF,EAAU,MAAQA,EAAU,GAAG,EACzD,KAAK,OAAO,YAAYA,EAAU,OAAQuF,EAAOvF,EAAU,MAAO+I,CAAY,EAC9E,KAAK,yBAAyBrB,CAAa,EAC3C,KAAK,gBAAgB1H,CAAS,CAChC,CAEQ,gBAAgBA,EAAiE,OACvF,MAAMgJ,EAAQ,KAAK,eACnB,GAAI,CAACA,EACH,OAGF,MAAMC,IAAc1N,EAAA,KAAK,gBAAL,YAAAA,EAAoB,eAAgB,EACxD,GAAI0N,IAAgB,GAAKjJ,EAAU,OAASA,EAAU,IAAK,CACzDgJ,EAAM,MAAM,QAAU,IACtB,MACF,CAEA,MAAME,EAAQlJ,EAAU,IAAMA,EAAU,MAClCmJ,EAAc,KAAK,IAAI,GAAID,EAAQD,CAAW,EAE9CG,EADcpJ,EAAU,OAAS,KAAK,IAAI,EAAGA,EAAU,MAAQA,EAAU,GAAG,GAClDiJ,EAAcE,GAE9CH,EAAM,MAAM,OAAS,GAAGG,CAAW,KACnCH,EAAM,MAAM,UAAY,cAAcI,CAAQ,MAC9CJ,EAAM,MAAM,QAAU,IAElB,KAAK,oBACP,aAAa,KAAK,kBAAkB,EAEtC,KAAK,mBAAqB,WAAW,IAAM,CACzCA,EAAM,MAAM,QAAU,GACxB,EAAG,GAAG,CACR,CAEQ,sBAA6B,CACnC,GAAI,CAAC,KAAK,QACR,OAGF,MAAMK,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,YAAc,aACpBA,EAAM,MAAM,SAAW,WACvBA,EAAM,MAAM,WAAa,SACzBA,EAAM,MAAM,WAAa,MACzBA,EAAM,MAAM,WAAa,KAAK,QAAQ,WACtCA,EAAM,MAAM,SAAW,GAAG,KAAK,QAAQ,QAAQ,KAC/CA,EAAM,MAAM,WAAa,MAEzB,KAAK,QAAQ,YAAYA,CAAK,EAC9B,MAAMzW,EAAOyW,EAAM,sBAAA,EACnBA,EAAM,OAAA,EAEN,KAAK,MAAM,eAAe,WAAW,IAAI,KAAK,MAC5CzW,EAAK,MAAQ,EAAIA,EAAK,MAAQ,GAAKwR,GACrC,KAAK,MAAM,eAAe,WAAW,IAAI,KAAK,OAC5CxR,EAAK,OAAS,EAAIA,EAAK,OAASyR,EACpC,CAEQ,oBAAoBiF,EAAU,GAAY,CAChD,KAAK,eAAiBC,GAAA,EACtB,KAAK,oBAAoB,MAAA,EACzB,KAAK,gBAAkB,EACvB,KAAK,YAAc,CACjB,OAAQ,GACR,MAAO,GACP,KAAM,YACN,YAAa,KACb,YAAa,IAAA,EAEf,KAAK,uBAAyB,GAC9B,KAAK,eAAA,EACL,KAAK,yBAAyB,IAAI,EAE9BD,GAAW,KAAK,eAAiB,KAAK,UACxC,KAAK,OAAA,CAET,CAEQ,sBAAsBlO,EAAyB,CACrD,MAAMtB,EAAQ,KAAK,QAAQsB,EAAM,QAASA,EAAM,OAAO,EACvD,GAAI,CAACtB,EACH,OAGF,MAAMC,EAAO,KAAK,6BAA6BqB,EAAM,MAAM,EAC3D,KAAK,YAAc,CACjB,OAAQ,GACR,MAAO,GACP,KAAArB,EACA,YAAaqB,EAAM,QACnB,YAAaA,EAAM,OAAA,EAErB,KAAK,eAAiBf,GACpB,KAAK,eACL,CACE,GAAGP,EACH,KAAAC,CAAA,EAEDV,GAAS,KAAK,YAAYA,CAAI,CAAA,EAEjC,KAAK,iBAAA,EACL,KAAK,OAAA,CACP,CAEQ,uBAAuB+B,EAAyB,CACtD,GAAI,CAAC,KAAK,YAAY,OACpB,OAGF,MAAMtB,EAAQ,KAAK,QAAQsB,EAAM,QAASA,EAAM,OAAO,EACvD,KAAK,YAAY,YAAcA,EAAM,QACrC,KAAK,YAAY,YAAcA,EAAM,QAEjCtB,IACF,KAAK,YAAY,MAAQ,GACzB,KAAK,eAAiBU,GAAqB,KAAK,eAAgBV,EAAQT,GACtE,KAAK,YAAYA,CAAI,CAAA,EAEvB,KAAK,OAAA,GAGP,KAAK,iBAAA,CACP,CAEQ,uBAAuB+B,EAAyB,aACtD,GAAI,CAAC,KAAK,YAAY,QAAUA,EAAM,SAAW,EAC/C,OAGF,KAAK,YAAY,YAAcA,EAAM,QACrC,KAAK,YAAY,YAAcA,EAAM,QACrC,KAAK,eAAA,EAEL,MAAMoO,EACJ,KAAK,YAAY,OAAS,aAC1B,CAAC,KAAK,YAAY,SAClBjO,EAAA,KAAK,eAAe,SAApB,YAAAA,EAA4B,UAAS8C,EAAA,KAAK,eAAe,QAApB,YAAAA,EAA2B,SAChEoL,EAAA,KAAK,eAAe,SAApB,YAAAA,EAA4B,SAAQC,EAAA,KAAK,eAAe,QAApB,YAAAA,EAA2B,KAGjE,GAFA,KAAK,YAAY,OAAS,GAEtBF,EAAa,CACf,KAAK,oBAAA,EACL,MACF,CAEA,KAAK,OAAA,CACP,CAEQ,6BAA6BG,EAA+B,CAClE,OAAIA,GAAU,EACL,OAELA,IAAW,EACN,OAEF,WACT,CAEQ,QAAQrB,EAAiBC,EAAwC,OACvE,MAAM3V,GAAO2I,EAAA,KAAK,gBAAL,YAAAA,EAAoB,wBACjC,GAAI,CAAC3I,EACH,OAAO,KAGT,KAAM,CAAE,MAAAN,EAAO,OAAAC,GAAW,KAAK,eAAA,EAC/B,GAAID,GAAS,GAAKC,GAAU,EAC1B,OAAO,KAGT,MAAMqX,EAAYtB,EAAU1V,EAAK,KAC3BiX,EAAYtB,EAAU3V,EAAK,IAC3BkX,EAAS,KAAK,IAAI,KAAK,KAAO,EAAG,CAAC,EAClCC,EAAS,KAAK,IAAI,KAAK,iBAAmB,EAAG,CAAC,EAC9C/Q,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI8Q,EAAQ,KAAK,MAAMF,EAAYtX,CAAK,CAAC,CAAC,EACjEL,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI8X,EAAQ,KAAK,MAAMF,EAAYtX,CAAM,CAAC,CAAC,EAExE,MAAO,CACL,KAAM,KAAK,mBAAqBN,EAChC,IAAA+G,CAAA,CAEJ,CAEQ,YAAYK,EAAsB,CACxC,MAAMzF,EAAS,KAAK,UAAU,IAAIyF,CAAI,EACtC,GAAI,OAAOzF,GAAW,SACpB,OAAOA,EAGT,MAAMoW,EAAe3Q,EAAO,KAAK,mBAC3B4Q,EAAa,KAAK,iBAAiBD,CAAY,EACrD,OAAOC,GAAA,YAAAA,EAAY,OAAQ,EAC7B,CAEQ,kBAAkC,CACxC,OAAK/P,GAAa,KAAK,cAAc,EAI9BQ,GAAuB,KAAK,eAAiBrB,GAAS,KAAK,YAAYA,CAAI,CAAC,EAH1E,IAIX,CAEQ,yBAAyB7E,EAA4B,CAC1D,WAAkE,+BACjEA,CACJ,CAEQ,kBAAyB,OAC/B,GAAI,CAAC,KAAK,YAAY,QAAU,KAAK,YAAY,cAAgB,KAAM,CACrE,KAAK,eAAA,EACL,MACF,CAEA,MAAM5B,GAAO2I,EAAA,KAAK,gBAAL,YAAAA,EAAoB,wBACjC,GAAI,CAAC3I,EAAM,CACT,KAAK,eAAA,EACL,MACF,CAIA,GAAI,EADF,KAAK,YAAY,YAAcA,EAAK,KAAO,KAAK,YAAY,YAAcA,EAAK,QAC3D,CACpB,KAAK,eAAA,EACL,MACF,CAEI,KAAK,kBAAoB,OAI7B,KAAK,gBAAkB,YAAY,IAAM,CACvC,KAAK,eAAA,CACP,EAAG0R,EAAuB,EAC5B,CAEQ,gBAAuB,OAC7B,GAAI,CAAC,KAAK,YAAY,QAAU,KAAK,YAAY,cAAgB,MAAQ,KAAK,YAAY,cAAgB,KAAM,CAC9G,KAAK,eAAA,EACL,MACF,CAEA,MAAM1R,GAAO2I,EAAA,KAAK,gBAAL,YAAAA,EAAoB,wBACjC,GAAI,CAAC3I,EAAM,CACT,KAAK,eAAA,EACL,MACF,CAEA,IAAI0M,EAAQ,EAOZ,GANI,KAAK,YAAY,YAAc1M,EAAK,IACtC0M,EAAQ,GACC,KAAK,YAAY,YAAc1M,EAAK,SAC7C0M,EAAQ,GAGNA,IAAU,EAAG,CACf,KAAK,eAAA,EACL,MACF,CAEA,KAAK,SAAS,oBAAoB,KAAK,eAAgBA,CAAK,EAC5D,KAAK,OAAA,EAEL,MAAMxF,EAAQ,KAAK,QAAQ,KAAK,YAAY,YAAa,KAAK,YAAY,WAAW,EAChFA,IAIL,KAAK,eAAiBU,GAAqB,KAAK,eAAgBV,EAAQT,GACtE,KAAK,YAAYA,CAAI,CAAA,EAEvB,KAAK,YAAY,MAAQ,GACzB,KAAK,OAAA,EACP,CAEQ,gBAAuB,CACzB,KAAK,kBAAoB,OAI7B,cAAc,KAAK,eAAe,EAClC,KAAK,gBAAkB,KACzB,CAEQ,wBAA+B,CACrC,KAAO,KAAK,kBAAkB,OAAS,GAAG,CACxC,MAAM6Q,EAAU,KAAK,kBAAkB,IAAA,EACvCA,GAAA,MAAAA,GACF,CACF,CACF,CAEA,eAAsBC,GACpBxY,EACoC,CACpC,OAAOoU,GAA0B,OAAOpU,CAAO,CACjD,CC7hDO,MAAMyY,GAAoB,CAC/B,WAAY,UACZ,WAAY,UACZ,OAAQ,UACR,oBAAqB,yBAErB,MAAO,UACP,IAAK,UACL,MAAO,UACP,OAAQ,UACR,KAAM,UACN,QAAS,UACT,KAAM,UACN,MAAO,UAEP,YAAa,UACb,UAAW,UACX,YAAa,UACb,aAAc,UACd,WAAY,UACZ,cAAe,UACf,WAAY,UACZ,YAAa,SACf,EAMaC,GAAmB,CAC9B,WAAY,UACZ,WAAY,UACZ,OAAQ,UACR,oBAAqB,4BAErB,MAAO,UACP,IAAK,UACL,MAAO,UACP,OAAQ,UACR,KAAM,UACN,QAAS,UACT,KAAM,UACN,MAAO,UAEP,YAAa,UACb,UAAW,UACX,YAAa,UACb,aAAc,UACd,WAAY,UACZ,cAAe,UACf,WAAY,UACZ,YAAa,SACf,EAEaC,GACX,iNCpEK,SAASC,GAA4BvL,EAAsB,CAChE,GAAI,CAACA,EAAM,OAAOA,EAClB,MAAMwL,EAAYxL,EAAK,QAAQ,QAAS;AAAA,CAAI,EAE5C,OADgBwL,EAAU,SAAS;AAAA,CAAI,EAAIA,EAAU,MAAM,EAAG,EAAE,EAAIA,GACrD,QAAQ,MAAO;AAAA,CAAM,CACtC,CAEA,MAAMC,GAA8B,2BAE7B,SAASC,GAA2B1L,EAAsB,CAC/D,OAAOyL,GAA8BF,GAA4BvL,CAAI,CACvE,CAEO,SAAS2L,GACd3L,EACA4L,EACkD,CAClD,IAAIC,EAAYD,EACZE,EAAe,EAEnB,UAAWC,KAAQ/L,EACb+L,IAAS,IAAQ,CAACF,IACpBC,GAAgB,GAElBD,EAAYE,IAAS,GAGvB,MAAMC,EAAcH,EACpB,GAAIC,IAAiB,EACnB,MAAO,CAAE,WAAY9L,EAAM,YAAAgM,CAAA,EAG7B,MAAMxN,EAAa,IAAI,WAAWwB,EAAK,OAAS8L,CAAY,EAC5D,IAAIG,EAAa,EACjBJ,EAAYD,EAEZ,UAAWG,KAAQ/L,EACb+L,IAAS,IAAQ,CAACF,IACpBrN,EAAWyN,CAAU,EAAI,GACzBA,GAAc,GAEhBzN,EAAWyN,CAAU,EAAIF,EACzBE,GAAc,EACdJ,EAAYE,IAAS,GAGvB,MAAO,CAAE,WAAAvN,EAAY,YAAAwN,CAAA,CACvB,CC9BA,MAAME,GAAoB,IACpBC,GAA6B,GAE5B,SAASC,GACdC,EACAC,EACA,CACA,MAAMC,EAAcC,EAAAA,OAAO,EAAK,EAEhCC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMpF,EAAYgF,EAAa,QAK/B,GAJI,CAAChF,GAID,EADF,OAAO,WAAa,KAAO,UAAU,eAAiB,GAAK,iBAAkB,QAChE,OAEfkF,EAAY,QAAU,GACtB,IAAIG,EAAa,EACbC,EAAyB,KACzBC,EAAqB,GACrBC,EAAoB,EAExB,MAAMC,EAAsBhN,GACrBA,EACE,GACLA,EAAO,QAAQ,YAAY,GACzBA,EAAO,QAAQ,SAAS,GACxBA,EAAO,QAAQ,oBAAoB,GAJnB,GAQhBiN,EAA2B,CAC/BzD,EACAC,EACAyD,IACY,CACZ,MAAMC,EAAeD,aAAuB,QAAUA,EAAc,KACpE,GAAIF,EAAmBG,CAAY,EACjC,MAAO,GAGT,MAAMC,EAAc,SAAS,iBAAiB5D,EAASC,CAAO,EAC9D,GAAIuD,EAAmBI,CAAW,EAChC,MAAO,GAGT,MAAMC,EAAY9F,EAAU,cAAc,QAAQ,EAClD,GAAI,EAAE8F,aAAqB,aACzB,MAAO,GAGT,MAAMvZ,EAAOuZ,EAAU,sBAAA,EACjBC,EAAU9D,GAAW1V,EAAK,MAAQ0V,GAAW1V,EAAK,MAClDyZ,EAAU9D,GAAW3V,EAAK,KAAO2V,GAAW3V,EAAK,OACvD,MAAI,CAACwZ,GAAW,CAACC,EACR,GAGF/D,GAAW1V,EAAK,MAAQuY,EACjC,EAEMmB,EAAoB,IACL,CACjBjG,EAAU,cAAc,iBAAiB,EACzCA,EAAU,cAAc,2BAA2B,CAAA,EAGnC,OAAQkG,GAA0BA,aAAc,WAAW,EAGzEC,EAAiBC,GAAuC,CAC5D,GAAId,IAAY,KAAM,OAAO,KAC7B,QAASe,EAAI,EAAGA,EAAID,EAAU,OAAQC,GAAK,EAAG,CAC5C,MAAMC,EAAQF,EAAU,KAAKC,CAAC,EAC9B,GAAIC,GAASA,EAAM,aAAehB,EAChC,OAAOgB,CAEX,CACA,OAAO,IACT,EAEMC,EAAoBxR,GAAsB,CAC9C,GAAIA,EAAM,QAAQ,SAAW,EAAG,OAChC,MAAMuR,EAAQvR,EAAM,QAAQ,KAAK,CAAC,EAC7BuR,IAELhB,EAAUgB,EAAM,WAChBjB,EAAaiB,EAAM,QACnBd,EAAoB,EACpBD,EAAqBG,EAAyBY,EAAM,QAASA,EAAM,QAASvR,EAAM,MAAM,EAC1F,EAEMyR,EAAmBzR,GAAsB,sBAC7C,MAAMuR,EAAQH,EAAcpR,EAAM,OAAO,GAAKA,EAAM,QAAQ,KAAK,CAAC,EAQlE,GAPI,CAACuR,IACAf,IACHA,EAAqBG,EAAyBY,EAAM,QAASA,EAAM,QAASvR,EAAM,MAAM,EACpFwQ,IACFC,EAAoB,IAGpBD,GAAoB,OAExB,MAAMkB,EAAWH,EAAM,QACjBI,EAASrB,EAAaoB,EAG5B,GAFApB,EAAaoB,EAETC,IAAW,EAAG,OAElB,IAAIC,EAAY,GACZC,EAAwB,GAC5B,MAAM9N,GAAWmM,GAAA,YAAAA,MAAmB,KAEpC,GAAInM,EAAU,CACZ,MAAM+N,EAAQ/N,GAAA,YAAAA,EAAkB,MAC1BgO,IAAazD,GAAAD,IAAApL,GAAA9C,EAAA2R,GAAA,YAAAA,EAAM,iBAAN,YAAA3R,EAAsB,aAAtB,YAAA8C,EAAkC,MAAlC,YAAAoL,GAAuC,OAAvC,YAAAC,EAA6C,SAAU,GAC1EmC,GAAqBkB,EAAS7B,GAC9B,MAAMkC,EACJvB,EAAoB,EAChB,KAAK,MAAMA,EAAoBsB,CAAU,EACzC,KAAK,KAAKtB,EAAoBsB,CAAU,EAE9C,GAAI,OAAOhO,EAAS,uBAA0B,WACxCiO,IAAkB,IACpBJ,EAAY7N,EAAS,sBAAsB,CACzC,OAAQ,QACR,OAAQiO,EAAgBD,EACxB,QAASR,EAAM,QACf,QAASA,EAAM,OAAA,CAChB,EACDd,GAAqBuB,EAAgBD,WAGnCC,IAAkB,EAAG,CACvB,MAAMC,IAAkBC,GAAAC,EAAApO,EAAS,SAAT,YAAAoO,EAAiB,SAAjB,YAAAD,EAAyB,YAAa,EAC9DnO,EAAS,YAAYiO,CAAa,EAClC,MAAMI,KAAiBC,GAAAC,EAAAvO,EAAS,SAAT,YAAAuO,EAAiB,SAAjB,YAAAD,EAAyB,YAAa,EAC7DT,EAAYK,IAAoBG,GAChCP,EAAwBG,EAAgB,GAAKC,GAAmB,GAAKG,IAAkB,EACvF3B,GAAqBuB,EAAgBD,CACvC,CAEJ,KAAO,CACL,MAAMQ,EAAgBrB,EAAA,EACtB,GAAIqB,EAAc,SAAW,EAAG,OAEhC,UAAW7O,KAAU6O,EAAe,CAClC,MAAMC,EAAoB9O,EAAO,UACjCA,EAAO,WAAaiO,EACpB,MAAMc,EAAgB/O,EAAO,UAEzB,KAAK,IAAI+O,EAAgBD,CAAiB,EAAI,IAChDZ,EAAY,IAEVD,EAAS,GAAKc,GAAiB,IACjCZ,EAAwB,GAE5B,CACA,GAAI,CAACD,EAAW,CACd,MAAMb,EAAY9F,EAAU,cAAc,QAAQ,EAClD,GAAI8F,aAAqB,YAAa,CACpC,MAAM2B,EAAa,IAAI,WAAW,QAAS,CACzC,QAAS,GACT,WAAY,GACZ,UAAW,WAAW,gBACtB,OAAAf,CAAA,CACD,EACKgB,EAAa5B,EAAU,cAAc2B,CAAU,EACrDd,EAAYc,EAAW,kBAAoB,CAACC,CAC9C,CACF,CACF,CAEK3S,EAAM,aACP4R,GAAaC,IACf7R,EAAM,eAAA,CAEV,EAEM4S,EAAkB5S,GAAsB,CACxCuQ,IAAY,MAEZ,CADea,EAAcpR,EAAM,cAAc,IAErDuQ,EAAU,KACVE,EAAoB,EACpBD,EAAqB,GACvB,EAEA,OAAAvF,EAAU,iBAAiB,aAAcuG,EAAkB,CAAE,QAAS,GAAM,EAC5EvG,EAAU,iBAAiB,YAAawG,EAAiB,CAAE,QAAS,GAAO,EAC3ExG,EAAU,iBAAiB,WAAY2H,EAAgB,CAAE,QAAS,GAAM,EACxE3H,EAAU,iBAAiB,cAAe2H,EAAgB,CAAE,QAAS,GAAM,EAEpE,IAAM,CACXzC,EAAY,QAAU,GACtBlF,EAAU,oBAAoB,aAAcuG,CAAgB,EAC5DvG,EAAU,oBAAoB,YAAawG,CAAe,EAC1DxG,EAAU,oBAAoB,WAAY2H,CAAc,EACxD3H,EAAU,oBAAoB,cAAe2H,CAAc,CAC7D,CACF,EAAG,CAAC3C,EAAcC,CAAW,CAAC,EAEvBC,CACT,CCvMO,SAAS0C,GAA0B,CACxC,IAAAC,EACA,WAAAC,EACA,iBAAAC,EACA,MAAAC,EAAQ,GACV,EAAsC,CAKpC,MAJI,CAACD,GAIDF,EAAME,EAAiB,GAAKC,EACvB,GAGFD,EAAiB,OAASD,EAAW,MAAQC,EAAiB,OAASD,EAAW,IAC3F,CAgBO,SAASG,GAA4B,CAC1C,YAAAC,EACA,cAAAC,EACA,MAAAC,EAAQ,EACV,EAAsC,CACpC,OAAIA,EACK,GAGFF,EAAY,OAASC,EAAc,MAAQD,EAAY,OAASC,EAAc,IACvF,CC/CO,SAASE,GAAkB,CAChC,SAAAC,EACA,OAAAC,EACA,gBAAAC,EACA,mBAAAC,EACA,SAAAC,EACA,OAAAC,EACA,iBAAAC,CACF,EAA6B,CAC3B,MAAMC,EAAY1D,EAAAA,OAAsB,IAAI,EACtC2D,EAAc3D,EAAAA,OAAsB,IAAI,EACxC4D,EAAmB5D,EAAAA,OAA8C,IAAI,EACrE4C,EAAmB5C,EAAAA,OAA0D,IAAI,EACjF6D,EAA2B7D,EAAAA,OAAO,CAAC,EACnC8D,EAAyB9D,EAAAA,OAAiB,EAAE,EAC5C+D,EAAc/D,EAAAA,OAAwB,IAAI,EAC1CgE,EAAchE,EAAAA,OAAsC,IAAI,EACxDiE,EAAsBjE,EAAAA,OAAOyD,CAAgB,EAC7CS,EAA4BlE,EAAAA,OAAO,EAAK,EAGxCmE,EAAcnE,EAAAA,OAAOuD,CAAQ,EAC7Ba,EAAYpE,EAAAA,OAAOwD,CAAM,EAG/BvD,EAAAA,UAAU,IAAM,CACdkE,EAAY,QAAUZ,CACxB,EAAG,CAACA,CAAQ,CAAC,EAEbtD,EAAAA,UAAU,IAAM,CACdmE,EAAU,QAAUZ,CACtB,EAAG,CAACA,CAAM,CAAC,EAEXvD,EAAAA,UAAU,IAAM,CACdgE,EAAoB,QAAUR,CAChC,EAAG,CAACA,CAAgB,CAAC,EAErB,MAAMY,EAAsBC,EAAAA,YAAY,IAA6C,2BACnF,MAAMC,EAAOP,EAAY,QACnBQ,EAAWT,EAAY,QAC7B,GAAI,CAACQ,GAAQ,CAACC,GAAY,CAACD,EAAK,QAC9B,OAAO,KAGT,IAAI7d,EAEJ,GAAI,CACF,MAAM8T,GAAWgK,EAAS,kBAAA,EAC1B,GAAI,CAAChK,GACH,MAAM,IAAI,MAAM,4CAA4C,EAE9D9T,EAAO,KAAK,IAAI,EAAG8T,GAAS,IAAI,CAClC,MAAQ,CACN,MAAMkH,GAAQ6C,EAAa,MACrB3c,KAAY8Z,GAAAA,GAAAA,IAAAA,EAAAA,IAAAA,YAAAA,GAAM,iBAANA,YAAAA,EAAsB,aAAtBA,YAAAA,GAAkC,MAAlCA,YAAAA,EAAuC,OAAvCA,YAAAA,EAA6C,QAAS,EAClEta,IAAO2a,EAAAkC,EAAoB,UAApB,YAAAlC,EAAA,KAAAkC,GACb,GAAI,CAAC7c,IAAQA,GAAK,QAAU,EAC1B,OAAO,KAETV,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMU,GAAK,MAAQQ,EAAS,CAAC,CACvD,CAEA,MAAM6c,GAAgB3C,EAAAmC,EAAoB,UAApB,YAAAnC,EAAA,KAAAmC,GACtB,GAAI,CAACQ,GAAiBA,EAAc,SAAW,EAC7C,OAAO,KAET,MAAM/C,EAAQ6C,EAAa,MACrB7H,IAAagI,GAAAC,IAAA1C,GAAAC,EAAAR,GAAA,YAAAA,EAAM,iBAAN,YAAAQ,EAAsB,aAAtB,YAAAD,EAAkC,MAAlC,YAAA0C,GAAuC,OAAvC,YAAAD,EAA6C,SAAU,GACpE/d,EAAO,KAAK,IAAI,EAAG,KAAK,MAAM8d,EAAc,OAAS/H,CAAU,CAAC,EAEtE,MAAO,CAAE,KAAAhW,EAAM,KAAAC,CAAA,CACjB,EAAG,CAAA,CAAE,EAECie,EAAoBN,EAAAA,YAAY,CAAC5d,EAAcC,IAAuB,CAC1E,MAAM4d,EAAOP,EAAY,QACpBO,IAGDA,EAAK,OAAS7d,GAAQ6d,EAAK,OAAS5d,GAGxC4d,EAAK,OAAO7d,EAAMC,CAAI,EACxB,EAAG,CAAA,CAAE,EAECke,EAAaP,EAAAA,YACjB,CAACQ,EAAyB7B,EAAQ,KAAU,CAe1C,GAZI,CAACE,GAAY,CAACC,GAAU,CAACC,GAGzBC,GAAsBwB,IAAS,QAI/B,CAAC7B,GAAS,KAAK,IAAA,EAAQY,EAAyB,SAKhD,CADSG,EAAY,QAEvB,MAAO,GAGT,MAAMe,EAAeV,EAAA,EACrB,GAAI,CAACU,EACH,MAAO,GAET,KAAM,CAAE,KAAAre,EAAM,KAAAC,CAAA,EAASoe,EAEjBC,EAAWpB,EAAiB,QAElC,MAAI,CAACX,GAAS+B,GAAYA,EAAS,OAASte,GAAQse,EAAS,OAASre,GACpEie,EAAkBle,EAAMC,CAAI,EACrB,KAGTie,EAAkBle,EAAMC,CAAI,EAExBme,IAAS,OACXV,EAAU,QAAQ1d,EAAMC,CAAI,EAE5Bwd,EAAY,QAAQzd,EAAMC,CAAI,EAGhCid,EAAiB,QAAU,CAAE,KAAAld,EAAM,KAAAC,CAAA,EACnCic,EAAiB,QAAU,CAAE,KAAAlc,EAAM,KAAAC,EAAM,GAAI,KAAK,KAAI,EAC/C,GACT,EAEA,CAACie,EAAmBvB,EAAiBF,EAAUG,EAAoBe,EAAqBjB,CAAM,CAAA,EAG1F6B,EAAiBX,EAAAA,YACrB,CACEQ,EAA0B,SAC1B3e,EAAoD,KACjD,CACH,KAAM,CAAE,UAAA+e,EAAY,GAAO,MAAAjC,EAAQ,IAAU9c,EAEzCwd,EAAY,UAAY,OAC1B,OAAO,aAAaA,EAAY,OAAO,EACvCA,EAAY,QAAU,MAGpBD,EAAU,UAAY,OACxB,qBAAqBA,EAAU,OAAO,EACtCA,EAAU,QAAU,MAGtB,MAAMyB,EAAM,IAAM,CAChBzB,EAAU,QAAU,sBAAsB,IAAM,CAC9CA,EAAU,QAAU,KACpBmB,EAAWC,EAAM7B,CAAK,CACxB,CAAC,CACH,EAEA,GAAIiC,EAAW,CACbC,EAAA,EACA,MACF,CAEAxB,EAAY,QAAU,OAAO,WAAW,IAAM,CAC5CA,EAAY,QAAU,KACtBwB,EAAA,CACF,EAAG,GAAG,CACR,EACA,CAACN,CAAU,CAAA,EAGPO,EAA8Bd,EAAAA,YAAY,IAAM,CACpD,UAAWe,KAAMvB,EAAuB,QACtC,OAAO,aAAauB,CAAE,EAExBvB,EAAuB,QAAU,CAAA,CACnC,EAAG,CAAA,CAAE,EAECwB,EAAsBhB,EAAAA,YAAY,IAAM,OAC5Cc,EAAA,EACAH,EAAe,OAAQ,CAAE,UAAW,GAAM,MAAO,GAAM,EAEvD,MAAMM,EAAU,OAAO,WAAW,IAAM,CACtCN,EAAe,OAAQ,CAAE,UAAW,GAAM,MAAO,GAAM,CACzD,EAAG,EAAE,EACLnB,EAAuB,QAAQ,KAAKyB,CAAO,EAEvC,OAAO,SAAa,KAAe,UAAW,YAAYxV,EAAA,SAAS,QAAT,MAAAA,EAAgB,QAC5E,SAAS,MAAM,MACZ,KAAK,IAAM,CACVkV,EAAe,OAAQ,CAAE,UAAW,GAAM,MAAO,GAAM,CACzD,CAAC,EACA,MAAM,IAAM,CAEb,CAAC,CAEP,EAAG,CAACG,EAA6BH,CAAc,CAAC,EAGhDhF,EAAAA,UAAU,IAAM,CACd,IAAIuF,EAAuB,KAC3B,MAAMC,EAAqB,IAAM,CAE3BD,IAAU,MACZ,qBAAqBA,CAAK,EAE5BA,EAAQ,sBAAsB,IAAM,CAClCA,EAAQ,KACRP,EAAe,QAAQ,CACzB,CAAC,CACH,EAEA,cAAO,iBAAiB,SAAUQ,CAAkB,EAC7C,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAkB,EACnDD,IAAU,MACZ,qBAAqBA,CAAK,CAE9B,CACF,EAAG,CAACP,CAAc,CAAC,EAEnBhF,EAAAA,UAAU,IAAM,CACd,MAAMyF,EAAwB,IAAM,OAClC,MAAMnB,EAAOP,EAAY,QACnBhB,EAAgBqB,EAAA,EACtB,GAAI,CAACE,GAAQ,CAACvB,EACZ,OAOF,GAAI,CAJeF,GAA4B,CAC7C,YAAa,CAAE,KAAM,KAAK,IAAI,EAAGyB,EAAK,IAAI,EAAG,KAAM,KAAK,IAAI,EAAGA,EAAK,IAAI,CAAA,EACxE,cAAAvB,CAAA,CACD,EACgB,EACfjT,EAAAwU,EAAK,UAAL,MAAAxU,EAAA,KAAAwU,GACA,MACF,CAEAU,EAAe,OAAQ,CAAE,MAAO,EAAA,CAAM,CACxC,EAEMU,EAAyB,IAAM,CACnC,GAAI,SAAS,kBAAoB,UAAW,CAC1CzB,EAA0B,QAAU,GACpC,MACF,CACKA,EAA0B,UAG/BA,EAA0B,QAAU,GACpCwB,EAAA,EACF,EAEME,EAAmB,IAAM,CAC7B1B,EAA0B,QAAU,EACtC,EAEM2B,EAAoB,IAAM,CACzB3B,EAA0B,UAG/BA,EAA0B,QAAU,GACpCwB,EAAA,EACF,EAEA,gBAAS,iBAAiB,mBAAoBC,CAAsB,EACpE,OAAO,iBAAiB,OAAQC,CAAgB,EAChD,OAAO,iBAAiB,QAASC,CAAiB,EAE3C,IAAM,CACX,SAAS,oBAAoB,mBAAoBF,CAAsB,EACvE,OAAO,oBAAoB,OAAQC,CAAgB,EACnD,OAAO,oBAAoB,QAASC,CAAiB,CACvD,CACF,EAAG,CAACxB,EAAqBY,CAAc,CAAC,EAGxChF,EAAAA,UAAU,IACD,IAAM,CACXmF,EAAA,EACIzB,EAAY,UAAY,MAC1B,OAAO,aAAaA,EAAY,OAAO,EAErCD,EAAU,UAAY,MACxB,qBAAqBA,EAAU,OAAO,CAE1C,EACC,CAAC0B,CAA2B,CAAC,EAEhC,MAAMU,GAAcxB,cAAalJ,GAA2B,CAC1D2I,EAAY,QAAU3I,CACxB,EAAG,CAAA,CAAE,EAEC2K,EAAczB,cAAa3Q,GAA4C,CAC3EqQ,EAAY,QAAUrQ,CACxB,EAAG,CAAA,CAAE,EAEL,MAAO,CACL,eAAAsR,EACA,oBAAAK,EACA,4BAAAF,EACA,YAAAU,GACA,YAAAC,EACA,iBAAAnC,EACA,iBAAAhB,EACA,yBAAAiB,CAAA,CAEJ,CCtSA,MAAMmC,GAAkB,CACtB,WAAYlH,GACZ,SAAU,GACV,WAAY,GACd,EAEMmH,GAA0B,2BAEhC,SAASC,GACP/C,EACAC,EACoC,CACpC,GAAI,CACF,MAAM+C,EAAM,eAAe,QAAQF,EAAuB,EAC1D,OAAKE,EACU,KAAK,MAAMA,CAAG,EACf,GAAGhD,CAAQ,IAAIC,CAAM,EAAE,GAAK,KAFzB,IAGnB,MAAQ,CACN,OAAO,IACT,CACF,CAEA,SAASgD,GACPjD,EACAC,EACA3H,EACM,CACN,GAAI,CACF,MAAM0K,EAAM,eAAe,QAAQF,EAAuB,EACpDI,EAASF,EAAO,KAAK,MAAMA,CAAG,EAAgE,CAAA,EAC9Fhe,EAAM,GAAGgb,CAAQ,IAAIC,CAAM,GAC7B3H,EACF4K,EAAOle,CAAG,EAAIsT,EAEd,OAAO4K,EAAOle,CAAG,EAEnB,eAAe,QAAQ8d,GAAyB,KAAK,UAAUI,CAAM,CAAC,CACxE,MAAQ,CAER,CACF,CAEA,SAASC,IAAqE,CAC5E,MAAO,CACL,SAAU,GACV,YAAa,GACb,YAAa,GACb,SAAU,GACV,UAAW,GACX,SAAU,GACV,eAAgB,GAChB,WAAY,GACZ,UAAW,GACX,cAAe,GACf,cAAe,EAAA,CAEnB,CAEA,SAASC,GACPne,EACAoe,EACoC,CACpC,GAAI,CAACA,EACH,OAAKpe,EACE,CACL,GAAGA,EACH,SAAU,GACV,YAAa,GACb,YAAa,GACb,SAAU,GACV,UAAW,GACX,eAAgB,GAChB,WAAY,GACZ,cAAe,GACf,cAAe,EAAA,EAXG,KAetB,MAAMqe,EAAWH,GAAA,EACjB,GAAI,CAACle,EACH,OAAOqe,EAGT,MAAMC,EAAkBte,EAAO,aAAeA,EAAO,aAAeA,EAAO,SAE3E,MAAO,CACL,GAAGA,EACH,SAAU,GACV,UAAW,GACX,SAAU,GACV,eAAgB,GAChB,WAAY,GACZ,UAAW,GACX,cAAe,GACf,cAAe,GACf,YAAase,EAAkBte,EAAO,YAAcqe,EAAS,WAAA,CAEjE,CAEA,SAASE,GAAoBhT,EAAwC,OACnE,MAAMiT,EAAI,WACVA,EAAE,eAAiBjT,EACnBiT,EAAE,kBAAoBjT,EACtBiT,EAAE,wBAA0B7N,GAC5B6N,EAAE,4BAA4B7W,EAAA4D,EAAS,kBAAT,YAAA5D,EAAA,KAAA4D,KAAgC,IAChE,CAEA,SAASkT,GAAsBlT,EAA+C,CAC5E,GAAI,CAACA,EACH,OAGF,MAAMiT,EAAI,WACNA,EAAE,oBAAsBjT,GAAYiT,EAAE,iBAAmBjT,IAI7DiT,EAAE,eAAiB,KACnBA,EAAE,kBAAoB,KACtBA,EAAE,wBAA0B,KAC5BA,EAAE,0BAA4B,KAC9BA,EAAE,+BAAiC,KACrC,CAEO,MAAME,GAAWC,EAAAA,WACtB,CACE,CAAE,SAAA5D,EAAU,OAAAC,EAAQ,MAAA9c,EAAO,UAAA0gB,EAAW,gBAAA3D,EAAiB,mBAAAC,EAAoB,SAAAC,EAAU,OAAAC,CAAA,EACrFyD,IACG,CACH,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAwC,IAAI,EACtEC,EAAYC,EAAc3Y,GAAUA,EAAM,SAAS,EAEnD4Y,EAAgBC,EAAAA,QAAQ,IAAM,CAClC,OAAQlhB,EAAA,CACN,IAAK,QACH,OAAOsY,GACT,QACE,OAAOC,EAAA,CAEb,EAAG,CAACvY,CAAK,CAAC,EAEJuZ,EAAeG,EAAAA,OAAuB,IAAI,EAC1CyH,EAAWzH,EAAAA,OAAuB,IAAI,EACtC+D,EAAc/D,EAAAA,OAAwB,IAAI,EAC1C0H,EAAqB1H,EAAAA,OAAOmD,CAAQ,EACpCwE,EAAmB3H,EAAAA,OAAOoD,CAAM,EAChCwE,EAAsB5H,EAAAA,OAAOmD,CAAQ,EACrC0E,EAAoB7H,EAAAA,OAAOoD,CAAM,EACjC0E,EAAc9H,EAAAA,OAAOqD,GAAmB,CAACC,CAAkB,EAC3DyE,EAAsB/H,EAAAA,OAAOgH,CAAS,EACtCgB,EAA0BhI,EAAAA,OAAOuH,CAAa,EAC9CU,EAAwBjI,EAAAA,OAAO,EAAK,EACpCkI,EAA6BlI,EAAAA,OAAO,EAAK,EACzCmI,GAA0BnI,EAAAA,OAAsC,IAAI,EACpEoI,EAA2BpI,EAAAA,OAAO,EAAK,EAEvCqI,EAAuB/D,EAAAA,YAC3B,CAAC3Q,EAAyC2U,EAAwBC,IAAyB,CACrF,EAAC5U,GAAA,MAAAA,EAAU,qBAAsB,CAAC2U,GAAkB,CAACC,GAGzDnC,GAAuBkC,EAAgBC,EAAc5U,EAAS,mBAAA,CAAoB,CACpF,EACA,CAAA,CAAC,EAGG6U,EAAsBlE,EAAAA,YAAY,IAAM4C,EAAU,CAACA,CAAQ,CAAC,EAClEtH,GAAeC,EAAc2I,CAAmB,EAEhDvI,EAAAA,UAAU,IAAM,CACdyH,EAAmB,QAAUvE,EAC7BwE,EAAiB,QAAUvE,EAC3B8E,EAA2B,QAAU,EACvC,EAAG,CAAC/E,EAAUC,CAAM,CAAC,EAErBnD,EAAAA,UAAU,IAAM,CACd6H,EAAY,QAAUzE,GAAmB,CAACC,CAC5C,EAAG,CAACD,EAAiBC,CAAkB,CAAC,EAExCrD,EAAAA,UAAU,IAAM,CACd8H,EAAoB,QAAUf,CAChC,EAAG,CAACA,CAAS,CAAC,EAEd/G,EAAAA,UAAU,IAAM,CACd+H,EAAwB,QAAUT,CACpC,EAAG,CAACA,CAAa,CAAC,EAElB,MAAMkB,EAAoBnE,EAAAA,YACvB9Q,GAAiB,CAIhB,GAHI,CAACA,GAAQwT,IAAc,UAGvB,CAACc,EAAY,QACf,OAGF,MAAMY,EAAiBhB,EAAmB,QACpCiB,EAAehB,EAAiB,QAClC,CAACe,GAAkB,CAACC,GAIxBtB,EAAUqB,EAAgBC,EAAcnV,EAAM,EAAK,CACrD,EACA,CAACwT,EAAWK,CAAS,CAAA,EAGjB,CAAE,iBAAAzE,EAAkB,eAAAqC,EAAgB,oBAAAK,EAAqB,YAAAQ,EAAa,YAAAC,CAAA,EAC1E7C,GAAkB,CAChB,SAAAC,EACA,OAAAC,EACA,gBAAAC,EACA,mBAAAC,EACA,SAAAC,EACA,OAAAC,EACA,iBAAkB,IAAM,CACtB,MAAMzC,EAAKlB,EAAa,QACxB,GAAI,CAACkB,EAAI,OAAO,KAChB,MAAM3Z,EAAO2Z,EAAG,sBAAA,EAChB,MAAO,CAAE,MAAO3Z,EAAK,MAAO,OAAQA,EAAK,MAAA,CAC3C,CAAA,CACD,EAEH6Y,EAAAA,UAAU,IAAM,CACd,IAAI2I,EAAY,GACZC,EAA+E,KAEnF,OAAKlK,GAAyB,CAC5B,GAAGqH,GACH,MAAOgC,EAAwB,QAC/B,aAAcD,EAAoB,UAAY,QAAA,CAC/C,EAAE,KAAMpU,GAAa,CACpB,GAAIiV,EAAW,CACbjV,EAAS,QAAA,EACT,MACF,CAEAkV,EAAkBlV,EACd8T,EAAS,SACX9T,EAAS,KAAK8T,EAAS,OAAO,EAEhCd,GAAoBhT,CAAQ,EAC5BwT,EAAYxT,CAAQ,CACtB,CAAC,EAEM,IAAM,CACXiV,EAAY,GACZzB,EAAY,IAAI,EAChBN,GAAsBgC,CAAe,EACrCA,GAAA,MAAAA,EAAiB,SACnB,CACF,EAAG,CAAA,CAAE,EAEL5I,EAAAA,UAAU,IAAM,CACV,CAACiH,GAAY,EAAE,aAAcA,IAIhCA,EAAiB,SAASK,CAAa,CAC1C,EAAG,CAACL,EAAUK,CAAa,CAAC,EAE5BtH,EAAAA,UAAU,IAAM,CACV,CAACiH,GAAY,EAAE,oBAAqBA,IAIvCA,EAAiB,gBAAgBF,IAAc,QAAQ,CAC1D,EAAG,CAACE,EAAUF,CAAS,CAAC,EAExB,MAAM8B,GAA6BtB,EAAAA,QAAQ,IACpCN,EAIE,CACL,gBAAkBoB,GAAmB,CAC/BZ,EAAmB,UAAYY,IACnCD,EAAqBnB,EAAUU,EAAoB,QAASC,EAAkB,OAAO,EACrFO,EAAyB,QAAU,GACnClB,EAAS,MAAA,EACTe,EAAsB,QAAU,GAChC3C,EAAA,EACF,EACA,eAAgB,CAACgD,EAAgB9U,EAAMgT,IAAoB,OACzD,GAAIkB,EAAmB,UAAYY,EAAgB,OACnD,MAAMS,EAAiBxC,GACrBL,GAAsBwB,EAAmB,QAASC,EAAiB,OAAO,EAC1EnB,CAAA,EAEEuC,KACFhZ,EAAAmX,EAAS,sBAAT,MAAAnX,EAAA,KAAAmX,EAA+B6B,IAEjC,MAAM5M,EAAUqK,EACZtH,GAA2B1L,CAAI,EAC/BuL,GAA4BvL,CAAI,EACpC0U,EAA2B,QAAU,GACrChB,EAAS,MAAM/K,CAAO,EACtBiM,EAAyB,QAAU,GACnCR,EAAoB,QAAUF,EAAmB,QACjDG,EAAkB,QAAUF,EAAiB,QAC7CU,EAAqBnB,EAAUQ,EAAmB,QAASC,EAAiB,OAAO,CACrF,EACA,cAAe,CAACW,EAAgBU,IAAW,CACzC,GAAItB,EAAmB,UAAYY,EACnC,WAAWW,KAASD,EAAQ,CAC1B,MAAMhX,EAAamN,GAA+B8J,EAAOhB,EAAsB,OAAO,EACtFA,EAAsB,QAAUjW,EAAW,YAC3CkV,EAAS,MAAMlV,EAAW,UAAU,CACtC,CACIkW,EAA2B,UACzBhB,EAAS,OAAO,OAAO,OAAS,GAClCA,EAAS,YAAA,EAEXgB,EAA2B,QAAU,IAEvCN,EAAoB,QAAUF,EAAmB,QACjDG,EAAkB,QAAUF,EAAiB,QAC7CU,EAAqBnB,EAAUQ,EAAmB,QAASC,EAAiB,OAAO,EACrF,EACA,SAAU,CAACW,EAAgBC,EAAc/U,IAAS,CAEhD,GADIkU,EAAmB,UAAYY,GAC/BX,EAAiB,UAAYY,EAAc,OAC/C,MAAMvW,EAAamN,GAA+B3L,EAAMyU,EAAsB,OAAO,EACrFA,EAAsB,QAAUjW,EAAW,YAC3CkV,EAAS,MAAMlV,EAAW,UAAU,EAChCkW,EAA2B,UACzBhB,EAAS,OAAO,OAAO,OAAS,GAClCA,EAAS,YAAA,EAEXgB,EAA2B,QAAU,IAEvCN,EAAoB,QAAUF,EAAmB,QACjDG,EAAkB,QAAUF,EAAiB,QAC7CU,EAAqBnB,EAAUQ,EAAmB,QAASC,EAAiB,OAAO,CACrF,CAAA,EA/DO,CAAA,EAiER,CAACT,EAAUmB,EAAsB/C,CAAmB,CAAC,EAExDrF,OAAAA,EAAAA,UAAU,IAAM,CACTiH,EAEMiB,GAAwB,UAAYjB,IAC7Ce,EAAsB,QAAU,GAChCL,EAAoB,QAAUF,EAAmB,QACjDG,EAAkB,QAAUF,EAAiB,QAC7CQ,GAAwB,QAAUjB,GALlCiB,GAAwB,QAAU,IAOtC,EAAG,CAACjB,CAAQ,CAAC,EAEbjH,EAAAA,UAAU,IAAM,CACd,GAAI,GAACiH,GAAY,CAAC/D,GAAY,CAACC,GAI/B,MAAO,IAAM,CACX,GAAIgF,EAAyB,QAAS,CACpCA,EAAyB,QAAU,GACnC,MACF,CACAC,EAAqBnB,EAAUU,EAAoB,QAASC,EAAkB,OAAO,CACvF,CACF,EAAG,CAAC1E,EAAU+D,EAAU9D,EAAQiF,CAAoB,CAAC,EAErDpI,EAAAA,UAAU,IAAM,CACdiJ,GAAsBJ,EAAS,CACjC,EAAG,CAACA,EAAS,CAAC,EAEd7I,EAAAA,UAAU,IACD,IAAM,CACXiJ,GAAsB,CAAA,CAAE,CAC1B,EACC,CAAA,CAAE,EAELjJ,EAAAA,UAAU,IAAM,CACd,GAAI,CAACiH,EAAU,CACbnD,EAAY,QAAU,KACtB+B,EAAY,IAAI,EAChBC,EAAY,IAAI,EAChB,MACF,CAEA,MAAMvB,EAAW,IAAIlK,GACrB,OAAA4M,EAAS,UAAU1C,CAAQ,EAC3BT,EAAY,QAAUS,EACtBsB,EAAYtB,CAAQ,EACpBuB,EAAYmB,CAAQ,EAEpB5B,EAAA,EAEO,IAAM,CACX,GAAI,CACFd,EAAS,QAAA,CACX,QAAA,CACET,EAAY,QAAU,KACtB+B,EAAY,IAAI,EAChBC,EAAY,IAAI,CAClB,CACF,CACF,EAAG,CAACmB,EAAU5B,EAAqBQ,EAAaC,CAAW,CAAC,EAE5D9F,EAAAA,UAAU,IAAM,CACd,MAAMc,EAAKlB,EAAa,QACxB,GAAI,CAACkB,EAAI,OACT,IAAIyE,EAAuB,KAC3B,MAAM2D,EAAK,IAAI,eAAe,IAAM,CAC9B3D,IAAU,MACZ,qBAAqBA,CAAK,EAE5BA,EAAQ,sBAAsB,IAAM,CAClCA,EAAQ,KACRP,EAAe,QAAQ,CACzB,CAAC,CACH,CAAC,EACD,OAAAkE,EAAG,QAAQpI,CAAE,EACN,IAAM,CACXoI,EAAG,WAAA,EACC3D,IAAU,MACZ,qBAAqBA,CAAK,CAE9B,CACF,EAAG,CAACP,CAAc,CAAC,EAEnBhF,EAAAA,UAAU,IAAM,CACd,GAAI,CAACiH,GAAY,CAAC/D,GAAY,CAACC,EAAQ,OAEvC,MAAMgG,EAAalC,EAAS,OAAQ1T,GAAS,CACvC,CAAC6P,GAAmBC,GACxBmF,EAAkBjV,CAAI,CACxB,CAAC,EAED,OAAA0T,EAAS,4BAA6BmC,GAChC,CAAChG,GAAmBC,GACpB+F,EAAS,OAAS,WAClBrC,IAAc,SAAiB,GAE/BqC,EAAS,UAAYA,EAAS,MAAQ,SACxCA,EAAS,eAAA,EACTZ,EAAkB,YAAY,EACvB,IAGF,EACR,EAEM,IAAM,CACXW,EAAW,QAAA,EACXlC,EAAS,4BAA4B,IAAM,EAAI,CACjD,CACF,EAAG,CACDA,EACA7D,EACAC,EACA0D,EACAyB,EACAtF,EACAC,CAAA,CACD,EAEDkG,EAAAA,oBACErC,EACA,KAAO,CACL,MAAQzT,GAAS0T,GAAA,YAAAA,EAAU,MAAM1T,GACjC,MAAO,IAAM,CACX0T,GAAA,MAAAA,EAAU,QACVe,EAAsB,QAAU,EAClC,EACA,eAAgB,IAAMf,GAAA,YAAAA,EAAU,iBAChC,OAAQ,CAACxgB,EAAMC,IAASugB,GAAA,YAAAA,EAAU,OAAOxgB,EAAMC,GAC/C,YAAa,IAAMugB,GAAY,KAC/B,QAAS,IACFA,EACE,CAAE,KAAM,KAAK,IAAI,EAAGA,EAAS,IAAI,EAAG,KAAM,KAAK,IAAI,EAAGA,EAAS,IAAI,CAAA,EADpD,KAGxB,oBAAqB,IAAM5B,EAAA,EAC3B,eAAgB,CAACR,EAAM3e,IAAY8e,EAAeH,EAAM3e,CAAO,EAC/D,2BAA4B,IAAM,oDAChC,MAAM0U,EAAYgF,EAAa,QACzB0E,EAAO2C,EACP1C,EAAWT,EAAY,QAC7B,GAAI,CAAClJ,GAAa,CAAC0J,EAAM,OAAO,KAEhC,MAAMnd,EAAOyT,EAAU,sBAAA,EACvB,GAAIzT,EAAK,QAAU,GAAKA,EAAK,SAAW,EAAG,OAAO,KAElD,MAAMsa,EAAO6C,EAAK,MAClB,IAAI7d,EACJ,GAAI8d,EACF,GAAI,CACF,MAAM+E,GAAO/E,EAAS,kBAAA,EACtB,GAAI+E,GACF7iB,EAAO,KAAK,IAAI,EAAG6iB,GAAK,IAAI,MACvB,CACL,MAAM3hB,KAAYsW,IAAAD,IAAApL,IAAA9C,GAAA2R,GAAA,YAAAA,EAAM,iBAAN,YAAA3R,GAAsB,aAAtB,YAAA8C,GAAkC,MAAlC,YAAAoL,GAAuC,OAAvC,YAAAC,GAA6C,QAAS,EACxExX,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMU,EAAK,MAAQQ,EAAS,CAAC,CACvD,CACF,MAAQ,CACN,MAAMA,KAAYqa,IAAAC,IAAAJ,IAAAC,GAAAL,GAAA,YAAAA,EAAM,iBAAN,YAAAK,GAAsB,aAAtB,YAAAD,GAAkC,MAAlC,YAAAI,GAAuC,OAAvC,YAAAD,GAA6C,QAAS,EACxEvb,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMU,EAAK,MAAQQ,EAAS,CAAC,CACvD,KACK,CACL,MAAMA,KAAY4hB,IAAAC,GAAA/E,IAAAC,GAAAjD,GAAA,YAAAA,EAAM,iBAAN,YAAAiD,GAAsB,aAAtB,YAAAD,GAAkC,MAAlC,YAAA+E,EAAuC,OAAvC,YAAAD,GAA6C,QAAS,EACxE9iB,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMU,EAAK,MAAQQ,EAAS,CAAC,CACvD,CAEA,MAAM8U,KAAagN,IAAAC,IAAAC,IAAAC,GAAAnI,GAAA,YAAAA,EAAM,iBAAN,YAAAmI,GAAsB,aAAtB,YAAAD,GAAkC,MAAlC,YAAAD,GAAuC,OAAvC,YAAAD,GAA6C,SAAU,GACpE/iB,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMS,EAAK,OAASsV,EAAU,CAAC,EAE7D,MAAO,CAAE,KAAAhW,EAAM,KAAAC,CAAA,CACjB,EACA,oBAAqB,IAAMic,EAAiB,OAAA,GAE9C,CAACsE,EAAUtE,EAAkB0C,EAAqBL,CAAc,CAAA,EAIhE6E,EAAAA,IAAC,MAAA,CACC,IAAKjK,EACL,UAAU,yBACV,MAAO,CAAE,gBAAiB0H,EAAc,UAAA,EACxC,uBAAsBxO,GAEtB,SAAA+Q,EAAAA,IAAC,MAAA,CAAI,IAAKrC,EAAU,UAAU,kBAAA,CAAmB,CAAA,CAAA,CAGvD,CACF,EAEAX,GAAS,YAAc,WCliBhB,MAAMiD,GAA+B,KAC/BC,GAAgC,IAE7C,SAASC,GACP7M,EACA8M,EACS,CACT,MAAI,CAAC9M,GAAQ,CAAC8M,EACL,GAEF9M,EAAK,WAAa8M,EAAM,UAAY9M,EAAK,SAAW8M,EAAM,MACnE,CAEA,SAASC,GACPC,EACA1H,EAC2B,CAC3B,MAAM2H,EAAiBD,EAAqB,OACzCE,GAAY5H,EAAM4H,EAAQ,GAAKP,EAAA,EAElC,OAAIM,EAAe,SAAW,EACrB,KAEFA,EAAe,OAAO,CAACE,EAAQD,IAAaA,EAAQ,GAAKC,EAAO,GAAKD,EAAUC,CAAO,CAC/F,CAEO,SAASC,GACdC,EACA/H,EAAM,KAAK,MACgB,CAI3B,MAHI,CAAC+H,GAGD/H,EAAM+H,EAAqB,GAAKT,GAC3B,KAEFS,CACT,CAEO,SAASC,GAA4BC,EAOhC,CACV,MAAMjI,EAAMiI,EAAO,KAAO,KAAK,IAAA,EACzBC,EAA4BT,GAA6BQ,EAAO,qBAAsBjI,CAAG,EAa/F,GAVEkI,GACA,CAACX,GAAqBW,EAA2BD,EAAO,mBAAmB,GAKzEV,GAAqBU,EAAO,aAAcA,EAAO,mBAAmB,GAIpEV,GAAqBU,EAAO,kBAAmBA,EAAO,mBAAmB,EAC3E,MAAO,GAGT,MAAMF,EAAuBD,GAA4BG,EAAO,qBAAsBjI,CAAG,EACzF,MACE,GAAA+H,GACA,CAACR,GAAqBQ,EAAsBE,EAAO,mBAAmB,EAM1E,CAEO,SAASE,GAAyBF,EAK7B,CACV,MAAMjI,EAAMiI,EAAO,KAAO,KAAK,IAAA,EACzBC,EAA4BT,GAA6BQ,EAAO,qBAAsBjI,CAAG,EAEzF+H,EAAuBD,GAA4BG,EAAO,qBAAsBjI,CAAG,EAKzF,MAJI,GAAA+H,GAAwB,CAACR,GAAqBQ,EAAsBE,EAAO,cAAc,GAK3FC,GACA,CAACX,GAAqBW,EAA2BD,EAAO,cAAc,EAM1E,CAEO,SAASG,GAAiCH,EAKrC,CACV,MAAMjI,EAAMiI,EAAO,KAAO,KAAK,IAAA,EACzBF,EAAuBD,GAA4BG,EAAO,qBAAsBjI,CAAG,EAMzF,MAJI,EAAA+H,GAAwBR,GAAqBQ,EAAsBE,EAAO,WAAW,GAIrFA,EAAO,gBAAkBV,GAAqBU,EAAO,eAAgBA,EAAO,WAAW,EAK7F,CC7HO,SAASI,IAA8B,CAC5C,MAAMC,EAAWC,GAAa,SAAA,EAAW,SACzC,OAAOD,GAAA,YAAAA,EAAU,WAAY,MAC/B,CCKA,SAASE,GAAWliB,EAA0C,CAC5D,MAAMmiB,EAAUniB,GAAA,YAAAA,EAAO,OACvB,OAAOmiB,GAAWA,EAAQ,OAAS,EAAIA,EAAU,GACnD,CAEO,SAASC,GAAmB,CACjC,QAAAC,EACA,UAAAC,EACA,UAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAA+B,CAC7B,MAAMC,EAAgBJ,GAAa,IAC7BK,EAAcN,GAAW,IACzBO,EAAgBV,GAAWK,GAAaC,CAAU,EAClDK,EAAiBX,GAAWO,CAAU,EAC5C,MAAO,GAAGC,CAAa,IAAIC,CAAW,KAAKC,CAAa,IAAIC,CAAc,EAC5E,CAEO,SAASC,GAAkBC,EAA+B,CAC/D,MAAMC,EAAWjB,GAAA,EACjB,OAAKgB,GAAA,MAAAA,EAAO,OAGL,IAAIC,CAAQ,IAAID,CAAK,GAFnBC,CAGX,CCcA,SAASC,IAA8B,CACrC,GAAI,OAAO,UAAc,IACvB,MAAO,GAGT,MAAMC,EAAY,UAAU,UACtBC,EAAc,mBAAmB,KAAKD,CAAS,EAC/CE,EAAa,UAAU,WAAa,YAAc,UAAU,eAAiB,EACnF,OAAOD,GAAeC,CACxB,CAEA,MAAMC,GAAqC,CACzC,CAAE,IAAK,QAAS,MAAO,QAAS,QAAS,IAAA,EACzC,CAAE,IAAK,SAAU,MAAO,SAAU,QAAS,GAAA,EAC3C,CAAE,IAAK,SAAU,MAAO,SAAU,QAAS,GAAA,EAC3C,CAAE,IAAK,KAAM,MAAO,IAAK,QAAS,QAAA,EAClC,CAAE,IAAK,OAAQ,MAAO,IAAK,QAAS,QAAA,EACpC,CAAE,IAAK,OAAQ,MAAO,IAAK,QAAS,QAAA,EACpC,CAAE,IAAK,QAAS,MAAO,IAAK,QAAS,QAAA,EACrC,CAAE,IAAK,cAAe,MAAO,cAAe,QAAS,YAAA,EACrD,CAAE,IAAK,MAAO,MAAO,MAAO,QAAS,GAAA,EACrC,CAAE,IAAK,YAAa,MAAO,YAAa,QAAS,IAAA,EACjD,CAAE,IAAK,MAAO,MAAO,MAAO,QAAS,MAAA,EACrC,CAAE,IAAK,SAAU,MAAO,SAAU,QAAS,GAAA,EAC3C,CAAE,IAAK,IAAK,MAAO,IAAK,QAAS,GAAA,EACjC,CAAE,IAAK,IAAK,MAAO,IAAK,QAAS,GAAA,EACjC,CAAE,IAAK,IAAK,MAAO,IAAK,QAAS,GAAA,EACjC,CAAE,IAAK,IAAK,MAAO,IAAK,QAAS,GAAA,EACjC,CAAE,IAAK,IAAK,MAAO,IAAK,QAAS,GAAA,CACnC,EAWMC,GAAeC,EAAAA,KAAK,SAAsB,CAC9C,OAAAC,EACA,cAAAC,EACA,SAAA5Q,EACA,SAAA6Q,EACA,UAAA1F,CACF,EAAsB,CACpB,OACE8C,EAAAA,IAAC,MAAA,CACC,UAAU,oDACV,cAAY,2BAEZ,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,4EACV,cAAY,uBAEX,SAAAuC,GAAiB,IAAKM,GACrB7C,EAAAA,IAAC8C,GAAA,CAEC,QAAQ,YACR,KAAK,KACL,UAAU,0LACV,MAAOD,EAAS,MAChB,aAAYA,EAAS,MACrB,cAAa,mBAAmBA,EAAS,GAAG,GAC5C,cAAgBE,GAAMA,EAAE,eAAA,EACxB,QAAS,IAAM,CACbL,EAAOG,EAAS,OAAO,EACnBD,GAAY1F,IAAc,WAC5ByF,GAAA,MAAAA,IAEJ,EACA,SAAA5Q,EAEC,SAAA8Q,EAAS,KAAA,EAhBLA,EAAS,GAAA,CAkBjB,CAAA,CAAA,CACH,CAAA,CAGN,CAAC,EAED,SAAwBG,IAAa,QACnC,KAAM,CAAE,EAAAC,CAAA,EAAMC,GAAA,EACR,CAAE,SAAA7J,EAAU,SAAA8J,EAAU,OAAA7J,CAAA,EAAW8J,GAAA,EACjCC,EAAWC,GAAA,EACXC,EAAuBrN,EAAAA,OAAuB,IAAI,EAClDsN,EAAqBtN,EAAAA,OAA8B,IAAI,EACvDuN,EAAoBvN,EAAAA,OAAmC,IAAI,EAC3DgE,EAAchE,EAAAA,OAAoB,IAAI,EACtCwN,EAAexN,EAAAA,OAAO,EAAK,EAC3ByN,EAA6BzN,EAAAA,OAAO,EAAK,EAEzC0N,EAA4B1N,EAAAA,OAAkC,IAAI,EAElE2N,EAAarG,EAAc3Y,GAAUA,EAAM,UAAU,EAErD8M,EAAW6L,EAAc3Y,GAAWwU,EAAWxU,EAAM,UAAUwU,CAAQ,EAAI,MAAU,EACrFyK,EAActG,EAAc3Y,GAAA,OAChC,OAAAwU,GAAWpT,EAAApB,EAAM,eAAN,YAAAoB,EAAqBoT,GAAY,OAAA,EAExCE,EAAkBiE,EAAc3Y,GAAA,OACpC,OAAAwU,IAAYpT,EAAApB,EAAM,kBAAN,YAAAoB,EAAwBoT,KAAa,GAAS,GAAA,EAEtD6I,EAAWf,GAActc,UAAU,QAAAoB,EAAApB,EAAM,WAAN,YAAAoB,EAAgB,WAAY,OAAM,EAErE8d,EAAiBrG,EAAAA,QAAQ,IAAMsG,GAAyB1K,CAAM,EAAG,CAACA,CAAM,CAAC,EACzE2K,EAAWvG,EAAAA,QACf,IAAOrE,GAAY0K,EAAiB,GAAG1K,CAAQ,IAAI0K,CAAc,GAAK,KACtE,CAAC1K,EAAU0K,CAAc,CAAA,EAGrB,CAACnB,EAAUsB,CAAW,EAAI5G,EAAAA,SAAS,EAAK,EACxC,CAAC6G,EAAYC,CAAa,EAAI9G,EAAAA,SAAS,EAAE,EACzC,CAAC+G,EAAiBC,CAAkB,EAAIhH,EAAAA,SAAS,EAAK,EACtDiH,GAAiBrO,EAAAA,OAAO,EAAK,EAE7BsO,EAAY,CAACjL,GAAmB,CAACwK,EACjC,CAACU,EAAqBC,CAAsB,EAAIpH,EAAAA,SAAS,CAAC,EAC1D,CAACqH,EAAkBC,CAAmB,EAAItH,EAAAA,SAAS,CAAC,EACpD,CAACuH,EAAWC,CAAY,EAAIxH,EAAAA,SAAS,EAAK,EAC1CJ,EAAY6H,GAAYlgB,GAAUA,EAAM,SAAS,EACjDmgB,EAAUD,GAAYlgB,GAAUA,EAAM,KAAK,EAC3CogB,GAAsBF,GAAYlgB,GAAUA,EAAM,mBAAmB,EACrEqgB,EAAyBH,GAAYlgB,GAAUA,EAAM,sBAAsB,EAC3EsgB,EAAmBJ,GAAYlgB,GAAUA,EAAM,gBAAgB,EAC/DugB,EAAiBL,GAAYlgB,GAAUA,EAAM,cAAc,EAC3DwgB,EAAoBN,GAAYlgB,GAAUA,EAAM,iBAAiB,EACjEygB,EAAkBP,GAAYlgB,GAClCof,EAAYpf,EAAM,aAAaof,CAAQ,GAAK,GAAM,EAAA,EAE9CsB,EAAe7H,EAAAA,QAAQ,IAAMyE,GAAA,EAAsB,CAAA,CAAE,EACrDqD,GAAmB5C,GAAY1F,IAAc,UAAYqI,GAAgBlB,EAEzEoB,GAAUxf,GAAA0L,GAAA,YAAAA,EAAU,UAAV,YAAA1L,GAAmB,QAC7BwX,GAAgBuH,IAAY,QAAUlQ,GAAoBC,GAE1D,CAAE,KAAM2Q,EAAA,EAAgBC,GAAS,CACrC,SAAU,CAAC,SAAS,EACpB,QAAS,SAAY,CACnB,MAAMC,EAAM,MAAM,MAAM,cAAc,EACtC,GAAI,CAACA,EAAI,GACP,MAAM,IAAI,MAAM,yBAAyB,EAE3C,OAAOA,EAAI,KAAA,CACb,EACA,aAAc,EAAA,CACf,EAEKC,GAAgBnI,EAAAA,QAAQ,IAAM,CAClC,GAAKrE,EAGL,OAAOqM,IAAA,YAAAA,GAAa,QAAQ,KAAMI,GAAWA,EAAO,KAAOzM,EAC7D,EAAG,CAACA,EAAUqM,IAAA,YAAAA,GAAa,OAAO,CAAC,EAE7BK,GAAiBrI,EAAAA,QAAQ,IAAM,CACnC,GAAI,GAACyF,GAAY,CAACsC,GAClB,OAAOA,EAAQ,KAAMO,GAAQA,EAAI,KAAO7C,CAAQ,CAClD,EAAG,CAACA,EAAUsC,CAAO,CAAC,EAEhBQ,GAAevI,EAAAA,QAAQ,IAAM,CACjC,GAAI,GAACqG,GAAkB,CAACgC,IACxB,OAAOA,GAAe,MAAM,KAAMG,GAASA,EAAK,KAAOnC,CAAc,CACvE,EAAG,CAACA,EAAgBgC,EAAc,CAAC,EAE7BI,GAAoB,EAAQV,EAe5BjM,GAAqB,GAdH2M,IAAqB,EAAQhD,GAAa,CAAC4C,IAEjEI,IACA,EAAQhD,GACR,EAAQY,GACR,EAAQgC,IACR,CAACE,GAGChD,EAAE,sBAAsB,EAGtB,MAGAmD,EAAsB,GAAQ7M,GAAmBwK,GAAkB,CAACvK,IAEpE6M,GAAsB3I,EAAAA,QAAQ,IAAM,CACxC,GAAI,CAACqI,IAAkB,CAACE,GACtB,OAAO,KAET,MAAMtE,GAAakE,IAAA,YAAAA,GAAe,OAAQxM,EAC1C,OAAOiI,GAAmB,CACxB,QAAS2E,GAAa,MACtB,UAAWF,GAAe,MAC1B,UAAWE,GAAa,MACxB,WAAYF,GAAe,KAC3B,WAAApE,CAAA,CACD,CACH,EAAG,CAACkE,IAAA,YAAAA,GAAe,KAAMxM,EAAU4M,GAAcF,EAAc,CAAC,EAE1DO,GAA0B5I,EAAAA,QAAQ,IAAM,CAC5C,GAAI,CAAC+H,GAAWA,EAAQ,SAAW,EACjC,OAAO,KAET,MAAMc,EAAed,EAAQ,KAAMO,GAAQA,EAAI,MAAM,EAC/CQ,EAAaD,GAAA,YAAAA,EAAc,MAAM,KAAML,GAASA,EAAK,QAC3D,MAAI,CAACK,GAAgB,CAACC,EACb,KAEF,CAAE,SAAUD,EAAa,GAAI,OAAQC,EAAW,EAAA,CACzD,EAAG,CAACf,CAAO,CAAC,EAGNgB,GAAejM,EAAAA,YACnB,CAAC5d,EAAcC,IAAiB,CAC1B,CAACwc,GAAY,CAAC0K,GAClBvG,EAAa,WAAW,WAAWnE,EAAU0K,EAAgBnnB,EAAMC,CAAI,CACzE,EACA,CAACwc,EAAU0K,CAAc,CAAA,EAIrB2C,GAAalM,EAAAA,YACjB,CAAC5d,EAAcC,IAAiB,CAC1B,CAACwc,GAAY,CAAC0K,GAClBvG,EAAa,WAAW,aAAanE,EAAU0K,EAAgBnnB,EAAMC,CAAI,CAC3E,EACA,CAACwc,EAAU0K,CAAc,CAAA,EAGrB4C,GAAgBnM,EAAAA,YACpB,CAACoM,EAAyBnI,IAA0B,CAClD,MAAM5U,EAAWqQ,EAAY,QACvBnO,GACJlC,GAAA,YAAAA,EAAU,gCAAgCA,GAAA,YAAAA,EAAU,YAAa,OACnE,GAAIkC,EACF,OAAOA,EAGT,GAAI,CAAC6a,GAAkB,CAACnI,GAAgB,CAACgH,EACvC,OAGF,MAAMoB,EAAepB,EAAQ,KAAMqB,IAAWA,GAAO,KAAOF,CAAc,EACpEG,EAAaF,GAAA,YAAAA,EAAc,MAAM,KAAMX,IAASA,GAAK,KAAOzH,GAClE,GAAI,GAACsI,GAAcA,EAAW,OAAS,GAAKA,EAAW,QAAU,GAIjE,MAAO,CACL,KAAMA,EAAW,MACjB,KAAMA,EAAW,MAAA,CAErB,EACA,CAACtB,CAAO,CAAA,EAIVtP,EAAAA,UAAU,IAAM,CACd,MAAM6Q,EAAc,IAAM,CACxB9C,EAAY,OAAO,WAAa,KAAO,iBAAkB,MAAM,CACjE,EAEA,OAAA8C,EAAA,EACA,OAAO,iBAAiB,SAAUA,CAAW,EACtC,IAAM,OAAO,oBAAoB,SAAUA,CAAW,CAC/D,EAAG,CAAA,CAAE,EAGL7Q,EAAAA,UAAU,IAAM,CACd,GAAI,CAACyM,GAAY,CAAC2C,GAAgB5B,EAA2B,QAC3D,OAGFA,EAA2B,QAAU,GACrC,MAAMsD,EAAqB,IAAM,CAC/B,OAAO,SAAS,EAAG,CAAC,CACtB,EAEMvL,EAAQ,OAAO,sBAAsBuL,CAAkB,EACvDC,EAAS,OAAO,WAAWD,EAAoB,GAAG,EAClDE,EAAS,OAAO,WAAWF,EAAoB,GAAG,EAExD,MAAO,IAAM,CACX,OAAO,qBAAqBvL,CAAK,EACjC,OAAO,aAAawL,CAAM,EAC1B,OAAO,aAAaC,CAAM,CAC5B,CACF,EAAG,CAAC5B,EAAc3C,CAAQ,CAAC,EAG3BzM,EAAAA,UAAU,IAAM,CACV+G,IAAc,UAChBoH,EAAmB,EAAK,CAE5B,EAAG,CAACpH,CAAS,CAAC,EAGd/G,EAAAA,UAAU,IAAM,SACd,GAAI,EAAEyM,GAAY2C,GAAgBrI,IAAc,UAAYmH,GAAkB,CAC5EK,EAAuB,CAAC,EACxB,MACF,CAEA,IAAI0C,EAAyB,KAC7B,MAAMC,EAAsB,IAAM,CAChC,MAAMvb,EAAW,OAAO,eAClBwb,IAAiBxb,GAAA,YAAAA,EAAU,SAAU,OAAO,YAC5Cyb,IAAYzb,GAAA,YAAAA,EAAU,YAAa,EACnC0b,GAAY,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO,YAAcF,GAAiBC,EAAS,CAAC,EACzF7C,EAAuB8C,EAAS,CAClC,EAEMC,EAAiB,IAAM,CACvBL,IAAY,OAIhBA,EAAU,OAAO,sBAAsB,IAAM,CAC3CA,EAAU,KACVC,EAAA,CACF,CAAC,EACH,EAEA,OAAAA,EAAA,GAEAphB,EAAA,OAAO,iBAAP,MAAAA,EAAuB,iBAAiB,SAAUwhB,IAClD1e,EAAA,OAAO,iBAAP,MAAAA,EAAuB,iBAAiB,SAAU0e,GAClD,OAAO,iBAAiB,SAAUA,CAAc,EAEzC,IAAM,WACXxhB,EAAA,OAAO,iBAAP,MAAAA,EAAuB,oBAAoB,SAAUwhB,IACrD1e,GAAA,OAAO,iBAAP,MAAAA,GAAuB,oBAAoB,SAAU0e,GACrD,OAAO,oBAAoB,SAAUA,CAAc,EAC/CL,IAAY,MACd,OAAO,qBAAqBA,CAAO,CAEvC,CACF,EAAG,CAAClK,EAAWmH,EAAiBkB,EAAc3C,CAAQ,CAAC,EAGvDzM,EAAAA,UAAU,IAAM,CACd,GAAI,CAACqP,GAAkB,CACrBZ,EAAoB,CAAC,EACrB,MACF,CAEA,MAAM8C,EAAkBlE,EAAmB,QAC3C,GAAI,CAACkE,EACH,OAGF,MAAMC,EAAqB,IAAM,CAC/B/C,EAAoB,KAAK,KAAK8C,EAAgB,sBAAA,EAAwB,MAAM,CAAC,CAC/E,EAEAC,EAAA,EACA,MAAMC,EAAW,IAAI,eAAeD,CAAkB,EACtD,OAAAC,EAAS,QAAQF,CAAe,EAEzB,IAAME,EAAS,WAAA,CACxB,EAAG,CAACpC,EAAgB,CAAC,EAIrBrP,EAAAA,UAAU,IAAM,CACTkD,IACLqK,EAAa,QAAU,GACvBmE,GAAqB,QAAU,KAC/BC,GAAsB,QAAU,KAChClE,EAA0B,QAAU,KACpCmE,GAAwB,QAAU,CAAA,EACpC,EAAG,CAAC1O,CAAQ,CAAC,EAGblD,EAAAA,UAAU,IAAM,CACToD,IACHmK,EAAa,QAAU,GAE3B,EAAG,CAACnK,CAAe,CAAC,EAGpBpD,EAAAA,UAAU,IAAM,CAMd,GALI,CAACkD,GACD,CAACE,GACD,CAAC4J,GAGD,CAACsC,EACH,OAIF,GAAIA,EAAQ,SAAW,EAAG,CACxBpC,EAAS,WAAY,CAAE,QAAS,EAAA,CAAM,EACtC,MACF,CAGA,MAAMwD,EAAepB,EAAQ,KAAMuC,GAAMA,EAAE,KAAO7E,CAAQ,EAC1D,GAAI,CAAC0D,EAIH,OAIF,GAAI,CAAC9C,EAAgB,CACnB,MAAMgD,EAAaF,EAAa,MAAM,KAAMoB,GAAMA,EAAE,MAAM,GAAKpB,EAAa,MAAM,CAAC,EAC/EE,GACF1D,EACE,YAAYhK,CAAQ,YAAY8J,CAAQ,UAAU+E,GAAmBnB,EAAW,EAAE,CAAC,GACnF,CAAE,QAAS,EAAA,CAAK,EAGpB,MACF,CAIA,GAAI,CADgBF,EAAa,MAAM,KAAMoB,GAAMA,EAAE,KAAOlE,CAAc,EACxD,CAEhB,MAAMyC,EAAaK,EAAa,MAAM,KAAMoB,GAAMA,EAAE,MAAM,GAAKpB,EAAa,MAAM,CAAC,EAC/EL,GACFnD,EACE,YAAYhK,CAAQ,YAAY8J,CAAQ,UAAU+E,GAAmB1B,EAAW,EAAE,CAAC,GACnF,CAAE,QAAS,EAAA,CAAK,EAGpB,MACF,CACF,EAAG,CAACnN,EAAUE,EAAiBkM,EAAStC,EAAUY,EAAgBV,CAAQ,CAAC,EAG3ElN,EAAAA,UAAU,IAAM,CAOd,GANI,CAACkD,GACD,CAACE,GACD,CAACkM,GAAWA,EAAQ,SAAW,GAE/BtC,GAAYY,GAEZL,EAAa,QAAS,OAG1B,MAAM6C,EAAed,EAAQ,KAAMO,GAAQA,EAAI,MAAM,GAAKP,EAAQ,CAAC,EAC7De,EAAaD,EAAa,MAAM,KAAML,GAASA,EAAK,MAAM,GAAKK,EAAa,MAAM,CAAC,EACpFC,IAEL9C,EAAa,QAAU,GACvBL,EACE,YAAYhK,CAAQ,YAAYkN,EAAa,EAAE,UAAU2B,GAAmB1B,EAAW,EAAE,CAAC,GAC1F,CAAE,QAAS,EAAA,CAAK,EAEpB,EAAG,CAACjN,EAAiBF,EAAUgK,EAAUU,EAAgBZ,EAAUsC,CAAO,CAAC,EAI3E,MAAM0C,GAA0BjS,EAAAA,OAAsB,IAAI,EAC1DC,EAAAA,UAAU,IAAM,CACdgS,GAAwB,QAAU,IACpC,EAAG,CAAC9O,EAAU0K,CAAc,CAAC,EAG7B5N,EAAAA,UAAU,IAAM,CAKd,GAJI,CAACkD,GAAY,CAAC8J,GAAY,CAACY,GAI3BS,GAAa,CAACjL,EAAiB,OAEnC,MAAM6O,EAAc,GAAG/O,CAAQ,IAAI8J,CAAQ,IAAIY,CAAc,GAC7D,GAAIoE,GAAwB,UAAYC,EACtC,OAEFD,GAAwB,QAAUC,EAElC,MAAMC,EAAO1B,GAAcxD,EAAUY,CAAc,EACnDuE,GAAoBnF,EAAUY,CAAc,EAC5CF,EAAWxK,EAAU8J,EAAUY,EAAgBsE,CAAI,CACrD,EAAG,CAAC9O,EAAiBF,EAAUsN,GAAenC,EAAWT,EAAgBF,EAAYV,CAAQ,CAAC,EAG9FhN,EAAAA,UAAU,IAAM,CACd,GAAI,CAACkD,GAAY,CAACE,GAAmB,CAAC4J,GAAY,CAACY,EACjD,OAGF,MAAMwE,EAAc,CAAE,SAAApF,EAAU,OAAQY,CAAA,EAErC/C,GAAiC,CAChC,YAAAuH,EACA,eAAgBjC,GAChB,qBAAsB1C,EAA0B,OAAA,CACjD,IAKHA,EAA0B,QAAU,CAClC,SAAU2E,EAAY,SACtB,OAAQA,EAAY,OACpB,GAAI,KAAK,IAAA,CAAI,EAEjB,EAAG,CAAChP,EAAiBF,EAAU0K,EAAgBuC,GAAyBnD,CAAQ,CAAC,EAEjF,MAAM4E,GAA0B7R,EAAAA,OAC9B,CAAA,CAAC,EAEGoS,GAAsB9N,EAAAA,YAAY,CAAC2I,EAAkB7J,IAAmB,CAC5E,MAAMV,EAAM,KAAK,IAAA,EACX4P,EAAO,CACX,GAAGT,GAAwB,QAAQ,OAAQU,GAAM7P,EAAM6P,EAAE,GAAK,GAAI,EAClE,CAAE,SAAAtF,EAAU,OAAA7J,EAAQ,GAAIV,CAAA,CAAI,EAE9BmP,GAAwB,QAAUS,EAAK,MAAM,EAAE,CACjD,EAAG,CAAA,CAAE,EAGCE,EAAsBlL,EAAc3Y,GACxCwU,EAAWxU,EAAM,oBAAoBwU,CAAQ,EAAI,MAAA,EAI7CwO,GAAuB3R,EAAAA,OAAoD,IAAI,EACrFC,EAAAA,UAAU,IAAM,CAId,GAHI,CAACkD,GACD,CAACE,GACD,CAAC4J,GAAY,CAACY,GACd,CAAC2E,EAAqB,OAE1B,MAAM9P,EAAM,KAAK,IAAA,EACX+H,EAAuBD,GAC3BkD,EAA0B,QAC1BhL,CAAA,EAIF,GAFAgL,EAA0B,QAAUjD,EAGlCC,GAA4B,CAC1B,IAAAhI,EACA,qBAAA+H,EACA,oBAAA+H,EACA,aAAc,CAAE,SAAAvF,EAAU,OAAQY,CAAA,EAClC,qBAAsBgE,GAAwB,QAC9C,kBAAmBF,GAAqB,OAAA,CACzC,EAED,OAGFA,GAAqB,QAAU,CAAE,GAAGa,CAAA,EAElC/H,GACAA,EAAqB,WAAa+H,EAAoB,UACtD/H,EAAqB,SAAW+H,EAAoB,SAEpD9E,EAA0B,QAAU,MAItC,MAAMyE,EAAO1B,GAAc+B,EAAoB,SAAUA,EAAoB,MAAM,EACnFJ,GAAoBI,EAAoB,SAAUA,EAAoB,MAAM,EAC5E7E,EAAWxK,EAAUqP,EAAoB,SAAUA,EAAoB,OAAQL,CAAI,EAGnFhF,EACE,YAAYhK,CAAQ,YAAYqP,EAAoB,QAAQ,UAAUR,GAAmBQ,EAAoB,MAAM,CAAC,GACpH,CAAE,QAAS,EAAA,CAAK,CAEpB,EAAG,CACDrP,EACAE,EACA4J,EACAY,EACA2E,EACAJ,GACA3B,GACA9C,EACAR,CAAA,CACD,EAGD,MAAMyE,GAAwB5R,EAAAA,OAAoD,IAAI,EACtFC,EAAAA,UAAU,IAAM,CAGd,GAFI,CAACkD,GACD,CAACE,GACD,CAACkM,GAAWA,EAAQ,SAAW,EAAG,OAGtC,MAAMlF,EAAiBwH,GAAwB,QACzCxB,EAAed,EAAQ,KAAMuC,IAAMA,GAAE,MAAM,EACjD,GAAI,CAACzB,EAAc,OAEnB,MAAMC,EAAaD,EAAa,MAAM,KAAM0B,IAAMA,GAAE,MAAM,EAC1D,GAAI,CAACzB,EAAY,OAEjB,MAAMmC,EAAgB,CAAE,SAAUpC,EAAa,GAAI,OAAQC,EAAW,EAAA,EAChE5N,EAAM,KAAK,IAAA,EACX+H,EAAuBD,GAC3BkD,EAA0B,QAC1BhL,CAAA,EAmCF,GAjCAgL,EAA0B,QAAUjD,EAGlCI,GAAyB,CACvB,IAAAnI,EACA,qBAAA+H,EACA,eAAgBgI,EAChB,qBAAsBpI,CAAA,CACvB,GAODuH,GAAsB,SACtBA,GAAsB,QAAQ,WAAaa,EAAc,UACzDb,GAAsB,QAAQ,SAAWa,EAAc,SAMzDb,GAAsB,QAAU,CAAE,GAAGa,CAAA,EAEnChI,GACAA,EAAqB,WAAagI,EAAc,UAChDhI,EAAqB,SAAWgI,EAAc,SAE9C/E,EAA0B,QAAU,MAIlCT,IAAawF,EAAc,UAAY5E,IAAmB4E,EAAc,QAC1E,OAIF,MAAMN,GAAO1B,GAAcgC,EAAc,SAAUA,EAAc,MAAM,EACvEL,GAAoBK,EAAc,SAAUA,EAAc,MAAM,EAChE9E,EAAWxK,EAAUsP,EAAc,SAAUA,EAAc,OAAQN,EAAI,EACvEhF,EACE,YAAYhK,CAAQ,YAAYsP,EAAc,QAAQ,UAAUT,GAAmBS,EAAc,MAAM,CAAC,GACxG,CAAE,QAAS,EAAA,CAAK,CAEpB,EAAG,CACDtP,EACAE,EACAkM,EACAtC,EACAY,EACAuE,GACA3B,GACA9C,EACAR,CAAA,CACD,EAKD,MAAMuF,GAAwBpL,EAAc3Y,GAC1CwU,EAAWxU,EAAM,sBAAsBwU,CAAQ,EAAI,MAAA,EAErDlD,EAAAA,UAAU,IAAM,CAGd,GAFI,CAACkD,GACD,CAACE,GACD,CAACqP,GAAuB,OAE5B,MAAM7P,EAAQ,IACR8P,EAAU,KAAK,IAAA,EAAQD,GAC7B,GAAIC,EAAU9P,EAAO,CACnByE,EAAa,SAAA,EAAW,yBAAyBnE,CAAQ,EACzD,MACF,CAEA,GAAI,CAACiN,GAAyB,CAC5B,MAAMwC,EAAQ,OAAO,WAAW,IAAM,CACpCtL,EAAa,SAAA,EAAW,yBAAyBnE,CAAQ,CAC3D,EAAGN,EAAQ8P,CAAO,EAClB,MAAO,IAAM,OAAO,aAAaC,CAAK,CACxC,CAEA,MAAMtf,EAAS8c,GACf,GAAInD,IAAa3Z,EAAO,UAAYua,IAAmBva,EAAO,OAAQ,CACpE,MAAMsf,EAAQ,OAAO,WAAW,IAAM,CACpCtL,EAAa,SAAA,EAAW,yBAAyBnE,CAAQ,CAC3D,EAAGN,EAAQ8P,CAAO,EAClB,MAAO,IAAM,OAAO,aAAaC,CAAK,CACxC,CAEAlF,EAA0B,QAAU,CAClC,SAAUpa,EAAO,SACjB,OAAQA,EAAO,OACf,GAAI,KAAK,IAAA,CAAI,EAEf,MAAM6e,EAAO1B,GAAcnd,EAAO,SAAUA,EAAO,MAAM,EACzD8e,GAAoB9e,EAAO,SAAUA,EAAO,MAAM,EAClDqa,EAAWxK,EAAU7P,EAAO,SAAUA,EAAO,OAAQ6e,CAAI,EACzDhF,EACE,YAAYhK,CAAQ,YAAY7P,EAAO,QAAQ,UAAU0e,GAAmB1e,EAAO,MAAM,CAAC,GAC1F,CAAE,QAAS,EAAA,CAAK,EAElBgU,EAAa,SAAA,EAAW,yBAAyBnE,CAAQ,CAC3D,EAAG,CACDA,EACAE,EACAqP,GACAtC,GACAnD,EACAY,EACAuE,GACA3B,GACA9C,EACAR,CAAA,CACD,EAGDlN,EAAAA,UAAU,IAAM,CACd,GAAI,CAACiQ,GAAuB,CAACH,IAAgBzB,EAAW,OAExD,MAAM3a,EAAWqQ,EAAY,QACvBO,EAAO5Q,GAAA,YAAAA,EAAU,cACvB,GAAI,CAAC4Q,EAAM,OAEX,MAAMsO,EAAa,KAAK,IAAI,EAAG,KAAK,MAAM9C,GAAa,OAAS,CAAC,CAAC,EAC5D+C,EAAa,KAAK,IAAI,EAAG,KAAK,MAAM/C,GAAa,QAAU,CAAC,CAAC,EACnE,GAAI,CAAC8C,GAAc,CAACC,EAAY,OAEhC,MAAMpQ,EAAM,KAAK,IAAA,EACXC,EAAa,CAAE,KAAMkQ,EAAY,KAAMC,CAAA,EACvClQ,IAAmBjP,GAAA,YAAAA,EAAU,wBAAyB,KAEzD8O,GAA0B,CACzB,IAAAC,EACA,WAAAC,EACA,iBAAAC,EAAA,CACD,IAKC2B,EAAK,OAASsO,GAActO,EAAK,OAASuO,GAI9CvO,EAAK,OAAOsO,EAAYC,CAAU,EACpC,EAAG,CAAC5C,EAAqB5B,EAAWyB,EAAY,CAAC,EAGjD9P,EAAAA,UAAU,IAAM,CAEd,MAAMuF,EAAQ,OAAO,sBAAsB,IAAM,QAC/CzV,EAAAiU,EAAY,UAAZ,MAAAjU,EAAqB,gBACvB,CAAC,EACKgjB,EAAU,OAAO,WAAW,IAAM,QACtChjB,EAAAiU,EAAY,UAAZ,MAAAjU,EAAqB,gBACvB,EAAG,GAAG,EAEN,MAAO,IAAM,CACX,OAAO,qBAAqByV,CAAK,EACjC,OAAO,aAAauN,CAAO,CAC7B,CACF,EAAG,CAAC/L,CAAS,CAAC,EAGd/G,EAAAA,UAAU,IAAM,CACT2N,GAAA,MAAAA,EAAa,SAIlBoF,GAAM,MAAMpF,EAAY,OAAO,CACjC,EAAG,CAACA,GAAA,YAAAA,EAAa,OAAO,CAAC,EAGzB3N,EAAAA,UAAU,KACR,SAAS,MAAQ6L,GAAkBqE,EAAmB,EAC/C,IAAM,CACX,SAAS,MAAQnE,CACnB,GACC,CAACA,EAAUmE,EAAmB,CAAC,EAGlClQ,EAAAA,UAAU,IAAM,CACd,MAAMgT,EAAU,IAAM,QACpBljB,EAAAiU,EAAY,UAAZ,MAAAjU,EAAqB,gBACvB,EAEA,cAAO,iBAAiB,sBAAuBkjB,CAAwB,EAChE,IAAM,CACX,OAAO,oBAAoB,sBAAuBA,CAAwB,CAC5E,CACF,EAAG,CAAA,CAAE,EAGLhT,EAAAA,UAAU,IAAM,CACd,MAAMgT,EACJrjB,GACG,CACH,KAAM,CAAE,SAAUsjB,EAAe,SAAAjG,EAAU,OAAA7J,GAAWxT,EAAM,OAGxDsjB,IAAkB/P,IACpBuK,EAA0B,QAAU,CAAE,SAAAT,EAAU,OAAA7J,EAAQ,GAAI,KAAK,KAAI,EAEzE,EAEA,cAAO,iBAAiB,gCAAiC6P,CAAwB,EAC1E,IAAM,CACX,OAAO,oBAAoB,gCAAiCA,CAAwB,CACtF,CACF,EAAG,CAAC9P,CAAQ,CAAC,EAGblD,EAAAA,UAAU,IAAM,CACdiO,EAAckB,CAAe,CAC/B,EAAG,CAACA,CAAe,CAAC,EAEpB,MAAM+D,GAAqB7O,EAAAA,YACxBnI,GAAoB,CACnB,GAAI,CAACgH,GAAY,CAAC0K,GAAkB,CAACqC,EACnC,OAIY5I,EAAa,SAAA,EACrB,UAAUnE,EAAU0K,EAAgB1R,EAAS,EAAK,CAC1D,EACA,CAAC+T,EAAqB/M,EAAU0K,CAAc,CAAA,EAG1CuF,GAAmB9O,EAAAA,YAAY,IAAM,CACzC,GAAI,CAAC4L,EAAqB,CACxB8C,GAAM,MAAMjG,EAAE,sBAAsB,CAAC,EACrC,MACF,CAEA,GADI,CAAC5J,GAAY,CAAC0K,GACd,CAACI,EAAW,OAAQ,OAExBW,EAAa,EAAI,EACjB,OAAO,WAAW,IAAMA,EAAa,EAAK,EAAG,GAAG,EAEhD,MAAMzS,EAAU4S,GAAsB,GAAGd,CAAU,KAAOA,EAC5C3G,EAAa,SAAA,EACrB,UAAUnE,EAAU0K,EAAgB1R,EAAS,EAAK,EACxD8S,EAAiBhB,CAAU,EACvBF,GACFoB,EAAkBpB,CAAQ,EAE5BG,EAAc,EAAE,CAClB,EAAG,CACDe,EACAiB,EACA/M,EACA4K,EACAgB,GACAd,EACAkB,EACAtB,EACAd,CAAA,CACD,EAEKsG,GAA6B/O,EAAAA,YAAY,IAAM,CACnD,GAAI,CAAC4L,EAAqB,CACxB8C,GAAM,MAAMjG,EAAE,sBAAsB,CAAC,EACrC,MACF,CAEA,GADI,CAAC5J,GAAY,CAAC0K,GACd,CAACI,EAAW,OAAQ,OAExBW,EAAa,EAAI,EACjB,OAAO,WAAW,IAAMA,EAAa,EAAK,EAAG,GAAG,EAEhD,MAAM3U,EAAQgU,EAAW,MAAM,OAAO,EAChCqF,EAAQhM,EAAa,SAAA,EAC3B,UAAWzZ,KAAQoM,EACZpM,EAAK,QAGVylB,EAAM,UAAUnQ,EAAU0K,EAAgB,GAAGhgB,CAAI,KAAM,EAAK,EAG9DohB,EAAiBhB,CAAU,EACvBF,GACFoB,EAAkBpB,CAAQ,EAE5BG,EAAc,EAAE,CAClB,EAAG,CACDe,EACAiB,EACA/M,EACA4K,EACAE,EACAkB,EACAtB,EACAd,CAAA,CACD,EAEKwG,GAAoBjP,EAAAA,YACvB1U,GAA2C,CAG1C,GAFAwe,EAAmB,EAAI,EAEnB,EAAE1B,GAAY2C,GAChB,OAGF,MAAM/b,EAAS1D,EAAM,cACrB,OAAO,sBAAsB,IAAM,CACjC0D,EAAO,eAAe,CAAE,MAAO,UAAW,OAAQ,UAAW,CAC/D,CAAC,EACD,OAAO,WAAW,IAAM,CACtB,OAAO,SAAS,EAAG,CAAC,CACtB,EAAG,EAAE,CACP,EACA,CAAC+b,EAAc3C,CAAQ,CAAA,EAGnB8G,GAAmBlP,EAAAA,YAAY,IAAM,CACzC8J,EAAmB,EAAK,CAC1B,EAAG,CAAA,CAAE,EAGCqF,GAAoBnP,EAAAA,YAAY,IAAM,QAC1CvU,EAAAwd,EAAkB,UAAlB,MAAAxd,EAA2B,MAAM,CAAE,cAAe,IACpD,EAAG,CAAA,CAAE,EAEL,GAAI,CAACoT,EACH,OACE2G,EAAAA,IAAC,MAAA,CAAI,UAAU,8CACb,SAAAA,MAAC,MAAA,CAAI,UAAU,wFACZ,SAAAiD,EAAE,kBAAkB,CAAA,CACvB,EACF,EAIJ,MAAM2G,GAAiB,CAACrQ,GAAmB,CAACuK,EAE5C,OACE+F,EAAAA,KAAC,MAAA,CAAI,UAAU,6CAA6C,cAAY,cACtE,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACC,UAAW,mDACTjH,GAAY1F,IAAc,UAAY,CAACsI,GAAmB,OAAS,EACrE,GACA,MAAO,CACL,cAAeA,GAAmB,GAAGb,EAAmB,EAAE,KAAO,MAAA,EAGnE,SAAA,CAAA3E,EAAAA,IAAC,MAAA,CACC,UAAU,mEACV,MAAO,CAAE,gBAAiBvC,GAAc,UAAA,EAEvC,YAAmBsG,EAClB/D,EAAAA,IAAC,OAAI,IAAKuD,EAAsB,UAAU,+BACxC,SAAAvD,EAAAA,IAAC8J,GAAA,CAEC,IAAK5P,EACL,SAAAb,EACA,OAAQ0K,EACR,MAAOiB,EACP,UAAA9H,EACA,gBAAA3D,EACA,mBAAAC,GACA,SAAUiN,GACV,OAAQC,EAAA,EATH,GAAGrN,CAAQ,IAAI0K,CAAc,EAAA,CAUpC,CACF,EAEA/D,EAAAA,IAAC,MAAA,CAAI,UAAU,6EACb,SAAAA,MAAC,MAAA,CAAI,UAAU,qBACZ,SAACzG,EAQG4J,EAWH0G,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAA/J,EAAAA,IAAC,OAAI,UAAU,2EACb,eAACgK,GAAA,CAAQ,UAAU,6CAA6C,CAAA,CAClE,QACC,KAAA,CAAG,UAAU,sBAAuB,SAAA/G,EAAE,qBAAqB,CAAA,CAAE,CAAA,CAAA,CAChE,EAfA4G,EAAAA,KAAAE,EAAAA,SAAA,CACE,SAAA,CAAA/J,EAAAA,IAAC,MAAA,CAAI,UAAU,2EACb,SAAAA,EAAAA,IAAC,QAAK,UAAU,iCAAiC,cAAE,CAAA,CACrD,QACC,KAAA,CAAG,UAAU,sBAAuB,SAAAiD,EAAE,yBAAyB,EAAE,QACjE,IAAA,CAAE,UAAU,gCACV,SAAAA,EAAE,4BAA4B,CAAA,CACjC,CAAA,CAAA,CACF,EAhBA4G,OAAAE,EAAAA,SAAA,CACE,SAAA,CAAA/J,EAAAA,IAAC,MAAA,CAAI,UAAU,2EACb,SAAAA,EAAAA,IAAC,QAAK,UAAU,iCAAiC,cAAE,CAAA,CACrD,QACC,KAAA,CAAG,UAAU,sBAAuB,SAAAiD,EAAE,qBAAqB,EAAE,QAC7D,IAAA,CAAE,UAAU,gCAAiC,SAAAA,EAAE,uBAAuB,CAAA,CAAE,CAAA,CAAA,CAC3E,EAmBJ,CAAA,CACF,CAAA,CAAA,EAIH2G,IACC5J,EAAAA,IAAC,MAAA,CACC,UAAU,sFACV,cAAY,0BAEZ,SAAA6J,EAAAA,KAAC,MAAA,CAAI,UAAU,kGACb,SAAA,CAAA7J,EAAAA,IAAC,MAAA,CAAI,UAAU,gFAAA,CAAiF,EAChGA,MAAC,QAAK,UAAU,gCAAgC,cAAY,uBACzD,SAAAiD,EAAE,qBAAqB,CAAA,CAC1B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,EAKH/F,IAAc,UACb8C,MAAC,MAAA,CAAI,UAAU,GACb,SAAAA,EAAAA,IAACwC,GAAA,CACC,OAAQ6G,GACR,SAAU,CAACjD,EACX,SAAAxD,EACA,UAAA1F,CAAA,CAAA,EAEJ,EAGDA,IAAc,UACb2M,EAAAA,KAAC,MAAA,CACC,IAAKrG,EACL,UAAW,iDACTgC,GAAmB,4BAA8B,EACnD,GACA,MAAOA,GAAmB,CAAE,OAAQ,GAAGf,CAAmB,MAAS,OAGlE,SAAA,CAAA7B,GACC5C,EAAAA,IAACwC,GAAA,CACC,OAAQ6G,GACR,cAAeM,GACf,SAAU,CAACvD,EACX,SAAAxD,EACA,UAAA1F,CAAA,CAAA,EAGJ8C,EAAAA,IAAC,WAAA,CACC,IAAKyD,EACL,cAAY,eACZ,UAAU,uLACV,MAAOU,EACP,SAAWpB,GAAM,CACf,MAAMkH,EAAWlH,EAAE,OAAO,MAE1B,GADAqB,EAAc6F,CAAQ,EAClB,EAAChG,EAGL,IAAIgG,EAAU,CACZ7E,EAAenB,EAAUgG,CAAQ,EACjC,MACF,CACA5E,EAAkBpB,CAAQ,EAC5B,EACA,YAAahB,EAAE,2BAA2B,EAC1C,QAASwG,GACT,OAAQC,GACR,mBAAoB,IAAM,CACxBnF,GAAe,QAAU,EAC3B,EACA,iBAAkB,IAAM,CACtBA,GAAe,QAAU,EAC3B,CAAA,CAAA,EAEFvE,EAAAA,IAAC,MAAA,CAAI,UAAU,eACb,SAAA6J,EAAAA,KAAC,MAAA,CACC,UAAU,yDACV,cAAY,kBAEZ,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACC,UAAU,uFACV,cAAY,gCAEZ,SAAA,CAAA7J,EAAAA,IAACkK,GAAA,CACC,KAAK,KACL,QAASjF,GACT,gBAAkBkF,GAAYjF,EAAuB,EAAQiF,CAAQ,CAAA,CAAA,EAEvEnK,EAAAA,IAAC,OAAA,CAAM,SAAAiD,EAAE,8BAA8B,CAAA,CAAE,CAAA,CAAA,CAAA,EAE3C4G,EAAAA,KAAC/G,GAAA,CACC,QAAQ,UACR,KAAK,KACL,cAAY,eACZ,cAAgBC,GAAMA,EAAE,eAAA,EACxB,QAAS,IAAM,OACbqB,EAAc,EAAE,EACZH,GACFoB,EAAkBpB,CAAQ,EAExBrB,GAAY1F,IAAc,YAC5BjX,EAAAwd,EAAkB,UAAlB,MAAAxd,EAA2B,MAAM,CAAE,cAAe,KAEtD,EACA,MAAOgd,EAAE,gBAAgB,EAEzB,SAAA,CAAAjD,EAAAA,IAACoK,GAAA,CAAO,UAAU,SAAA,CAAU,EAC3BnH,EAAE,gBAAgB,CAAA,CAAA,CAAA,EAErB4G,EAAAA,KAAC/G,GAAA,CACC,QAAQ,YACR,KAAK,KACL,cAAY,2BACZ,cAAgBC,GAAMA,EAAE,eAAA,EACxB,QAAS,IAAM,OACbwG,GAAA,EACI3G,GAAY1F,IAAc,YAC5BjX,EAAAwd,EAAkB,UAAlB,MAAAxd,EAA2B,MAAM,CAAE,cAAe,KAEtD,EACA,SAAU,CAACmgB,GAAuBvB,EAEjC,SAAA,CAAAA,EACC7E,EAAAA,IAACgK,IAAQ,UAAU,sBAAA,CAAuB,EAE1ChK,EAAAA,IAACqK,GAAA,CAAK,UAAU,SAAA,CAAU,EAE3BpH,EAAE,+BAA+B,CAAA,CAAA,CAAA,EAEpC4G,EAAAA,KAAC/G,GAAA,CACC,QAAQ,UACR,KAAK,KACL,cAAY,cACZ,cAAgBC,GAAMA,EAAE,eAAA,EACxB,QAAS,IAAM,OACbuG,GAAA,EACI1G,GAAY1F,IAAc,YAC5BjX,EAAAwd,EAAkB,UAAlB,MAAAxd,EAA2B,MAAM,CAAE,cAAe,KAEtD,EACA,SAAU,CAACmgB,GAAuBvB,EAEjC,SAAA,CAAAA,EACC7E,EAAAA,IAACgK,IAAQ,UAAU,sBAAA,CAAuB,EAE1ChK,EAAAA,IAACqK,GAAA,CAAK,UAAU,SAAA,CAAU,EAE3BpH,EAAE,aAAa,CAAA,CAAA,CAAA,CAClB,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAAA,CACF,EAEJ,CAEJ,CAGO,SAASqH,IAAY,CAC1B,KAAM,CAAE,SAAAjR,EAAU,SAAA8J,EAAU,OAAA7J,CAAA,EAAW8J,GAAA,EACjCW,EAAiBzK,EAAS0K,GAAyB1K,CAAM,EAAI,OAC7DiR,EAAY/M,EAAc3Y,GAAUA,EAAM,SAAS,EACnDqd,EAAWf,GAActc,UAAU,QAAAoB,EAAApB,EAAM,WAAN,YAAAoB,EAAgB,WAAY,OAAM,EAErE0L,EAAW0H,EAAWkR,EAAUlR,CAAQ,EAAI,OAC5C0M,EAAiBrI,EAAAA,QAAQ,IAAM,OACnC,GAAI,GAACyF,GAAY,GAACld,EAAA0L,GAAA,YAAAA,EAAU,UAAV,MAAA1L,EAAmB,UACrC,OAAO0L,EAAS,QAAQ,QAAQ,KAAMqW,GAAMA,EAAE,KAAO7E,CAAQ,CAC/D,EAAG,CAACA,EAAUxR,CAAQ,CAAC,EAEjBsU,EAAevI,EAAAA,QAAQ,IAAM,CACjC,GAAI,GAACqG,GAAkB,CAACgC,GACxB,OAAOA,EAAe,MAAM,KAAMkC,GAAMA,EAAE,KAAOlE,CAAc,CACjE,EAAG,CAACA,EAAgBgC,CAAc,CAAC,EAE7ByE,EAAQ9M,EAAAA,QAAQ,IAChBqI,GAAkBE,EACb3E,GAAmB,CACxB,QAAS2E,EAAa,MACtB,UAAWF,EAAe,MAC1B,UAAWE,EAAa,MACxB,WAAYF,EAAe,KAC3B,WAAY7D,CAAA,CACb,EAEI7I,GAAY,GAClB,CAAC0M,EAAgBE,EAAc/D,EAAU7I,CAAQ,CAAC,EAErD,yBAAU,SAAAmR,CAAA,CAAM,CAClB,CAGO,SAASC,IAAc,CAC5B,KAAM,CAAE,EAAAxH,CAAA,EAAMC,GAAA,EACR,CAAE,SAAA7J,EAAU,OAAAC,CAAA,EAAW8J,GAAA,EACvBW,EAAiBzK,EAAS0K,GAAyB1K,CAAM,EAAI,OAC7D4D,EAAY6H,GAAYlgB,GAAUA,EAAM,SAAS,EACjD6lB,EAAe3F,GAAYlgB,GAAUA,EAAM,YAAY,EACvD0U,EAAkBiE,EAAc3Y,GAAA,OACpC,OAAAwU,IAAYpT,EAAApB,EAAM,kBAAN,YAAAoB,EAAwBoT,KAAa,GAAS,GAAA,EAGtD,CAACsR,EAAoBC,CAAqB,EAAItN,EAAAA,SAAS,EAAK,EAE5DuN,EAAc,GAAQ9G,GAAkBxK,GAExCuR,EAAwB,IAAM,CAElCJ,EADgBxN,IAAc,SAAW,SAAW,QAChC,CACtB,EAEM6N,EAAqB,IAAM,CAC/B,OAAO,cAAc,IAAI,YAAY,qBAAqB,CAAC,CAC7D,EAEMC,EAAqB,IAAM,CAC/BJ,EAAsB,EAAI,CAC5B,EAEMK,EAAuB,IAAM,CACjC,OAAO,SAAS,OAAA,CAClB,EAEA,OACEpB,EAAAA,KAAAE,WAAA,CACE,SAAA,CAAA/J,EAAAA,IAAC8C,GAAA,CACC,QAAQ,QACR,KAAK,UACL,QAASkI,EACT,aAAY/H,EAAE,iBAAiB,EAC/B,MAAOA,EAAE,iBAAiB,EAE1B,SAAAjD,EAAAA,IAACnkB,GAAA,CAAU,UAAU,SAAA,CAAU,CAAA,CAAA,EAEjCmkB,EAAAA,IAAC8C,GAAA,CACC,QAAQ,QACR,KAAK,UACL,QAASgI,EACT,SAAU,CAACD,EACX,cAAY,6BACZ,aAAqC5H,EAAzB/F,IAAc,SAAa,qBAA0B,oBAAN,EAC3D,MAAgC+F,EAAzB/F,IAAc,SAAa,qBAA0B,oBAAN,EAErD,SAAAA,IAAc,SACb8C,EAAAA,IAACpkB,GAAA,CAAS,UAAU,UAAU,EAE9BokB,EAAAA,IAAClkB,GAAA,CAAW,UAAU,SAAA,CAAU,CAAA,CAAA,EAGpCkkB,EAAAA,IAAC8C,GAAA,CACC,QAAQ,QACR,KAAK,UACL,QAASiI,EACT,SAAU,CAACF,EACX,aAAY5H,EAAE,kBAAkB,EAChC,MAAOA,EAAE,kBAAkB,EAE3B,SAAAjD,EAAAA,IAACtkB,GAAA,CAAgB,UAAU,SAAA,CAAU,CAAA,CAAA,QAGtCwvB,GAAA,CAAY,KAAMP,EAAoB,aAAcC,EACnD,gBAACO,GAAA,CACC,SAAA,CAAAtB,OAACuB,GAAA,CACC,SAAA,CAAApL,EAAAA,IAACqL,GAAA,CAAkB,SAAApI,EAAE,iBAAiB,CAAA,CAAE,EACxCjD,EAAAA,IAACsL,GAAA,CAAwB,SAAArI,EAAE,wBAAwB,CAAA,CAAE,CAAA,EACvD,SACCsI,GAAA,CACC,SAAA,CAAAvL,EAAAA,IAACwL,GAAA,CAAkB,QAAS,IAAMZ,EAAsB,EAAK,EAC1D,SAAA3H,EAAE,eAAe,EACpB,QACCwI,GAAA,CAAkB,QAASR,EACzB,SAAAhI,EAAE,gBAAgB,CAAA,CACrB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0,1,2,3]}
|