{
  "version": 3,
  "sources": ["../src/browser/LocalizableStrings.ts", "../src/browser/Clipboard.ts", "../src/common/input/TextDecoder.ts", "../src/common/buffer/AttributeData.ts", "../src/common/buffer/CellData.ts", "../src/common/services/ServiceRegistry.ts", "../src/common/services/Services.ts", "../src/browser/OscLinkProvider.ts", "../src/browser/services/Services.ts", "../src/common/Lifecycle.ts", "../src/common/Async.ts", "../src/browser/Dom.ts", "../src/browser/scrollable/fastDomNode.ts", "../src/common/Platform.ts", "../src/browser/scrollable/mouseEvent.ts", "../src/browser/scrollable/globalPointerMoveMonitor.ts", "../src/browser/scrollable/widget.ts", "../src/browser/scrollable/scrollbarArrow.ts", "../src/common/Event.ts", "../src/browser/scrollable/scrollable.ts", "../src/browser/scrollable/scrollbarVisibilityController.ts", "../src/browser/scrollable/abstractScrollbar.ts", "../src/browser/scrollable/scrollbarState.ts", "../src/browser/scrollable/horizontalScrollbar.ts", "../src/browser/scrollable/verticalScrollbar.ts", "../src/browser/scrollable/scrollableElement.ts", "../src/browser/Viewport.ts", "../src/browser/decorations/BufferDecorationRenderer.ts", "../src/browser/decorations/ColorZoneStore.ts", "../src/browser/decorations/OverviewRulerRenderer.ts", "../src/browser/input/CompositionHelper.ts", "../src/common/Color.ts", "../src/browser/services/CharacterJoinerService.ts", "../src/browser/renderer/shared/RendererUtils.ts", "../src/browser/renderer/dom/DomRendererRowFactory.ts", "../src/browser/renderer/dom/WidthCache.ts", "../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/browser/renderer/shared/TextBlinkStateManager.ts", "../src/browser/renderer/dom/DomRenderer.ts", "../src/browser/services/CharSizeService.ts", "../src/browser/services/CoreBrowserService.ts", "../src/browser/services/LinkProviderService.ts", "../src/browser/input/Mouse.ts", "../src/browser/services/MouseCoordsService.ts", "../src/browser/scrollable/touch.ts", "../src/browser/services/MouseService.ts", "../src/browser/RenderDebouncer.ts", "../src/common/TaskQueue.ts", "../src/browser/services/RenderService.ts", "../src/browser/input/MoveToCell.ts", "../src/browser/selection/SelectionModel.ts", "../src/common/buffer/BufferRange.ts", "../src/browser/services/SelectionService.ts", "../src/common/MultiKeyMap.ts", "../src/browser/ColorContrastCache.ts", "../src/browser/Types.ts", "../src/browser/services/ThemeService.ts", "../src/common/input/Keyboard.ts", "../src/common/input/KittyKeyboard.ts", "../src/common/input/Win32InputMode.ts", "../src/browser/services/KeyboardService.ts", "../src/common/services/InstantiationService.ts", "../src/common/services/LogService.ts", "../src/common/CircularList.ts", "../src/common/buffer/BufferLine.ts", "../src/common/buffer/BufferReflow.ts", "../src/common/buffer/Marker.ts", "../src/common/data/Charsets.ts", "../src/common/buffer/Buffer.ts", "../src/common/buffer/BufferSet.ts", "../src/common/services/BufferService.ts", "../src/common/services/OptionsService.ts", "../src/common/Clone.ts", "../src/common/services/CoreService.ts", "../src/common/services/MouseStateService.ts", "../src/common/input/UnicodeV6.ts", "../src/common/services/UnicodeService.ts", "../src/common/services/CharsetService.ts", "../src/common/WindowsMode.ts", "../src/common/parser/Params.ts", "../src/common/parser/OscParser.ts", "../src/common/parser/DcsParser.ts", "../src/common/parser/ApcParser.ts", "../src/common/parser/EscapeSequenceParser.ts", "../src/common/input/XParseColor.ts", "../src/common/Version.ts", "../src/common/InputHandler.ts", "../src/common/input/WriteBuffer.ts", "../src/common/services/OscLinkService.ts", "../src/common/CoreTerminal.ts", "../src/common/SortedList.ts", "../src/common/services/DecorationService.ts", "../src/browser/TimeBasedDebouncer.ts", "../src/browser/AccessibilityManager.ts", "../src/browser/Linkifier.ts", "../src/browser/CoreBrowserTerminal.ts", "../src/common/public/AddonManager.ts", "../src/common/public/BufferLineApiView.ts", "../src/common/public/BufferApiView.ts", "../src/common/public/BufferNamespaceApi.ts", "../src/common/public/ParserApi.ts", "../src/common/public/UnicodeApi.ts", "../src/browser/public/Terminal.ts"],
  "sourcesContent": ["/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n  get: () => promptLabelInternal,\n  set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n  get: () => tooMuchOutputInternal,\n  set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n  promptLabel,\n  tooMuchOutput\n};\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from 'browser/services/Services';\nimport { ICoreService, IOptionsService } from 'common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n  return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n  if (!bracketedPasteMode) {\n    return text;\n  }\n  // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n  // by replacing ESC (\\x1b) with its visible representation U+241B (\u241B).\n  const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n  return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n  if (ev.clipboardData) {\n    ev.clipboardData.setData('text/plain', selectionService.selectionText);\n  }\n  // Prevent or the original text will be copied.\n  ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n  ev.stopPropagation();\n  if (ev.clipboardData) {\n    const text = ev.clipboardData.getData('text/plain');\n    paste(text, textarea, coreService, optionsService);\n  }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n  text = prepareTextForTerminal(text);\n  text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n  coreService.triggerDataEvent(text, true);\n  textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n  // Calculate textarea position relative to the screen element\n  const pos = screenElement.getBoundingClientRect();\n  const left = ev.clientX - pos.left - 10;\n  const top = ev.clientY - pos.top - 10;\n\n  // Bring textarea at the cursor position\n  textarea.style.width = '20px';\n  textarea.style.height = '20px';\n  textarea.style.left = `${left}px`;\n  textarea.style.top = `${top}px`;\n  textarea.style.zIndex = '1000';\n\n  textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n  moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n  if (shouldSelectWord) {\n    selectionService.rightClickSelect(ev);\n  }\n\n  // Get textarea ready to copy from the context menu\n  textarea.value = selectionService.selectionText;\n  textarea.select();\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n *       due to additional sanity checks. We can avoid them since\n *       we always operate on legal UTF32 (granted by the input decoders)\n *       and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n  if (codePoint > 0xFFFF) {\n    codePoint -= 0x10000;\n    return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n  }\n  return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n  let result = '';\n  for (let i = start; i < end; ++i) {\n    let codepoint = data[i];\n    if (codepoint > 0xFFFF) {\n      // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n      // pair conversion rules:\n      //  - subtract 0x10000 from code point, leaving a 20 bit number\n      //  - add high 10 bits to 0xD800  --> first surrogate\n      //  - add low 10 bits to 0xDC00   --> second surrogate\n      codepoint -= 0x10000;\n      result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n    } else {\n      result += String.fromCharCode(codepoint);\n    }\n  }\n  return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n  private _interim: number = 0;\n\n  /**\n   * Clears interim and resets decoder to clean state.\n   */\n  public clear(): void {\n    this._interim = 0;\n  }\n\n  /**\n   * Decode JS string to UTF32 codepoints.\n   * The methods assumes stream input and will store partly transmitted\n   * surrogate pairs and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided input data does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: string, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let startPos = 0;\n\n    // handle leftover surrogate high\n    if (this._interim) {\n      const second = input.charCodeAt(startPos++);\n      if (0xDC00 <= second && second <= 0xDFFF) {\n        target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n      } else {\n        // illegal codepoint (USC2 handling)\n        target[size++] = this._interim;\n        target[size++] = second;\n      }\n      this._interim = 0;\n    }\n\n    for (let i = startPos; i < length; ++i) {\n      const code = input.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          this._interim = code;\n          return size;\n        }\n        const second = input.charCodeAt(i);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          // illegal codepoint (USC2 handling)\n          target[size++] = code;\n          target[size++] = second;\n        }\n        continue;\n      }\n      if (code === 0xFEFF) {\n        // BOM\n        continue;\n      }\n      target[size++] = code;\n    }\n    return size;\n  }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n  public interim: Uint8Array = new Uint8Array(3);\n\n  /**\n   * Clears interim bytes and resets decoder to clean state.\n   */\n  public clear(): void {\n    this.interim.fill(0);\n  }\n\n  /**\n   * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n   * The methods assumes stream input and will store partly transmitted bytes\n   * and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided data chunk does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: Uint8Array, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let byte1: number;\n    let byte2: number;\n    let byte3: number;\n    let byte4: number;\n    let codepoint = 0;\n    let startPos = 0;\n\n    // handle leftover bytes\n    if (this.interim[0]) {\n      let discardInterim = false;\n      let cp = this.interim[0];\n      cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n      let pos = 0;\n      let tmp: number;\n      while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n        cp <<= 6;\n        cp |= tmp;\n      }\n      // missing bytes - read ahead from input\n      const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n      const missing = type - pos;\n      while (startPos < missing) {\n        if (startPos >= length) {\n          return 0;\n        }\n        tmp = input[startPos++];\n        if ((tmp & 0xC0) !== 0x80) {\n          // wrong continuation, discard interim bytes completely\n          startPos--;\n          discardInterim = true;\n          break;\n        } else {\n          // need to save so we can continue short inputs in next call\n          this.interim[pos++] = tmp;\n          cp <<= 6;\n          cp |= tmp & 0x3F;\n        }\n      }\n      if (!discardInterim) {\n        // final test is type dependent\n        if (type === 2) {\n          if (cp < 0x80) {\n            // wrong starter byte\n            startPos--;\n          } else {\n            target[size++] = cp;\n          }\n        } else if (type === 3) {\n          if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n            // illegal codepoint or BOM\n          } else {\n            target[size++] = cp;\n          }\n        } else {\n          if (cp < 0x010000 || cp > 0x10FFFF) {\n            // illegal codepoint\n          } else {\n            target[size++] = cp;\n          }\n        }\n      }\n      this.interim.fill(0);\n    }\n\n    // loop through input\n    const fourStop = length - 4;\n    let i = startPos;\n    while (i < length) {\n      /**\n       * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n       * This is a compromise between speed gain for ASCII\n       * and penalty for non ASCII:\n       * For best ASCII performance the char should be stored directly into target,\n       * but even a single attempt to write to target and compare afterwards\n       * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n       * which reduces ASCII performance by ~15%.\n       * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n       * compared to the gains.\n       * Note that this optimization only takes place for 4 consecutive ASCII chars,\n       * for any shorter it bails out. Worst case - all 4 bytes being read but\n       * thrown away due to the last being a non ASCII char (-10% performance).\n       */\n      while (i < fourStop\n        && !((byte1 = input[i]) & 0x80)\n        && !((byte2 = input[i + 1]) & 0x80)\n        && !((byte3 = input[i + 2]) & 0x80)\n        && !((byte4 = input[i + 3]) & 0x80))\n      {\n        target[size++] = byte1;\n        target[size++] = byte2;\n        target[size++] = byte3;\n        target[size++] = byte4;\n        i += 4;\n      }\n\n      // reread byte1\n      byte1 = input[i++];\n\n      // 1 byte\n      if (byte1 < 0x80) {\n        target[size++] = byte1;\n\n        // 2 bytes\n      } else if ((byte1 & 0xE0) === 0xC0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n        if (codepoint < 0x80) {\n          // wrong starter byte\n          i--;\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 3 bytes\n      } else if ((byte1 & 0xF0) === 0xE0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n        if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n          // illegal codepoint or BOM, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 4 bytes\n      } else if ((byte1 & 0xF8) === 0xF0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          this.interim[2] = byte3;\n          return size;\n        }\n        byte4 = input[i++];\n        if ((byte4 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n        if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n          // illegal codepoint, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n      } else {\n        // illegal byte, just skip\n      }\n    }\n    return size;\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n  public static toColorRGB(value: number): IColorRGB {\n    return [\n      value >>> Attributes.RED_SHIFT & 255,\n      value >>> Attributes.GREEN_SHIFT & 255,\n      value & 255\n    ];\n  }\n\n  public static fromColorRGB(value: IColorRGB): number {\n    return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n  }\n\n  public clone(): IAttributeData {\n    const newObj = new AttributeData();\n    newObj.fg = this.fg;\n    newObj.bg = this.bg;\n    newObj.extended = this.extended.clone();\n    return newObj;\n  }\n\n  // data\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n\n  // flags\n  public isInverse(): number       { return this.fg & FgFlags.INVERSE; }\n  public isBold(): number          { return this.fg & FgFlags.BOLD; }\n  public isUnderline(): number     {\n    if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n      return 1;\n    }\n    return this.fg & FgFlags.UNDERLINE;\n  }\n  public isBlink(): number         { return this.fg & FgFlags.BLINK; }\n  public isInvisible(): number     { return this.fg & FgFlags.INVISIBLE; }\n  public isItalic(): number        { return this.bg & BgFlags.ITALIC; }\n  public isDim(): number           { return this.bg & BgFlags.DIM; }\n  public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n  public isProtected(): number     { return this.bg & BgFlags.PROTECTED; }\n  public isOverline(): number      { return this.bg & BgFlags.OVERLINE; }\n\n  // color modes\n  public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n  public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n  public isFgRGB(): boolean       { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isBgRGB(): boolean       { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isFgPalette(): boolean   { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isBgPalette(): boolean   { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isFgDefault(): boolean   { return (this.fg & Attributes.CM_MASK) === 0; }\n  public isBgDefault(): boolean   { return (this.bg & Attributes.CM_MASK) === 0; }\n  public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n  // colors\n  public getFgColor(): number {\n    switch (this.fg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.fg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.fg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n  public getBgColor(): number {\n    switch (this.bg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.bg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.bg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n\n  // extended attrs\n  public hasExtendedAttrs(): number {\n    return this.bg & BgFlags.HAS_EXTENDED;\n  }\n  public updateExtended(): void {\n    if (this.extended.isEmpty()) {\n      this.bg &= ~BgFlags.HAS_EXTENDED;\n    } else {\n      this.bg |= BgFlags.HAS_EXTENDED;\n    }\n  }\n  public getUnderlineColor(): number {\n    if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n      switch (this.extended.underlineColor & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:  return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n        case Attributes.CM_RGB:   return this.extended.underlineColor & Attributes.RGB_MASK;\n        default:                  return this.getFgColor();\n      }\n    }\n    return this.getFgColor();\n  }\n  public getUnderlineColorMode(): number {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? this.extended.underlineColor & Attributes.CM_MASK\n      : this.getFgColorMode();\n  }\n  public isUnderlineColorRGB(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n      : this.isFgRGB();\n  }\n  public isUnderlineColorPalette(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n          || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n      : this.isFgPalette();\n  }\n  public isUnderlineColorDefault(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n      : this.isFgDefault();\n  }\n  public getUnderlineStyle(): UnderlineStyle {\n    return this.fg & FgFlags.UNDERLINE\n      ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n      : UnderlineStyle.NONE;\n  }\n  public getUnderlineVariantOffset(): number {\n    return this.extended.underlineVariantOffset;\n  }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n  private _ext: number = 0;\n  public get ext(): number {\n    if (this._urlId) {\n      return (\n        (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n        (this.underlineStyle << 26)\n      );\n    }\n    return this._ext;\n  }\n  public set ext(value: number) { this._ext = value; }\n\n  public get underlineStyle(): UnderlineStyle {\n    // Always return the URL style if it has one\n    if (this._urlId) {\n      return UnderlineStyle.DASHED;\n    }\n    return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n  }\n  public set underlineStyle(value: UnderlineStyle) {\n    this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n    this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n  }\n\n  public get underlineColor(): number {\n    return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n  public set underlineColor(value: number) {\n    this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n\n  private _urlId: number = 0;\n  public get urlId(): number {\n    return this._urlId;\n  }\n  public set urlId(value: number) {\n    this._urlId = value;\n  }\n\n  public get underlineVariantOffset(): number {\n    const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n    if (val < 0) {\n      return val ^ 0xFFFFFFF8;\n    }\n    return val;\n  }\n  public set underlineVariantOffset(value: number) {\n    this._ext &= ~ExtFlags.VARIANT_OFFSET;\n    this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n  }\n\n  constructor(\n    ext: number = 0,\n    urlId: number = 0\n  ) {\n    this._ext = ext;\n    this._urlId = urlId;\n  }\n\n  public clone(): IExtendedAttrs {\n    return new ExtendedAttrs(this._ext, this._urlId);\n  }\n\n  /**\n   * Convenient method to indicate whether the object holds no additional information,\n   * that needs to be persistant in the buffer.\n   */\n  public isEmpty(): boolean {\n    return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n  /** Helper to create CellData from CharData. */\n  public static fromCharData(value: CharData): CellData {\n    const obj = new CellData();\n    obj.setFromCharData(value);\n    return obj;\n  }\n  /** Primitives from terminal buffer. */\n  public content = 0;\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n  public combinedData = '';\n  /** Whether cell contains a combined string. */\n  public isCombined(): number {\n    return this.content & Content.IS_COMBINED_MASK;\n  }\n  /** Width of the cell. */\n  public getWidth(): number {\n    return this.content >> Content.WIDTH_SHIFT;\n  }\n  /** JS string of the content. */\n  public getChars(): string {\n    if (this.content & Content.IS_COMBINED_MASK) {\n      return this.combinedData;\n    }\n    if (this.content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n    }\n    return '';\n  }\n  /**\n   * Codepoint of cell\n   * Note this returns the UTF32 codepoint of single chars,\n   * if content is a combined string it returns the codepoint\n   * of the last char in string to be in line with code in CharData.\n   */\n  public getCode(): number {\n    return (this.isCombined())\n      ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n      : this.content & Content.CODEPOINT_MASK;\n  }\n  /** Set data from CharData */\n  public setFromCharData(value: CharData): void {\n    this.fg = value[CHAR_DATA_ATTR_INDEX];\n    this.bg = 0;\n    let combined = false;\n    // surrogates and combined strings need special treatment\n    if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n      combined = true;\n    }\n    else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n      const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n      // if the 2-char string is a surrogate create single codepoint\n      // everything else is combined\n      if (0xD800 <= code && code <= 0xDBFF) {\n        const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n        }\n        else {\n          combined = true;\n        }\n      }\n      else {\n        combined = true;\n      }\n    }\n    else {\n      this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n    if (combined) {\n      this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n      this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n  /** Get data as CharData. */\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n\n  public attributesEquals(other: IBufferCellApi): boolean {\n    if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n      return false;\n    }\n    if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n      return false;\n    }\n    if (this.isInverse() !== other.isInverse()) {\n      return false;\n    }\n    if (this.isBold() !== other.isBold()) {\n      return false;\n    }\n    if (this.isUnderline() !== other.isUnderline()) {\n      return false;\n    }\n    if (this.isUnderline()) {\n      if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n        return false;\n      }\n      const thisDefault = this.isUnderlineColorDefault();\n      const otherDefault = other.isUnderlineColorDefault();\n      if (!(thisDefault && otherDefault)) {\n        if (thisDefault !== otherDefault) {\n          return false;\n        }\n        if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n          return false;\n        }\n        if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n          return false;\n        }\n      }\n    }\n    if (this.isOverline() !== other.isOverline()) {\n      return false;\n    }\n    if (this.isBlink() !== other.isBlink()) {\n      return false;\n    }\n    if (this.isInvisible() !== other.isInvisible()) {\n      return false;\n    }\n    if (this.isItalic() !== other.isItalic()) {\n      return false;\n    }\n    if (this.isDim() !== other.isDim()) {\n      return false;\n    }\n    if (this.isStrikethrough() !== other.isStrikethrough()) {\n      return false;\n    }\n    return true;\n  }\n\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n  return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n  if (serviceRegistry.has(id)) {\n    return serviceRegistry.get(id)!;\n  }\n\n  const decorator: any = function (target: Function, key: string, index: number): any {\n    if (arguments.length !== 3) {\n      throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n    }\n\n    storeServiceDependency(decorator, target, index);\n  };\n\n  decorator._id = id;\n\n  serviceRegistry.set(id, decorator);\n  return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n  if ((target as any)[DI_TARGET] === target) {\n    (target as any)[DI_DEPENDENCIES].push({ id, index });\n  } else {\n    (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n    (target as any)[DI_TARGET] = target;\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, IAttributeData, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from 'common/Types';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport type { Emitter, IEvent } from 'common/Event';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n  serviceBrand: undefined;\n\n  readonly cols: number;\n  readonly rows: number;\n  readonly buffer: IBuffer;\n  readonly buffers: IBufferSet;\n  isUserScrolling: boolean;\n  onResize: IEvent<IBufferResizeEvent>;\n  onScroll: IEvent<number>;\n  scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n  scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n  resize(cols: number, rows: number): void;\n  reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n  cols: number;\n  rows: number;\n  colsChanged: boolean;\n  rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator<IMouseStateService>('MouseStateService');\nexport interface IMouseStateService {\n  serviceBrand: undefined;\n\n  activeProtocol: string;\n  activeEncoding: string;\n  areMouseEventsActive: boolean;\n  addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n  addEncoding(name: string, encoding: CoreMouseEncoding): void;\n  reset(): void;\n  setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n  allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n  /**\n   * Event to announce changes in mouse tracking.\n   */\n  onProtocolChange: IEvent<CoreMouseEventType>;\n  restrictMouseEvent(event: ICoreMouseEvent): boolean;\n  encodeMouseEvent(event: ICoreMouseEvent): string;\n  readonly isDefaultEncoding: boolean;\n  readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n  serviceBrand: undefined;\n\n  /**\n   * Initially the cursor will not be visible until the first time the terminal\n   * is focused.\n   */\n  isCursorInitialized: boolean;\n  isCursorHidden: boolean;\n\n  readonly modes: IModes;\n  readonly decPrivateModes: IDecPrivateModes;\n  readonly kittyKeyboard: IKittyKeyboardState;\n\n  readonly onData: IEvent<string>;\n  readonly onUserInput: IEvent<void>;\n  readonly onBinary: IEvent<string>;\n  readonly onRequestScrollToBottom: IEvent<void>;\n\n  reset(): void;\n\n  /**\n   * Triggers the onData event in the public API.\n   * @param data The data that is being emitted.\n   * @param wasUserInput Whether the data originated from the user (as opposed to\n   * resulting from parsing incoming data). When true this will also:\n   * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n   * - Fire the `onUserInput` event (so selection can be cleared).\n   */\n  triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n  /**\n   * Triggers the onBinary event in the public API.\n   * @param data The data that is being emitted.\n   */\n  triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n  serviceBrand: undefined;\n\n  charset: ICharset | undefined;\n  readonly glevel: number;\n  readonly charsets: (ICharset | undefined)[];\n\n  reset(): void;\n\n  /**\n   * Set the G level of the terminal.\n   * @param g\n   */\n  setgLevel(g: number): void;\n\n  /**\n   * Set the charset for the given G level of the terminal.\n   * @param g\n   * @param charset\n   */\n  setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n  (...args: any[]): void;\n  type: T;\n  _id: string;\n}\n\nexport interface IBrandedService {\n  serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n  : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n    : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n  serviceBrand: undefined;\n\n  setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n  getService<T>(id: IServiceIdentifier<T>): T | undefined;\n  createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n  serviceBrand: undefined;\n\n  readonly logLevel: LogLevelEnum;\n\n  trace(message: any, ...optionalParams: any[]): void;\n  debug(message: any, ...optionalParams: any[]): void;\n  info(message: any, ...optionalParams: any[]): void;\n  warn(message: any, ...optionalParams: any[]): void;\n  error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n  serviceBrand: undefined;\n\n  /**\n   * Read only access to the raw options object, this is an internal-only fast path for accessing\n   * single options without any validation as we trust TypeScript to enforce correct usage\n   * internally.\n   */\n  readonly rawOptions: Required<ITerminalOptions>;\n\n  /**\n   * Options as exposed through the public API, this property uses getters and setters with\n   * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n   * all internal usage for performance reasons.\n   */\n  readonly options: Required<ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when any option changes.\n   */\n  readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when a specific option changes, this is a convenience method that is\n   * preferred over {@link onOptionChange} when only a single option is being listened to.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n  /**\n   * Adds an event listener for when a set of specific options change, this is a convenience method\n   * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n   * handled the same way.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n  allowProposedApi?: boolean;\n  allowTransparency?: boolean;\n  altClickMovesCursor?: boolean;\n  cols?: number;\n  convertEol?: boolean;\n  cursorBlink?: boolean;\n  blinkIntervalDuration?: number;\n  cursorStyle?: CursorStyle;\n  cursorWidth?: number;\n  cursorInactiveStyle?: CursorInactiveStyle;\n  disableStdin?: boolean;\n  documentOverride?: any | null;\n  drawBoldTextInBrightColors?: boolean;\n  fastScrollSensitivity?: number;\n  fontSize?: number;\n  fontFamily?: string;\n  fontWeight?: FontWeight;\n  fontWeightBold?: FontWeight;\n  ignoreBracketedPasteMode?: boolean;\n  letterSpacing?: number;\n  lineHeight?: number;\n  linkHandler?: ILinkHandler | null;\n  logLevel?: LogLevel;\n  logger?: ILogger | null;\n  macOptionIsMeta?: boolean;\n  macOptionClickForcesSelection?: boolean;\n  minimumContrastRatio?: number;\n  reflowCursorLine?: boolean;\n  rescaleOverlappingGlyphs?: boolean;\n  rightClickSelectsWord?: boolean;\n  rows?: number;\n  showCursorImmediately?: boolean;\n  screenReaderMode?: boolean;\n  scrollback?: number;\n  scrollOnUserInput?: boolean;\n  scrollSensitivity?: number;\n  smoothScrollDuration?: number;\n  tabStopWidth?: number;\n  theme?: ITheme;\n  windowsPty?: IWindowsPty;\n  windowOptions?: IWindowOptions;\n  wordSeparator?: string;\n  quirks?: ITerminalQuirks;\n  scrollbar?: IScrollbarOptions;\n  scrollOnEraseInDisplay?: boolean;\n  vtExtensions?: IVtExtensions;\n\n  [key: string]: any;\n  termName: string;\n}\n\nexport interface ITheme {\n  foreground?: string;\n  background?: string;\n  cursor?: string;\n  cursorAccent?: string;\n  selectionForeground?: string;\n  selectionBackground?: string;\n  selectionInactiveBackground?: string;\n  scrollbarSliderBackground?: string;\n  scrollbarSliderHoverBackground?: string;\n  scrollbarSliderActiveBackground?: string;\n  overviewRulerBorder?: string;\n  black?: string;\n  red?: string;\n  green?: string;\n  yellow?: string;\n  blue?: string;\n  magenta?: string;\n  cyan?: string;\n  white?: string;\n  brightBlack?: string;\n  brightRed?: string;\n  brightGreen?: string;\n  brightYellow?: string;\n  brightBlue?: string;\n  brightMagenta?: string;\n  brightCyan?: string;\n  brightWhite?: string;\n  extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n  allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n  showScrollbar?: boolean;\n  showArrows?: boolean;\n  width?: number;\n  overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n  kittyKeyboard?: boolean;\n  kittySgrBoldFaintControl?: boolean;\n  win32InputMode?: boolean;\n  colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n  serviceBrand: undefined;\n  /**\n   * Registers a link to the service, returning the link ID. The link data is managed by this\n   * service and will be freed when this current cursor position is trimmed off the buffer.\n   */\n  registerLink(linkData: IOscLinkData): number;\n  /**\n   * Adds a line to a link if needed.\n   */\n  addLineToLink(linkId: number, y: number): void;\n  /** Get the link data associated with a link ID. */\n  getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n *   This is used to determined grapheme clustering - i.e. which codepoints\n *   are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n  serviceBrand: undefined;\n  /** Register an Unicode version provider. */\n  register(provider: IUnicodeVersionProvider): void;\n  /** Registered Unicode versions. */\n  readonly versions: string[];\n  /** Currently active version. */\n  activeVersion: string;\n  /** Event triggered, when activate version changed. */\n  readonly onChange: IEvent<string>;\n\n  /**\n   * Unicode version dependent\n   */\n  wcwidth(codepoint: number): UnicodeCharWidth;\n  getStringCellWidth(s: string): number;\n  /**\n   * Return character width and type for grapheme clustering.\n   * If preceding != 0, it is the return code from the previous character;\n   * in that case the result specifies if the characters should be joined.\n   */\n  charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n  readonly version: string;\n  wcwidth(ucs: number): UnicodeCharWidth;\n  charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n  serviceBrand: undefined;\n  readonly decorations: IterableIterator<IInternalDecoration>;\n  readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n  readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n  registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n  reset(): void;\n  /**\n   * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n   * instead of an iterator as it's typically used in hot code paths.\n   */\n  forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n  readonly options: IDecorationOptions;\n  readonly backgroundColorRGB: IColor | undefined;\n  readonly foregroundColorRGB: IColor | undefined;\n  readonly onRenderEmitter: Emitter<HTMLElement>;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from 'browser/Types';\nimport { ILinkProvider } from 'browser/services/Services';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService, IOptionsService, IOscLinkService } from 'common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n  private readonly _workCell = new CellData();\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IOscLinkService private readonly _oscLinkService: IOscLinkService\n  ) {\n  }\n\n  public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n    const line = this._bufferService.buffer.lines.get(y - 1);\n    if (!line) {\n      callback(undefined);\n      return;\n    }\n\n    const result: ILink[] = [];\n    const linkHandler = this._optionsService.rawOptions.linkHandler;\n    const cell = this._workCell;\n    const lineLength = line.getTrimmedLength();\n    let currentLinkId = -1;\n    let currentStart = -1;\n    let finishLink = false;\n    for (let x = 0; x < lineLength; x++) {\n      // Minor optimization, only check for content if there isn't a link in case the link ends with\n      // a null cell\n      if (currentStart === -1 && !line.hasContent(x)) {\n        continue;\n      }\n\n      line.loadCell(x, cell);\n      if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n        if (currentStart === -1) {\n          currentStart = x;\n          currentLinkId = cell.extended.urlId;\n          continue;\n        } else {\n          finishLink = cell.extended.urlId !== currentLinkId;\n        }\n      } else {\n        if (currentStart !== -1) {\n          finishLink = true;\n        }\n      }\n\n      if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n        const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n        if (text) {\n          // These ranges are 1-based\n          const range: IBufferRange = {\n            start: {\n              x: currentStart + 1,\n              y\n            },\n            end: {\n              // Offset end x if it's a link that ends on the last cell in the line\n              x: x + (!finishLink && x === lineLength - 1 ? 1 : 0),\n              y\n            }\n          };\n\n          let ignoreLink = false;\n          if (!linkHandler?.allowNonHttpProtocols) {\n            try {\n              const parsed = new URL(text);\n              if (!['http:', 'https:'].includes(parsed.protocol)) {\n                ignoreLink = true;\n              }\n            } catch {\n              // Ignore invalid URLs to prevent unexpected behaviors\n              ignoreLink = true;\n            }\n          }\n\n          if (!ignoreLink) {\n            // OSC links always use underline and pointer decorations\n            result.push({\n              text,\n              range,\n              activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n              hover: (e, text) => linkHandler?.hover?.(e, text, range),\n              leave: (e, text) => linkHandler?.leave?.(e, text, range)\n            });\n          }\n        }\n        finishLink = false;\n\n        // Clear link or start a new link if one starts immediately\n        if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n          currentStart = x;\n          currentLinkId = cell.extended.urlId;\n        } else {\n          currentStart = -1;\n          currentLinkId = -1;\n        }\n      }\n    }\n\n    // TODO: Handle fetching and returning other link ranges to underline other links with the same\n    //       id\n    callback(result);\n  }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n  const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n  if (answer) {\n    const newWindow = window.open();\n    if (newWindow) {\n      try {\n        newWindow.opener = null;\n      } catch {\n        // no-op, Electron can throw\n      }\n      newWindow.location.href = uri;\n    } else {\n      console.warn('Opening link blocked as opener could not be cleared');\n    }\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from 'browser/Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from 'common/Types';\nimport type { IEvent } from 'common/Event';\n\nexport const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');\nexport interface ICharSizeService {\n  serviceBrand: undefined;\n\n  readonly width: number;\n  readonly height: number;\n  readonly hasValidSize: boolean;\n\n  readonly onCharSizeChange: IEvent<void>;\n\n  measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator<ICoreBrowserService>('CoreBrowserService');\nexport interface ICoreBrowserService {\n  serviceBrand: undefined;\n\n  readonly isFocused: boolean;\n\n  readonly onDprChange: IEvent<number>;\n  readonly onWindowChange: IEvent<Window & typeof globalThis>;\n\n  /**\n   * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n   * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n   * the window hosting the xterm.js instance changes.\n   */\n  window: Window & typeof globalThis;\n  /**\n   * The document of the primary window to be used to create elements when working with multiple\n   * windows. This is defined by the documentOverride setting.\n   */\n  readonly mainDocument: Document;\n  /**\n   * Helper for getting the devicePixelRatio of the parent window.\n   */\n  readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator<IMouseCoordsService>('MouseCoordsService');\nexport interface IMouseCoordsService {\n  serviceBrand: undefined;\n\n  getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n  getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator<IMouseService>('MouseService');\nexport interface IMouseService {\n  serviceBrand: undefined;\n\n  bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n  reset(): void;\n}\nexport interface IMouseServiceTarget {\n  element: HTMLElement;\n  screenElement: HTMLElement;\n  document: Document;\n  handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator<IRenderService>('RenderService');\nexport interface IRenderService extends IDisposable {\n  serviceBrand: undefined;\n\n  onDimensionsChange: IEvent<IRenderDimensions>;\n  /**\n   * Fires when buffer changes are rendered. This does not fire when only cursor\n   * or selections are rendered.\n   */\n  onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n  /**\n   * Fires on render\n   */\n  onRender: IEvent<{ start: number, end: number }>;\n  onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n  dimensions: IRenderDimensions;\n\n  addRefreshCallback(callback: FrameRequestCallback): number;\n\n  refreshRows(start: number, end: number, sync?: boolean): void;\n  clearTextureAtlas(): void;\n  resize(cols: number, rows: number): void;\n  hasRenderer(): boolean;\n  setRenderer(renderer: IRenderer): void;\n  handleDevicePixelRatioChange(): void;\n  handleResize(cols: number, rows: number): void;\n  handleCharSizeChanged(): void;\n  handleBlur(): void;\n  handleFocus(): void;\n  handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n  handleCursorMove(): void;\n  clear(): void;\n}\n\nexport const ISelectionService = createDecorator<ISelectionService>('SelectionService');\nexport interface ISelectionService {\n  serviceBrand: undefined;\n\n  readonly selectionText: string;\n  readonly hasSelection: boolean;\n  readonly selectionStart: [number, number] | undefined;\n  readonly selectionEnd: [number, number] | undefined;\n\n  readonly onLinuxMouseSelection: IEvent<string>;\n  readonly onRequestRedraw: IEvent<ISelectionRequestRedrawEvent>;\n  readonly onRequestScrollLines: IEvent<ISelectionRequestScrollLinesEvent>;\n  readonly onSelectionChange: IEvent<void>;\n\n  disable(): void;\n  enable(): void;\n  reset(): void;\n  setSelection(row: number, col: number, length: number): void;\n  selectAll(): void;\n  selectLines(start: number, end: number): void;\n  clearSelection(): void;\n  rightClickSelect(event: MouseEvent): void;\n  shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n  shouldForceSelection(event: MouseEvent): boolean;\n  refresh(isLinuxMouseSelection?: boolean): void;\n  handleMouseDown(event: MouseEvent): void;\n  isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator<ICharacterJoinerService>('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n  serviceBrand: undefined;\n\n  register(handler: (text: string) => [number, number][]): number;\n  deregister(joinerId: number): boolean;\n  getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator<IThemeService>('ThemeService');\nexport interface IThemeService {\n  serviceBrand: undefined;\n\n  readonly colors: ReadonlyColorSet;\n\n  readonly onChangeColors: IEvent<ReadonlyColorSet>;\n\n  restoreColor(slot?: AllColorIndex): void;\n  /**\n   * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n   * prevent accidental writes.\n   */\n  modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator<ILinkProviderService>('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n  serviceBrand: undefined;\n  readonly linkProviders: ReadonlyArray<ILinkProvider>;\n  registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n  provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator<IKeyboardService>('KeyboardService');\nexport interface IKeyboardService {\n  serviceBrand: undefined;\n  evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n  evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n  readonly useKitty: boolean;\n  readonly useWin32InputMode: boolean;\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n  dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n  return { dispose: fn };\n}\n\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(disposable: T | undefined): T | undefined;\nexport function dispose<T extends IDisposable>(disposables: T[]): T[];\nexport function dispose<T extends IDisposable>(arg: T | T[] | undefined): T | T[] | undefined {\n  if (!arg) {\n    return arg;\n  }\n  if (Array.isArray(arg)) {\n    for (const d of arg) {\n      d.dispose();\n    }\n    return [];\n  }\n  arg.dispose();\n  return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n  return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n  private readonly _disposables = new Set<IDisposable>();\n  private _isDisposed = false;\n\n  public get isDisposed(): boolean {\n    return this._isDisposed;\n  }\n\n  public add<T extends IDisposable>(o: T): T {\n    if (this._isDisposed) {\n      o.dispose();\n    } else {\n      this._disposables.add(o);\n    }\n    return o;\n  }\n\n  public dispose(): void {\n    if (this._isDisposed) {\n      return;\n    }\n    this._isDisposed = true;\n    for (const d of this._disposables) {\n      d.dispose();\n    }\n    this._disposables.clear();\n  }\n\n  public clear(): void {\n    for (const d of this._disposables) {\n      d.dispose();\n    }\n    this._disposables.clear();\n  }\n}\n\nexport abstract class Disposable implements IDisposable {\n  public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n  protected readonly _store = new DisposableStore();\n\n  public dispose(): void {\n    this._store.dispose();\n  }\n\n  protected _register<T extends IDisposable>(o: T): T {\n    return this._store.add(o);\n  }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n  private _value: T | undefined;\n  private _isDisposed = false;\n\n  public get value(): T | undefined {\n    return this._isDisposed ? undefined : this._value;\n  }\n\n  public set value(value: T | undefined) {\n    if (this._isDisposed || value === this._value) {\n      return;\n    }\n    this._value?.dispose();\n    this._value = value;\n  }\n\n  public clear(): void {\n    this.value = undefined;\n  }\n\n  public dispose(): void {\n    this._isDisposed = true;\n    this._value?.dispose();\n    this._value = undefined;\n  }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from 'common/Lifecycle';\n\nexport function timeout(millis: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n  const timer = setTimeout(() => {\n    handler();\n    if (store) {\n      disposable.dispose();\n    }\n  }, timeout);\n  const disposable = toDisposable(() => {\n    clearTimeout(timer);\n  });\n  store?.add(disposable);\n  return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n  private _token: any = -1;\n  private _isDisposed = false;\n\n  public dispose(): void {\n    this.cancel();\n    this._isDisposed = true;\n  }\n\n  public cancel(): void {\n    if (this._token !== -1) {\n      clearTimeout(this._token);\n      this._token = -1;\n    }\n  }\n\n  public cancelAndSet(runner: () => void, timeout: number): void {\n    if (this._isDisposed) {\n      throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n    }\n    this.cancel();\n    this._token = setTimeout(() => {\n      this._token = -1;\n      runner();\n    }, timeout);\n  }\n\n  public setIfNotSet(runner: () => void, timeout: number): void {\n    if (this._isDisposed) {\n      throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n    }\n    if (this._token !== -1) {\n      return;\n    }\n    this._token = setTimeout(() => {\n      this._token = -1;\n      runner();\n    }, timeout);\n  }\n}\n\nexport class IntervalTimer implements IDisposable {\n  private _disposable: IDisposable | undefined;\n  private _isDisposed = false;\n\n  public cancel(): void {\n    this._disposable?.dispose();\n    this._disposable = undefined;\n  }\n\n  public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n    if (this._isDisposed) {\n      throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n    }\n    this.cancel();\n    const handle = context.setInterval(() => {\n      runner();\n    }, interval);\n    this._disposable = {\n      dispose: () => {\n        context.clearInterval(handle as any);\n        this._disposable = undefined;\n      }\n    };\n  }\n\n  public dispose(): void {\n    this.cancel();\n    this._isDisposed = true;\n  }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from 'common/Async';\nimport { IDisposable } from 'common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n  const candidateNode = e as Node | undefined | null;\n  if (candidateNode?.ownerDocument?.defaultView) {\n    return candidateNode.ownerDocument.defaultView;\n  }\n\n  const candidateEvent = e as UIEvent | undefined | null;\n  if (candidateEvent?.view) {\n    return candidateEvent.view;\n  }\n\n  return window;\n}\n\nclass DomListener implements IDisposable {\n  private _handler: ((e: any) => void) | null;\n  private _node: EventTarget | null;\n  private readonly _type: string;\n  private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n  constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n    this._node = node;\n    this._type = type;\n    this._handler = handler;\n    this._options = options;\n    node.addEventListener(type, handler, options);\n  }\n\n  public dispose(): void {\n    if (!this._node || !this._handler) {\n      return;\n    }\n    this._node.removeEventListener(this._type, this._handler, this._options);\n    this._node = null;\n    this._handler = null;\n  }\n}\n\nexport function addDisposableListener<K extends keyof GlobalEventHandlersEventMap>(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n  return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n  return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n  CLICK: 'click',\n  MOUSE_DOWN: 'mousedown',\n  MOUSE_OVER: 'mouseover',\n  MOUSE_LEAVE: 'mouseleave',\n  KEY_DOWN: 'keydown',\n  KEY_UP: 'keyup',\n  INPUT: 'input',\n  BLUR: 'blur',\n  FOCUS: 'focus',\n  CHANGE: 'change',\n  POINTER_DOWN: 'pointerdown',\n  POINTER_MOVE: 'pointermove',\n  POINTER_UP: 'pointerup',\n  MOUSE_WHEEL: 'wheel',\n  WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n  const bb = domNode.getBoundingClientRect();\n  const win = getWindow(domNode);\n  return {\n    left: bb.left + win.scrollX,\n    top: bb.top + win.scrollY,\n    width: bb.width,\n    height: bb.height\n  };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n  private _canceled = false;\n\n  constructor(private readonly _runner: () => void, public priority: number) {\n  }\n\n  public dispose(): void {\n    this._canceled = true;\n  }\n\n  public execute(): void {\n    if (this._canceled) {\n      return;\n    }\n    try {\n      this._runner();\n    } catch (e) {\n      console.error(e);\n    }\n  }\n\n  public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n    return b.priority - a.priority;\n  }\n}\n\ninterface IWindowAnimationFrameState {\n  next: AnimationFrameQueueItem[];\n  current: AnimationFrameQueueItem[];\n  animFrameRequested: boolean;\n  inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map<Window, IWindowAnimationFrameState>();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n  let state = animationFrameState.get(targetWindow);\n  if (!state) {\n    state = {\n      next: [],\n      current: [],\n      animFrameRequested: false,\n      inAnimationFrameRunner: false\n    };\n    animationFrameState.set(targetWindow, state);\n  }\n  return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n  const state = getAnimationFrameState(targetWindow);\n  state.animFrameRequested = false;\n\n  state.current = state.next;\n  state.next = [];\n\n  state.inAnimationFrameRunner = true;\n  while (state.current.length > 0) {\n    state.current.sort(AnimationFrameQueueItem.sort);\n    const top = state.current.shift()!;\n    top.execute();\n  }\n  state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n  const state = getAnimationFrameState(targetWindow);\n  const item = new AnimationFrameQueueItem(runner, priority);\n  state.next.push(item);\n\n  if (!state.animFrameRequested) {\n    state.animFrameRequested = true;\n    targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n  }\n\n  return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n  private readonly _defaultTarget?: Window;\n\n  constructor(node?: Node) {\n    super();\n    this._defaultTarget = node ? getWindow(node) : undefined;\n  }\n\n  public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n    super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode<T extends HTMLElement> {\n\n  private _width: string = '';\n  private _height: string = '';\n  private _top: string = '';\n  private _left: string = '';\n  private _bottom: string = '';\n  private _right: string = '';\n  private _className: string = '';\n  private _position: string = '';\n  private _layerHint: boolean = false;\n  private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n  constructor(\n    public readonly domNode: T\n  ) { }\n\n  public setWidth(_width: number | string): void {\n    const width = numberAsPixels(_width);\n    if (this._width === width) {\n      return;\n    }\n    this._width = width;\n    this.domNode.style.width = this._width;\n  }\n\n  public setHeight(_height: number | string): void {\n    const height = numberAsPixels(_height);\n    if (this._height === height) {\n      return;\n    }\n    this._height = height;\n    this.domNode.style.height = this._height;\n  }\n\n  public setTop(_top: number | string): void {\n    const top = numberAsPixels(_top);\n    if (this._top === top) {\n      return;\n    }\n    this._top = top;\n    this.domNode.style.top = this._top;\n  }\n\n  public setLeft(_left: number | string): void {\n    const left = numberAsPixels(_left);\n    if (this._left === left) {\n      return;\n    }\n    this._left = left;\n    this.domNode.style.left = this._left;\n  }\n\n  public setBottom(_bottom: number | string): void {\n    const bottom = numberAsPixels(_bottom);\n    if (this._bottom === bottom) {\n      return;\n    }\n    this._bottom = bottom;\n    this.domNode.style.bottom = this._bottom;\n  }\n\n  public setRight(_right: number | string): void {\n    const right = numberAsPixels(_right);\n    if (this._right === right) {\n      return;\n    }\n    this._right = right;\n    this.domNode.style.right = this._right;\n  }\n\n  public setClassName(className: string): void {\n    if (this._className === className) {\n      return;\n    }\n    this._className = className;\n    this.domNode.className = this._className;\n  }\n\n  public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n    this.domNode.classList.toggle(className, shouldHaveIt);\n    this._className = this.domNode.className;\n  }\n\n  public setPosition(position: string): void {\n    if (this._position === position) {\n      return;\n    }\n    this._position = position;\n    this.domNode.style.position = this._position;\n  }\n\n  public setLayerHinting(layerHint: boolean): void {\n    if (this._layerHint === layerHint) {\n      return;\n    }\n    this._layerHint = layerHint;\n    if (layerHint) {\n      this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n    } else {\n      this.domNode.style.transform = '';\n    }\n  }\n\n  public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n    if (this._contain === contain) {\n      return;\n    }\n    this._contain = contain;\n    this.domNode.style.contain = this._contain;\n  }\n\n  public setAttribute(name: string, value: string): void {\n    this.domNode.setAttribute(name, value);\n  }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n  return (typeof value === 'number' ? `${value}px` : value);\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n  userAgent: string;\n  language: string;\n  platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/<version>\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n  devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n  return 1;\n}\nexport function getSafariVersion(): number {\n  if (!isSafari) {\n    return 0;\n  }\n  const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n  if (majorVersion === null || majorVersion.length < 2) {\n    return 0;\n  }\n  return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from 'common/Platform';\n\ninterface IWindowChainElement {\n  readonly window: WeakRef<Window>;\n  readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap<Window, IWindowChainElement[] | null>();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n  if (!w.parent || w.parent === w) {\n    return null;\n  }\n\n  try {\n    const location = w.location;\n    const parentLocation = w.parent.location;\n    if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n      return null;\n    }\n  } catch {\n    return null;\n  }\n\n  return w.parent;\n}\n\nclass IframeUtils {\n\n  private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n    let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n    if (!windowChainCache) {\n      windowChainCache = [];\n      sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n      let w: Window | null = targetWindow;\n      let parent: Window | null;\n      do {\n        parent = getParentWindowIfSameOrigin(w);\n        if (parent) {\n          windowChainCache.push({\n            window: new WeakRef(w),\n            iframeElement: w.frameElement ?? null\n          });\n        } else {\n          windowChainCache.push({\n            window: new WeakRef(w),\n            iframeElement: null\n          });\n        }\n        w = parent;\n      } while (w);\n    }\n    return windowChainCache.slice(0);\n  }\n\n  public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n    if (!ancestorWindow || childWindow === ancestorWindow) {\n      return {\n        top: 0,\n        left: 0\n      };\n    }\n\n    let top = 0;\n    let left = 0;\n\n    const windowChain = this._getSameOriginWindowChain(childWindow);\n\n    for (const windowChainEl of windowChain) {\n      const windowInChain = windowChainEl.window.deref();\n      top += windowInChain?.scrollY ?? 0;\n      left += windowInChain?.scrollX ?? 0;\n\n      if (windowInChain === ancestorWindow) {\n        break;\n      }\n\n      if (!windowChainEl.iframeElement) {\n        break;\n      }\n\n      const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n      top += boundingRect.top;\n      left += boundingRect.left;\n    }\n\n    return {\n      top: top,\n      left: left\n    };\n  }\n}\n\nexport interface IMouseEvent {\n  readonly browserEvent: MouseEvent;\n  readonly leftButton: boolean;\n  readonly middleButton: boolean;\n  readonly rightButton: boolean;\n  readonly buttons: number;\n  readonly target: HTMLElement;\n  readonly detail: number;\n  readonly posx: number;\n  readonly posy: number;\n  readonly ctrlKey: boolean;\n  readonly shiftKey: boolean;\n  readonly altKey: boolean;\n  readonly metaKey: boolean;\n  readonly timestamp: number;\n\n  preventDefault(): void;\n  stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n  public readonly browserEvent: MouseEvent;\n\n  public readonly leftButton: boolean;\n  public readonly middleButton: boolean;\n  public readonly rightButton: boolean;\n  public readonly buttons: number;\n  public readonly target: HTMLElement;\n  public detail: number;\n  public readonly posx: number;\n  public readonly posy: number;\n  public readonly ctrlKey: boolean;\n  public readonly shiftKey: boolean;\n  public readonly altKey: boolean;\n  public readonly metaKey: boolean;\n  public readonly timestamp: number;\n\n  constructor(targetWindow: Window, e: MouseEvent) {\n    this.timestamp = Date.now();\n    this.browserEvent = e;\n    this.leftButton = e.button === 0;\n    this.middleButton = e.button === 1;\n    this.rightButton = e.button === 2;\n    this.buttons = e.buttons;\n\n    this.target = e.target as HTMLElement;\n\n    this.detail = e.detail ?? 1;\n    if (e.type === 'dblclick') {\n      this.detail = 2;\n    }\n    this.ctrlKey = e.ctrlKey;\n    this.shiftKey = e.shiftKey;\n    this.altKey = e.altKey;\n    this.metaKey = e.metaKey;\n\n    if (typeof e.pageX === 'number') {\n      this.posx = e.pageX;\n      this.posy = e.pageY;\n    } else {\n      this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n      this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n    }\n\n    const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n    this.posx -= iframeOffsets.left;\n    this.posy -= iframeOffsets.top;\n  }\n\n  public preventDefault(): void {\n    this.browserEvent.preventDefault();\n  }\n\n  public stopPropagation(): void {\n    this.browserEvent.stopPropagation();\n  }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n  readonly wheelDelta: number;\n  readonly wheelDeltaX: number;\n  readonly wheelDeltaY: number;\n\n  readonly deltaX: number;\n  readonly deltaY: number;\n  readonly deltaZ: number;\n  readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n  wheelDeltaY: number;\n  wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n  HORIZONTAL_AXIS: number;\n  VERTICAL_AXIS: number;\n  axis: number;\n  detail: number;\n}\n\nexport class StandardWheelEvent {\n\n  public readonly browserEvent: IMouseWheelEvent | null;\n  public readonly deltaY: number;\n  public readonly deltaX: number;\n  public readonly target: Node | null;\n\n  constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n    this.browserEvent = e ?? null;\n    this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n    this.deltaY = deltaY;\n    this.deltaX = deltaX;\n\n    let shouldFactorDPR: boolean = false;\n    if (platform.isChrome) {\n      const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n      const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1]) : 123;\n      shouldFactorDPR = chromeMajorVersion <= 122;\n    }\n\n    if (e) {\n      const e1 = e as IWebKitMouseWheelEvent as any;\n      const e2 = e as unknown as IGeckoMouseWheelEvent;\n      const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n      if (typeof e1.wheelDeltaY !== 'undefined') {\n        if (shouldFactorDPR) {\n          this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n        } else {\n          this.deltaY = e1.wheelDeltaY / 120;\n        }\n      } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n        this.deltaY = -e2.detail / 3;\n      } else if (e.type === 'wheel') {\n        const ev = e as unknown as WheelEvent;\n\n        if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n          if (platform.isFirefox && !platform.isMac) {\n            this.deltaY = -e.deltaY / 3;\n          } else {\n            this.deltaY = -e.deltaY;\n          }\n        } else {\n          this.deltaY = -e.deltaY / 40;\n        }\n      }\n\n      if (typeof e1.wheelDeltaX !== 'undefined') {\n        if (platform.isSafari && platform.isWindows) {\n          this.deltaX = -(e1.wheelDeltaX / 120);\n        } else if (shouldFactorDPR) {\n          this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n        } else {\n          this.deltaX = e1.wheelDeltaX / 120;\n        }\n      } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n        this.deltaX = -e.detail / 3;\n      } else if (e.type === 'wheel') {\n        const ev = e as unknown as WheelEvent;\n\n        if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n          if (platform.isFirefox && !platform.isMac) {\n            this.deltaX = -e.deltaX / 3;\n          } else {\n            this.deltaX = -e.deltaX;\n          }\n        } else {\n          this.deltaX = -e.deltaX / 40;\n        }\n      }\n\n      if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n        if (shouldFactorDPR) {\n          this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n        } else {\n          this.deltaY = e.wheelDelta / 120;\n        }\n      }\n    }\n  }\n\n  public preventDefault(): void {\n    this.browserEvent?.preventDefault();\n  }\n\n  public stopPropagation(): void {\n    this.browserEvent?.stopPropagation();\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from 'common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n  private readonly _hooks = new DisposableStore();\n  private _pointerMoveCallback: PointerMoveCallback | null = null;\n  private _onStopCallback: OnStopCallback | null = null;\n\n  public dispose(): void {\n    this.stopMonitoring(false);\n    this._hooks.dispose();\n  }\n\n  public stopMonitoring(invokeStopCallback: boolean): void {\n    if (!this.isMonitoring()) {\n      return;\n    }\n\n    this._hooks.clear();\n    this._pointerMoveCallback = null;\n    const onStopCallback = this._onStopCallback;\n    this._onStopCallback = null;\n\n    if (invokeStopCallback && onStopCallback) {\n      onStopCallback();\n    }\n  }\n\n  public isMonitoring(): boolean {\n    return !!this._pointerMoveCallback;\n  }\n\n  public startMonitoring(\n    initialElement: Element,\n    pointerId: number,\n    initialButtons: number,\n    pointerMoveCallback: PointerMoveCallback,\n    onStopCallback: OnStopCallback\n  ): void {\n    if (this.isMonitoring()) {\n      this.stopMonitoring(false);\n    }\n    this._pointerMoveCallback = pointerMoveCallback;\n    this._onStopCallback = onStopCallback;\n\n    let eventSource: Element | Window = initialElement;\n\n    try {\n      initialElement.setPointerCapture(pointerId);\n      this._hooks.add(toDisposable(() => {\n        try {\n          initialElement.releasePointerCapture(pointerId);\n        } catch {\n          // ignore\n        }\n      }));\n    } catch {\n      eventSource = dom.getWindow(initialElement);\n    }\n\n    this._hooks.add(dom.addDisposableListener(\n      eventSource,\n      dom.eventType.POINTER_MOVE,\n      (e) => {\n        if (e.buttons !== initialButtons) {\n          this.stopMonitoring(true);\n          return;\n        }\n\n        e.preventDefault();\n        this._pointerMoveCallback!(e);\n      }\n    ));\n\n    this._hooks.add(dom.addDisposableListener(\n      eventSource,\n      dom.eventType.POINTER_UP,\n      (e: PointerEvent) => this.stopMonitoring(true)\n    ));\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from 'common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n  protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n    this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n  }\n\n  protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n    this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n  }\n\n  protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n    this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from 'common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n  handleActivate: () => void;\n  className: string;\n  // icon: ThemeIcon;\n\n  bgWidth: number;\n  bgHeight: number;\n\n  top?: number;\n  left?: number;\n  bottom?: number;\n  right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n  private _handleActivate: () => void;\n  public bgDomNode: HTMLElement;\n  public domNode: HTMLElement;\n  private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n  private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n  private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n  constructor(opts: IScrollbarArrowOptions) {\n    super();\n    this._handleActivate = opts.handleActivate;\n\n    this.bgDomNode = document.createElement('div');\n    this.bgDomNode.className = 'xterm-arrow-background';\n    this.bgDomNode.style.position = 'absolute';\n    this.bgDomNode.style.width = opts.bgWidth + 'px';\n    this.bgDomNode.style.height = opts.bgHeight + 'px';\n    if (typeof opts.top !== 'undefined') {\n      this.bgDomNode.style.top = '0px';\n    }\n    if (typeof opts.left !== 'undefined') {\n      this.bgDomNode.style.left = '0px';\n    }\n    if (typeof opts.bottom !== 'undefined') {\n      this.bgDomNode.style.bottom = '0px';\n    }\n    if (typeof opts.right !== 'undefined') {\n      this.bgDomNode.style.right = '0px';\n    }\n\n    this.domNode = document.createElement('div');\n    this.domNode.className = opts.className;\n    // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n    this.domNode.style.position = 'absolute';\n    const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n    this.domNode.style.width = arrowSize + 'px';\n    this.domNode.style.height = arrowSize + 'px';\n    if (typeof opts.top !== 'undefined') {\n      this.domNode.style.top = opts.top + 'px';\n    }\n    if (typeof opts.left !== 'undefined') {\n      this.domNode.style.left = opts.left + 'px';\n    }\n    if (typeof opts.bottom !== 'undefined') {\n      this.domNode.style.bottom = opts.bottom + 'px';\n    }\n    if (typeof opts.right !== 'undefined') {\n      this.domNode.style.right = opts.right + 'px';\n    }\n\n    this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n    this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n    this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n    this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n    this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n  }\n\n  private _arrowPointerDown(e: PointerEvent): void {\n    if (!e.target || !(e.target instanceof Element)) {\n      return;\n    }\n    const scheduleRepeater = (): void => {\n      this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n    };\n\n    this._handleActivate();\n    this._pointerdownRepeatTimer.cancel();\n    this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n    this._pointerMoveMonitor.startMonitoring(\n      e.target,\n      e.pointerId,\n      e.buttons,\n      (pointerMoveData) => { /* Intentional empty */ },\n      () => {\n        this._pointerdownRepeatTimer.cancel();\n        this._pointerdownScheduleRepeatTimer.cancel();\n      }\n    );\n\n    e.preventDefault();\n  }\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from 'common/Lifecycle';\n\nexport interface IEvent<T> {\n  (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter<T> {\n  private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n  private _disposed = false;\n  private _event: IEvent<T> | undefined;\n\n  public get event(): IEvent<T> {\n    if (this._event) {\n      return this._event;\n    }\n    this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n      if (this._disposed) {\n        return toDisposable(() => {});\n      }\n\n      const entry = { fn: listener, thisArgs };\n      this._listeners.push(entry);\n\n      const result = toDisposable(() => {\n        const idx = this._listeners.indexOf(entry);\n        if (idx !== -1) {\n          this._listeners.splice(idx, 1);\n        }\n      });\n\n      if (disposables) {\n        if (Array.isArray(disposables)) {\n          disposables.push(result);\n        } else {\n          disposables.add(result);\n        }\n      }\n\n      return result;\n    };\n    return this._event;\n  }\n\n  public fire(event: T): void {\n    if (this._disposed) {\n      return;\n    }\n    switch (this._listeners.length) {\n      case 0: return;\n      case 1: {\n        const { fn, thisArgs } = this._listeners[0];\n        fn.call(thisArgs, event);\n        return;\n      }\n      default: {\n        // Snapshot listeners to allow modifications during iteration (2+ listeners)\n        const listeners = this._listeners.slice();\n        for (const { fn, thisArgs } of listeners) {\n          fn.call(thisArgs, event);\n        }\n      }\n    }\n  }\n\n  public dispose(): void {\n    if (this._disposed) {\n      return;\n    }\n    this._disposed = true;\n    this._listeners.length = 0;\n  }\n}\n\nexport namespace EventUtils {\n  export function forward<T>(from: IEvent<T>, to: Emitter<T>): IDisposable {\n    return from(e => to.fire(e));\n  }\n\n  export function map<I, O>(event: IEvent<I>, map: (i: I) => O): IEvent<O> {\n    return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n      return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n    };\n  }\n\n  export function any<T>(...events: IEvent<T>[]): IEvent<T>;\n  export function any(...events: IEvent<any>[]): IEvent<void>;\n  export function any<T>(...events: IEvent<T>[]): IEvent<T> {\n    return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n      const store = new DisposableStore();\n      for (const event of events) {\n        store.add(event(e => listener.call(thisArgs, e)));\n      }\n      if (disposables) {\n        if (Array.isArray(disposables)) {\n          disposables.push(store);\n        } else {\n          disposables.add(store);\n        }\n      }\n      return store;\n    };\n  }\n\n  export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T) => void, initial: T): IDisposable;\n  export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void): IDisposable;\n  export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n    handler(initial);\n    return event(e => handler(e));\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from 'common/Event';\nimport { Disposable, IDisposable } from 'common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n  AUTO = 1,\n  HIDDEN = 2,\n  VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n  inSmoothScrolling: boolean;\n\n  oldWidth: number;\n  oldScrollWidth: number;\n  oldScrollLeft: number;\n\n  width: number;\n  scrollWidth: number;\n  scrollLeft: number;\n\n  oldHeight: number;\n  oldScrollHeight: number;\n  oldScrollTop: number;\n\n  height: number;\n  scrollHeight: number;\n  scrollTop: number;\n\n  widthChanged: boolean;\n  scrollWidthChanged: boolean;\n  scrollLeftChanged: boolean;\n\n  heightChanged: boolean;\n  scrollHeightChanged: boolean;\n  scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n  private _scrollStateBrand: void = undefined;\n\n  public readonly rawScrollLeft: number;\n  public readonly rawScrollTop: number;\n\n  public readonly width: number;\n  public readonly scrollWidth: number;\n  public readonly scrollLeft: number;\n  public readonly height: number;\n  public readonly scrollHeight: number;\n  public readonly scrollTop: number;\n\n  constructor(\n    private readonly _forceIntegerValues: boolean,\n    width: number,\n    scrollWidth: number,\n    scrollLeft: number,\n    height: number,\n    scrollHeight: number,\n    scrollTop: number\n  ) {\n    if (this._forceIntegerValues) {\n      width = width | 0;\n      scrollWidth = scrollWidth | 0;\n      scrollLeft = scrollLeft | 0;\n      height = height | 0;\n      scrollHeight = scrollHeight | 0;\n      scrollTop = scrollTop | 0;\n    }\n\n    this.rawScrollLeft = scrollLeft;\n    this.rawScrollTop = scrollTop;\n\n    if (width < 0) {\n      width = 0;\n    }\n    if (scrollLeft + width > scrollWidth) {\n      scrollLeft = scrollWidth - width;\n    }\n    if (scrollLeft < 0) {\n      scrollLeft = 0;\n    }\n\n    if (height < 0) {\n      height = 0;\n    }\n    if (scrollTop + height > scrollHeight) {\n      scrollTop = scrollHeight - height;\n    }\n    if (scrollTop < 0) {\n      scrollTop = 0;\n    }\n\n    this.width = width;\n    this.scrollWidth = scrollWidth;\n    this.scrollLeft = scrollLeft;\n    this.height = height;\n    this.scrollHeight = scrollHeight;\n    this.scrollTop = scrollTop;\n  }\n\n  public equals(other: ScrollState): boolean {\n    return (\n      this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n    );\n  }\n\n  public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n    return new ScrollState(\n      this._forceIntegerValues,\n      (typeof update.width !== 'undefined' ? update.width : this.width),\n      (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n      useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n      (typeof update.height !== 'undefined' ? update.height : this.height),\n      (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n      useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n    );\n  }\n\n  public withScrollPosition(update: INewScrollPosition): ScrollState {\n    return new ScrollState(\n      this._forceIntegerValues,\n      this.width,\n      this.scrollWidth,\n      (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n      this.height,\n      this.scrollHeight,\n      (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n    );\n  }\n\n  public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n    const widthChanged = (this.width !== previous.width);\n    const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n    const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n    const heightChanged = (this.height !== previous.height);\n    const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n    const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n    return {\n      inSmoothScrolling: inSmoothScrolling,\n      oldWidth: previous.width,\n      oldScrollWidth: previous.scrollWidth,\n      oldScrollLeft: previous.scrollLeft,\n\n      width: this.width,\n      scrollWidth: this.scrollWidth,\n      scrollLeft: this.scrollLeft,\n\n      oldHeight: previous.height,\n      oldScrollHeight: previous.scrollHeight,\n      oldScrollTop: previous.scrollTop,\n\n      height: this.height,\n      scrollHeight: this.scrollHeight,\n      scrollTop: this.scrollTop,\n\n      widthChanged: widthChanged,\n      scrollWidthChanged: scrollWidthChanged,\n      scrollLeftChanged: scrollLeftChanged,\n\n      heightChanged: heightChanged,\n      scrollHeightChanged: scrollHeightChanged,\n      scrollTopChanged: scrollTopChanged,\n    };\n  }\n\n}\n\nexport interface IScrollDimensions {\n  readonly width: number;\n  readonly scrollWidth: number;\n  readonly height: number;\n  readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n  width?: number;\n  scrollWidth?: number;\n  height?: number;\n  scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n  readonly scrollLeft: number;\n  readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n  readonly scrollLeft: number;\n  readonly scrollTop: number;\n\n  readonly width: number;\n  readonly height: number;\n}\nexport interface INewScrollPosition {\n  scrollLeft?: number;\n  scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n  forceIntegerValues: boolean;\n  smoothScrollDuration: number;\n  scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n  private _scrollableBrand: void = undefined;\n\n  private _smoothScrollDuration: number;\n  private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n  private _state: ScrollState;\n  private _smoothScrolling: SmoothScrollingOperation | null;\n\n  private _onScroll = this._register(new Emitter<IScrollEvent>());\n  public readonly onScroll: IEvent<IScrollEvent> = this._onScroll.event;\n\n  constructor(options: IScrollableOptions) {\n    super();\n\n    this._smoothScrollDuration = options.smoothScrollDuration;\n    this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n    this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n    this._smoothScrolling = null;\n  }\n\n  public override dispose(): void {\n    if (this._smoothScrolling) {\n      this._smoothScrolling.dispose();\n      this._smoothScrolling = null;\n    }\n    super.dispose();\n  }\n\n  public setSmoothScrollDuration(smoothScrollDuration: number): void {\n    this._smoothScrollDuration = smoothScrollDuration;\n  }\n\n  public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n    return this._state.withScrollPosition(scrollPosition);\n  }\n\n  public getScrollDimensions(): IScrollDimensions {\n    return this._state;\n  }\n\n  public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n    const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n    this._setState(newState, Boolean(this._smoothScrolling));\n\n    this._smoothScrolling?.acceptScrollDimensions(this._state);\n  }\n\n  public getFutureScrollPosition(): IScrollPosition {\n    if (this._smoothScrolling) {\n      return this._smoothScrolling.to;\n    }\n    return this._state;\n  }\n\n  public getCurrentScrollPosition(): IScrollPosition {\n    return this._state;\n  }\n\n  public setScrollPositionNow(update: INewScrollPosition): void {\n    const newState = this._state.withScrollPosition(update);\n\n    if (this._smoothScrolling) {\n      this._smoothScrolling.dispose();\n      this._smoothScrolling = null;\n    }\n\n    this._setState(newState, false);\n  }\n\n  public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n    if (this._smoothScrollDuration === 0) {\n      this.setScrollPositionNow(update); return;\n    }\n\n    if (this._smoothScrolling) {\n      update = {\n        scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n        scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n      };\n\n      const validTarget = this._state.withScrollPosition(update);\n\n      if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n        return;\n      }\n      let newSmoothScrolling: SmoothScrollingOperation;\n      if (reuseAnimation) {\n        newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n      } else {\n        newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n      }\n      this._smoothScrolling.dispose();\n      this._smoothScrolling = newSmoothScrolling;\n    } else {\n      const validTarget = this._state.withScrollPosition(update);\n\n      this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n    }\n\n    this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n      if (!this._smoothScrolling) {\n        return;\n      }\n      this._smoothScrolling.animationFrameDisposable = null;\n      this._performSmoothScrolling();\n    });\n  }\n\n  public hasPendingScrollAnimation(): boolean {\n    return Boolean(this._smoothScrolling);\n  }\n\n  private _performSmoothScrolling(): void {\n    if (!this._smoothScrolling) {\n      return;\n    }\n    const update = this._smoothScrolling.tick();\n    const newState = this._state.withScrollPosition(update);\n\n    this._setState(newState, true);\n\n    if (!this._smoothScrolling) {\n      return;\n    }\n\n    if (update.isDone) {\n      this._smoothScrolling.dispose();\n      this._smoothScrolling = null;\n      return;\n    }\n\n    this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n      if (!this._smoothScrolling) {\n        return;\n      }\n      this._smoothScrolling.animationFrameDisposable = null;\n      this._performSmoothScrolling();\n    });\n  }\n\n  private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n    const oldState = this._state;\n    if (oldState.equals(newState)) {\n      return;\n    }\n    this._state = newState;\n    this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n  }\n}\n\nclass SmoothScrollingUpdate {\n\n  public readonly scrollLeft: number;\n  public readonly scrollTop: number;\n  public readonly isDone: boolean;\n\n  constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n    this.scrollLeft = scrollLeft;\n    this.scrollTop = scrollTop;\n    this.isDone = isDone;\n  }\n\n}\n\ninterface IAnimation {\n  (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n  const delta = to - from;\n  return function (completion: number): number {\n    return from + delta * easeOutCubic(completion);\n  };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n  return function (completion: number): number {\n    if (completion < cut) {\n      return a(completion / cut);\n    }\n    return b((completion - cut) / (1 - cut));\n  };\n}\n\nclass SmoothScrollingOperation {\n\n  public readonly from: ISmoothScrollPosition;\n  public to: ISmoothScrollPosition;\n  public readonly duration: number;\n  public readonly startTime: number;\n  public animationFrameDisposable: IDisposable | null;\n\n  private _scrollLeft!: IAnimation;\n  private _scrollTop!: IAnimation;\n\n  constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n    this.from = from;\n    this.to = to;\n    this.duration = duration;\n    this.startTime = startTime;\n\n    this.animationFrameDisposable = null;\n\n    this._initAnimations();\n  }\n\n  private _initAnimations(): void {\n    this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n    this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n  }\n\n  private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n    const delta = Math.abs(from - to);\n    if (delta > 2.5 * viewportSize) {\n      let stop1: number; let stop2: number;\n      if (from < to) {\n        stop1 = from + 0.75 * viewportSize;\n        stop2 = to - 0.75 * viewportSize;\n      } else {\n        stop1 = from - 0.75 * viewportSize;\n        stop2 = to + 0.75 * viewportSize;\n      }\n      return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n    }\n    return createEaseOutCubic(from, to);\n  }\n\n  public dispose(): void {\n    if (this.animationFrameDisposable !== null) {\n      this.animationFrameDisposable.dispose();\n      this.animationFrameDisposable = null;\n    }\n  }\n\n  public acceptScrollDimensions(state: ScrollState): void {\n    this.to = state.withScrollPosition(this.to);\n    this._initAnimations();\n  }\n\n  public tick(): SmoothScrollingUpdate {\n    return this._tick(Date.now());\n  }\n\n  protected _tick(now: number): SmoothScrollingUpdate {\n    const completion = (now - this.startTime) / this.duration;\n\n    if (completion < 1) {\n      const newScrollLeft = this._scrollLeft(completion);\n      const newScrollTop = this._scrollTop(completion);\n      return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n    }\n\n    return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n  }\n\n  public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n    duration = duration + 10;\n    const startTime = Date.now() - 10;\n\n    return new SmoothScrollingOperation(from, to, startTime, duration);\n  }\n}\n\nfunction easeInCubic(t: number): number {\n  return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n  return 1 - easeInCubic(1 - t);\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from 'common/Async';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n  private _visibility: ScrollbarVisibility;\n  private _visibleClassName: string;\n  private _invisibleClassName: string;\n  private _domNode: FastDomNode<HTMLElement> | null;\n  private _rawShouldBeVisible: boolean;\n  private _shouldBeVisible: boolean;\n  private _isNeeded: boolean;\n  private _isVisible: boolean;\n  private _revealTimer: TimeoutTimer;\n\n  constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n    super();\n    this._visibility = visibility;\n    this._visibleClassName = visibleClassName;\n    this._invisibleClassName = invisibleClassName;\n    this._domNode = null;\n    this._isVisible = false;\n    this._isNeeded = false;\n    this._rawShouldBeVisible = false;\n    this._shouldBeVisible = false;\n    this._revealTimer = this._register(new TimeoutTimer());\n  }\n\n  public setVisibility(visibility: ScrollbarVisibility): void {\n    if (this._visibility !== visibility) {\n      this._visibility = visibility;\n      this._updateShouldBeVisible();\n    }\n  }\n\n  public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n    this._rawShouldBeVisible = rawShouldBeVisible;\n    this._updateShouldBeVisible();\n  }\n\n  private _applyVisibilitySetting(): boolean {\n    if (this._visibility === ScrollbarVisibility.HIDDEN) {\n      return false;\n    }\n    if (this._visibility === ScrollbarVisibility.VISIBLE) {\n      return true;\n    }\n    return this._rawShouldBeVisible;\n  }\n\n  private _updateShouldBeVisible(): void {\n    const shouldBeVisible = this._applyVisibilitySetting();\n\n    if (this._shouldBeVisible !== shouldBeVisible) {\n      this._shouldBeVisible = shouldBeVisible;\n      this.ensureVisibility();\n    }\n  }\n\n  public setIsNeeded(isNeeded: boolean): void {\n    if (this._isNeeded !== isNeeded) {\n      this._isNeeded = isNeeded;\n      this.ensureVisibility();\n    }\n  }\n\n  public setDomNode(domNode: FastDomNode<HTMLElement>): void {\n    this._domNode = domNode;\n    this._domNode.setClassName(this._invisibleClassName);\n\n    this.setShouldBeVisible(false);\n  }\n\n  public ensureVisibility(): void {\n\n    if (!this._isNeeded) {\n      this._hide(false);\n      return;\n    }\n\n    if (this._shouldBeVisible) {\n      this._reveal();\n    } else {\n      this._hide(true);\n    }\n  }\n\n  private _reveal(): void {\n    if (this._isVisible) {\n      return;\n    }\n    this._isVisible = true;\n\n    this._revealTimer.setIfNotSet(() => {\n      this._domNode?.setClassName(this._visibleClassName);\n    }, 0);\n  }\n\n  private _hide(withFadeAway: boolean): void {\n    this._revealTimer.cancel();\n    if (!this._isVisible) {\n      return;\n    }\n    this._isVisible = false;\n    this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from 'common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n  buttons: number;\n  pageX: number;\n  pageY: number;\n}\n\nexport interface IScrollbarHost {\n  handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n  handleDragStart(): void;\n  handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n  lazyRender: boolean;\n  host: IScrollbarHost;\n  scrollbarState: ScrollbarState;\n  visibility: ScrollbarVisibility;\n  extraScrollbarClassName: string;\n  scrollable: Scrollable;\n  scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n  protected _host: IScrollbarHost;\n  protected _scrollable: Scrollable;\n  protected _scrollByPage: boolean;\n  private _lazyRender: boolean;\n  protected _scrollbarState: ScrollbarState;\n  protected _visibilityController: ScrollbarVisibilityController;\n  private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n  public domNode: FastDomNode<HTMLElement>;\n  public slider!: FastDomNode<HTMLElement>;\n\n  protected _shouldRender: boolean;\n\n  constructor(opts: IAbstractScrollbarOptions) {\n    super();\n    this._lazyRender = opts.lazyRender;\n    this._host = opts.host;\n    this._scrollable = opts.scrollable;\n    this._scrollByPage = opts.scrollByPage;\n    this._scrollbarState = opts.scrollbarState;\n    this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n    this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n    this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n    this._shouldRender = true;\n    this.domNode = new FastDomNode(document.createElement('div'));\n    this.domNode.setAttribute('role', 'presentation');\n    this.domNode.setAttribute('aria-hidden', 'true');\n\n    this._visibilityController.setDomNode(this.domNode);\n    this.domNode.setPosition('absolute');\n\n    this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n  }\n\n  // ----------------- creation\n\n  /**\n   * Creates the dom node for an arrow & adds it to the container\n   */\n  protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n    const arrow = this._register(new ScrollbarArrow(opts));\n    this.domNode.domNode.appendChild(arrow.bgDomNode);\n    this.domNode.domNode.appendChild(arrow.domNode);\n    return arrow;\n  }\n\n  /**\n   * Creates the slider dom node, adds it to the container & hooks up the events\n   */\n  protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n    this.slider = new FastDomNode(document.createElement('div'));\n    this.slider.setClassName('xterm-slider');\n    this.slider.setPosition('absolute');\n    this.slider.setTop(top);\n    this.slider.setLeft(left);\n    if (typeof width === 'number') {\n      this.slider.setWidth(width);\n    }\n    if (typeof height === 'number') {\n      this.slider.setHeight(height);\n    }\n    this.slider.setLayerHinting(true);\n    this.slider.setContain('strict');\n\n    this.domNode.domNode.appendChild(this.slider.domNode);\n\n    this._register(dom.addDisposableListener(\n      this.slider.domNode,\n      dom.eventType.POINTER_DOWN,\n      (e: PointerEvent) => {\n        if (e.button === 0) {\n          e.preventDefault();\n          this._sliderPointerDown(e);\n        }\n      }\n    ));\n\n    this._onclick(this.slider.domNode, e => {\n      if (e.leftButton) {\n        e.stopPropagation();\n      }\n    });\n  }\n\n  // ----------------- Update state\n\n  protected _handleElementSize(visibleSize: number): boolean {\n    if (this._scrollbarState.setVisibleSize(visibleSize)) {\n      this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n      this._shouldRender = true;\n      if (!this._lazyRender) {\n        this.render();\n      }\n    }\n    return this._shouldRender;\n  }\n\n  protected _handleElementScrollSize(elementScrollSize: number): boolean {\n    if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n      this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n      this._shouldRender = true;\n      if (!this._lazyRender) {\n        this.render();\n      }\n    }\n    return this._shouldRender;\n  }\n\n  protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n    if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n      this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n      this._shouldRender = true;\n      if (!this._lazyRender) {\n        this.render();\n      }\n    }\n    return this._shouldRender;\n  }\n\n  // ----------------- rendering\n\n  public beginReveal(): void {\n    this._visibilityController.setShouldBeVisible(true);\n  }\n\n  public beginHide(): void {\n    this._visibilityController.setShouldBeVisible(false);\n  }\n\n  public render(): void {\n    if (!this._shouldRender) {\n      return;\n    }\n    this._shouldRender = false;\n\n    this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n    this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n  }\n  // ----------------- DOM events\n\n  private _domNodePointerDown(e: PointerEvent): void {\n    if (e.target !== this.domNode.domNode) {\n      return;\n    }\n    this._handlePointerDown(e);\n  }\n\n  public delegatePointerDown(e: PointerEvent): void {\n    const domTop = this.domNode.domNode.getClientRects()[0].top;\n    const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n    const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n    const pointerPos = this._sliderPointerPosition(e);\n    if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n      if (e.button === 0) {\n        e.preventDefault();\n        this._sliderPointerDown(e);\n      }\n    } else {\n      this._handlePointerDown(e);\n    }\n  }\n\n  private _handlePointerDown(e: PointerEvent): void {\n    let offsetX: number;\n    let offsetY: number;\n    if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n      offsetX = e.offsetX;\n      offsetY = e.offsetY;\n    } else {\n      const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n      offsetX = e.pageX - domNodePosition.left;\n      offsetY = e.pageY - domNodePosition.top;\n    }\n\n    const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n    this._setDesiredScrollPositionNow(\n      this._scrollByPage\n        ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n        : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n    );\n\n    if (e.button === 0) {\n      e.preventDefault();\n      this._sliderPointerDown(e);\n    }\n  }\n\n  private _sliderPointerDown(e: PointerEvent): void {\n    if (!e.target || !(e.target instanceof Element)) {\n      return;\n    }\n    const initialPointerPosition = this._sliderPointerPosition(e);\n    const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n    const initialScrollbarState = this._scrollbarState.clone();\n    this.slider.toggleClassName('xterm-active', true);\n\n    this._pointerMoveMonitor.startMonitoring(\n      e.target,\n      e.pointerId,\n      e.buttons,\n      (pointerMoveData: PointerEvent) => {\n        const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n        const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n        if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n          this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n          return;\n        }\n\n        const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n        const pointerDelta = pointerPosition - initialPointerPosition;\n        this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n      },\n      () => {\n        this.slider.toggleClassName('xterm-active', false);\n        this._host.handleDragEnd();\n      }\n    );\n\n    this._host.handleDragStart();\n  }\n\n  private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n    const desiredScrollPosition: INewScrollPosition = {};\n    this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n    this._scrollable.setScrollPositionNow(desiredScrollPosition);\n  }\n\n  public updateScrollbarSize(scrollbarSize: number): void {\n    this._updateScrollbarSize(scrollbarSize);\n    this._scrollbarState.setScrollbarSize(scrollbarSize);\n    this._shouldRender = true;\n    if (!this._lazyRender) {\n      this.render();\n    }\n  }\n\n  public isNeeded(): boolean {\n    return this._scrollbarState.isNeeded();\n  }\n\n  // ----------------- Overwrite these\n\n  protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n  protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n  protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n  protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n  protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n  protected abstract _updateScrollbarSize(size: number): void;\n\n  public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n  computedAvailableSize: number;\n  computedIsNeeded: boolean;\n  computedSliderSize: number;\n  computedSliderRatio: number;\n  computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n  /**\n   * For the vertical scrollbar: the width.\n   * For the horizontal scrollbar: the height.\n   */\n  private _scrollbarSize: number;\n\n  /**\n   * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n   * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n   */\n  private _oppositeScrollbarSize: number;\n\n  /**\n   * For the vertical scrollbar: the height of the scrollbar's arrows.\n   * For the horizontal scrollbar: the width of the scrollbar's arrows.\n   */\n  private _arrowSize: number;\n\n  // --- variables\n  /**\n   * For the vertical scrollbar: the viewport height.\n   * For the horizontal scrollbar: the viewport width.\n   */\n  private _visibleSize: number;\n\n  /**\n   * For the vertical scrollbar: the scroll height.\n   * For the horizontal scrollbar: the scroll width.\n   */\n  private _scrollSize: number;\n\n  /**\n   * For the vertical scrollbar: the scroll top.\n   * For the horizontal scrollbar: the scroll left.\n   */\n  private _scrollPosition: number;\n\n  // --- computed variables\n\n  /**\n   * `visibleSize` - `oppositeScrollbarSize`\n   */\n  private _computedAvailableSize: number;\n  /**\n   * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n   */\n  private _computedIsNeeded: boolean;\n\n  private _computedSliderSize: number;\n  private _computedSliderRatio: number;\n  private _computedSliderPosition: number;\n\n  constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n    this._scrollbarSize = Math.round(scrollbarSize);\n    this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n    this._arrowSize = Math.round(arrowSize);\n\n    this._visibleSize = visibleSize;\n    this._scrollSize = scrollSize;\n    this._scrollPosition = scrollPosition;\n\n    this._computedAvailableSize = 0;\n    this._computedIsNeeded = false;\n    this._computedSliderSize = 0;\n    this._computedSliderRatio = 0;\n    this._computedSliderPosition = 0;\n\n    this._refreshComputedValues();\n  }\n\n  public clone(): ScrollbarState {\n    return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n  }\n\n  public setVisibleSize(visibleSize: number): boolean {\n    const iVisibleSize = Math.round(visibleSize);\n    if (this._visibleSize !== iVisibleSize) {\n      this._visibleSize = iVisibleSize;\n      this._refreshComputedValues();\n      return true;\n    }\n    return false;\n  }\n\n  public setScrollSize(scrollSize: number): boolean {\n    const iScrollSize = Math.round(scrollSize);\n    if (this._scrollSize !== iScrollSize) {\n      this._scrollSize = iScrollSize;\n      this._refreshComputedValues();\n      return true;\n    }\n    return false;\n  }\n\n  public setScrollPosition(scrollPosition: number): boolean {\n    const iScrollPosition = Math.round(scrollPosition);\n    if (this._scrollPosition !== iScrollPosition) {\n      this._scrollPosition = iScrollPosition;\n      this._refreshComputedValues();\n      return true;\n    }\n    return false;\n  }\n\n  public setScrollbarSize(scrollbarSize: number): void {\n    this._scrollbarSize = Math.round(scrollbarSize);\n  }\n\n  public setArrowSize(arrowSize: number): void {\n    const iArrowSize = Math.round(arrowSize);\n    if (this._arrowSize !== iArrowSize) {\n      this._arrowSize = iArrowSize;\n      this._refreshComputedValues();\n    }\n  }\n\n  public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n    this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n  }\n\n  private static _computeValues(\n    oppositeScrollbarSize: number,\n    arrowSize: number,\n    visibleSize: number,\n    scrollSize: number,\n    scrollPosition: number\n  ): IScrollbarStateComputedValues {\n    const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n    const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n    const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n    if (!computedIsNeeded) {\n      return {\n        computedAvailableSize: Math.round(computedAvailableSize),\n        computedIsNeeded: computedIsNeeded,\n        computedSliderSize: Math.round(computedRepresentableSize),\n        computedSliderRatio: 0,\n        computedSliderPosition: 0,\n      };\n    }\n\n    const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n    const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n    const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n    return {\n      computedAvailableSize: Math.round(computedAvailableSize),\n      computedIsNeeded: computedIsNeeded,\n      computedSliderSize: Math.round(computedSliderSize),\n      computedSliderRatio: computedSliderRatio,\n      computedSliderPosition: Math.round(computedSliderPosition),\n    };\n  }\n\n  private _refreshComputedValues(): void {\n    const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n    this._computedAvailableSize = r.computedAvailableSize;\n    this._computedIsNeeded = r.computedIsNeeded;\n    this._computedSliderSize = r.computedSliderSize;\n    this._computedSliderRatio = r.computedSliderRatio;\n    this._computedSliderPosition = r.computedSliderPosition;\n  }\n\n  public getArrowSize(): number {\n    return this._arrowSize;\n  }\n\n  public getScrollPosition(): number {\n    return this._scrollPosition;\n  }\n\n  public getRectangleLargeSize(): number {\n    return this._computedAvailableSize;\n  }\n\n  public getRectangleSmallSize(): number {\n    return this._scrollbarSize;\n  }\n\n  public isNeeded(): boolean {\n    return this._computedIsNeeded;\n  }\n\n  public getSliderSize(): number {\n    return this._computedSliderSize;\n  }\n\n  public getSliderPosition(): number {\n    return this._computedSliderPosition;\n  }\n\n  public getDesiredScrollPositionFromOffset(offset: number): number {\n    if (!this._computedIsNeeded) {\n      return 0;\n    }\n\n    const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n    return Math.round(desiredSliderPosition / this._computedSliderRatio);\n  }\n\n  public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n    if (!this._computedIsNeeded) {\n      return 0;\n    }\n\n    const correctedOffset = offset - this._arrowSize;\n    let desiredScrollPosition = this._scrollPosition;\n    if (correctedOffset < this._computedSliderPosition) {\n      desiredScrollPosition -= this._visibleSize;\n    } else {\n      desiredScrollPosition += this._visibleSize;\n    }\n    return desiredScrollPosition;\n  }\n\n  public getDesiredScrollPositionFromDelta(delta: number): number {\n    if (!this._computedIsNeeded) {\n      return 0;\n    }\n\n    const desiredSliderPosition = this._computedSliderPosition + delta;\n    return Math.round(desiredSliderPosition / this._computedSliderRatio);\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n  constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n    const scrollDimensions = scrollable.getScrollDimensions();\n    const scrollPosition = scrollable.getCurrentScrollPosition();\n    super({\n      lazyRender: options.lazyRender,\n      host: host,\n      scrollbarState: new ScrollbarState(\n        (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n        (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n        (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n        scrollDimensions.width,\n        scrollDimensions.scrollWidth,\n        scrollPosition.scrollLeft\n      ),\n      visibility: options.horizontal,\n      extraScrollbarClassName: 'xterm-horizontal',\n      scrollable: scrollable,\n      scrollByPage: options.scrollByPage\n    });\n\n    if (options.horizontalHasArrows) {\n      throw new Error('horizontalHasArrows is not supported in xterm.js');\n    }\n\n    this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n  }\n\n  protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n    this.slider.setWidth(sliderSize);\n    this.slider.setLeft(sliderPosition);\n  }\n\n  protected _renderDomNode(largeSize: number, smallSize: number): void {\n    this.domNode.setWidth(largeSize);\n    this.domNode.setHeight(smallSize);\n    this.domNode.setLeft(0);\n    this.domNode.setBottom(0);\n  }\n\n  public handleScroll(e: IScrollEvent): boolean {\n    this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n    this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n    this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n    return this._shouldRender;\n  }\n\n  protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n    return offsetX;\n  }\n\n  protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n    return e.pageX;\n  }\n\n  protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n    return e.pageY;\n  }\n\n  protected _updateScrollbarSize(size: number): void {\n    this.slider.setHeight(size);\n  }\n\n  public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n    target.scrollLeft = scrollPosition;\n  }\n\n  public updateOptions(options: IScrollableElementResolvedOptions): void {\n    this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n    this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n    this._visibilityController.setVisibility(options.horizontal);\n    this._scrollByPage = options.scrollByPage;\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n  private _arrowUp: ScrollbarArrow | undefined;\n  private _arrowDown: ScrollbarArrow | undefined;\n  private _arrowScrollDelta: number = 0;\n\n  constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n    const scrollDimensions = scrollable.getScrollDimensions();\n    const scrollPosition = scrollable.getCurrentScrollPosition();\n    const hasArrows = options.verticalHasArrows;\n    super({\n      lazyRender: options.lazyRender,\n      host: host,\n      scrollbarState: new ScrollbarState(\n        (hasArrows ? options.verticalScrollbarSize : 0),\n        (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n        0,\n        scrollDimensions.height,\n        scrollDimensions.scrollHeight,\n        scrollPosition.scrollTop\n      ),\n      visibility: options.vertical,\n      extraScrollbarClassName: 'xterm-vertical',\n      scrollable: scrollable,\n      scrollByPage: options.scrollByPage\n    });\n\n    this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n    this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n  }\n\n  protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n    this.slider.setHeight(sliderSize);\n    this.slider.setTop(sliderPosition);\n  }\n\n  protected _renderDomNode(largeSize: number, smallSize: number): void {\n    this.domNode.setWidth(smallSize);\n    this.domNode.setHeight(largeSize);\n    this.domNode.setRight(0);\n    this.domNode.setTop(0);\n  }\n\n  public handleScroll(e: IScrollEvent): boolean {\n    this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n    this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n    this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n    return this._shouldRender;\n  }\n\n  protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n    return offsetY;\n  }\n\n  protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n    return e.pageY;\n  }\n\n  protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n    return e.pageX;\n  }\n\n  protected _updateScrollbarSize(size: number): void {\n    this.slider.setWidth(size);\n  }\n\n  public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n    target.scrollTop = scrollPosition;\n  }\n\n  private _arrowScroll(delta: number): void {\n    const currentPosition = this._scrollable.getCurrentScrollPosition();\n    this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n  }\n\n  private _setArrows(showArrows: boolean, size: number): void {\n    this._arrowScrollDelta = size;\n    if (!this._arrowUp || !this._arrowDown) {\n      const arrowDelta = 0;\n      this._arrowUp = this._createArrow({\n        className: 'xterm-scra xterm-arrow-up',\n        top: arrowDelta,\n        left: arrowDelta,\n        bgWidth: size,\n        bgHeight: size,\n        handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n      });\n      this._arrowDown = this._createArrow({\n        className: 'xterm-scra xterm-arrow-down',\n        bottom: arrowDelta,\n        left: arrowDelta,\n        bgWidth: size,\n        bgHeight: size,\n        handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n      });\n    }\n\n    this._updateArrowSize(this._arrowUp, size);\n    this._updateArrowSize(this._arrowDown, size);\n\n    if (!this._arrowUp || !this._arrowDown) {\n      return;\n    }\n\n    const display = showArrows ? '' : 'none';\n    this._arrowUp.bgDomNode.style.display = display;\n    this._arrowUp.domNode.style.display = display;\n    this._arrowDown.bgDomNode.style.display = display;\n    this._arrowDown.domNode.style.display = display;\n  }\n\n  private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n    if (!arrow) {\n      return;\n    }\n    arrow.bgDomNode.style.width = `${size}px`;\n    arrow.bgDomNode.style.height = `${size}px`;\n    arrow.domNode.style.width = `${size}px`;\n    arrow.domNode.style.height = `${size}px`;\n  }\n\n  public updateOptions(options: IScrollableElementResolvedOptions): void {\n    const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n    this._scrollbarState.setArrowSize(arrowSize);\n    this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n    this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n    this._scrollbarState.setOppositeScrollbarSize(0);\n    this._visibilityController.setVisibility(options.vertical);\n    this._scrollByPage = options.scrollByPage;\n  }\n\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from 'common/Async';\nimport { Emitter, IEvent } from 'common/Event';\nimport { IDisposable, dispose } from 'common/Lifecycle';\nimport * as platform from 'common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst HIDE_TIMEOUT = 500;\nconst SCROLL_WHEEL_SENSITIVITY = 50;\n\nclass MouseWheelClassifierItem {\n  public timestamp: number;\n  public deltaX: number;\n  public deltaY: number;\n  public score: number;\n\n  constructor(timestamp: number, deltaX: number, deltaY: number) {\n    this.timestamp = timestamp;\n    this.deltaX = deltaX;\n    this.deltaY = deltaY;\n    this.score = 0;\n  }\n}\n\nclass MouseWheelClassifier {\n\n  public static readonly INSTANCE = new MouseWheelClassifier();\n\n  private readonly _capacity: number;\n  private _memory: MouseWheelClassifierItem[];\n  private _front: number;\n  private _rear: number;\n\n  constructor() {\n    this._capacity = 5;\n    this._memory = [];\n    this._front = -1;\n    this._rear = -1;\n  }\n\n  public isPhysicalMouseWheel(): boolean {\n    if (this._front === -1 && this._rear === -1) {\n      return false;\n    }\n\n    let remainingInfluence = 1;\n    let score = 0;\n    let iteration = 1;\n\n    let index = this._rear;\n    while (index !== -1) {\n      const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n      remainingInfluence -= influence;\n      score += this._memory[index].score * influence;\n\n      if (index === this._front) {\n        break;\n      }\n\n      index = (this._capacity + index - 1) % this._capacity;\n      iteration++;\n    }\n\n    return (score <= 0.5);\n  }\n\n  public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n    if (platform.isChrome) {\n      const targetWindow = dom.getWindow(e.browserEvent);\n      const pageZoomFactor = platform.getZoomFactor(targetWindow);\n      this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n    } else {\n      this.accept(Date.now(), e.deltaX, e.deltaY);\n    }\n  }\n\n  public accept(timestamp: number, deltaX: number, deltaY: number): void {\n    let previousItem = null;\n    const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n    if (this._front === -1 && this._rear === -1) {\n      this._memory[0] = item;\n      this._front = 0;\n      this._rear = 0;\n    } else {\n      previousItem = this._memory[this._rear];\n\n      this._rear = (this._rear + 1) % this._capacity;\n      if (this._rear === this._front) {\n        this._front = (this._front + 1) % this._capacity;\n      }\n      this._memory[this._rear] = item;\n    }\n\n    item.score = this._computeScore(item, previousItem);\n  }\n\n  private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n    if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n      return 1;\n    }\n\n    let score: number = 0.5;\n\n    if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n      score += 0.25;\n    }\n\n    if (previousItem) {\n      const absDeltaX = Math.abs(item.deltaX);\n      const absDeltaY = Math.abs(item.deltaY);\n\n      const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n      const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n      const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n      const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n      const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n      const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n      const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n      if (isSameModulo) {\n        score -= 0.5;\n      }\n    }\n\n    return Math.min(Math.max(score, 0), 1);\n  }\n\n  private _isAlmostInt(value: number): boolean {\n    const delta = Math.abs(Math.round(value) - value);\n    return (delta < 0.01);\n  }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n  private readonly _options: IScrollableElementResolvedOptions;\n  protected readonly _scrollable: Scrollable;\n  private readonly _verticalScrollbar: VerticalScrollbar;\n  private readonly _horizontalScrollbar: HorizontalScrollbar;\n  private readonly _domNode: HTMLElement;\n\n  private readonly _leftShadowDomNode: FastDomNode<HTMLElement> | null;\n  private readonly _topShadowDomNode: FastDomNode<HTMLElement> | null;\n  private readonly _topLeftShadowDomNode: FastDomNode<HTMLElement> | null;\n\n  private readonly _listenOnDomNode: HTMLElement;\n\n  private _mouseWheelToDispose: IDisposable[];\n\n  private _isDragging: boolean;\n  private _mouseIsOver: boolean;\n\n  private readonly _hideTimeout: TimeoutTimer;\n  private _shouldRender: boolean;\n\n  private _revealOnScroll: boolean;\n\n  private readonly _onScroll = this._register(new Emitter<IScrollEvent>());\n  public readonly onScroll: IEvent<IScrollEvent> = this._onScroll.event;\n\n  public get options(): Readonly<IScrollableElementResolvedOptions> {\n    return this._options;\n  }\n\n  public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n    super();\n    options = options ?? {};\n    let resolvedScrollable: Scrollable;\n    const ownsScrollable = !scrollable;\n    if (scrollable) {\n      resolvedScrollable = scrollable;\n    } else {\n      options.mouseWheelSmoothScroll = false;\n      resolvedScrollable = new Scrollable({\n        forceIntegerValues: true,\n        smoothScrollDuration: 0,\n        scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n      });\n    }\n\n    this._options = resolveOptions(options);\n    this._scrollable = resolvedScrollable;\n\n    this._register(this._scrollable.onScroll((e) => {\n      this._handleScroll(e);\n      this._onScroll.fire(e);\n    }));\n    if (ownsScrollable) {\n      this._register(this._scrollable);\n    }\n\n    const scrollbarHost: IScrollbarHost = {\n      handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n      handleDragStart: () => this._handleDragStart(),\n      handleDragEnd: () => this._handleDragEnd(),\n    };\n    this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n    this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n    this._domNode = document.createElement('div');\n    this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n    this._domNode.setAttribute('role', 'presentation');\n    this._domNode.style.position = 'relative';\n    this._domNode.appendChild(element);\n    this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n    this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n    if (this._options.useShadows) {\n      this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n      this._leftShadowDomNode.setClassName('xterm-shadow');\n      this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n      this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n      this._topShadowDomNode.setClassName('xterm-shadow');\n      this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n      this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n      this._topLeftShadowDomNode.setClassName('xterm-shadow');\n      this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n    } else {\n      this._leftShadowDomNode = null;\n      this._topShadowDomNode = null;\n      this._topLeftShadowDomNode = null;\n    }\n\n    this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n    this._mouseWheelToDispose = [];\n    this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n    this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n    this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n    this._hideTimeout = this._register(new TimeoutTimer());\n    this._isDragging = false;\n    this._mouseIsOver = false;\n\n    this._shouldRender = true;\n\n    this._revealOnScroll = true;\n  }\n\n  public override dispose(): void {\n    this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n    super.dispose();\n  }\n\n  public getDomNode(): HTMLElement {\n    return this._domNode;\n  }\n\n  public getScrollDimensions(): IScrollDimensions {\n    return this._scrollable.getScrollDimensions();\n  }\n\n  public setScrollDimensions(dimensions: INewScrollDimensions): void {\n    this._scrollable.setScrollDimensions(dimensions, false);\n  }\n\n  public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n    if (update.reuseAnimation) {\n      this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n    } else {\n      this._scrollable.setScrollPositionNow(update);\n    }\n  }\n\n  public getScrollPosition(): IScrollPosition {\n    return this._scrollable.getCurrentScrollPosition();\n  }\n\n  public updateClassName(newClassName: string): void {\n    this._options.className = newClassName;\n    if (platform.isMac) {\n      this._options.className += ' xterm-mac';\n    }\n    this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n  }\n\n  public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n    if (typeof newOptions.handleMouseWheel !== 'undefined') {\n      this._options.handleMouseWheel = newOptions.handleMouseWheel;\n      this._setListeningToMouseWheel(this._options.handleMouseWheel);\n    }\n    if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n      this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n    }\n    if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n      this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n    }\n    if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n      this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n    }\n    if (typeof newOptions.horizontal !== 'undefined') {\n      this._options.horizontal = newOptions.horizontal;\n    }\n    if (typeof newOptions.vertical !== 'undefined') {\n      this._options.vertical = newOptions.vertical;\n    }\n    if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n      this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n    }\n    if (typeof newOptions.verticalHasArrows !== 'undefined') {\n      this._options.verticalHasArrows = newOptions.verticalHasArrows;\n    }\n    if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n      this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n    }\n    if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n      this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n    }\n    if (typeof newOptions.scrollByPage !== 'undefined') {\n      this._options.scrollByPage = newOptions.scrollByPage;\n    }\n    this._horizontalScrollbar.updateOptions(this._options);\n    this._verticalScrollbar.updateOptions(this._options);\n\n    if (!this._options.lazyRender) {\n      this._render();\n    }\n  }\n\n  public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n    this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n  }\n\n  // -------------------- mouse wheel scrolling --------------------\n\n  private _setListeningToMouseWheel(shouldListen: boolean): void {\n    const isListening = (this._mouseWheelToDispose.length > 0);\n\n    if (isListening === shouldListen) {\n      return;\n    }\n\n    this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n    if (shouldListen) {\n      const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n        this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n      };\n\n      this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n    }\n  }\n\n  private _handleMouseWheel(e: StandardWheelEvent): void {\n    if (e.browserEvent?.defaultPrevented) {\n      return;\n    }\n\n    const classifier = MouseWheelClassifier.INSTANCE;\n    classifier.acceptStandardWheelEvent(e);\n\n    let didScroll = false;\n\n    if (e.deltaY || e.deltaX) {\n      let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n      let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n      if (this._options.scrollPredominantAxis) {\n        if (this._options.scrollYToX && deltaX + deltaY === 0) {\n          deltaX = deltaY = 0;\n        } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n          deltaX = 0;\n        } else {\n          deltaY = 0;\n        }\n      }\n\n      if (this._options.flipAxes) {\n        [deltaY, deltaX] = [deltaX, deltaY];\n      }\n\n      const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n      if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n        deltaX = deltaY;\n        deltaY = 0;\n      }\n\n      if (e.browserEvent && e.browserEvent.altKey) {\n        deltaX = deltaX * this._options.fastScrollSensitivity;\n        deltaY = deltaY * this._options.fastScrollSensitivity;\n      }\n\n      const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n      let desiredScrollPosition: INewScrollPosition = {};\n      if (deltaY) {\n        const deltaScrollTop = SCROLL_WHEEL_SENSITIVITY * deltaY;\n        const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n        this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n      }\n      if (deltaX) {\n        const deltaScrollLeft = SCROLL_WHEEL_SENSITIVITY * deltaX;\n        const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n        this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n      }\n\n      desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n      if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n        const canPerformSmoothScroll = (\n          this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n        );\n\n        if (canPerformSmoothScroll) {\n          this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n        } else {\n          this._scrollable.setScrollPositionNow(desiredScrollPosition);\n        }\n\n        didScroll = true;\n      }\n    }\n\n    let consumeMouseWheel = didScroll;\n    if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n      consumeMouseWheel = true;\n    }\n    if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n      consumeMouseWheel = true;\n    }\n\n    if (consumeMouseWheel) {\n      e.preventDefault();\n      e.stopPropagation();\n    }\n  }\n\n  private _handleScroll(e: IScrollEvent): void {\n    this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n    this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n    if (this._options.useShadows) {\n      this._shouldRender = true;\n    }\n\n    if (this._revealOnScroll) {\n      this._reveal();\n    }\n\n    if (!this._options.lazyRender) {\n      this._render();\n    }\n  }\n\n  public renderNow(): void {\n    if (!this._options.lazyRender) {\n      throw new Error('Please use `lazyRender` together with `renderNow`!');\n    }\n\n    this._render();\n  }\n\n  private _render(): void {\n    if (!this._shouldRender) {\n      return;\n    }\n\n    this._shouldRender = false;\n\n    this._horizontalScrollbar.render();\n    this._verticalScrollbar.render();\n\n    if (this._options.useShadows) {\n      const scrollState = this._scrollable.getCurrentScrollPosition();\n      const enableTop = scrollState.scrollTop > 0;\n      const enableLeft = scrollState.scrollLeft > 0;\n\n      const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n      const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n      const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n      this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n      this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n      this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n    }\n  }\n\n  // -------------------- fade in / fade out --------------------\n\n  private _handleDragStart(): void {\n    this._isDragging = true;\n    this._reveal();\n  }\n\n  private _handleDragEnd(): void {\n    this._isDragging = false;\n    this._hide();\n  }\n\n  private _handleMouseLeave(e: IMouseEvent): void {\n    this._mouseIsOver = false;\n    this._hide();\n  }\n\n  private _handleMouseOver(e: IMouseEvent): void {\n    this._mouseIsOver = true;\n    this._reveal();\n  }\n\n  private _reveal(): void {\n    this._verticalScrollbar.beginReveal();\n    this._horizontalScrollbar.beginReveal();\n    this._scheduleHide();\n  }\n\n  private _hide(): void {\n    if (!this._mouseIsOver && !this._isDragging) {\n      this._verticalScrollbar.beginHide();\n      this._horizontalScrollbar.beginHide();\n    }\n  }\n\n  private _scheduleHide(): void {\n    if (!this._mouseIsOver && !this._isDragging) {\n      this._hideTimeout.cancelAndSet(() => this._hide(), HIDE_TIMEOUT);\n    }\n  }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n  const result: IScrollableElementResolvedOptions = {\n    lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n    className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n    useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n    handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n    flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n    consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n    alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n    scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n    mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n    fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n    scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n    mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n    listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n    horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n    horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n    horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n    horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n    vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n    verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n    verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n    verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n    scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n  };\n\n  result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n  result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n  if (platform.isMac) {\n    result.className += ' xterm-mac';\n  }\n\n  return result;\n}\n", "/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ViewportConstants } from 'browser/shared/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from 'common/services/Services';\nimport { CoreMouseEventType } from 'common/Types';\nimport { scheduleAtNextAnimationFrame } from 'browser/Dom';\nimport { SmoothScrollableElement } from 'browser/scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from 'browser/scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from 'common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from 'browser/scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n  protected _onRequestScrollLines = this._register(new Emitter<number>());\n  public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n  private _scrollableElement: SmoothScrollableElement;\n  private _styleElement: HTMLStyleElement;\n\n  private _queuedAnimationFrame?: number;\n  private _latestYDisp?: number;\n  private _isSyncing: boolean = false;\n  private _isHandlingScroll: boolean = false;\n  private _suppressOnScrollHandler: boolean = false;\n  private _needsSyncOnRender: boolean = false;\n\n  constructor(\n    element: HTMLElement,\n    screenElement: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IMouseStateService mouseStateService: IMouseStateService,\n    @IThemeService themeService: IThemeService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    super();\n\n    const scrollable = this._register(new Scrollable({\n      forceIntegerValues: false,\n      smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n      // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n      scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n    }));\n    this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n      scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n    }));\n\n    this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n      vertical: ScrollbarVisibility.AUTO,\n      horizontal: ScrollbarVisibility.HIDDEN,\n      useShadows: false,\n      mouseWheelSmoothScroll: true,\n      verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n      ...this._getChangeOptions()\n    }, scrollable));\n    this._register(this._optionsService.onMultipleOptionChange([\n      'scrollSensitivity',\n      'fastScrollSensitivity',\n      'scrollbar'\n    ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n    // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n    this._register(mouseStateService.onProtocolChange(type => {\n      this._scrollableElement.updateOptions({\n        handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n      });\n    }));\n\n    this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n    this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n      element.style.backgroundColor = themeService.colors.background.css;\n      this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n    }));\n    element.appendChild(this._scrollableElement.getDomNode());\n    this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n    this._styleElement = coreBrowserService.mainDocument.createElement('style');\n    screenElement.appendChild(this._styleElement);\n    this._register(toDisposable(() => this._styleElement.remove()));\n    this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n      this._styleElement.textContent = [\n        `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n        `  background: ${themeService.colors.scrollbarSliderBackground.css};`,\n        `}`,\n        `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n        `  background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n        `}`,\n        `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n        `  background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n        `}`\n      ].join('\\n');\n    }));\n\n    this._register(this._bufferService.onResize(() => this.queueSync()));\n    this._register(this._bufferService.buffers.onBufferActivate(() => {\n      // Reset _latestYDisp when switching buffers to prevent stale scroll position\n      // from alt buffer contaminating normal buffer scroll position\n      this._latestYDisp = undefined;\n      this.queueSync();\n    }));\n    this._register(this._bufferService.onScroll(() => this._sync()));\n\n    // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n    // synchronized output mode). This ensures DOM scroll position updates atomically\n    // with the canvas render.\n    this._register(this._renderService.onRender(() => {\n      if (this._needsSyncOnRender) {\n        this._needsSyncOnRender = false;\n        this._sync();\n      }\n    }));\n\n    this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n  }\n\n  public scrollLines(disp: number): void {\n    const pos = this._scrollableElement.getScrollPosition();\n    this._scrollableElement.setScrollPosition({\n      reuseAnimation: true,\n      scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n    });\n  }\n\n  public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n    if (disableSmoothScroll) {\n      this._latestYDisp = line;\n    }\n    this._scrollableElement.setScrollPosition({\n      reuseAnimation: !disableSmoothScroll,\n      scrollTop: line * this._renderService.dimensions.css.cell.height\n    });\n  }\n\n  private _getChangeOptions(): IScrollableElementChangeOptions {\n    const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n    const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n    const verticalScrollbarSize = showScrollbar\n      ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n      : 0;\n    return {\n      mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n      fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n      vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n      verticalScrollbarSize,\n      verticalHasArrows: showArrows\n    };\n  }\n\n  public queueSync(ydisp?: number): void {\n    // Update state\n    if (ydisp !== undefined) {\n      this._latestYDisp = ydisp;\n    }\n\n    // Don't queue more than one callback\n    if (this._queuedAnimationFrame !== undefined) {\n      return;\n    }\n    this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n      this._queuedAnimationFrame = undefined;\n      this._sync(this._latestYDisp);\n    });\n  }\n\n  private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n    if (!this._renderService || this._isSyncing) {\n      return;\n    }\n    // Defer DOM scroll updates during synchronized output to prevent visible\n    // scroll position flickering while the canvas content is frozen.\n    if (this._coreService.decPrivateModes.synchronizedOutput) {\n      this._needsSyncOnRender = true;\n      return;\n    }\n    this._isSyncing = true;\n\n    // Ignore any onScroll event that happens as a result of dimensions changing as this should\n    // never cause a scrollLines call, only setScrollPosition can do that.\n    this._suppressOnScrollHandler = true;\n    this._scrollableElement.setScrollDimensions({\n      height: this._renderService.dimensions.css.canvas.height,\n      scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n    });\n    this._suppressOnScrollHandler = false;\n\n    // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n    // scroll and scroll there immediately.\n    if (ydisp !== this._latestYDisp) {\n      this._scrollableElement.setScrollPosition({\n        scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n      });\n    }\n\n    this._isSyncing = false;\n  }\n\n  private _handleScroll(e: IScrollEvent): void {\n    if (!this._renderService) {\n      return;\n    }\n    if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n      return;\n    }\n    this._isHandlingScroll = true;\n    const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n    const diff = newRow - this._bufferService.buffer.ydisp;\n    if (diff !== 0) {\n      this._latestYDisp = newRow;\n      this._onRequestScrollLines.fire(diff);\n    }\n    this._isHandlingScroll = false;\n  }\n\n  public handleTouchScroll(translationY: number): void {\n    const pos = this._scrollableElement.getScrollPosition();\n    this._scrollableElement.setScrollPosition({\n      scrollTop: pos.scrollTop - translationY\n    });\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from 'common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n  private readonly _container: HTMLElement;\n  private readonly _decorationElements: Map<IInternalDecoration, HTMLElement> = new Map();\n\n  private _animationFrame: number | undefined;\n  private _altBufferIsActive: boolean = false;\n  private _dimensionsChanged: boolean = false;\n\n  constructor(\n    private readonly _screenElement: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    super();\n\n    this._container = document.createElement('div');\n    this._container.classList.add('xterm-decoration-container');\n    this._screenElement.appendChild(this._container);\n\n    this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n    this._register(this._renderService.onDimensionsChange(() => {\n      this._dimensionsChanged = true;\n      this._queueRefresh();\n    }));\n    this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n    this._register(this._bufferService.buffers.onBufferActivate(() => {\n      this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n    }));\n    this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n    this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n    this._register(toDisposable(() => {\n      this._container.remove();\n      this._decorationElements.clear();\n    }));\n  }\n\n  private _queueRefresh(): void {\n    if (this._animationFrame !== undefined) {\n      return;\n    }\n    this._animationFrame = this._renderService.addRefreshCallback(() => {\n      this._doRefreshDecorations();\n      this._animationFrame = undefined;\n    });\n  }\n\n  private _doRefreshDecorations(): void {\n    for (const decoration of this._decorationService.decorations) {\n      this._renderDecoration(decoration);\n    }\n    this._dimensionsChanged = false;\n  }\n\n  private _renderDecoration(decoration: IInternalDecoration): void {\n    this._refreshStyle(decoration);\n    if (this._dimensionsChanged) {\n      this._refreshXPosition(decoration);\n    }\n  }\n\n  private _createElement(decoration: IInternalDecoration): HTMLElement {\n    const element = this._coreBrowserService.mainDocument.createElement('div');\n    element.classList.add('xterm-decoration');\n    element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n    element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n    element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n    element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n    element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n    const x = decoration.options.x ?? 0;\n    if (x && x > this._bufferService.cols) {\n      // exceeded the container width, so hide\n      element.style.display = 'none';\n    }\n    this._refreshXPosition(decoration, element);\n\n    return element;\n  }\n\n  private _refreshStyle(decoration: IInternalDecoration): void {\n    const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n    if (line < 0 || line >= this._bufferService.rows) {\n      // outside of viewport\n      if (decoration.element) {\n        decoration.element.style.display = 'none';\n        decoration.onRenderEmitter.fire(decoration.element);\n      }\n    } else {\n      let element = this._decorationElements.get(decoration);\n      if (!element) {\n        element = this._createElement(decoration);\n        decoration.element = element;\n        this._decorationElements.set(decoration, element);\n        this._container.appendChild(element);\n        decoration.onDispose(() => {\n          this._decorationElements.delete(decoration);\n          element!.remove();\n        });\n      }\n      element.style.display = this._altBufferIsActive ? 'none' : 'block';\n      if (!this._altBufferIsActive) {\n        element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n        element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n        element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n        element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n      }\n      decoration.onRenderEmitter.fire(element);\n    }\n  }\n\n  private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n    if (!element) {\n      return;\n    }\n    const x = decoration.options.x ?? 0;\n    if ((decoration.options.anchor || 'left') === 'right') {\n      element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n    } else {\n      element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n    }\n  }\n\n  private _removeDecoration(decoration: IInternalDecoration): void {\n    this._decorationElements.get(decoration)?.remove();\n    this._decorationElements.delete(decoration);\n    decoration.dispose();\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from 'common/services/Services';\n\nexport interface IColorZoneStore {\n  readonly zones: IColorZone[];\n  clear(): void;\n  addDecoration(decoration: IInternalDecoration): void;\n  /**\n   * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n   * the padding they will be merged into the same zone.\n   */\n  setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n  /** Color in a format supported by canvas' fillStyle. */\n  color: string;\n  position: 'full' | 'left' | 'center' | 'right' | undefined;\n  startBufferLine: number;\n  endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n  marker: Pick<IInternalDecoration['marker'], 'line'>;\n  options: Pick<IInternalDecoration['options'], 'overviewRulerOptions'>;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n  private _zones: IColorZone[] = [];\n\n  // The zone pool is used to keep zone objects from being freed between clearing the color zone\n  // store and fetching the zones. This helps reduce GC pressure since the color zones are\n  // accumulated on potentially every scroll event.\n  private _zonePool: IColorZone[] = [];\n  private _zonePoolIndex = 0;\n\n  private _linePadding: { [position: string]: number } = {\n    full: 0,\n    left: 0,\n    center: 0,\n    right: 0\n  };\n\n  public get zones(): IColorZone[] {\n    // Trim the zone pool to free unused memory\n    this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n    return this._zones;\n  }\n\n  public clear(): void {\n    this._zones.length = 0;\n    this._zonePoolIndex = 0;\n  }\n\n  public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n    if (!decoration.options.overviewRulerOptions) {\n      return;\n    }\n    for (const z of this._zones) {\n      if (z.color === decoration.options.overviewRulerOptions.color &&\n          z.position === decoration.options.overviewRulerOptions.position) {\n        if (this._lineIntersectsZone(z, decoration.marker.line)) {\n          return;\n        }\n        if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n          this._addLineToZone(z, decoration.marker.line);\n          return;\n        }\n      }\n    }\n    // Create using zone pool if possible\n    if (this._zonePoolIndex < this._zonePool.length) {\n      this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n      this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n      this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n      this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n      this._zones.push(this._zonePool[this._zonePoolIndex++]);\n      return;\n    }\n    // Create\n    this._zones.push({\n      color: decoration.options.overviewRulerOptions.color,\n      position: decoration.options.overviewRulerOptions.position,\n      startBufferLine: decoration.marker.line,\n      endBufferLine: decoration.marker.line\n    });\n    this._zonePool.push(this._zones[this._zones.length - 1]);\n    this._zonePoolIndex++;\n  }\n\n  public setPadding(padding: { [position: string]: number }): void {\n    this._linePadding = padding;\n  }\n\n  private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n    return (\n      line >= zone.startBufferLine &&\n      line <= zone.endBufferLine\n    );\n  }\n\n  private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n    return (\n      (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n      (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n    );\n  }\n\n  private _addLineToZone(zone: IColorZone, line: number): void {\n    zone.startBufferLine = Math.min(zone.startBufferLine, line);\n    zone.endBufferLine = Math.max(zone.endBufferLine, line);\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from 'browser/decorations/ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\nconst enum Constants {\n  OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\nconst drawWidth = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\nconst drawX = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n  private readonly _canvas: HTMLCanvasElement;\n  private readonly _ctx: CanvasRenderingContext2D;\n  private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n  private get _width(): number {\n    const scrollbar = this._optionsService.rawOptions.scrollbar;\n    const showScrollbar = scrollbar?.showScrollbar ?? true;\n    if (!showScrollbar) {\n      return 0;\n    }\n    return scrollbar?.width ?? 0;\n  }\n  private _animationFrame: number | undefined;\n\n  private _shouldUpdateDimensions: boolean | undefined = true;\n  private _shouldUpdateAnchor: boolean | undefined = true;\n  private _lastKnownBufferLength: number = 0;\n\n  constructor(\n    private readonly _viewportElement: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IThemeService private readonly _themeService: IThemeService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n  ) {\n    super();\n    this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n    this._canvas.classList.add('xterm-decoration-overview-ruler');\n    this._refreshCanvasDimensions();\n    this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n    this._register(toDisposable(() => this._canvas?.remove()));\n\n    const ctx = this._canvas.getContext('2d');\n    if (!ctx) {\n      throw new Error('Ctx cannot be null');\n    } else {\n      this._ctx = ctx;\n    }\n\n    this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n    this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n    this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n    this._register(this._bufferService.buffers.onBufferActivate(() => {\n      this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n    }));\n    this._register(this._bufferService.onScroll(() => {\n      if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n        this._refreshDrawHeightConstants();\n        this._refreshColorZonePadding();\n      }\n    }));\n\n    this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n    this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n    this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n    this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n    this._queueRefresh(true);\n  }\n\n  private _refreshDrawConstants(): void {\n    // width\n    const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n    const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n    drawWidth.full = this._canvas.width;\n    drawWidth.left = outerWidth;\n    drawWidth.center = innerWidth;\n    drawWidth.right = outerWidth;\n    // height\n    this._refreshDrawHeightConstants();\n    // x\n    drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n    drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n    drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n    drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n  }\n\n  private _refreshDrawHeightConstants(): void {\n    drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n    // Calculate actual pixels per line\n    const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n    // Clamp actual pixels within a range\n    const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n    drawHeight.left = nonFullHeight;\n    drawHeight.center = nonFullHeight;\n    drawHeight.right = nonFullHeight;\n  }\n\n  private _refreshColorZonePadding(): void {\n    this._colorZoneStore.setPadding({\n      full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n      left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n      center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n      right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n    });\n    this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n  }\n\n  private _refreshCanvasDimensions(): void {\n    const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n    const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n    this._canvas.style.width = `${this._width}px`;\n    this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n    this._canvas.style.height = `${cssCanvasHeight}px`;\n    this._canvas.height = deviceCanvasHeight;\n    this._refreshDrawConstants();\n    this._refreshColorZonePadding();\n  }\n\n  private _refreshDecorations(): void {\n    if (this._shouldUpdateDimensions) {\n      this._refreshCanvasDimensions();\n    }\n    this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n    this._colorZoneStore.clear();\n    for (const decoration of this._decorationService.decorations) {\n      this._colorZoneStore.addDecoration(decoration);\n    }\n    this._ctx.lineWidth = 1;\n    this._renderRulerOutline();\n    const zones = this._colorZoneStore.zones;\n    for (const zone of zones) {\n      if (zone.position !== 'full') {\n        this._renderColorZone(zone);\n      }\n    }\n    for (const zone of zones) {\n      if (zone.position === 'full') {\n        this._renderColorZone(zone);\n      }\n    }\n    this._shouldUpdateDimensions = false;\n    this._shouldUpdateAnchor = false;\n  }\n\n  private _renderRulerOutline(): void {\n    this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n    this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n    if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n      this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n    }\n    if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n      this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n    }\n  }\n\n  private _renderColorZone(zone: IColorZone): void {\n    this._ctx.fillStyle = zone.color;\n    this._ctx.fillRect(\n      /* x */ drawX[zone.position || 'full'],\n      /* y */ Math.round(\n        (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n        (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n      ),\n      /* w */ drawWidth[zone.position || 'full'],\n      /* h */ Math.round(\n        (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n        ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n      )\n    );\n  }\n\n  private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n    this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n    this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n    if (this._animationFrame !== undefined) {\n      return;\n    }\n    this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n      this._refreshDecorations();\n      this._animationFrame = undefined;\n    });\n  }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from 'browser/services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\nimport { C0 } from 'common/data/EscapeSequences';\n\ninterface IPosition {\n  start: number;\n  end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n  /**\n   * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n   * IME. This variable determines whether the compositionText should be displayed on the UI.\n   */\n  private _isComposing: boolean;\n  public get isComposing(): boolean { return this._isComposing; }\n\n  /**\n   * The position within the input textarea's value of the current composition.\n   */\n  private _compositionPosition: IPosition;\n\n  /**\n   * Text that existed after the composing range when composition started.\n   * This is used to avoid treating existing trailing text as new input.\n   */\n  private _compositionSuffix: string;\n\n  /**\n   * Whether a composition is in the process of being sent, setting this to false will cancel any\n   * in-progress composition.\n   */\n  private _isSendingComposition: boolean;\n\n  /**\n   * Data already sent due to keydown event.\n   */\n  private _dataAlreadySent: string;\n\n  /**\n   * The pending textarea change timer, if any.\n   */\n  private _textareaChangeTimer?: number;\n\n  constructor(\n    private readonly _textarea: HTMLTextAreaElement,\n    private readonly _compositionView: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    this._isComposing = false;\n    this._isSendingComposition = false;\n    this._compositionPosition = { start: 0, end: 0 };\n    this._compositionSuffix = '';\n    this._dataAlreadySent = '';\n  }\n\n  /**\n   * Handles the compositionstart event, activating the composition view.\n   */\n  public compositionstart(): void {\n    this._isComposing = true;\n    // It's important to use the selection here instead of textarea length to avoid conflicts with\n    // screen reader mode\n    const start = this._textarea.selectionStart ?? this._textarea.value.length;\n    const end = this._textarea.selectionEnd ?? start;\n    this._compositionPosition.start = Math.min(start, end);\n    this._compositionPosition.end = Math.max(start, end);\n    this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n    this._compositionView.textContent = '';\n    this._dataAlreadySent = '';\n    this._compositionView.classList.add('active');\n  }\n\n  /**\n   * Handles the compositionupdate event, updating the composition view.\n   * @param ev The event.\n   */\n  public compositionupdate(ev: Pick<CompositionEvent, 'data'>): void {\n    // Mark text as LTR, direction=rtl is used in CSS so the end of the text is followed for long\n    // compositions\n    this._compositionView.textContent = `\\u200E${ev.data}\\u200E`;\n    this.updateCompositionElements();\n    setTimeout(() => {\n      const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n      this._compositionPosition.end = Math.max( this._compositionPosition.start, end);\n    }, 0);\n  }\n\n  /**\n   * Handles the compositionend event, hiding the composition view and sending the composition to\n   * the handler.\n   */\n  public compositionend(): void {\n    this._finalizeComposition(true);\n  }\n\n  /**\n   * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n   * @param ev The keydown event.\n   * @returns Whether the Terminal should continue processing the keydown event.\n   */\n  public keydown(ev: KeyboardEvent): boolean {\n    if (this._isComposing || this._isSendingComposition) {\n      if (ev.keyCode === 20 || ev.keyCode === 229) {\n        // 20 is CapsLock, 229 is Enter\n        // Continue composing if the keyCode is the \"composition character\"\n        return false;\n      }\n      if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n        // Continue composing if the keyCode is a modifier key\n        return false;\n      }\n      // Finish composition immediately. This is mainly here for the case where enter is\n      // pressed and the handler needs to be triggered before the command is executed.\n      this._finalizeComposition(false);\n    }\n\n    if (ev.keyCode === 229) {\n      // If the \"composition character\" is used but gets to this point it means a non-composition\n      // character (eg. numbers and punctuation) was pressed when the IME was active.\n      this._handleAnyTextareaChanges();\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Finalizes the composition, resuming regular input actions. This is called when a composition\n   * is ending.\n   * @param waitForPropagation Whether to wait for events to propagate before sending\n   *   the input. This should be false if a non-composition keystroke is entered before the\n   *   compositionend event is triggered, such as enter, so that the composition is sent before\n   *   the command is executed.\n   */\n  private _finalizeComposition(waitForPropagation: boolean): void {\n    this._compositionView.classList.remove('active');\n    this._isComposing = false;\n\n    if (!waitForPropagation) {\n      // Cancel any delayed composition send requests and send the input immediately.\n      this._isSendingComposition = false;\n      const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n      this._coreService.triggerDataEvent(input, true);\n    } else {\n      // Make a deep copy of the composition position here as a new compositionstart event may\n      // fire before the setTimeout executes.\n      const currentCompositionPosition = {\n        start: this._compositionPosition.start,\n        end: this._compositionPosition.end\n      };\n      const currentCompositionSuffix = this._compositionSuffix;\n\n      // Since composition* events happen before the changes take place in the textarea on most\n      // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n      // complete. This ensures the correct character is retrieved.\n      // This solution was used because:\n      // - The compositionend event's data property is unreliable, at least on Chromium\n      // - The last compositionupdate event's data property does not always accurately describe\n      //   the character, a counter example being Korean where an ending consonsant can move to\n      //   the following character if the following input is a vowel.\n      this._isSendingComposition = true;\n      setTimeout(() => {\n        // Ensure that the input has not already been sent\n        if (this._isSendingComposition) {\n          this._isSendingComposition = false;\n          let input;\n          // Add length of data already sent due to keydown event,\n          // otherwise input characters can be duplicated. (Issue #3191)\n          currentCompositionPosition.start += this._dataAlreadySent.length;\n          if (this._isComposing) {\n            // Use the start position of the new composition to get the string\n            // if a new composition has started.\n            input = this._textarea.value.substring(currentCompositionPosition.start, this._compositionPosition.start);\n          } else {\n            // Keep support for non-composition characters typed immediately after composition end\n            // while avoiding re-sending the trailing text that was already present\n            // before composition started.\n            const value = this._textarea.value;\n            const valueEnd = currentCompositionSuffix.length > 0 && value.endsWith(currentCompositionSuffix)\n              ? value.length - currentCompositionSuffix.length\n              : value.length;\n            input = value.substring(currentCompositionPosition.start, Math.max(currentCompositionPosition.start, valueEnd));\n          }\n          if (input.length > 0) {\n            this._coreService.triggerDataEvent(input, true);\n          }\n        }\n      }, 0);\n    }\n  }\n\n  /**\n   * Apply any changes made to the textarea after the current event chain is allowed to complete.\n   * This should be called when not currently composing but a keydown event with the \"composition\n   * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n   * IME is active.\n   */\n  private _handleAnyTextareaChanges(): void {\n    if (this._textareaChangeTimer) {\n      return;\n    }\n    const oldValue = this._textarea.value;\n    this._textareaChangeTimer = window.setTimeout(() => {\n      this._textareaChangeTimer = undefined;\n      // Ignore if a composition has started since the timeout\n      if (!this._isComposing) {\n        const newValue = this._textarea.value;\n\n        const diff = newValue.replace(oldValue, '');\n\n        this._dataAlreadySent = diff;\n\n        if (newValue.length > oldValue.length) {\n          this._coreService.triggerDataEvent(diff, true);\n        } else if (newValue.length < oldValue.length) {\n          this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n        } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n          this._coreService.triggerDataEvent(newValue, true);\n        }\n\n      }\n    }, 0);\n  }\n\n  /**\n   * Positions the composition view on top of the cursor and the textarea just below it (so the\n   * IME helper dialog is positioned correctly).\n   * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n   *   necessary as the IME events across browsers are not consistently triggered.\n   */\n  public updateCompositionElements(dontRecurse?: boolean): void {\n    if (!this._isComposing) {\n      return;\n    }\n\n    if (this._bufferService.buffer.isCursorInViewport) {\n      const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n      const cellHeight = this._renderService.dimensions.css.cell.height;\n      const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n      const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n      this._compositionView.style.left = cursorLeft + 'px';\n      this._compositionView.style.top = cursorTop + 'px';\n      this._compositionView.style.height = cellHeight + 'px';\n      this._compositionView.style.lineHeight = cellHeight + 'px';\n      this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n      this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n      // Limit the composition view width to the space between the cursor and\n      // the terminal's right edge, preventing it from overflowing the terminal.\n      const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n      this._compositionView.style.maxWidth = maxWidth + 'px';\n      this._compositionView.style.overflow = 'hidden';\n      this._compositionView.style.direction = 'rtl';\n      // Sync the textarea to the exact position of the composition view so the IME knows where the\n      // text is.\n      const compositionViewBounds = this._compositionView.getBoundingClientRect();\n      this._textarea.style.left = cursorLeft + 'px';\n      this._textarea.style.top = cursorTop + 'px';\n      // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n      this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n      this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n      this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n    }\n\n    if (!dontRecurse) {\n      setTimeout(() => this.updateCompositionElements(true), 0);\n    }\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n  css: '#00000000',\n  rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n  export function toCss(r: number, g: number, b: number, a?: number): string {\n    if (a !== undefined) {\n      return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n    }\n    return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n  }\n\n  export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n    // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n    // on LE systems, before it can be used for direct 32-bit buffer writes.\n    // >>> 0 forces an unsigned int\n    return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n  }\n\n  export function toColor(r: number, g: number, b: number, a?: number): IColor {\n    return {\n      css: channels.toCss(r, g, b, a),\n      rgba: channels.toRgba(r, g, b, a)\n    };\n  }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n  export function blend(bg: IColor, fg: IColor): IColor {\n    $a = (fg.rgba & 0xFF) / 255;\n    if ($a === 1) {\n      return {\n        css: fg.css,\n        rgba: fg.rgba\n      };\n    }\n    const fgR = (fg.rgba >> 24) & 0xFF;\n    const fgG = (fg.rgba >> 16) & 0xFF;\n    const fgB = (fg.rgba >> 8) & 0xFF;\n    const bgR = (bg.rgba >> 24) & 0xFF;\n    const bgG = (bg.rgba >> 16) & 0xFF;\n    const bgB = (bg.rgba >> 8) & 0xFF;\n    $r = bgR + Math.round((fgR - bgR) * $a);\n    $g = bgG + Math.round((fgG - bgG) * $a);\n    $b = bgB + Math.round((fgB - bgB) * $a);\n    const css = channels.toCss($r, $g, $b);\n    const rgba = channels.toRgba($r, $g, $b);\n    return { css, rgba };\n  }\n\n  export function isOpaque(color: IColor): boolean {\n    return (color.rgba & 0xFF) === 0xFF;\n  }\n\n  export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n    const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n    if (!result) {\n      return undefined;\n    }\n    return channels.toColor(\n      (result >> 24 & 0xFF),\n      (result >> 16 & 0xFF),\n      (result >> 8  & 0xFF)\n    );\n  }\n\n  export function opaque(color: IColor): IColor {\n    const rgbaColor = (color.rgba | 0xFF) >>> 0;\n    [$r, $g, $b] = rgba.toChannels(rgbaColor);\n    return {\n      css: channels.toCss($r, $g, $b),\n      rgba: rgbaColor\n    };\n  }\n\n  export function opacity(color: IColor, opacity: number): IColor {\n    $a = Math.round(opacity * 0xFF);\n    [$r, $g, $b] = rgba.toChannels(color.rgba);\n    return {\n      css: channels.toCss($r, $g, $b, $a),\n      rgba: channels.toRgba($r, $g, $b, $a)\n    };\n  }\n\n  export function multiplyOpacity(color: IColor, factor: number): IColor {\n    $a = color.rgba & 0xFF;\n    return opacity(color, ($a * factor) / 0xFF);\n  }\n\n  export function toColorRGB(color: IColor): IColorRGB {\n    return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n  }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n  // Attempt to set get the shared canvas context\n  let $ctx: CanvasRenderingContext2D | undefined;\n  let $litmusColor: CanvasGradient | undefined;\n  try {\n    // This is guaranteed to run in the first window, so document should be correct\n    const canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext('2d', {\n      willReadFrequently: true\n    });\n    if (ctx) {\n      $ctx = ctx;\n      $ctx.globalCompositeOperation = 'copy';\n      $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n    }\n  }\n  catch {\n    // noop\n  }\n\n  /**\n   * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n   * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n   *\n   * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n   * environment.\n   */\n  export function toColor(css: string): IColor {\n    // Formats: #rgb[a] and #rrggbb[aa]\n    if (css.match(/#[\\da-f]{3,8}/i)) {\n      switch (css.length) {\n        case 4: { // #rgb\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          return channels.toColor($r, $g, $b);\n        }\n        case 5: { // #rgba\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          $a = parseInt(css.slice(4, 5).repeat(2), 16);\n          return channels.toColor($r, $g, $b, $a);\n        }\n        case 7: // #rrggbb\n          return {\n            css,\n            rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n          };\n        case 9: // #rrggbbaa\n          return {\n            css,\n            rgba: parseInt(css.slice(1), 16) >>> 0\n          };\n      }\n    }\n\n    // Formats: rgb() or rgba()\n    const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n    if (rgbaMatch) {\n      $r = parseInt(rgbaMatch[1]);\n      $g = parseInt(rgbaMatch[2]);\n      $b = parseInt(rgbaMatch[3]);\n      $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n      return channels.toColor($r, $g, $b, $a);\n    }\n\n    // Handle the \"transparent\" keyword\n    if (css === 'transparent') {\n      return {\n        css: 'transparent',\n        rgba: 0x00000000\n      };\n    }\n\n    // Validate the context is available for canvas-based color parsing\n    if (!$ctx || !$litmusColor) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Validate the color using canvas fillStyle\n    // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n    $ctx.fillStyle = $litmusColor;\n    $ctx.fillStyle = css;\n    if (typeof $ctx.fillStyle !== 'string') {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    $ctx.fillRect(0, 0, 1, 1);\n    [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n    // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n    if ($a !== 0xFF) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n    // format\n    // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n    return {\n      rgba: channels.toRgba($r, $g, $b, $a),\n      css\n    };\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param rgb The color to use.\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance(rgb: number): number {\n    return relativeLuminance2(\n      (rgb >> 16) & 0xFF,\n      (rgb >> 8 ) & 0xFF,\n      (rgb      ) & 0xFF);\n  }\n\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param r The red channel (0x00 to 0xFF).\n   * @param g The green channel (0x00 to 0xFF).\n   * @param b The blue channel (0x00 to 0xFF).\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance2(r: number, g: number, b: number): number {\n    const rs = r / 255;\n    const gs = g / 255;\n    const bs = b / 255;\n    const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n    const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n    const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n    return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n  export function blend(bg: number, fg: number): number {\n    $a = (fg & 0xFF) / 0xFF;\n    if ($a === 1) {\n      return fg;\n    }\n    const fgR = (fg >> 24) & 0xFF;\n    const fgG = (fg >> 16) & 0xFF;\n    const fgB = (fg >> 8) & 0xFF;\n    const bgR = (bg >> 24) & 0xFF;\n    const bgG = (bg >> 16) & 0xFF;\n    const bgB = (bg >> 8) & 0xFF;\n    $r = bgR + Math.round((fgR - bgR) * $a);\n    $g = bgG + Math.round((fgG - bgG) * $a);\n    $b = bgB + Math.round((fgB - bgB) * $a);\n    return channels.toRgba($r, $g, $b);\n  }\n\n  /**\n   * Given a foreground color and a background color, either increase or reduce the luminance of the\n   * foreground color until the specified contrast ratio is met. If pure white or black is hit\n   * without the contrast ratio being met, go the other direction using the background color as the\n   * foreground color and take either the first or second result depending on which has the higher\n   * contrast ratio.\n   *\n   * `undefined` will be returned if the contrast ratio is already met.\n   *\n   * @param bgRgba The background color in rgba format.\n   * @param fgRgba The foreground color in rgba format.\n   * @param ratio The contrast ratio to achieve.\n   */\n  export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n    const bgL = rgb.relativeLuminance(bgRgba >> 8);\n    const fgL = rgb.relativeLuminance(fgRgba >> 8);\n    const cr = contrastRatio(bgL, fgL);\n    if (cr < ratio) {\n      if (fgL < bgL) {\n        const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n        if (resultARatio < ratio) {\n          const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n          const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n          return resultARatio > resultBRatio ? resultA : resultB;\n        }\n        return resultA;\n      }\n      const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n      const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n      if (resultARatio < ratio) {\n        const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n        return resultARatio > resultBRatio ? resultA : resultB;\n      }\n      return resultA;\n    }\n    return undefined;\n  }\n\n  export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to reducing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n      // Reduce by 10% until the ratio is hit\n      fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n      fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n      fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to increasing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n      // Increase by 10% until the ratio is hit\n      fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n      fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n      fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  export function toChannels(value: number): [number, number, number, number] {\n    return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n  }\n}\n\nexport function toPaddedHex(c: number): string {\n  const s = c.toString(16);\n  return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n  if (l1 < l2) {\n    return (l2 + 0.05) / (l1 + 0.05);\n  }\n  return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, CharData } from 'common/Types';\nimport { ICharacterJoiner } from 'browser/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService } from 'common/services/Services';\nimport { ICharacterJoinerService } from 'browser/services/Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n  private _width: number;\n  // .content carries no meaning for joined CellData, simply nullify it\n  // thus we have to overload all other .content accessors\n  public content: number = 0;\n  public fg: number;\n  public bg: number;\n  public combinedData: string = '';\n\n  constructor(firstCell: ICellData, chars: string, width: number) {\n    super();\n    this.fg = firstCell.fg;\n    this.bg = firstCell.bg;\n    this.combinedData = chars;\n    this._width = width;\n  }\n\n  public isCombined(): number {\n    // always mark joined cell data as combined\n    return Content.IS_COMBINED_MASK;\n  }\n\n  public getWidth(): number {\n    return this._width;\n  }\n\n  public getChars(): string {\n    return this.combinedData;\n  }\n\n  public getCode(): number {\n    // code always gets the highest possible fake codepoint (read as -1)\n    // this is needed as code is used by caches as identifier\n    return 0x1FFFFF;\n  }\n\n  public setFromCharData(value: CharData): void {\n    throw new Error('not implemented');\n  }\n\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n  public serviceBrand: undefined;\n\n  private _characterJoiners: ICharacterJoiner[] = [];\n  private _nextCharacterJoinerId: number = 0;\n  private _workCell: CellData = new CellData();\n\n  constructor(\n    @IBufferService private _bufferService: IBufferService\n  ) { }\n\n  public register(handler: (text: string) => [number, number][]): number {\n    const joiner: ICharacterJoiner = {\n      id: this._nextCharacterJoinerId++,\n      handler\n    };\n\n    this._characterJoiners.push(joiner);\n    return joiner.id;\n  }\n\n  public deregister(joinerId: number): boolean {\n    for (let i = 0; i < this._characterJoiners.length; i++) {\n      if (this._characterJoiners[i].id === joinerId) {\n        this._characterJoiners.splice(i, 1);\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  public getJoinedCharacters(row: number): [number, number][] {\n    if (this._characterJoiners.length === 0) {\n      return [];\n    }\n\n    const line = this._bufferService.buffer.lines.get(row);\n    if (!line || line.length === 0) {\n      return [];\n    }\n\n    const ranges: [number, number][] = [];\n    const lineStr = line.translateToString(true);\n\n    // Because some cells can be represented by multiple javascript characters,\n    // we track the cell and the string indexes separately. This allows us to\n    // translate the string ranges we get from the joiners back into cell ranges\n    // for use when rendering\n    let rangeStartColumn = 0;\n    let currentStringIndex = 0;\n    let rangeStartStringIndex = 0;\n    let rangeAttrFG = line.getFg(0);\n    let rangeAttrBG = line.getBg(0);\n\n    for (let x = 0; x < line.getTrimmedLength(); x++) {\n      line.loadCell(x, this._workCell);\n\n      if (this._workCell.getWidth() === 0) {\n        // If this character is of width 0, skip it.\n        continue;\n      }\n\n      // End of range\n      if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n        // If we ended up with a sequence of more than one character,\n        // look for ranges to join.\n        if (x - rangeStartColumn > 1) {\n          const joinedRanges = this._getJoinedRanges(\n            lineStr,\n            rangeStartStringIndex,\n            currentStringIndex,\n            line,\n            rangeStartColumn\n          );\n          for (let i = 0; i < joinedRanges.length; i++) {\n            ranges.push(joinedRanges[i]);\n          }\n        }\n\n        // Reset our markers for a new range.\n        rangeStartColumn = x;\n        rangeStartStringIndex = currentStringIndex;\n        rangeAttrFG = this._workCell.fg;\n        rangeAttrBG = this._workCell.bg;\n      }\n\n      currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n    }\n\n    // Process any trailing ranges.\n    if (this._bufferService.cols - rangeStartColumn > 1) {\n      const joinedRanges = this._getJoinedRanges(\n        lineStr,\n        rangeStartStringIndex,\n        currentStringIndex,\n        line,\n        rangeStartColumn\n      );\n      for (let i = 0; i < joinedRanges.length; i++) {\n        ranges.push(joinedRanges[i]);\n      }\n    }\n\n    return ranges;\n  }\n\n  /**\n   * Given a segment of a line of text, find all ranges of text that should be\n   * joined in a single rendering unit. Ranges are internally converted to\n   * column ranges, rather than string ranges.\n   * @param line String representation of the full line of text\n   * @param startIndex Start position of the range to search in the string (inclusive)\n   * @param endIndex End position of the range to search in the string (exclusive)\n   */\n  private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n    const text = line.substring(startIndex, endIndex);\n    // At this point we already know that there is at least one joiner so\n    // we can just pull its value and assign it directly rather than\n    // merging it into an empty array, which incurs unnecessary writes.\n    let allJoinedRanges: [number, number][] = [];\n    try {\n      allJoinedRanges = this._characterJoiners[0].handler(text);\n    } catch (error) {\n      console.error(error);\n    }\n    for (let i = 1; i < this._characterJoiners.length; i++) {\n      // We merge any overlapping ranges across the different joiners\n      try {\n        const joinerRanges = this._characterJoiners[i].handler(text);\n        for (let j = 0; j < joinerRanges.length; j++) {\n          CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n        }\n      } catch (error) {\n        console.error(error);\n      }\n    }\n    this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n    return allJoinedRanges;\n  }\n\n  /**\n   * Modifies the provided ranges in-place to adjust for variations between\n   * string length and cell width so that the range represents a cell range,\n   * rather than the string range the joiner provides.\n   * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n   * @param line Cell data for the relevant line in the terminal\n   * @param startCol Offset within the line to start from\n   */\n  private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n    let currentRangeIndex = 0;\n    let currentRangeStarted = false;\n    let currentStringIndex = 0;\n    let currentRange = ranges[currentRangeIndex];\n\n    // If we got through all of the ranges, stop searching\n    if (!currentRange) {\n      return;\n    }\n\n    for (let x = startCol; x < this._bufferService.cols; x++) {\n      const width = line.getWidth(x);\n      const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n      // We skip zero-width characters when creating the string to join the text\n      // so we do the same here\n      if (width === 0) {\n        continue;\n      }\n\n      // Adjust the start of the range\n      if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n        currentRange[0] = x;\n        currentRangeStarted = true;\n      }\n\n      // Adjust the end of the range\n      if (currentRange[1] <= currentStringIndex) {\n        currentRange[1] = x;\n\n        // We're finished with this range, so we move to the next one\n        currentRange = ranges[++currentRangeIndex];\n\n        // If there are no more ranges left, stop searching\n        if (!currentRange) {\n          break;\n        }\n\n        // Ranges can be on adjacent characters. Because the end index of the\n        // ranges are exclusive, this means that the index for the start of a\n        // range can be the same as the end index of the previous range. To\n        // account for the start of the next range, we check here just in case.\n        if (currentRange[0] <= currentStringIndex) {\n          currentRange[0] = x;\n          currentRangeStarted = true;\n        } else {\n          currentRangeStarted = false;\n        }\n      }\n\n      // Adjust the string index based on the character length to line up with\n      // the column adjustment\n      currentStringIndex += length;\n    }\n\n    // If there is still a range left at the end, it must extend all the way to\n    // the end of the line.\n    if (currentRange) {\n      currentRange[1] = this._bufferService.cols;\n    }\n  }\n\n  /**\n   * Merges the range defined by the provided start and end into the list of\n   * existing ranges. The merge is done in place on the existing range for\n   * performance and is also returned.\n   * @param ranges Existing range list\n   * @param newRange Tuple of two numbers representing the new range to merge in.\n   * @returns The ranges input with the new range merged in place\n   */\n  private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n    let inRange = false;\n    for (let i = 0; i < ranges.length; i++) {\n      const range = ranges[i];\n      if (!inRange) {\n        if (newRange[1] <= range[0]) {\n          // Case 1: New range is before the search range\n          ranges.splice(i, 0, newRange);\n          return ranges;\n        }\n\n        if (newRange[1] <= range[1]) {\n          // Case 2: New range is either wholly contained within the\n          // search range or overlaps with the front of it\n          range[0] = Math.min(newRange[0], range[0]);\n          return ranges;\n        }\n\n        if (newRange[0] < range[1]) {\n          // Case 3: New range either wholly contains the search range\n          // or overlaps with the end of it\n          range[0] = Math.min(newRange[0], range[0]);\n          inRange = true;\n        }\n\n        // Case 4: New range starts after the search range\n        continue;\n      } else {\n        if (newRange[1] <= range[0]) {\n          // Case 5: New range extends from previous range but doesn't\n          // reach the current one\n          ranges[i - 1][1] = newRange[1];\n          return ranges;\n        }\n\n        if (newRange[1] <= range[1]) {\n          // Case 6: New range extends from prvious range into the\n          // current range\n          ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n          ranges.splice(i, 1);\n          return ranges;\n        }\n\n        // Case 7: New range extends from previous range past the\n        // end of the current range\n        ranges.splice(i, 1);\n        i--;\n      }\n    }\n\n    if (inRange) {\n      // Case 8: New range extends past the last existing range\n      ranges[ranges.length - 1][1] = newRange[1];\n    } else {\n      // Case 9: New range starts after the last existing range\n      ranges.push(newRange);\n    }\n\n    return ranges;\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n  if (!value) {\n    throw new Error('value must not be falsy');\n  }\n  return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n  // Only return true for Powerline symbols which require\n  // different padding and should be excluded from minimum contrast\n  // ratio standards\n  return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n  return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n  return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n  return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n  return (\n    codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n    codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n    codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n    codepoint >= 0x2600  && codepoint <= 0x26FF  || // Misc symbols\n    codepoint >= 0x2700  && codepoint <= 0x27BF  || // Dingbats\n    codepoint >= 0xFE00  && codepoint <= 0xFE0F  || // Variation Selectors\n    codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n    codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n  );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n  return (\n    // Is single cell width\n    width === 1 &&\n    // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n    // barely overlap\n    glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n    // Never rescale ascii\n    codepoint !== undefined && codepoint > 0xFF &&\n    // Never rescale emoji\n    !isEmoji(codepoint) &&\n    // Never rescale powerline or nerd fonts\n    !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n  );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n  return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n  return {\n    css: {\n      canvas: createDimension(),\n      cell: createDimension()\n    },\n    device: {\n      canvas: createDimension(),\n      cell: createDimension(),\n      char: {\n        width: 0,\n        height: 0,\n        left: 0,\n        top: 0\n      }\n    }\n  };\n}\n\nfunction createDimension(): IDimensions {\n  return {\n    width: 0,\n    height: 0\n  };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n  return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, IColor } from 'common/Types';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { channels, color } from 'common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { JoinedCellData } from 'browser/services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WidthCache } from 'browser/renderer/dom/WidthCache';\nimport { IColorContrastCache } from 'browser/Types';\n\n\nexport const enum RowCss {\n  BOLD_CLASS = 'xterm-bold',\n  DIM_CLASS = 'xterm-dim',\n  ITALIC_CLASS = 'xterm-italic',\n  UNDERLINE_CLASS = 'xterm-underline',\n  OVERLINE_CLASS = 'xterm-overline',\n  STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n  BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n  CURSOR_CLASS = 'xterm-cursor',\n  CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n  CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n  CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n  CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n  CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n  private _workCell: CellData = new CellData();\n\n  private _selectionStart: [number, number] | undefined;\n  private _selectionEnd: [number, number] | undefined;\n  private _columnSelectMode: boolean = false;\n\n  public defaultSpacing = 0;\n\n  constructor(\n    private readonly _document: Document,\n    @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IThemeService private readonly _themeService: IThemeService\n  ) {}\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    this._selectionStart = start;\n    this._selectionEnd = end;\n    this._columnSelectMode = columnSelectMode;\n  }\n\n  public createRow(\n    lineData: IBufferLine,\n    row: number,\n    isCursorRow: boolean,\n    cursorStyle: string | undefined,\n    cursorInactiveStyle: string | undefined,\n    cursorX: number,\n    cursorBlink: boolean,\n    blinkOn: boolean,\n    cellWidth: number,\n    widthCache: WidthCache,\n    linkStart: number,\n    linkEnd: number,\n    rowInfo?: { hasBlinkingCells: boolean }\n  ): HTMLSpanElement[] {\n\n    const elements: HTMLSpanElement[] = [];\n    if (rowInfo) {\n      rowInfo.hasBlinkingCells = false;\n    }\n    const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n    const colors = this._themeService.colors;\n\n    let lineLength = lineData.getNoBgTrimmedLength();\n    if (isCursorRow && lineLength < cursorX + 1) {\n      lineLength = cursorX + 1;\n    }\n\n    let charElement: HTMLSpanElement | undefined;\n    let cellAmount = 0;\n    let text = '';\n    let i = 0;\n    let oldBg = 0;\n    let oldFg = 0;\n    let oldExt = 0;\n    let oldLinkHover: number | boolean = false;\n    let oldSpacing = 0;\n    let oldIsInSelection: boolean = false;\n    let spacing = 0;\n    let skipJoinedCheckUntilX = 0;\n    const classes: string[] = [];\n\n    const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n    for (let x = 0; x < lineLength; x++) {\n      lineData.loadCell(x, this._workCell);\n      let width = this._workCell.getWidth();\n\n      // The character to the left is a wide character, drawing is owned by the char at x-1\n      if (width === 0) {\n        continue;\n      }\n\n      // If true, indicates that the current character(s) to draw were joined.\n      let isJoined = false;\n\n      // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n      // be rendered entirely, like the selection state differs across the range.\n      let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n      let lastCharX = x;\n\n      // Process any joined character ranges as needed. Because of how the\n      // ranges are produced, we know that they are valid for the characters\n      // and attributes of our input.\n      let cell: ICellData = this._workCell;\n      if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n        const range = joinedRanges.shift()!;\n        // If the ligature's selection state is not consistent, don't join it. This helps the\n        // selection render correctly regardless whether they should be joined.\n        const firstSelectionState = this._isCellInSelection(range[0], row);\n        for (i = range[0] + 1; i < range[1]; i++) {\n          isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n        }\n        // Similarly, if the cursor is in the ligature, don't join it.\n        isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n        if (!isValidJoinRange) {\n          skipJoinedCheckUntilX = range[1];\n        } else {\n          isJoined = true;\n\n          // We already know the exact start and end column of the joined range,\n          // so we get the string and width representing it directly\n          cell = new JoinedCellData(\n            this._workCell,\n            lineData.translateToString(true, range[0], range[1]),\n            range[1] - range[0]\n          );\n\n          // Skip over the cells occupied by this range in the loop\n          lastCharX = range[1] - 1;\n\n          // Recalculate width\n          width = cell.getWidth();\n        }\n      }\n\n      const isInSelection = this._isCellInSelection(x, row);\n      const isCursorCell = isCursorRow && x === cursorX;\n      const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n      if (rowInfo && cell.isBlink()) {\n        rowInfo.hasBlinkingCells = true;\n      }\n      const isBlinkHidden = !blinkOn && cell.isBlink();\n      if (isBlinkHidden) {\n        classes.push(RowCss.BLINK_HIDDEN_CLASS);\n      }\n\n      let isDecorated = false;\n      this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n        isDecorated = true;\n      });\n\n      // get chars to render for this cell\n      let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n      if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n        chars = '\\xa0';\n      }\n\n      // lookup char render width and calc spacing\n      spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n      if (!charElement) {\n        charElement = this._document.createElement('span');\n      } else {\n        /**\n         * chars can only be merged on existing span if:\n         * - existing span only contains mergeable chars (cellAmount != 0)\n         * - bg did not change (or both are in selection)\n         * - fg did not change (or both are in selection and selection fg is set)\n         * - ext did not change\n         * - underline from hover state did not change\n         * - cell content renders to same letter-spacing\n         * - cell is not cursor\n         */\n        if (\n          cellAmount\n          && (\n            (isInSelection && oldIsInSelection)\n            || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n          )\n          && (\n            (isInSelection && oldIsInSelection && colors.selectionForeground)\n            || cell.fg === oldFg\n          )\n          && cell.extended.ext === oldExt\n          && isLinkHover === oldLinkHover\n          && spacing === oldSpacing\n          && !isCursorCell\n          && !isJoined\n          && !isDecorated\n          && isValidJoinRange\n        ) {\n          // no span alterations, thus only account chars skipping all code below\n          if (cell.isInvisible()) {\n            text += WHITESPACE_CELL_CHAR;\n          } else {\n            text += chars;\n          }\n          cellAmount++;\n          continue;\n        } else {\n          /**\n           * cannot merge:\n           * - apply left-over text to old span\n           * - create new span, reset state holders cellAmount & text\n           */\n          if (cellAmount) {\n            charElement.textContent = text;\n          }\n          charElement = this._document.createElement('span');\n          cellAmount = 0;\n          text = '';\n        }\n      }\n      // preserve conditions for next merger eval round\n      oldBg = cell.bg;\n      oldFg = cell.fg;\n      oldExt = cell.extended.ext;\n      oldLinkHover = isLinkHover;\n      oldSpacing = spacing;\n      oldIsInSelection = isInSelection;\n\n      if (isJoined) {\n        // The DOM renderer colors the background of the cursor but for ligatures all cells are\n        // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n        // the cursor looks the same when on any character of the ligature though\n        if (cursorX >= x && cursorX <= lastCharX) {\n          cursorX = x;\n        }\n      }\n\n      if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n        classes.push(RowCss.CURSOR_CLASS);\n        if (this._coreBrowserService.isFocused) {\n          if (cursorBlink) {\n            classes.push(RowCss.CURSOR_BLINK_CLASS);\n          }\n          classes.push(\n            cursorStyle === 'bar'\n              ? RowCss.CURSOR_STYLE_BAR_CLASS\n              : cursorStyle === 'underline'\n                ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n                : RowCss.CURSOR_STYLE_BLOCK_CLASS\n          );\n        } else {\n          if (cursorInactiveStyle) {\n            switch (cursorInactiveStyle) {\n              case 'outline':\n                classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n                break;\n              case 'block':\n                classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n                break;\n              case 'bar':\n                classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n                break;\n              case 'underline':\n                classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n                break;\n              default:\n                break;\n            }\n          }\n        }\n      }\n\n      if (cell.isBold()) {\n        classes.push(RowCss.BOLD_CLASS);\n      }\n\n      if (cell.isItalic()) {\n        classes.push(RowCss.ITALIC_CLASS);\n      }\n\n      if (cell.isDim()) {\n        classes.push(RowCss.DIM_CLASS);\n      }\n\n      if (cell.isInvisible()) {\n        text = WHITESPACE_CELL_CHAR;\n      } else {\n        text = cell.getChars() || WHITESPACE_CELL_CHAR;\n      }\n\n      if (cell.isUnderline()) {\n        classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n        if (text === ' ') {\n          text = '\\xa0'; // = &nbsp;\n        }\n        if (!cell.isUnderlineColorDefault()) {\n          if (cell.isUnderlineColorRGB()) {\n            charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n          } else {\n            let fg = cell.getUnderlineColor();\n            if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n              fg += 8;\n            }\n            charElement.style.textDecorationColor = colors.ansi[fg].css;\n          }\n        }\n      }\n\n      if (cell.isOverline()) {\n        classes.push(RowCss.OVERLINE_CLASS);\n        if (text === ' ') {\n          text = '\\xa0'; // = &nbsp;\n        }\n      }\n\n      if (cell.isStrikethrough()) {\n        classes.push(RowCss.STRIKETHROUGH_CLASS);\n      }\n\n      // apply link hover underline late, effectively overrides any previous text-decoration\n      // settings\n      if (isLinkHover) {\n        charElement.style.textDecoration = 'underline';\n      }\n\n      let fg = cell.getFgColor();\n      let fgColorMode = cell.getFgColorMode();\n      let bg = cell.getBgColor();\n      let bgColorMode = cell.getBgColorMode();\n      const isInverse = !!cell.isInverse();\n      if (isInverse) {\n        const temp = fg;\n        fg = bg;\n        bg = temp;\n        const temp2 = fgColorMode;\n        fgColorMode = bgColorMode;\n        bgColorMode = temp2;\n      }\n\n      // Apply any decoration foreground/background overrides, this must happen after inverse has\n      // been applied\n      let bgOverride: IColor | undefined;\n      let fgOverride: IColor | undefined;\n      let isTop = false;\n      this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n        if (d.options.layer !== 'top' && isTop) {\n          return;\n        }\n        if (d.backgroundColorRGB) {\n          bgColorMode = Attributes.CM_RGB;\n          bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n          bgOverride = d.backgroundColorRGB;\n        }\n        if (d.foregroundColorRGB) {\n          fgColorMode = Attributes.CM_RGB;\n          fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n          fgOverride = d.foregroundColorRGB;\n        }\n        isTop = d.options.layer === 'top';\n      });\n\n      // Apply selection\n      if (!isTop && isInSelection) {\n        // If in the selection, force the element to be above the selection to improve contrast and\n        // support opaque selections. The applies background is not actually needed here as\n        // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n        // contrast ratio\n        bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n        bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n        bgColorMode = Attributes.CM_RGB;\n        // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n        // ensure text is drawn above the selection.\n        isTop = true;\n        // Apply selection foreground if applicable\n        if (colors.selectionForeground) {\n          fgColorMode = Attributes.CM_RGB;\n          fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n          fgOverride = colors.selectionForeground;\n        }\n      }\n\n      // If it's a top decoration, render above the selection\n      if (isTop) {\n        classes.push('xterm-decoration-top');\n      }\n\n      // Background\n      let resolvedBg: IColor;\n      switch (bgColorMode) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          resolvedBg = colors.ansi[bg];\n          classes.push(`xterm-bg-${bg}`);\n          break;\n        case Attributes.CM_RGB:\n          resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n          this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          if (isInverse) {\n            resolvedBg = colors.foreground;\n            classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n          } else {\n            resolvedBg = colors.background;\n          }\n      }\n\n      // If there is no background override by now it's the original color, so apply dim if needed\n      if (!bgOverride) {\n        if (cell.isDim()) {\n          bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n        }\n      }\n\n      // Foreground\n      switch (fgColorMode) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n            fg += 8;\n          }\n          if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n            classes.push(`xterm-fg-${fg}`);\n          }\n          break;\n        case Attributes.CM_RGB:\n          const color = channels.toColor(\n            (fg >> 16) & 0xFF,\n            (fg >>  8) & 0xFF,\n            (fg      ) & 0xFF\n          );\n          if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n            this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n          }\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n            if (isInverse) {\n              classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n            }\n          }\n      }\n\n      // apply CSS classes\n      // slightly faster than using classList by omitting\n      // checks for doubled entries (code above should not have doublets)\n      if (classes.length) {\n        charElement.className = classes.join(' ');\n        classes.length = 0;\n      }\n\n      // exclude conditions for cell merging - never merge these\n      if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n        cellAmount++;\n      } else {\n        charElement.textContent = text;\n      }\n      // apply letter-spacing rule\n      if (spacing !== this.defaultSpacing) {\n        charElement.style.letterSpacing = `${spacing}px`;\n      }\n\n      elements.push(charElement);\n      x = lastCharX;\n    }\n\n    // postfix text of last merged span\n    if (charElement && cellAmount) {\n      charElement.textContent = text;\n    }\n\n    return elements;\n  }\n\n  private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n    if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n      return false;\n    }\n\n    // Try get from cache first, only use the cache when there are no decoration overrides\n    const cache = this._getContrastCache(cell);\n    let adjustedColor: IColor | undefined | null = undefined;\n    if (!bgOverride && !fgOverride) {\n      adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n    }\n\n    // Calculate and store in cache\n    if (adjustedColor === undefined) {\n      // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n      // non-dim cells\n      const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n      adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n      cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n    }\n\n    if (adjustedColor) {\n      this._addStyle(element, `color:${adjustedColor.css}`);\n      return true;\n    }\n\n    return false;\n  }\n\n  private _getContrastCache(cell: ICellData): IColorContrastCache {\n    if (cell.isDim()) {\n      return this._themeService.colors.halfContrastCache;\n    }\n    return this._themeService.colors.contrastCache;\n  }\n\n  private _addStyle(element: HTMLElement, style: string): void {\n    element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n  }\n\n  private _isCellInSelection(x: number, y: number): boolean {\n    const start = this._selectionStart;\n    const end = this._selectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    if (this._columnSelectMode) {\n      if (start[0] <= end[0]) {\n        return x >= start[0] && y >= start[1] &&\n          x < end[0] && y <= end[1];\n      }\n      return x < start[0] && y >= start[1] &&\n        x >= end[0] && y <= end[1];\n    }\n    return (y > start[1] && y < end[1]) ||\n        (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n        (start[1] < end[1] && y === end[1] && x < end[0]) ||\n        (start[1] < end[1] && y === start[1] && x >= start[0]);\n  }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IDisposable } from 'common/Types';\nimport { FontWeight } from 'common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n  /** sentinel for unset values in flat cache */\n  FLAT_UNSET = -9999,\n  /** size of flat cache, size-1 equals highest codepoint handled by flat */\n  FLAT_SIZE = 256,\n  /** char repeat for measuring */\n  REPEAT = 32\n}\n\n\nconst enum FontVariant {\n  REGULAR = 0,\n  BOLD = 1,\n  ITALIC = 2,\n  BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n  setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n  measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n  // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n  // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n  //       It has a small memory footprint (only 1MB for full BMP caching),\n  //       still the sweet spot is not reached before touching 32k different codepoints,\n  //       thus we store the remaining <<20% of terminal data in a holey structure.\n  protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n  // holey cache for bold, italic and bold&italic for any string\n  // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n  //        so a shared API across terminals is needed\n  protected _holey: Map<string, number> | undefined;\n\n  private _font = '';\n  private _fontSize = 0;\n  private _weight: FontWeight = 'normal';\n  private _weightBold: FontWeight = 'bold';\n  private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n  constructor(\n    canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n  ) {\n    this._canvasElements = [\n      canvasFactory(),\n      canvasFactory(),\n      canvasFactory(),\n      canvasFactory()\n    ];\n\n    this.clear();\n  }\n\n  public dispose(): void {\n    this._canvasElements.length = 0;\n    this._holey = undefined; // free cache memory via GC\n  }\n\n  /**\n   * Clear the width cache.\n   */\n  public clear(): void {\n    this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n    // .clear() has some overhead, re-assign instead (>3 times faster)\n    this._holey = new Map<string, number>();\n  }\n\n  /**\n   * Set the font for measuring.\n   * Must be called for any changes on font settings.\n   * Also clears the cache.\n   */\n  public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n    // skip if nothing changed\n    if (\n      font === this._font &&\n      fontSize === this._fontSize &&\n      weight === this._weight &&\n      weightBold === this._weightBold\n    ) {\n      return;\n    }\n\n    this._font = font;\n    this._fontSize = fontSize;\n    this._weight = weight;\n    this._weightBold = weightBold;\n\n    this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n    this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n    this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n    this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n    this.clear();\n  }\n\n  /**\n   * Get the render width for cell content `c` with current font settings.\n   * `variant` denotes the font variant to be used.\n   */\n  public get(c: string, bold: boolean | number, italic: boolean | number): number {\n    let cp = 0;\n    if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n      if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n        return this._flat[cp];\n      }\n      const width = this._measure(c, 0);\n      if (width > 0) {\n        this._flat[cp] = width;\n      }\n      return width;\n    }\n    let key = c;\n    if (bold) key += 'B';\n    if (italic) key += 'I';\n    let width = this._holey!.get(key);\n    if (width === undefined) {\n      let variant = 0;\n      if (bold) variant |= FontVariant.BOLD;\n      if (italic) variant |= FontVariant.ITALIC;\n      width = this._measure(c, variant);\n      if (width > 0) {\n        this._holey!.set(key, width);\n      }\n    }\n    return width;\n  }\n\n  protected _measure(c: string, variant: FontVariant): number {\n    return this._canvasElements[variant].measure(c);\n  }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n  private _canvas: OffscreenCanvas | HTMLCanvasElement;\n  private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n  constructor() {\n    if (typeof OffscreenCanvas !== 'undefined') {\n      this._canvas = new OffscreenCanvas(1, 1);\n      this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n    } else {\n      this._canvas = document.createElement('canvas');\n      this._canvas.width = 1;\n      this._canvas.height = 1;\n      this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n    }\n  }\n\n  public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n    const fontStyle = italic ? 'italic' : '';\n    this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n  }\n\n  public measure(c: string): number {\n    return this._ctx.measureText(c).width;\n  }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n  public hasSelection!: boolean;\n  public columnSelectMode!: boolean;\n  public viewportStartRow!: number;\n  public viewportEndRow!: number;\n  public viewportCappedStartRow!: number;\n  public viewportCappedEndRow!: number;\n  public startCol!: number;\n  public endCol!: number;\n  public selectionStart: [number, number] | undefined;\n  public selectionEnd: [number, number] | undefined;\n\n  constructor() {\n    this.clear();\n  }\n\n  public clear(): void {\n    this.hasSelection = false;\n    this.columnSelectMode = false;\n    this.viewportStartRow = 0;\n    this.viewportEndRow = 0;\n    this.viewportCappedStartRow = 0;\n    this.viewportCappedEndRow = 0;\n    this.startCol = 0;\n    this.endCol = 0;\n    this.selectionStart = undefined;\n    this.selectionEnd = undefined;\n  }\n\n  public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n    this.selectionStart = start;\n    this.selectionEnd = end;\n    // Selection does not exist\n    if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n      this.clear();\n      return;\n    }\n\n    // Translate from buffer position to viewport position\n    const viewportY = terminal.buffers.active.ydisp;\n    const viewportStartRow = start[1] - viewportY;\n    const viewportEndRow = end[1] - viewportY;\n    const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n    const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n    // No need to draw the selection\n    if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n      this.clear();\n      return;\n    }\n\n    this.hasSelection = true;\n    this.columnSelectMode = columnSelectMode;\n    this.viewportStartRow = viewportStartRow;\n    this.viewportEndRow = viewportEndRow;\n    this.viewportCappedStartRow = viewportCappedStartRow;\n    this.viewportCappedEndRow = viewportCappedEndRow;\n    this.startCol = start[0];\n    this.endCol = end[0];\n  }\n\n  public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n    if (!this.hasSelection) {\n      return false;\n    }\n    y -= terminal.buffer.active.viewportY;\n    if (this.columnSelectMode) {\n      if (this.startCol <= this.endCol) {\n        return x >= this.startCol && y >= this.viewportCappedStartRow &&\n          x < this.endCol && y <= this.viewportCappedEndRow;\n      }\n      return x < this.startCol && y >= this.viewportCappedStartRow &&\n        x >= this.endCol && y <= this.viewportCappedEndRow;\n    }\n    return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n      (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n  }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n  return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IOptionsService } from 'common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n  private _intervalDuration: number = 0;\n  private _interval: number | undefined;\n  private _blinkOn: boolean = true;\n  private _needsBlinkInViewport: boolean = false;\n  private _isViewportVisible: boolean = true;\n\n  constructor(\n    private readonly _renderCallback: () => void,\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n      this.setIntervalDuration(duration);\n    }));\n    this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n    this._register(toDisposable(() => this._clearInterval()));\n  }\n\n  public get isBlinkOn(): boolean {\n    return this._blinkOn;\n  }\n\n  public get isEnabled(): boolean {\n    return this._intervalDuration > 0;\n  }\n\n  public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n    if (this._needsBlinkInViewport === needsBlinkInViewport) {\n      return;\n    }\n\n    this._needsBlinkInViewport = needsBlinkInViewport;\n    this._updateIntervalState();\n  }\n\n  public setViewportVisible(isVisible: boolean): void {\n    if (this._isViewportVisible === isVisible) {\n      return;\n    }\n\n    this._isViewportVisible = isVisible;\n    this._updateIntervalState();\n  }\n\n  public setIntervalDuration(duration: number): void {\n    if (duration === this._intervalDuration) {\n      return;\n    }\n\n    this._intervalDuration = duration;\n    this._clearInterval();\n    this._updateIntervalState();\n  }\n\n  private _updateIntervalState(): void {\n    const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n    if (shouldBlink) {\n      if (this._interval !== undefined) {\n        return;\n      }\n      const wasBlinkOn = this._blinkOn;\n      this._blinkOn = true;\n      this._interval = this._coreBrowserService.window.setInterval(() => {\n        this._blinkOn = !this._blinkOn;\n        this._renderCallback();\n      }, this._intervalDuration);\n      if (!wasBlinkOn) {\n        this._renderCallback();\n      }\n      return;\n    }\n\n    this._clearInterval();\n    if (!this._blinkOn) {\n      this._blinkOn = true;\n      this._renderCallback();\n    }\n  }\n\n  private _clearInterval(): void {\n    if (this._interval !== undefined) {\n      this._coreBrowserService.window.clearInterval(this._interval);\n      this._interval = undefined;\n    }\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererRowFactory';\nimport { WidthCache } from 'browser/renderer/dom/WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from 'browser/renderer/shared/Constants';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from 'browser/renderer/shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { color } from 'common/Color';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\n\n\nconst TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';\nconst ROW_CONTAINER_CLASS = 'xterm-rows';\nconst FG_CLASS_PREFIX = 'xterm-fg-';\nconst BG_CLASS_PREFIX = 'xterm-bg-';\nconst FOCUS_CLASS = 'xterm-focus';\nconst SELECTION_CLASS = 'xterm-selection';\nconst CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle';\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n  private _rowFactory: DomRendererRowFactory;\n  private _terminalClass: number = nextTerminalId++;\n\n  private _themeStyleElement!: HTMLStyleElement;\n  private _dimensionsStyleElement!: HTMLStyleElement;\n  private _rowContainer: HTMLElement;\n  private _rowElements: HTMLElement[] = [];\n  private _selectionContainer: HTMLElement;\n  private _widthCache: WidthCache;\n  private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n  private _lastSelectionStart: [number, number] | undefined;\n  private _lastSelectionEnd: [number, number] | undefined;\n  private _lastSelectionColumnMode: boolean = false;\n  private _cursorBlinkStateManager: CursorBlinkStateManager;\n  private _textBlinkStateManager: TextBlinkStateManager;\n  private _rowHasBlinkingCells: boolean[] = [];\n  private _rowHasBlinkingCellsCount: number = 0;\n\n  public dimensions: IRenderDimensions;\n\n  private readonly _onRequestRedraw = this._register(new Emitter<IRequestRedrawEvent>());\n  public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n  constructor(\n    private readonly _terminal: ITerminal,\n    private readonly _document: Document,\n    private readonly _element: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    private readonly _viewportElement: HTMLElement,\n    private readonly _helperContainer: HTMLElement,\n    private readonly _linkifier2: ILinkifier2,\n    @IInstantiationService instantiationService: IInstantiationService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IThemeService private readonly _themeService: IThemeService\n  ) {\n    super();\n    this._rowContainer = this._document.createElement('div');\n    this._rowContainer.classList.add(ROW_CONTAINER_CLASS);\n    this._rowContainer.style.lineHeight = 'normal';\n    this._rowContainer.setAttribute('aria-hidden', 'true');\n    this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n    this._selectionContainer = this._document.createElement('div');\n    this._selectionContainer.classList.add(SELECTION_CLASS);\n    this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n    this.dimensions = createRenderDimensions();\n    this._updateDimensions();\n    this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n    this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n    this._injectCss(this._themeService.colors);\n\n    this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n    this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);\n    this._screenElement.appendChild(this._rowContainer);\n    this._screenElement.appendChild(this._selectionContainer);\n\n    this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n    this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n    this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n    this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n    this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n    this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n      () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n      this._coreBrowserService,\n      this._optionsService\n    ));\n\n    this._register(toDisposable(() => {\n      this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n      // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n      // https://github.com/xtermjs/xterm.js/issues/2960\n      this._rowContainer.remove();\n      this._selectionContainer.remove();\n      this._widthCache.dispose();\n      this._themeStyleElement.remove();\n      this._dimensionsStyleElement.remove();\n    }));\n\n    this._widthCache = new WidthCache();\n    this._widthCache.setFont(\n      this._optionsService.rawOptions.fontFamily,\n      this._optionsService.rawOptions.fontSize,\n      this._optionsService.rawOptions.fontWeight,\n      this._optionsService.rawOptions.fontWeightBold\n    );\n    this._setDefaultSpacing();\n  }\n\n  private _updateDimensions(): void {\n    const dpr = this._coreBrowserService.dpr;\n    this.dimensions.device.char.width = this._charSizeService.width * dpr;\n    this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n    this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n    this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n    this.dimensions.device.char.left = 0;\n    this.dimensions.device.char.top = 0;\n    this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n    this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n    this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n    this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n    this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n    this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n    for (const element of this._rowElements) {\n      element.style.width = `${this.dimensions.css.canvas.width}px`;\n      element.style.height = `${this.dimensions.css.cell.height}px`;\n      element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n      // Make sure rows don't overflow onto following row\n      element.style.overflow = 'hidden';\n    }\n\n    if (!this._dimensionsStyleElement) {\n      this._dimensionsStyleElement = this._document.createElement('style');\n      this._screenElement.appendChild(this._dimensionsStyleElement);\n    }\n\n    const styles =\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +\n      ` display: inline-block;` +   // TODO: find workaround for inline-block (creates ~20% render penalty)\n      ` height: 100%;` +\n      ` vertical-align: top;` +\n      `}`;\n\n    this._dimensionsStyleElement.textContent = styles;\n\n    this._selectionContainer.style.height = this._viewportElement.style.height;\n    this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n  }\n\n  private _injectCss(colors: ReadonlyColorSet): void {\n    if (!this._themeStyleElement) {\n      this._themeStyleElement = this._document.createElement('style');\n      this._screenElement.appendChild(this._themeStyleElement);\n    }\n\n    // Base CSS\n    let styles =\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +\n      // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n      // being delivered if the target element is replaced during the click. This happened due to\n      // refresh() being called during the mousedown handler to start a selection.\n      ` pointer-events: none;` +\n      ` color: ${colors.foreground.css};` +\n      `}`;\n    styles +=\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +\n      ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n      ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n      ` font-kerning: none;` +\n      ` white-space: pre` +\n      `}`;\n    styles +=\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .xterm-dim {` +\n      ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n      `}`;\n    // Text styles\n    styles +=\n      `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n      ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n      `}` +\n      `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n      ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n      `}` +\n      `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n      ` font-style: italic;` +\n      `}` +\n      `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n      ` visibility: hidden;` +\n      `}`;\n    // Blink animation\n    const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n    const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n    const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n    styles +=\n      `@keyframes ${blinkAnimationUnderlineId} {` +\n      ` 50% {` +\n      `  border-bottom-style: hidden;` +\n      ` }` +\n      `}`;\n    styles +=\n      `@keyframes ${blinkAnimationBarId} {` +\n      ` 50% {` +\n      `  box-shadow: none;` +\n      ` }` +\n      `}`;\n    styles +=\n      `@keyframes ${blinkAnimationBlockId} {` +\n      ` 0% {` +\n      `  background-color: ${colors.cursor.css};` +\n      `  color: ${colors.cursorAccent.css};` +\n      ` }` +\n      ` 50% {` +\n      `  background-color: inherit;` +\n      `  color: ${colors.cursor.css};` +\n      ` }` +\n      `}`;\n    // Cursor\n    styles +=\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n      ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n      ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n      ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n      `}` +\n      // Disable cursor blinking when idle\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n      ` animation: none !important;` +\n      `}` +\n      // !important helps fix an issue where the cursor will not render on top of the selection,\n      // however it's very hard to fix this issue and retain the blink animation without the use of\n      // !important. So this edge case fails when cursor blink is on.\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n      ` background-color: ${colors.cursor.css};` +\n      ` color: ${colors.cursorAccent.css};` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n      ` background-color: ${colors.cursor.css} !important;` +\n      ` color: ${colors.cursorAccent.css} !important;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n      ` outline: 1px solid ${colors.cursor.css};` +\n      ` outline-offset: -1px;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n      ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n      ` border-bottom: 1px ${colors.cursor.css};` +\n      ` border-bottom-style: solid;` +\n      ` height: calc(100% - 1px);` +\n      `}`;\n    // Selection\n    styles +=\n      `${this._terminalSelector} .${SELECTION_CLASS} {` +\n      ` position: absolute;` +\n      ` top: 0;` +\n      ` left: 0;` +\n      ` z-index: 1;` +\n      ` pointer-events: none;` +\n      `}` +\n      `${this._terminalSelector}.focus .${SELECTION_CLASS} div {` +\n      ` position: absolute;` +\n      ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n      `}` +\n      `${this._terminalSelector} .${SELECTION_CLASS} div {` +\n      ` position: absolute;` +\n      ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n      `}`;\n    // Colors\n    for (const [i, c] of colors.ansi.entries()) {\n      styles +=\n        `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n        `${this._terminalSelector} .${FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n        `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n    }\n    styles +=\n      `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n      `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n      `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n    this._themeStyleElement.textContent = styles;\n  }\n\n  /**\n   * default letter spacing\n   * Due to rounding issues in dimensions dpr calc glyph might render\n   * slightly too wide or too narrow. The method corrects the stacking offsets\n   * by applying a default letter-spacing for all chars.\n   * The value gets passed to the row factory to avoid setting this value again\n   * (render speedup is roughly 10%).\n   */\n  private _setDefaultSpacing(): void {\n    // measure same char as in CharSizeService to get the base deviation\n    const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n    this._rowContainer.style.letterSpacing = `${spacing}px`;\n    this._rowFactory.defaultSpacing = spacing;\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    this._updateDimensions();\n    this._widthCache.clear();\n    this._setDefaultSpacing();\n  }\n\n  private _refreshRowElements(cols: number, rows: number): void {\n    // Add missing elements\n    for (let i = this._rowElements.length; i <= rows; i++) {\n      const row = this._document.createElement('div');\n      this._rowContainer.appendChild(row);\n      this._rowElements.push(row);\n      this._rowHasBlinkingCells.push(false);\n    }\n    // Remove excess elements\n    while (this._rowElements.length > rows) {\n      this._rowContainer.removeChild(this._rowElements.pop()!);\n      if (this._rowHasBlinkingCells.pop()) {\n        this._rowHasBlinkingCellsCount--;\n      }\n    }\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    this._refreshRowElements(cols, rows);\n    this._updateDimensions();\n    this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n  }\n\n  public handleCharSizeChanged(): void {\n    this._updateDimensions();\n    this._widthCache.clear();\n    this._setDefaultSpacing();\n  }\n\n  public handleBlur(): void {\n    this._rowContainer.classList.remove(FOCUS_CLASS);\n    this._cursorBlinkStateManager.pause();\n    this.renderRows(0, this._bufferService.rows - 1);\n  }\n\n  public handleFocus(): void {\n    this._rowContainer.classList.add(FOCUS_CLASS);\n    this._cursorBlinkStateManager.resume();\n    this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n  }\n\n  public handleViewportVisibilityChange(isVisible: boolean): void {\n    this._textBlinkStateManager.setViewportVisible(isVisible);\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    const rows = this._bufferService.rows;\n\n    // Remove all selections\n    this._selectionContainer.replaceChildren();\n    this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n    // Determine old selection viewport band\n    let oldViewportStart = 0;\n    let oldViewportEnd = -1;\n    if (this._lastSelectionStart && this._lastSelectionEnd) {\n      this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n      if (this._selectionRenderModel.hasSelection) {\n        oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n        oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n      }\n    }\n\n    // Determine new selection viewport band and create overlays\n    let newViewportStart = 0;\n    let newViewportEnd = -1;\n    if (!start || !end) {\n      return;\n    }\n    this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n    if (this._selectionRenderModel.hasSelection) {\n      const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n      const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n      const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n      const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n      newViewportStart = viewportCappedStartRow;\n      newViewportEnd = viewportCappedEndRow;\n\n      // Create the selections\n      const documentFragment = this._document.createDocumentFragment();\n\n      if (columnSelectMode) {\n        const isXFlipped = start[0] > end[0];\n        documentFragment.appendChild(\n          this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n        );\n      } else {\n        // Draw first row\n        const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n        const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n        documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n        // Draw middle rows\n        const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n        documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n        // Draw final row\n        if (viewportCappedStartRow !== viewportCappedEndRow) {\n          // Only draw viewportEndRow if it's not the same as viewporttartRow\n          const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n          documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n        }\n      }\n      this._selectionContainer.appendChild(documentFragment);\n    }\n\n    // Compute minimal row range to redraw\n    let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n    let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n    if (renderEndRow >= 0) {\n      // Clamp to viewport\n      renderStartRow = Math.max(renderStartRow, 0);\n      renderEndRow = Math.min(renderEndRow, rows - 1);\n\n      // Ensure cursor row is included when a selection is present\n      const buffer = this._bufferService.buffer;\n      const cursorViewportRow = buffer.y;\n      if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n        renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n        renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n      }\n\n      this.renderRows(renderStartRow, renderEndRow);\n    }\n\n    // Update last selection state\n    this._lastSelectionStart = start;\n    this._lastSelectionEnd = end;\n    this._lastSelectionColumnMode = columnSelectMode;\n  }\n\n  /**\n   * Creates a selection element at the specified position.\n   * @param row The row of the selection.\n   * @param colStart The start column.\n   * @param colEnd The end columns.\n   */\n  private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n    const element = this._document.createElement('div');\n    const left = colStart * this.dimensions.css.cell.width;\n    let width = this.dimensions.css.cell.width * (colEnd - colStart);\n    if (left + width > this.dimensions.css.canvas.width) {\n      width = this.dimensions.css.canvas.width - left;\n    }\n\n    element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n    element.style.top = `${row * this.dimensions.css.cell.height}px`;\n    element.style.left = `${left}px`;\n    element.style.width = `${width}px`;\n    return element;\n  }\n\n  public handleCursorMove(): void {\n    // Reset idle timer on cursor movement (which happens on input)\n    this._cursorBlinkStateManager.restartBlinkAnimation();\n  }\n\n  private _handleOptionsChanged(): void {\n    // Force a refresh\n    this._updateDimensions();\n    // Refresh CSS\n    this._injectCss(this._themeService.colors);\n    // update spacing cache\n    this._widthCache.setFont(\n      this._optionsService.rawOptions.fontFamily,\n      this._optionsService.rawOptions.fontSize,\n      this._optionsService.rawOptions.fontWeight,\n      this._optionsService.rawOptions.fontWeightBold\n    );\n    this._setDefaultSpacing();\n  }\n\n  public clear(): void {\n    for (const e of this._rowElements) {\n      /**\n       * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n       * `@testing-library/react`\n       *\n       * references:\n       * - https://github.com/testing-library/react-testing-library/issues/1146\n       * - https://github.com/jsdom/jsdom/issues/1245\n       */\n      e.replaceChildren();\n    }\n    if (this._rowHasBlinkingCellsCount > 0) {\n      this._rowHasBlinkingCells.fill(false);\n      this._rowHasBlinkingCellsCount = 0;\n      this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n    }\n  }\n\n  public renderRows(start: number, end: number): void {\n    const buffer = this._bufferService.buffer;\n    const cursorAbsoluteY = buffer.ybase + buffer.y;\n    const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n    const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n    const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n    const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n    const rowInfo = { hasBlinkingCells: false };\n\n    for (let y = start; y <= end; y++) {\n      const row = y + buffer.ydisp;\n      const rowElement = this._rowElements[y];\n      const lineData = buffer.lines.get(row);\n      if (!rowElement || !lineData) {\n        break;\n      }\n      rowElement.replaceChildren(\n        ...this._rowFactory.createRow(\n          lineData,\n          row,\n          row === cursorAbsoluteY,\n          cursorStyle,\n          cursorInactiveStyle,\n          cursorX,\n          cursorBlink,\n          this._textBlinkStateManager.isBlinkOn,\n          this.dimensions.css.cell.width,\n          this._widthCache,\n          -1,\n          -1,\n          rowInfo\n        )\n      );\n      this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n    }\n    this._updateTextBlinkState();\n  }\n\n  private get _terminalSelector(): string {\n    return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n  }\n\n  private _handleLinkHover(e: ILinkifierEvent): void {\n    this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n  }\n\n  private _handleLinkLeave(e: ILinkifierEvent): void {\n    this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n  }\n\n  private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n    /**\n     * NOTE: The linkifier may send out of viewport y-values if:\n     * - negative y-value: the link started at a higher line\n     * - y-value >= maxY: the link ends at a line below viewport\n     *\n     * For negative y-values we can simply adjust x = 0,\n     * as higher up link start means, that everything from\n     * (0,0) is a link under top-down-left-right char progression\n     *\n     * Additionally there might be a small chance of out-of-sync x|y-values\n     * from a race condition of render updates vs. link event handler execution:\n     * - (sync) resize: chances terminal buffer in sync, schedules render update async\n     * - (async) link handler race condition: new buffer metrics, but still on old render state\n     * - (async) render update: brings term metrics and render state back in sync\n     */\n    // clip coords into viewport\n    if (y < 0) x = 0;\n    if (y2 < 0) x2 = 0;\n    const maxY = this._bufferService.rows - 1;\n    y = Math.max(Math.min(y, maxY), 0);\n    y2 = Math.max(Math.min(y2, maxY), 0);\n\n    cols = Math.min(cols, this._bufferService.cols);\n    const buffer = this._bufferService.buffer;\n    const cursorAbsoluteY = buffer.ybase + buffer.y;\n    const cursorX = Math.min(buffer.x, cols - 1);\n    const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n    const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n    const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n    const rowInfo = { hasBlinkingCells: false };\n\n    // refresh rows within link range\n    for (let i = y; i <= y2; ++i) {\n      const row = i + buffer.ydisp;\n      const rowElement = this._rowElements[i];\n      const bufferline = buffer.lines.get(row);\n      if (!rowElement || !bufferline) {\n        break;\n      }\n      rowElement.replaceChildren(\n        ...this._rowFactory.createRow(\n          bufferline,\n          row,\n          row === cursorAbsoluteY,\n          cursorStyle,\n          cursorInactiveStyle,\n          cursorX,\n          cursorBlink,\n          this._textBlinkStateManager.isBlinkOn,\n          this.dimensions.css.cell.width,\n          this._widthCache,\n          enabled ? (i === y ? x : 0) : -1,\n          enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n          rowInfo\n        )\n      );\n      this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n    }\n    this._updateTextBlinkState();\n  }\n\n  private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n    const previous = this._rowHasBlinkingCells[row];\n    if (previous === hasBlinkingCells) {\n      return;\n    }\n    this._rowHasBlinkingCells[row] = hasBlinkingCells;\n    this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n  }\n\n  private _updateTextBlinkState(): void {\n    this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n  }\n}\n\nclass CursorBlinkStateManager {\n  private _idleTimeout: number | undefined;\n  private _isIdlePaused: boolean = false;\n\n  constructor(\n    private readonly _rowContainer: HTMLElement,\n    private readonly _coreBrowserService: ICoreBrowserService\n  ) {\n    if (this._coreBrowserService.isFocused) {\n      this._resetIdleTimer();\n    }\n  }\n\n  public dispose(): void {\n    this._clearIdleTimer();\n  }\n\n  public restartBlinkAnimation(): void {\n    if (this._isIdlePaused) {\n      this._rowContainer.classList.remove(CURSOR_BLINK_IDLE_CLASS);\n    }\n    this._resetIdleTimer();\n  }\n\n  public pause(): void {\n    this._isIdlePaused = false;\n    this._clearIdleTimer();\n  }\n\n  public resume(): void {\n    this._isIdlePaused = false;\n    this._rowContainer.classList.remove(CURSOR_BLINK_IDLE_CLASS);\n    this._resetIdleTimer();\n  }\n\n  private _resetIdleTimer(): void {\n    this._isIdlePaused = false;\n    this._clearIdleTimer();\n    this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n      this._stopBlinkingDueToIdle();\n    }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n  }\n\n  private _clearIdleTimer(): void {\n    if (this._idleTimeout) {\n      this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n      this._idleTimeout = undefined;\n    }\n  }\n\n  private _stopBlinkingDueToIdle(): void {\n    this._rowContainer.classList.add(CURSOR_BLINK_IDLE_CLASS);\n    this._isIdlePaused = true;\n    this._idleTimeout = undefined;\n  }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { Disposable } from 'common/Lifecycle';\nimport { Emitter } from 'common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n  public serviceBrand: undefined;\n\n  public width: number = 0;\n  public height: number = 0;\n  private _measureStrategy: IMeasureStrategy;\n\n  public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n  private readonly _onCharSizeChange = this._register(new Emitter<void>());\n  public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n  constructor(\n    document: Document,\n    parentElement: HTMLElement,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    try {\n      this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n    } catch {\n      this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n    }\n    this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n  }\n\n  public measure(): void {\n    const result = this._measureStrategy.measure();\n    if (result.width !== this.width || result.height !== this.height) {\n      this.width = result.width;\n      this.height = result.height;\n      this._onCharSizeChange.fire();\n    }\n  }\n}\n\ninterface IMeasureStrategy {\n  measure(): Readonly<IMeasureResult>;\n}\n\ninterface IMeasureResult {\n  width: number;\n  height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n  REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n  protected _result: IMeasureResult = { width: 0, height: 0 };\n\n  protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n    // If values are 0 then the element is likely currently display:none, in which case we should\n    // retain the previous value.\n    if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n      this._result.width = width;\n      this._result.height = height;\n    }\n  }\n\n  public abstract measure(): Readonly<IMeasureResult>;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n  private _measureElement: HTMLElement;\n\n  constructor(\n    private _document: Document,\n    private _parentElement: HTMLElement,\n    private _optionsService: IOptionsService\n  ) {\n    super();\n    this._measureElement = this._document.createElement('span');\n    this._measureElement.classList.add('xterm-char-measure-element');\n    this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n    this._measureElement.setAttribute('aria-hidden', 'true');\n    this._measureElement.style.whiteSpace = 'pre';\n    this._measureElement.style.fontKerning = 'none';\n    this._parentElement.appendChild(this._measureElement);\n  }\n\n  public measure(): Readonly<IMeasureResult> {\n    this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n    this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n    // Note that this triggers a synchronous layout\n    this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n    return this._result;\n  }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n  private _canvas: OffscreenCanvas;\n  private _ctx: OffscreenCanvasRenderingContext2D;\n\n  constructor(\n    private _optionsService: IOptionsService\n  ) {\n    super();\n    // This will throw if any required API is not supported\n    this._canvas = new OffscreenCanvas(100, 100);\n    this._ctx = this._canvas.getContext('2d')!;\n    const a = this._ctx.measureText('W');\n    if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n      throw new Error('Required font metrics not supported');\n    }\n  }\n\n  public measure(): Readonly<IMeasureResult> {\n    this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n    const metrics = this._ctx.measureText('W');\n    this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n    return this._result;\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n  public serviceBrand: undefined;\n\n  private _isFocused = false;\n  private _cachedIsFocused: boolean | undefined = undefined;\n  private _screenDprMonitor: ScreenDprMonitor;\n\n  private readonly _onDprChange = this._register(new Emitter<number>());\n  public readonly onDprChange = this._onDprChange.event;\n  private readonly _onWindowChange = this._register(new Emitter<Window & typeof globalThis>());\n  public readonly onWindowChange = this._onWindowChange.event;\n\n  constructor(\n    private _textarea: HTMLTextAreaElement,\n    private _window: Window & typeof globalThis,\n    public readonly mainDocument: Document\n  ) {\n    super();\n\n    this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n    // Monitor device pixel ratio\n    this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n    this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n    this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n    this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n  }\n\n  public get window(): Window & typeof globalThis {\n    return this._window;\n  }\n\n  public set window(value: Window & typeof globalThis) {\n    if (this._window !== value) {\n      this._window = value;\n      this._onWindowChange.fire(this._window);\n    }\n  }\n\n  public get dpr(): number {\n    return this.window.devicePixelRatio;\n  }\n\n  public get isFocused(): boolean {\n    if (this._cachedIsFocused === undefined) {\n      this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n      queueMicrotask(() => this._cachedIsFocused = undefined);\n    }\n    return this._cachedIsFocused;\n  }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n  private _currentDevicePixelRatio: number;\n  private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n  private _resolutionMediaMatchList: MediaQueryList | undefined;\n  private _windowResizeListener = this._register(new MutableDisposable());\n\n  private readonly _onDprChange = this._register(new Emitter<number>());\n  public readonly onDprChange = this._onDprChange.event;\n\n  constructor(private _parentWindow: Window) {\n    super();\n\n    // Initialize listener and dpr value\n    this._outerListener = () => this._setDprAndFireIfDiffers();\n    this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n    this._updateDpr();\n\n    // Monitor active window resize\n    this._setWindowResizeListener();\n\n    // Setup additional disposables\n    this._register(toDisposable(() => this.clearListener()));\n  }\n\n\n  public setWindow(parentWindow: Window): void {\n    this._parentWindow = parentWindow;\n    this._setWindowResizeListener();\n    this._setDprAndFireIfDiffers();\n  }\n\n  private _setWindowResizeListener(): void {\n    this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n  }\n\n  private _setDprAndFireIfDiffers(): void {\n    if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n      this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n    }\n    this._updateDpr();\n  }\n\n  private _updateDpr(): void {\n    if (!this._outerListener) {\n      return;\n    }\n\n    // Clear listeners for old DPR\n    this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n    // Add listeners for new DPR\n    this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n    this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n    this._resolutionMediaMatchList.addListener(this._outerListener);\n  }\n\n  public clearListener(): void {\n    if (!this._resolutionMediaMatchList || !this._outerListener) {\n      return;\n    }\n    this._resolutionMediaMatchList.removeListener(this._outerListener);\n    this._resolutionMediaMatchList = undefined;\n    this._outerListener = undefined;\n  }\n}\n", "import { ILinkProvider, ILinkProviderService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n  declare public serviceBrand: undefined;\n\n  public readonly linkProviders: ILinkProvider[] = [];\n\n  constructor() {\n    super();\n    this._register(toDisposable(() => this.linkProviders.length = 0));\n  }\n\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    this.linkProviders.push(linkProvider);\n    return {\n      dispose: () => {\n        // Remove the link provider from the list\n        const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n        if (providerIndex !== -1) {\n          this.linkProviders.splice(providerIndex, 1);\n        }\n      }\n    };\n  }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n  const rect = element.getBoundingClientRect();\n  const elementStyle = window.getComputedStyle(element);\n  const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'));\n  const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'));\n  return [\n    event.clientX - rect.left - leftPadding,\n    event.clientY - rect.top - topPadding\n  ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows n the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick<Window, 'getComputedStyle'>, event: Pick<MouseEvent, 'clientX' | 'clientY'>, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n  // Coordinates cannot be measured if there are no valid\n  if (!hasValidCharSize) {\n    return undefined;\n  }\n\n  const coords = getCoordsRelativeToElement(window, event, element);\n  if (!coords) {\n    return undefined;\n  }\n\n  coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n  coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n  // Ensure coordinates are within the terminal viewport. Note that selections\n  // need an addition point of precision to cover the end point (as characters\n  // cover half of one char and half of the next).\n  coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n  coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n  return coords;\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from 'browser/Dom';\nimport { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from 'browser/services/Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n  public serviceBrand: undefined;\n\n  constructor(\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n  }\n\n  public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n    return getCoords(\n      window,\n      event,\n      element,\n      colCount,\n      rowCount,\n      this._charSizeService.hasValidSize,\n      this._renderService.dimensions.css.cell.width,\n      this._renderService.dimensions.css.cell.height,\n      isSelection\n    );\n  }\n\n  public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n    const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n    if (!this._charSizeService.hasValidSize) {\n      return undefined;\n    }\n    coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n    coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n    return {\n      col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n      row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n      x: Math.floor(coords[0]),\n      y: Math.floor(coords[1])\n    };\n  }\n}\n", "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from 'common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail<T>(array: ArrayLike<T>, n: number = 0): T | undefined {\n  return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n  let fnKey: string | null = null;\n  let fn: Function | null = null;\n\n  if (typeof descriptor.value === 'function') {\n    fnKey = 'value';\n    fn = descriptor.value;\n\n    if (fn!.length !== 0) {\n      console.warn('Memoize should only be used in functions with zero parameters');\n    }\n  } else if (typeof descriptor.get === 'function') {\n    fnKey = 'get';\n    fn = descriptor.get;\n  }\n\n  if (!fn || !fnKey) {\n    throw new Error('not supported');\n  }\n\n  const memoizeKey = `$memoize$${key}`;\n  const descriptorAny = descriptor as { [key: string]: any };\n  descriptorAny[fnKey] = function (...args: any[]) {\n    if (!this.hasOwnProperty(memoizeKey)) {\n      Object.defineProperty(this, memoizeKey, {\n        configurable: false,\n        enumerable: false,\n        writable: false,\n        value: fn.apply(this, args)\n      });\n    }\n\n    return (this as { [key: string]: any })[memoizeKey];\n  };\n}\n\nclass LinkedListNode<E> {\n\n  public static readonly Undefined = new LinkedListNode<any>(undefined);\n\n  public element: E;\n  public next: LinkedListNode<E>;\n  public prev: LinkedListNode<E>;\n\n  public constructor(element: E) {\n    this.element = element;\n    this.next = LinkedListNode.Undefined;\n    this.prev = LinkedListNode.Undefined;\n  }\n}\n\nclass LinkedList<E> {\n\n  private _first: LinkedListNode<E> = LinkedListNode.Undefined;\n  private _last: LinkedListNode<E> = LinkedListNode.Undefined;\n\n  public push(element: E): () => void {\n    return this._insert(element, true);\n  }\n\n  private _insert(element: E, atTheEnd: boolean): () => void {\n    const newNode = new LinkedListNode(element);\n    if (this._first === LinkedListNode.Undefined) {\n      this._first = newNode;\n      this._last = newNode;\n\n    } else if (atTheEnd) {\n      const oldLast = this._last;\n      this._last = newNode;\n      newNode.prev = oldLast;\n      oldLast.next = newNode;\n\n    } else {\n      const oldFirst = this._first;\n      this._first = newNode;\n      newNode.next = oldFirst;\n      oldFirst.prev = newNode;\n    }\n    let didRemove = false;\n    return () => {\n      if (!didRemove) {\n        didRemove = true;\n        this._remove(newNode);\n      }\n    };\n  }\n\n  private _remove(node: LinkedListNode<E>): void {\n    if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n      const anchor = node.prev;\n      anchor.next = node.next;\n      node.next.prev = anchor;\n\n    } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n      this._first = LinkedListNode.Undefined;\n      this._last = LinkedListNode.Undefined;\n\n    } else if (node.next === LinkedListNode.Undefined) {\n      this._last = this._last.prev!;\n      this._last.next = LinkedListNode.Undefined;\n\n    } else if (node.prev === LinkedListNode.Undefined) {\n      this._first = this._first.next!;\n      this._first.prev = LinkedListNode.Undefined;\n    }\n  }\n\n  public *[Symbol.iterator](): Iterator<E> {\n    let node = this._first;\n    while (node !== LinkedListNode.Undefined) {\n      yield node.element;\n      node = node.next;\n    }\n  }\n}\n\nexport namespace EventType {\n  export const TAP = '-xterm-gesturetap';\n  export const CHANGE = '-xterm-gesturechange';\n  export const START = '-xterm-gesturestart';\n  export const END = '-xterm-gesturesend';\n  export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n  id: number;\n  initialTarget: EventTarget;\n  initialTimeStamp: number;\n  initialPageX: number;\n  initialPageY: number;\n  rollingTimestamps: number[];\n  rollingPageX: number[];\n  rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n  initialTarget: EventTarget | undefined;\n  translationX: number;\n  translationY: number;\n  pageX: number;\n  pageY: number;\n  clientX: number;\n  clientY: number;\n  tapCount: number;\n}\n\ninterface ITouch {\n  identifier: number;\n  screenX: number;\n  screenY: number;\n  clientX: number;\n  clientY: number;\n  pageX: number;\n  pageY: number;\n  radiusX: number;\n  radiusY: number;\n  rotationAngle: number;\n  force: number;\n  target: Element;\n}\n\ninterface ITouchList {\n  [i: number]: ITouch;\n  length: number;\n  item(index: number): ITouch;\n  identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n  touches: ITouchList;\n  targetTouches: ITouchList;\n  changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n  private static readonly _scrollFriction = -0.005;\n  private static _instance: Gesture;\n  private static readonly _holdDelay = 700;\n\n  private _dispatched = false;\n  private readonly _targets = new LinkedList<HTMLElement>();\n  private readonly _ignoreTargets = new LinkedList<HTMLElement>();\n  private _handle: IDisposable | null;\n\n  private readonly _activeTouches: { [id: number]: ITouchData };\n\n  private _lastSetTapCountTime: number;\n\n  private static readonly _clearTapCountTime = 400; // ms\n\n\n  private constructor() {\n    super();\n\n    this._activeTouches = {};\n    this._handle = null;\n    this._lastSetTapCountTime = 0;\n\n    const targetWindow = mainWindow;\n    this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n    this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n    this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n  }\n\n  public static addTarget(element: HTMLElement): IDisposable {\n    if (!Gesture.isTouchDevice()) {\n      return Disposable.None;\n    }\n    if (!Gesture._instance) {\n      Gesture._instance = new Gesture();\n    }\n\n    const remove = Gesture._instance._targets.push(element);\n    return toDisposable(remove);\n  }\n\n  public static ignoreTarget(element: HTMLElement): IDisposable {\n    if (!Gesture.isTouchDevice()) {\n      return Disposable.None;\n    }\n    if (!Gesture._instance) {\n      Gesture._instance = new Gesture();\n    }\n\n    const remove = Gesture._instance._ignoreTargets.push(element);\n    return toDisposable(remove);\n  }\n\n  @memoize\n  public static isTouchDevice(): boolean {\n    return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n  }\n\n  public override dispose(): void {\n    if (this._handle) {\n      this._handle.dispose();\n      this._handle = null;\n    }\n\n    super.dispose();\n  }\n\n  private _handleTouchStart(e: ITouchEvent): void {\n    const timestamp = Date.now();\n\n    if (this._handle) {\n      this._handle.dispose();\n      this._handle = null;\n    }\n\n    for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n      const touch = e.targetTouches.item(i);\n\n      this._activeTouches[touch.identifier] = {\n        id: touch.identifier,\n        initialTarget: touch.target,\n        initialTimeStamp: timestamp,\n        initialPageX: touch.pageX,\n        initialPageY: touch.pageY,\n        rollingTimestamps: [timestamp],\n        rollingPageX: [touch.pageX],\n        rollingPageY: [touch.pageY]\n      };\n\n      const evt = this._newGestureEvent(EventType.START, touch.target);\n      evt.pageX = touch.pageX;\n      evt.pageY = touch.pageY;\n      this._dispatchEvent(evt);\n    }\n\n    if (this._dispatched) {\n      e.preventDefault();\n      e.stopPropagation();\n      this._dispatched = false;\n    }\n  }\n\n  private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n    const timestamp = Date.now();\n\n    const activeTouchCount = Object.keys(this._activeTouches).length;\n\n    for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n      const touch = e.changedTouches.item(i);\n\n      if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n        console.warn('move of an UNKNOWN touch', touch);\n        continue;\n      }\n\n      const data = this._activeTouches[touch.identifier];\n      const holdTime = Date.now() - data.initialTimeStamp;\n\n      if (holdTime < Gesture._holdDelay\n        && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n        && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n        const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n        evt.pageX = tail(data.rollingPageX)!;\n        evt.pageY = tail(data.rollingPageY)!;\n        this._dispatchEvent(evt);\n\n      } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n        const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n        evt.pageX = tail(data.rollingPageX)!;\n        evt.pageY = tail(data.rollingPageY)!;\n        this._dispatchEvent(evt);\n\n      } else if (activeTouchCount === 1) {\n        const finalX = tail(data.rollingPageX)!;\n        const finalY = tail(data.rollingPageY)!;\n\n        const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n        const deltaX = finalX - data.rollingPageX[0];\n        const deltaY = finalY - data.rollingPageY[0];\n\n        const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n        this._inertia(targetWindow, dispatchTo, timestamp,\n          Math.abs(deltaX) / deltaT,\n          deltaX > 0 ? 1 : -1,\n          finalX,\n          Math.abs(deltaY) / deltaT,\n          deltaY > 0 ? 1 : -1,\n          finalY\n        );\n      }\n\n\n      this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n      delete this._activeTouches[touch.identifier];\n    }\n\n    if (this._dispatched) {\n      e.preventDefault();\n      e.stopPropagation();\n      this._dispatched = false;\n    }\n  }\n\n  private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n    const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n    event.initEvent(type, false, true);\n    event.initialTarget = initialTarget;\n    event.tapCount = 0;\n    return event;\n  }\n\n  private _dispatchEvent(event: IGestureEvent): void {\n    if (event.type === EventType.TAP) {\n      const currentTime = (new Date()).getTime();\n      let setTapCount = 0;\n      if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n        setTapCount = 1;\n      } else {\n        setTapCount = 2;\n      }\n\n      this._lastSetTapCountTime = currentTime;\n      event.tapCount = setTapCount;\n    } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n      this._lastSetTapCountTime = 0;\n    }\n\n    if (event.initialTarget instanceof Node) {\n      for (const ignoreTarget of this._ignoreTargets) {\n        if (ignoreTarget.contains(event.initialTarget)) {\n          return;\n        }\n      }\n\n      const targets: [number, HTMLElement][] = [];\n      for (const target of this._targets) {\n        if (target.contains(event.initialTarget)) {\n          let depth = 0;\n          let now: Node | null = event.initialTarget;\n          while (now && now !== target) {\n            depth++;\n            now = now.parentElement;\n          }\n          targets.push([depth, target]);\n        }\n      }\n\n      targets.sort((a, b) => a[0] - b[0]);\n\n      for (const [, target] of targets) {\n        target.dispatchEvent(event);\n        this._dispatched = true;\n      }\n    }\n  }\n\n  private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray<EventTarget>, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n    this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n      const now = Date.now();\n\n      const deltaT = now - t1;\n      let deltaPosX = 0;\n      let deltaPosY = 0;\n      let stopped = true;\n\n      vX += Gesture._scrollFriction * deltaT;\n      vY += Gesture._scrollFriction * deltaT;\n\n      if (vX > 0) {\n        stopped = false;\n        deltaPosX = dirX * vX * deltaT;\n      }\n\n      if (vY > 0) {\n        stopped = false;\n        deltaPosY = dirY * vY * deltaT;\n      }\n\n      const evt = this._newGestureEvent(EventType.CHANGE);\n      evt.translationX = deltaPosX;\n      evt.translationY = deltaPosY;\n      dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n      if (!stopped) {\n        this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n      }\n    });\n  }\n\n  private _handleTouchMove(e: ITouchEvent): void {\n    const timestamp = Date.now();\n\n    for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n      const touch = e.changedTouches.item(i);\n\n      if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n        console.warn('end of an UNKNOWN touch', touch);\n        continue;\n      }\n\n      const data = this._activeTouches[touch.identifier];\n\n      const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n      evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n      evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n      evt.pageX = touch.pageX;\n      evt.pageY = touch.pageY;\n      evt.clientX = touch.clientX;\n      evt.clientY = touch.clientY;\n      this._dispatchEvent(evt);\n\n      if (data.rollingPageX.length > 3) {\n        data.rollingPageX.shift();\n        data.rollingPageY.shift();\n        data.rollingTimestamps.shift();\n      }\n\n      data.rollingPageX.push(touch.pageX);\n      data.rollingPageY.push(touch.pageY);\n      data.rollingTimestamps.push(timestamp);\n    }\n\n    if (this._dispatched) {\n      e.preventDefault();\n      e.stopPropagation();\n      this._dispatched = false;\n    }\n  }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from 'browser/Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from 'common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\nimport { toDisposable } from 'common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from 'browser/scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\ninterface IMouseBindContext {\n  readonly target: IMouseServiceTarget;\n  readonly focus: () => void;\n  readonly requestedEvents: RequestedMouseEvents;\n}\n\nexport class MouseService implements IMouseService {\n  public serviceBrand: undefined;\n\n  private _lastEvent: ICoreMouseEvent | null = null;\n  private _wheelPartialScroll: number = 0;\n  private _touchScrollAccumulator: number = 0;\n\n  constructor(\n    @IRenderService private readonly _renderService: IRenderService,\n    @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n    @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ISelectionService private readonly _selectionService: ISelectionService,\n    @ILogService private readonly _logService: ILogService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n  ) {\n  }\n\n  public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n    const { element, document } = target;\n\n    /**\n     * Event listener state handling.\n     * We listen to the onProtocolChange event of MouseStateService and put\n     * requested listeners in `requestedEvents`. With this the listeners\n     * have all bits to do the event listener juggling.\n     * Note: 'mousedown' currently is \"always on\" and not managed\n     * by onProtocolChange.\n     */\n    const requestedEvents: RequestedMouseEvents = {\n      mouseup: null,\n      wheel: null,\n      mousedrag: null,\n      mousemove: null\n    };\n    const ctx: IMouseBindContext = { target, focus, requestedEvents };\n    const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n      mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n      wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n      mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n      mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n    };\n    register(this._mouseStateService.onProtocolChange(events => {\n      this._handleProtocolChange(ctx, eventListeners, events);\n    }));\n    // force initial onProtocolChange so we dont miss early mouse requests\n    this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n    // Ensure document-level listeners are removed on dispose\n    register(toDisposable(() => {\n      if (requestedEvents.mouseup) {\n        document.removeEventListener('mouseup', requestedEvents.mouseup);\n      }\n      if (requestedEvents.mousedrag) {\n        document.removeEventListener('mousemove', requestedEvents.mousedrag);\n      }\n    }));\n\n    /**\n     * \"Always on\" event listeners.\n     */\n    register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n    register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n    register(Gesture.addTarget(target.screenElement));\n    register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n    register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n  }\n\n  private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n    // Get mouse coordinates\n    const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n    if (!pos) {\n      return false;\n    }\n\n    let but: CoreMouseButton;\n    let action: CoreMouseAction | undefined;\n    switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n      case 'mousemove':\n        action = CoreMouseAction.MOVE;\n        if (ev.buttons === undefined) {\n          // buttons is not supported on macOS, try to get a value from button instead\n          but = CoreMouseButton.NONE;\n          if (ev.button !== undefined) {\n            but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n          }\n        } else {\n          // according to MDN buttons only reports up to button 5 (AUX2)\n          but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n            ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n              ev.buttons & 2 ? CoreMouseButton.RIGHT :\n                CoreMouseButton.NONE; // fallback to NONE\n        }\n        break;\n      case 'mouseup':\n        action = CoreMouseAction.UP;\n        but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n        break;\n      case 'mousedown':\n        action = CoreMouseAction.DOWN;\n        but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n        break;\n      case 'wheel':\n        if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n          return false;\n        }\n        const deltaY = (ev as WheelEvent).deltaY;\n        if (deltaY === 0) {\n          return false;\n        }\n        const lines = this._consumeWheelEvent(\n          ev as WheelEvent,\n          this._renderService?.dimensions?.device?.cell?.height,\n          this._coreBrowserService?.dpr\n        );\n        if (lines === 0) {\n          return false;\n        }\n        action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n        but = CoreMouseButton.WHEEL;\n        break;\n      default:\n        // dont handle other event types by accident\n        return false;\n    }\n\n    // exit if we cannot determine valid button/action values\n    // do nothing for higher buttons than wheel\n    if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n      return false;\n    }\n\n    return this._triggerMouseEvent({\n      col: pos.col,\n      row: pos.row,\n      x: pos.x,\n      y: pos.y,\n      button: but,\n      action,\n      ctrl: ev.ctrlKey,\n      alt: ev.altKey,\n      shift: ev.shiftKey\n    });\n  }\n\n  private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n    this._sendEvent(ctx, ev);\n    if (!ev.buttons) {\n      // if no other button is held remove global handlers\n      if (ctx.requestedEvents.mouseup) {\n        ctx.target.document.removeEventListener('mouseup', ctx.requestedEvents.mouseup);\n      }\n      if (ctx.requestedEvents.mousedrag) {\n        ctx.target.document.removeEventListener('mousemove', ctx.requestedEvents.mousedrag);\n      }\n    }\n  }\n\n  private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n    this._sendEvent(ctx, ev);\n    ev.preventDefault();\n    ev.stopPropagation();\n    return false;\n  }\n\n  private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n    // deal only with move while a button is held\n    if (ev.buttons) {\n      this._sendEvent(ctx, ev);\n    }\n  }\n\n  private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n    // deal only with move without any button\n    if (!ev.buttons) {\n      this._sendEvent(ctx, ev);\n    }\n  }\n\n  private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n    ev.preventDefault();\n    ctx.focus();\n\n    // Don't send the mouse button to the pty if mouse events are disabled or\n    // if the selection manager is having selection forced (ie. a modifier is\n    // held).\n    if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n      return;\n    }\n\n    this._sendEvent(ctx, ev);\n\n    // Register additional global handlers which should keep reporting outside\n    // of the terminal element.\n    // Note: Other emulators also do this for 'mousedown' while a button\n    // is held, we currently limit 'mousedown' to the terminal only.\n    if (ctx.requestedEvents.mouseup) {\n      ctx.target.document.addEventListener('mouseup', ctx.requestedEvents.mouseup);\n    }\n    if (ctx.requestedEvents.mousedrag) {\n      ctx.target.document.addEventListener('mousemove', ctx.requestedEvents.mousedrag);\n    }\n  }\n\n  private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n    // do nothing, if app side handles wheel itself\n    if (ctx.requestedEvents.wheel) {\n      return;\n    }\n\n    if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n      return false;\n    }\n\n    if (!this._bufferService.buffer.hasScrollback) {\n      // Convert wheel events into up/down events when the buffer does not have scrollback, this\n      // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n      // events are not enabled.\n      // This used implementation used get the actual lines/partial lines scrolled from the\n      // viewport but since moving to the new viewport implementation has been simplified to\n      // simply send a single up or down sequence.\n\n      // Do nothing if there's no vertical scroll\n      const deltaY = ev.deltaY;\n      if (deltaY === 0) {\n        return false;\n      }\n\n      const lines = this._consumeWheelEvent(\n        ev,\n        this._renderService?.dimensions?.device?.cell?.height,\n        this._coreBrowserService?.dpr\n      );\n      if (lines === 0) {\n        ev.preventDefault();\n        ev.stopPropagation();\n        return false;\n      }\n\n      // Construct and send sequences\n      const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n      this._coreService.triggerDataEvent(sequence, true);\n      ev.preventDefault();\n      ev.stopPropagation();\n      return false;\n    }\n  }\n\n  private _handleTouchStart(): void {\n    this._touchScrollAccumulator = 0;\n  }\n\n  private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n    e.preventDefault();\n    e.stopPropagation();\n\n    // When mouse protocol has wheel events active, send as mouse wheel events.\n    if (ctx.requestedEvents.wheel) {\n      this._handleTouchScrollAsWheel(ctx, e);\n      return;\n    }\n\n    // When in alt buffer (no scrollback), send up/down key sequences.\n    if (!this._bufferService.buffer.hasScrollback) {\n      this._handleTouchScrollAsKeys(e);\n      return;\n    }\n\n    // Normal scrollback: delegate to viewport scrolling when available.\n    ctx.target.handleTouchScroll?.(e.translationY);\n  }\n\n  private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n    const cellHeight = this._renderService?.dimensions.css.cell.height;\n    if (!cellHeight) {\n      return;\n    }\n\n    this._touchScrollAccumulator -= e.translationY;\n    const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n    if (lines === 0) {\n      return;\n    }\n\n    this._touchScrollAccumulator -= lines * cellHeight;\n    const sequence = C0.ESC\n      + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n      + (lines < 0 ? 'A' : 'B');\n    for (let i = 0; i < Math.abs(lines); i++) {\n      this._coreService.triggerDataEvent(sequence, true);\n    }\n  }\n\n  private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n    const cellHeight = this._renderService?.dimensions.css.cell.height;\n    if (!cellHeight) {\n      return;\n    }\n\n    this._touchScrollAccumulator -= e.translationY;\n    const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n    if (lines === 0) {\n      return;\n    }\n\n    this._touchScrollAccumulator -= lines * cellHeight;\n    const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n    if (!pos) {\n      return;\n    }\n\n    for (let i = 0; i < Math.abs(lines); i++) {\n      this._triggerMouseEvent({\n        col: pos.col,\n        row: pos.row,\n        x: pos.x,\n        y: pos.y,\n        button: CoreMouseButton.WHEEL,\n        action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n        ctrl: false,\n        alt: false,\n        shift: false\n      });\n    }\n  }\n\n  public reset(): void {\n    this._lastEvent = null;\n    this._wheelPartialScroll = 0;\n    this._touchScrollAccumulator = 0;\n  }\n\n  private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n    const { element, document } = ctx.target;\n    const { requestedEvents } = ctx;\n    // apply global changes on events\n    if (events) {\n      if (this._optionsService.rawOptions.logLevel === 'debug') {\n        this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n      }\n      element.classList.add('enable-mouse-events');\n      this._selectionService.disable();\n    } else {\n      this._logService.debug('Unbinding from mouse events.');\n      element.classList.remove('enable-mouse-events');\n      this._selectionService.enable();\n    }\n\n    // add/remove handlers from requestedEvents\n    if (!(events & CoreMouseEventType.MOVE)) {\n      if (requestedEvents.mousemove) {\n        element.removeEventListener('mousemove', requestedEvents.mousemove);\n      }\n      requestedEvents.mousemove = null;\n    } else if (!requestedEvents.mousemove) {\n      element.addEventListener('mousemove', eventListeners.mousemove);\n      requestedEvents.mousemove = eventListeners.mousemove;\n    }\n\n    if (!(events & CoreMouseEventType.WHEEL)) {\n      if (requestedEvents.wheel) {\n        element.removeEventListener('wheel', requestedEvents.wheel);\n      }\n      requestedEvents.wheel = null;\n    } else if (!requestedEvents.wheel) {\n      element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n      requestedEvents.wheel = eventListeners.wheel;\n    }\n\n    if (!(events & CoreMouseEventType.UP)) {\n      if (requestedEvents.mouseup) {\n        document.removeEventListener('mouseup', requestedEvents.mouseup);\n      }\n      requestedEvents.mouseup = null;\n    } else {\n      requestedEvents.mouseup ??= eventListeners.mouseup;\n    }\n\n    if (!(events & CoreMouseEventType.DRAG)) {\n      if (requestedEvents.mousedrag) {\n        document.removeEventListener('mousemove', requestedEvents.mousedrag);\n      }\n      requestedEvents.mousedrag = null;\n    } else {\n      requestedEvents.mousedrag ??= eventListeners.mousedrag;\n    }\n  }\n\n  private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n    // Multiply the scroll speed when the modifier key is pressed\n    if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n      return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n    }\n    return amount * this._optionsService.rawOptions.scrollSensitivity;\n  }\n\n  /**\n   * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n   * This prevents hyper-sensitive scrolling in alt buffer.\n   */\n  private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n    // Do nothing if it's not a vertical scroll event\n    if (ev.deltaY === 0 || ev.shiftKey) {\n      return 0;\n    }\n\n    if (cellHeight === undefined || dpr === undefined) {\n      return 0;\n    }\n\n    const targetWheelEventPixels = cellHeight / dpr;\n    let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n    if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n      amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n      const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n      if (isLikelyTrackpad) {\n        amount *= 0.3;\n      }\n\n      this._wheelPartialScroll += amount;\n      amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n      this._wheelPartialScroll %= 1;\n    } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n      amount *= this._bufferService.rows;\n    }\n    return amount;\n  }\n\n  /**\n   * Triggers a mouse event to be sent.\n   *\n   * Returns true if the event passed all protocol restrictions and a report\n   * was sent, otherwise false. The return value may be used to decide whether\n   * the default event action in the browser component should be omitted.\n   *\n   * Note: The method will change values of the given event object\n   * to fulfill protocol and encoding restrictions.\n   */\n  private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n    // range check for col/row\n    if (e.col < 0 || e.col >= this._bufferService.cols\n      || e.row < 0 || e.row >= this._bufferService.rows) {\n      return false;\n    }\n\n    // filter nonsense combinations of button + action\n    if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n      return false;\n    }\n    if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n      return false;\n    }\n    if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n      return false;\n    }\n\n    // report 1-based coords\n    e.col++;\n    e.row++;\n\n    // debounce move events at grid or pixel level\n    if (e.action === CoreMouseAction.MOVE\n      && this._lastEvent\n      && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n    ) {\n      return false;\n    }\n\n    // apply protocol restrictions\n    if (!this._mouseStateService.restrictMouseEvent(e)) {\n      return false;\n    }\n\n    // encode report and send\n    const report = this._mouseStateService.encodeMouseEvent(e);\n    if (report) {\n      if (this._mouseStateService.isDefaultEncoding) {\n        this._coreService.triggerBinaryEvent(report);\n      } else {\n        this._coreService.triggerDataEvent(report, true);\n      }\n    }\n\n    this._lastEvent = e;\n    return true;\n  }\n\n  private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n    return {\n      down: !!(events & CoreMouseEventType.DOWN),\n      up: !!(events & CoreMouseEventType.UP),\n      drag: !!(events & CoreMouseEventType.DRAG),\n      move: !!(events & CoreMouseEventType.MOVE),\n      wheel: !!(events & CoreMouseEventType.WHEEL)\n    };\n  }\n\n  private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n    if (pixels) {\n      if (e1.x !== e2.x) return false;\n      if (e1.y !== e2.y) return false;\n    } else {\n      if (e1.col !== e2.col) return false;\n      if (e1.row !== e2.row) return false;\n    }\n    if (e1.button !== e2.button) return false;\n    if (e1.action !== e2.action) return false;\n    if (e1.ctrl !== e2.ctrl) return false;\n    if (e1.alt !== e2.alt) return false;\n    if (e1.shift !== e2.shift) return false;\n    return true;\n  }\n\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\nimport { ICoreBrowserService } from 'browser/services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n  private _rowStart: number | undefined;\n  private _rowEnd: number | undefined;\n  private _rowCount: number | undefined;\n  private _animationFrame: number | undefined;\n  private _refreshCallbacks: FrameRequestCallback[] = [];\n\n  constructor(\n    private _renderCallback: (start: number, end: number) => void,\n    private readonly _coreBrowserService: ICoreBrowserService\n  ) {\n  }\n\n  public dispose(): void {\n    if (this._animationFrame) {\n      this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public addRefreshCallback(callback: FrameRequestCallback): number {\n    this._refreshCallbacks.push(callback);\n    if (!this._animationFrame) {\n      this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n    }\n    return this._animationFrame;\n  }\n\n  public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n    this._rowCount = rowCount;\n    // Get the min/max row start/end for the arg values\n    rowStart = rowStart ?? 0;\n    rowEnd = rowEnd ?? this._rowCount - 1;\n    // Set the properties to the updated values\n    this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n    this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n    if (this._animationFrame) {\n      return;\n    }\n\n    this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n  }\n\n  private _innerRefresh(): void {\n    this._animationFrame = undefined;\n\n    // Make sure values are set\n    if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n      this._runRefreshCallbacks();\n      return;\n    }\n\n    // Clamp values\n    const start = Math.max(this._rowStart, 0);\n    const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n    // Reset debouncer (this happens before render callback as the render could trigger it again)\n    this._rowStart = undefined;\n    this._rowEnd = undefined;\n\n    // Run render callback\n    this._renderCallback(start, end);\n    this._runRefreshCallbacks();\n  }\n\n  private _runRefreshCallbacks(): void {\n    for (const callback of this._refreshCallbacks) {\n      callback(0);\n    }\n    this._refreshCallbacks = [];\n  }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from 'common/services/Services';\n\ninterface ITaskQueue {\n  /**\n   * Adds a task to the queue which will run in a future idle callback.\n   * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n   * should split their work into smaller pieces and return `true` to get\n   * called again until the work is done (on falsy return value).\n   */\n  enqueue(task: () => boolean | void): void;\n\n  /**\n   * Flushes the queue, running all remaining tasks synchronously.\n   */\n  flush(): void;\n\n  /**\n   * Clears any remaining tasks from the queue, these will not be run.\n   */\n  clear(): void;\n}\n\ninterface ITaskDeadline {\n  timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n  private _tasks: (() => boolean | void)[] = [];\n  private _idleCallback?: number;\n  private _i = 0;\n  protected readonly _logService: ILogService;\n\n  constructor(logService: ILogService) {\n    this._logService = logService;\n  }\n\n  protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n  protected abstract _cancelCallback(identifier: number): void;\n\n  public enqueue(task: () => boolean | void): void {\n    this._tasks.push(task);\n    this._start();\n  }\n\n  public flush(): void {\n    while (this._i < this._tasks.length) {\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n    }\n    this.clear();\n  }\n\n  public clear(): void {\n    if (this._idleCallback) {\n      this._cancelCallback(this._idleCallback);\n      this._idleCallback = undefined;\n    }\n    this._i = 0;\n    this._tasks.length = 0;\n  }\n\n  private _start(): void {\n    if (!this._idleCallback) {\n      this._idleCallback = this._requestCallback(this._process.bind(this));\n    }\n  }\n\n  private _process(deadline: ITaskDeadline): void {\n    this._idleCallback = undefined;\n    let taskDuration = 0;\n    let longestTask = 0;\n    let lastDeadlineRemaining = deadline.timeRemaining();\n    let deadlineRemaining = 0;\n    while (this._i < this._tasks.length) {\n      taskDuration = performance.now();\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n      // other than performance.now, performance.now might not be stable (changes on wall clock\n      // changes), this is not an issue here as a clock change during a short running task is very\n      // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n      taskDuration = Math.max(1, performance.now() - taskDuration);\n      longestTask = Math.max(taskDuration, longestTask);\n      // Guess the following task will take a similar time to the longest task in this batch, allow\n      // additional room to try avoid exceeding the deadline\n      deadlineRemaining = deadline.timeRemaining();\n      if (longestTask * 1.5 > deadlineRemaining) {\n        // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n        // task should be split into sub-tasks to ensure the UI remains responsive.\n        if (lastDeadlineRemaining - taskDuration < -20) {\n          this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n        }\n        this._start();\n        return;\n      }\n      lastDeadlineRemaining = deadlineRemaining;\n    }\n    this.clear();\n  }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n  protected _requestCallback(callback: CallbackWithDeadline): number {\n    return setTimeout(() => callback(this._createDeadline(16)));\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    clearTimeout(identifier);\n  }\n\n  private _createDeadline(duration: number): ITaskDeadline {\n    const end = performance.now() + duration;\n    return {\n      timeRemaining: () => Math.max(0, end - performance.now())\n    };\n  }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n  protected _requestCallback(callback: IdleRequestCallback): number {\n    return requestIdleCallback(callback);\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    cancelIdleCallback(identifier);\n  }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n  private _queue: ITaskQueue;\n\n  constructor(logService: ILogService) {\n    this._queue = new IdleTaskQueue(logService);\n  }\n\n  public set(task: () => boolean | void): void {\n    this._queue.clear();\n    this._queue.enqueue(task);\n  }\n\n  public flush(): void {\n    this._queue.flush();\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport { DebouncedIdleTask } from 'common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\ninterface ISelectionState {\n  start: [number, number] | undefined;\n  end: [number, number] | undefined;\n  columnSelectMode: boolean;\n}\n\nconst enum Constants {\n  SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n  public serviceBrand: undefined;\n\n  private _renderer: MutableDisposable<IRenderer> = this._register(new MutableDisposable());\n  private _renderDebouncer: IRenderDebouncerWithCallback;\n  private _pausedResizeTask: DebouncedIdleTask;\n  private _observerDisposable = this._register(new MutableDisposable());\n\n  private _isPaused: boolean = false;\n  private _needsFullRefresh: boolean = false;\n  private _isNextRenderRedrawOnly: boolean = true;\n  private _needsSelectionRefresh: boolean = false;\n  private _canvasWidth: number = 0;\n  private _canvasHeight: number = 0;\n  private _syncOutputHandler: SynchronizedOutputHandler;\n  private _selectionState: ISelectionState = {\n    start: undefined,\n    end: undefined,\n    columnSelectMode: false\n  };\n\n  private readonly _onDimensionsChange = this._register(new Emitter<IRenderDimensions>());\n  public readonly onDimensionsChange = this._onDimensionsChange.event;\n  private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n  public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n  private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n  public readonly onRender = this._onRender.event;\n  private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n  public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n  public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n  constructor(\n    private _rowCount: number,\n    screenElement: HTMLElement,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ILogService private readonly _logService: ILogService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IDecorationService decorationService: IDecorationService,\n    @IBufferService bufferService: IBufferService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IThemeService themeService: IThemeService\n  ) {\n    super();\n\n    this._pausedResizeTask = new DebouncedIdleTask(this._logService);\n\n    this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n    this._register(this._renderDebouncer);\n\n    this._syncOutputHandler = new SynchronizedOutputHandler(\n      this._coreBrowserService,\n      this._coreService,\n      () => this._fullRefresh()\n    );\n    this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n    this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n    this._register(bufferService.onResize(() => this._fullRefresh()));\n    this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n    this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n    this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n    // Do a full refresh whenever any decoration is added or removed. This may not actually result\n    // in changes but since decorations should be used sparingly or added/removed all in the same\n    // frame this should have minimal performance impact.\n    this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n    this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n    // Clear the renderer when the a change that could affect glyphs occurs\n    this._register(this._optionsService.onMultipleOptionChange([\n      'drawBoldTextInBrightColors',\n      'letterSpacing',\n      'lineHeight',\n      'fontFamily',\n      'fontSize',\n      'fontWeight',\n      'fontWeightBold',\n      'minimumContrastRatio',\n      'rescaleOverlappingGlyphs'\n    ], () => {\n      this.clear();\n      this.handleResize(bufferService.cols, bufferService.rows);\n      this._fullRefresh();\n    }));\n\n    // Refresh the cursor line when the cursor changes\n    this._register(this._optionsService.onMultipleOptionChange([\n      'cursorBlink',\n      'cursorStyle'\n    ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n    this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n    this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n    this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n  }\n\n  private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n    // Detect whether IntersectionObserver is detected and enable renderer pause\n    // and resume based on terminal visibility if so\n    if ('IntersectionObserver' in w) {\n      const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n      observer.observe(screenElement);\n      this._observerDisposable.value = toDisposable(() => observer.disconnect());\n    }\n  }\n\n  private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n    this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n    this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n    // Terminal was hidden on open\n    if (!this._isPaused && !this._charSizeService.hasValidSize) {\n      this._charSizeService.measure();\n    }\n\n    if (!this._isPaused && this._needsFullRefresh) {\n      this._pausedResizeTask.flush();\n      this.refreshRows(0, this._rowCount - 1);\n      this._needsFullRefresh = false;\n    }\n  }\n\n  public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n    if (this._isPaused) {\n      this._needsFullRefresh = true;\n      return;\n    }\n\n    if (this._coreService.decPrivateModes.synchronizedOutput) {\n      this._syncOutputHandler.bufferRows(start, end);\n      return;\n    }\n\n    const buffered = this._syncOutputHandler.flush();\n    if (buffered) {\n      start = Math.min(start, buffered.start);\n      end = Math.max(end, buffered.end);\n    }\n\n    if (!isRedrawOnly) {\n      this._isNextRenderRedrawOnly = false;\n    }\n\n    if (sync) {\n      this._renderRows(start, end);\n    } else {\n      this._renderDebouncer.refresh(start, end, this._rowCount);\n    }\n  }\n\n  private _renderRows(start: number, end: number): void {\n    if (!this._renderer.value) {\n      return;\n    }\n\n    // Skip rendering if synchronized output mode is enabled. This check must happen here\n    // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n    if (this._coreService.decPrivateModes.synchronizedOutput) {\n      this._syncOutputHandler.bufferRows(start, end);\n      return;\n    }\n\n    // Since this is debounced, a resize event could have happened between the time a refresh was\n    // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n    // given the current viewport state.\n    start = Math.min(start, this._rowCount - 1);\n    end = Math.min(end, this._rowCount - 1);\n\n    // Render\n    this._renderer.value.renderRows(start, end);\n\n    // Update selection if needed\n    if (this._needsSelectionRefresh) {\n      this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n      this._needsSelectionRefresh = false;\n    }\n\n    // Fire render event only if it was not a redraw\n    if (!this._isNextRenderRedrawOnly) {\n      this._onRenderedViewportChange.fire({ start, end });\n    }\n    this._onRender.fire({ start, end });\n    this._isNextRenderRedrawOnly = true;\n  }\n\n  public resize(cols: number, rows: number): void {\n    this._rowCount = rows;\n    this._fireOnCanvasResize();\n  }\n\n  private _handleOptionsChanged(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    this.refreshRows(0, this._rowCount - 1);\n    this._fireOnCanvasResize();\n  }\n\n  private _fireOnCanvasResize(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    // Don't fire the event if the dimensions haven't changed\n    if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n      return;\n    }\n    this._onDimensionsChange.fire(this._renderer.value.dimensions);\n  }\n\n  public hasRenderer(): boolean {\n    return !!this._renderer.value;\n  }\n\n  public setRenderer(renderer: IRenderer): void {\n    this._renderer.value = renderer;\n    // If the value was not set, the terminal is being disposed so ignore it\n    if (this._renderer.value) {\n      this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n      // Force a refresh\n      this._needsSelectionRefresh = true;\n      this._fullRefresh();\n    }\n  }\n\n  public addRefreshCallback(callback: FrameRequestCallback): number {\n    return this._renderDebouncer.addRefreshCallback(callback);\n  }\n\n  private _fullRefresh(): void {\n    if (this._isPaused) {\n      this._needsFullRefresh = true;\n    } else {\n      this.refreshRows(0, this._rowCount - 1);\n    }\n  }\n\n  public clearTextureAtlas(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    this._renderer.value.clearTextureAtlas?.();\n    this._fullRefresh();\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n    // when devicePixelRatio changes\n    this._charSizeService.measure();\n\n    if (!this._renderer.value) {\n      return;\n    }\n    this._renderer.value.handleDevicePixelRatioChange();\n    this.refreshRows(0, this._rowCount - 1);\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    if (this._isPaused) {\n      this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n    } else {\n      this._renderer.value.handleResize(cols, rows);\n    }\n    this._fullRefresh();\n  }\n\n  // TODO: Is this useful when we have onResize?\n  public handleCharSizeChanged(): void {\n    this._renderer.value?.handleCharSizeChanged();\n  }\n\n  public handleBlur(): void {\n    this._renderer.value?.handleBlur();\n  }\n\n  public handleFocus(): void {\n    this._renderer.value?.handleFocus();\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    this._selectionState.start = start;\n    this._selectionState.end = end;\n    this._selectionState.columnSelectMode = columnSelectMode;\n    this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n  }\n\n  public handleCursorMove(): void {\n    this._renderer.value?.handleCursorMove();\n  }\n\n  public clear(): void {\n    this._renderer.value?.clear();\n  }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n  private _start: number = 0;\n  private _end: number = 0;\n  private _timeout: number | undefined;\n  private _isBuffering: boolean = false;\n\n  constructor(\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _coreService: ICoreService,\n    private readonly _onTimeout: () => void\n  ) {}\n\n  public bufferRows(start: number, end: number): void {\n    if (!this._isBuffering) {\n      this._start = start;\n      this._end = end;\n      this._isBuffering = true;\n    } else {\n      this._start = Math.min(this._start, start);\n      this._end = Math.max(this._end, end);\n    }\n\n    this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n      this._timeout = undefined;\n      this._coreService.decPrivateModes.synchronizedOutput = false;\n      this._onTimeout();\n    }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n  }\n\n  public flush(): { start: number, end: number } | undefined {\n    if (this._timeout !== undefined) {\n      this._coreBrowserService.window.clearTimeout(this._timeout);\n      this._timeout = undefined;\n    }\n\n    if (!this._isBuffering) {\n      return undefined;\n    }\n\n    const result = { start: this._start, end: this._end };\n    this._isBuffering = false;\n    return result;\n  }\n\n  public dispose(): void {\n    if (this._timeout !== undefined) {\n      this._coreBrowserService.window.clearTimeout(this._timeout);\n      this._timeout = undefined;\n    }\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from 'common/data/EscapeSequences';\nimport { IBufferService } from 'common/services/Services';\n\nconst enum Direction {\n  UP = 'A',\n  DOWN = 'B',\n  RIGHT = 'C',\n  LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  const startX = bufferService.buffer.x;\n  const startY = bufferService.buffer.y;\n\n  // The alt buffer should try to navigate between rows\n  if (!bufferService.buffer.hasScrollback) {\n    return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n      moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n      moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n  }\n\n  // Only move horizontally for the normal buffer\n  let direction;\n  if (startY === targetY) {\n    direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n    return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n  }\n  direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n  const rowDifference = Math.abs(startY - targetY);\n  const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n    (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n    colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n  return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n  return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n  return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n    return '';\n  }\n  return repeat(bufferLine(\n    startX, startY, startX,\n    startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n  ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  const startRow = startY - wrappedRowsForRow(startY, bufferService);\n  const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n  const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n  return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  let startRow;\n  if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n    startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n  } else {\n    startRow = startY;\n  }\n\n  const endRow = targetY;\n  const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n  return repeat(bufferLine(\n    startX, startRow, targetX, endRow,\n    direction === Direction.RIGHT, bufferService\n  ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n  let wrappedRows = 0;\n  const startRow = startY - wrappedRowsForRow(startY, bufferService);\n  const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n  for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n    const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n    const line = bufferService.buffer.lines.get(startRow + (direction * i));\n    if (line?.isWrapped) {\n      wrappedRows++;\n    }\n  }\n\n  return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n  let rowCount = 0;\n  let line = bufferService.buffer.lines.get(currentRow);\n  let lineWraps = line?.isWrapped;\n\n  while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n    rowCount++;\n    line = bufferService.buffer.lines.get(--currentRow);\n    lineWraps = line?.isWrapped;\n  }\n\n  return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n  let startRow;\n  if (moveToRequestedRow(targetX, targetY, bufferService, applicationCursor).length > 0) {\n    startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n  } else {\n    startRow = startY;\n  }\n\n  if ((startX < targetX &&\n    startRow <= targetY) || // down/right or same y/right\n    (startX >= targetX &&\n    startRow < targetY)) {  // down/left or same y/left\n    return Direction.RIGHT;\n  }\n  return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n  return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n  startCol: number,\n  startRow: number,\n  endCol: number,\n  endRow: number,\n  forward: boolean,\n  bufferService: IBufferService\n): string {\n  let currentCol = startCol;\n  let currentRow = startRow;\n  let bufferStr = '';\n\n  while ((currentCol !== endCol || currentRow !== endRow) &&\n         currentRow >= 0 &&\n         currentRow < bufferService.buffer.lines.length) {\n    currentCol += forward ? 1 : -1;\n\n    if (forward && currentCol > bufferService.cols - 1) {\n      bufferStr += bufferService.buffer.translateBufferLineToString(\n        currentRow, false, startCol, currentCol\n      );\n      currentCol = 0;\n      startCol = 0;\n      currentRow++;\n    } else if (!forward && currentCol < 0) {\n      bufferStr += bufferService.buffer.translateBufferLineToString(\n        currentRow, false, 0, startCol + 1\n      );\n      currentCol = bufferService.cols - 1;\n      startCol = currentCol;\n      currentRow--;\n    }\n  }\n\n  return bufferStr + bufferService.buffer.translateBufferLineToString(\n    currentRow, false, startCol, currentCol\n  );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n  const mod =  applicationCursor ? 'O' : '[';\n  return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n  count = Math.floor(count);\n  let rpt = '';\n  for (let i = 0; i < count; i++) {\n    rpt += str;\n  }\n  return rpt;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from 'common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n  /**\n   * Whether select all is currently active.\n   */\n  public isSelectAllActive: boolean = false;\n\n  /**\n   * The minimal length of the selection from the start position. When double\n   * clicking on a word, the word will be selected which makes the selection\n   * start at the start of the word and makes this variable the length.\n   */\n  public selectionStartLength: number = 0;\n\n  /**\n   * The [x, y] position the selection starts at.\n   */\n  public selectionStart: [number, number] | undefined;\n\n  /**\n   * The [x, y] position the selection ends at.\n   */\n  public selectionEnd: [number, number] | undefined;\n\n  constructor(\n    private _bufferService: IBufferService\n  ) {\n  }\n\n  /**\n   * Clears the current selection.\n   */\n  public clearSelection(): void {\n    this.selectionStart = undefined;\n    this.selectionEnd = undefined;\n    this.isSelectAllActive = false;\n    this.selectionStartLength = 0;\n  }\n\n  /**\n   * The final selection start, taking into consideration select all.\n   */\n  public get finalSelectionStart(): [number, number] | undefined {\n    if (this.isSelectAllActive) {\n      return [0, 0];\n    }\n\n    if (!this.selectionEnd || !this.selectionStart) {\n      return this.selectionStart;\n    }\n\n    return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n  }\n\n  /**\n   * The final selection end, taking into consideration select all, double click\n   * word selection and triple click line selection.\n   */\n  public get finalSelectionEnd(): [number, number] | undefined {\n    if (this.isSelectAllActive) {\n      return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n    }\n\n    if (!this.selectionStart) {\n      return undefined;\n    }\n\n    // Use the selection start + length if the end doesn't exist or they're reversed\n    if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n      const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n      if (startPlusLength > this._bufferService.cols) {\n        // Ensure the trailing EOL isn't included when the selection ends on the right edge\n        if (startPlusLength % this._bufferService.cols === 0) {\n          return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n        }\n        return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n      }\n      return [startPlusLength, this.selectionStart[1]];\n    }\n\n    // Ensure the the word/line is selected after a double/triple click\n    if (this.selectionStartLength) {\n      // Select the larger of the two when start and end are on the same line\n      if (this.selectionEnd[1] === this.selectionStart[1]) {\n        // Keep the whole wrapped word/line selected if the content wraps multiple lines\n        const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n        if (startPlusLength > this._bufferService.cols) {\n          return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n        }\n        return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n      }\n    }\n    return this.selectionEnd;\n  }\n\n  /**\n   * Returns whether the selection start and end are reversed.\n   */\n  public areSelectionValuesReversed(): boolean {\n    const start = this.selectionStart;\n    const end = this.selectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n  }\n\n  /**\n   * Handle the buffer being trimmed, adjust the selection position.\n   * @param amount The amount the buffer is being trimmed.\n   * @returns Whether a refresh is necessary.\n   */\n  public handleTrim(amount: number): boolean {\n    // Adjust the selection position based on the trimmed amount.\n    if (this.selectionStart) {\n      this.selectionStart[1] -= amount;\n    }\n    if (this.selectionEnd) {\n      this.selectionEnd[1] -= amount;\n    }\n\n    // The selection has moved off the buffer, clear it.\n    if (this.selectionEnd && this.selectionEnd[1] < 0) {\n      this.clearSelection();\n      return true;\n    }\n\n    // If the selection start is trimmed, ensure the start column is 0.\n    if (this.selectionStart && this.selectionStart[1] < 0) {\n      this.selectionStart[1] = 0;\n    }\n    return false;\n  }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n  if (range.start.y > range.end.y) {\n    throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n  }\n  return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from 'browser/Types';\nimport { getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { moveToCellSequence } from 'browser/input/MoveToCell';\nimport { SelectionModel } from 'browser/selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport * as Browser from 'common/Platform';\nimport { IBufferLine, ICellData, IDisposable } from 'common/Types';\nimport { getRangeLength } from 'common/buffer/BufferRange';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\n/**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\nconst DRAG_SCROLL_MAX_THRESHOLD = 50;\n\n/**\n * The maximum scrolling speed\n */\nconst DRAG_SCROLL_MAX_SPEED = 15;\n\n/**\n * The number of milliseconds between drag scroll updates.\n */\nconst DRAG_SCROLL_INTERVAL = 50;\n\n/**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\nconst ALT_CLICK_MOVE_CURSOR_TIME = 500;\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n  start: number;\n  length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n  NORMAL,\n  WORD,\n  LINE,\n  COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n  public serviceBrand: undefined;\n\n  protected _model: SelectionModel;\n\n  /**\n   * The amount to scroll every drag scroll update (depends on how far the mouse\n   * drag is above or below the terminal).\n   */\n  private _dragScrollAmount: number = 0;\n\n  /**\n   * The current selection mode.\n   */\n  protected _activeSelectionMode: SelectionMode;\n\n  /**\n   * A setInterval timer that is active while the mouse is down whose callback\n   * scrolls the viewport when necessary.\n   */\n  private _dragScrollIntervalTimer: number | undefined;\n\n  /**\n   * The animation frame ID used for refreshing the selection.\n   */\n  private _refreshAnimationFrame: number | undefined;\n\n  /**\n   * Whether selection is enabled.\n   */\n  private _enabled = true;\n\n  private _mouseMoveListener: EventListener;\n  private _mouseUpListener: EventListener;\n  private _trimListener: IDisposable;\n  private _workCell: CellData = new CellData();\n\n  private _mouseDownTimeStamp: number = 0;\n  private _oldHasSelection: boolean = false;\n  private _oldSelectionStart: [number, number] | undefined = undefined;\n  private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n  private readonly _onLinuxMouseSelection = this._register(new Emitter<string>());\n  public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n  private readonly _onRedrawRequest = this._register(new Emitter<ISelectionRedrawRequestEvent>());\n  public readonly onRequestRedraw = this._onRedrawRequest.event;\n  private readonly _onSelectionChange = this._register(new Emitter<void>());\n  public readonly onSelectionChange = this._onSelectionChange.event;\n  private readonly _onRequestScrollLines = this._register(new Emitter<ISelectionRequestScrollLinesEvent>());\n  public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n  constructor(\n    private readonly _element: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    private readonly _linkifier: ILinkifier2,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n  ) {\n    super();\n\n    // Init listeners\n    this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n    this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n    this._coreService.onUserInput(() => {\n      if (this.hasSelection) {\n        this.clearSelection();\n      }\n    });\n    this._trimListener = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n    this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n    this.enable();\n\n    this._model = new SelectionModel(this._bufferService);\n    this._activeSelectionMode = SelectionMode.NORMAL;\n\n    this._register(toDisposable(() => {\n      this._removeMouseDownListeners();\n    }));\n\n    // Clear selection when resizing vertically. This experience could be improved, this is the\n    // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n    this._register(this._bufferService.onResize(e => {\n      if (e.rowsChanged) {\n        this.clearSelection();\n      }\n    }));\n  }\n\n  public reset(): void {\n    this.clearSelection();\n  }\n\n  /**\n   * Disables the selection manager. This is useful for when terminal mouse\n   * are enabled.\n   */\n  public disable(): void {\n    this.clearSelection();\n    this._enabled = false;\n  }\n\n  /**\n   * Enable the selection manager.\n   */\n  public enable(): void {\n    this._enabled = true;\n  }\n\n  public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n  public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n  /**\n   * Gets whether there is an active text selection.\n   */\n  public get hasSelection(): boolean {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return start[0] !== end[0] || start[1] !== end[1];\n  }\n\n  /**\n   * Gets the text currently selected.\n   */\n  public get selectionText(): string {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return '';\n    }\n\n    const buffer = this._bufferService.buffer;\n    const result: string[] = [];\n\n    if (this._activeSelectionMode === SelectionMode.COLUMN) {\n      // Ignore zero width selections\n      if (start[0] === end[0]) {\n        return '';\n      }\n\n      // For column selection it's not enough to rely on final selection's swapping of reversed\n      // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n      const startCol = start[0] < end[0] ? start[0] : end[0];\n      const endCol = start[0] < end[0] ? end[0] : start[0];\n      for (let i = start[1]; i <= end[1]; i++) {\n        const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n        result.push(lineText);\n      }\n    } else {\n      // Get first row\n      const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n      result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n      // Get middle rows\n      for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n        const bufferLine = buffer.lines.get(i);\n        const lineText = buffer.translateBufferLineToString(i, true);\n        if (bufferLine?.isWrapped) {\n          result[result.length - 1] += lineText;\n        } else {\n          result.push(lineText);\n        }\n      }\n\n      // Get final row\n      if (start[1] !== end[1]) {\n        const bufferLine = buffer.lines.get(end[1]);\n        const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n        if (bufferLine && bufferLine!.isWrapped) {\n          result[result.length - 1] += lineText;\n        } else {\n          result.push(lineText);\n        }\n      }\n    }\n\n    // Format string by replacing non-breaking space chars with regular spaces\n    // and joining the array into a multi-line string.\n    const formattedResult = result.map(line => {\n      return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n    }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n    return formattedResult;\n  }\n\n  /**\n   * Clears the current terminal selection.\n   */\n  public clearSelection(): void {\n    this._model.clearSelection();\n    this._removeMouseDownListeners();\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  /**\n   * Queues a refresh, redrawing the selection on the next opportunity.\n   * @param isLinuxMouseSelection Whether the selection should be registered as a new\n   * selection on Linux.\n   */\n  public refresh(isLinuxMouseSelection?: boolean): void {\n    // Queue the refresh for the renderer\n    if (!this._refreshAnimationFrame) {\n      this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n    }\n\n    // If the platform is Linux and the refresh call comes from a mouse event,\n    // we need to update the selection for middle click to paste selection.\n    if (Browser.isLinux && isLinuxMouseSelection) {\n      const selectionText = this.selectionText;\n      if (selectionText.length) {\n        this._onLinuxMouseSelection.fire(this.selectionText);\n      }\n    }\n  }\n\n  /**\n   * Fires the refresh event, causing consumers to pick it up and redraw the\n   * selection state.\n   */\n  private _refresh(): void {\n    this._refreshAnimationFrame = undefined;\n    this._onRedrawRequest.fire({\n      start: this._model.finalSelectionStart,\n      end: this._model.finalSelectionEnd,\n      columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n    });\n  }\n\n  /**\n   * Checks if the current click was inside the current selection\n   * @param event The mouse event\n   */\n  private _isClickInSelection(event: MouseEvent): boolean {\n    const coords = this._getMouseBufferCoords(event);\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n\n    if (!start || !end || !coords) {\n      return false;\n    }\n\n    return this._areCoordsInSelection(coords, start, end);\n  }\n\n  public isCellInSelection(x: number, y: number): boolean {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return this._areCoordsInSelection([x, y], start, end);\n  }\n\n  protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n    return (coords[1] > start[1] && coords[1] < end[1]) ||\n        (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n        (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n        (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n  }\n\n  /**\n   * Selects word at the current mouse event coordinates.\n   * @param event The mouse event.\n   */\n  private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n    // Check if there is a link under the cursor first and select that if so\n    const range = this._linkifier.currentLink?.link?.range;\n    if (range) {\n      this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n      this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n      this._model.selectionEnd = undefined;\n      return true;\n    }\n\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._selectWordAt(coords, allowWhitespaceOnlySelection);\n      this._model.selectionEnd = undefined;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Selects all text within the terminal.\n   */\n  public selectAll(): void {\n    this._model.isSelectAllActive = true;\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  public selectLines(start: number, end: number): void {\n    this._model.clearSelection();\n    start = Math.max(start, 0);\n    end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n    this._model.selectionStart = [0, start];\n    this._model.selectionEnd = [this._bufferService.cols, end];\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  /**\n   * Handle the buffer being trimmed, adjust the selection position.\n   * @param amount The amount the buffer is being trimmed.\n   */\n  private _handleTrim(amount: number): void {\n    const needsRefresh = this._model.handleTrim(amount);\n    if (needsRefresh) {\n      this.refresh();\n    }\n  }\n\n  /**\n   * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n   * @param event The mouse event.\n   */\n  private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n    const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n    if (!coords) {\n      return undefined;\n    }\n\n    // Convert to 0-based\n    coords[0]--;\n    coords[1]--;\n\n    // Convert viewport coords to buffer coords\n    coords[1] += this._bufferService.buffer.ydisp;\n    return coords;\n  }\n\n  /**\n   * Gets the amount the viewport should be scrolled based on how far out of the\n   * terminal the mouse is.\n   * @param event The mouse event.\n   */\n  private _getMouseEventScrollAmount(event: MouseEvent): number {\n    let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n    const terminalHeight = this._renderService.dimensions.css.canvas.height;\n    if (offset >= 0 && offset <= terminalHeight) {\n      return 0;\n    }\n    if (offset > terminalHeight) {\n      offset -= terminalHeight;\n    }\n\n    offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD);\n    offset /= DRAG_SCROLL_MAX_THRESHOLD;\n    return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1));\n  }\n\n  /**\n   * Returns whether the selection manager should force selection, regardless of\n   * whether the terminal is in mouse events mode.\n   * @param event The mouse event.\n   */\n  public shouldForceSelection(event: MouseEvent): boolean {\n    if (Browser.isMac) {\n      return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n    }\n\n    return event.shiftKey;\n  }\n\n  /**\n   * Handles te mousedown event, setting up for a new selection.\n   * @param event The mousedown event.\n   */\n  public handleMouseDown(event: MouseEvent): void {\n    this._mouseDownTimeStamp = event.timeStamp;\n    // If we have selection, we want the context menu on right click even if the\n    // terminal is in mouse mode.\n    if (event.button === 2 && this.hasSelection) {\n      return;\n    }\n\n    // Only action the primary button\n    if (event.button !== 0) {\n      return;\n    }\n\n    // Allow selection when using a specific modifier key, even when disabled\n    if (!this._enabled) {\n      if (!this.shouldForceSelection(event)) {\n        return;\n      }\n\n      // Don't send the mouse down event to the current process, we want to select\n      event.stopPropagation();\n    }\n\n    // Tell the browser not to start a regular selection\n    event.preventDefault();\n\n    // Reset drag scroll state\n    this._dragScrollAmount = 0;\n\n    if (this._enabled && event.shiftKey) {\n      this._handleIncrementalClick(event);\n    } else {\n      if (event.detail === 1) {\n        this._handleSingleClick(event);\n      } else if (event.detail === 2) {\n        this._handleDoubleClick(event);\n      } else if (event.detail === 3) {\n        this._handleTripleClick(event);\n      }\n    }\n\n    this._addMouseDownListeners();\n    this.refresh(true);\n  }\n\n  /**\n   * Adds listeners when mousedown is triggered.\n   */\n  private _addMouseDownListeners(): void {\n    // Listen on the document so that dragging outside of viewport works\n    if (this._screenElement.ownerDocument) {\n      this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n      this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n    }\n    this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), DRAG_SCROLL_INTERVAL);\n  }\n\n  /**\n   * Removes the listeners that are registered when mousedown is triggered.\n   */\n  private _removeMouseDownListeners(): void {\n    if (this._screenElement.ownerDocument) {\n      this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n      this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n    }\n    this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n    this._dragScrollIntervalTimer = undefined;\n  }\n\n  /**\n   * Performs an incremental click, setting the selection end position to the mouse\n   * position.\n   * @param event The mouse event.\n   */\n  private _handleIncrementalClick(event: MouseEvent): void {\n    if (this._model.selectionStart) {\n      this._model.selectionEnd = this._getMouseBufferCoords(event);\n    }\n  }\n\n  /**\n   * Performs a single click, resetting relevant state and setting the selection\n   * start position.\n   * @param event The mouse event.\n   */\n  private _handleSingleClick(event: MouseEvent): void {\n    // Track if there was a selection before clearing\n    const hadSelection = this.hasSelection;\n\n    this._model.selectionStartLength = 0;\n    this._model.isSelectAllActive = false;\n    this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n    // Initialize the new selection\n    this._model.selectionStart = this._getMouseBufferCoords(event);\n    if (!this._model.selectionStart) {\n      return;\n    }\n    this._model.selectionEnd = undefined;\n\n    // Fire selection change event if a selection was cleared\n    if (hadSelection) {\n      this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n    }\n\n    // Ensure the line exists\n    const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n    if (!line) {\n      return;\n    }\n\n    // Return early if the click event is not in the buffer (eg. in scroll bar)\n    if (line.length === this._model.selectionStart[0]) {\n      return;\n    }\n\n    // If the mouse is over the second half of a wide character, adjust the\n    // selection to cover the whole character\n    if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n      this._model.selectionStart[0]++;\n    }\n  }\n\n  /**\n   * Performs a double click, selecting the current word.\n   * @param event The mouse event.\n   */\n  private _handleDoubleClick(event: MouseEvent): void {\n    if (this._selectWordAtCursor(event, true)) {\n      this._activeSelectionMode = SelectionMode.WORD;\n    }\n  }\n\n  /**\n   * Performs a triple click, selecting the current line and activating line\n   * select mode.\n   * @param event The mouse event.\n   */\n  private _handleTripleClick(event: MouseEvent): void {\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._activeSelectionMode = SelectionMode.LINE;\n      this._selectLineAt(coords[1]);\n    }\n  }\n\n  /**\n   * Returns whether the selection manager should operate in column select mode\n   * @param event the mouse or keyboard event\n   */\n  public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n    return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n  }\n\n  /**\n   * Handles the mousemove event when the mouse button is down, recording the\n   * end of the selection and refreshing the selection.\n   * @param event The mousemove event.\n   */\n  private _handleMouseMove(event: MouseEvent): void {\n    // If the mousemove listener is active it means that a selection is\n    // currently being made, we should stop propagation to prevent mouse events\n    // to be sent to the pty.\n    event.stopImmediatePropagation();\n\n    // Do nothing if there is no selection start, this can happen if the first\n    // click in the terminal is an incremental click\n    if (!this._model.selectionStart) {\n      return;\n    }\n\n    // Record the previous position so we know whether to redraw the selection\n    // at the end.\n    const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n    // Set the initial selection end based on the mouse coordinates\n    this._model.selectionEnd = this._getMouseBufferCoords(event);\n    if (!this._model.selectionEnd) {\n      this.refresh(true);\n      return;\n    }\n\n    // Select the entire line if line select mode is active.\n    if (this._activeSelectionMode === SelectionMode.LINE) {\n      if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n        this._model.selectionEnd[0] = 0;\n      } else {\n        this._model.selectionEnd[0] = this._bufferService.cols;\n      }\n    } else if (this._activeSelectionMode === SelectionMode.WORD) {\n      this._selectToWordAt(this._model.selectionEnd);\n    }\n\n    // Determine the amount of scrolling that will happen.\n    this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n    // If the cursor was above or below the viewport, make sure it's at the\n    // start or end of the viewport respectively. This should only happen when\n    // NOT in column select mode.\n    if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n      if (this._dragScrollAmount > 0) {\n        this._model.selectionEnd[0] = this._bufferService.cols;\n      } else if (this._dragScrollAmount < 0) {\n        this._model.selectionEnd[0] = 0;\n      }\n    }\n\n    // If the character is a wide character include the cell to the right in the\n    // selection. Note that selections at the very end of the line will never\n    // have a character.\n    const buffer = this._bufferService.buffer;\n    if (this._model.selectionEnd[1] < buffer.lines.length) {\n      const line = buffer.lines.get(this._model.selectionEnd[1]);\n      if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n        if (this._model.selectionEnd[0] < this._bufferService.cols) {\n          this._model.selectionEnd[0]++;\n        }\n      }\n    }\n\n    // Only draw here if the selection changes.\n    if (!previousSelectionEnd ||\n      previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n      previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n      this.refresh(true);\n    }\n  }\n\n  /**\n   * The callback that occurs every DRAG_SCROLL_INTERVAL ms that does the\n   * scrolling of the viewport.\n   */\n  private _dragScroll(): void {\n    if (!this._model.selectionEnd || !this._model.selectionStart) {\n      return;\n    }\n    if (this._dragScrollAmount) {\n      this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n      // Re-evaluate selection\n      // If the cursor was above or below the viewport, make sure it's at the\n      // start or end of the viewport respectively. This should only happen when\n      // NOT in column select mode.\n      const buffer = this._bufferService.buffer;\n      if (this._dragScrollAmount > 0) {\n        if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n          this._model.selectionEnd[0] = this._bufferService.cols;\n        }\n        this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows, buffer.lines.length - 1);\n      } else {\n        if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n          this._model.selectionEnd[0] = 0;\n        }\n        this._model.selectionEnd[1] = buffer.ydisp;\n      }\n      this.refresh();\n    }\n  }\n\n  /**\n   * Handles the mouseup event, removing the mousedown listeners.\n   * @param event The mouseup event.\n   */\n  private _handleMouseUp(event: MouseEvent): void {\n    const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n    this._removeMouseDownListeners();\n\n    if (this.selectionText.length <= 1 && timeElapsed < ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n      if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n        const coordinates = this._mouseCoordsService.getCoords(\n          event,\n          this._element,\n          this._bufferService.cols,\n          this._bufferService.rows,\n          false\n        );\n        if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n          const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n          this._coreService.triggerDataEvent(sequence, true);\n        }\n      }\n    } else {\n      this._fireEventIfSelectionChanged();\n    }\n  }\n\n  private _fireEventIfSelectionChanged(): void {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n    if (!hasSelection) {\n      if (this._oldHasSelection) {\n        this._fireOnSelectionChange(start, end, hasSelection);\n      }\n      return;\n    }\n\n    // Sanity check, these should not be undefined as there is a selection\n    if (!start || !end) {\n      return;\n    }\n\n    if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n      start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n      end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n      this._fireOnSelectionChange(start, end, hasSelection);\n    }\n  }\n\n  private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n    this._oldSelectionStart = start;\n    this._oldSelectionEnd = end;\n    this._oldHasSelection = hasSelection;\n    this._onSelectionChange.fire();\n  }\n\n  private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n    this.clearSelection();\n    // Only adjust the selection on trim, shiftElements is rarely used (only in\n    // reverseIndex) and delete in a splice is only ever used when the same\n    // number of elements was just added. Given this is could actually be\n    // beneficial to leave the selection as is for these cases.\n    this._trimListener.dispose();\n    this._trimListener = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n  }\n\n  /**\n   * Converts a viewport column (0 to cols - 1) to the character index on the\n   * buffer line, the latter takes into account wide and null characters.\n   * @param bufferLine The buffer line to use.\n   * @param x The x index in the buffer line to convert.\n   */\n  private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n    let charIndex = x;\n    for (let i = 0; x >= i; i++) {\n      const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n      if (this._workCell.getWidth() === 0) {\n        // Wide characters aren't included in the line string so decrement the\n        // index so the index is back on the wide character.\n        charIndex--;\n      } else if (length > 1 && x !== i) {\n        // Emojis take up multiple characters, so adjust accordingly. For these\n        // we don't want ot include the character at the column as we're\n        // returning the start index in the string, not the end index.\n        charIndex += length - 1;\n      }\n    }\n    return charIndex;\n  }\n\n  public setSelection(col: number, row: number, length: number): void {\n    this._model.clearSelection();\n    this._removeMouseDownListeners();\n    this._model.selectionStart = [col, row];\n    this._model.selectionStartLength = length;\n    this.refresh();\n    this._fireEventIfSelectionChanged();\n  }\n\n  public rightClickSelect(ev: MouseEvent): void {\n    if (!this._isClickInSelection(ev)) {\n      if (this._selectWordAtCursor(ev, false)) {\n        this.refresh(true);\n      }\n      this._fireEventIfSelectionChanged();\n    }\n  }\n\n  /**\n   * Gets positional information for the word at the coordinated specified.\n   * @param coords The coordinates to get the word at.\n   */\n  private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n    // Ensure coords are within viewport (eg. not within scroll bar)\n    if (coords[0] >= this._bufferService.cols) {\n      return undefined;\n    }\n\n    const buffer = this._bufferService.buffer;\n    const bufferLine = buffer.lines.get(coords[1]);\n    if (!bufferLine) {\n      return undefined;\n    }\n\n    const line = buffer.translateBufferLineToString(coords[1], false);\n\n    // Get actual index, taking into consideration wide characters\n    let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n    let endIndex = startIndex;\n\n    // Record offset to be used later\n    const charOffset = coords[0] - startIndex;\n    let leftWideCharCount = 0;\n    let rightWideCharCount = 0;\n    let leftLongCharOffset = 0;\n    let rightLongCharOffset = 0;\n\n    if (line.charAt(startIndex) === ' ') {\n      // Expand until non-whitespace is hit\n      while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n        startIndex--;\n      }\n      while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n        endIndex++;\n      }\n    } else {\n      // Expand until whitespace is hit. This algorithm works by scanning left\n      // and right from the starting position, keeping both the index format\n      // (line) and the column format (bufferLine) in sync. When a wide\n      // character is hit, it is recorded and the column index is adjusted.\n      let startCol = coords[0];\n      let endCol = coords[0];\n\n      // Consider the initial position, skip it and increment the wide char\n      // variable\n      if (bufferLine.getWidth(startCol) === 0) {\n        leftWideCharCount++;\n        startCol--;\n      }\n      if (bufferLine.getWidth(endCol) === 2) {\n        rightWideCharCount++;\n        endCol++;\n      }\n\n      // Adjust the end index for characters whose length are > 1 (emojis)\n      const length = bufferLine.getString(endCol).length;\n      if (length > 1) {\n        rightLongCharOffset += length - 1;\n        endIndex += length - 1;\n      }\n\n      // Expand the string in both directions until a space is hit\n      while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n        bufferLine.loadCell(startCol - 1, this._workCell);\n        const length = this._workCell.getChars().length;\n        if (this._workCell.getWidth() === 0) {\n          // If the next character is a wide char, record it and skip the column\n          leftWideCharCount++;\n          startCol--;\n        } else if (length > 1) {\n          // If the next character's string is longer than 1 char (eg. emoji),\n          // adjust the index\n          leftLongCharOffset += length - 1;\n          startIndex -= length - 1;\n        }\n        startIndex--;\n        startCol--;\n      }\n      while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n        bufferLine.loadCell(endCol + 1, this._workCell);\n        const length = this._workCell.getChars().length;\n        if (this._workCell.getWidth() === 2) {\n          // If the next character is a wide char, record it and skip the column\n          rightWideCharCount++;\n          endCol++;\n        } else if (length > 1) {\n          // If the next character's string is longer than 1 char (eg. emoji),\n          // adjust the index\n          rightLongCharOffset += length - 1;\n          endIndex += length - 1;\n        }\n        endIndex++;\n        endCol++;\n      }\n    }\n\n    // Incremenet the end index so it is at the start of the next character\n    endIndex++;\n\n    // Calculate the start _column_, converting the the string indexes back to\n    // column coordinates.\n    let start =\n        startIndex // The index of the selection's start char in the line string\n        + charOffset // The difference between the initial char's column and index\n        - leftWideCharCount // The number of wide chars left of the initial char\n        + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n    // Calculate the length in _columns_, converting the the string indexes back\n    // to column coordinates.\n    let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n      endIndex // The index of the selection's end char in the line string\n      - startIndex // The index of the selection's start char in the line string\n      + leftWideCharCount // The number of wide chars left of the initial char\n      + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n      - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n      - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n    if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n      return undefined;\n    }\n\n    // Recurse upwards if the line is wrapped and the word wraps to the above line\n    if (followWrappedLinesAbove) {\n      if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n        const previousBufferLine = buffer.lines.get(coords[1] - 1);\n        if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n          const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n          if (previousLineWordPosition) {\n            const offset = this._bufferService.cols - previousLineWordPosition.start;\n            start -= offset;\n            length += offset;\n          }\n        }\n      }\n    }\n\n    // Recurse downwards if the line is wrapped and the word wraps to the next line\n    if (followWrappedLinesBelow) {\n      if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n        const nextBufferLine = buffer.lines.get(coords[1] + 1);\n        if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n          const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n          if (nextLineWordPosition) {\n            length += nextLineWordPosition.length;\n          }\n        }\n      }\n    }\n\n    return { start, length };\n  }\n\n  /**\n   * Selects the word at the coordinates specified.\n   * @param coords The coordinates to get the word at.\n   * @param allowWhitespaceOnlySelection If whitespace should be selected\n   */\n  protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n    const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n    if (wordPosition) {\n      // Adjust negative start value\n      while (wordPosition.start < 0) {\n        wordPosition.start += this._bufferService.cols;\n        coords[1]--;\n      }\n      this._model.selectionStart = [wordPosition.start, coords[1]];\n      this._model.selectionStartLength = wordPosition.length;\n    }\n  }\n\n  /**\n   * Sets the selection end to the word at the coordinated specified.\n   * @param coords The coordinates to get the word at.\n   */\n  private _selectToWordAt(coords: [number, number]): void {\n    const wordPosition = this._getWordAt(coords, true);\n    if (wordPosition) {\n      let endRow = coords[1];\n\n      // Adjust negative start value\n      while (wordPosition.start < 0) {\n        wordPosition.start += this._bufferService.cols;\n        endRow--;\n      }\n\n      // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n      // case we're interested in the start of the word, not the end\n      if (!this._model.areSelectionValuesReversed()) {\n        while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n          wordPosition.length -= this._bufferService.cols;\n          endRow++;\n        }\n      }\n\n      this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n    }\n  }\n\n  /**\n   * Gets whether the character is considered a word separator by the select\n   * word logic.\n   * @param cell The cell to check.\n   */\n  private _isCharWordSeparator(cell: ICellData): boolean {\n    // Zero width characters are never separators as they are always to the\n    // right of wide characters\n    if (cell.getWidth() === 0) {\n      return false;\n    }\n    return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n  }\n\n  /**\n   * Selects the line specified.\n   * @param line The line index.\n   */\n  protected _selectLineAt(line: number): void {\n    const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n    const range: IBufferRange = {\n      start: { x: 0, y: wrappedRange.first },\n      end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n    };\n    this._model.selectionStart = [0, wrappedRange.first];\n    this._model.selectionEnd = undefined;\n    this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n  }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n  private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n  public set(first: TFirst, second: TSecond, value: TValue): void {\n    if (!this._data[first]) {\n      this._data[first] = {};\n    }\n    this._data[first as string | number]![second] = value;\n  }\n\n  public get(first: TFirst, second: TSecond): TValue | undefined {\n    return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n  }\n\n  public clear(): void {\n    this._data = {};\n  }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n  private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n  public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n    if (!this._data.get(first, second)) {\n      this._data.set(first, second, new TwoKeyMap());\n    }\n    this._data.get(first, second)!.set(third, fourth, value);\n  }\n\n  public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n    return this._data.get(first, second)?.get(third, fourth);\n  }\n\n  public clear(): void {\n    this._data.clear();\n  }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { IColor } from 'common/Types';\nimport { TwoKeyMap } from 'common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n  private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap();\n  private _css: TwoKeyMap</* bg */number, /* fg */number, string | null> = new TwoKeyMap();\n\n  public setCss(bg: number, fg: number, value: string | null): void {\n    this._css.set(bg, fg, value);\n  }\n\n  public getCss(bg: number, fg: number): string | null | undefined {\n    return this._css.get(bg, fg);\n  }\n\n  public setColor(bg: number, fg: number, value: IColor | null): void {\n    this._color.set(bg, fg, value);\n  }\n\n  public getColor(bg: number, fg: number): IColor | null | undefined {\n    return this._color.get(bg, fg);\n  }\n\n  public clear(): void {\n    this._color.clear();\n    this._css.clear();\n  }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IColor, ICoreTerminal, ITerminalOptions } from 'common/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from 'common/Color';\nimport type { IEvent } from 'common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit<ITerminalApi, 'buffer' | 'parser' | 'unicode' | 'modes' | 'writeln' | 'loadAddon'>;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n  screenElement: HTMLElement | undefined;\n  browser: IBrowser;\n  buffer: IBuffer;\n  linkifier: ILinkifier2 | undefined;\n  options: Required<ITerminalOptions>;\n\n  readonly dimensions: IRenderDimensionsApi | undefined;\n\n  onBlur: IEvent<void>;\n  onFocus: IEvent<void>;\n  onDimensionsChange: IEvent<IRenderDimensionsApi>;\n  onA11yChar: IEvent<string>;\n  onA11yTab: IEvent<number>;\n  onWillOpen: IEvent<HTMLElement>;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n  readonly isComposing: boolean;\n  compositionstart(): void;\n  compositionupdate(ev: CompositionEvent): void;\n  compositionend(): void;\n  updateCompositionElements(dontRecurse?: boolean): void;\n  keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n  isNode: boolean;\n  userAgent: string;\n  platform: string;\n  isFirefox: boolean;\n  isMac: boolean;\n  isIpad: boolean;\n  isIphone: boolean;\n  isWindows: boolean;\n}\n\nexport interface IColorSet {\n  foreground: IColor;\n  background: IColor;\n  cursor: IColor;\n  cursorAccent: IColor;\n  selectionForeground: IColor | undefined;\n  selectionBackgroundTransparent: IColor;\n  /** The selection blended on top of background. */\n  selectionBackgroundOpaque: IColor;\n  selectionInactiveBackgroundTransparent: IColor;\n  selectionInactiveBackgroundOpaque: IColor;\n  scrollbarSliderBackground: IColor;\n  scrollbarSliderHoverBackground: IColor;\n  scrollbarSliderActiveBackground: IColor;\n  overviewRulerBorder: IColor;\n  ansi: IColor[];\n  /** Maps original colors to colors that respect minimum contrast ratio. */\n  contrastCache: IColorContrastCache;\n  /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n  halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly<Omit<IColorSet, 'ansi'>> & { ansi: Readonly<Pick<IColorSet, 'ansi'>['ansi']> };\n\nexport interface IColorContrastCache {\n  clear(): void;\n  setCss(bg: number, fg: number, value: string | null): void;\n  getCss(bg: number, fg: number): string | null | undefined;\n  setColor(bg: number, fg: number, value: IColor | null): void;\n  getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n  foreground: IColor;\n  background: IColor;\n  cursor?: IColor;\n  cursorAccent?: IColor;\n  selectionBackground?: IColor;\n  ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n  scrollBarWidth: number;\n  readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n  syncScrollArea(immediate?: boolean, force?: boolean): void;\n  getLinesScrolled(ev: WheelEvent): number;\n  getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n  handleWheel(ev: WheelEvent): boolean;\n  handleTouchStart(ev: TouchEvent): void;\n  handleTouchMove(ev: TouchEvent): boolean;\n  scrollLines(disp: number): void;  // todo api name?\n  reset(): void;\n}\n\nexport interface ILinkifierEvent {\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  cols: number;\n  fg: number | undefined;\n}\n\ninterface ILinkState {\n  decorations: ILinkDecorations;\n  isHovered: boolean;\n}\nexport interface ILinkWithState {\n  link: ILink;\n  state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n  onShowLinkUnderline: IEvent<ILinkifierEvent>;\n  onHideLinkUnderline: IEvent<ILinkifierEvent>;\n  readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n  range: IBufferRange;\n  text: string;\n  decorations?: ILinkDecorations;\n  activate(event: MouseEvent, text: string): void;\n  hover?(event: MouseEvent, text: string): void;\n  leave?(event: MouseEvent, text: string): void;\n  dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n  pointerCursor: boolean;\n  underline: boolean;\n}\n\nexport interface IBufferRange {\n  start: IBufferCellPosition;\n  end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n  x: number;\n  y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n  id: number;\n  handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n  refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n  addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n  provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n  const colors = [\n    // dark:\n    css.toColor('#2e3436'),\n    css.toColor('#cc0000'),\n    css.toColor('#4e9a06'),\n    css.toColor('#c4a000'),\n    css.toColor('#3465a4'),\n    css.toColor('#75507b'),\n    css.toColor('#06989a'),\n    css.toColor('#d3d7cf'),\n    // bright:\n    css.toColor('#555753'),\n    css.toColor('#ef2929'),\n    css.toColor('#8ae234'),\n    css.toColor('#fce94f'),\n    css.toColor('#729fcf'),\n    css.toColor('#ad7fa8'),\n    css.toColor('#34e2e2'),\n    css.toColor('#eeeeec')\n  ];\n\n  // Fill in the remaining 240 ANSI colors.\n  // Generate colors (16-231)\n  const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n  for (let i = 0; i < 216; i++) {\n    const r = v[(i / 36) % 6 | 0];\n    const g = v[(i / 6) % 6 | 0];\n    const b = v[i % 6];\n    colors.push({\n      css: channels.toCss(r, g, b),\n      rgba: channels.toRgba(r, g, b)\n    });\n  }\n\n  // Generate greys (232-255)\n  for (let i = 0; i < 24; i++) {\n    const c = 8 + i * 10;\n    colors.push({\n      css: channels.toCss(c, c, c),\n      rgba: channels.toRgba(c, c, c)\n    });\n  }\n\n  return colors;\n})());\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from 'browser/ColorContrastCache';\nimport { IThemeService } from 'browser/services/Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { color, css, NULL_COLOR } from 'common/Color';\nimport { Disposable } from 'common/Lifecycle';\nimport { IOptionsService, ITheme } from 'common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from 'common/Types';\nimport { Emitter } from 'common/Event';\n\ninterface IRestoreColorSet {\n  foreground: IColor;\n  background: IColor;\n  cursor: IColor;\n  ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n  css: 'rgba(255, 255, 255, 0.3)',\n  rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n  public serviceBrand: undefined;\n\n  private _colors: IColorSet;\n  private _contrastCache: IColorContrastCache = new ColorContrastCache();\n  private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n  private _restoreColors!: IRestoreColorSet;\n\n  public get colors(): ReadonlyColorSet { return this._colors; }\n\n  private readonly _onChangeColors = this._register(new Emitter<ReadonlyColorSet>());\n  public readonly onChangeColors = this._onChangeColors.event;\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n\n    this._colors = {\n      foreground: DEFAULT_FOREGROUND,\n      background: DEFAULT_BACKGROUND,\n      cursor: DEFAULT_CURSOR,\n      cursorAccent: DEFAULT_CURSOR_ACCENT,\n      selectionForeground: undefined,\n      selectionBackgroundTransparent: DEFAULT_SELECTION,\n      selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n      selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n      selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n      scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n      scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n      scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n      overviewRulerBorder: DEFAULT_FOREGROUND,\n      ansi: DEFAULT_ANSI_COLORS.slice(),\n      contrastCache: this._contrastCache,\n      halfContrastCache: this._halfContrastCache\n    };\n    this._updateRestoreColors();\n    this._setTheme(this._optionsService.rawOptions.theme);\n\n    this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n    this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n  }\n\n  /**\n   * Sets the terminal's theme.\n   * @param theme The  theme to use. If a partial theme is provided then default\n   * colors will be used where colors are not defined.\n   */\n  private _setTheme(theme: ITheme = {}): void {\n    const colors = this._colors;\n    colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n    colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n    colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n    colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n    colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n    colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n    colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n    colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n    colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n    if (colors.selectionForeground === NULL_COLOR) {\n      colors.selectionForeground = undefined;\n    }\n\n    /**\n     * If selection color is opaque, blend it with background with 0.3 opacity\n     * Issue #2737\n     */\n    if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n      const opacity = 0.3;\n      colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n    }\n    if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n      const opacity = 0.3;\n      colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n    }\n    colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n    colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n    colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n    colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n    colors.ansi = DEFAULT_ANSI_COLORS.slice();\n    colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n    colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n    colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n    colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n    colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n    colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n    colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n    colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n    colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n    colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n    colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n    colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n    colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n    colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n    colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n    colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n    if (theme.extendedAnsi) {\n      const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n      for (let i = 0; i < colorCount; i++) {\n        colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n      }\n    }\n    // Clear our the cache\n    this._contrastCache.clear();\n    this._halfContrastCache.clear();\n    this._updateRestoreColors();\n    this._onChangeColors.fire(this.colors);\n  }\n\n  public restoreColor(slot?: AllColorIndex): void {\n    this._restoreColor(slot);\n    this._onChangeColors.fire(this.colors);\n  }\n\n  private _restoreColor(slot: AllColorIndex | undefined): void {\n    // unset slot restores all ansi colors\n    if (slot === undefined) {\n      for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n        this._colors.ansi[i] = this._restoreColors.ansi[i];\n      }\n      return;\n    }\n    switch (slot) {\n      case SpecialColorIndex.FOREGROUND:\n        this._colors.foreground = this._restoreColors.foreground;\n        break;\n      case SpecialColorIndex.BACKGROUND:\n        this._colors.background = this._restoreColors.background;\n        break;\n      case SpecialColorIndex.CURSOR:\n        this._colors.cursor = this._restoreColors.cursor;\n        break;\n      default:\n        this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n    }\n  }\n\n  public modifyColors(callback: (colors: IColorSet) => void): void {\n    callback(this._colors);\n    // Assume the change happened\n    this._onChangeColors.fire(this.colors);\n  }\n\n  private _updateRestoreColors(): void {\n    this._restoreColors = {\n      foreground: this._colors.foreground,\n      background: this._colors.background,\n      cursor: this._colors.cursor,\n      ansi: this._colors.ansi.slice()\n    };\n  }\n}\n\nfunction parseColor(\n  cssString: string | undefined,\n  fallback: IColor\n): IColor {\n  if (cssString !== undefined) {\n    try {\n      return css.toColor(cssString);\n    } catch {\n      // no-op\n    }\n  }\n  return fallback;\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n  // digits 0-9\n  48: ['0', ')'],\n  49: ['1', '!'],\n  50: ['2', '@'],\n  51: ['3', '#'],\n  52: ['4', '$'],\n  53: ['5', '%'],\n  54: ['6', '^'],\n  55: ['7', '&'],\n  56: ['8', '*'],\n  57: ['9', '('],\n\n  // special chars\n  186: [';', ':'],\n  187: ['=', '+'],\n  188: [',', '<'],\n  189: ['-', '_'],\n  190: ['.', '>'],\n  191: ['/', '?'],\n  192: ['`', '~'],\n  219: ['[', '{'],\n  220: ['\\\\', '|'],\n  221: [']', '}'],\n  222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n  ev: IKeyboardEvent,\n  applicationCursorMode: boolean,\n  isMac: boolean,\n  macOptionIsMeta: boolean\n): IKeyboardResult {\n  const result: IKeyboardResult = {\n    type: KeyboardResultType.SEND_KEY,\n    // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n    // canceled at the end of keyDown\n    cancel: false,\n    // The new key even to emit\n    key: undefined\n  };\n  const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n  switch (ev.keyCode) {\n    case 0:\n      if (ev.key === 'UIKeyInputUpArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OA';\n        } else {\n          result.key = C0.ESC + '[A';\n        }\n      }\n      else if (ev.key === 'UIKeyInputLeftArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OD';\n        } else {\n          result.key = C0.ESC + '[D';\n        }\n      }\n      else if (ev.key === 'UIKeyInputRightArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OC';\n        } else {\n          result.key = C0.ESC + '[C';\n        }\n      }\n      else if (ev.key === 'UIKeyInputDownArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OB';\n        } else {\n          result.key = C0.ESC + '[B';\n        }\n      }\n      break;\n    case 8:\n      // backspace\n      result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n      if (ev.altKey) {\n        result.key = C0.ESC + result.key;\n      }\n      break;\n    case 9:\n      // tab\n      if (ev.shiftKey) {\n        result.key = C0.ESC + '[Z';\n        break;\n      }\n      result.key = C0.HT;\n      result.cancel = true;\n      break;\n    case 13:\n      // return/enter\n      if (ev.key === 'c' && ev.ctrlKey) {\n        // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n        // keyboard\n        result.key = C0.ETX;\n      } else {\n        result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n      }\n      result.cancel = true;\n      break;\n    case 27:\n      // escape\n      result.key = C0.ESC;\n      if (ev.altKey) {\n        result.key = C0.ESC + C0.ESC;\n      }\n      result.cancel = true;\n      break;\n    case 37:\n      // left-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OD';\n      } else {\n        result.key = C0.ESC + '[D';\n      }\n      break;\n    case 39:\n      // right-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OC';\n      } else {\n        result.key = C0.ESC + '[C';\n      }\n      break;\n    case 38:\n      // up-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OA';\n      } else {\n        result.key = C0.ESC + '[A';\n      }\n      break;\n    case 40:\n      // down-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OB';\n      } else {\n        result.key = C0.ESC + '[B';\n      }\n      break;\n    case 45:\n      // insert\n      if (!ev.shiftKey && !ev.ctrlKey) {\n        // <Ctrl> or <Shift> + <Insert> are used to\n        // copy-paste on some systems.\n        result.key = C0.ESC + '[2~';\n      }\n      break;\n    case 46:\n      // delete\n      if (modifiers) {\n        result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[3~';\n      }\n      break;\n    case 36:\n      // home\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OH';\n      } else {\n        result.key = C0.ESC + '[H';\n      }\n      break;\n    case 35:\n      // end\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OF';\n      } else {\n        result.key = C0.ESC + '[F';\n      }\n      break;\n    case 33:\n      // page up\n      if (ev.shiftKey) {\n        result.type = KeyboardResultType.PAGE_UP;\n      } else if (ev.ctrlKey) {\n        result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[5~';\n      }\n      break;\n    case 34:\n      // page down\n      if (ev.shiftKey) {\n        result.type = KeyboardResultType.PAGE_DOWN;\n      } else if (ev.ctrlKey) {\n        result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[6~';\n      }\n      break;\n    case 112:\n      // F1-F12\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n      } else {\n        result.key = C0.ESC + 'OP';\n      }\n      break;\n    case 113:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n      } else {\n        result.key = C0.ESC + 'OQ';\n      }\n      break;\n    case 114:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n      } else {\n        result.key = C0.ESC + 'OR';\n      }\n      break;\n    case 115:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n      } else {\n        result.key = C0.ESC + 'OS';\n      }\n      break;\n    case 116:\n      if (modifiers) {\n        result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[15~';\n      }\n      break;\n    case 117:\n      if (modifiers) {\n        result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[17~';\n      }\n      break;\n    case 118:\n      if (modifiers) {\n        result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[18~';\n      }\n      break;\n    case 119:\n      if (modifiers) {\n        result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[19~';\n      }\n      break;\n    case 120:\n      if (modifiers) {\n        result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[20~';\n      }\n      break;\n    case 121:\n      if (modifiers) {\n        result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[21~';\n      }\n      break;\n    case 122:\n      if (modifiers) {\n        result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[23~';\n      }\n      break;\n    case 123:\n      if (modifiers) {\n        result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[24~';\n      }\n      break;\n    default:\n      // a-z and space\n      if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n        if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n          result.key = String.fromCharCode(ev.keyCode - 64);\n        } else if (ev.keyCode === 32) {\n          result.key = C0.NUL;\n        } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n          // escape, file sep, group sep, record sep, unit sep\n          result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n        } else if (ev.keyCode === 56) {\n          result.key = C0.DEL;\n        } else if (ev.key === '/') {\n          result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n        } else if (ev.keyCode === 219) {\n          result.key = C0.ESC;\n        } else if (ev.keyCode === 220) {\n          result.key = C0.FS;\n        } else if (ev.keyCode === 221) {\n          result.key = C0.GS;\n        }\n      } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n        // On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.\n        const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n        const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n        if (key) {\n          result.key = C0.ESC + key;\n        } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n          const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n          let keyString = String.fromCharCode(keyCode);\n          if (ev.shiftKey) {\n            keyString = keyString.toUpperCase();\n          }\n          result.key = C0.ESC + keyString;\n        } else if (ev.keyCode === 32) {\n          result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n        } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n          // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n          // Alt will produce a \"dead key\" (initate composition) with some\n          // of the letters in US layout (e.g. N/E/U).\n          // It's safe to match against Key* since no other `code` values begin with \"Key\".\n          // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n          let keyString = ev.code.slice(3, 4);\n          if (!ev.shiftKey) {\n            keyString = keyString.toLowerCase();\n          }\n          result.key = C0.ESC + keyString;\n          result.cancel = true;\n        }\n      } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n        if (ev.keyCode === 65) { // cmd + a\n          result.type = KeyboardResultType.SELECT_ALL;\n        }\n      } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n        // Include only keys that that result in a _single_ character; don't include num lock,\n        // volume up, etc.\n        result.key = ev.key;\n      } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n        switch (ev.code) {\n          case 'Minus':  result.key = C0.US;  break; // ^_ (Ctrl+Shift+-_\n          case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n          case 'Digit6': result.key = C0.RS;  break; // ^^ (Ctrl+Shift+6)\n        }\n      }\n      break;\n  }\n\n  return result;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n  NONE                            = 0b00000,\n  /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n  DISAMBIGUATE_ESCAPE_CODES       = 0b00001,\n  /** Report event types - press/repeat/release */\n  REPORT_EVENT_TYPES              = 0b00010,\n  /** Report alternate keys - shifted key and base layout key */\n  REPORT_ALTERNATE_KEYS           = 0b00100,\n  /** Report all keys as escape codes - text-producing keys as CSI u */\n  REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n  /** Report associated text - includes text codepoints in escape code */\n  REPORT_ASSOCIATED_TEXT          = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n  PRESS = 1,\n  REPEAT = 2,\n  RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n  SHIFT     = 0b00000001,\n  ALT       = 0b00000010,\n  CTRL      = 0b00000100,\n  SUPER     = 0b00001000,\n  HYPER     = 0b00010000,\n  META      = 0b00100000,\n  CAPS_LOCK = 0b01000000,\n  NUM_LOCK  = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n  /**\n   * Functional key codes for Kitty protocol.\n   * Keys that don't produce text have specific unicode codepoint mappings.\n   */\n  private readonly _functionalKeyCodes: { [key: string]: number } = {\n    'Escape': 27,\n    'Enter': 13,\n    'Tab': 9,\n    'Backspace': 127,\n    'CapsLock': 57358,\n    'ScrollLock': 57359,\n    'NumLock': 57360,\n    'PrintScreen': 57361,\n    'Pause': 57362,\n    'ContextMenu': 57363,\n    // F13-F35 (F1-F12 use legacy encoding)\n    'F13': 57376,\n    'F14': 57377,\n    'F15': 57378,\n    'F16': 57379,\n    'F17': 57380,\n    'F18': 57381,\n    'F19': 57382,\n    'F20': 57383,\n    'F21': 57384,\n    'F22': 57385,\n    'F23': 57386,\n    'F24': 57387,\n    'F25': 57388,\n    // Keypad keys\n    'KP_0': 57399,\n    'KP_1': 57400,\n    'KP_2': 57401,\n    'KP_3': 57402,\n    'KP_4': 57403,\n    'KP_5': 57404,\n    'KP_6': 57405,\n    'KP_7': 57406,\n    'KP_8': 57407,\n    'KP_9': 57408,\n    'KP_Decimal': 57409,\n    'KP_Divide': 57410,\n    'KP_Multiply': 57411,\n    'KP_Subtract': 57412,\n    'KP_Add': 57413,\n    'KP_Enter': 57414,\n    'KP_Equal': 57415,\n    // Modifier keys\n    'ShiftLeft': 57441,\n    'ShiftRight': 57447,\n    'ControlLeft': 57442,\n    'ControlRight': 57448,\n    'AltLeft': 57443,\n    'AltRight': 57449,\n    'MetaLeft': 57444,\n    'MetaRight': 57450,\n    // Media keys\n    'MediaPlayPause': 57430,\n    'MediaStop': 57432,\n    'MediaTrackNext': 57435,\n    'MediaTrackPrevious': 57436,\n    'AudioVolumeDown': 57438,\n    'AudioVolumeUp': 57439,\n    'AudioVolumeMute': 57440\n  };\n\n  /**\n   * Keys that use CSI ~ encoding with a number parameter.\n   */\n  private readonly _csiTildeKeys: { [key: string]: number } = {\n    'Insert': 2,\n    'Delete': 3,\n    'PageUp': 5,\n    'PageDown': 6,\n    'F5': 15,\n    'F6': 17,\n    'F7': 18,\n    'F8': 19,\n    'F9': 20,\n    'F10': 21,\n    'F11': 23,\n    'F12': 24\n  };\n\n  /**\n   * Keys that use CSI letter encoding (arrows, Home, End).\n   */\n  private readonly _csiLetterKeys: { [key: string]: string } = {\n    'ArrowUp': 'A',\n    'ArrowDown': 'B',\n    'ArrowRight': 'C',\n    'ArrowLeft': 'D',\n    'Home': 'H',\n    'End': 'F'\n  };\n\n  /**\n   * Function keys F1-F4 use SS3 encoding without modifiers.\n   */\n  private readonly _ss3FunctionKeys: { [key: string]: string } = {\n    'F1': 'P',\n    'F2': 'Q',\n    'F3': 'R',\n    'F4': 'S'\n  };\n\n  /**\n   * Map browser key codes to Kitty numpad codes.\n   */\n  private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n    if (ev.code.startsWith('Numpad')) {\n      const suffix = ev.code.slice(6);\n      if (suffix >= '0' && suffix <= '9') {\n        return 57399 + parseInt(suffix, 10);\n      }\n      switch (suffix) {\n        case 'Decimal': return 57409;\n        case 'Divide': return 57410;\n        case 'Multiply': return 57411;\n        case 'Subtract': return 57412;\n        case 'Add': return 57413;\n        case 'Enter': return 57414;\n        case 'Equal': return 57415;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Get modifier key code from code property.\n   */\n  private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n    switch (ev.code) {\n      case 'ShiftLeft': return 57441;\n      case 'ShiftRight': return 57447;\n      case 'ControlLeft': return 57442;\n      case 'ControlRight': return 57448;\n      case 'AltLeft': return 57443;\n      case 'AltRight': return 57449;\n      case 'MetaLeft': return 57444;\n      case 'MetaRight': return 57450;\n    }\n    return undefined;\n  }\n\n  /**\n   * Encode modifiers for Kitty protocol.\n   * Returns 1 + modifier bits, or 0 if no modifiers.\n   */\n  private _encodeModifiers(ev: IKeyboardEvent): number {\n    let mods = 0;\n    if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n    if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n    if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n    if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n    return mods > 0 ? mods + 1 : 0;\n  }\n\n  /**\n   * Get the unicode key code for a keyboard event.\n   * Returns the lowercase codepoint for letters.\n   * For shifted keys, uses the code property to get the base key.\n   */\n  private _getKeyCode(ev: IKeyboardEvent): number | undefined {\n    const numpadCode = this._getNumpadKeyCode(ev);\n    if (numpadCode !== undefined) {\n      return numpadCode;\n    }\n\n    const modifierCode = this._getModifierKeyCode(ev);\n    if (modifierCode !== undefined) {\n      return modifierCode;\n    }\n\n    const funcCode = this._functionalKeyCodes[ev.key];\n    if (funcCode !== undefined) {\n      return funcCode;\n    }\n\n    if (ev.shiftKey && ev.code) {\n      if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n        const digit = ev.code.charAt(5);\n        if (digit >= '0' && digit <= '9') {\n          return digit.charCodeAt(0);\n        }\n      }\n      if (ev.code.startsWith('Key') && ev.code.length === 4) {\n        const letter = ev.code.charAt(3).toLowerCase();\n        return letter.charCodeAt(0);\n      }\n    }\n\n    if (ev.key.length === 1) {\n      const code = ev.key.codePointAt(0)!;\n      if (code >= 65 && code <= 90) {\n        return code + 32;\n      }\n      return code;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Check if a key is a modifier key.\n   */\n  private _isModifierKey(ev: IKeyboardEvent): boolean {\n    return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n  }\n\n  /**\n   * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n   *\n   * Kitty's reference implementation classifies these as modifier keys for the\n   * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n   * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n   * and its test suite asserts that a CapsLock press with no protocol flags\n   * produces empty output.\n   */\n  private _isLockKey(ev: IKeyboardEvent): boolean {\n    return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n  }\n\n  /**\n   * Build CSI letter sequence for arrow keys, Home, End.\n   * Format: CSI [1;mod] letter\n   */\n  private _buildCsiLetterSequence(\n    letter: string,\n    modifiers: number,\n    eventType: KittyKeyboardEventType,\n    reportEventTypes: boolean\n  ): string {\n    const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n    if (modifiers > 0 || needsEventType) {\n      let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n      if (needsEventType) {\n        seq += ':' + eventType;\n      }\n      seq += letter;\n      return seq;\n    }\n    return C0.ESC + '[' + letter;\n  }\n\n  /**\n   * Build SS3 sequence for F1-F4.\n   * Without modifiers: SS3 letter\n   * With modifiers: CSI 1;mod letter\n   */\n  private _buildSs3Sequence(\n    letter: string,\n    modifiers: number,\n    eventType: KittyKeyboardEventType,\n    reportEventTypes: boolean\n  ): string {\n    const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n    if (modifiers > 0 || needsEventType) {\n      let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n      if (needsEventType) {\n        seq += ':' + eventType;\n      }\n      seq += letter;\n      return seq;\n    }\n    return C0.ESC + 'O' + letter;\n  }\n\n  /**\n   * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n   * Format: CSI number [;mod[:event]] ~\n   */\n  private _buildCsiTildeSequence(\n    number: number,\n    modifiers: number,\n    eventType: KittyKeyboardEventType,\n    reportEventTypes: boolean\n  ): string {\n    const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n    let seq = C0.ESC + '[' + number;\n    if (modifiers > 0 || needsEventType) {\n      seq += ';' + (modifiers > 0 ? modifiers : '1');\n      if (needsEventType) {\n        seq += ':' + eventType;\n      }\n    }\n    seq += '~';\n    return seq;\n  }\n\n  /**\n   * Build CSI u sequence.\n   * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n   */\n  private _buildCsiUSequence(\n    ev: IKeyboardEvent,\n    keyCode: number,\n    modifiers: number,\n    eventType: KittyKeyboardEventType,\n    flags: number,\n    isFunc: boolean,\n    isMod: boolean\n  ): string {\n    const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n    const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n    let seq = C0.ESC + '[' + keyCode;\n\n    let shiftedKey: number | undefined;\n    if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n      shiftedKey = ev.key.codePointAt(0);\n      seq += ':' + shiftedKey;\n    }\n\n    const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n      eventType !== KittyKeyboardEventType.RELEASE &&\n      ev.key.length === 1 &&\n      !isFunc &&\n      !isMod &&\n      !ev.ctrlKey;\n    const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n    const needsEventType = reportEventTypes &&\n      eventType !== KittyKeyboardEventType.PRESS &&\n      (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n    if (modifiers > 0 || needsEventType || textCode !== undefined) {\n      seq += ';';\n      if (modifiers > 0) {\n        seq += modifiers;\n      } else if (needsEventType) {\n        seq += '1';\n      }\n      if (needsEventType) {\n        seq += ':' + eventType;\n      }\n    }\n\n    if (textCode !== undefined) {\n      seq += ';' + textCode;\n    }\n\n    seq += 'u';\n    return seq;\n  }\n\n  /**\n   * Evaluate a keyboard event using Kitty keyboard protocol.\n   *\n   * @param ev The keyboard event.\n   * @param flags The active Kitty keyboard enhancement flags.\n   * @param eventType The event type (press, repeat, release).\n   * @returns The keyboard result with the encoded key sequence.\n   */\n  public evaluate(\n    ev: IKeyboardEvent,\n    flags: number,\n    eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS\n  ): IKeyboardResult {\n    const result: IKeyboardResult = {\n      type: KeyboardResultType.SEND_KEY,\n      cancel: false,\n      key: undefined\n    };\n\n    const modifiers = this._encodeModifiers(ev);\n    const isMod = this._isModifierKey(ev);\n    const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n    if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n      return result;\n    }\n\n    if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n      return result;\n    }\n\n    // Spec \u00A7 \"Report all keys as escape codes\": \"Additionally, with this mode,\n    // events for pressing modifier keys are reported.\" \u2014 i.e. *without* this\n    // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n    // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n    if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n      return result;\n    }\n\n    const csiLetter = this._csiLetterKeys[ev.key];\n    if (csiLetter) {\n      result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n      result.cancel = true;\n      return result;\n    }\n\n    const ss3Letter = this._ss3FunctionKeys[ev.key];\n    if (ss3Letter) {\n      result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n      result.cancel = true;\n      return result;\n    }\n\n    const tildeCode = this._csiTildeKeys[ev.key];\n    if (tildeCode !== undefined) {\n      result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n      result.cancel = true;\n      return result;\n    }\n\n    const keyCode = this._getKeyCode(ev);\n    if (keyCode === undefined) {\n      return result;\n    }\n\n    const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n    let useCsiU = false;\n\n    if (flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES) {\n      useCsiU = true;\n    } else if (reportEventTypes) {\n      useCsiU = true;\n    } else if (flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES) {\n      // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy\n      // mode\" and consider space to be a text-generating key, so these skip the isFunc fast-path\n      // and only get CSI u when modifiers are present (handled below).\n      const isDisambiguateLegacy = keyCode === 13 || keyCode === 9 || keyCode === 127;\n      if (isFunc && !isDisambiguateLegacy) {\n        useCsiU = true;\n      } else if (modifiers > 0) {\n        if (ev.shiftKey && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.key.length === 1) {\n          useCsiU = false;\n        } else {\n          useCsiU = true;\n        }\n      }\n    }\n\n    if (useCsiU) {\n      result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n      result.cancel = true;\n    } else {\n      const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n      if (legacyByte) {\n        result.key = legacyByte;\n      } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n        result.key = ev.key;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Check if Kitty protocol should be used based on flags.\n   */\n  public static shouldUseProtocol(flags: number): boolean {\n    return flags > 0;\n  }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n *   Vk: Virtual key code (decimal)\n *   Sc: Scan code (decimal)\n *   Uc: Unicode character (decimal codepoint, 0 if none)\n *   Kd: Key down (1) or up (0)\n *   Cs: Control key state (modifier flags)\n *   Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n  RIGHT_ALT_PRESSED   = 0b000000001,\n  LEFT_ALT_PRESSED    = 0b000000010,\n  RIGHT_CTRL_PRESSED  = 0b000000100,\n  LEFT_CTRL_PRESSED   = 0b000001000,\n  SHIFT_PRESSED       = 0b000010000,\n  NUMLOCK_ON          = 0b000100000,\n  SCROLLLOCK_ON       = 0b001000000,\n  CAPSLOCK_ON         = 0b010000000,\n  ENHANCED_KEY        = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n  /**\n   * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n   * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n   */\n  private readonly _codeToVk: { [code: string]: number } = {\n    // Letters\n    'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n    'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n    'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n    'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n    'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n    'KeyZ': 0x5A,\n\n    // Digits\n    'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n    'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n    // Function keys\n    'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n    'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n    'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n    'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n    // Numpad\n    'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n    'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n    'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n    'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n    'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n    'NumLock': 0x90,\n\n    // Navigation\n    'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n    'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n    'Insert': 0x2D, 'Delete': 0x2E,\n\n    // Modifiers\n    'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n    'ControlLeft': 0x11, 'ControlRight': 0x11,\n    'AltLeft': 0x12, 'AltRight': 0x12,\n    'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n    'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n    // Special keys\n    'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n    'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n    // OEM keys (US keyboard layout)\n    'Semicolon': 0xBA,      // ;:\n    'Equal': 0xBB,          // =+\n    'Comma': 0xBC,          // ,<\n    'Minus': 0xBD,          // -_\n    'Period': 0xBE,         // .>\n    'Slash': 0xBF,          // /?\n    'Backquote': 0xC0,      // `~\n    'BracketLeft': 0xDB,    // [{\n    'Backslash': 0xDC,      // \\|\n    'BracketRight': 0xDD,   // ]}\n    'Quote': 0xDE,          // '\"\n    'IntlBackslash': 0xE2   // Non-US backslash\n  };\n\n  /**\n   * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n   * Note: Scan codes can vary by keyboard layout. These are approximations\n   * based on standard US keyboard layout.\n   */\n  private readonly _codeToScancode: { [code: string]: number } = {\n    // Letters (row by row)\n    'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n    'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n    'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n    'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n    'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n    'KeyN': 0x31, 'KeyM': 0x32,\n\n    // Digits\n    'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n    'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n    // Function keys\n    'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n    'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n    // Numpad\n    'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n    'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n    'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n    'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n    'NumLock': 0x45,\n\n    // Navigation (extended keys)\n    'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n    'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n    'Insert': 0x52, 'Delete': 0x53,\n\n    // Modifiers\n    'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n    'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n    'AltLeft': 0x38, 'AltRight': 0x38,\n    'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n    // Special keys\n    'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n    'Backspace': 0x0E, 'Pause': 0x45,\n\n    // OEM keys\n    'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n    'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n    'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n  };\n\n  /**\n   * Codes that represent enhanced keys (extended keyboard keys).\n   */\n  private readonly _enhancedKeyCodes = new Set([\n    'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n    'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n    'NumpadEnter', 'NumpadDivide',\n    'ControlRight', 'AltRight',\n    'PrintScreen', 'Pause', 'ContextMenu',\n    'MetaLeft', 'MetaRight'\n  ]);\n\n  /**\n   * Mapping of special keys (ev.key values) to their Unicode control character codes.\n   * These keys have multi-character ev.key strings but produce control characters.\n   * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n   */\n  private readonly _keyToControlChar: { [key: string]: number } = {\n    'Enter': 0x0D,      // Carriage return\n    'Backspace': 0x08,  // Backspace\n    'Tab': 0x09,        // Horizontal tab\n    'Escape': 0x1B      // Escape\n  };\n\n  /**\n   * Get the Win32 virtual key code for a keyboard event.\n   */\n  private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n    const vk = this._codeToVk[ev.code];\n    if (vk !== undefined) {\n      return vk;\n    }\n    // Fall back to keyCode for unmapped keys\n    return ev.keyCode || 0;\n  }\n\n  /**\n   * Get the Win32 scan code for a keyboard event.\n   * Returns 0 if unknown (scan codes vary by hardware).\n   */\n  private _getScanCode(ev: IKeyboardEvent): number {\n    return this._codeToScancode[ev.code] || 0;\n  }\n\n  /**\n   * Get the unicode character for a keyboard event.\n   * Returns 0 for non-character keys.\n   */\n  private _getUnicodeChar(ev: IKeyboardEvent): number {\n    // Handle special keys that produce control characters\n    // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n    if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n      if (ev.key === 'Enter') {\n        return 0x0A; // Line feed (Ctrl+Enter)\n      }\n      if (ev.key === 'Backspace') {\n        return 0x7F; // DEL (Ctrl+Backspace)\n      }\n    }\n\n    // Check for special keys that always produce control characters\n    const controlChar = this._keyToControlChar[ev.key];\n    if (controlChar !== undefined) {\n      return controlChar;\n    }\n\n    // Only single-character keys produce unicode output\n    if (ev.key.length === 1) {\n      const codePoint = ev.key.codePointAt(0) || 0;\n\n      // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n      if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n        // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n        if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n          return codePoint - 0x40;\n        }\n        if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n          return codePoint - 0x60;\n        }\n      }\n\n      return codePoint;\n    }\n    return 0;\n  }\n\n  /**\n   * Get the Win32 control key state flags.\n   */\n  private _getControlKeyState(ev: IKeyboardEvent): number {\n    let state = 0;\n\n    if (ev.shiftKey) {\n      state |= Win32ControlKeyState.SHIFT_PRESSED;\n    }\n\n    // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n    // so we use the generic pressed flags. The right-side flags are used when\n    // we can detect them (e.g., via code property).\n    if (ev.ctrlKey) {\n      if (ev.code === 'ControlRight') {\n        state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n      } else {\n        state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n      }\n    }\n\n    if (ev.altKey) {\n      if (ev.code === 'AltRight') {\n        state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n      } else {\n        state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n      }\n    }\n\n    // Check for enhanced key\n    if (this._enhancedKeyCodes.has(ev.code)) {\n      state |= Win32ControlKeyState.ENHANCED_KEY;\n    }\n\n    return state;\n  }\n\n  /**\n   * Evaluate a keyboard event using Win32 input mode.\n   *\n   * @param ev The keyboard event.\n   * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n   * @returns The keyboard result with the encoded key sequence.\n   */\n  public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n    const vk = this._getVirtualKeyCode(ev);\n    const sc = this._getScanCode(ev);\n    const uc = this._getUnicodeChar(ev);\n    const kd = isKeyDown ? 1 : 0;\n    const cs = this._getControlKeyState(ev);\n    const rc = 1; // Repeat count, always 1 for now\n\n    // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n    return {\n      type: KeyboardResultType.SEND_KEY,\n      cancel: true,\n      key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n    };\n  }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from 'browser/services/Services';\nimport { evaluateKeyboardEvent } from 'common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from 'common/input/KittyKeyboard';\nimport { Win32InputMode } from 'common/input/Win32InputMode';\nimport { isMac } from 'common/Platform';\nimport { ICoreService, IOptionsService } from 'common/services/Services';\nimport { IKeyboardResult } from 'common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n  public serviceBrand: undefined;\n\n  private _win32InputMode: Win32InputMode | undefined;\n  private _kittyKeyboard: KittyKeyboard | undefined;\n\n  constructor(\n    @ICoreService private readonly _coreService: ICoreService,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n  }\n\n  private _getWin32InputMode(): Win32InputMode {\n    this._win32InputMode ??= new Win32InputMode();\n    return this._win32InputMode;\n  }\n\n  private _getKittyKeyboard(): KittyKeyboard {\n    this._kittyKeyboard ??= new KittyKeyboard();\n    return this._kittyKeyboard;\n  }\n\n  public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n    // Win32 input mode takes priority (most raw)\n    if (this.useWin32InputMode) {\n      return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n    }\n    const kittyFlags = this._coreService.kittyKeyboard.flags;\n    return this.useKitty\n      ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS)\n      : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n  }\n\n  public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n    // Win32 input mode sends key up events\n    if (this.useWin32InputMode) {\n      return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n    }\n    const kittyFlags = this._coreService.kittyKeyboard.flags;\n    if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n      return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE);\n    }\n    return undefined;\n  }\n\n  public get useKitty(): boolean {\n    const kittyFlags = this._coreService.kittyKeyboard.flags;\n    return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n  }\n\n  public get useWin32InputMode(): boolean {\n    return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService, IServiceIdentifier } from 'common/services/Services';\nimport { getServiceDependencies } from 'common/services/ServiceRegistry';\n\nexport class ServiceCollection {\n\n  private _entries = new Map<IServiceIdentifier<any>, any>();\n\n  constructor(...entries: [IServiceIdentifier<any>, any][]) {\n    for (const [id, service] of entries) {\n      this.set(id, service);\n    }\n  }\n\n  public set<T>(id: IServiceIdentifier<T>, instance: T): T {\n    const result = this._entries.get(id);\n    this._entries.set(id, instance);\n    return result;\n  }\n\n  public forEach(callback: (id: IServiceIdentifier<any>, instance: any) => any): void {\n    for (const [key, value] of this._entries.entries()) {\n      callback(key, value);\n    }\n  }\n\n  public has(id: IServiceIdentifier<any>): boolean {\n    return this._entries.has(id);\n  }\n\n  public get<T>(id: IServiceIdentifier<T>): T | undefined {\n    return this._entries.get(id);\n  }\n}\n\nexport class InstantiationService implements IInstantiationService {\n  public serviceBrand: undefined;\n\n  private readonly _services: ServiceCollection = new ServiceCollection();\n\n  constructor() {\n    this._services.set(IInstantiationService, this);\n  }\n\n  public setService<T>(id: IServiceIdentifier<T>, instance: T): void {\n    this._services.set(id, instance);\n  }\n\n  public getService<T>(id: IServiceIdentifier<T>): T | undefined {\n    return this._services.get(id);\n  }\n\n  public createInstance<T>(ctor: any, ...args: any[]): T {\n    const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n    const serviceArgs: any[] = [];\n    for (const dependency of serviceDependencies) {\n      const service = this._services.get(dependency.id);\n      if (!service) {\n        throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n      }\n      serviceArgs.push(service);\n    }\n\n    const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n    // check for argument mismatches, adjust static args if needed\n    if (args.length !== firstServiceArgPos) {\n      throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n    }\n\n    // now create the instance\n    return new ctor(...[...args, ...serviceArgs]);\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n  log: LogType;\n  error: LogType;\n  info: LogType;\n  trace: LogType;\n  warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n  trace: LogLevelEnum.TRACE,\n  debug: LogLevelEnum.DEBUG,\n  info: LogLevelEnum.INFO,\n  warn: LogLevelEnum.WARN,\n  error: LogLevelEnum.ERROR,\n  off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n  public serviceBrand: any;\n\n  private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n  public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._updateLogLevel();\n    this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n  }\n\n  private _updateLogLevel(): void {\n    this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n  }\n\n  private _evalLazyOptionalParams(optionalParams: any[]): void {\n    for (let i = 0; i < optionalParams.length; i++) {\n      if (typeof optionalParams[i] === 'function') {\n        optionalParams[i] = optionalParams[i]();\n      }\n    }\n  }\n\n  private _log(type: LogType, message: string, optionalParams: any[]): void {\n    this._evalLazyOptionalParams(optionalParams);\n    type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n  }\n\n  public trace(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.TRACE) {\n      this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public debug(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.DEBUG) {\n      this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public info(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.INFO) {\n      this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n    }\n  }\n\n  public warn(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.WARN) {\n      this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n    }\n  }\n\n  public error(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.ERROR) {\n      this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n    }\n  }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICircularList } from 'common/Types';\nimport { Disposable } from 'common/Lifecycle';\nimport { Emitter } from 'common/Event';\n\nexport interface IInsertEvent {\n  index: number;\n  amount: number;\n}\n\nexport interface IDeleteEvent {\n  index: number;\n  amount: number;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList<T> extends Disposable implements ICircularList<T> {\n  protected _array: (T | undefined)[];\n  private _startIndex: number;\n  private _length: number;\n\n  public readonly onDeleteEmitter = this._register(new Emitter<IDeleteEvent>());\n  public readonly onDelete = this.onDeleteEmitter.event;\n  public readonly onInsertEmitter = this._register(new Emitter<IInsertEvent>());\n  public readonly onInsert = this.onInsertEmitter.event;\n  public readonly onTrimEmitter = this._register(new Emitter<number>());\n  public readonly onTrim = this.onTrimEmitter.event;\n\n  constructor(\n    private _maxLength: number\n  ) {\n    super();\n    this._array = new Array<T>(this._maxLength);\n    this._startIndex = 0;\n    this._length = 0;\n  }\n\n  public get maxLength(): number {\n    return this._maxLength;\n  }\n\n  public set maxLength(newMaxLength: number) {\n    // There was no change in maxLength, return early.\n    if (this._maxLength === newMaxLength) {\n      return;\n    }\n\n    // Reconstruct array, starting at index 0. Only transfer values from the\n    // indexes 0 to length.\n    const newArray = new Array<T | undefined>(newMaxLength);\n    for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n      newArray[i] = this._array[this._getCyclicIndex(i)];\n    }\n    this._array = newArray;\n    this._maxLength = newMaxLength;\n    this._startIndex = 0;\n  }\n\n  public get length(): number {\n    return this._length;\n  }\n\n  public set length(newLength: number) {\n    if (newLength > this._length) {\n      for (let i = this._length; i < newLength; i++) {\n        this._array[i] = undefined;\n      }\n    }\n    this._length = newLength;\n  }\n\n  /**\n   * Gets the value at an index.\n   *\n   * Note that for performance reasons there is no bounds checking here, the index reference is\n   * circular so this should always return a value and never throw.\n   * @param index The index of the value to get.\n   * @returns The value corresponding to the index.\n   */\n  public get(index: number): T | undefined {\n    return this._array[this._getCyclicIndex(index)];\n  }\n\n  /**\n   * Sets the value at an index.\n   *\n   * Note that for performance reasons there is no bounds checking here, the index reference is\n   * circular so this should always return a value and never throw.\n   * @param index The index to set.\n   * @param value The value to set.\n   */\n  public set(index: number, value: T | undefined): void {\n    this._array[this._getCyclicIndex(index)] = value;\n  }\n\n  /**\n   * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n   * if the maximum length is reached.\n   * @param value The value to push onto the list.\n   */\n  public push(value: T): void {\n    this._array[this._getCyclicIndex(this._length)] = value;\n    if (this._length === this._maxLength) {\n      this._startIndex = ++this._startIndex % this._maxLength;\n      this.onTrimEmitter.fire(1);\n    } else {\n      this._length++;\n    }\n  }\n\n  /**\n   * Advance ringbuffer index and return current element for recycling.\n   * Note: The buffer must be full for this method to work.\n   * @throws When the buffer is not full.\n   */\n  public recycle(): T {\n    if (this._length !== this._maxLength) {\n      throw new Error('Can only recycle when the buffer is full');\n    }\n    this._startIndex = ++this._startIndex % this._maxLength;\n    this.onTrimEmitter.fire(1);\n    return this._array[this._getCyclicIndex(this._length - 1)]!;\n  }\n\n  /**\n   * Ringbuffer is at max length.\n   */\n  public get isFull(): boolean {\n    return this._length === this._maxLength;\n  }\n\n  /**\n   * Removes and returns the last value on the list.\n   * @returns The popped value.\n   */\n  public pop(): T | undefined {\n    return this._array[this._getCyclicIndex(this._length-- - 1)];\n  }\n\n  /**\n   * Deletes and/or inserts items at a particular index (in that order). Unlike\n   * Array.prototype.splice, this operation does not return the deleted items as a new array in\n   * order to save creating a new array. Note that this operation may shift all values in the list\n   * in the worst case.\n   * @param start The index to delete and/or insert.\n   * @param deleteCount The number of elements to delete.\n   * @param items The items to insert.\n   */\n  public splice(start: number, deleteCount: number, ...items: T[]): void {\n    // Delete items\n    if (deleteCount) {\n      for (let i = start; i < this._length - deleteCount; i++) {\n        this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n      }\n      this._length -= deleteCount;\n      this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n    }\n\n    // Add items\n    for (let i = this._length - 1; i >= start; i--) {\n      this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n    }\n    for (let i = 0; i < items.length; i++) {\n      this._array[this._getCyclicIndex(start + i)] = items[i];\n    }\n    if (items.length) {\n      this.onInsertEmitter.fire({ index: start, amount: items.length });\n    }\n\n    // Adjust length as needed\n    if (this._length + items.length > this._maxLength) {\n      const countToTrim = (this._length + items.length) - this._maxLength;\n      this._startIndex += countToTrim;\n      this._length = this._maxLength;\n      this.onTrimEmitter.fire(countToTrim);\n    } else {\n      this._length += items.length;\n    }\n  }\n\n  /**\n   * Trims a number of items from the start of the list.\n   * @param count The number of items to remove.\n   */\n  public trimStart(count: number): void {\n    if (count > this._length) {\n      count = this._length;\n    }\n    this._startIndex += count;\n    this._length -= count;\n    this.onTrimEmitter.fire(count);\n  }\n\n  public shiftElements(start: number, count: number, offset: number): void {\n    if (count <= 0) {\n      return;\n    }\n    if (start < 0 || start >= this._length) {\n      throw new Error('start argument out of range');\n    }\n    if (start + offset < 0) {\n      throw new Error('Cannot shift elements in list beyond index 0');\n    }\n\n    if (offset > 0) {\n      for (let i = count - 1; i >= 0; i--) {\n        this.set(start + i + offset, this.get(start + i));\n      }\n      const expandListBy = (start + count + offset) - this._length;\n      if (expandListBy > 0) {\n        this._length += expandListBy;\n        while (this._length > this._maxLength) {\n          this._length--;\n          this._startIndex++;\n          this.onTrimEmitter.fire(1);\n        }\n      }\n    } else {\n      for (let i = 0; i < count; i++) {\n        this.set(start + i + offset, this.get(start + i));\n      }\n    }\n  }\n\n  /**\n   * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n   * backing array to get the element associated with the regular index.\n   * @param index The regular index.\n   * @returns The cyclic index.\n   */\n  private _getCyclicIndex(index: number): number {\n    return (this._startIndex + index) % this._maxLength;\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from 'common/buffer/Constants';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\n\n/**\n * buffer memory layout:\n *\n *   |             uint32_t             |        uint32_t         |        uint32_t         |\n *   |             `content`            |          `FG`           |          `BG`           |\n *   | wcwidth(2) comb(1) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |\n */\n\n\n/** typed array slots taken by one cell */\nconst CELL_SIZE = 3;\n\n/**\n * Cell member indices.\n *\n * Direct access:\n *    `content = data[column * CELL_SIZE + Cell.CONTENT];`\n *    `fg = data[column * CELL_SIZE + Cell.FG];`\n *    `bg = data[column * CELL_SIZE + Cell.BG];`\n */\nconst enum Cell {\n  CONTENT = 0,\n  FG = 1, // currently simply holds all known attrs\n  BG = 2  // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\n\n/** Factor when to cleanup underlying array buffer after shrinking. */\nconst CLEANUP_THRESHOLD = 2;\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n *   Use these for data that is already UTF32.\n *   Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n *   This method takes a CellData object and stores the data in the buffer.\n *   Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n  protected _data: Uint32Array;\n  protected _combined: {[index: number]: string} = {};\n  protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n  public length: number;\n\n  constructor(cols: number, fillCellData?: ICellData, public isWrapped: boolean = false) {\n    this._data = new Uint32Array(cols * CELL_SIZE);\n    const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n    for (let i = 0; i < cols; ++i) {\n      this.setCell(i, cell);\n    }\n    this.length = cols;\n  }\n\n  /**\n   * Get cell data CharData.\n   * @deprecated\n   */\n  public get(index: number): CharData {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    const cp = content & Content.CODEPOINT_MASK;\n    return [\n      this._data[index * CELL_SIZE + Cell.FG],\n      (content & Content.IS_COMBINED_MASK)\n        ? this._combined[index]\n        : (cp) ? stringFromCodePoint(cp) : '',\n      content >> Content.WIDTH_SHIFT,\n      (content & Content.IS_COMBINED_MASK)\n        ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n        : cp\n    ];\n  }\n\n  /**\n   * Set cell data from CharData.\n   * @deprecated\n   */\n  public set(index: number, value: CharData): void {\n    this._data[index * CELL_SIZE + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n    if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n      this._combined[index] = value[1];\n      this._data[index * CELL_SIZE + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    } else {\n      this._data[index * CELL_SIZE + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n\n  /**\n   * primitive getters\n   * use these when only one value is needed, otherwise use `loadCell`\n   */\n  public getWidth(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n  }\n\n  /** Test whether content has width. */\n  public hasWidth(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.WIDTH_MASK;\n  }\n\n  /** Get FG cell component. */\n  public getFg(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.FG];\n  }\n\n  /** Get BG cell component. */\n  public getBg(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.BG];\n  }\n\n  /**\n   * Test whether contains any chars.\n   * Basically an empty has no content, but other cells might differ in FG/BG\n   * from real empty cells.\n   */\n  public hasContent(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n  }\n\n  /**\n   * Get codepoint of the cell.\n   * To be in line with `code` in CharData this either returns\n   * a single UTF32 codepoint or the last codepoint of a combined string.\n   */\n  public getCodePoint(index: number): number {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      return this._combined[index].charCodeAt(this._combined[index].length - 1);\n    }\n    return content & Content.CODEPOINT_MASK;\n  }\n\n  /** Test whether the cell contains a combined string. */\n  public isCombined(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n  }\n\n  /** Returns the string content of the cell. */\n  public getString(index: number): string {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      return this._combined[index];\n    }\n    if (content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n    }\n    // return empty string for empty cells\n    return '';\n  }\n\n  /** Get state of protected flag. */\n  public isProtected(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.BG] & BgFlags.PROTECTED;\n  }\n\n  /**\n   * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n   * to GC as it significantly reduced the amount of new objects/references needed.\n   */\n  public loadCell(index: number, cell: ICellData): ICellData {\n    $startIndex = index * CELL_SIZE;\n    cell.content = this._data[$startIndex + Cell.CONTENT];\n    cell.fg = this._data[$startIndex + Cell.FG];\n    cell.bg = this._data[$startIndex + Cell.BG];\n    if (cell.content & Content.IS_COMBINED_MASK) {\n      cell.combinedData = this._combined[index];\n    }\n    if (cell.bg & BgFlags.HAS_EXTENDED) {\n      cell.extended = this._extendedAttrs[index]!;\n    }\n    return cell;\n  }\n\n  /**\n   * Set data at `index` to `cell`.\n   */\n  public setCell(index: number, cell: ICellData): void {\n    if (cell.content & Content.IS_COMBINED_MASK) {\n      this._combined[index] = cell.combinedData;\n    }\n    if (cell.bg & BgFlags.HAS_EXTENDED) {\n      this._extendedAttrs[index] = cell.extended;\n    }\n    this._data[index * CELL_SIZE + Cell.CONTENT] = cell.content;\n    this._data[index * CELL_SIZE + Cell.FG] = cell.fg;\n    this._data[index * CELL_SIZE + Cell.BG] = cell.bg;\n  }\n\n  /**\n   * Set cell data from input handler.\n   * Since the input handler see the incoming chars as UTF32 codepoints,\n   * it gets an optimized access method.\n   */\n  public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n    if (attrs.bg & BgFlags.HAS_EXTENDED) {\n      this._extendedAttrs[index] = attrs.extended;\n    }\n    this._data[index * CELL_SIZE + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n    this._data[index * CELL_SIZE + Cell.FG] = attrs.fg;\n    this._data[index * CELL_SIZE + Cell.BG] = attrs.bg;\n  }\n\n  /**\n   * Add a codepoint to a cell from input handler.\n   * During input stage combining chars with a width of 0 follow and stack\n   * onto a leading char. Since we already set the attrs\n   * by the previous `setDataFromCodePoint` call, we can omit it here.\n   */\n  public addCodepointToCell(index: number, codePoint: number, width: number): void {\n    let content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      // we already have a combined string, simply add\n      this._combined[index] += stringFromCodePoint(codePoint);\n    } else {\n      if (content & Content.CODEPOINT_MASK) {\n        // normal case for combining chars:\n        //  - move current leading char + new one into combined string\n        //  - set combined flag\n        this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n        content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n        content |= Content.IS_COMBINED_MASK;\n      } else {\n        // should not happen - we actually have no data in the cell yet\n        // simply set the data in the cell buffer with a width of 1\n        content = codePoint | (1 << Content.WIDTH_SHIFT);\n      }\n    }\n    if (width) {\n      content &= ~Content.WIDTH_MASK;\n      content |= width << Content.WIDTH_SHIFT;\n    }\n    this._data[index * CELL_SIZE + Cell.CONTENT] = content;\n  }\n\n  public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n    pos %= this.length;\n\n    // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n    if (pos && this.getWidth(pos - 1) === 2) {\n      this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n    }\n\n    if (n < this.length - pos) {\n      for (let i = this.length - pos - n - 1; i >= 0; --i) {\n        this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n      }\n      for (let i = 0; i < n; ++i) {\n        this.setCell(pos + i, fillCellData);\n      }\n    } else {\n      for (let i = pos; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    }\n\n    // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n    if (this.getWidth(this.length - 1) === 2) {\n      this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n    }\n  }\n\n  public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n    pos %= this.length;\n    if (n < this.length - pos) {\n      for (let i = 0; i < this.length - pos - n; ++i) {\n        this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n      }\n      for (let i = this.length - n; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    } else {\n      for (let i = pos; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    }\n\n    // handle fullwidth at pos:\n    // - reset pos-1 if wide char\n    // - reset pos if width==0 (previous second cell of a wide char)\n    if (pos && this.getWidth(pos - 1) === 2) {\n      this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n    }\n    if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n      this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n    }\n  }\n\n  public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n    // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n    if (respectProtect) {\n      if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n        this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n      }\n      if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n        this.setCellFromCodepoint(end, 0, 1, fillCellData);\n      }\n      while (start < end  && start < this.length) {\n        if (!this.isProtected(start)) {\n          this.setCell(start, fillCellData);\n        }\n        start++;\n      }\n      return;\n    }\n\n    // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n    if (start && this.getWidth(start - 1) === 2) {\n      this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n    }\n    // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n    if (end < this.length && this.getWidth(end - 1) === 2) {\n      this.setCellFromCodepoint(end, 0, 1, fillCellData);\n    }\n\n    while (start < end  && start < this.length) {\n      this.setCell(start++, fillCellData);\n    }\n  }\n\n  /**\n   * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n   * The underlying array buffer will not change if there is still enough space\n   * to hold the new buffer line data.\n   * Returns a boolean indicating, whether a `cleanupMemory` call would free\n   * excess memory (true after shrinking > CLEANUP_THRESHOLD).\n   */\n  public resize(cols: number, fillCellData: ICellData): boolean {\n    if (cols === this.length) {\n      return this._data.length * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n    }\n    const uint32Cells = cols * CELL_SIZE;\n    if (cols > this.length) {\n      if (this._data.buffer.byteLength >= uint32Cells * 4) {\n        // optimization: avoid alloc and data copy if buffer has enough room\n        this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n      } else {\n        // slow path: new alloc and full data copy\n        const data = new Uint32Array(uint32Cells);\n        data.set(this._data);\n        this._data = data;\n      }\n      for (let i = this.length; i < cols; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    } else {\n      // optimization: just shrink the view on existing buffer\n      this._data = this._data.subarray(0, uint32Cells);\n      // Remove any cut off combined data\n      const keys = Object.keys(this._combined);\n      for (let i = 0; i < keys.length; i++) {\n        const key = parseInt(keys[i], 10);\n        if (key >= cols) {\n          delete this._combined[key];\n        }\n      }\n      // remove any cut off extended attributes\n      const extKeys = Object.keys(this._extendedAttrs);\n      for (let i = 0; i < extKeys.length; i++) {\n        const key = parseInt(extKeys[i], 10);\n        if (key >= cols) {\n          delete this._extendedAttrs[key];\n        }\n      }\n    }\n    this.length = cols;\n    return uint32Cells * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n  }\n\n  /**\n   * Cleanup underlying array buffer.\n   * A cleanup will be triggered if the array buffer exceeds the actual used\n   * memory by a factor of CLEANUP_THRESHOLD.\n   * Returns 0 or 1 indicating whether a cleanup happened.\n   */\n  public cleanupMemory(): number {\n    if (this._data.length * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n      const data = new Uint32Array(this._data.length);\n      data.set(this._data);\n      this._data = data;\n      return 1;\n    }\n    return 0;\n  }\n\n  /** fill a line with fillCharData */\n  public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n    // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n    if (respectProtect) {\n      for (let i = 0; i < this.length; ++i) {\n        if (!this.isProtected(i)) {\n          this.setCell(i, fillCellData);\n        }\n      }\n      return;\n    }\n    this._combined = {};\n    this._extendedAttrs = {};\n    for (let i = 0; i < this.length; ++i) {\n      this.setCell(i, fillCellData);\n    }\n  }\n\n  /** alter to a full copy of line  */\n  public copyFrom(line: BufferLine): void {\n    if (this.length !== line.length) {\n      this._data = new Uint32Array(line._data);\n    } else {\n      // use high speed copy if lengths are equal\n      this._data.set(line._data);\n    }\n    this.length = line.length;\n    this._combined = {};\n    for (const el in line._combined) {\n      this._combined[el] = line._combined[el];\n    }\n    this._extendedAttrs = {};\n    for (const el in line._extendedAttrs) {\n      this._extendedAttrs[el] = line._extendedAttrs[el];\n    }\n    this.isWrapped = line.isWrapped;\n  }\n\n  /** create a new clone */\n  public clone(): IBufferLine {\n    const newLine = new BufferLine(0);\n    newLine._data = new Uint32Array(this._data);\n    newLine.length = this.length;\n    for (const el in this._combined) {\n      newLine._combined[el] = this._combined[el];\n    }\n    for (const el in this._extendedAttrs) {\n      newLine._extendedAttrs[el] = this._extendedAttrs[el];\n    }\n    newLine.isWrapped = this.isWrapped;\n    return newLine;\n  }\n\n  public getTrimmedLength(): number {\n    for (let i = this.length - 1; i >= 0; --i) {\n      if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n        return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n      }\n    }\n    return 0;\n  }\n\n  public getNoBgTrimmedLength(): number {\n    for (let i = this.length - 1; i >= 0; --i) {\n      if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * CELL_SIZE + Cell.BG] & Attributes.CM_MASK)) {\n        return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n      }\n    }\n    return 0;\n  }\n\n  public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n    const srcData = src._data;\n    if (applyInReverse) {\n      for (let cell = length - 1; cell >= 0; cell--) {\n        for (let i = 0; i < CELL_SIZE; i++) {\n          this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n        }\n        if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n          this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n        }\n      }\n    } else {\n      for (let cell = 0; cell < length; cell++) {\n        for (let i = 0; i < CELL_SIZE; i++) {\n          this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n        }\n        if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n          this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n        }\n      }\n    }\n\n    // Move any combined data over as needed, FIXME: repeat for extended attrs\n    const srcCombinedKeys = Object.keys(src._combined);\n    for (let i = 0; i < srcCombinedKeys.length; i++) {\n      const key = parseInt(srcCombinedKeys[i], 10);\n      if (key >= srcCol) {\n        this._combined[key - srcCol + destCol] = src._combined[key];\n      }\n    }\n  }\n\n  /**\n   * Translates the buffer line to a string.\n   *\n   * @param trimRight Whether to trim any empty cells on the right.\n   * @param startCol The column to start the string (0-based inclusive).\n   * @param endCol The column to end the string (0-based exclusive).\n   * @param outColumns if specified, this array will be filled with column numbers such that\n   * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n   * is where the character following `returnedString` will be displayed.\n   *\n   * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n   * returned string, the corresponding entries in `outColumns` will have the same column number.\n   */\n  public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n    startCol = startCol ?? 0;\n    endCol = endCol ?? this.length;\n    if (trimRight) {\n      endCol = Math.min(endCol, this.getTrimmedLength());\n    }\n    if (outColumns) {\n      outColumns.length = 0;\n    }\n    let result = '';\n    while (startCol < endCol) {\n      const content = this._data[startCol * CELL_SIZE + Cell.CONTENT];\n      const cp = content & Content.CODEPOINT_MASK;\n      const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n      result += chars;\n      if (outColumns) {\n        for (let i = 0; i < chars.length; ++i) {\n          outColumns.push(startCol);\n        }\n      }\n      startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n    }\n    if (outColumns) {\n      outColumns.push(startCol);\n    }\n    return result;\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from 'common/buffer/BufferLine';\nimport { CircularList } from 'common/CircularList';\nimport { IBufferLine, ICellData } from 'common/Types';\n\nexport interface INewLayoutResult {\n  layout: number[];\n  countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n  // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n  // batched up and only committed once\n  const toRemove: number[] = [];\n\n  for (let y = 0; y < lines.length - 1; y++) {\n    // Check if this row is wrapped\n    let i = y;\n    let nextLine = lines.get(++i) as BufferLine;\n    if (!nextLine.isWrapped) {\n      continue;\n    }\n\n    // Check how many lines it's wrapped for\n    const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n    while (i < lines.length && nextLine.isWrapped) {\n      wrappedLines.push(nextLine);\n      nextLine = lines.get(++i) as BufferLine;\n    }\n\n    if (!reflowCursorLine) {\n      // If these lines contain the cursor don't touch them, the program will handle fixing up\n      // wrapped lines with the cursor\n      if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n        y += wrappedLines.length - 1;\n        continue;\n      }\n    }\n\n    // Copy buffer data to new locations\n    let destLineIndex = 0;\n    let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n    let srcLineIndex = 1;\n    let srcCol = 0;\n    while (srcLineIndex < wrappedLines.length) {\n      const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n      const srcRemainingCells = srcTrimmedTineLength - srcCol;\n      const destRemainingCells = newCols - destCol;\n      const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n      wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n      destCol += cellsToCopy;\n      if (destCol === newCols) {\n        destLineIndex++;\n        destCol = 0;\n      }\n      srcCol += cellsToCopy;\n      if (srcCol === srcTrimmedTineLength) {\n        srcLineIndex++;\n        srcCol = 0;\n      }\n\n      // Make sure the last cell isn't wide, if it is copy it to the current dest\n      if (destCol === 0 && destLineIndex !== 0) {\n        if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n          wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n          // Null out the end of the last row\n          wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n        }\n      }\n    }\n\n    // Clear out remaining cells or fragments could remain;\n    wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n    // Work backwards and remove any rows at the end that only contain null cells\n    let countToRemove = 0;\n    for (let i = wrappedLines.length - 1; i > 0; i--) {\n      if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n        countToRemove++;\n      } else {\n        break;\n      }\n    }\n\n    if (countToRemove > 0) {\n      toRemove.push(y + wrappedLines.length - countToRemove); // index\n      toRemove.push(countToRemove);\n    }\n\n    y += wrappedLines.length - 1;\n  }\n  return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList<IBufferLine>, toRemove: number[]): INewLayoutResult {\n  const layout: number[] = [];\n  // First iterate through the list and get the actual indexes to use for rows\n  let nextToRemoveIndex = 0;\n  let nextToRemoveStart = toRemove[nextToRemoveIndex];\n  let countRemovedSoFar = 0;\n  for (let i = 0; i < lines.length; i++) {\n    if (nextToRemoveStart === i) {\n      const countToRemove = toRemove[++nextToRemoveIndex];\n\n      // Tell markers that there was a deletion\n      lines.onDeleteEmitter.fire({\n        index: i - countRemovedSoFar,\n        amount: countToRemove\n      });\n\n      i += countToRemove - 1;\n      countRemovedSoFar += countToRemove;\n      nextToRemoveStart = toRemove[++nextToRemoveIndex];\n    } else {\n      layout.push(i);\n    }\n  }\n  return {\n    layout,\n    countRemoved: countRemovedSoFar\n  };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList<IBufferLine>, newLayout: number[]): void {\n  // Record original lines so they don't get overridden when we rearrange the list\n  const newLayoutLines: BufferLine[] = [];\n  for (let i = 0; i < newLayout.length; i++) {\n    newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n  }\n\n  // Rearrange the list\n  for (let i = 0; i < newLayoutLines.length; i++) {\n    lines.set(i, newLayoutLines[i]);\n  }\n  lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n  const newLineLengths: number[] = [];\n  const cellsNeeded = wrappedLines.map((l, i) => getWrappedLineTrimmedLength(wrappedLines, i, oldCols)).reduce((p, c) => p + c);\n\n  // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n  // linesNeeded\n  let srcCol = 0;\n  let srcLine = 0;\n  let cellsAvailable = 0;\n  while (cellsAvailable < cellsNeeded) {\n    if (cellsNeeded - cellsAvailable < newCols) {\n      // Add the final line and exit the loop\n      newLineLengths.push(cellsNeeded - cellsAvailable);\n      break;\n    }\n    srcCol += newCols;\n    const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n    if (srcCol > oldTrimmedLength) {\n      srcCol -= oldTrimmedLength;\n      srcLine++;\n    }\n    const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n    if (endsWithWide) {\n      srcCol--;\n    }\n    const lineLength = endsWithWide ? newCols - 1 : newCols;\n    newLineLengths.push(lineLength);\n    cellsAvailable += lineLength;\n  }\n\n  return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n  // If this is the last row in the wrapped line, get the actual trimmed length\n  if (i === lines.length - 1) {\n    return lines[i].getTrimmedLength();\n  }\n  // Detect whether the following line starts with a wide character and the end of the current line\n  // is null, if so then we can be pretty sure the null character should be excluded from the line\n  // length]\n  const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n  const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n  if (endsInNull && followingLineStartsWithWide) {\n    return cols - 1;\n  }\n  return cols;\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable, IMarker } from 'common/Types';\nimport { Emitter } from 'common/Event';\nimport { dispose } from 'common/Lifecycle';\n\nexport class Marker implements IMarker {\n  private static _nextId = 1;\n\n  public isDisposed: boolean = false;\n  private readonly _disposables: IDisposable[] = [];\n\n  private readonly _id: number = Marker._nextId++;\n  public get id(): number { return this._id; }\n\n  private readonly _onDispose = this.register(new Emitter<void>());\n  public readonly onDispose = this._onDispose.event;\n\n  constructor(\n    public line: number\n  ) {\n  }\n\n  public dispose(): void {\n    if (this.isDisposed) {\n      return;\n    }\n    this.isDisposed = true;\n    this.line = -1;\n    // Emit before super.dispose such that dispose listeners get a change to react\n    this._onDispose.fire();\n    dispose(this._disposables);\n    this._disposables.length = 0;\n  }\n\n  public register<T extends IDisposable>(disposable: T): T {\n    this._disposables.push(disposable);\n    return disposable;\n  }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from 'common/Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n  '`': '\\u25c6', // '\u25C6'\n  'a': '\\u2592', // '\u2592'\n  'b': '\\u2409', // '\u2409' (HT)\n  'c': '\\u240c', // '\u240C' (FF)\n  'd': '\\u240d', // '\u240D' (CR)\n  'e': '\\u240a', // '\u240A' (LF)\n  'f': '\\u00b0', // '\u00B0'\n  'g': '\\u00b1', // '\u00B1'\n  'h': '\\u2424', // '\u2424' (NL)\n  'i': '\\u240b', // '\u240B' (VT)\n  'j': '\\u2518', // '\u2518'\n  'k': '\\u2510', // '\u2510'\n  'l': '\\u250c', // '\u250C'\n  'm': '\\u2514', // '\u2514'\n  'n': '\\u253c', // '\u253C'\n  'o': '\\u23ba', // '\u23BA'\n  'p': '\\u23bb', // '\u23BB'\n  'q': '\\u2500', // '\u2500'\n  'r': '\\u23bc', // '\u23BC'\n  's': '\\u23bd', // '\u23BD'\n  't': '\\u251c', // '\u251C'\n  'u': '\\u2524', // '\u2524'\n  'v': '\\u2534', // '\u2534'\n  'w': '\\u252c', // '\u252C'\n  'x': '\\u2502', // '\u2502'\n  'y': '\\u2264', // '\u2264'\n  'z': '\\u2265', // '\u2265'\n  '{': '\\u03c0', // '\u03C0'\n  '|': '\\u2260', // '\u2260'\n  '}': '\\u00a3', // '\u00A3'\n  '~': '\\u00b7'  // '\u00B7'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n  '#': '\u00A3'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n  '#': '\u00A3',\n  '@': '\u00BE',\n  '[': 'ij',\n  '\\\\': '\u00BD',\n  ']': '|',\n  '{': '\u00A8',\n  '|': 'f',\n  '}': '\u00BC',\n  '~': '\u00B4'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] =\nCHARSETS['5'] = {\n  '[': '\u00C4',\n  '\\\\': '\u00D6',\n  ']': '\u00C5',\n  '^': '\u00DC',\n  '`': '\u00E9',\n  '{': '\u00E4',\n  '|': '\u00F6',\n  '}': '\u00E5',\n  '~': '\u00FC'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n  '#': '\u00A3',\n  '@': '\u00E0',\n  '[': '\u00B0',\n  '\\\\': '\u00E7',\n  ']': '\u00A7',\n  '{': '\u00E9',\n  '|': '\u00F9',\n  '}': '\u00E8',\n  '~': '\u00A8'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n  '@': '\u00E0',\n  '[': '\u00E2',\n  '\\\\': '\u00E7',\n  ']': '\u00EA',\n  '^': '\u00EE',\n  '`': '\u00F4',\n  '{': '\u00E9',\n  '|': '\u00F9',\n  '}': '\u00E8',\n  '~': '\u00FB'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n  '@': '\u00A7',\n  '[': '\u00C4',\n  '\\\\': '\u00D6',\n  ']': '\u00DC',\n  '{': '\u00E4',\n  '|': '\u00F6',\n  '}': '\u00FC',\n  '~': '\u00DF'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n  '#': '\u00A3',\n  '@': '\u00A7',\n  '[': '\u00B0',\n  '\\\\': '\u00E7',\n  ']': '\u00E9',\n  '`': '\u00F9',\n  '{': '\u00E0',\n  '|': '\u00F2',\n  '}': '\u00E8',\n  '~': '\u00EC'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] =\nCHARSETS['6'] = {\n  '@': '\u00C4',\n  '[': '\u00C6',\n  '\\\\': '\u00D8',\n  ']': '\u00C5',\n  '^': '\u00DC',\n  '`': '\u00E4',\n  '{': '\u00E6',\n  '|': '\u00F8',\n  '}': '\u00E5',\n  '~': '\u00FC'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n  '#': '\u00A3',\n  '@': '\u00A7',\n  '[': '\u00A1',\n  '\\\\': '\u00D1',\n  ']': '\u00BF',\n  '{': '\u00B0',\n  '|': '\u00F1',\n  '}': '\u00E7'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] =\nCHARSETS['7'] = {\n  '@': '\u00C9',\n  '[': '\u00C4',\n  '\\\\': '\u00D6',\n  ']': '\u00C5',\n  '^': '\u00DC',\n  '`': '\u00E9',\n  '{': '\u00E4',\n  '|': '\u00F6',\n  '}': '\u00E5',\n  '~': '\u00FC'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n  '#': '\u00F9',\n  '@': '\u00E0',\n  '[': '\u00E9',\n  '\\\\': '\u00E7',\n  ']': '\u00EA',\n  '^': '\u00EE',\n\n  '_': '\u00E8',\n  '`': '\u00F4',\n  '{': '\u00E4',\n  '|': '\u00F6',\n  '}': '\u00FC',\n  '~': '\u00FB'\n};\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from 'common/CircularList';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IAttributeData, IBufferLine, ICellData, ICharset } from 'common/Types';\nimport { ExtendedAttrs } from 'common/buffer/AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from 'common/buffer/BufferReflow';\nimport { CellData } from 'common/buffer/CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from 'common/buffer/Constants';\nimport { Marker } from 'common/buffer/Marker';\nimport { IBuffer } from 'common/buffer/Types';\nimport { DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from 'common/services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n *   - text content of this particular buffer\n *   - cursor position\n *   - scroll position\n */\nexport class Buffer implements IBuffer {\n  public lines: CircularList<IBufferLine>;\n  public ydisp: number = 0;\n  public ybase: number = 0;\n  public y: number = 0;\n  public x: number = 0;\n  public scrollBottom: number;\n  public scrollTop: number;\n  public tabs: { [column: number]: boolean | undefined } = {};\n  public savedY: number = 0;\n  public savedX: number = 0;\n  public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n  public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n  public savedCharsets: (ICharset | undefined)[] = [];\n  public savedGlevel: number = 0;\n  public savedOriginMode: boolean = false;\n  public savedWraparoundMode: boolean = true;\n  public markers: Marker[] = [];\n  private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n  private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n  private _cols: number;\n  private _rows: number;\n  private _isClearing: boolean = false;\n  private _memoryCleanupQueue: InstanceType<typeof IdleTaskQueue>;\n  private _memoryCleanupPosition = 0;\n\n  constructor(\n    private _hasScrollback: boolean,\n    private _optionsService: IOptionsService,\n    private _bufferService: IBufferService,\n    private readonly _logService: ILogService\n  ) {\n    this._cols = this._bufferService.cols;\n    this._rows = this._bufferService.rows;\n    this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n    this.scrollTop = 0;\n    this.scrollBottom = this._rows - 1;\n    this.setupTabStops();\n    this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n  }\n\n  public getNullCell(attr?: IAttributeData): ICellData {\n    if (attr) {\n      this._nullCell.fg = attr.fg;\n      this._nullCell.bg = attr.bg;\n      this._nullCell.extended = attr.extended;\n    } else {\n      this._nullCell.fg = 0;\n      this._nullCell.bg = 0;\n      this._nullCell.extended = new ExtendedAttrs();\n    }\n    return this._nullCell;\n  }\n\n  public getWhitespaceCell(attr?: IAttributeData): ICellData {\n    if (attr) {\n      this._whitespaceCell.fg = attr.fg;\n      this._whitespaceCell.bg = attr.bg;\n      this._whitespaceCell.extended = attr.extended;\n    } else {\n      this._whitespaceCell.fg = 0;\n      this._whitespaceCell.bg = 0;\n      this._whitespaceCell.extended = new ExtendedAttrs();\n    }\n    return this._whitespaceCell;\n  }\n\n  public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n    return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n  }\n\n  public get hasScrollback(): boolean {\n    return this._hasScrollback && this.lines.maxLength > this._rows;\n  }\n\n  public get isCursorInViewport(): boolean {\n    const absoluteY = this.ybase + this.y;\n    const relativeY = absoluteY - this.ydisp;\n    return (relativeY >= 0 && relativeY < this._rows);\n  }\n\n  /**\n   * Gets the correct buffer length based on the rows provided, the terminal's\n   * scrollback and whether this buffer is flagged to have scrollback or not.\n   * @param rows The terminal rows to use in the calculation.\n   */\n  private _getCorrectBufferLength(rows: number): number {\n    if (!this._hasScrollback) {\n      return rows;\n    }\n\n    const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n    return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n  }\n\n  /**\n   * Fills the buffer's viewport with blank lines.\n   */\n  public fillViewportRows(fillAttr?: IAttributeData): void {\n    if (this.lines.length === 0) {\n      fillAttr ??= DEFAULT_ATTR_DATA;\n      let i = this._rows;\n      while (i--) {\n        this.lines.push(this.getBlankLine(fillAttr));\n      }\n    }\n  }\n\n  /**\n   * Clears the buffer to it's initial state, discarding all previous data.\n   */\n  public clear(): void {\n    this.ydisp = 0;\n    this.ybase = 0;\n    this.y = 0;\n    this.x = 0;\n    this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n    this.scrollTop = 0;\n    this.scrollBottom = this._rows - 1;\n    this.setupTabStops();\n  }\n\n  /**\n   * Resizes the buffer, adjusting its data accordingly.\n   * @param newCols The new number of columns.\n   * @param newRows The new number of rows.\n   */\n  public resize(newCols: number, newRows: number): void {\n    // store reference to null cell with default attrs\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n    // count bufferlines with overly big memory to be cleaned afterwards\n    let dirtyMemoryLines = 0;\n\n    // Increase max length if needed before adjustments to allow space to fill\n    // as required.\n    const newMaxLength = this._getCorrectBufferLength(newRows);\n    if (newMaxLength > this.lines.maxLength) {\n      this.lines.maxLength = newMaxLength;\n    }\n\n    // if (this._cols > newCols) {\n    //   console.log('increase!');\n    // }\n\n    // The following adjustments should only happen if the buffer has been\n    // initialized/filled.\n    if (this.lines.length > 0) {\n      // Deal with columns increasing (reducing needs to happen after reflow)\n      if (this._cols < newCols) {\n        for (let i = 0; i < this.lines.length; i++) {\n          // +boolean for fast 0 or 1 conversion\n          dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n        }\n      }\n\n      // Resize rows in both directions as needed\n      let addToY = 0;\n      if (this._rows < newRows) {\n        for (let y = this._rows; y < newRows; y++) {\n          if (this.lines.length < newRows + this.ybase) {\n            if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n              // Just add the new missing rows on Windows as conpty reprints the screen with it's\n              // view of the world. Once a line enters scrollback for conpty it remains there\n              this.lines.push(new BufferLine(newCols, nullCell));\n            } else {\n              if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n                // There is room above the buffer and there are no empty elements below the line,\n                // scroll up\n                this.ybase--;\n                addToY++;\n                if (this.ydisp > 0) {\n                  // Viewport is at the top of the buffer, must increase downwards\n                  this.ydisp--;\n                }\n              } else {\n                // Add a blank line if there is no buffer left at the top to scroll to, or if there\n                // are blank lines after the cursor\n                this.lines.push(new BufferLine(newCols, nullCell));\n              }\n            }\n          }\n        }\n      } else { // (this._rows >= newRows)\n        for (let y = this._rows; y > newRows; y--) {\n          if (this.lines.length > newRows + this.ybase) {\n            if (this.lines.length > this.ybase + this.y + 1) {\n              // The line is a blank line below the cursor, remove it\n              this.lines.pop();\n            } else {\n              // The line is the cursor, scroll down\n              this.ybase++;\n              this.ydisp++;\n            }\n          }\n        }\n      }\n\n      // Reduce max length if needed after adjustments, this is done after as it\n      // would otherwise cut data from the bottom of the buffer.\n      if (newMaxLength < this.lines.maxLength) {\n        // Trim from the top of the buffer and adjust ybase and ydisp.\n        const amountToTrim = this.lines.length - newMaxLength;\n        if (amountToTrim > 0) {\n          this.lines.trimStart(amountToTrim);\n          this.ybase = Math.max(this.ybase - amountToTrim, 0);\n          this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n          this.savedY = Math.max(this.savedY - amountToTrim, 0);\n        }\n        this.lines.maxLength = newMaxLength;\n      }\n\n      // Make sure that the cursor stays on screen\n      this.x = Math.min(this.x, newCols - 1);\n      this.y = Math.min(this.y, newRows - 1);\n      if (addToY) {\n        this.y += addToY;\n      }\n      this.savedX = Math.min(this.savedX, newCols - 1);\n\n      this.scrollTop = 0;\n    }\n\n    this.scrollBottom = newRows - 1;\n\n    if (this._isReflowEnabled) {\n      this._reflow(newCols, newRows);\n\n      // Trim the end of the line off if cols shrunk\n      if (this._cols > newCols) {\n        for (let i = 0; i < this.lines.length; i++) {\n          // +boolean for fast 0 or 1 conversion\n          dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n        }\n      }\n    }\n\n    this._cols = newCols;\n    this._rows = newRows;\n\n    // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n    // This can be violated during reflow or when shrinking rows\n    if (this.lines.length > 0) {\n      const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n      this.y = Math.min(this.y, maxY);\n    }\n\n    this._memoryCleanupQueue.clear();\n    // schedule memory cleanup only, if more than 10% of the lines are affected\n    if (dirtyMemoryLines > 0.1 * this.lines.length) {\n      this._memoryCleanupPosition = 0;\n      this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n    }\n  }\n\n  private _batchedMemoryCleanup(): boolean {\n    let normalRun = true;\n    if (this._memoryCleanupPosition >= this.lines.length) {\n      // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n      // lines, which should finish rather quick if there are no more cleanups pending\n      this._memoryCleanupPosition = 0;\n      normalRun = false;\n    }\n    let counted = 0;\n    while (this._memoryCleanupPosition < this.lines.length) {\n      counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n      // cleanup max 100 lines per batch\n      if (counted > 100) {\n        return true;\n      }\n    }\n    // normal runs always need another rescan afterwards\n    // if we made it here with normalRun=false, we are in a final run\n    // and can end the cleanup task for sure\n    return normalRun;\n  }\n\n  private get _isReflowEnabled(): boolean {\n    const windowsPty = this._optionsService.rawOptions.windowsPty;\n    if (windowsPty && windowsPty.buildNumber) {\n      return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n    }\n    return this._hasScrollback;\n  }\n\n  private _reflow(newCols: number, newRows: number): void {\n    if (this._cols === newCols) {\n      return;\n    }\n\n    // Iterate through rows, ignore the last one as it cannot be wrapped\n    if (newCols > this._cols) {\n      this._reflowLarger(newCols, newRows);\n    } else {\n      this._reflowSmaller(newCols, newRows);\n    }\n  }\n\n  private _reflowLarger(newCols: number, newRows: number): void {\n    const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n    const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n    if (toRemove.length > 0) {\n      const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n      reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n      this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n    }\n  }\n\n  private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n    // Adjust viewport based on number of items removed\n    let viewportAdjustments = countRemoved;\n    while (viewportAdjustments-- > 0) {\n      if (this.ybase === 0) {\n        if (this.y > 0) {\n          this.y--;\n        }\n        if (this.lines.length < newRows) {\n          // Add an extra row at the bottom of the viewport\n          this.lines.push(new BufferLine(newCols, nullCell));\n        }\n      } else {\n        if (this.ydisp === this.ybase) {\n          this.ydisp--;\n        }\n        this.ybase--;\n      }\n    }\n    this.savedY = Math.max(this.savedY - countRemoved, 0);\n  }\n\n  private _reflowSmaller(newCols: number, newRows: number): void {\n    const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n    // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n    // batched up and only committed once\n    const toInsert = [];\n    let countToInsert = 0;\n    // Go backwards as many lines may be trimmed and this will avoid considering them\n    for (let y = this.lines.length - 1; y >= 0; y--) {\n      // Check whether this line is a problem\n      let nextLine = this.lines.get(y) as BufferLine;\n      if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n        continue;\n      }\n\n      // Gather wrapped lines and adjust y to be the starting line\n      const wrappedLines: BufferLine[] = [nextLine];\n      while (nextLine.isWrapped && y > 0) {\n        nextLine = this.lines.get(--y) as BufferLine;\n        wrappedLines.unshift(nextLine);\n      }\n\n      if (!reflowCursorLine) {\n        // If these lines contain the cursor don't touch them, the program will handle fixing up\n        // wrapped lines with the cursor\n        const absoluteY = this.ybase + this.y;\n        if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n          continue;\n        }\n      }\n\n      const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n      const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n      const linesToAdd = destLineLengths.length - wrappedLines.length;\n      let trimmedLines: number;\n      if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n        // If the top section of the buffer is not yet filled\n        trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n      } else {\n        trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n      }\n\n      // Add the new lines\n      const newLines: BufferLine[] = [];\n      for (let i = 0; i < linesToAdd; i++) {\n        const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n        newLines.push(newLine);\n      }\n      if (newLines.length > 0) {\n        toInsert.push({\n          // countToInsert here gets the actual index, taking into account other inserted items.\n          // using this we can iterate through the list forwards\n          start: y + wrappedLines.length + countToInsert,\n          newLines\n        });\n        countToInsert += newLines.length;\n      }\n      wrappedLines.push(...newLines);\n\n      // Copy buffer data to new locations, this needs to happen backwards to do in-place\n      let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n      let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n      if (destCol === 0) {\n        destLineIndex--;\n        destCol = destLineLengths[destLineIndex];\n      }\n      let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n      let srcCol = lastLineLength;\n      while (srcLineIndex >= 0) {\n        const cellsToCopy = Math.min(srcCol, destCol);\n        if (wrappedLines[destLineIndex] === undefined) {\n          // Sanity check that the line exists, this has been known to fail for an unknown reason\n          // which would stop the reflow from happening if an exception would throw.\n          break;\n        }\n        wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n        destCol -= cellsToCopy;\n        if (destCol === 0) {\n          destLineIndex--;\n          destCol = destLineLengths[destLineIndex];\n        }\n        srcCol -= cellsToCopy;\n        if (srcCol === 0) {\n          srcLineIndex--;\n          const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n          srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n        }\n      }\n\n      // Null out the end of the line ends if a wide character wrapped to the following line\n      for (let i = 0; i < wrappedLines.length; i++) {\n        if (destLineLengths[i] < newCols) {\n          wrappedLines[i].setCell(destLineLengths[i], nullCell);\n        }\n      }\n\n      // Adjust viewport as needed\n      let viewportAdjustments = linesToAdd - trimmedLines;\n      while (viewportAdjustments-- > 0) {\n        if (this.ybase === 0) {\n          if (this.y < newRows - 1) {\n            this.y++;\n            this.lines.pop();\n          } else {\n            this.ybase++;\n            this.ydisp++;\n          }\n        } else {\n          // Ensure ybase does not exceed its maximum value\n          if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n            if (this.ybase === this.ydisp) {\n              this.ydisp++;\n            }\n            this.ybase++;\n          }\n        }\n      }\n      this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n    }\n\n    // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n    // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n    // costly calls to CircularList.splice.\n    if (toInsert.length > 0) {\n      // Record buffer insert events and then play them back backwards so that the indexes are\n      // correct\n      const insertEvents: IInsertEvent[] = [];\n\n      // Record original lines so they don't get overridden when we rearrange the list\n      const originalLines: BufferLine[] = [];\n      for (let i = 0; i < this.lines.length; i++) {\n        originalLines.push(this.lines.get(i) as BufferLine);\n      }\n      const originalLinesLength = this.lines.length;\n\n      let originalLineIndex = originalLinesLength - 1;\n      let nextToInsertIndex = 0;\n      let nextToInsert = toInsert[nextToInsertIndex];\n      this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n      let countInsertedSoFar = 0;\n      for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n        if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n          // Insert extra lines here, adjusting i as needed\n          for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n            this.lines.set(i--, nextToInsert.newLines[nextI]);\n          }\n          i++;\n\n          // Create insert events for later\n          insertEvents.push({\n            index: originalLineIndex + 1,\n            amount: nextToInsert.newLines.length\n          });\n\n          countInsertedSoFar += nextToInsert.newLines.length;\n          nextToInsert = toInsert[++nextToInsertIndex];\n        } else {\n          this.lines.set(i, originalLines[originalLineIndex--]);\n        }\n      }\n\n      // Update markers\n      let insertCountEmitted = 0;\n      for (let i = insertEvents.length - 1; i >= 0; i--) {\n        insertEvents[i].index += insertCountEmitted;\n        this.lines.onInsertEmitter.fire(insertEvents[i]);\n        insertCountEmitted += insertEvents[i].amount;\n      }\n      const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n      if (amountToTrim > 0) {\n        this.lines.onTrimEmitter.fire(amountToTrim);\n      }\n    }\n  }\n\n  /**\n   * Translates a buffer line to a string, with optional start and end columns.\n   * Wide characters will count as two columns in the resulting string. This\n   * function is useful for getting the actual text underneath the raw selection\n   * position.\n   * @param lineIndex The absolute index of the line being translated.\n   * @param trimRight Whether to trim whitespace to the right.\n   * @param startCol The column to start at.\n   * @param endCol The column to end at.\n   */\n  public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n    const line = this.lines.get(lineIndex);\n    if (!line) {\n      return '';\n    }\n    return line.translateToString(trimRight, startCol, endCol);\n  }\n\n  public getWrappedRangeForLine(y: number): { first: number, last: number } {\n    let first = y;\n    let last = y;\n    // Scan upwards for wrapped lines\n    while (first > 0 && this.lines.get(first)!.isWrapped) {\n      first--;\n    }\n    // Scan downwards for wrapped lines\n    while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n      last++;\n    }\n    return { first, last };\n  }\n\n  /**\n   * Setup the tab stops.\n   * @param i The index to start setting up tab stops from.\n   */\n  public setupTabStops(i?: number): void {\n    if (i !== null && i !== undefined) {\n      if (!this.tabs[i]) {\n        i = this.prevStop(i);\n      }\n    } else {\n      this.tabs = {};\n      i = 0;\n    }\n\n    for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n      this.tabs[i] = true;\n    }\n  }\n\n  /**\n   * Move the cursor to the previous tab stop from the given position (default is current).\n   * @param x The position to move the cursor to the previous tab stop.\n   */\n  public prevStop(x?: number): number {\n    x ??= this.x;\n    while (!this.tabs[--x] && x > 0);\n    return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n  }\n\n  /**\n   * Move the cursor one tab stop forward from the given position (default is current).\n   * @param x The position to move the cursor one tab stop forward.\n   */\n  public nextStop(x?: number): number {\n    x ??= this.x;\n    while (!this.tabs[++x] && x < this._cols);\n    return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n  }\n\n  /**\n   * Clears markers on single line.\n   * @param y The line to clear.\n   */\n  public clearMarkers(y: number): void {\n    this._isClearing = true;\n    for (let i = 0; i < this.markers.length; i++) {\n      if (this.markers[i].line === y) {\n        this.markers[i].dispose();\n        this.markers.splice(i--, 1);\n      }\n    }\n    this._isClearing = false;\n  }\n\n  /**\n   * Clears markers on all lines\n   */\n  public clearAllMarkers(): void {\n    this._isClearing = true;\n    for (let i = 0; i < this.markers.length; i++) {\n      this.markers[i].dispose();\n    }\n    this.markers.length = 0;\n    this._isClearing = false;\n  }\n\n  public addMarker(y: number): Marker {\n    const marker = new Marker(y);\n    this.markers.push(marker);\n    marker.register(this.lines.onTrim(amount => {\n      marker.line -= amount;\n      // The marker should be disposed when the line is trimmed from the buffer\n      if (marker.line < 0) {\n        marker.dispose();\n      }\n    }));\n    marker.register(this.lines.onInsert(event => {\n      if (marker.line >= event.index) {\n        marker.line += event.amount;\n      }\n    }));\n    marker.register(this.lines.onDelete(event => {\n      // Delete the marker if it's within the range\n      if (marker.line >= event.index && marker.line < event.index + event.amount) {\n        marker.dispose();\n      }\n\n      // Shift the marker if it's after the deleted range\n      if (marker.line > event.index) {\n        marker.line -= event.amount;\n      }\n    }));\n    marker.register(marker.onDispose(() => this._removeMarker(marker)));\n    return marker;\n  }\n\n  private _removeMarker(marker: Marker): void {\n    if (!this._isClearing) {\n      this.markers.splice(this.markers.indexOf(marker), 1);\n    }\n  }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData } from 'common/Types';\nimport { Buffer } from 'common/buffer/Buffer';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IBufferService, ILogService, IOptionsService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n  private _normal!: Buffer;\n  private _alt!: Buffer;\n  private _activeBuffer!: Buffer;\n\n  private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n  public readonly onBufferActivate = this._onBufferActivate.event;\n\n  /**\n   * Create a new BufferSet for the given terminal.\n   */\n  constructor(\n    private readonly _optionsService: IOptionsService,\n    private readonly _bufferService: IBufferService,\n    private readonly _logService: ILogService\n  ) {\n    super();\n    this.reset();\n    this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n    this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n  }\n\n  public reset(): void {\n    this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n    this._normal.fillViewportRows();\n\n    // The alt buffer should never have scrollback.\n    // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n    this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n    this._activeBuffer = this._normal;\n    this._onBufferActivate.fire({\n      activeBuffer: this._normal,\n      inactiveBuffer: this._alt\n    });\n\n    this.setupTabStops();\n  }\n\n  /**\n   * Returns the alt Buffer of the BufferSet\n   */\n  public get alt(): Buffer {\n    return this._alt;\n  }\n\n  /**\n   * Returns the currently active Buffer of the BufferSet\n   */\n  public get active(): Buffer {\n    return this._activeBuffer;\n  }\n\n  /**\n   * Returns the normal Buffer of the BufferSet\n   */\n  public get normal(): Buffer {\n    return this._normal;\n  }\n\n  /**\n   * Sets the normal Buffer of the BufferSet as its currently active Buffer\n   */\n  public activateNormalBuffer(): void {\n    if (this._activeBuffer === this._normal) {\n      return;\n    }\n    this._normal.x = this._alt.x;\n    this._normal.y = this._alt.y;\n    // The alt buffer should always be cleared when we switch to the normal\n    // buffer. This frees up memory since the alt buffer should always be new\n    // when activated.\n    this._alt.clearAllMarkers();\n    this._alt.clear();\n    this._activeBuffer = this._normal;\n    this._onBufferActivate.fire({\n      activeBuffer: this._normal,\n      inactiveBuffer: this._alt\n    });\n  }\n\n  /**\n   * Sets the alt Buffer of the BufferSet as its currently active Buffer\n   */\n  public activateAltBuffer(fillAttr?: IAttributeData): void {\n    if (this._activeBuffer === this._alt) {\n      return;\n    }\n    // Since the alt buffer is always cleared when the normal buffer is\n    // activated, we want to fill it when switching to it.\n    this._alt.fillViewportRows(fillAttr);\n    this._alt.x = this._normal.x;\n    this._alt.y = this._normal.y;\n    this._activeBuffer = this._alt;\n    this._onBufferActivate.fire({\n      activeBuffer: this._alt,\n      inactiveBuffer: this._normal\n    });\n  }\n\n  /**\n   * Resizes both normal and alt buffers, adjusting their data accordingly.\n   * @param newCols The new number of columns.\n   * @param newRows The new number of rows.\n   */\n  public resize(newCols: number, newRows: number): void {\n    this._normal.resize(newCols, newRows);\n    this._alt.resize(newCols, newRows);\n    this.setupTabStops(newCols);\n  }\n\n  /**\n   * Setup the tab stops.\n   * @param i The index to start setting up tab stops from.\n   */\n  public setupTabStops(i?: number): void {\n    this._normal.setupTabStops(i);\n    this._alt.setupTabStops(i);\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData, IBufferLine } from 'common/Types';\nimport { BufferSet } from 'common/buffer/BufferSet';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\nexport const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars\nexport const MINIMUM_ROWS = 1;\n\nexport class BufferService extends Disposable implements IBufferService {\n  public serviceBrand: any;\n\n  public cols: number;\n  public rows: number;\n  public buffers: IBufferSet;\n  /** Whether the user is scrolling (locks the scroll position) */\n  public isUserScrolling: boolean = false;\n\n  private readonly _onResize = this._register(new Emitter<IBufferResizeEvent>());\n  public readonly onResize = this._onResize.event;\n  private readonly _onScroll = this._register(new Emitter<number>());\n  public readonly onScroll = this._onScroll.event;\n\n  public get buffer(): IBuffer { return this.buffers.active; }\n\n  /** An IBufferline to clone/copy from for new blank lines */\n  private _cachedBlankLine: IBufferLine | undefined;\n\n  constructor(\n    @IOptionsService optionsService: IOptionsService,\n    @ILogService logService: ILogService\n  ) {\n    super();\n    this.cols = Math.max(optionsService.rawOptions.cols || 0, MINIMUM_COLS);\n    this.rows = Math.max(optionsService.rawOptions.rows || 0, MINIMUM_ROWS);\n    this.buffers = this._register(new BufferSet(optionsService, this, logService));\n    this._register(this.buffers.onBufferActivate(e => {\n      this._onScroll.fire(e.activeBuffer.ydisp);\n    }));\n  }\n\n  public resize(cols: number, rows: number): void {\n    const colsChanged = this.cols !== cols;\n    const rowsChanged = this.rows !== rows;\n    this.cols = cols;\n    this.rows = rows;\n    this.buffers.resize(cols, rows);\n    this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n  }\n\n  public reset(): void {\n    this.buffers.reset();\n    this.isUserScrolling = false;\n  }\n\n  /**\n   * Scroll the terminal down 1 row, creating a blank line.\n   * @param eraseAttr The attribute data to use the for blank line.\n   * @param isWrapped Whether the new line is wrapped from the previous line.\n   */\n  public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n    const buffer = this.buffer;\n\n    let newLine: IBufferLine | undefined;\n    newLine = this._cachedBlankLine;\n    if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n      newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n      this._cachedBlankLine = newLine;\n    }\n    newLine.isWrapped = isWrapped;\n\n    const topRow = buffer.ybase + buffer.scrollTop;\n    const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n    if (buffer.scrollTop === 0) {\n      // Determine whether the buffer is going to be trimmed after insertion.\n      const willBufferBeTrimmed = buffer.lines.isFull;\n\n      // Insert the line using the fastest method\n      if (bottomRow === buffer.lines.length - 1) {\n        if (willBufferBeTrimmed) {\n          buffer.lines.recycle().copyFrom(newLine);\n        } else {\n          buffer.lines.push(newLine.clone());\n        }\n      } else {\n        buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n      }\n\n      // Only adjust ybase and ydisp when the buffer is not trimmed\n      if (!willBufferBeTrimmed) {\n        buffer.ybase++;\n        // Only scroll the ydisp with ybase if the user has not scrolled up\n        if (!this.isUserScrolling) {\n          buffer.ydisp++;\n        }\n      } else {\n        // When the buffer is full and the user has scrolled up, keep the text\n        // stable unless ydisp is right at the top\n        if (this.isUserScrolling) {\n          buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n        }\n      }\n    } else {\n      // scrollTop is non-zero which means no line will be going to the\n      // scrollback, instead we can just shift them in-place.\n      const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n      buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n      buffer.lines.set(bottomRow, newLine.clone());\n    }\n\n    // Move the viewport to the bottom of the buffer unless the user is\n    // scrolling.\n    if (!this.isUserScrolling) {\n      buffer.ydisp = buffer.ybase;\n    }\n\n    this._onScroll.fire(buffer.ydisp);\n  }\n\n  /**\n   * Scroll the display of the terminal\n   * @param disp The number of lines to scroll down (negative scroll up).\n   * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n   * to avoid unwanted events being handled by the viewport when the event was triggered from the\n   * viewport originally.\n   */\n  public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n    const buffer = this.buffer;\n    if (disp < 0) {\n      if (buffer.ydisp === 0) {\n        return;\n      }\n      this.isUserScrolling = true;\n    } else if (disp + buffer.ydisp >= buffer.ybase) {\n      this.isUserScrolling = false;\n    }\n\n    const oldYdisp = buffer.ydisp;\n    buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n    // No change occurred, don't trigger scroll/refresh\n    if (oldYdisp === buffer.ydisp) {\n      return;\n    }\n\n    if (!suppressScrollEvent) {\n      this._onScroll.fire(buffer.ydisp);\n    }\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { isMac } from 'common/Platform';\nimport { CursorStyle, IDisposable } from 'common/Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\nexport const DEFAULT_OPTIONS: Readonly<Required<ITerminalOptions>> = {\n  cols: 80,\n  rows: 24,\n  showCursorImmediately: false,\n  cursorBlink: false,\n  blinkIntervalDuration: 0,\n  cursorStyle: 'block',\n  cursorWidth: 1,\n  cursorInactiveStyle: 'outline',\n  drawBoldTextInBrightColors: true,\n  documentOverride: null,\n  fastScrollSensitivity: 5,\n  fontFamily: 'monospace',\n  fontSize: 15,\n  fontWeight: 'normal',\n  fontWeightBold: 'bold',\n  ignoreBracketedPasteMode: false,\n  lineHeight: 1.0,\n  letterSpacing: 0,\n  linkHandler: null,\n  logLevel: 'info',\n  logger: null,\n  scrollback: 1000,\n  scrollbar: { showScrollbar: true },\n  scrollOnEraseInDisplay: false,\n  scrollOnUserInput: true,\n  scrollSensitivity: 1,\n  screenReaderMode: false,\n  smoothScrollDuration: 0,\n  macOptionIsMeta: false,\n  macOptionClickForcesSelection: false,\n  minimumContrastRatio: 1,\n  disableStdin: false,\n  allowProposedApi: false,\n  allowTransparency: false,\n  tabStopWidth: 8,\n  theme: {},\n  reflowCursorLine: false,\n  rescaleOverlappingGlyphs: false,\n  rightClickSelectsWord: isMac,\n  windowOptions: {},\n  windowsPty: {},\n  wordSeparator: ' ()[]{}\\',\"`',\n  altClickMovesCursor: true,\n  convertEol: false,\n  termName: 'xterm',\n  quirks: {},\n  vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract<FontWeight, string>[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n  public serviceBrand: any;\n\n  public readonly rawOptions: Required<ITerminalOptions>;\n  public options: Required<ITerminalOptions>;\n\n  private readonly _onOptionChange = this._register(new Emitter<keyof ITerminalOptions>());\n  public readonly onOptionChange = this._onOptionChange.event;\n\n  constructor(options: Partial<ITerminalOptions>) {\n    super();\n    // set the default value of each option\n    const defaultOptions = { ...DEFAULT_OPTIONS };\n    for (const key in options) {\n      if (key in defaultOptions) {\n        try {\n          const newValue = options[key];\n          defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n        } catch (e) {\n          console.error(e);\n        }\n      }\n    }\n\n    // set up getters and setters for each option\n    this.rawOptions = defaultOptions;\n    this.options = { ... defaultOptions };\n    this._setupOptions();\n\n    // Clear out options that could link outside xterm.js as they could easily cause an embedder\n    // memory leak\n    this._register(toDisposable(() => {\n      this.rawOptions.linkHandler = null;\n      this.rawOptions.documentOverride = null;\n    }));\n  }\n\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  public onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n    return this.onOptionChange(eventKey => {\n      if (eventKey === key) {\n        listener(this.rawOptions[key]);\n      }\n    });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n    return this.onOptionChange(eventKey => {\n      if (keys.indexOf(eventKey) !== -1) {\n        listener();\n      }\n    });\n  }\n\n  private _setupOptions(): void {\n    const getter = (propName: string): any => {\n      if (!(propName in DEFAULT_OPTIONS)) {\n        throw new Error(`No option with key \"${propName}\"`);\n      }\n      return this.rawOptions[propName];\n    };\n\n    const setter = (propName: string, value: any): void => {\n      if (!(propName in DEFAULT_OPTIONS)) {\n        throw new Error(`No option with key \"${propName}\"`);\n      }\n\n      value = this._sanitizeAndValidateOption(propName, value);\n      // Don't fire an option change event if they didn't change\n      if (this.rawOptions[propName] !== value) {\n        this.rawOptions[propName] = value;\n        this._onOptionChange.fire(propName);\n      }\n    };\n\n    for (const propName in this.rawOptions) {\n      const desc = {\n        get: getter.bind(this, propName),\n        set: setter.bind(this, propName)\n      };\n      Object.defineProperty(this.options, propName, desc);\n    }\n  }\n\n  private _sanitizeAndValidateOption(key: string, value: any): any {\n    switch (key) {\n      case 'cursorStyle':\n        if (!value) {\n          value = DEFAULT_OPTIONS[key];\n        }\n        if (!isCursorStyle(value)) {\n          throw new Error(`\"${value}\" is not a valid value for ${key}`);\n        }\n        break;\n      case 'wordSeparator':\n        if (!value) {\n          value = DEFAULT_OPTIONS[key];\n        }\n        break;\n      case 'fontWeight':\n      case 'fontWeightBold':\n        if (typeof value === 'number' && 1 <= value && value <= 1000) {\n          // already valid numeric value\n          break;\n        }\n        value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n        break;\n      case 'blinkIntervalDuration':\n        value = Math.floor(value);\n        if (value < 0) {\n          throw new Error(`${key} cannot be less than 0, value: ${value}`);\n        }\n        break;\n      case 'cursorWidth':\n        value = Math.floor(value);\n        // Fall through for bounds check\n      case 'lineHeight':\n      case 'tabStopWidth':\n        if (value < 1) {\n          throw new Error(`${key} cannot be less than 1, value: ${value}`);\n        }\n        break;\n      case 'minimumContrastRatio':\n        value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n        break;\n      case 'scrollback':\n        value = Math.min(value, 4294967295);\n        if (value < 0) {\n          throw new Error(`${key} cannot be less than 0, value: ${value}`);\n        }\n        break;\n      case 'fastScrollSensitivity':\n      case 'scrollSensitivity':\n        if (value <= 0) {\n          throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n        }\n        break;\n      case 'rows':\n      case 'cols':\n        if (!value && value !== 0) {\n          throw new Error(`${key} must be numeric, value: ${value}`);\n        }\n        break;\n      case 'windowsPty':\n        value = value ?? {};\n        break;\n    }\n    return value;\n  }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n  return value === 'block' || value === 'underline' || value === 'bar';\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/*\n * A simple utility for cloning values\n */\nexport function clone<T>(val: T, depth: number = 5): T {\n  if (typeof val !== 'object') {\n    return val;\n  }\n\n  // If we're cloning an array, use an array as the base, otherwise use an object\n  const clonedObject: any = Array.isArray(val) ? [] : {};\n\n  for (const key in val) {\n    // Recursively clone eack item unless we're at the maximum depth\n    clonedObject[key] = depth <= 1 ? val[key] : (val[key] && clone(val[key], depth - 1));\n  }\n\n  return clonedObject as T;\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { clone } from 'common/Clone';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from 'common/Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n  insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n  applicationCursorKeys: false,\n  applicationKeypad: false,\n  bracketedPasteMode: false,\n  colorSchemeUpdates: false,\n  cursorBlink: undefined,\n  cursorStyle: undefined,\n  origin: false,\n  reverseWraparound: false,\n  sendFocus: false,\n  synchronizedOutput: false,\n  win32InputMode: false,\n  wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n  flags: 0,\n  mainFlags: 0,\n  altFlags: 0,\n  mainStack: [],\n  altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n  public serviceBrand: any;\n\n  public isCursorInitialized: boolean;\n  public isCursorHidden: boolean = false;\n  public modes: IModes;\n  public decPrivateModes: IDecPrivateModes;\n  public kittyKeyboard: IKittyKeyboardState;\n\n  private readonly _onData = this._register(new Emitter<string>());\n  public readonly onData = this._onData.event;\n  private readonly _onUserInput = this._register(new Emitter<void>());\n  public readonly onUserInput = this._onUserInput.event;\n  private readonly _onBinary = this._register(new Emitter<string>());\n  public readonly onBinary = this._onBinary.event;\n  private readonly _onRequestScrollToBottom = this._register(new Emitter<void>());\n  public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ILogService private readonly _logService: ILogService,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n    this.modes = clone(DEFAULT_MODES);\n    this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n    this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n  }\n\n  public reset(): void {\n    this.modes = clone(DEFAULT_MODES);\n    this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n    this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n  }\n\n  public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n    // Prevents all events to pty process if stdin is disabled\n    if (this._optionsService.rawOptions.disableStdin) {\n      return;\n    }\n\n    // Input is being sent to the terminal, the terminal should focus the prompt.\n    const buffer = this._bufferService.buffer;\n    if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n      this._onRequestScrollToBottom.fire();\n    }\n\n    // Fire onUserInput so listeners can react as well (eg. clear selection)\n    if (wasUserInput) {\n      this._onUserInput.fire();\n    }\n\n    // Fire onData API\n    this._logService.debug(`sending data \"${data}\"`);\n    this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n    this._onData.fire(data);\n  }\n\n  public triggerBinaryEvent(data: string): void {\n    if (this._optionsService.rawOptions.disableStdin) {\n      return;\n    }\n    this._logService.debug(`sending binary \"${data}\"`);\n    this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n    this._onBinary.fire(data);\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from 'common/services/Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';\nimport { Disposable } from 'common/Lifecycle';\nimport { Emitter } from 'common/Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n  /**\n   * NONE\n   * Events: none\n   * Modifiers: none\n   */\n  NONE: {\n    events: CoreMouseEventType.NONE,\n    restrict: () => false\n  },\n  /**\n   * X10\n   * Events: mousedown\n   * Modifiers: none\n   */\n  X10: {\n    events: CoreMouseEventType.DOWN,\n    restrict: (e: ICoreMouseEvent) => {\n      // no wheel, no move, no up\n      if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n        return false;\n      }\n      // no modifiers\n      e.ctrl = false;\n      e.alt = false;\n      e.shift = false;\n      return true;\n    }\n  },\n  /**\n   * VT200\n   * Events: mousedown / mouseup / wheel\n   * Modifiers: all\n   */\n  VT200: {\n    events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n    restrict: (e: ICoreMouseEvent) => {\n      // no move\n      if (e.action === CoreMouseAction.MOVE) {\n        return false;\n      }\n      return true;\n    }\n  },\n  /**\n   * DRAG\n   * Events: mousedown / mouseup / wheel / mousedrag\n   * Modifiers: all\n   */\n  DRAG: {\n    events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n    restrict: (e: ICoreMouseEvent) => {\n      // no move without button\n      if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n        return false;\n      }\n      return true;\n    }\n  },\n  /**\n   * ANY\n   * Events: all mouse related events\n   * Modifiers: all\n   */\n  ANY: {\n    events:\n      CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n      | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n    restrict: (e: ICoreMouseEvent) => true\n  }\n};\n\nconst enum Modifiers {\n  SHIFT = 4,\n  ALT = 8,\n  CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n  let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n  if (e.button === CoreMouseButton.WHEEL) {\n    code |= 64;\n    code |= e.action;\n  } else {\n    code |= e.button & 3;\n    if (e.button & 4) {\n      code |= 64;\n    }\n    if (e.button & 8) {\n      code |= 128;\n    }\n    if (e.action === CoreMouseAction.MOVE) {\n      code |= CoreMouseAction.MOVE;\n    } else if (e.action === CoreMouseAction.UP && !isSGR) {\n      // special case - only SGR can report button on release\n      // all others have to go with NONE\n      code |= CoreMouseButton.NONE;\n    }\n  }\n  return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n  /**\n   * DEFAULT - CSI M Pb Px Py\n   * Single byte encoding for coords and event code.\n   * Can encode values up to 223 (1-based).\n   */\n  DEFAULT: (e: ICoreMouseEvent) => {\n    const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n    // supress mouse report if we exceed addressible range\n    // Note this is handled differently by emulators\n    // - xterm:         sends 0;0 coords instead\n    // - vte, konsole:  no report\n    if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n      return '';\n    }\n    return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n  },\n  /**\n   * SGR - CSI < Pb ; Px ; Py M|m\n   * No encoding limitation.\n   * Can report button on release and works with a well formed sequence.\n   */\n  SGR: (e: ICoreMouseEvent) => {\n    const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n    return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n  },\n  SGR_PIXELS: (e: ICoreMouseEvent) => {\n    const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n    return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n  }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n *  - protocols: NONE (default), X10, VT200, DRAG, ANY\n *  - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n  public serviceBrand: any;\n\n  private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n  private _encodings: { [name: string]: CoreMouseEncoding } = {};\n  private _activeProtocol: string = '';\n  private _activeEncoding: string = '';\n  private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n  private readonly _onProtocolChange = this._register(new Emitter<CoreMouseEventType>());\n  public readonly onProtocolChange = this._onProtocolChange.event;\n\n  constructor() {\n    super();\n\n    // register default protocols and encodings\n    for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n    for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n    // call reset to set defaults\n    this.reset();\n  }\n\n  public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n    this._protocols[name] = protocol;\n  }\n\n  public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n    this._encodings[name] = encoding;\n  }\n\n  public get activeProtocol(): string {\n    return this._activeProtocol;\n  }\n\n  public get areMouseEventsActive(): boolean {\n    return this._protocols[this._activeProtocol].events !== 0;\n  }\n\n  public set activeProtocol(name: string) {\n    if (!this._protocols[name]) {\n      throw new Error(`unknown protocol \"${name}\"`);\n    }\n    this._activeProtocol = name;\n    this._onProtocolChange.fire(this._protocols[name].events);\n  }\n\n  public get activeEncoding(): string {\n    return this._activeEncoding;\n  }\n\n  public set activeEncoding(name: string) {\n    if (!this._encodings[name]) {\n      throw new Error(`unknown encoding \"${name}\"`);\n    }\n    this._activeEncoding = name;\n  }\n\n  public reset(): void {\n    this.activeProtocol = 'NONE';\n    this.activeEncoding = 'DEFAULT';\n  }\n\n  public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n    this._customWheelEventHandler = customWheelEventHandler;\n  }\n\n  public allowCustomWheelEvent(ev: WheelEvent): boolean {\n    return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n  }\n\n  public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n    return this._protocols[this._activeProtocol].restrict(e);\n  }\n\n  public encodeMouseEvent(e: ICoreMouseEvent): string {\n    return this._encodings[this._activeEncoding](e);\n  }\n\n  public get isDefaultEncoding(): boolean {\n    return this._activeEncoding === 'DEFAULT';\n  }\n\n  public get isPixelEncoding(): boolean {\n    return this._activeEncoding === 'SGR_PIXELS';\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from 'common/services/Services';\nimport { UnicodeService } from 'common/services/UnicodeService';\n\nconst BMP_COMBINING = [\n  [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n  [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n  [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n  [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n  [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n  [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n  [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n  [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n  [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n  [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n  [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n  [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n  [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n  [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n  [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n  [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n  [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n  [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n  [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n  [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n  [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n  [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n  [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n  [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n  [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n  [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n  [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n  [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n  [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n  [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n  [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n  [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n  [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n  [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n  [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n  [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n  [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n  [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n  [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n  [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n  [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n  [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n  [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n  [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n  [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n  [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n  [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n  [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n  let min = 0;\n  let max = data.length - 1;\n  let mid;\n  if (ucs < data[0][0] || ucs > data[max][1]) {\n    return false;\n  }\n  while (max >= min) {\n    mid = (min + max) >> 1;\n    if (ucs > data[mid][1]) {\n      min = mid + 1;\n    } else if (ucs < data[mid][0]) {\n      max = mid - 1;\n    } else {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n  public readonly version = '6';\n\n  constructor() {\n    // init lookup table once\n    if (!table) {\n      table = new Uint8Array(65536);\n      table.fill(1);\n      table[0] = 0;\n      // control chars\n      table.fill(0, 1, 32);\n      table.fill(0, 0x7f, 0xa0);\n\n      // apply wide char rules first\n      // wide chars\n      table.fill(2, 0x1100, 0x1160);\n      table[0x2329] = 2;\n      table[0x232a] = 2;\n      table.fill(2, 0x2e80, 0xa4d0);\n      table[0x303f] = 1;  // wrongly in last line\n\n      table.fill(2, 0xac00, 0xd7a4);\n      table.fill(2, 0xf900, 0xfb00);\n      table.fill(2, 0xfe10, 0xfe1a);\n      table.fill(2, 0xfe30, 0xfe70);\n      table.fill(2, 0xff00, 0xff61);\n      table.fill(2, 0xffe0, 0xffe7);\n\n      // apply combining last to ensure we overwrite\n      // wrongly wide set chars:\n      //    the original algo evals combining first and falls\n      //    through to wide check so we simply do here the opposite\n      // combining 0\n      for (let r = 0; r < BMP_COMBINING.length; ++r) {\n        table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n      }\n    }\n  }\n\n  public wcwidth(num: number): UnicodeCharWidth {\n    if (num < 32) return 0;\n    if (num < 127) return 1;\n    if (num < 65536) return table[num] as UnicodeCharWidth;\n    if (bisearch(num, HIGH_COMBINING)) return 0;\n    if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n    return 1;\n  }\n\n  public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n    let width = this.wcwidth(codepoint);\n    let shouldJoin = width === 0 && preceding !== 0;\n    if (shouldJoin) {\n      const oldWidth = UnicodeService.extractWidth(preceding);\n      if (oldWidth === 0) {\n        shouldJoin = false;\n      } else if (oldWidth > width) {\n        width = oldWidth;\n      }\n    }\n    return UnicodeService.createPropertyValue(0, width, shouldJoin);\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { UnicodeV6 } from 'common/input/UnicodeV6';\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\nexport class UnicodeService implements IUnicodeService {\n  public serviceBrand: any;\n\n  private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n  private _active: string = '';\n  private _activeProvider: IUnicodeVersionProvider;\n\n  private readonly _onChange = new Emitter<string>();\n  public readonly onChange = this._onChange.event;\n\n  public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n    return (value & 1) !== 0;\n  }\n  public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n    return ((value >> 1) & 0x3) as UnicodeCharWidth;\n  }\n  public static extractCharKind(value: UnicodeCharProperties): number {\n    return value >> 3;\n  }\n  public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n    return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n  }\n\n  constructor() {\n    const defaultProvider = new UnicodeV6();\n    this.register(defaultProvider);\n    this._active = defaultProvider.version;\n    this._activeProvider = defaultProvider;\n  }\n\n  public dispose(): void {\n    this._onChange.dispose();\n  }\n\n  public get versions(): string[] {\n    return Object.keys(this._providers);\n  }\n\n  public get activeVersion(): string {\n    return this._active;\n  }\n\n  public set activeVersion(version: string) {\n    if (!this._providers[version]) {\n      throw new Error(`unknown Unicode version \"${version}\"`);\n    }\n    this._active = version;\n    this._activeProvider = this._providers[version];\n    this._onChange.fire(version);\n  }\n\n  public register(provider: IUnicodeVersionProvider): void {\n    this._providers[provider.version] = provider;\n  }\n\n  /**\n   * Unicode version dependent interface.\n   */\n  public wcwidth(num: number): UnicodeCharWidth {\n    return this._activeProvider.wcwidth(num);\n  }\n\n  public getStringCellWidth(s: string): number {\n    let result = 0;\n    let precedingInfo = 0;\n    const length = s.length;\n    for (let i = 0; i < length; ++i) {\n      let code = s.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          // this should not happen with strings retrieved from\n          // Buffer.translateToString as it converts from UTF-32\n          // and therefore always should contain the second part\n          // for any other string we still have to handle it somehow:\n          // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n          return result + this.wcwidth(code);\n        }\n        const second = s.charCodeAt(i);\n        // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n        // otherwise treat them independently (UCS-2 behavior)\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          result += this.wcwidth(second);\n        }\n      }\n      const currentInfo = this.charProperties(code, precedingInfo);\n      let chWidth = UnicodeService.extractWidth(currentInfo);\n      if (UnicodeService.extractShouldJoin(currentInfo)) {\n        chWidth -= UnicodeService.extractWidth(precedingInfo);\n      }\n      result += chWidth;\n      precedingInfo = currentInfo;\n    }\n    return result;\n  }\n\n  public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n    return this._activeProvider.charProperties(codepoint, preceding);\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from 'common/services/Services';\nimport { ICharset } from 'common/Types';\n\nexport class CharsetService implements ICharsetService {\n  public serviceBrand: any;\n\n  public charset: ICharset | undefined;\n  public glevel: number = 0;\n\n  private _charsets: (ICharset | undefined)[] = [];\n\n  public get charsets(): (ICharset | undefined)[] {\n    return this._charsets;\n  }\n\n  public reset(): void {\n    this.charset = undefined;\n    this._charsets = [];\n    this.glevel = 0;\n  }\n\n  public setgLevel(g: number): void {\n    this.glevel = g;\n    this.charset = this._charsets[g];\n  }\n\n  public setgCharset(g: number, charset: ICharset | undefined): void {\n    this._charsets[g] = charset;\n    if (this.glevel === g) {\n      this.charset = charset;\n    }\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\nimport { IBufferService } from 'common/services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n  // Winpty does not support wraparound mode which means that lines will never\n  // be marked as wrapped. This causes issues for things like copying a line\n  // retaining the wrapped new line characters or if consumers are listening\n  // in on the data stream.\n  //\n  // The workaround for this is to listen to every incoming line feed and mark\n  // the line as wrapped if the last character in the previous line is not a\n  // space. This is certainly not without its problems, but generally on\n  // Windows when text reaches the end of the terminal it's likely going to be\n  // wrapped.\n  const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n  const lastChar = line?.get(bufferService.cols - 1);\n\n  const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n  if (nextLine && lastChar) {\n    nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from 'common/parser/Types';\n\n// max value supported for a single param/subparam (clamped to positive int32 range)\nconst MAX_VALUE = 0x7FFFFFFF;\n// max allowed subparams for a single sequence (hardcoded limitation)\nconst MAX_SUBPARAMS = 256;\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n *  - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n *  - never read beyond `params.length - 1` (likely to contain arbitrary data)\n *  - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n *  - hardcoded limitations:\n *    - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n *    - max. 256 sub params possible\n *    - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n  // params store and length\n  public params: Int32Array;\n  public length: number;\n\n  // sub params store and length\n  protected _subParams: Int32Array;\n  protected _subParamsLength: number;\n\n  // sub params offsets from param: param idx --> [start, end] offset\n  private _subParamsIdx: Uint16Array;\n  private _rejectDigits: boolean;\n  private _rejectSubDigits: boolean;\n  private _digitIsSub: boolean;\n\n  /**\n   * Create a `Params` type from JS array representation.\n   */\n  public static fromArray(values: ParamsArray): Params {\n    const params = new Params();\n    if (!values.length) {\n      return params;\n    }\n    // skip leading sub params\n    for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n      const value = values[i];\n      if (Array.isArray(value)) {\n        for (let k = 0; k < value.length; ++k) {\n          params.addSubParam(value[k]);\n        }\n      } else {\n        params.addParam(value);\n      }\n    }\n    return params;\n  }\n\n  /**\n   * @param maxLength max length of storable parameters\n   * @param maxSubParamsLength max length of storable sub parameters\n   */\n  constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n    if (maxSubParamsLength > MAX_SUBPARAMS) {\n      throw new Error('maxSubParamsLength must not be greater than 256');\n    }\n    this.params = new Int32Array(maxLength);\n    this.length = 0;\n    this._subParams = new Int32Array(maxSubParamsLength);\n    this._subParamsLength = 0;\n    this._subParamsIdx = new Uint16Array(maxLength);\n    this._rejectDigits = false;\n    this._rejectSubDigits = false;\n    this._digitIsSub = false;\n  }\n\n  /**\n   * Clone object.\n   */\n  public clone(): Params {\n    const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n    newParams.params.set(this.params);\n    newParams.length = this.length;\n    newParams._subParams.set(this._subParams);\n    newParams._subParamsLength = this._subParamsLength;\n    newParams._subParamsIdx.set(this._subParamsIdx);\n    newParams._rejectDigits = this._rejectDigits;\n    newParams._rejectSubDigits = this._rejectSubDigits;\n    newParams._digitIsSub = this._digitIsSub;\n    return newParams;\n  }\n\n  /**\n   * Get a JS array representation of the current parameters and sub parameters.\n   * The array is structured as follows:\n   *    sequence: \"1;2:3:4;5::6\"\n   *    array   : [1, 2, [3, 4], 5, [-1, 6]]\n   */\n  public toArray(): ParamsArray {\n    const res: ParamsArray = [];\n    for (let i = 0; i < this.length; ++i) {\n      res.push(this.params[i]);\n      const start = this._subParamsIdx[i] >> 8;\n      const end = this._subParamsIdx[i] & 0xFF;\n      if (end - start > 0) {\n        res.push(Array.prototype.slice.call(this._subParams, start, end));\n      }\n    }\n    return res;\n  }\n\n  /**\n   * Reset to initial empty state.\n   */\n  public reset(): void {\n    this.length = 0;\n    this._subParamsLength = 0;\n    this._rejectDigits = false;\n    this._rejectSubDigits = false;\n    this._digitIsSub = false;\n  }\n\n  /**\n   * Add a parameter value.\n   * `Params` only stores up to `maxLength` parameters, any later\n   * parameter will be ignored.\n   * Note: VT devices only stored up to 16 values, xterm seems to\n   * store up to 30.\n   */\n  public addParam(value: number): void {\n    this._digitIsSub = false;\n    if (this.length >= this.maxLength) {\n      this._rejectDigits = true;\n      return;\n    }\n    if (value < -1) {\n      throw new Error('values lesser than -1 are not allowed');\n    }\n    this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n    this.params[this.length++] = value > MAX_VALUE ? MAX_VALUE : value;\n  }\n\n  /**\n   * Add a sub parameter value.\n   * The sub parameter is automatically associated with the last parameter value.\n   * Thus it is not possible to add a subparameter without any parameter added yet.\n   * `Params` only stores up to `subParamsLength` sub parameters, any later\n   * sub parameter will be ignored.\n   */\n  public addSubParam(value: number): void {\n    this._digitIsSub = true;\n    if (!this.length) {\n      return;\n    }\n    if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n      this._rejectSubDigits = true;\n      return;\n    }\n    if (value < -1) {\n      throw new Error('values lesser than -1 are not allowed');\n    }\n    this._subParams[this._subParamsLength++] = value > MAX_VALUE ? MAX_VALUE : value;\n    this._subParamsIdx[this.length - 1]++;\n  }\n\n  /**\n   * Whether parameter at index `idx` has sub parameters.\n   */\n  public hasSubParams(idx: number): boolean {\n    return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n  }\n\n  /**\n   * Return sub parameters for parameter at index `idx`.\n   * Note: The values are borrowed, thus you need to copy\n   * the values if you need to hold them in nonlocal scope.\n   */\n  public getSubParams(idx: number): Int32Array | null {\n    const start = this._subParamsIdx[idx] >> 8;\n    const end = this._subParamsIdx[idx] & 0xFF;\n    if (end - start > 0) {\n      return this._subParams.subarray(start, end);\n    }\n    return null;\n  }\n\n  /**\n   * Return all sub parameters as {idx: subparams} mapping.\n   * Note: The values are not borrowed.\n   */\n  public getSubParamsAll(): {[idx: number]: Int32Array} {\n    const result: {[idx: number]: Int32Array} = {};\n    for (let i = 0; i < this.length; ++i) {\n      const start = this._subParamsIdx[i] >> 8;\n      const end = this._subParamsIdx[i] & 0xFF;\n      if (end - start > 0) {\n        result[i] = this._subParams.slice(start, end);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Add a single digit value to current parameter.\n   * This is used by the parser to account digits on a char by char basis.\n   */\n  public addDigit(value: number): void {\n    let length;\n    if (this._rejectDigits\n      || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n      || (this._digitIsSub && this._rejectSubDigits)\n    ) {\n      return;\n    }\n\n    const store = this._digitIsSub ? this._subParams : this.params;\n    const cur = store[length - 1];\n    store[length - 1] = ~cur ? Math.min(cur * 10 + value, MAX_VALUE) : value;\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';\nimport { OscState, ParserConstants } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n  private _state = OscState.START;\n  private _active = EMPTY_HANDLERS;\n  private _id = -1;\n  private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);\n  private _handlerFb: OscFallbackHandlerType = () => { };\n  private _stack: ISubParserStackState = {\n    paused: false,\n    loopPosition: 0,\n    fallThrough: false\n  };\n\n  public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n    this._handlers[ident] ??= [];\n    const handlerList = this._handlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearHandler(ident: number): void {\n    if (this._handlers[ident]) delete this._handlers[ident];\n  }\n  public setHandlerFallback(handler: OscFallbackHandlerType): void {\n    this._handlerFb = handler;\n  }\n\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => { };\n    this._active = EMPTY_HANDLERS;\n  }\n\n  public reset(): void {\n    // force cleanup handlers if payload was already sent\n    if (this._state === OscState.PAYLOAD) {\n      for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n        this._active[j].end(false);\n      }\n    }\n    this._stack.paused = false;\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = OscState.START;\n  }\n\n  private _start(): void {\n    this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'START');\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].start();\n      }\n    }\n  }\n\n  private _put(data: Uint32Array, start: number, end: number): void {\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].put(data, start, end);\n      }\n    }\n  }\n\n  public start(): void {\n    // always reset leftover handlers\n    this.reset();\n    this._state = OscState.ID;\n  }\n\n  /**\n   * Put data to current OSC command.\n   * Expects the identifier of the OSC command in the form\n   * OSC id ; payload ST/BEL\n   * Payload chunks are not further processed and get\n   * directly passed to the handlers.\n   */\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._state === OscState.ABORT) {\n      return;\n    }\n    if (this._state === OscState.ID) {\n      while (start < end) {\n        const code = data[start++];\n        if (code === 0x3b) {\n          this._state = OscState.PAYLOAD;\n          this._start();\n          break;\n        }\n        if (code < 0x30 || 0x39 < code) {\n          this._state = OscState.ABORT;\n          return;\n        }\n        if (this._id === -1) {\n          this._id = 0;\n        }\n        this._id = this._id * 10 + code - 48;\n      }\n    }\n    if (this._state === OscState.PAYLOAD && end - start > 0) {\n      this._put(data, start, end);\n    }\n  }\n\n  /**\n   * Indicates end of an OSC command.\n   * Whether the OSC got aborted or finished normally\n   * is indicated by `success`.\n   */\n  public end(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n    if (this._state === OscState.START) {\n      return;\n    }\n    // do nothing if command was faulty\n    if (this._state !== OscState.ABORT) {\n      // if we are still in ID state and get an early end\n      // means that the command has no payload thus we still have\n      // to announce START and send END right after\n      if (this._state === OscState.ID) {\n        this._start();\n      }\n\n      if (!this._active.length) {\n        this._handlerFb(this._id, 'END', success);\n      } else {\n        let handlerResult: boolean | Promise<boolean> = false;\n        let j = this._active.length - 1;\n        let fallThrough = false;\n        if (this._stack.paused) {\n          j = this._stack.loopPosition - 1;\n          handlerResult = promiseResult;\n          fallThrough = this._stack.fallThrough;\n          this._stack.paused = false;\n        }\n        if (!fallThrough && handlerResult === false) {\n          for (; j >= 0; j--) {\n            handlerResult = this._active[j].end(success);\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._stack.paused = true;\n              this._stack.loopPosition = j;\n              this._stack.fallThrough = false;\n              return handlerResult;\n            }\n          }\n          j--;\n        }\n        // cleanup left over handlers\n        // we always have to call .end for proper cleanup,\n        // here we use `success` to indicate whether a handler should execute\n        for (; j >= 0; j--) {\n          handlerResult = this._active[j].end(false);\n          if (handlerResult instanceof Promise) {\n            this._stack.paused = true;\n            this._stack.loopPosition = j;\n            this._stack.fallThrough = true;\n            return handlerResult;\n          }\n        }\n      }\n\n    }\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = OscState.START;\n  }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n  private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n  private _data = '';\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string) => boolean | Promise<boolean>) { }\n\n  public start(): void {\n    this._data = '';\n    this._hitLimit = false;\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._hitLimit) {\n      return;\n    }\n    this._data += utf32ToString(data, start, end);\n    if (this._data.length > OscHandler._payloadLimit) {\n      this._data = '';\n      this._hitLimit = true;\n    }\n  }\n\n  public end(success: boolean): boolean | Promise<boolean> {\n    let ret: boolean | Promise<boolean> = false;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data);\n      if (ret instanceof Promise) {\n        // need to hold data until `ret` got resolved\n        // dont care for errors, data will be freed anyway on next start\n        return ret.then(res => {\n          this._data = '';\n          this._hitLimit = false;\n          return res;\n        });\n      }\n    }\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { Params } from 'common/parser/Params';\nimport { ParserConstants } from 'common/parser/Constants';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n  private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);\n  private _active: IDcsHandler[] = EMPTY_HANDLERS;\n  private _ident: number = 0;\n  private _handlerFb: DcsFallbackHandlerType = () => { };\n  private _stack: ISubParserStackState = {\n    paused: false,\n    loopPosition: 0,\n    fallThrough: false\n  };\n\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => { };\n    this._active = EMPTY_HANDLERS;\n  }\n\n  public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n    this._handlers[ident] ??= [];\n    const handlerList = this._handlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n\n  public clearHandler(ident: number): void {\n    if (this._handlers[ident]) delete this._handlers[ident];\n  }\n\n  public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n    this._handlerFb = handler;\n  }\n\n  public reset(): void {\n    // force cleanup leftover handlers\n    if (this._active.length) {\n      for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n        this._active[j].unhook(false);\n      }\n    }\n    this._stack.paused = false;\n    this._active = EMPTY_HANDLERS;\n    this._ident = 0;\n  }\n\n  public hook(ident: number, params: IParams): void {\n    // always reset leftover handlers\n    this.reset();\n    this._ident = ident;\n    this._active = this._handlers[ident] || EMPTY_HANDLERS;\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'HOOK', params);\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].hook(params);\n      }\n    }\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].put(data, start, end);\n      }\n    }\n  }\n\n  public unhook(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'UNHOOK', success);\n    } else {\n      let handlerResult: boolean | Promise<boolean> = false;\n      let j = this._active.length - 1;\n      let fallThrough = false;\n      if (this._stack.paused) {\n        j = this._stack.loopPosition - 1;\n        handlerResult = promiseResult;\n        fallThrough = this._stack.fallThrough;\n        this._stack.paused = false;\n      }\n      if (!fallThrough && handlerResult === false) {\n        for (; j >= 0; j--) {\n          handlerResult = this._active[j].unhook(success);\n          if (handlerResult === true) {\n            break;\n          } else if (handlerResult instanceof Promise) {\n            this._stack.paused = true;\n            this._stack.loopPosition = j;\n            this._stack.fallThrough = false;\n            return handlerResult;\n          }\n        }\n        j--;\n      }\n      // cleanup left over handlers (fallThrough for async)\n      for (; j >= 0; j--) {\n        handlerResult = this._active[j].unhook(false);\n        if (handlerResult instanceof Promise) {\n          this._stack.paused = true;\n          this._stack.loopPosition = j;\n          this._stack.fallThrough = true;\n          return handlerResult;\n        }\n      }\n    }\n    this._active = EMPTY_HANDLERS;\n    this._ident = 0;\n  }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n  private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n  private _data = '';\n  private _params: IParams = EMPTY_PARAMS;\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string, params: IParams) => boolean | Promise<boolean>) { }\n\n  public hook(params: IParams): void {\n    // since we need to preserve params until `unhook`, we have to clone it\n    // (only borrowed from parser and spans multiple parser states)\n    // perf optimization:\n    // clone only, if we have non empty params, otherwise stick with default\n    this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n    this._data = '';\n    this._hitLimit = false;\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._hitLimit) {\n      return;\n    }\n    this._data += utf32ToString(data, start, end);\n    if (this._data.length > DcsHandler._payloadLimit) {\n      this._data = '';\n      this._hitLimit = true;\n    }\n  }\n\n  public unhook(success: boolean): boolean | Promise<boolean> {\n    let ret: boolean | Promise<boolean> = false;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data, this._params);\n      if (ret instanceof Promise) {\n        // need to hold data and params until `ret` got resolved\n        // dont care for errors, data will be freed anyway on next start\n        return ret.then(res => {\n          this._params = EMPTY_PARAMS;\n          this._data = '';\n          this._hitLimit = false;\n          return res;\n        });\n      }\n    }\n    this._params = EMPTY_PARAMS;\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from 'common/parser/Types';\nimport { ApcState, ParserConstants } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ <identifier><data> ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n  private _state = ApcState.START;\n  private _active = EMPTY_HANDLERS;\n  private _id = -1;\n  private _handlers: IHandlerCollection<IApcHandler> = Object.create(null);\n  private _handlerFb: ApcFallbackHandlerType = () => { };\n  private _stack: ISubParserStackState = {\n    paused: false,\n    loopPosition: 0,\n    fallThrough: false\n  };\n\n  /**\n   * Register an APC handler for a specific identifier.\n   * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n   * @param handler The handler to register\n   */\n  public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n    this._handlers[ident] ??= [];\n    const handlerList = this._handlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n\n  public clearHandler(ident: number): void {\n    if (this._handlers[ident]) delete this._handlers[ident];\n  }\n\n  public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n    this._handlerFb = handler;\n  }\n\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => { };\n    this._active = EMPTY_HANDLERS;\n  }\n\n  public reset(): void {\n    // force cleanup handlers if payload was already sent\n    if (this._state === ApcState.PAYLOAD) {\n      for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n        this._active[j].end(false);\n      }\n    }\n    this._stack.paused = false;\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = ApcState.START;\n  }\n\n  private _start(): void {\n    this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'START');\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].start();\n      }\n    }\n  }\n\n  private _put(data: Uint32Array, start: number, end: number): void {\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].put(data, start, end);\n      }\n    }\n  }\n\n  public start(): void {\n    // always reset leftover handlers\n    this.reset();\n    this._state = ApcState.ID;\n  }\n\n  /**\n   * Put data to current APC command.\n   * For APC, the first character is used as the identifier.\n   * Format: ESC _ <identifier><payload> ESC \\\n   * Example: ESC _ G f=100,a=T;... ESC \\ (Kitty graphics, identifier='G')\n   */\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._state === ApcState.ABORT) {\n      return;\n    }\n    if (this._state === ApcState.ID) {\n      // The first character is the identifier\n      if (start < end) {\n        this._id = data[start++];\n        this._state = ApcState.PAYLOAD;\n        this._start();\n      }\n    }\n    if (this._state === ApcState.PAYLOAD && end - start > 0) {\n      this._put(data, start, end);\n    }\n  }\n\n  /**\n   * Indicates end of an APC command.\n   * Whether the APC got aborted or finished normally\n   * is indicated by `success`.\n   */\n  public end(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n    if (this._state === ApcState.START) {\n      return;\n    }\n    // do nothing if command was faulty\n    if (this._state !== ApcState.ABORT) {\n      // if we are still in ID state and get an early end\n      // means we got an empty APC sequence with no identifier,\n      // which is invalid - just reset and return\n      if (this._state === ApcState.ID) {\n        this._active = EMPTY_HANDLERS;\n        this._id = -1;\n        this._state = ApcState.START;\n        return;\n      }\n\n      if (!this._active.length) {\n        this._handlerFb(this._id, 'END', success);\n      } else {\n        let handlerResult: boolean | Promise<boolean> = false;\n        let j = this._active.length - 1;\n        let fallThrough = false;\n        if (this._stack.paused) {\n          j = this._stack.loopPosition - 1;\n          handlerResult = promiseResult;\n          fallThrough = this._stack.fallThrough;\n          this._stack.paused = false;\n        }\n        if (!fallThrough && handlerResult === false) {\n          for (; j >= 0; j--) {\n            handlerResult = this._active[j].end(success);\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._stack.paused = true;\n              this._stack.loopPosition = j;\n              this._stack.fallThrough = false;\n              return handlerResult;\n            }\n          }\n          j--;\n        }\n        // cleanup left over handlers\n        // we always have to call .end for proper cleanup,\n        // here we use `success` to indicate whether a handler should execute\n        for (; j >= 0; j--) {\n          handlerResult = this._active[j].end(false);\n          if (handlerResult instanceof Promise) {\n            this._stack.paused = true;\n            this._stack.loopPosition = j;\n            this._stack.fallThrough = true;\n            return handlerResult;\n          }\n        }\n      }\n\n    }\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = ApcState.START;\n  }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n  private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n  private _data = '';\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string) => boolean | Promise<boolean>) { }\n\n  public start(): void {\n    this._data = '';\n    this._hitLimit = false;\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._hitLimit) {\n      return;\n    }\n    this._data += utf32ToString(data, start, end);\n    if (this._data.length > ApcHandler._payloadLimit) {\n      this._data = '';\n      this._hitLimit = true;\n    }\n  }\n\n  public end(success: boolean): boolean | Promise<boolean> {\n    let ret: boolean | Promise<boolean> = false;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data);\n      if (ret instanceof Promise) {\n        // need to hold data until `ret` got resolved\n        // dont care for errors, data will be freed anyway on next start\n        return ret.then(res => {\n          this._data = '';\n          this._hitLimit = false;\n          return res;\n        });\n      }\n    }\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from 'common/parser/Types';\nimport { ParserState, ParserAction } from 'common/parser/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { Params } from 'common/parser/Params';\nimport { OscParser } from 'common/parser/OscParser';\nimport { DcsParser } from 'common/parser/DcsParser';\nimport { ApcParser } from 'common/parser/ApcParser';\n\n/**\n * Table values are generated like this:\n *    index:  currentState << TableValue.INDEX_STATE_SHIFT | charCode\n *    value:  action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n  TRANSITION_ACTION_SHIFT = 8,\n  TRANSITION_STATE_MASK = 255,\n  INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n  public table: Uint16Array;\n\n  constructor(length: number) {\n    this.table = new Uint16Array(length);\n  }\n\n  /**\n   * Set default transition.\n   * @param action default action\n   * @param next default next state\n   */\n  public setDefault(action: ParserAction, next: ParserState): void {\n    this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n  }\n\n  /**\n   * Add a transition to the transition table.\n   * @param code input character code\n   * @param state current parser state\n   * @param action parser action to be done\n   * @param next next parser state\n   */\n  public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n    this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n  }\n\n  /**\n   * Add transitions for multiple input character codes.\n   * @param codes input character code array\n   * @param state current parser state\n   * @param action parser action to be done\n   * @param next next parser state\n   */\n  public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n    for (let i = 0; i < codes.length; i++) {\n      this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n    }\n  }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n  const table: TransitionTable = new TransitionTable(4095);\n\n  // range macro for byte\n  const BYTE_VALUES = 256;\n  const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n  const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n  // Default definitions.\n  const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n  const EXECUTABLES = r(0x00, 0x18);\n  EXECUTABLES.push(0x19);\n  EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n  const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n  // set default transition\n  table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n  // printables\n  table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n  // global anywhere rules\n  for (const state of states) {\n    table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n    table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE);  // ESC\n    table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING);  // OSC\n    table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING);  // SOS, PM\n    table.add(0x9f, state, ParserAction.APC_START, ParserState.APC_STRING);  // APC\n    table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY);  // CSI\n    table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY);  // DCS\n  }\n  // rules for executables and 7f\n  table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n  table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n  table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n  table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n  table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n  table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n  table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n  table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n  table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n  table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n  table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n  table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n  table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n  // osc\n  table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n  table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n  table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n  // sos/pm\n  table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n  table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n  table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n  table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n  table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n  // apc\n  table.add(0x5f, ParserState.ESCAPE, ParserAction.APC_START, ParserState.APC_STRING);\n  table.addMany(PRINTABLES, ParserState.APC_STRING, ParserAction.APC_PUT, ParserState.APC_STRING);\n  table.addMany(EXECUTABLES, ParserState.APC_STRING, ParserAction.IGNORE, ParserState.APC_STRING);\n  table.add(0x7f, ParserState.APC_STRING, ParserAction.IGNORE, ParserState.APC_STRING);\n  table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_STRING, ParserAction.APC_END, ParserState.GROUND);\n  // csi entries\n  table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n  table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  // esc_intermediate\n  table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n  table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  // dcs entry\n  table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n  table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n  table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n  table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n  // special handling of unicode chars\n  table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n  table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  table.add(NON_ASCII_PRINTABLE, ParserState.APC_STRING, ParserAction.APC_PUT, ParserState.APC_STRING);\n  return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This this is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n  public initialState: number;\n  public currentState: number;\n  public precedingJoinState: number; // UnicodeJoinProperties\n\n  // buffers over several parse calls\n  protected _params: Params;\n  protected _collect: number;\n\n  // handler lookup containers\n  protected _printHandler: PrintHandlerType;\n  protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n  protected _csiHandlers: IHandlerCollection<CsiHandlerType>;\n  protected _escHandlers: IHandlerCollection<EscHandlerType>;\n  protected readonly _oscParser: IOscParser;\n  protected readonly _dcsParser: IDcsParser;\n  protected readonly _apcParser: IApcParser;\n  protected _errorHandler: (state: IParsingState) => IParsingState;\n\n  // fallback handlers\n  protected _printHandlerFb: PrintFallbackHandlerType;\n  protected _executeHandlerFb: ExecuteFallbackHandlerType;\n  protected _csiHandlerFb: CsiFallbackHandlerType;\n  protected _escHandlerFb: EscFallbackHandlerType;\n  protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n  // parser stack save for async handler support\n  protected _parseStack: IParserStackState = {\n    state: ParserStackType.NONE,\n    handlers: [],\n    handlerPos: 0,\n    transition: 0,\n    chunkPos: 0\n  };\n\n  constructor(\n    protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n  ) {\n    super();\n\n    this.initialState = ParserState.GROUND;\n    this.currentState = this.initialState;\n    this._params = new Params(); // defaults to 32 storable params/subparams\n    this._params.addParam(0);    // ZDM\n    this._collect = 0;\n    this.precedingJoinState = 0;\n\n    // set default fallback handlers and handler lookup containers\n    this._printHandlerFb = (data, start, end): void => { };\n    this._executeHandlerFb = (code: number): void => { };\n    this._csiHandlerFb = (ident: number, params: IParams): void => { };\n    this._escHandlerFb = (ident: number): void => { };\n    this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n    this._printHandler = this._printHandlerFb;\n    this._executeHandlers = Object.create(null);\n    this._csiHandlers = Object.create(null);\n    this._escHandlers = Object.create(null);\n    this._register(toDisposable(() => {\n      this._csiHandlers = Object.create(null);\n      this._executeHandlers = Object.create(null);\n      this._escHandlers = Object.create(null);\n    }));\n    this._oscParser = this._register(new OscParser());\n    this._dcsParser = this._register(new DcsParser());\n    this._apcParser = this._register(new ApcParser());\n    this._errorHandler = this._errorHandlerFb;\n\n    // swallow 7bit ST (ESC+\\)\n    this.registerEscHandler({ final: '\\\\' }, () => true);\n  }\n\n  protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n    let res = 0;\n    if (id.prefix) {\n      if (id.prefix.length > 1) {\n        throw new Error('only one byte as prefix supported');\n      }\n      res = id.prefix.charCodeAt(0);\n      if (res && 0x3c > res || res > 0x3f) {\n        throw new Error('prefix must be in range 0x3c .. 0x3f');\n      }\n    }\n    if (id.intermediates) {\n      if (id.intermediates.length > 2) {\n        throw new Error('only two bytes as intermediates are supported');\n      }\n      for (let i = 0; i < id.intermediates.length; ++i) {\n        const intermediate = id.intermediates.charCodeAt(i);\n        if (0x20 > intermediate || intermediate > 0x2f) {\n          throw new Error('intermediate must be in range 0x20 .. 0x2f');\n        }\n        res <<= 8;\n        res |= intermediate;\n      }\n    }\n    if (id.final.length !== 1) {\n      throw new Error('final must be a single byte');\n    }\n    const finalCode = id.final.charCodeAt(0);\n    if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n      throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n    }\n    res <<= 8;\n    res |= finalCode;\n\n    return res;\n  }\n\n  public identToString(ident: number): string {\n    const res: string[] = [];\n    while (ident) {\n      res.push(String.fromCharCode(ident & 0xFF));\n      ident >>= 8;\n    }\n    return res.reverse().join('');\n  }\n\n  public setPrintHandler(handler: PrintHandlerType): void {\n    this._printHandler = handler;\n  }\n  public clearPrintHandler(): void {\n    this._printHandler = this._printHandlerFb;\n  }\n\n  public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n    const ident = this._identifier(id, [0x30, 0x7e]);\n    this._escHandlers[ident] ??= [];\n    const handlerList = this._escHandlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearEscHandler(id: IFunctionIdentifier): void {\n    if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n  }\n  public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n    this._escHandlerFb = handler;\n  }\n\n  public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n    this._executeHandlers[flag.charCodeAt(0)] = handler;\n  }\n  public clearExecuteHandler(flag: string): void {\n    if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];\n  }\n  public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n    this._executeHandlerFb = handler;\n  }\n\n  public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n    const ident = this._identifier(id);\n    this._csiHandlers[ident] ??= [];\n    const handlerList = this._csiHandlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearCsiHandler(id: IFunctionIdentifier): void {\n    if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n  }\n  public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n    this._csiHandlerFb = callback;\n  }\n\n  public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n    return this._dcsParser.registerHandler(this._identifier(id), handler);\n  }\n  public clearDcsHandler(id: IFunctionIdentifier): void {\n    this._dcsParser.clearHandler(this._identifier(id));\n  }\n  public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n    this._dcsParser.setHandlerFallback(handler);\n  }\n\n  public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n    return this._oscParser.registerHandler(ident, handler);\n  }\n  public clearOscHandler(ident: number): void {\n    this._oscParser.clearHandler(ident);\n  }\n  public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n    this._oscParser.setHandlerFallback(handler);\n  }\n\n  public registerApcHandler(ident: number, handler: IApcHandler): IDisposable {\n    return this._apcParser.registerHandler(ident, handler);\n  }\n  public clearApcHandler(ident: number): void {\n    this._apcParser.clearHandler(ident);\n  }\n  public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n    this._apcParser.setHandlerFallback(handler);\n  }\n\n  public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n    this._errorHandler = callback;\n  }\n  public clearErrorHandler(): void {\n    this._errorHandler = this._errorHandlerFb;\n  }\n\n  /**\n   * Reset parser to initial values.\n   *\n   * This can also be used to lift the improper continuation error condition\n   * when dealing with async handlers. Use this only as a last resort to silence\n   * that error when the terminal has no pending data to be processed. Note that\n   * the interrupted async handler might continue its work in the future messing\n   * up the terminal state even further.\n   */\n  public reset(): void {\n    this.currentState = this.initialState;\n    this._oscParser.reset();\n    this._dcsParser.reset();\n    this._apcParser.reset();\n    this._params.reset();\n    this._params.addParam(0); // ZDM\n    this._collect = 0;\n    this.precedingJoinState = 0;\n    // abort pending continuation from async handler\n    // Here the RESET type indicates, that the next parse call will\n    // ignore any saved stack, instead continues sync with next codepoint from GROUND\n    if (this._parseStack.state !== ParserStackType.NONE) {\n      this._parseStack.state = ParserStackType.RESET;\n      this._parseStack.handlers = []; // also release handlers ref\n    }\n  }\n\n  /**\n   * Async parse support.\n   */\n  protected _preserveStack(\n    state: ParserStackType,\n    handlers: ResumableHandlersType,\n    handlerPos: number,\n    transition: number,\n    chunkPos: number\n  ): void {\n    this._parseStack.state = state;\n    this._parseStack.handlers = handlers;\n    this._parseStack.handlerPos = handlerPos;\n    this._parseStack.transition = transition;\n    this._parseStack.chunkPos = chunkPos;\n  }\n\n  /**\n   * Parse UTF32 codepoints in `data` up to `length`.\n   *\n   * Note: For several actions with high data load the parsing is optimized\n   * by using local read ahead loops with hardcoded conditions to\n   * avoid costly table lookups. Make sure that any change of table values\n   * will be reflected in the loop conditions as well and vice versa.\n   * Affected states/actions:\n   * - GROUND:PRINT\n   * - CSI_PARAM:PARAM\n   * - DCS_PARAM:PARAM\n   * - OSC_STRING:OSC_PUT\n   * - DCS_PASSTHROUGH:DCS_PUT\n   *\n   * Note on asynchronous handler support:\n   * Any handler returning a promise will be treated as asynchronous.\n   * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n   * creates a stack save and returns the promise to the caller.\n   * For proper continuation of the paused state it is important\n   * to await the promise resolving. On resolve the parse must be repeated\n   * with the same chunk of data and the resolved value in `promiseResult`\n   * until no promise is returned.\n   *\n   * Important: With only sync handlers defined, parsing is completely synchronous as well.\n   * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n   *\n   * Boilerplate for proper parsing of multiple chunks with async handlers:\n   *\n   * ```typescript\n   * async function parseMultipleChunks(chunks: Uint32Array[]): Promise<void> {\n   *   for (const chunk of chunks) {\n   *     let result: void | Promise<boolean>;\n   *     let prev: boolean | undefined;\n   *     while (result = parser.parse(chunk, chunk.length, prev)) {\n   *       prev = await result;\n   *     }\n   *   }\n   *   // finished parsing all chunks...\n   * }\n   * ```\n   */\n  public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise<boolean> {\n    let code = 0;\n    let transition = 0;\n    let start = 0;\n    let handlerResult: void | boolean | Promise<boolean>;\n\n    // resume from async handler\n    if (this._parseStack.state) {\n      // allow sync parser reset even in continuation mode\n      // Note: can be used to recover parser from improper continuation error below\n      if (this._parseStack.state === ParserStackType.RESET) {\n        this._parseStack.state = ParserStackType.NONE;\n        start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n      } else {\n        if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n          /**\n           * Reject further parsing on improper continuation after pausing. This is a really bad\n           * condition with screwed up execution order and prolly messed up terminal state,\n           * therefore we exit hard with an exception and reject any further parsing.\n           *\n           * Note: With `Terminal.write` usage this exception should never occur, as the top level\n           * calls are guaranteed to handle async conditions properly. If you ever encounter this\n           * exception in your terminal integration it indicates, that you injected data chunks to\n           * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n           * continuation of a running async handler.\n           *\n           * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n           * the pending async handler still might mess up the terminal later. Instead fix the\n           * faulty async handling, so this error will not be thrown anymore.\n           */\n          this._parseStack.state = ParserStackType.FAIL;\n          throw new Error('improper continuation due to previous async handler, giving up parsing');\n        }\n\n        // we have to resume the old handler loop if:\n        // - return value of the promise was `false`\n        // - handlers are not exhausted yet\n        const handlers = this._parseStack.handlers;\n        let handlerPos = this._parseStack.handlerPos - 1;\n        switch (this._parseStack.state) {\n          case ParserStackType.CSI:\n            if (promiseResult === false && handlerPos > -1) {\n              for (; handlerPos >= 0; handlerPos--) {\n                handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n                if (handlerResult === true) {\n                  break;\n                } else if (handlerResult instanceof Promise) {\n                  this._parseStack.handlerPos = handlerPos;\n                  return handlerResult;\n                }\n              }\n            }\n            this._parseStack.handlers = [];\n            break;\n          case ParserStackType.ESC:\n            if (promiseResult === false && handlerPos > -1) {\n              for (; handlerPos >= 0; handlerPos--) {\n                handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n                if (handlerResult === true) {\n                  break;\n                } else if (handlerResult instanceof Promise) {\n                  this._parseStack.handlerPos = handlerPos;\n                  return handlerResult;\n                }\n              }\n            }\n            this._parseStack.handlers = [];\n            break;\n          case ParserStackType.DCS:\n            code = data[this._parseStack.chunkPos];\n            handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n            if (handlerResult) {\n              return handlerResult;\n            }\n            if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n            this._params.reset();\n            this._params.addParam(0); // ZDM\n            this._collect = 0;\n            break;\n          case ParserStackType.OSC:\n            code = data[this._parseStack.chunkPos];\n            handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n            if (handlerResult) {\n              return handlerResult;\n            }\n            if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n            this._params.reset();\n            this._params.addParam(0); // ZDM\n            this._collect = 0;\n            break;\n          case ParserStackType.APC:\n            code = data[this._parseStack.chunkPos];\n            handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n            if (handlerResult) {\n              return handlerResult;\n            }\n            if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n            this._params.reset();\n            this._params.addParam(0); // ZDM\n            this._collect = 0;\n            break;\n        }\n        // cleanup before continuing with the main sync loop\n        this._parseStack.state = ParserStackType.NONE;\n        start = this._parseStack.chunkPos + 1;\n        this.precedingJoinState = 0;\n        this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n      }\n    }\n\n    // continue with main sync loop\n\n    // process input string\n    for (let i = start; i < length; ++i) {\n      code = data[i];\n\n      // normal transition & action lookup\n      transition = this._transitions.table[this.currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];\n      switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n        case ParserAction.PRINT:\n          // read ahead with loop unrolling\n          // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n          for (let j = i + 1; ; ++j) {\n            if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.EXECUTE:\n          if (this._executeHandlers[code]) this._executeHandlers[code]();\n          else this._executeHandlerFb(code);\n          this.precedingJoinState = 0;\n          break;\n        case ParserAction.IGNORE:\n          break;\n        case ParserAction.ERROR:\n          const inject: IParsingState = this._errorHandler(\n            {\n              position: i,\n              code,\n              currentState: this.currentState,\n              collect: this._collect,\n              params: this._params,\n              abort: false\n            });\n          if (inject.abort) return;\n          // inject values: currently not implemented\n          break;\n        case ParserAction.CSI_DISPATCH:\n          // Trigger CSI Handler\n          const handlers = this._csiHandlers[this._collect << 8 | code];\n          let j = handlers ? handlers.length - 1 : -1;\n          for (; j >= 0; j--) {\n            // true means success and to stop bubbling\n            // a promise indicates an async handler that needs to finish before progressing\n            handlerResult = handlers[j](this._params);\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n              return handlerResult;\n            }\n          }\n          if (j < 0) {\n            this._csiHandlerFb(this._collect << 8 | code, this._params);\n          }\n          this.precedingJoinState = 0;\n          break;\n        case ParserAction.PARAM:\n          // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n          do {\n            switch (code) {\n              case 0x3b:\n                this._params.addParam(0);  // ZDM\n                break;\n              case 0x3a:\n                this._params.addSubParam(-1);\n                break;\n              default:  // 0x30 - 0x39\n                this._params.addDigit(code - 48);\n            }\n          } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n          i--;\n          break;\n        case ParserAction.COLLECT:\n          this._collect <<= 8;\n          this._collect |= code;\n          break;\n        case ParserAction.ESC_DISPATCH:\n          const handlersEsc = this._escHandlers[this._collect << 8 | code];\n          let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n          for (; jj >= 0; jj--) {\n            // true means success and to stop bubbling\n            // a promise indicates an async handler that needs to finish before progressing\n            handlerResult = handlersEsc[jj]();\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n              return handlerResult;\n            }\n          }\n          if (jj < 0) {\n            this._escHandlerFb(this._collect << 8 | code);\n          }\n          this.precedingJoinState = 0;\n          break;\n        case ParserAction.CLEAR:\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          break;\n        case ParserAction.DCS_HOOK:\n          this._dcsParser.hook(this._collect << 8 | code, this._params);\n          break;\n        case ParserAction.DCS_PUT:\n          // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n          // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n          for (let j = i + 1; ; ++j) {\n            if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n              this._dcsParser.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.DCS_UNHOOK:\n          handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n          if (handlerResult) {\n            this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n            return handlerResult;\n          }\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          this.precedingJoinState = 0;\n          break;\n        case ParserAction.OSC_START:\n          this._oscParser.start();\n          break;\n        case ParserAction.OSC_PUT:\n          // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n          for (let j = i + 1; ; j++) {\n            if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n              this._oscParser.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.OSC_END:\n          handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n          if (handlerResult) {\n            this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n            return handlerResult;\n          }\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          this.precedingJoinState = 0;\n          break;\n        case ParserAction.APC_START:\n          this._apcParser.start();\n          break;\n        case ParserAction.APC_PUT:\n          // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n          for (let j = i + 1; ; ++j) {\n            if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || code === 0x9c || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n              this._apcParser.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.APC_END:\n          handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n          if (handlerResult) {\n            this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n            return handlerResult;\n          }\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          this.precedingJoinState = 0;\n          break;\n      }\n      this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n    }\n  }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:<red>/<green>/<blue> with <red>, <green>, <blue> in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n  if (!data) return;\n  // also handle uppercases\n  let low = data.toLowerCase();\n  if (low.startsWith('rgb:')) {\n    // 'rgb:' specifier\n    low = low.slice(4);\n    const m = RGB_REX.exec(low);\n    if (m) {\n      const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n      return [\n        Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n        Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n        Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n      ];\n    }\n  } else if (low.startsWith('#')) {\n    // '#' specifier\n    low = low.slice(1);\n    if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n      const adv = low.length / 3;\n      const result: [number, number, number] = [0, 0, 0];\n      for (let i = 0; i < 3; ++i) {\n        const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n        result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n      }\n      return result;\n    }\n  }\n\n  // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n  // they would add. In order to support named colors, we would need some way of optionally loading\n  // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n  const s = n.toString(16);\n  const s2 = s.length < 2 ? '0' + s : s;\n  switch (bits) {\n    case 4:\n      return s[0];\n    case 8:\n      return s2;\n    case 12:\n      return (s2 + s2).slice(0, 3);\n    default:\n      return s2 + s2;\n  }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n  const [r, g, b] = color;\n  return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.196';\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IAttributeData, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from 'common/Types';\nimport { C0, C1 } from 'common/data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';\nimport { Disposable } from 'common/Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from 'common/services/Services';\nimport { UnicodeService } from 'common/services/UnicodeService';\nimport { OscHandler } from 'common/parser/OscParser';\nimport { DcsHandler } from 'common/parser/DcsParser';\nimport { ApcHandler } from 'common/parser/ApcParser';\nimport { IBuffer } from 'common/buffer/Types';\nimport { parseColor } from 'common/input/XParseColor';\nimport { Emitter } from 'common/Event';\nimport { XTERM_VERSION } from 'common/Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * VT commands done by the parser - FIXME: move this to the parser?\n */\n// @vt: #Y   ESC   CSI   \"Control Sequence Introducer\"   \"ESC [\"   \"Start of a CSI sequence.\"\n// @vt: #Y   ESC   OSC   \"Operating System Command\"      \"ESC ]\"   \"Start of an OSC sequence.\"\n// @vt: #Y   ESC   DCS   \"Device Control String\"         \"ESC P\"   \"Start of a DCS sequence.\"\n// @vt: #Y   ESC   ST    \"String Terminator\"             \"ESC \\\"   \"Terminator used for string type sequences.\"\n// @vt: #Y   ESC   PM    \"Privacy Message\"               \"ESC ^\"   \"Start of a privacy message.\"\n// @vt: #Y   ESC   APC   \"Application Program Command\"   \"ESC _\"   \"Start of an APC sequence.\"\n// @vt: #Y   C1    CSI   \"Control Sequence Introducer\"   \"\\x9B\"    \"Start of a CSI sequence.\"\n// @vt: #Y   C1    OSC   \"Operating System Command\"      \"\\x9D\"    \"Start of an OSC sequence.\"\n// @vt: #Y   C1    DCS   \"Device Control String\"         \"\\x90\"    \"Start of a DCS sequence.\"\n// @vt: #Y   C1    ST    \"String Terminator\"             \"\\x9C\"    \"Terminator used for string type sequences.\"\n// @vt: #Y   C1    PM    \"Privacy Message\"               \"\\x9E\"    \"Start of a privacy message.\"\n// @vt: #Y   C1    APC   \"Application Program Command\"   \"\\x9F\"    \"Start of an APC sequence.\"\n// @vt: #Y   C0    NUL   \"Null\"                          \"\\0, \\x00\"  \"NUL is ignored.\"\n// @vt: #Y   C0    ESC   \"Escape\"                        \"\\e, \\x1B\"  \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #E[Supported via @xterm/addon-image.]  DCS   SIXEL       \"SIXEL Graphics\"          \"DCS Ps ; Ps ; Ps ; q \tPt ST\"  \"Draw SIXEL image.\"\n// @vt: #N  DCS   DECUDK      \"User Defined Keys\"       \"DCS Ps ; Ps \\| Pt ST\"           \"Definitions for user-defined keys.\"\n// @vt: #N  DCS   XTGETTCAP   \"Request Terminfo String\" \"DCS + q Pt ST\"                 \"Request Terminfo String.\"\n// @vt: #N  DCS   XTSETTCAP   \"Set Terminfo Data\"       \"DCS + p Pt ST\"                 \"Set Terminfo Data.\"\n// @vt: #N  OSC   1           \"Set Icon Name\"           \"OSC 1 ; Pt BEL\"                \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst MAX_PARSEBUFFER_LENGTH = 131072;\n\n/**\n * Limit length of title and icon name stacks.\n */\nconst STACK_LIMIT = 10;\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n  if (n > 24) {\n    return opts.setWinLines || false;\n  }\n  switch (n) {\n    case 1: return !!opts.restoreWin;\n    case 2: return !!opts.minimizeWin;\n    case 3: return !!opts.setWinPosition;\n    case 4: return !!opts.setWinSizePixels;\n    case 5: return !!opts.raiseWin;\n    case 6: return !!opts.lowerWin;\n    case 7: return !!opts.refreshWin;\n    case 8: return !!opts.setWinSizeChars;\n    case 9: return !!opts.maximizeWin;\n    case 10: return !!opts.fullscreenWin;\n    case 11: return !!opts.getWinState;\n    case 13: return !!opts.getWinPosition;\n    case 14: return !!opts.getWinSizePixels;\n    case 15: return !!opts.getScreenSizePixels;\n    case 16: return !!opts.getCellSizePixels;\n    case 18: return !!opts.getWinSizeChars;\n    case 19: return !!opts.getScreenSizeChars;\n    case 20: return !!opts.getIconTitle;\n    case 21: return !!opts.getWinTitle;\n    case 22: return !!opts.pushTitle;\n    case 23: return !!opts.popTitle;\n    case 24: return !!opts.setWinLines;\n  }\n  return false;\n}\n\nexport enum WindowsOptionsReportType {\n  GET_WIN_SIZE_PIXELS = 0,\n  GET_CELL_SIZE_PIXELS = 1\n}\n\n// create a warning log if an async handler takes longer than the limit (in ms)\nconst SLOW_ASYNC_LIMIT = 5000;\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n  private _parseBuffer: Uint32Array = new Uint32Array(4096);\n  private _stringDecoder: StringToUtf32 = new StringToUtf32();\n  private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n  private _windowTitle = '';\n  private _iconName = '';\n  private _dirtyRowTracker: IDirtyRowTracker;\n  protected _windowTitleStack: string[] = [];\n  protected _iconNameStack: string[] = [];\n\n  private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n  public getAttrData(): IAttributeData { return this._curAttrData; }\n  private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n  private _activeBuffer: IBuffer;\n\n  private readonly _onRequestBell = this._register(new Emitter<void>());\n  public readonly onRequestBell = this._onRequestBell.event;\n  private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n  public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n  private readonly _onRequestReset = this._register(new Emitter<void>());\n  public readonly onRequestReset = this._onRequestReset.event;\n  private readonly _onRequestSendFocus = this._register(new Emitter<void>());\n  public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n  private readonly _onRequestSyncScrollBar = this._register(new Emitter<void>());\n  public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n  private readonly _onRequestWindowsOptionsReport = this._register(new Emitter<WindowsOptionsReportType>());\n  public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n  private readonly _onA11yChar = this._register(new Emitter<string>());\n  public readonly onA11yChar = this._onA11yChar.event;\n  private readonly _onA11yTab = this._register(new Emitter<number>());\n  public readonly onA11yTab = this._onA11yTab.event;\n  private readonly _onCursorMove = this._register(new Emitter<void>());\n  public readonly onCursorMove = this._onCursorMove.event;\n  private readonly _onLineFeed = this._register(new Emitter<void>());\n  public readonly onLineFeed = this._onLineFeed.event;\n  private readonly _onScroll = this._register(new Emitter<number>());\n  public readonly onScroll = this._onScroll.event;\n  private readonly _onTitleChange = this._register(new Emitter<string>());\n  public readonly onTitleChange = this._onTitleChange.event;\n  private readonly _onColor = this._register(new Emitter<IColorEvent>());\n  public readonly onColor = this._onColor.event;\n  private readonly _onRequestColorSchemeQuery = this._register(new Emitter<void>());\n  public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n  private _parseStack: IParseStack = {\n    paused: false,\n    cursorStartX: 0,\n    cursorStartY: 0,\n    decodedLength: 0,\n    position: 0\n  };\n\n  constructor(\n    private readonly _bufferService: IBufferService,\n    private readonly _charsetService: ICharsetService,\n    private readonly _coreService: ICoreService,\n    private readonly _logService: ILogService,\n    private readonly _optionsService: IOptionsService,\n    private readonly _oscLinkService: IOscLinkService,\n    private readonly _mouseStateService: IMouseStateService,\n    private readonly _unicodeService: IUnicodeService,\n    private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n  ) {\n    super();\n    this._register(this._parser);\n    this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n    // Track properties used in performance critical code manually to avoid using slow getters\n    this._activeBuffer = this._bufferService.buffer;\n    this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n    /**\n     * custom fallback handlers\n     */\n    this._parser.setCsiHandlerFallback((ident, params) => {\n      this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n    });\n    this._parser.setEscHandlerFallback(ident => {\n      this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n    });\n    this._parser.setExecuteHandlerFallback(code => {\n      this._logService.debug('Unknown EXECUTE code: ', { code });\n    });\n    this._parser.setOscHandlerFallback((identifier, action, data) => {\n      this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n    });\n    this._parser.setDcsHandlerFallback((ident, action, payload) => {\n      if (action === 'HOOK') {\n        payload = payload.toArray();\n      }\n      this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n    });\n\n    /**\n     * print handler\n     */\n    this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n    /**\n     * CSI handler\n     */\n    this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n    this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n    this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n    this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n    this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n    this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n    this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n    this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n    this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n    this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n    this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n    this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n    this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n    this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n    this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n    this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n    this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n    this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n    this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n    this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n    this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n    this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n    this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n    this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n    this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n    this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n    this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n    this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n    this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n    this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n    this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n    this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n    this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n    this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n    this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n    this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n    this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n    this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n    this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n    this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n    this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n    // Kitty keyboard protocol handlers\n    this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n    this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n    this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n    /**\n     * execute handler\n     */\n    this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n    this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n    this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n    this._parser.setExecuteHandler(C0.HT, () => this.tab());\n    this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n    this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n    // FIXME:   What do to with missing? Old code just added those to print.\n\n    this._parser.setExecuteHandler(C1.IND, () => this.index());\n    this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n    this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n    /**\n     * OSC handler\n     */\n    //   0 - icon name + title\n    this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n    //   1 - icon name\n    this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n    //   2 - title\n    this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n    //   3 - set property X in the form \"prop=value\"\n    //   4 - Change Color Number\n    this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n    //   5 - Change Special Color Number\n    //   6 - Enable/disable Special Color Number c\n    //   7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n    //   8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n    this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n    //  10 - Change VT100 text foreground color to Pt.\n    this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n    //  11 - Change VT100 text background color to Pt.\n    this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n    //  12 - Change text cursor color to Pt.\n    this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n    //  13 - Change mouse foreground color to Pt.\n    //  14 - Change mouse background color to Pt.\n    //  15 - Change Tektronix foreground color to Pt.\n    //  16 - Change Tektronix background color to Pt.\n    //  17 - Change highlight background color to Pt.\n    //  18 - Change Tektronix cursor color to Pt.\n    //  19 - Change highlight foreground color to Pt.\n    //  46 - Change Log File to Pt.\n    //  50 - Set Font to Pt.\n    //  51 - reserved for Emacs shell.\n    //  52 - Manipulate Selection Data.\n    // 104 ; c - Reset Color Number c.\n    this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n    // 105 ; c - Reset Special Color Number c.\n    // 106 ; c; f - Enable/disable Special Color Number c.\n    // 110 - Reset VT100 text foreground color.\n    this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n    // 111 - Reset VT100 text background color.\n    this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n    // 112 - Reset text cursor color.\n    this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n    // 113 - Reset mouse foreground color.\n    // 114 - Reset mouse background color.\n    // 115 - Reset Tektronix foreground color.\n    // 116 - Reset Tektronix background color.\n    // 117 - Reset highlight color.\n    // 118 - Reset Tektronix cursor color.\n    // 119 - Reset highlight foreground color.\n\n    /**\n     * ESC handlers\n     */\n    this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n    this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n    this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n    this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n    this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n    this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n    this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n    this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n    this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n    this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n    this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n    this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n    this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n    this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n    this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n    this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n    for (const flag in CHARSETS) {\n      this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n      this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n      this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n      this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n      this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n      this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n      this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n    }\n    this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n    /**\n     * error handler\n     */\n    this._parser.setErrorHandler((state: IParsingState) => {\n      this._logService.error('Parsing error: ', state);\n      return state;\n    });\n\n    /**\n     * DCS handler\n     */\n    this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n  }\n\n  /**\n   * Async parse support.\n   */\n  private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n    this._parseStack.paused = true;\n    this._parseStack.cursorStartX = cursorStartX;\n    this._parseStack.cursorStartY = cursorStartY;\n    this._parseStack.decodedLength = decodedLength;\n    this._parseStack.position = position;\n  }\n\n  private _logSlowResolvingAsync(p: Promise<boolean>): void {\n    // log a limited warning about an async handler taking too long\n    if (this._logService.logLevel <= LogLevelEnum.WARN) {\n      let slowTimeout: ReturnType<typeof setTimeout> | undefined;\n      const slowPromise = new Promise<never>((_res, rej) => {\n        slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), SLOW_ASYNC_LIMIT);\n      });\n      Promise.race([p, slowPromise])\n        .then(() => {\n          if (slowTimeout !== undefined) {\n            clearTimeout(slowTimeout);\n          }\n        }, err => {\n          if (slowTimeout !== undefined) {\n            clearTimeout(slowTimeout);\n          }\n          if (err !== '#SLOW_TIMEOUT') {\n            throw err;\n          }\n          console.warn(`async parser handler taking longer than ${SLOW_ASYNC_LIMIT} ms`);\n        });\n    }\n  }\n\n  private _getCurrentLinkId(): number {\n    return this._curAttrData.extended.urlId;\n  }\n\n  /**\n   * Parse call with async handler support.\n   *\n   * Whether the stack state got preserved for the next call, is indicated by the return value:\n   * - undefined (void):\n   *   all handlers were sync, no stack save, continue normally with next chunk\n   * - Promise\\<boolean\\>:\n   *   execution stopped at async handler, stack saved, continue with same chunk and the promise\n   *   resolve value as `promiseResult` until the method returns `undefined`\n   *\n   * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n   * and proper continuation of async parser handlers.\n   */\n  public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise<boolean> {\n    let result: void | Promise<boolean>;\n    let cursorStartX = this._activeBuffer.x;\n    let cursorStartY = this._activeBuffer.y;\n    let start = 0;\n    const wasPaused = this._parseStack.paused;\n\n    if (wasPaused) {\n      // assumption: _parseBuffer never mutates between async calls\n      if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n        this._logSlowResolvingAsync(result);\n        return result;\n      }\n      cursorStartX = this._parseStack.cursorStartX;\n      cursorStartY = this._parseStack.cursorStartY;\n      this._parseStack.paused = false;\n      if (data.length > MAX_PARSEBUFFER_LENGTH) {\n        start = this._parseStack.position + MAX_PARSEBUFFER_LENGTH;\n      }\n    }\n\n    // Log debug data, the log level gate is to prevent extra work in this hot path\n    if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n      this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n    }\n    if (this._logService.logLevel === LogLevelEnum.TRACE) {\n      this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n        ? data.split('').map(e => e.charCodeAt(0))\n        : data\n      );\n    }\n\n    // resize input buffer if needed\n    if (this._parseBuffer.length < data.length) {\n      if (this._parseBuffer.length < MAX_PARSEBUFFER_LENGTH) {\n        this._parseBuffer = new Uint32Array(Math.min(data.length, MAX_PARSEBUFFER_LENGTH));\n      }\n    }\n\n    // Clear the dirty row service so we know which lines changed as a result of parsing\n    // Important: do not clear between async calls, otherwise we lost pending update information.\n    if (!wasPaused) {\n      this._dirtyRowTracker.clearRange();\n    }\n\n    // process big data in smaller chunks\n    if (data.length > MAX_PARSEBUFFER_LENGTH) {\n      for (let i = start; i < data.length; i += MAX_PARSEBUFFER_LENGTH) {\n        const end = i + MAX_PARSEBUFFER_LENGTH < data.length ? i + MAX_PARSEBUFFER_LENGTH : data.length;\n        const len = (typeof data === 'string')\n          ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n          : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n        if (result = this._parser.parse(this._parseBuffer, len)) {\n          this._preserveStack(cursorStartX, cursorStartY, len, i);\n          this._logSlowResolvingAsync(result);\n          return result;\n        }\n      }\n    } else {\n      if (!wasPaused) {\n        const len = (typeof data === 'string')\n          ? this._stringDecoder.decode(data, this._parseBuffer)\n          : this._utf8Decoder.decode(data, this._parseBuffer);\n        if (result = this._parser.parse(this._parseBuffer, len)) {\n          this._preserveStack(cursorStartX, cursorStartY, len, 0);\n          this._logSlowResolvingAsync(result);\n          return result;\n        }\n      }\n    }\n\n    if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n      this._onCursorMove.fire();\n    }\n\n    // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n    // _viewport_ which is relative to ydisp, not relative to ybase.\n    const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n    const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n    if (viewportStart < this._bufferService.rows) {\n      this._onRequestRefreshRows.fire({\n        start: Math.min(viewportStart, this._bufferService.rows - 1),\n        end: Math.min(viewportEnd, this._bufferService.rows - 1)\n      });\n    }\n  }\n\n  public print(data: Uint32Array, start: number, end: number): void {\n    let code: number;\n    let chWidth: number;\n    const charset = this._charsetService.charset;\n    const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n    const cols = this._bufferService.cols;\n    const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n    const insertMode = this._coreService.modes.insertMode;\n    const curAttr = this._curAttrData;\n    let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n    // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n    // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n    if (!bufferRow) {\n      return;\n    }\n\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n    // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n    if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n      bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n    }\n\n    let precedingJoinState = this._parser.precedingJoinState;\n    for (let pos = start; pos < end; ++pos) {\n      code = data[pos];\n\n      // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n      // it as a zero-width hint to text layout engines and simply ignore it.\n      if (code === 0xAD) {\n        continue;\n      }\n\n      // get charset replacement character\n      // charset is only defined for ASCII, therefore we only\n      // search for an replacement char if code < 127\n      if (code < 127 && charset) {\n        const ch = charset[String.fromCharCode(code)];\n        if (ch) {\n          code = ch.charCodeAt(0);\n        }\n      }\n\n      const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n      chWidth = UnicodeService.extractWidth(currentInfo);\n      const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n      const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n      precedingJoinState = currentInfo;\n\n      if (screenReaderMode) {\n        this._onA11yChar.fire(stringFromCodePoint(code));\n      }\n      if (this._getCurrentLinkId()) {\n        this._oscLinkService.addLineToLink(this._getCurrentLinkId(), this._activeBuffer.ybase + this._activeBuffer.y);\n      }\n\n      // goto next line if ch would overflow\n      // NOTE: To avoid costly width checks here,\n      // the terminal does not allow a cols < 2.\n      if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n        // autowrap - DECAWM\n        // automatically wraps to the beginning of the next line\n        if (wraparoundMode) {\n          const oldRow = bufferRow;\n          let oldCol = this._activeBuffer.x - oldWidth;\n          this._activeBuffer.x = oldWidth;\n          this._activeBuffer.y++;\n          if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n            this._activeBuffer.y--;\n            this._bufferService.scroll(this._eraseAttrData(), true);\n          } else {\n            if (this._activeBuffer.y >= this._bufferService.rows) {\n              this._activeBuffer.y = this._bufferService.rows - 1;\n            }\n            // The line already exists (eg. the initial viewport), mark it as a\n            // wrapped line\n            this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n          }\n          // row changed, get it again\n          bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n          if (!bufferRow) {\n            return;\n          }\n          if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n            // Combining character widens 1 column to 2.\n            // Move old character to next line.\n            bufferRow.copyCellsFrom(oldRow as BufferLine,\n              oldCol, 0, oldWidth, false);\n          }\n          // clear left over cells to the right\n          while (oldCol < cols) {\n            oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n          }\n        } else {\n          this._activeBuffer.x = cols - 1;\n          if (chWidth === 2) {\n            // FIXME: check for xterm behavior\n            // What to do here? We got a wide char that does not fit into last cell\n            continue;\n          }\n        }\n      }\n\n      // insert combining char at last cursor position\n      // this._activeBuffer.x should never be 0 for a combining char\n      // since they always follow a cell consuming char\n      // therefore we can test for this._activeBuffer.x to avoid overflow left\n      if (shouldJoin && this._activeBuffer.x) {\n        const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n        // if empty cell after fullwidth, need to go 2 cells back\n        // it is save to step 2 cells back here\n        // since an empty cell is only set by fullwidth chars\n        bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n          code, chWidth);\n        for (let delta = chWidth - oldWidth; --delta >= 0;) {\n          bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n        }\n        continue;\n      }\n\n      // insert mode: move characters to right\n      if (insertMode) {\n        // right shift cells according to the width\n        bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n        // test last cell - since the last cell has only room for\n        // a halfwidth char any fullwidth shifted there is lost\n        // and will be set to empty cell\n        if (bufferRow.getWidth(cols - 1) === 2) {\n          bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n        }\n      }\n\n      // write current char to buffer and advance cursor\n      bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n      // fullwidth char - also set next cell to placeholder stub and advance cursor\n      // for graphemes bigger than fullwidth we can simply loop to zero\n      // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n      if (chWidth > 0) {\n        while (--chWidth) {\n          // other than a regular empty cell a cell following a wide char has no width\n          bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n        }\n      }\n    }\n\n    this._parser.precedingJoinState = precedingJoinState;\n\n    // handle wide chars: reset cell to the right if it is second cell of a wide char\n    if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n      bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n    }\n\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Forward registerCsiHandler from parser.\n   */\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n    if (id.final === 't' && !id.prefix && !id.intermediates) {\n      // security: always check whether window option is allowed\n      return this._parser.registerCsiHandler(id, params => {\n        if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n          return true;\n        }\n        return callback(params);\n      });\n    }\n    return this._parser.registerCsiHandler(id, callback);\n  }\n\n  /**\n   * Forward registerDcsHandler from parser.\n   */\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n  }\n\n  /**\n   * Forward registerEscHandler from parser.\n   */\n  public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerEscHandler(id, callback);\n  }\n\n  /**\n   * Forward registerOscHandler from parser.\n   */\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerOscHandler(ident, new OscHandler(callback));\n  }\n\n  /**\n   * Forward registerApcHandler from parser.\n   */\n  public registerApcHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerApcHandler(ident, new ApcHandler(callback));\n  }\n\n  /**\n   * BEL\n   * Bell (Ctrl-G).\n   *\n   * @vt: #Y   C0    BEL   \"Bell\"  \"\\a, \\x07\"  \"Ring the bell.\"\n   * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n   * and `ITerminalOptions.bellSound`.\n   */\n  public bell(): boolean {\n    this._onRequestBell.fire();\n    return true;\n  }\n\n  /**\n   * LF\n   * Line Feed or New Line (NL).  (LF  is Ctrl-J).\n   *\n   * @vt: #Y   C0    LF   \"Line Feed\"            \"\\n, \\x0A\"  \"Move the cursor one row down, scrolling if needed.\"\n   * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n   *\n   * @vt: #Y   C0    VT   \"Vertical Tabulation\"  \"\\v, \\x0B\"  \"Treated as LF.\"\n   * @vt: #Y   C0    FF   \"Form Feed\"            \"\\f, \\x0C\"  \"Treated as LF.\"\n   */\n  public lineFeed(): boolean {\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    if (this._optionsService.rawOptions.convertEol) {\n      this._activeBuffer.x = 0;\n    }\n    this._activeBuffer.y++;\n    if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n      this._activeBuffer.y--;\n      this._bufferService.scroll(this._eraseAttrData());\n    } else if (this._activeBuffer.y >= this._bufferService.rows) {\n      this._activeBuffer.y = this._bufferService.rows - 1;\n    } else {\n      // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n      // the line. This is particularly important on conpty/Windows where revisiting lines to\n      // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n      // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n      // 21376 and above.\n      this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n    }\n    // If the end of the line is hit, prevent this action from wrapping around to the next line.\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      this._activeBuffer.x--;\n    }\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n    this._onLineFeed.fire();\n    return true;\n  }\n\n  /**\n   * CR\n   * Carriage Return (Ctrl-M).\n   *\n   * @vt: #Y   C0    CR   \"Carriage Return\"  \"\\r, \\x0D\"  \"Move the cursor to the beginning of the row.\"\n   */\n  public carriageReturn(): boolean {\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * BS\n   * Backspace (Ctrl-H).\n   *\n   * @vt: #Y   C0    BS   \"Backspace\"  \"\\b, \\x08\"  \"Move the cursor one position to the left.\"\n   * By default it is not possible to move the cursor past the leftmost position.\n   * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n   * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n   * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n   * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n   */\n  public backspace(): boolean {\n    // reverse wrap-around is disabled\n    if (!this._coreService.decPrivateModes.reverseWraparound) {\n      this._restrictCursor();\n      if (this._activeBuffer.x > 0) {\n        this._activeBuffer.x--;\n      }\n      return true;\n    }\n\n    // reverse wrap-around is enabled\n    // other than for normal operation mode, reverse wrap-around allows the cursor\n    // to be at x=cols to be able to address the last cell of a row by BS\n    this._restrictCursor(this._bufferService.cols);\n\n    if (this._activeBuffer.x > 0) {\n      this._activeBuffer.x--;\n    } else {\n      /**\n       * reverse wrap-around handling:\n       * Our implementation deviates from xterm on purpose. Details:\n       * - only previous soft NLs can be reversed (isWrapped=true)\n       * - only works within scrollborders (top/bottom, left/right not yet supported)\n       * - cannot peek into scrollbuffer\n       * - any cursor movement sequence keeps working as expected\n       */\n      if (this._activeBuffer.x === 0\n        && this._activeBuffer.y > this._activeBuffer.scrollTop\n        && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n        && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n        this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n        this._activeBuffer.y--;\n        this._activeBuffer.x = this._bufferService.cols - 1;\n        // find last taken cell - last cell can have 3 different states:\n        // - hasContent(true) + hasWidth(1): narrow char - we are done\n        // - hasWidth(0): second part of wide char - we are done\n        // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n        //   cell further back\n        const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n        if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n          this._activeBuffer.x--;\n          // We do this only once, since width=1 + hasContent=false currently happens only once\n          // before early wrapping of a wide char.\n          // This needs to be fixed once we support graphemes taking more than 2 cells.\n        }\n      }\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n  /**\n   * TAB\n   * Horizontal Tab (HT) (Ctrl-I).\n   *\n   * @vt: #Y   C0    HT   \"Horizontal Tabulation\"  \"\\t, \\x09\"  \"Move the cursor to the next character tab stop.\"\n   */\n  public tab(): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    const originalX = this._activeBuffer.x;\n    this._activeBuffer.x = this._activeBuffer.nextStop();\n    if (this._optionsService.rawOptions.screenReaderMode) {\n      this._onA11yTab.fire(this._activeBuffer.x - originalX);\n    }\n    return true;\n  }\n\n  /**\n   * SO\n   * Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This invokes the\n   * G1 character set.\n   *\n   * @vt: #P[Only limited ISO-2022 charset support.]  C0    SO   \"Shift Out\"  \"\\x0E\"  \"Switch to an alternative character set.\"\n   */\n  public shiftOut(): boolean {\n    this._charsetService.setgLevel(1);\n    return true;\n  }\n\n  /**\n   * SI\n   * Shift In (Ctrl-O) -> Switch to Standard Character Set.  This invokes the G0\n   * character set (the default).\n   *\n   * @vt: #Y   C0    SI   \"Shift In\"   \"\\x0F\"  \"Return to regular character set after Shift Out.\"\n   */\n  public shiftIn(): boolean {\n    this._charsetService.setgLevel(0);\n    return true;\n  }\n\n  /**\n   * Restrict cursor to viewport size / scroll margin (origin mode).\n   */\n  private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n    this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n    this._activeBuffer.y = this._coreService.decPrivateModes.origin\n      ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n      : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Set absolute cursor position.\n   */\n  private _setCursor(x: number, y: number): void {\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    if (this._coreService.decPrivateModes.origin) {\n      this._activeBuffer.x = x;\n      this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n    } else {\n      this._activeBuffer.x = x;\n      this._activeBuffer.y = y;\n    }\n    this._restrictCursor();\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Set relative cursor position.\n   */\n  private _moveCursor(x: number, y: number): void {\n    // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n    // before calculating the new position\n    this._restrictCursor();\n    this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n  }\n\n  /**\n   * CSI Ps A\n   * Cursor Up Ps Times (default = 1) (CUU).\n   *\n   * @vt: #Y CSI CUU   \"Cursor Up\"   \"CSI Ps A\"  \"Move cursor `Ps` times up (default=1).\"\n   * If the cursor would pass the top scroll margin, it will stop there.\n   */\n  public cursorUp(params: IParams): boolean {\n    // stop at scrollTop\n    const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n    if (diffToTop >= 0) {\n      this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n    } else {\n      this._moveCursor(0, -(params.params[0] || 1));\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps B\n   * Cursor Down Ps Times (default = 1) (CUD).\n   *\n   * @vt: #Y CSI CUD   \"Cursor Down\"   \"CSI Ps B\"  \"Move cursor `Ps` times down (default=1).\"\n   * If the cursor would pass the bottom scroll margin, it will stop there.\n   */\n  public cursorDown(params: IParams): boolean {\n    // stop at scrollBottom\n    const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n    if (diffToBottom >= 0) {\n      this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n    } else {\n      this._moveCursor(0, params.params[0] || 1);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps C\n   * Cursor Forward Ps Times (default = 1) (CUF).\n   *\n   * @vt: #Y CSI CUF   \"Cursor Forward\"    \"CSI Ps C\"  \"Move cursor `Ps` times forward (default=1).\"\n   */\n  public cursorForward(params: IParams): boolean {\n    this._moveCursor(params.params[0] || 1, 0);\n    return true;\n  }\n\n  /**\n   * CSI Ps D\n   * Cursor Backward Ps Times (default = 1) (CUB).\n   *\n   * @vt: #Y CSI CUB   \"Cursor Backward\"   \"CSI Ps D\"  \"Move cursor `Ps` times backward (default=1).\"\n   */\n  public cursorBackward(params: IParams): boolean {\n    this._moveCursor(-(params.params[0] || 1), 0);\n    return true;\n  }\n\n  /**\n   * CSI Ps E\n   * Cursor Next Line Ps Times (default = 1) (CNL).\n   * Other than cursorDown (CUD) also set the cursor to first column.\n   *\n   * @vt: #Y CSI CNL   \"Cursor Next Line\"  \"CSI Ps E\"  \"Move cursor `Ps` times down (default=1) and to the first column.\"\n   * Same as CUD, additionally places the cursor at the first column.\n   */\n  public cursorNextLine(params: IParams): boolean {\n    this.cursorDown(params);\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * CSI Ps F\n   * Cursor Previous Line Ps Times (default = 1) (CPL).\n   * Other than cursorUp (CUU) also set the cursor to first column.\n   *\n   * @vt: #Y CSI CPL   \"Cursor Backward\"   \"CSI Ps F\"  \"Move cursor `Ps` times up (default=1) and to the first column.\"\n   * Same as CUU, additionally places the cursor at the first column.\n   */\n  public cursorPrecedingLine(params: IParams): boolean {\n    this.cursorUp(params);\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * CSI Ps G\n   * Cursor Character Absolute  [column] (default = [row,1]) (CHA).\n   *\n   * @vt: #Y CSI CHA   \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n   */\n  public cursorCharAbsolute(params: IParams): boolean {\n    this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps H\n   * Cursor Position [row;column] (default = [1,1]) (CUP).\n   *\n   * @vt: #Y CSI CUP   \"Cursor Position\"   \"CSI Ps ; Ps H\"  \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n   * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n   * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n   * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n   */\n  public cursorPosition(params: IParams): boolean {\n    this._setCursor(\n      // col\n      (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n      // row\n      (params.params[0] || 1) - 1\n    );\n    return true;\n  }\n\n  /**\n   * CSI Pm `  Character Position Absolute\n   *   [column] (default = [row,1]) (HPA).\n   * Currently same functionality as CHA.\n   *\n   * @vt: #Y CSI HPA   \"Horizontal Position Absolute\"  \"CSI Ps ` \" \"Same as CHA.\"\n   */\n  public charPosAbsolute(params: IParams): boolean {\n    this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Pm a  Character Position Relative\n   *   [columns] (default = [row,col+1]) (HPR)\n   *\n   * @vt: #Y CSI HPR   \"Horizontal Position Relative\"  \"CSI Ps a\"  \"Same as CUF.\"\n   */\n  public hPositionRelative(params: IParams): boolean {\n    this._moveCursor(params.params[0] || 1, 0);\n    return true;\n  }\n\n  /**\n   * CSI Pm d  Vertical Position Absolute (VPA)\n   *   [row] (default = [1,column])\n   *\n   * @vt: #Y CSI VPA   \"Vertical Position Absolute\"    \"CSI Ps d\"  \"Move cursor to `Ps`-th row (default=1).\"\n   */\n  public linePosAbsolute(params: IParams): boolean {\n    this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n    return true;\n  }\n\n  /**\n   * CSI Pm e  Vertical Position Relative (VPR)\n   *   [rows] (default = [row+1,column])\n   * reuse CSI Ps B ?\n   *\n   * @vt: #Y CSI VPR   \"Vertical Position Relative\"    \"CSI Ps e\"  \"Move cursor `Ps` times down (default=1).\"\n   */\n  public vPositionRelative(params: IParams): boolean {\n    this._moveCursor(0, params.params[0] || 1);\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps f\n   *   Horizontal and Vertical Position [row;column] (default =\n   *   [1,1]) (HVP).\n   *   Same as CUP.\n   *\n   * @vt: #Y CSI HVP   \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\"  \"Same as CUP.\"\n   */\n  public hVPosition(params: IParams): boolean {\n    this.cursorPosition(params);\n    return true;\n  }\n\n  /**\n   * CSI Ps g  Tab Clear (TBC).\n   *     Ps = 0  -> Clear Current Column (default).\n   *     Ps = 3  -> Clear All.\n   * Potentially:\n   *   Ps = 2  -> Clear Stops on Line.\n   *   http://vt100.net/annarbor/aaa-ug/section6.html\n   *\n   * @vt: #Y CSI TBC   \"Tab Clear\" \"CSI Ps g\"  \"Clear tab stops at current position (0) or all (3) (default=0).\"\n   * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n   */\n  public tabClear(params: IParams): boolean {\n    const param = params.params[0];\n    if (param === 0) {\n      delete this._activeBuffer.tabs[this._activeBuffer.x];\n    } else if (param === 3) {\n      this._activeBuffer.tabs = {};\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps I\n   *   Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n   *\n   * @vt: #Y CSI CHT   \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n   */\n  public cursorForwardTab(params: IParams): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    let param = params.params[0] || 1;\n    while (param--) {\n      this._activeBuffer.x = this._activeBuffer.nextStop();\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps Z  Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n   *\n   * @vt: #Y CSI CBT   \"Cursor Backward Tabulation\"  \"CSI Ps Z\"  \"Move cursor `Ps` tabs backward (default=1).\"\n   */\n  public cursorBackwardTab(params: IParams): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.x = this._activeBuffer.prevStop();\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps \" q  Select Character Protection Attribute (DECSCA).\n   *\n   * @vt: #Y CSI DECSCA   \"Select Character Protection Attribute\"  \"CSI Ps \" q\"  \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n   */\n  public selectProtected(params: IParams): boolean {\n    const p = params.params[0];\n    if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n    if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n    return true;\n  }\n\n\n  /**\n   * Helper method to erase cells in a terminal row.\n   * The cell gets replaced with the eraseChar of the terminal.\n   * @param y The row index relative to the viewport.\n   * @param start The start x index of the range to be erased.\n   * @param end The end x index of the range to be erased (exclusive).\n   * @param clearWrap clear the isWrapped flag\n   * @param respectProtect Whether to respect the protection attribute (DECSCA).\n   */\n  private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n    if (!line) {\n      return;\n    }\n    line.replaceCells(\n      start,\n      end,\n      this._activeBuffer.getNullCell(this._eraseAttrData()),\n      respectProtect\n    );\n    if (clearWrap) {\n      line.isWrapped = false;\n    }\n  }\n\n  /**\n   * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n   * the terminal and the isWrapped property is set to false.\n   * @param y row index\n   */\n  private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n    if (line) {\n      line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n      this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n      line.isWrapped = false;\n    }\n  }\n\n  /**\n   * CSI Ps J  Erase in Display (ED).\n   *     Ps = 0  -> Erase Below (default).\n   *     Ps = 1  -> Erase Above.\n   *     Ps = 2  -> Erase All.\n   *     Ps = 3  -> Erase Saved Lines (xterm).\n   * CSI ? Ps J\n   *   Erase in Display (DECSED).\n   *     Ps = 0  -> Selective Erase Below (default).\n   *     Ps = 1  -> Selective Erase Above.\n   *     Ps = 2  -> Selective Erase All.\n   *\n   * @vt: #Y CSI ED  \"Erase In Display\"  \"CSI Ps J\"  \"Erase various parts of the viewport.\"\n   * Supported param values:\n   *\n   * | Ps | Effect                                                       |\n   * | -- | ------------------------------------------------------------ |\n   * | 0  | Erase from the cursor through the end of the viewport.       |\n   * | 1  | Erase from the beginning of the viewport through the cursor. |\n   * | 2  | Erase complete viewport.                                     |\n   * | 3  | Erase scrollback.                                            |\n   *\n   * @vt: #Y CSI DECSED   \"Selective Erase In Display\"  \"CSI ? Ps J\"  \"Same as ED with respecting protection flag.\"\n   */\n  public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n    this._restrictCursor(this._bufferService.cols);\n    let j;\n    switch (params.params[0]) {\n      case 0:\n        j = this._activeBuffer.y;\n        this._dirtyRowTracker.markDirty(j);\n        this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n        for (; j < this._bufferService.rows; j++) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(j);\n        break;\n      case 1:\n        j = this._activeBuffer.y;\n        this._dirtyRowTracker.markDirty(j);\n        // Deleted front part of line and everything before. This line will no longer be wrapped.\n        this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n        if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n          // Deleted entire previous line. This next line can no longer be wrapped.\n          const nextLine = this._activeBuffer.lines.get(j + 1);\n          if (nextLine) {\n            nextLine.isWrapped = false;\n          }\n        }\n        while (j--) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(0);\n        break;\n      case 2:\n        if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n          j = this._bufferService.rows;\n          this._dirtyRowTracker.markRangeDirty(0, j - 1);\n          while (j--) {\n            const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n            if (currentLine?.getTrimmedLength()) {\n              break;\n            }\n          }\n          for (; j >= 0; j--) {\n            this._bufferService.scroll(this._eraseAttrData());\n          }\n        }\n        else {\n          j = this._bufferService.rows;\n          this._dirtyRowTracker.markDirty(j - 1);\n          while (j--) {\n            this._resetBufferLine(j, respectProtect);\n          }\n          this._dirtyRowTracker.markDirty(0);\n        }\n        break;\n      case 3:\n        // Clear scrollback (everything not in viewport)\n        const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n        if (scrollBackSize > 0) {\n          this._activeBuffer.lines.trimStart(scrollBackSize);\n          this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n          this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n          // Force a scroll event to refresh viewport\n          this._onScroll.fire(0);\n        }\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps K  Erase in Line (EL).\n   *     Ps = 0  -> Erase to Right (default).\n   *     Ps = 1  -> Erase to Left.\n   *     Ps = 2  -> Erase All.\n   * CSI ? Ps K\n   *   Erase in Line (DECSEL).\n   *     Ps = 0  -> Selective Erase to Right (default).\n   *     Ps = 1  -> Selective Erase to Left.\n   *     Ps = 2  -> Selective Erase All.\n   *\n   * @vt: #Y CSI EL    \"Erase In Line\"  \"CSI Ps K\"  \"Erase various parts of the active row.\"\n   * Supported param values:\n   *\n   * | Ps | Effect                                                   |\n   * | -- | -------------------------------------------------------- |\n   * | 0  | Erase from the cursor through the end of the row.        |\n   * | 1  | Erase from the beginning of the line through the cursor. |\n   * | 2  | Erase complete line.                                     |\n   *\n   * @vt: #Y CSI DECSEL   \"Selective Erase In Line\"  \"CSI ? Ps K\"  \"Same as EL with respecting protecting flag.\"\n   */\n  public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n    this._restrictCursor(this._bufferService.cols);\n    switch (params.params[0]) {\n      case 0:\n        this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n        break;\n      case 1:\n        this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n        break;\n      case 2:\n        this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n        break;\n    }\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Ps L\n   * Insert Ps Line(s) (default = 1) (IL).\n   *\n   * @vt: #Y CSI IL  \"Insert Line\"   \"CSI Ps L\"  \"Insert `Ps` blank lines at active row (default=1).\"\n   * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n   * The cursor is set to the first column.\n   * IL has no effect if the cursor is outside the scroll margins.\n   */\n  public insertLines(params: IParams): boolean {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n\n    const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n    const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n    const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1L\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n      this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n    this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n    return true;\n  }\n\n  /**\n   * CSI Ps M\n   * Delete Ps Line(s) (default = 1) (DL).\n   *\n   * @vt: #Y CSI DL  \"Delete Line\"   \"CSI Ps M\"  \"Delete `Ps` lines at active row (default=1).\"\n   * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n   * The cursor is set to the first column.\n   * DL has no effect if the cursor is outside the scroll margins.\n   */\n  public deleteLines(params: IParams): boolean {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n\n    const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n    let j: number;\n    j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n    j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1M\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      this._activeBuffer.lines.splice(row, 1);\n      this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n    this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n    return true;\n  }\n\n  /**\n   * CSI Ps @\n   * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n   *\n   * @vt: #Y CSI ICH  \"Insert Characters\"   \"CSI Ps @\"  \"Insert `Ps` (blank) characters (default = 1).\"\n   * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n   * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n   * past the right margin are lost.\n   *\n   *\n   * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n   */\n  public insertChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.insertCells(\n        this._activeBuffer.x,\n        params.params[0] || 1,\n        this._activeBuffer.getNullCell(this._eraseAttrData())\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps P\n   * Delete Ps Character(s) (default = 1) (DCH).\n   *\n   * @vt: #Y CSI DCH   \"Delete Character\"  \"CSI Ps P\"  \"Delete `Ps` characters (default=1).\"\n   * As characters are deleted, the remaining characters between the cursor and right margin move to\n   * the left. Character attributes move with the characters. The terminal adds blank characters at\n   * the right margin.\n   *\n   *\n   * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n   */\n  public deleteChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.deleteCells(\n        this._activeBuffer.x,\n        params.params[0] || 1,\n        this._activeBuffer.getNullCell(this._eraseAttrData())\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps S  Scroll up Ps lines (default = 1) (SU).\n   *\n   * @vt: #Y CSI SU  \"Scroll Up\"   \"CSI Ps S\"  \"Scroll `Ps` lines up (default=1).\"\n   *\n   *\n   * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n   */\n  public scrollUp(params: IParams): boolean {\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps T  Scroll down Ps lines (default = 1) (SD).\n   *\n   * @vt: #Y CSI SD  \"Scroll Down\"   \"CSI Ps T\"  \"Scroll `Ps` lines down (default=1).\"\n   */\n  public scrollDown(params: IParams): boolean {\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps SP @  Scroll left Ps columns (default = 1) (SL) ECMA-48\n   *\n   * Notation: (Pn)\n   * Representation: CSI Pn 02/00 04/00\n   * Parameter default value: Pn = 1\n   * SL causes the data in the presentation component to be moved by n character positions\n   * if the line orientation is horizontal, or by n line positions if the line orientation\n   * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n   * The active presentation position is not affected by this control function.\n   *\n   * Supported:\n   *   - always left shift (no line orientation setting respected)\n   *\n   * @vt: #Y CSI SL  \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n   * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n   * SL has no effect outside of the scroll margins.\n   */\n  public scrollLeft(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps SP A  Scroll right Ps columns (default = 1) (SR) ECMA-48\n   *\n   * Notation: (Pn)\n   * Representation: CSI Pn 02/00 04/01\n   * Parameter default value: Pn = 1\n   * SR causes the data in the presentation component to be moved by n character positions\n   * if the line orientation is horizontal, or by n line positions if the line orientation\n   * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n   * The active presentation position is not affected by this control function.\n   *\n   * Supported:\n   *   - always right shift (no line orientation setting respected)\n   *\n   * @vt: #Y CSI SR  \"Scroll Right\"  \"CSI Ps SP A\"   \"Scroll viewport `Ps` times to the right.\"\n   * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n   * Content at the right margin is lost.\n   * SL has no effect outside of the scroll margins.\n   */\n  public scrollRight(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Pm ' }\n   * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n   *\n   * @vt: #Y CSI DECIC \"Insert Columns\"  \"CSI Ps ' }\"  \"Insert `Ps` columns at cursor position.\"\n   * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n   * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n   * outside the scrolling margins.\n   */\n  public insertColumns(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Pm ' ~\n   * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n   *\n   * @vt: #Y CSI DECDC \"Delete Columns\"  \"CSI Ps ' ~\"  \"Delete `Ps` columns at cursor position.\"\n   * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n   * moving content to the left. Blank columns are added at the right margin.\n   * DECDC has no effect outside the scrolling margins.\n   */\n  public deleteColumns(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps X\n   * Erase Ps Character(s) (default = 1) (ECH).\n   *\n   * @vt: #Y CSI ECH   \"Erase Character\"   \"CSI Ps X\"  \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n   * ED erases `Ps` characters from current cursor position to the right.\n   * ED works inside or outside the scrolling margins.\n   */\n  public eraseChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.replaceCells(\n        this._activeBuffer.x,\n        this._activeBuffer.x + (params.params[0] || 1),\n        this._activeBuffer.getNullCell(this._eraseAttrData())\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps b  Repeat the preceding graphic character Ps times (REP).\n   * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n   *    Notation: (Pn)\n   *    Representation: CSI Pn 06/02\n   *    Parameter default value: Pn = 1\n   *    REP is used to indicate that the preceding character in the data stream,\n   *    if it is a graphic character (represented by one or more bit combinations) including SPACE,\n   *    is to be repeated n times, where n equals the value of Pn.\n   *    If the character preceding REP is a control function or part of a control function,\n   *    the effect of REP is not defined by this Standard.\n   *\n   * We extend xterm's behavior to allow repeating entire grapheme clusters.\n   * This isn't 100% xterm-compatible, but it seems saner and more useful.\n   *    - text attrs are applied normally\n   *    - wrap around is respected\n   *    - any valid sequence resets the carried forward char\n   *\n   * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n   * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n   *\n   * @vt: #Y CSI REP   \"Repeat Preceding Character\"    \"CSI Ps b\"  \"Repeat preceding character `Ps` times (default=1).\"\n   * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n   * set. REP has no effect if the sequence does not follow a printable ASCII character\n   * (NOOP for any other sequence in between or NON ASCII characters).\n   */\n  public repeatPrecedingCharacter(params: IParams): boolean {\n    const joinState = this._parser.precedingJoinState;\n    if (!joinState) {\n      return true;\n    }\n    // call print to insert the chars and handle correct wrapping\n    const length = params.params[0] || 1;\n    const chWidth = UnicodeService.extractWidth(joinState);\n    const x = this._activeBuffer.x - chWidth;\n    const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n    const text = bufferRow.getString(x);\n    const data = new Uint32Array(text.length * length);\n    let idata = 0;\n    for (let itext = 0; itext < text.length;) {\n      const ch = text.codePointAt(itext) || 0;\n      data[idata++] = ch;\n      itext += ch > 0xffff ? 2 : 1;\n    }\n    let tlength = idata;\n    for (let i = 1; i < length; ++i) {\n      data.copyWithin(tlength, 0, idata);\n      tlength += idata;\n    }\n    this.print(data, 0, tlength);\n    return true;\n  }\n\n  /**\n   * CSI Ps c  Send Device Attributes (Primary DA).\n   *     Ps = 0  or omitted -> request attributes from terminal.  The\n   *     response depends on the decTerminalID resource setting.\n   *     -> CSI ? 1 ; 2 c  (``VT100 with Advanced Video Option'')\n   *     -> CSI ? 1 ; 0 c  (``VT101 with No Options'')\n   *     -> CSI ? 6 c  (``VT102'')\n   *     -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c  (``VT220'')\n   *   The VT100-style response parameters do not mean anything by\n   *   themselves.  VT220 parameters do, telling the host what fea-\n   *   tures the terminal supports:\n   *     Ps = 1  -> 132-columns.\n   *     Ps = 2  -> Printer.\n   *     Ps = 6  -> Selective erase.\n   *     Ps = 8  -> User-defined keys.\n   *     Ps = 9  -> National replacement character sets.\n   *     Ps = 1 5  -> Technical characters.\n   *     Ps = 2 2  -> ANSI color, e.g., VT525.\n   *     Ps = 2 9  -> ANSI text locator (i.e., DEC Locator mode).\n   *\n   * @vt: #Y CSI DA1   \"Primary Device Attributes\"     \"CSI c\"  \"Send primary device attributes.\"\n   *\n   *\n   * TODO: fix and cleanup response\n   */\n  public sendDeviceAttributesPrimary(params: IParams): boolean {\n    if (params.params[0] > 0) {\n      return true;\n    }\n    if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n    } else if (this._is('linux')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n    }\n    return true;\n  }\n\n  /**\n   * CSI > Ps c\n   *   Send Device Attributes (Secondary DA).\n   *     Ps = 0  or omitted -> request the terminal's identification\n   *     code.  The response depends on the decTerminalID resource set-\n   *     ting.  It should apply only to VT220 and up, but xterm extends\n   *     this to VT100.\n   *     -> CSI  > Pp ; Pv ; Pc c\n   *   where Pp denotes the terminal type\n   *     Pp = 0  -> ``VT100''.\n   *     Pp = 1  -> ``VT220''.\n   *   and Pv is the firmware version (for xterm, this was originally\n   *   the XFree86 patch number, starting with 95).  In a DEC termi-\n   *   nal, Pc indicates the ROM cartridge registration number and is\n   *   always zero.\n   * More information:\n   *   xterm/charproc.c - line 2012, for more information.\n   *   vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n   *\n   * @vt: #Y CSI DA2   \"Secondary Device Attributes\"   \"CSI > c\" \"Send primary device attributes.\"\n   *\n   *\n   * TODO: fix and cleanup response\n   */\n  public sendDeviceAttributesSecondary(params: IParams): boolean {\n    if (params.params[0] > 0) {\n      return true;\n    }\n    // xterm and urxvt\n    // seem to spit this\n    // out around ~370 times (?).\n    if (this._is('xterm')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n    } else if (this._is('rxvt-unicode')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n    } else if (this._is('linux')) {\n      // not supported by linux console.\n      // linux console echoes parameters.\n      this._coreService.triggerDataEvent(params.params[0] + 'c');\n    } else if (this._is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n    }\n    return true;\n  }\n\n  /**\n   * CSI > Ps q\n   *   Ps = 0  => Report xterm name and version (XTVERSION).\n   *\n   * The response is a DCS sequence identifying the version: DCS > | text ST\n   *\n   * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n   */\n  public sendXtVersion(params: IParams): boolean {\n    if (params.params[0] > 0) {\n      return true;\n    }\n    this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n    return true;\n  }\n\n  /**\n   * Evaluate if the current terminal is the given argument.\n   * @param term The terminal name to evaluate\n   */\n  private _is(term: string): boolean {\n    return (this._optionsService.rawOptions.termName + '').startsWith(term);\n  }\n\n  /**\n   * CSI Pm h  Set Mode (SM).\n   *     Ps = 2  -> Keyboard Action Mode (AM).\n   *     Ps = 4  -> Insert Mode (IRM).\n   *     Ps = 1 2  -> Send/receive (SRM).\n   *     Ps = 2 0  -> Automatic Newline (LNM).\n   *\n   * @vt: #P[Only IRM is supported.]    CSI SM    \"Set Mode\"  \"CSI Pm h\"  \"Set various terminal modes.\"\n   * Supported param values by SM:\n   *\n   * | Param | Action                                 | Support |\n   * | ----- | -------------------------------------- | ------- |\n   * | 2     | Keyboard Action Mode (KAM). Always on. | #N      |\n   * | 4     | Insert Mode (IRM).                     | #Y      |\n   * | 12    | Send/receive (SRM). Always off.        | #N      |\n   * | 20    | Automatic Newline (LNM).               | #Y      |\n   */\n  public setMode(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._coreService.modes.insertMode = true;\n          break;\n        case 20:\n          this._optionsService.options.convertEol = true;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI ? Pm h\n   *   DEC Private Mode Set (DECSET).\n   *     Ps = 1  -> Application Cursor Keys (DECCKM).\n   *     Ps = 2  -> Designate USASCII for character sets G0-G3\n   *     (DECANM), and set VT100 mode.\n   *     Ps = 3  -> 132 Column Mode (DECCOLM).\n   *     Ps = 4  -> Smooth (Slow) Scroll (DECSCLM).\n   *     Ps = 5  -> Reverse Video (DECSCNM).\n   *     Ps = 6  -> Origin Mode (DECOM).\n   *     Ps = 7  -> Wraparound Mode (DECAWM).\n   *     Ps = 8  -> Auto-repeat Keys (DECARM).\n   *     Ps = 9  -> Send Mouse X & Y on button press.  See the sec-\n   *     tion Mouse Tracking.\n   *     Ps = 1 0  -> Show toolbar (rxvt).\n   *     Ps = 1 2  -> Start Blinking Cursor (att610).\n   *     Ps = 1 8  -> Print form feed (DECPFF).\n   *     Ps = 1 9  -> Set print extent to full screen (DECPEX).\n   *     Ps = 2 5  -> Show Cursor (DECTCEM).\n   *     Ps = 3 0  -> Show scrollbar (rxvt).\n   *     Ps = 3 5  -> Enable font-shifting functions (rxvt).\n   *     Ps = 3 8  -> Enter Tektronix Mode (DECTEK).\n   *     Ps = 4 0  -> Allow 80 -> 132 Mode.\n   *     Ps = 4 1  -> more(1) fix (see curses resource).\n   *     Ps = 4 2  -> Enable Nation Replacement Character sets (DECN-\n   *     RCM).\n   *     Ps = 4 4  -> Turn On Margin Bell.\n   *     Ps = 4 5  -> Reverse-wraparound Mode.\n   *     Ps = 4 6  -> Start Logging.  This is normally disabled by a\n   *     compile-time option.\n   *     Ps = 4 7  -> Use Alternate Screen Buffer.  (This may be dis-\n   *     abled by the titeInhibit resource).\n   *     Ps = 6 6  -> Application keypad (DECNKM).\n   *     Ps = 6 7  -> Backarrow key sends backspace (DECBKM).\n   *     Ps = 1 0 0 0  -> Send Mouse X & Y on button press and\n   *     release.  See the section Mouse Tracking.\n   *     Ps = 1 0 0 1  -> Use Hilite Mouse Tracking.\n   *     Ps = 1 0 0 2  -> Use Cell Motion Mouse Tracking.\n   *     Ps = 1 0 0 3  -> Use All Motion Mouse Tracking.\n   *     Ps = 1 0 0 4  -> Send FocusIn/FocusOut events.\n   *     Ps = 1 0 0 5  -> Enable Extended Mouse Mode.\n   *     Ps = 1 0 1 0  -> Scroll to bottom on tty output (rxvt).\n   *     Ps = 1 0 1 1  -> Scroll to bottom on key press (rxvt).\n   *     Ps = 1 0 3 4  -> Interpret \"meta\" key, sets eighth bit.\n   *     (enables the eightBitInput resource).\n   *     Ps = 1 0 3 5  -> Enable special modifiers for Alt and Num-\n   *     Lock keys.  (This enables the numLock resource).\n   *     Ps = 1 0 3 6  -> Send ESC   when Meta modifies a key.  (This\n   *     enables the metaSendsEscape resource).\n   *     Ps = 1 0 3 7  -> Send DEL from the editing-keypad Delete\n   *     key.\n   *     Ps = 1 0 3 9  -> Send ESC  when Alt modifies a key.  (This\n   *     enables the altSendsEscape resource).\n   *     Ps = 1 0 4 0  -> Keep selection even if not highlighted.\n   *     (This enables the keepSelection resource).\n   *     Ps = 1 0 4 1  -> Use the CLIPBOARD selection.  (This enables\n   *     the selectToClipboard resource).\n   *     Ps = 1 0 4 2  -> Enable Urgency window manager hint when\n   *     Control-G is received.  (This enables the bellIsUrgent\n   *     resource).\n   *     Ps = 1 0 4 3  -> Enable raising of the window when Control-G\n   *     is received.  (enables the popOnBell resource).\n   *     Ps = 1 0 4 7  -> Use Alternate Screen Buffer.  (This may be\n   *     disabled by the titeInhibit resource).\n   *     Ps = 1 0 4 8  -> Save cursor as in DECSC.  (This may be dis-\n   *     abled by the titeInhibit resource).\n   *     Ps = 1 0 4 9  -> Save cursor as in DECSC and use Alternate\n   *     Screen Buffer, clearing it first.  (This may be disabled by\n   *     the titeInhibit resource).  This combines the effects of the 1\n   *     0 4 7  and 1 0 4 8  modes.  Use this with terminfo-based\n   *     applications rather than the 4 7  mode.\n   *     Ps = 1 0 5 0  -> Set terminfo/termcap function-key mode.\n   *     Ps = 1 0 5 1  -> Set Sun function-key mode.\n   *     Ps = 1 0 5 2  -> Set HP function-key mode.\n   *     Ps = 1 0 5 3  -> Set SCO function-key mode.\n   *     Ps = 1 0 6 0  -> Set legacy keyboard emulation (X11R6).\n   *     Ps = 1 0 6 1  -> Set VT220 keyboard emulation.\n   *     Ps = 2 0 0 4  -> Set bracketed paste mode.\n   * Modes:\n   *   http: *vt100.net/docs/vt220-rm/chapter4.html\n   *\n   * @vt: #P[See below for supported modes.]    CSI DECSET  \"DEC Private Set Mode\" \"CSI ? Pm h\"  \"Set various terminal attributes.\"\n   * Supported param values by DECSET:\n   *\n   * | param | Action                                                  | Support |\n   * | ----- | ------------------------------------------------------- | --------|\n   * | 1     | Application Cursor Keys (DECCKM).                       | #Y      |\n   * | 2     | Designate US-ASCII for character sets G0-G3 (DECANM).   | #Y      |\n   * | 3     | 132 Column Mode (DECCOLM).                              | #Y      |\n   * | 6     | Origin Mode (DECOM).                                    | #Y      |\n   * | 7     | Auto-wrap Mode (DECAWM).                                | #Y      |\n   * | 8     | Auto-repeat Keys (DECARM). Always on.                   | #N      |\n   * | 9     | X10 xterm mouse protocol.                               | #Y      |\n   * | 12    | Start Blinking Cursor.                                  | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n   * | 25    | Show Cursor (DECTCEM).                                  | #Y      |\n   * | 45    | Reverse wrap-around.                                    | #Y      |\n   * | 47    | Use Alternate Screen Buffer.                            | #Y      |\n   * | 66    | Application keypad (DECNKM).                            | #Y      |\n   * | 1000  | X11 xterm mouse protocol.                               | #Y      |\n   * | 1002  | Use Cell Motion Mouse Tracking.                         | #Y      |\n   * | 1003  | Use All Motion Mouse Tracking.                          | #Y      |\n   * | 1004  | Send FocusIn/FocusOut events                            | #Y      |\n   * | 1005  | Enable UTF-8 Mouse Mode.                                | #N      |\n   * | 1006  | Enable SGR Mouse Mode.                                  | #Y      |\n   * | 1015  | Enable urxvt Mouse Mode.                                | #N      |\n   * | 1016  | Enable SGR-Pixels Mouse Mode.                           | #Y      |\n   * | 1047  | Use Alternate Screen Buffer.                            | #Y      |\n   * | 1048  | Save cursor as in DECSC.                                | #Y      |\n   * | 1049  | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n   * | 2004  | Set bracketed paste mode.                               | #Y      |\n   *\n   *\n   * FIXME: implement DECSCNM, 1049 should clear altbuffer\n   */\n  public setModePrivate(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 1:\n          this._coreService.decPrivateModes.applicationCursorKeys = true;\n          break;\n        case 2:\n          this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n          // set VT100 mode here\n          break;\n        case 3:\n          /**\n           * DECCOLM - 132 column mode.\n           * This is only active if 'SetWinLines' (24) is enabled\n           * through `options.windowsOptions`.\n           */\n          if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n            this._bufferService.resize(132, this._bufferService.rows);\n            this._onRequestReset.fire();\n          }\n          break;\n        case 6:\n          this._coreService.decPrivateModes.origin = true;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._coreService.decPrivateModes.wraparound = true;\n          break;\n        case 12:\n          if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n            this._optionsService.options.cursorBlink = true;\n          }\n          break;\n        case 45:\n          this._coreService.decPrivateModes.reverseWraparound = true;\n          break;\n        case 66:\n          this._logService.debug('Serial port requested application keypad.');\n          this._coreService.decPrivateModes.applicationKeypad = true;\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 9: // X10 Mouse\n          // no release, no motion, no wheel, no modifiers.\n          this._mouseStateService.activeProtocol = 'X10';\n          break;\n        case 1000: // vt200 mouse\n          // no motion.\n          this._mouseStateService.activeProtocol = 'VT200';\n          break;\n        case 1002: // button event mouse\n          this._mouseStateService.activeProtocol = 'DRAG';\n          break;\n        case 1003: // any event mouse\n          // any event - sends motion events,\n          // even if there is no button held down.\n          this._mouseStateService.activeProtocol = 'ANY';\n          break;\n        case 1004: // send focusin/focusout events\n          // focusin: ^[[I\n          // focusout: ^[[O\n          this._coreService.decPrivateModes.sendFocus = true;\n          this._onRequestSendFocus.fire();\n          break;\n        case 1005: // utf8 ext mode mouse - removed in #2507\n          this._logService.debug('DECSET 1005 not supported (see #2507)');\n          break;\n        case 1006: // sgr ext mode mouse\n          this._mouseStateService.activeEncoding = 'SGR';\n          break;\n        case 1015: // urxvt ext mode mouse - removed in #2507\n          this._logService.debug('DECSET 1015 not supported (see #2507)');\n          break;\n        case 1016: // sgr pixels mode mouse\n          this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n          break;\n        case 25: // show cursor\n          this._coreService.isCursorHidden = false;\n          break;\n        case 1048: // alt screen cursor\n          this.saveCursor();\n          break;\n        case 1049: // alt screen buffer cursor\n          this.saveCursor();\n        // FALL-THROUGH\n        case 47: // alt screen buffer\n        case 1047: // alt screen buffer\n          // Swap kitty keyboard flags: save main, restore alt\n          if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n            const state = this._coreService.kittyKeyboard;\n            state.mainFlags = state.flags;\n            state.flags = state.altFlags;\n          }\n          this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n          this._coreService.isCursorInitialized = true;\n          this._onRequestRefreshRows.fire(undefined);\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._coreService.decPrivateModes.bracketedPasteMode = true;\n          break;\n        case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n          this._coreService.decPrivateModes.synchronizedOutput = true;\n          break;\n        case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n          if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n            this._coreService.decPrivateModes.colorSchemeUpdates = true;\n          }\n          break;\n        case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n          if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n            this._coreService.decPrivateModes.win32InputMode = true;\n          }\n          break;\n      }\n    }\n    return true;\n  }\n\n\n  /**\n   * CSI Pm l  Reset Mode (RM).\n   *     Ps = 2  -> Keyboard Action Mode (AM).\n   *     Ps = 4  -> Replace Mode (IRM).\n   *     Ps = 1 2  -> Send/receive (SRM).\n   *     Ps = 2 0  -> Normal Linefeed (LNM).\n   *\n   * @vt: #P[Only IRM is supported.]    CSI RM    \"Reset Mode\"  \"CSI Pm l\"  \"Set various terminal attributes.\"\n   * Supported param values by RM:\n   *\n   * | Param | Action                                 | Support |\n   * | ----- | -------------------------------------- | ------- |\n   * | 2     | Keyboard Action Mode (KAM). Always on. | #N      |\n   * | 4     | Replace Mode (IRM). (default)          | #Y      |\n   * | 12    | Send/receive (SRM). Always off.        | #N      |\n   * | 20    | Normal Linefeed (LNM).                 | #Y      |\n   *\n   *\n   * FIXME: why is LNM commented out?\n   */\n  public resetMode(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._coreService.modes.insertMode = false;\n          break;\n        case 20:\n          this._optionsService.options.convertEol = false;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI ? Pm l\n   *   DEC Private Mode Reset (DECRST).\n   *     Ps = 1  -> Normal Cursor Keys (DECCKM).\n   *     Ps = 2  -> Designate VT52 mode (DECANM).\n   *     Ps = 3  -> 80 Column Mode (DECCOLM).\n   *     Ps = 4  -> Jump (Fast) Scroll (DECSCLM).\n   *     Ps = 5  -> Normal Video (DECSCNM).\n   *     Ps = 6  -> Normal Cursor Mode (DECOM).\n   *     Ps = 7  -> No Wraparound Mode (DECAWM).\n   *     Ps = 8  -> No Auto-repeat Keys (DECARM).\n   *     Ps = 9  -> Don't send Mouse X & Y on button press.\n   *     Ps = 1 0  -> Hide toolbar (rxvt).\n   *     Ps = 1 2  -> Stop Blinking Cursor (att610).\n   *     Ps = 1 8  -> Don't print form feed (DECPFF).\n   *     Ps = 1 9  -> Limit print to scrolling region (DECPEX).\n   *     Ps = 2 5  -> Hide Cursor (DECTCEM).\n   *     Ps = 3 0  -> Don't show scrollbar (rxvt).\n   *     Ps = 3 5  -> Disable font-shifting functions (rxvt).\n   *     Ps = 4 0  -> Disallow 80 -> 132 Mode.\n   *     Ps = 4 1  -> No more(1) fix (see curses resource).\n   *     Ps = 4 2  -> Disable Nation Replacement Character sets (DEC-\n   *     NRCM).\n   *     Ps = 4 4  -> Turn Off Margin Bell.\n   *     Ps = 4 5  -> No Reverse-wraparound Mode.\n   *     Ps = 4 6  -> Stop Logging.  (This is normally disabled by a\n   *     compile-time option).\n   *     Ps = 4 7  -> Use Normal Screen Buffer.\n   *     Ps = 6 6  -> Numeric keypad (DECNKM).\n   *     Ps = 6 7  -> Backarrow key sends delete (DECBKM).\n   *     Ps = 1 0 0 0  -> Don't send Mouse X & Y on button press and\n   *     release.  See the section Mouse Tracking.\n   *     Ps = 1 0 0 1  -> Don't use Hilite Mouse Tracking.\n   *     Ps = 1 0 0 2  -> Don't use Cell Motion Mouse Tracking.\n   *     Ps = 1 0 0 3  -> Don't use All Motion Mouse Tracking.\n   *     Ps = 1 0 0 4  -> Don't send FocusIn/FocusOut events.\n   *     Ps = 1 0 0 5  -> Disable Extended Mouse Mode.\n   *     Ps = 1 0 1 0  -> Don't scroll to bottom on tty output\n   *     (rxvt).\n   *     Ps = 1 0 1 1  -> Don't scroll to bottom on key press (rxvt).\n   *     Ps = 1 0 3 4  -> Don't interpret \"meta\" key.  (This disables\n   *     the eightBitInput resource).\n   *     Ps = 1 0 3 5  -> Disable special modifiers for Alt and Num-\n   *     Lock keys.  (This disables the numLock resource).\n   *     Ps = 1 0 3 6  -> Don't send ESC  when Meta modifies a key.\n   *     (This disables the metaSendsEscape resource).\n   *     Ps = 1 0 3 7  -> Send VT220 Remove from the editing-keypad\n   *     Delete key.\n   *     Ps = 1 0 3 9  -> Don't send ESC  when Alt modifies a key.\n   *     (This disables the altSendsEscape resource).\n   *     Ps = 1 0 4 0  -> Do not keep selection when not highlighted.\n   *     (This disables the keepSelection resource).\n   *     Ps = 1 0 4 1  -> Use the PRIMARY selection.  (This disables\n   *     the selectToClipboard resource).\n   *     Ps = 1 0 4 2  -> Disable Urgency window manager hint when\n   *     Control-G is received.  (This disables the bellIsUrgent\n   *     resource).\n   *     Ps = 1 0 4 3  -> Disable raising of the window when Control-\n   *     G is received.  (This disables the popOnBell resource).\n   *     Ps = 1 0 4 7  -> Use Normal Screen Buffer, clearing screen\n   *     first if in the Alternate Screen.  (This may be disabled by\n   *     the titeInhibit resource).\n   *     Ps = 1 0 4 8  -> Restore cursor as in DECRC.  (This may be\n   *     disabled by the titeInhibit resource).\n   *     Ps = 1 0 4 9  -> Use Normal Screen Buffer and restore cursor\n   *     as in DECRC.  (This may be disabled by the titeInhibit\n   *     resource).  This combines the effects of the 1 0 4 7  and 1 0\n   *     4 8  modes.  Use this with terminfo-based applications rather\n   *     than the 4 7  mode.\n   *     Ps = 1 0 5 0  -> Reset terminfo/termcap function-key mode.\n   *     Ps = 1 0 5 1  -> Reset Sun function-key mode.\n   *     Ps = 1 0 5 2  -> Reset HP function-key mode.\n   *     Ps = 1 0 5 3  -> Reset SCO function-key mode.\n   *     Ps = 1 0 6 0  -> Reset legacy keyboard emulation (X11R6).\n   *     Ps = 1 0 6 1  -> Reset keyboard emulation to Sun/PC style.\n   *     Ps = 2 0 0 4  -> Reset bracketed paste mode.\n   *\n   * @vt: #P[See below for supported modes.]    CSI DECRST  \"DEC Private Reset Mode\" \"CSI ? Pm l\"  \"Reset various terminal attributes.\"\n   * Supported param values by DECRST:\n   *\n   * | param | Action                                                  | Support |\n   * | ----- | ------------------------------------------------------- | ------- |\n   * | 1     | Normal Cursor Keys (DECCKM).                            | #Y      |\n   * | 2     | Designate VT52 mode (DECANM).                           | #N      |\n   * | 3     | 80 Column Mode (DECCOLM).                               | #B[Switches to old column width instead of 80.] |\n   * | 6     | Normal Cursor Mode (DECOM).                             | #Y      |\n   * | 7     | No Wraparound Mode (DECAWM).                            | #Y      |\n   * | 8     | No Auto-repeat Keys (DECARM).                           | #N      |\n   * | 9     | Don't send Mouse X & Y on button press.                 | #Y      |\n   * | 12    | Stop Blinking Cursor.                                   | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n   * | 25    | Hide Cursor (DECTCEM).                                  | #Y      |\n   * | 45    | No reverse wrap-around.                                 | #Y      |\n   * | 47    | Use Normal Screen Buffer.                               | #Y      |\n   * | 66    | Numeric keypad (DECNKM).                                | #Y      |\n   * | 1000  | Don't send Mouse reports.                               | #Y      |\n   * | 1002  | Don't use Cell Motion Mouse Tracking.                   | #Y      |\n   * | 1003  | Don't use All Motion Mouse Tracking.                    | #Y      |\n   * | 1004  | Don't send FocusIn/FocusOut events.                     | #Y      |\n   * | 1005  | Disable UTF-8 Mouse Mode.                               | #N      |\n   * | 1006  | Disable SGR Mouse Mode.                                 | #Y      |\n   * | 1015  | Disable urxvt Mouse Mode.                               | #N      |\n   * | 1016  | Disable SGR-Pixels Mouse Mode.                          | #Y      |\n   * | 1047  | Use Normal Screen Buffer (clearing screen if in alt).   | #Y      |\n   * | 1048  | Restore cursor as in DECRC.                             | #Y      |\n   * | 1049  | Use Normal Screen Buffer and restore cursor.            | #Y      |\n   * | 2004  | Reset bracketed paste mode.                             | #Y      |\n   *\n   *\n   * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n   */\n  public resetModePrivate(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 1:\n          this._coreService.decPrivateModes.applicationCursorKeys = false;\n          break;\n        case 3:\n          /**\n           * DECCOLM - 80 column mode.\n           * This is only active if 'SetWinLines' (24) is enabled\n           * through `options.windowsOptions`.\n           */\n          if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n            this._bufferService.resize(80, this._bufferService.rows);\n            this._onRequestReset.fire();\n          }\n          break;\n        case 6:\n          this._coreService.decPrivateModes.origin = false;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._coreService.decPrivateModes.wraparound = false;\n          break;\n        case 12:\n          if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n            this._optionsService.options.cursorBlink = false;\n          }\n          break;\n        case 45:\n          this._coreService.decPrivateModes.reverseWraparound = false;\n          break;\n        case 66:\n          this._logService.debug('Switching back to normal keypad.');\n          this._coreService.decPrivateModes.applicationKeypad = false;\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 9: // X10 Mouse\n        case 1000: // vt200 mouse\n        case 1002: // button event mouse\n        case 1003: // any event mouse\n          this._mouseStateService.activeProtocol = 'NONE';\n          break;\n        case 1004: // send focusin/focusout events\n          this._coreService.decPrivateModes.sendFocus = false;\n          break;\n        case 1005: // utf8 ext mode mouse - removed in #2507\n          this._logService.debug('DECRST 1005 not supported (see #2507)');\n          break;\n        case 1006: // sgr ext mode mouse\n          this._mouseStateService.activeEncoding = 'DEFAULT';\n          break;\n        case 1015: // urxvt ext mode mouse - removed in #2507\n          this._logService.debug('DECRST 1015 not supported (see #2507)');\n          break;\n        case 1016: // sgr pixels mode mouse\n          this._mouseStateService.activeEncoding = 'DEFAULT';\n          break;\n        case 25: // hide cursor\n          this._coreService.isCursorHidden = true;\n          break;\n        case 1048: // alt screen cursor\n          this.restoreCursor();\n          break;\n        case 1049: // alt screen buffer cursor\n        // FALL-THROUGH\n        case 47: // normal screen buffer\n        case 1047: // normal screen buffer - clearing it first\n          // Swap kitty keyboard flags: save alt, restore main\n          if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n            const state = this._coreService.kittyKeyboard;\n            state.altFlags = state.flags;\n            state.flags = state.mainFlags;\n          }\n          // Ensure the selection manager has the correct buffer\n          this._bufferService.buffers.activateNormalBuffer();\n          if (params.params[i] === 1049) {\n            this.restoreCursor();\n          }\n          this._coreService.isCursorInitialized = true;\n          this._onRequestRefreshRows.fire(undefined);\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._coreService.decPrivateModes.bracketedPasteMode = false;\n          break;\n        case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n          this._coreService.decPrivateModes.synchronizedOutput = false;\n          this._onRequestRefreshRows.fire(undefined);\n          break;\n        case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n          if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n            this._coreService.decPrivateModes.colorSchemeUpdates = false;\n          }\n          break;\n        case 9001: // win32-input-mode\n          if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n            this._coreService.decPrivateModes.win32InputMode = false;\n          }\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps $ p Request ANSI Mode (DECRQM).\n   *\n   * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n   * and Pm is the mode value:\n   *    0 - not recognized\n   *    1 - set\n   *    2 - reset\n   *    3 - permanently set\n   *    4 - permanently reset\n   *\n   * @vt: #Y  CSI   DECRQM  \"Request Mode\"  \"CSI Ps $p\"  \"Request mode state.\"\n   * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n   * or DECSET/DECRST, and `Pm` is the mode value:\n   * - 0: not recognized\n   * - 1: set\n   * - 2: reset\n   * - 3: permanently set\n   * - 4: permanently reset\n   *\n   * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n   * that a certain operation mode is not implemented and cannot be used.\n   *\n   * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n   * and only report, whether the alternate buffer is set.\n   *\n   * Mouse encodings and mouse protocols are handled mutual exclusive,\n   * thus only one of each of those can be set at a given time.\n   *\n   * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n   * e.g. if the default implementation already exposes a certain behavior. If you find\n   * discrepancies in the mode reports, please file a bug.\n   */\n  public requestMode(params: IParams, ansi: boolean): boolean {\n    // return value as in DECRPM\n    const enum V {\n      NOT_RECOGNIZED = 0,\n      SET = 1,\n      RESET = 2,\n      PERMANENTLY_SET = 3,\n      PERMANENTLY_RESET = 4\n    }\n\n    // access helpers\n    const dm = this._coreService.decPrivateModes;\n    const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n    const cs = this._coreService;\n    const { buffers, cols } = this._bufferService;\n    const { active, alt } = buffers;\n    const opts = this._optionsService.rawOptions;\n\n    const f = (m: number, v: V): boolean => {\n      cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n      return true;\n    };\n    const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n    const p = params.params[0];\n\n    if (ansi) {\n      if (p === 2) return f(p, V.PERMANENTLY_RESET);\n      if (p === 4) return f(p, b2v(cs.modes.insertMode));\n      if (p === 12) return f(p, V.PERMANENTLY_SET);\n      if (p === 20) return f(p, b2v(opts.convertEol));\n      return f(p, V.NOT_RECOGNIZED);\n    }\n\n    if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n    if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n    if (p === 6) return f(p, b2v(dm.origin));\n    if (p === 7) return f(p, b2v(dm.wraparound));\n    if (p === 8) return f(p, V.PERMANENTLY_SET);\n    if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n    if (p === 12) return f(p, b2v(opts.cursorBlink));\n    if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n    if (p === 45) return f(p, b2v(dm.reverseWraparound));\n    if (p === 66) return f(p, b2v(dm.applicationKeypad));\n    if (p === 67) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n    if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n    if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n    if (p === 1004) return f(p, b2v(dm.sendFocus));\n    if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n    if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n    if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n    if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n    if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n    if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n    if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n    return f(p, V.NOT_RECOGNIZED);\n  }\n\n  /**\n   * Helper to write color information packed with color mode.\n   */\n  private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n    if (mode === 2) {\n      color |= Attributes.CM_RGB;\n      color &= ~Attributes.RGB_MASK;\n      color |= AttributeData.fromColorRGB([c1, c2, c3]);\n    } else if (mode === 5) {\n      color &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n      color |= Attributes.CM_P256 | (c1 & 0xff);\n    }\n    return color;\n  }\n\n  /**\n   * Helper to extract and apply color params/subparams.\n   * Returns advance for params index.\n   */\n  private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n    // normalize params\n    // meaning: [target, CM, ign, val, val, val]\n    // RGB    : [ 38/48,  2, ign,   r,   g,   b]\n    // P256   : [ 38/48,  5, ign,   v, ign, ign]\n    const accu = [0, 0, -1, 0, 0, 0];\n\n    // alignment placeholder for non color space sequences\n    let cSpace = 0;\n\n    // return advance we took in params\n    let advance = 0;\n\n    do {\n      accu[advance + cSpace] = params.params[pos + advance];\n      if (params.hasSubParams(pos + advance)) {\n        const subparams = params.getSubParams(pos + advance)!;\n        let i = 0;\n        do {\n          if (accu[1] === 5) {\n            cSpace = 1;\n          }\n          accu[advance + i + 1 + cSpace] = subparams[i];\n        } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n        break;\n      }\n      // exit early if can decide color mode with semicolons\n      if ((accu[1] === 5 && advance + cSpace >= 2)\n        || (accu[1] === 2 && advance + cSpace >= 5)) {\n        break;\n      }\n      // offset colorSpace slot for semicolon mode\n      if (accu[1]) {\n        cSpace = 1;\n      }\n    } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n    // set default values to 0\n    for (let i = 2; i < accu.length; ++i) {\n      if (accu[i] === -1) {\n        accu[i] = 0;\n      }\n    }\n\n    // apply colors\n    switch (accu[0]) {\n      case 38:\n        attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n        break;\n      case 48:\n        attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n        break;\n      case 58:\n        attr.extended = attr.extended.clone();\n        attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n    }\n\n    return advance;\n  }\n\n  /**\n   * SGR 4 subparams:\n   *    4:0   -   equal to SGR 24 (turn off all underline)\n   *    4:1   -   equal to SGR 4 (single underline)\n   *    4:2   -   equal to SGR 21 (double underline)\n   *    4:3   -   curly underline\n   *    4:4   -   dotted underline\n   *    4:5   -   dashed underline\n   */\n  private _processUnderline(style: number, attr: IAttributeData): void {\n    // treat extended attrs as immutable, thus always clone from old one\n    // this is needed since the buffer only holds references to it\n    attr.extended = attr.extended.clone();\n\n    // default to 1 == single underline\n    if (!~style || style > 5) {\n      style = 1;\n    }\n    attr.extended.underlineStyle = style;\n    attr.fg |= FgFlags.UNDERLINE;\n\n    // 0 deactivates underline\n    if (style === 0) {\n      attr.fg &= ~FgFlags.UNDERLINE;\n    }\n\n    // update HAS_EXTENDED in BG\n    attr.updateExtended();\n  }\n\n  private _processSGR0(attr: IAttributeData): void {\n    attr.fg = DEFAULT_ATTR_DATA.fg;\n    attr.bg = DEFAULT_ATTR_DATA.bg;\n    attr.extended = attr.extended.clone();\n    // Reset underline style and color. Note that we don't want to reset other\n    // fields such as the url id.\n    attr.extended.underlineStyle = UnderlineStyle.NONE;\n    attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    attr.updateExtended();\n  }\n\n  /**\n   * CSI Pm m  Character Attributes (SGR).\n   *\n   * @vt: #P[See below for supported attributes.]    CSI SGR   \"Select Graphic Rendition\"  \"CSI Pm m\"  \"Set/Reset various text attributes.\"\n   * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n   * are applied in order from left to right. The changed attributes are applied to all new\n   * characters received. If you move characters in the viewport by scrolling or any other means,\n   * then the attributes move with the characters.\n   *\n   * Supported param values by SGR:\n   *\n   * | Param     | Meaning                                                  | Support |\n   * | --------- | -------------------------------------------------------- | ------- |\n   * | 0         | Normal (default). Resets any other preceding SGR.        | #Y      |\n   * | 1         | Bold. (also see `options.drawBoldTextInBrightColors`)    | #Y      |\n   * | 2         | Faint, decreased intensity.                              | #Y      |\n   * | 3         | Italic.                                                  | #Y      |\n   * | 4         | Underlined (see below for style support).                | #Y      |\n   * | 5         | Slowly blinking.                                         | #N      |\n   * | 6         | Rapidly blinking.                                        | #N      |\n   * | 7         | Inverse. Flips foreground and background color.          | #Y      |\n   * | 8         | Invisible (hidden).                                      | #Y      |\n   * | 9         | Crossed-out characters (strikethrough).                  | #Y      |\n   * | 21        | Doubly underlined.                                       | #Y      |\n   * | 22        | Normal (neither bold nor faint).                         | #Y      |\n   * | 23        | No italic.                                               | #Y      |\n   * | 24        | Not underlined.                                          | #Y      |\n   * | 25        | Steady (not blinking).                                   | #Y      |\n   * | 27        | Positive (not inverse).                                  | #Y      |\n   * | 28        | Visible (not hidden).                                    | #Y      |\n   * | 29        | Not Crossed-out (strikethrough).                         | #Y      |\n   * | 30        | Foreground color: Black.                                 | #Y      |\n   * | 31        | Foreground color: Red.                                   | #Y      |\n   * | 32        | Foreground color: Green.                                 | #Y      |\n   * | 33        | Foreground color: Yellow.                                | #Y      |\n   * | 34        | Foreground color: Blue.                                  | #Y      |\n   * | 35        | Foreground color: Magenta.                               | #Y      |\n   * | 36        | Foreground color: Cyan.                                  | #Y      |\n   * | 37        | Foreground color: White.                                 | #Y      |\n   * | 38        | Foreground color: Extended color.                        | #P[Support for RGB and indexed colors, see below.] |\n   * | 39        | Foreground color: Default (original).                    | #Y      |\n   * | 40        | Background color: Black.                                 | #Y      |\n   * | 41        | Background color: Red.                                   | #Y      |\n   * | 42        | Background color: Green.                                 | #Y      |\n   * | 43        | Background color: Yellow.                                | #Y      |\n   * | 44        | Background color: Blue.                                  | #Y      |\n   * | 45        | Background color: Magenta.                               | #Y      |\n   * | 46        | Background color: Cyan.                                  | #Y      |\n   * | 47        | Background color: White.                                 | #Y      |\n   * | 48        | Background color: Extended color.                        | #P[Support for RGB and indexed colors, see below.] |\n   * | 49        | Background color: Default (original).                    | #Y      |\n   * | 53        | Overlined.                                               | #Y      |\n   * | 55        | Not Overlined.                                           | #Y      |\n   * | 58        | Underline color: Extended color.                         | #P[Support for RGB and indexed colors, see below.] |\n   * | 221       | Not bold (kitty extension).                              | #Y      |\n   * | 222       | Not faint (kitty extension).                             | #Y      |\n   * | 90 - 97   | Bright foreground color (analogous to 30 - 37).          | #Y      |\n   * | 100 - 107 | Bright background color (analogous to 40 - 47).          | #Y      |\n   *\n   * Underline supports subparams to denote the style in the form `4 : x`:\n   *\n   * | x      | Meaning                                                       | Support |\n   * | ------ | ------------------------------------------------------------- | ------- |\n   * | 0      | No underline. Same as `SGR 24 m`.                             | #Y      |\n   * | 1      | Single underline. Same as `SGR 4 m`.                          | #Y      |\n   * | 2      | Double underline.                                             | #Y      |\n   * | 3      | Curly underline.                                              | #Y      |\n   * | 4      | Dotted underline.                                             | #Y      |\n   * | 5      | Dashed underline.                                             | #Y      |\n   * | other  | Single underline. Same as `SGR 4 m`.                          | #Y      |\n   *\n   * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n   * as follows:\n   *\n   * | Ps + 1 | Meaning                                                       | Support |\n   * | ------ | ------------------------------------------------------------- | ------- |\n   * | 0      | Implementation defined.                                       | #N      |\n   * | 1      | Transparent.                                                  | #N      |\n   * | 2      | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`.  | #Y      |\n   * | 3      | CMY color.                                                    | #N      |\n   * | 4      | CMYK color.                                                   | #N      |\n   * | 5      | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y      |\n   *\n   *\n   * FIXME: blinking is implemented in attrs, but not working in renderers?\n   * FIXME: remove dead branch for p=100\n   */\n  public charAttributes(params: IParams): boolean {\n    // Optimize a single SGR0.\n    if (params.length === 1 && params.params[0] === 0) {\n      this._processSGR0(this._curAttrData);\n      return true;\n    }\n\n    const l = params.length;\n    let p;\n    const attr = this._curAttrData;\n\n    for (let i = 0; i < l; i++) {\n      p = params.params[i];\n      if (p >= 30 && p <= 37) {\n        // fg color 8\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.fg |= Attributes.CM_P16 | (p - 30);\n      } else if (p >= 40 && p <= 47) {\n        // bg color 8\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.bg |= Attributes.CM_P16 | (p - 40);\n      } else if (p >= 90 && p <= 97) {\n        // fg color 16\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n      } else if (p >= 100 && p <= 107) {\n        // bg color 16\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n      } else if (p === 0) {\n        // default\n        this._processSGR0(attr);\n      } else if (p === 1) {\n        // bold text\n        attr.fg |= FgFlags.BOLD;\n      } else if (p === 3) {\n        // italic text\n        attr.bg |= BgFlags.ITALIC;\n      } else if (p === 4) {\n        // underlined text\n        attr.fg |= FgFlags.UNDERLINE;\n        this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n      } else if (p === 5) {\n        // blink\n        attr.fg |= FgFlags.BLINK;\n      } else if (p === 7) {\n        // inverse and positive\n        // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n        attr.fg |= FgFlags.INVERSE;\n      } else if (p === 8) {\n        // invisible\n        attr.fg |= FgFlags.INVISIBLE;\n      } else if (p === 9) {\n        // strikethrough\n        attr.fg |= FgFlags.STRIKETHROUGH;\n      } else if (p === 2) {\n        // dimmed text\n        attr.bg |= BgFlags.DIM;\n      } else if (p === 21) {\n        // double underline\n        this._processUnderline(UnderlineStyle.DOUBLE, attr);\n      } else if (p === 22) {\n        // not bold nor faint\n        attr.fg &= ~FgFlags.BOLD;\n        attr.bg &= ~BgFlags.DIM;\n      } else if (p === 23) {\n        // not italic\n        attr.bg &= ~BgFlags.ITALIC;\n      } else if (p === 24) {\n        // not underlined\n        attr.fg &= ~FgFlags.UNDERLINE;\n        this._processUnderline(UnderlineStyle.NONE, attr);\n      } else if (p === 25) {\n        // not blink\n        attr.fg &= ~FgFlags.BLINK;\n      } else if (p === 27) {\n        // not inverse\n        attr.fg &= ~FgFlags.INVERSE;\n      } else if (p === 28) {\n        // not invisible\n        attr.fg &= ~FgFlags.INVISIBLE;\n      } else if (p === 29) {\n        // not strikethrough\n        attr.fg &= ~FgFlags.STRIKETHROUGH;\n      } else if (p === 39) {\n        // reset fg\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else if (p === 49) {\n        // reset bg\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else if (p === 38 || p === 48 || p === 58) {\n        // fg color 256 and RGB\n        i += this._extractColor(params, i, attr);\n      } else if (p === 53) {\n        // overline\n        attr.bg |= BgFlags.OVERLINE;\n      } else if (p === 55) {\n        // not overline\n        attr.bg &= ~BgFlags.OVERLINE;\n      } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n        // not bold (kitty extension)\n        attr.fg &= ~FgFlags.BOLD;\n      } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n        // not faint (kitty extension)\n        attr.bg &= ~BgFlags.DIM;\n      } else if (p === 59) {\n        attr.extended = attr.extended.clone();\n        attr.extended.underlineColor = -1;\n        attr.updateExtended();\n      } else {\n        this._logService.debug('Unknown SGR attribute: %d.', p);\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps n  Device Status Report (DSR).\n   *     Ps = 5  -> Status Report.  Result (``OK'') is\n   *   CSI 0 n\n   *     Ps = 6  -> Report Cursor Position (CPR) [row;column].\n   *   Result is\n   *   CSI r ; c R\n   * CSI ? Ps n\n   *   Device Status Report (DSR, DEC-specific).\n   *     Ps = 6  -> Report Cursor Position (CPR) [row;column] as CSI\n   *     ? r ; c R (assumes page is zero).\n   *     Ps = 1 5  -> Report Printer status as CSI ? 1 0  n  (ready).\n   *     or CSI ? 1 1  n  (not ready).\n   *     Ps = 2 5  -> Report UDK status as CSI ? 2 0  n  (unlocked)\n   *     or CSI ? 2 1  n  (locked).\n   *     Ps = 2 6  -> Report Keyboard status as\n   *   CSI ? 2 7  ;  1  ;  0  ;  0  n  (North American).\n   *   The last two parameters apply to VT400 & up, and denote key-\n   *   board ready and LK01 respectively.\n   *     Ps = 5 3  -> Report Locator status as\n   *   CSI ? 5 3  n  Locator available, if compiled-in, or\n   *   CSI ? 5 0  n  No Locator, if not.\n   *\n   * @vt: #Y CSI DSR   \"Device Status Report\"  \"CSI Ps n\"  \"Request cursor position (CPR) with `Ps` = 6.\"\n   */\n  public deviceStatus(params: IParams): boolean {\n    switch (params.params[0]) {\n      case 5:\n        // status report\n        this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n        break;\n      case 6:\n        // cursor position\n        const y = this._activeBuffer.y + 1;\n        const x = this._activeBuffer.x + 1;\n        this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n        break;\n    }\n    return true;\n  }\n\n  // @vt: #P[Only CPR is supported.]  CSI DECDSR  \"DEC Device Status Report\"  \"CSI ? Ps n\"  \"Only CPR is supported (same as DSR).\"\n  public deviceStatusPrivate(params: IParams): boolean {\n    // modern xterm doesnt seem to\n    // respond to any of these except ?6, 6, and 5\n    switch (params.params[0]) {\n      case 6:\n        // cursor position\n        const y = this._activeBuffer.y + 1;\n        const x = this._activeBuffer.x + 1;\n        this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n        break;\n      case 15:\n        // no printer\n        // this.handler(C0.ESC + '[?11n');\n        break;\n      case 25:\n        // dont support user defined keys\n        // this.handler(C0.ESC + '[?21n');\n        break;\n      case 26:\n        // north american keyboard\n        // this.handler(C0.ESC + '[?27;1;0;0n');\n        break;\n      case 53:\n        // no dec locator/mouse\n        // this.handler(C0.ESC + '[?50n');\n        break;\n      case 996:\n        // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n        if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n          this._onRequestColorSchemeQuery.fire();\n        }\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * CSI ! p   Soft terminal reset (DECSTR).\n   * http://vt100.net/docs/vt220-rm/table4-10.html\n   *\n   * @vt: #Y CSI DECSTR  \"Soft Terminal Reset\"   \"CSI ! p\"   \"Reset several terminal attributes to initial state.\"\n   * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n   * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n   * sufficient.\n   *\n   * The following terminal attributes are reset to default values:\n   * - IRM is reset (dafault = false)\n   * - scroll margins are reset (default = viewport size)\n   * - erase attributes are reset to default\n   * - charsets are reset\n   * - DECSC data is reset to initial values\n   * - DECOM is reset to absolute mode\n   *\n   *\n   * FIXME: there are several more attributes missing (see VT520 manual)\n   */\n  public softReset(params: IParams): boolean {\n    this._coreService.isCursorHidden = false;\n    this._onRequestSyncScrollBar.fire();\n    this._activeBuffer.scrollTop = 0;\n    this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n    this._curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._coreService.reset();\n    this._charsetService.reset();\n\n    // reset DECSC data\n    this._activeBuffer.savedX = 0;\n    this._activeBuffer.savedY = this._activeBuffer.ybase;\n    this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n    this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n    this._activeBuffer.savedCharset = this._charsetService.charset;\n\n    // reset DECOM\n    this._coreService.decPrivateModes.origin = false;\n    return true;\n  }\n\n  /**\n   * CSI Ps SP q  Set cursor style (DECSCUSR, VT520).\n   *   Ps = 0  -> reset to option.\n   *   Ps = 1  -> blinking block (default).\n   *   Ps = 2  -> steady block.\n   *   Ps = 3  -> blinking underline.\n   *   Ps = 4  -> steady underline.\n   *   Ps = 5  -> blinking bar (xterm).\n   *   Ps = 6  -> steady bar (xterm).\n   *\n   * @vt: #Y CSI DECSCUSR  \"Set Cursor Style\"  \"CSI Ps SP q\"   \"Set cursor style.\"\n   * Supported cursor styles:\n   *  - 0: reset to option\n   *  - empty, 1: blinking block\n   *  - 2: steady block\n   *  - 3: blinking underline\n   *  - 4: steady underline\n   *  - 5: blinking bar\n   *  - 6: steady bar\n   */\n  public setCursorStyle(params: IParams): boolean {\n    const param = params.length === 0 ? 1 : params.params[0];\n    if (param === 0) {\n      this._coreService.decPrivateModes.cursorStyle = undefined;\n      this._coreService.decPrivateModes.cursorBlink = undefined;\n    } else {\n      switch (param) {\n        case 1:\n        case 2:\n          this._coreService.decPrivateModes.cursorStyle = 'block';\n          break;\n        case 3:\n        case 4:\n          this._coreService.decPrivateModes.cursorStyle = 'underline';\n          break;\n        case 5:\n        case 6:\n          this._coreService.decPrivateModes.cursorStyle = 'bar';\n          break;\n      }\n      const isBlinking = param % 2 === 1;\n      this._coreService.decPrivateModes.cursorBlink = isBlinking;\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps r\n   *   Set Scrolling Region [top;bottom] (default = full size of win-\n   *   dow) (DECSTBM).\n   *\n   * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n   */\n  public setScrollRegion(params: IParams): boolean {\n    const top = params.params[0] || 1;\n    let bottom: number;\n\n    if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n      bottom = this._bufferService.rows;\n    }\n\n    if (bottom > top) {\n      this._activeBuffer.scrollTop = top - 1;\n      this._activeBuffer.scrollBottom = bottom - 1;\n      this._setCursor(0, 0);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n   *\n   * Note: Only those listed below are supported. All others are left to integrators and\n   * need special treatment based on the embedding environment.\n   *\n   *    Ps = 1 4                                                          supported\n   *      Report xterm text area size in pixels.\n   *      Result is CSI 4 ; height ; width t\n   *    Ps = 14 ; 2                                                       not implemented\n   *    Ps = 16                                                           supported\n   *      Report xterm character cell size in pixels.\n   *      Result is CSI 6 ; height ; width t\n   *    Ps = 18                                                           supported\n   *      Report the size of the text area in characters.\n   *      Result is CSI 8 ; height ; width t\n   *    Ps = 20                                                           supported\n   *      Report xterm window's icon label.\n   *      Result is OSC L label ST\n   *    Ps = 21                                                           supported\n   *      Report xterm window's title.\n   *      Result is OSC l label ST\n   *    Ps = 22 ; 0  -> Save xterm icon and window title on stack.        supported\n   *    Ps = 22 ; 1  -> Save xterm icon title on stack.                   supported\n   *    Ps = 22 ; 2  -> Save xterm window title on stack.                 supported\n   *    Ps = 23 ; 0  -> Restore xterm icon and window title from stack.   supported\n   *    Ps = 23 ; 1  -> Restore xterm icon title from stack.              supported\n   *    Ps = 23 ; 2  -> Restore xterm window title from stack.            supported\n   *    Ps >= 24                                                          not implemented\n   */\n  public windowOptions(params: IParams): boolean {\n    if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n      return true;\n    }\n    const second = (params.length > 1) ? params.params[1] : 0;\n    switch (params.params[0]) {\n      case 14:  // GetWinSizePixels, returns CSI 4 ; height ; width t\n        if (second !== 2) {\n          this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n        }\n        break;\n      case 16:  // GetCellSizePixels, returns CSI 6 ; height ; width t\n        this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n        break;\n      case 18:  // GetWinSizeChars, returns CSI 8 ; height ; width t\n        if (this._bufferService) {\n          this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n        }\n        break;\n      case 22:  // PushTitle\n        if (second === 0 || second === 2) {\n          this._windowTitleStack.push(this._windowTitle);\n          if (this._windowTitleStack.length > STACK_LIMIT) {\n            this._windowTitleStack.shift();\n          }\n        }\n        if (second === 0 || second === 1) {\n          this._iconNameStack.push(this._iconName);\n          if (this._iconNameStack.length > STACK_LIMIT) {\n            this._iconNameStack.shift();\n          }\n        }\n        break;\n      case 23:  // PopTitle\n        if (second === 0 || second === 2) {\n          if (this._windowTitleStack.length) {\n            this.setTitle(this._windowTitleStack.pop()!);\n          }\n        }\n        if (second === 0 || second === 1) {\n          if (this._iconNameStack.length) {\n            this.setIconName(this._iconNameStack.pop()!);\n          }\n        }\n        break;\n    }\n    return true;\n  }\n\n\n  /**\n   * CSI s\n   * ESC 7\n   *   Save cursor (ANSI.SYS).\n   *\n   * @vt: #P[TODO...]  CSI SCOSC   \"Save Cursor\"   \"CSI s\"   \"Save cursor position, charmap and text attributes.\"\n   * @vt: #Y ESC  SC   \"Save Cursor\"   \"ESC 7\"   \"Save cursor position, charmap and text attributes.\"\n   */\n  public saveCursor(params?: IParams): boolean {\n    this._activeBuffer.savedX = this._activeBuffer.x;\n    this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n    this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n    this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n    this._activeBuffer.savedCharset = this._charsetService.charset;\n    this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n    this._activeBuffer.savedGlevel = this._charsetService.glevel;\n    this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n    this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n    return true;\n  }\n\n\n  /**\n   * CSI u\n   * ESC 8\n   *   Restore cursor (ANSI.SYS).\n   *\n   * @vt: #P[TODO...]  CSI SCORC \"Restore Cursor\"  \"CSI u\"   \"Restore cursor position, charmap and text attributes.\"\n   * @vt: #Y ESC  RC \"Restore Cursor\"  \"ESC 8\"   \"Restore cursor position, charmap and text attributes.\"\n   */\n  public restoreCursor(params?: IParams): boolean {\n    this._activeBuffer.x = this._activeBuffer.savedX || 0;\n    this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n    this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n    this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n    for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n      this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n    }\n    this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n    this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n    this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n    this._restrictCursor();\n    return true;\n  }\n\n  /**\n   * OSC 2; <data> ST (set window title)\n   *   Proxy to set window title.\n   *\n   * @vt: #P[Icon name is not exposed.]   OSC    0   \"Set Windows Title and Icon Name\"  \"OSC 0 ; Pt BEL\"  \"Set window title and icon name.\"\n   * Icon name is not supported. For Window Title see below.\n   *\n   * @vt: #Y     OSC    2   \"Set Windows Title\"  \"OSC 2 ; Pt BEL\"  \"Set window title.\"\n   * xterm.js does not manipulate the title directly, instead exposes changes via the event\n   * `Terminal.onTitleChange`.\n   */\n  public setTitle(data: string): boolean {\n    this._windowTitle = data;\n    this._onTitleChange.fire(data);\n    return true;\n  }\n\n  /**\n   * OSC 1; <data> ST\n   * Note: Icon name is not exposed.\n   */\n  public setIconName(data: string): boolean {\n    this._iconName = data;\n    return true;\n  }\n\n  /**\n   * OSC 4; <num> ; <text> ST (set ANSI color <num> to <text>)\n   *\n   * @vt: #Y    OSC    4    \"Set ANSI color\"   \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n   * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n   * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n   * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n   * currently set color.\n   */\n  public setOrReportIndexedColor(data: string): boolean {\n    const event: IColorEvent = [];\n    const slots = data.split(';');\n    while (slots.length > 1) {\n      const idx = slots.shift() as string;\n      const spec = slots.shift() as string;\n      if (/^\\d+$/.exec(idx)) {\n        const index = parseInt(idx);\n        if (isValidColorIndex(index)) {\n          if (spec === '?') {\n            event.push({ type: ColorRequestType.REPORT, index });\n          } else {\n            const color = parseColor(spec);\n            if (color) {\n              event.push({ type: ColorRequestType.SET, index, color });\n            }\n          }\n        }\n      }\n    }\n    if (event.length) {\n      this._onColor.fire(event);\n    }\n    return true;\n  }\n\n  /**\n   * OSC 8 ; <params> ; <uri> ST - create hyperlink\n   * OSC 8 ; ; ST - finish hyperlink\n   *\n   * Test case:\n   *\n   * ```sh\n   * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n   * ```\n   *\n   * @vt: #Y    OSC    8    \"Create hyperlink\"   \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n   * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n   * optional list of key=value assignments, separated by the : character.\n   * Example: `id=xyz123:foo=bar:baz=quux`.\n   * Currently only the id key is defined. Cells that share the same ID and URI share hover\n   * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n   */\n  public setHyperlink(data: string): boolean {\n    // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n    const idx = data.indexOf(';');\n    if (idx === -1) {\n      // malformed sequence, just return as handled\n      return true;\n    }\n    const id = data.slice(0, idx).trim();\n    const uri = data.slice(idx + 1);\n    if (uri) {\n      return this._createHyperlink(id, uri);\n    }\n    if (id.trim()) {\n      return false;\n    }\n    return this._finishHyperlink();\n  }\n\n  private _createHyperlink(params: string, uri: string): boolean {\n    // It's legal to open a new hyperlink without explicitly finishing the previous one\n    if (this._getCurrentLinkId()) {\n      this._finishHyperlink();\n    }\n    const parsedParams = params.split(':');\n    let id: string | undefined;\n    const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n    if (idParamIndex !== -1) {\n      id = parsedParams[idParamIndex].slice(3) || undefined;\n    }\n    this._curAttrData.extended = this._curAttrData.extended.clone();\n    this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n    this._curAttrData.updateExtended();\n    return true;\n  }\n\n  private _finishHyperlink(): boolean {\n    this._curAttrData.extended = this._curAttrData.extended.clone();\n    this._curAttrData.extended.urlId = 0;\n    this._curAttrData.updateExtended();\n    return true;\n  }\n\n  // special colors - OSC 10 | 11 | 12\n  private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n  /**\n   * Apply colors requests for special colors in OSC 10 | 11 | 12.\n   * Since these commands are stacking from multiple parameters,\n   * we handle them in a loop with an entry offset to `_specialColors`.\n   */\n  private _setOrReportSpecialColor(data: string, offset: number): boolean {\n    const slots = data.split(';');\n    for (let i = 0; i < slots.length; ++i, ++offset) {\n      if (offset >= this._specialColors.length) break;\n      if (slots[i] === '?') {\n        this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n      } else {\n        const color = parseColor(slots[i]);\n        if (color) {\n          this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n        }\n      }\n    }\n    return true;\n  }\n\n  /**\n   * OSC 10 ; <xcolor name>|<?> ST - set or query default foreground color\n   *\n   * @vt: #Y  OSC   10    \"Set or query default foreground color\"   \"OSC 10 ; Pt BEL\"  \"Set or query default foreground color.\"\n   * To set the color, the following color specification formats are supported:\n   * - `rgb:<red>/<green>/<blue>` for  `<red>, <green>, <blue>` in `h | hh | hhh | hhhh`, where\n   *   `h` is a single hexadecimal digit (case insignificant). The different widths scale\n   *   from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n   * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n   * - `#RRGGBB` - 8 bits per channel\n   * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n   * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n   *\n   * **Note:** X11 named colors are currently unsupported.\n   *\n   * If `Pt` contains `?` instead of a color specification, the terminal\n   * returns a sequence with the current default foreground color\n   * (use that sequence to restore the color after changes).\n   *\n   * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n   * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n   */\n  public setOrReportFgColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 0);\n  }\n\n  /**\n   * OSC 11 ; <xcolor name>|<?> ST - set or query default background color\n   *\n   * @vt: #Y  OSC   11    \"Set or query default background color\"   \"OSC 11 ; Pt BEL\"  \"Same as OSC 10, but for default background.\"\n   */\n  public setOrReportBgColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 1);\n  }\n\n  /**\n   * OSC 12 ; <xcolor name>|<?> ST - set or query default cursor color\n   *\n   * @vt: #Y  OSC   12    \"Set or query default cursor color\"   \"OSC 12 ; Pt BEL\"  \"Same as OSC 10, but for default cursor color.\"\n   */\n  public setOrReportCursorColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 2);\n  }\n\n  /**\n   * OSC 104 ; <num> ST - restore ANSI color <num>\n   *\n   * @vt: #Y  OSC   104    \"Reset ANSI color\"   \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n   * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n   * specified by the loaded theme. Any number of `c` parameters may be given.\n   * If no parameters are given, the entire indexed color table will be reset.\n   */\n  public restoreIndexedColor(data: string): boolean {\n    if (!data) {\n      this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n      return true;\n    }\n    const event: IColorEvent = [];\n    const slots = data.split(';');\n    for (let i = 0; i < slots.length; ++i) {\n      if (/^\\d+$/.exec(slots[i])) {\n        const index = parseInt(slots[i]);\n        if (isValidColorIndex(index)) {\n          event.push({ type: ColorRequestType.RESTORE, index });\n        }\n      }\n    }\n    if (event.length) {\n      this._onColor.fire(event);\n    }\n    return true;\n  }\n\n  /**\n   * OSC 110 ST - restore default foreground color\n   *\n   * @vt: #Y  OSC   110    \"Restore default foreground color\"   \"OSC 110 BEL\"  \"Restore default foreground to themed color.\"\n   */\n  public restoreFgColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n    return true;\n  }\n\n  /**\n   * OSC 111 ST - restore default background color\n   *\n   * @vt: #Y  OSC   111    \"Restore default background color\"   \"OSC 111 BEL\"  \"Restore default background to themed color.\"\n   */\n  public restoreBgColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n    return true;\n  }\n\n  /**\n   * OSC 112 ST - restore default cursor color\n   *\n   * @vt: #Y  OSC   112    \"Restore default cursor color\"   \"OSC 112 BEL\"  \"Restore default cursor to themed color.\"\n   */\n  public restoreCursorColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n    return true;\n  }\n\n  /**\n   * ESC E\n   * C1.NEL\n   *   DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n   *   Moves cursor to first position on next line.\n   *\n   * @vt: #Y   C1    NEL   \"Next Line\"   \"\\x85\"    \"Move the cursor to the beginning of the next row.\"\n   * @vt: #Y   ESC   NEL   \"Next Line\"   \"ESC E\"   \"Move the cursor to the beginning of the next row.\"\n   */\n  public nextLine(): boolean {\n    this._activeBuffer.x = 0;\n    this.index();\n    return true;\n  }\n\n  /**\n   * ESC =\n   *   DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n   *   Enables the numeric keypad to send application sequences to the host.\n   */\n  public keypadApplicationMode(): boolean {\n    this._logService.debug('Serial port requested application keypad.');\n    this._coreService.decPrivateModes.applicationKeypad = true;\n    this._onRequestSyncScrollBar.fire();\n    return true;\n  }\n\n  /**\n   * ESC >\n   *   DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n   *   Enables the keypad to send numeric characters to the host.\n   */\n  public keypadNumericMode(): boolean {\n    this._logService.debug('Switching back to normal keypad.');\n    this._coreService.decPrivateModes.applicationKeypad = false;\n    this._onRequestSyncScrollBar.fire();\n    return true;\n  }\n\n  /**\n   * ESC % @\n   * ESC % G\n   *   Select default character set. UTF-8 is not supported (string are unicode anyways)\n   *   therefore ESC % G does the same.\n   */\n  public selectDefaultCharset(): boolean {\n    this._charsetService.setgLevel(0);\n    this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n    return true;\n  }\n\n  /**\n   * ESC ( C\n   *   Designate G0 Character Set, VT100, ISO 2022.\n   * ESC ) C\n   *   Designate G1 Character Set (ISO 2022, VT100).\n   * ESC * C\n   *   Designate G2 Character Set (ISO 2022, VT220).\n   * ESC + C\n   *   Designate G3 Character Set (ISO 2022, VT220).\n   * ESC - C\n   *   Designate G1 Character Set (VT300).\n   * ESC . C\n   *   Designate G2 Character Set (VT300).\n   * ESC / C\n   *   Designate G3 Character Set (VT300). C = A  -> ISO Latin-1 Supplemental. - Supported?\n   */\n  public selectCharset(collectAndFlag: string): boolean {\n    if (collectAndFlag.length !== 2) {\n      this.selectDefaultCharset();\n      return true;\n    }\n    if (collectAndFlag[0] === '/') {\n      return true;  // TODO: Is this supported?\n    }\n    this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n    return true;\n  }\n\n  /**\n   * ESC D\n   * C1.IND\n   *   DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n   *   Moves the cursor down one line in the same column.\n   *\n   * @vt: #Y   C1    IND   \"Index\"   \"\\x84\"    \"Move the cursor one line down scrolling if needed.\"\n   * @vt: #Y   ESC   IND   \"Index\"   \"ESC D\"   \"Move the cursor one line down scrolling if needed.\"\n   */\n  public index(): boolean {\n    this._restrictCursor();\n    this._activeBuffer.y++;\n    if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n      this._activeBuffer.y--;\n      this._bufferService.scroll(this._eraseAttrData());\n    } else if (this._activeBuffer.y >= this._bufferService.rows) {\n      this._activeBuffer.y = this._bufferService.rows - 1;\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n  /**\n   * ESC H\n   * C1.HTS\n   *   DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n   *   Sets a horizontal tab stop at the column position indicated by\n   *   the value of the active column when the terminal receives an HTS.\n   *\n   * @vt: #Y   C1    HTS   \"Horizontal Tabulation Set\" \"\\x88\"    \"Places a tab stop at the current cursor position.\"\n   * @vt: #Y   ESC   HTS   \"Horizontal Tabulation Set\" \"ESC H\"   \"Places a tab stop at the current cursor position.\"\n   */\n  public tabSet(): boolean {\n    this._activeBuffer.tabs[this._activeBuffer.x] = true;\n    return true;\n  }\n\n  /**\n   * ESC M\n   * C1.RI\n   *   DEC mnemonic: HTS\n   *   Moves the cursor up one line in the same column. If the cursor is at the top margin,\n   *   the page scrolls down.\n   *\n   * @vt: #Y ESC  IR \"Reverse Index\" \"ESC M\"  \"Move the cursor one line up scrolling if needed.\"\n   */\n  public reverseIndex(): boolean {\n    this._restrictCursor();\n    if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n      // possibly move the code below to term.reverseScroll();\n      // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n      // blankLine(true) is xterm/linux behavior\n      const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n      this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n      this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n      this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    } else {\n      this._activeBuffer.y--;\n      this._restrictCursor(); // quickfix to not run out of bounds\n    }\n    return true;\n  }\n\n  /**\n   * ESC c\n   *   DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n   *   Reset to initial state.\n   *\n   * @vt: #Y ESC  RIS \"Full Reset\" \"ESC c\"  \"Reset to initial state.\"\n   */\n  public fullReset(): boolean {\n    this._parser.reset();\n    this._onRequestReset.fire();\n    return true;\n  }\n\n  public reset(): void {\n    this._curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n  }\n\n  /**\n   * back_color_erase feature for xterm.\n   */\n  private _eraseAttrData(): IAttributeData {\n    this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n    this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n    return this._eraseAttrDataInternal;\n  }\n\n  /**\n   * ESC n\n   * ESC o\n   * ESC |\n   * ESC }\n   * ESC ~\n   *   DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n   *   When you use a locking shift, the character set remains in GL or GR until\n   *   you use another locking shift. (partly supported)\n   */\n  public setgLevel(level: number): boolean {\n    this._charsetService.setgLevel(level);\n    return true;\n  }\n\n  /**\n   * ESC # 8\n   *   DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n   *   This control function fills the complete screen area with\n   *   a test pattern (E) used for adjusting screen alignment.\n   *\n   * @vt: #Y   ESC   DECALN   \"Screen Alignment Pattern\"  \"ESC # 8\"  \"Fill viewport with a test pattern (E).\"\n   */\n  public screenAlignmentPattern(): boolean {\n    // prepare cell data\n    const cell = new CellData();\n    cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n    cell.fg = this._curAttrData.fg;\n    cell.bg = this._curAttrData.bg;\n\n\n    this._setCursor(0, 0);\n    for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n      const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n      const line = this._activeBuffer.lines.get(row);\n      if (line) {\n        line.fill(cell);\n        line.isWrapped = false;\n      }\n    }\n    this._dirtyRowTracker.markAllDirty();\n    this._setCursor(0, 0);\n    return true;\n  }\n\n\n  /**\n   * DCS $ q Pt ST\n   *   DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n   *   Request Status String (DECRQSS), VT420 and up.\n   *   Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n   *\n   * @vt: #P[Limited support, see below.]  DCS   DECRQSS   \"Request Selection or Setting\"  \"DCS $ q Pt ST\"   \"Request several terminal settings.\"\n   * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n   * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n   *\n   * Supported requests and responses:\n   *\n   * | Type                             | Request           | Response (`Pt`)                                       |\n   * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n   * | Graphic Rendition (SGR)          | `DCS $ q m ST`    | always reporting `0m` (currently broken)              |\n   * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST`    | `Ps ; Ps r`                                           |\n   * | Cursor Style (DECSCUSR)          | `DCS $ q SP q ST` | `Ps SP q`                                             |\n   * | Protection Attribute (DECSCA)    | `DCS $ q \" q ST`  | `Ps \" q` (DECSCA 2 is reported as Ps = 0)             |\n   * | Conformance Level (DECSCL)       | `DCS $ q \" p ST`  | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n   *\n   *\n   * TODO:\n   * - fix SGR report\n   * - either check which conformance is better suited or remove the report completely\n   *   --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n   */\n  public requestStatusString(data: string, params: IParams): boolean {\n    const f = (s: string): boolean => {\n      this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n      return true;\n    };\n\n    // access helpers\n    const b = this._bufferService.buffer;\n    const opts = this._optionsService.rawOptions;\n    const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n    if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n    if (data === '\"p') return f(`P1$r61;1\"p`);\n    if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n    // FIXME: report real SGR settings instead of 0m\n    if (data === 'm') return f(`P1$r0m`);\n    if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n    return f(`P0$r`);\n  }\n\n  public markRangeDirty(y1: number, y2: number): void {\n    this._dirtyRowTracker.markRangeDirty(y1, y2);\n  }\n\n  // #region Kitty keyboard\n\n  /**\n   * CSI = flags ; mode u\n   * Set Kitty keyboard protocol flags.\n   * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n   *\n   * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n   */\n  public kittyKeyboardSet(params: IParams): boolean {\n    if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n      return true;\n    }\n    const flags = params.params[0] || 0;\n    const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n    const state = this._coreService.kittyKeyboard;\n\n    switch (mode) {\n      case 1: // Set all flags\n        state.flags = flags;\n        break;\n      case 2: // Set only specified flags (OR)\n        state.flags |= flags;\n        break;\n      case 3: // Reset only specified flags (AND NOT)\n        state.flags &= ~flags;\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * CSI ? u\n   * Query Kitty keyboard protocol flags.\n   * Terminal responds with CSI ? flags u\n   *\n   * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n   */\n  public kittyKeyboardQuery(params: IParams): boolean {\n    if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n      return true;\n    }\n    const flags = this._coreService.kittyKeyboard.flags;\n    this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n    return true;\n  }\n\n  /**\n   * CSI > flags u\n   * Push Kitty keyboard flags onto stack and set new flags.\n   *\n   * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n   */\n  public kittyKeyboardPush(params: IParams): boolean {\n    if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n      return true;\n    }\n    const flags = params.params[0] || 0;\n    const state = this._coreService.kittyKeyboard;\n    const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n    const stack = isAlt ? state.altStack : state.mainStack;\n\n    // Evict oldest entry if stack is full (DoS protection, limit of 16)\n    if (stack.length >= 16) {\n      stack.shift();\n    }\n\n    // Push current flags onto stack and set new flags\n    stack.push(state.flags);\n    state.flags = flags;\n    return true;\n  }\n\n  /**\n   * CSI < count u\n   * Pop Kitty keyboard flags from stack.\n   *\n   * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n   */\n  public kittyKeyboardPop(params: IParams): boolean {\n    if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n      return true;\n    }\n    const count = Math.max(1, params.params[0] || 1);\n    const state = this._coreService.kittyKeyboard;\n    const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n    const stack = isAlt ? state.altStack : state.mainStack;\n\n    // Pop specified number of entries from stack\n    for (let i = 0; i < count && stack.length > 0; i++) {\n      state.flags = stack.pop()!;\n    }\n    // If stack is empty after popping, reset to 0\n    if (stack.length === 0 && count > 0) {\n      state.flags = 0;\n    }\n    return true;\n  }\n\n  // #endregion\n}\n\nexport interface IDirtyRowTracker {\n  readonly start: number;\n  readonly end: number;\n\n  clearRange(): void;\n  markDirty(y: number): void;\n  markRangeDirty(y1: number, y2: number): void;\n  markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n  public start!: number;\n  public end!: number;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n    this.clearRange();\n  }\n\n  public clearRange(): void {\n    this.start = this._bufferService.buffer.y;\n    this.end = this._bufferService.buffer.y;\n  }\n\n  public markDirty(y: number): void {\n    if (y < this.start) {\n      this.start = y;\n    } else if (y > this.end) {\n      this.end = y;\n    }\n  }\n\n  public markRangeDirty(y1: number, y2: number): void {\n    if (y1 > y2) {\n      $temp = y1;\n      y1 = y2;\n      y2 = $temp;\n    }\n    if (y1 < this.start) {\n      this.start = y1;\n    }\n    if (y2 > this.end) {\n      this.end = y2;\n    }\n  }\n\n  public markAllDirty(): void {\n    this.markRangeDirty(0, this._bufferService.rows - 1);\n  }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n  return 0 <= value && value < 256;\n}\n", "\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { Emitter } from 'common/Event';\n\ndeclare const setTimeout: (handler: () => void, timeout?: number) => void;\n\n/**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\nconst DISCARD_WATERMARK = 50000000; // ~50 MB\n\n/**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\nconst WRITE_TIMEOUT_MS = 12;\n\n/**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\nconst WRITE_BUFFER_LENGTH_THRESHOLD = 50;\n\nexport class WriteBuffer extends Disposable {\n  private _writeBuffer: (string | Uint8Array)[] = [];\n  private _callbacks: ((() => void) | undefined)[] = [];\n  private _pendingData = 0;\n  private _bufferOffset = 0;\n  private _isSyncWriting = false;\n  private _syncCalls = 0;\n  private _didUserInput = false;\n\n  private readonly _onWriteParsed = this._register(new Emitter<void>());\n  public readonly onWriteParsed = this._onWriteParsed.event;\n\n  constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise<boolean>) {\n    super();\n  }\n\n  public handleUserInput(): void {\n    this._didUserInput = true;\n  }\n\n  /**\n   * Flushes all pending writes synchronously. This is useful when you need to\n   * ensure all queued data is processed before performing an operation that\n   * depends upon everything being parsed like resize.\n   *\n   * Note: This is unreliable with async parser handlers as it does not wait for\n   * promises to resolve.\n   */\n  public flushSync(): void {\n    // exit early if another sync write loop is active\n    if (this._isSyncWriting) {\n      return;\n    }\n    this._isSyncWriting = true;\n\n    // Process all pending chunks synchronously\n    let chunk: string | Uint8Array | undefined;\n    while (chunk = this._writeBuffer.shift()) {\n      this._action(chunk);\n      const cb = this._callbacks.shift();\n      if (cb) cb();\n    }\n\n    // Reset buffer state\n    this._pendingData = 0;\n    this._bufferOffset = 0x7FFFFFFF;\n    this._writeBuffer.length = 0;\n    this._callbacks.length = 0;\n\n    this._isSyncWriting = false;\n  }\n\n  /**\n   * @deprecated Unreliable, to be removed soon.\n   */\n  public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n    // stop writeSync recursions with maxSubsequentCalls argument\n    // This is dangerous to use as it will lose the current data chunk\n    // and return immediately.\n    if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n      // comment next line if a whole loop block should only contain x `writeSync` calls\n      // (total flat vs. deep nested limit)\n      this._syncCalls = 0;\n      return;\n    }\n    // append chunk to buffer\n    this._pendingData += data.length;\n    this._writeBuffer.push(data);\n    this._callbacks.push(undefined);\n\n    // increase recursion counter\n    this._syncCalls++;\n    // exit early if another writeSync loop is active\n    if (this._isSyncWriting) {\n      return;\n    }\n    this._isSyncWriting = true;\n\n    // force sync processing on pending data chunks to avoid in-band data scrambling\n    // does the same as innerWrite but without event loop\n    // we have to do it here as single loop steps to not corrupt loop subject\n    // by another writeSync call triggered from _action\n    let chunk: string | Uint8Array | undefined;\n    while (chunk = this._writeBuffer.shift()) {\n      this._action(chunk);\n      const cb = this._callbacks.shift();\n      if (cb) cb();\n    }\n    // reset to avoid reprocessing of chunks with scheduled innerWrite call\n    // stopping scheduled innerWrite by offset > length condition\n    this._pendingData = 0;\n    this._bufferOffset = 0x7FFFFFFF;\n\n    // allow another writeSync to loop\n    this._isSyncWriting = false;\n    this._syncCalls = 0;\n  }\n\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    if (this._pendingData > DISCARD_WATERMARK) {\n      throw new Error('write data discarded, use flow control to avoid losing data');\n    }\n\n    // schedule chunk processing for next event loop run\n    if (!this._writeBuffer.length) {\n      this._bufferOffset = 0;\n\n      // If this is the first write call after the user has done some input,\n      // parse it immediately to minimize input latency,\n      // otherwise schedule for the next event\n      if (this._didUserInput) {\n        this._didUserInput = false;\n        this._pendingData += data.length;\n        this._writeBuffer.push(data);\n        this._callbacks.push(callback);\n        this._innerWrite();\n        return;\n      }\n\n      setTimeout(() => this._innerWrite());\n    }\n\n    this._pendingData += data.length;\n    this._writeBuffer.push(data);\n    this._callbacks.push(callback);\n  }\n\n  /**\n   * Inner write call, that enters the sliced chunk processing by timing.\n   *\n   * `lastTime` indicates, when the last _innerWrite call had started.\n   * It is used to aggregate async handler execution under a timeout constraint\n   * effectively lowering the redrawing needs, schematically:\n   *\n   *   macroTask _innerWrite:\n   *     if (performance.now() - (lastTime | 0) < WRITE_TIMEOUT_MS):\n   *        schedule microTask _innerWrite(lastTime)\n   *     else:\n   *        schedule macroTask _innerWrite(0)\n   *\n   *   overall execution order on task queues:\n   *\n   *   macrotasks:  [...]  -->  _innerWrite(0)  -->  [...]  -->  screenUpdate  -->  [...]\n   *         m  t:                    |\n   *         i  a:                  [...]\n   *         c  s:                    |\n   *         r  k:              while < timeout:\n   *         o  s:                _innerWrite(timeout)\n   *\n   * `promiseResult` depicts the promise resolve value of an async handler.\n   * This value gets carried forward through all saved stack states of the\n   * paused parser for proper continuation.\n   *\n   * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n   */\n  protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n    const startTime = lastTime || performance.now();\n    while (this._writeBuffer.length > this._bufferOffset) {\n      const data = this._writeBuffer[this._bufferOffset];\n      const result = this._action(data, promiseResult);\n      if (result) {\n        /**\n         * If we get a promise as return value, we re-schedule the continuation\n         * as thenable on the promise and exit right away.\n         *\n         * The exit here means, that we block input processing at the current active chunk,\n         * the exact execution position within the chunk is preserved by the saved\n         * stack content in InputHandler and EscapeSequenceParser.\n         *\n         * Resuming happens automatically from that saved stack state.\n         * Also the resolved promise value is passed along the callstack to\n         * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n         *\n         * Exceptions on async handlers will be logged to console async, but do not interrupt\n         * the input processing (continues with next handler at the current input position).\n         */\n\n        /**\n         * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n         * This might already be too late, if our .then enters really late (executor + prev thens\n         * took very long). This cannot be solved here for the handler itself (it is the handlers\n         * responsibility to slice hard work), but we can at least schedule a screen update as we\n         * gain control.\n         */\n        const continuation: (r: boolean) => void = (r: boolean) => performance.now() - startTime >= WRITE_TIMEOUT_MS\n          ? setTimeout(() => this._innerWrite(0, r))\n          : this._innerWrite(startTime, r);\n\n        /**\n         * Optimization considerations:\n         * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n         * This might schedule too many screen updates with bad throughput drops (in case a slow\n         * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n         * this condition here, also the renderer has no way to spot nonsense updates either.\n         * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n         *\n         * If favoring of FPS shows bad throughtput impact, use the following instead. It favors\n         * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n         * current microtask queue (executed before setTimeout).\n         */\n        // const continuation: (r: boolean) => void = performance.now() - startTime >=\n        //     WRITE_TIMEOUT_MS\n        //   ? r => setTimeout(() => this._innerWrite(0, r))\n        //   : r => this._innerWrite(startTime, r);\n\n        // Handle exceptions synchronously to current band position, idea:\n        // 1. spawn a single microtask which we allow to throw hard\n        // 2. spawn a promise immediately resolving to `true`\n        // (executed on the same queue, thus properly aligned before continuation happens)\n        result.catch(err => {\n          queueMicrotask(() => {throw err;});\n          return Promise.resolve(false);\n        }).then(continuation);\n        return;\n      }\n\n      const cb = this._callbacks[this._bufferOffset];\n      if (cb) cb();\n      this._bufferOffset++;\n      this._pendingData -= data.length;\n\n      if (performance.now() - startTime >= WRITE_TIMEOUT_MS) {\n        break;\n      }\n    }\n    if (this._writeBuffer.length > this._bufferOffset) {\n      // Allow renderer to catch up before processing the next batch\n      // trim already processed chunks if we are above threshold\n      if (this._bufferOffset > WRITE_BUFFER_LENGTH_THRESHOLD) {\n        this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n        this._callbacks = this._callbacks.slice(this._bufferOffset);\n        this._bufferOffset = 0;\n      }\n      setTimeout(() => this._innerWrite());\n    } else {\n      this._writeBuffer.length = 0;\n      this._callbacks.length = 0;\n      this._pendingData = 0;\n      this._bufferOffset = 0;\n    }\n    this._onWriteParsed.fire();\n  }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from 'common/services/Services';\nimport { IMarker, IOscLinkData } from 'common/Types';\n\nexport class OscLinkService implements IOscLinkService {\n  public serviceBrand: any;\n\n  private _nextId = 1;\n\n  /**\n   * A map of the link key to link entry. This is used to add additional lines to links with ids.\n   */\n  private _entriesWithId: Map<string, IOscLinkEntryWithId> = new Map();\n\n  /**\n   * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n   * representation of a unique link should not be confused with \"id\" (string) which comes in with\n   * `id=` in the OSC link's properties.\n   */\n  private _dataByLinkId: Map<number, IOscLinkEntryNoId | IOscLinkEntryWithId> = new Map();\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n  }\n\n  public registerLink(data: IOscLinkData): number {\n    const buffer = this._bufferService.buffer;\n\n    // Links with no id will only ever be registered a single time\n    if (data.id === undefined) {\n      const marker = buffer.addMarker(buffer.ybase + buffer.y);\n      const entry: IOscLinkEntryNoId = {\n        data,\n        id: this._nextId++,\n        lines: [marker]\n      };\n      marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n      this._dataByLinkId.set(entry.id, entry);\n      return entry.id;\n    }\n\n    // Add the line to the link if it already exists\n    const castData = data as Required<IOscLinkData>;\n    const key = this._getEntryIdKey(castData);\n    const match = this._entriesWithId.get(key);\n    if (match) {\n      this.addLineToLink(match.id, buffer.ybase + buffer.y);\n      return match.id;\n    }\n\n    // Create the link\n    const marker = buffer.addMarker(buffer.ybase + buffer.y);\n    const entry: IOscLinkEntryWithId = {\n      id: this._nextId++,\n      key: this._getEntryIdKey(castData),\n      data: castData,\n      lines: [marker]\n    };\n    marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n    this._entriesWithId.set(entry.key, entry);\n    this._dataByLinkId.set(entry.id, entry);\n    return entry.id;\n  }\n\n  public addLineToLink(linkId: number, y: number): void {\n    const entry = this._dataByLinkId.get(linkId);\n    if (!entry) {\n      return;\n    }\n    if (entry.lines.every(e => e.line !== y)) {\n      const marker = this._bufferService.buffer.addMarker(y);\n      entry.lines.push(marker);\n      marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n    }\n  }\n\n  public getLinkData(linkId: number): IOscLinkData | undefined {\n    return this._dataByLinkId.get(linkId)?.data;\n  }\n\n  private _getEntryIdKey(linkData: Required<IOscLinkData>): string {\n    return `${linkData.id};;${linkData.uri}`;\n  }\n\n  private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n    const index = entry.lines.indexOf(marker);\n    if (index === -1) {\n      return;\n    }\n    entry.lines.splice(index, 1);\n    if (entry.lines.length === 0) {\n      if (entry.data.id !== undefined) {\n        this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n      }\n      this._dataByLinkId.delete(entry.id);\n    }\n  }\n}\n\ninterface IOscLinkEntry<T extends IOscLinkData> {\n  data: T;\n  id: number;\n  lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry<IOscLinkData> {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry<Required<IOscLinkData>> {\n  key: string;\n}\n", "/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n *   Fabrice Bellard's javascript vt100 for jslinux:\n *   http://bellard.org/jslinux/\n *   Copyright (c) 2011 Fabrice Bellard\n *   The original design remains. The terminal itself\n *   has been extended to include xterm CSI codes, among\n *   other features.\n *\n * Terminal Emulation References:\n *   http://vt100.net/\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n *   http://invisible-island.net/vttest/\n *   http://www.inwap.com/pdp10/ansicode.txt\n *   http://linux.die.net/man/4/console_codes\n *   http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services';\nimport { InstantiationService } from 'common/services/InstantiationService';\nimport { LogService } from 'common/services/LogService';\nimport { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';\nimport { OptionsService } from 'common/services/OptionsService';\nimport { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent } from 'common/Types';\nimport { CoreService } from 'common/services/CoreService';\nimport { MouseStateService } from 'common/services/MouseStateService';\nimport { UnicodeService } from 'common/services/UnicodeService';\nimport { CharsetService } from 'common/services/CharsetService';\nimport { updateWindowsModeWrappedState } from 'common/WindowsMode';\nimport { IFunctionIdentifier, IParams } from 'common/parser/Types';\nimport { IBufferSet } from 'common/buffer/Types';\nimport { InputHandler } from 'common/InputHandler';\nimport { WriteBuffer } from 'common/input/WriteBuffer';\nimport { OscLinkService } from 'common/services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from 'common/Event';\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n  protected readonly _instantiationService: IInstantiationService;\n  protected readonly _bufferService: IBufferService;\n  protected readonly _logService: ILogService;\n  protected readonly _charsetService: ICharsetService;\n  protected readonly _oscLinkService: IOscLinkService;\n\n  public readonly mouseStateService: IMouseStateService;\n  public readonly coreService: ICoreService;\n  public readonly unicodeService: IUnicodeService;\n  public readonly optionsService: IOptionsService;\n\n  protected _inputHandler: InputHandler;\n  private _writeBuffer: WriteBuffer;\n  private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n  private readonly _onBinary = this._register(new Emitter<string>());\n  public readonly onBinary = this._onBinary.event;\n  private readonly _onData = this._register(new Emitter<string>());\n  public readonly onData = this._onData.event;\n  protected _onLineFeed = this._register(new Emitter<void>());\n  public readonly onLineFeed = this._onLineFeed.event;\n  protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n  public readonly onRender = this._onRender.event;\n  private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n  public readonly onResize = this._onResize.event;\n  protected readonly _onWriteParsed = this._register(new Emitter<void>());\n  public readonly onWriteParsed = this._onWriteParsed.event;\n\n  /**\n   * Internally we track the source of the scroll but this is meaningless outside the library so\n   * it's filtered out.\n   */\n  protected _onScrollApi?: Emitter<number>;\n  protected _onScroll = this._register(new Emitter<IScrollEvent>());\n  public get onScroll(): IEvent<number> {\n    if (!this._onScrollApi) {\n      this._onScrollApi = this._register(new Emitter<number>());\n      this._onScroll.event(ev => {\n        this._onScrollApi?.fire(ev.position);\n      });\n    }\n    return this._onScrollApi.event;\n  }\n\n  public get cols(): number { return this._bufferService.cols; }\n  public get rows(): number { return this._bufferService.rows; }\n  public get buffers(): IBufferSet { return this._bufferService.buffers; }\n  public get options(): Required<ITerminalOptions> { return this.optionsService.options; }\n  public set options(options: ITerminalOptions) {\n    for (const key in options) {\n      this.optionsService.options[key] = options[key];\n    }\n  }\n\n  constructor(\n    options: Partial<ITerminalOptions>\n  ) {\n    super();\n\n    // Setup and initialize services\n    this._instantiationService = new InstantiationService();\n    this.optionsService = this._register(new OptionsService(options));\n    this._instantiationService.setService(IOptionsService, this.optionsService);\n    this._logService = this._register(this._instantiationService.createInstance(LogService));\n    this._instantiationService.setService(ILogService, this._logService);\n    this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n    this._instantiationService.setService(IBufferService, this._bufferService);\n    this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n    this._instantiationService.setService(ICoreService, this.coreService);\n    this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n    this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n    this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n    this._instantiationService.setService(IUnicodeService, this.unicodeService);\n    this._charsetService = this._instantiationService.createInstance(CharsetService);\n    this._instantiationService.setService(ICharsetService, this._charsetService);\n    this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n    this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n    // Register input handler and handle/forward events\n    this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n    this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n    // Setup listeners\n    this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n    this._register(EventUtils.forward(this.coreService.onData, this._onData));\n    this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n    this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n    this._register(this.coreService.onUserInput(() =>  this._writeBuffer.handleUserInput()));\n    this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n    this._register(this._bufferService.onScroll(() => {\n      this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n      this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n    }));\n    // Setup WriteBuffer\n    this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n    this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n  }\n\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    this._writeBuffer.write(data, callback);\n  }\n\n  /**\n   * Write data to terminal synchonously.\n   *\n   * This method is unreliable with async parser handlers, thus should not\n   * be used anymore. If you need blocking semantics on data input consider\n   * `write` with a callback instead.\n   *\n   * @deprecated Unreliable, will be removed soon.\n   */\n  public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n    if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n      this._logService.warn('writeSync is unreliable and will be removed soon.');\n      hasWriteSyncWarnHappened = true;\n    }\n    this._writeBuffer.writeSync(data, maxSubsequentCalls);\n  }\n\n  public input(data: string, wasUserInput: boolean = true): void {\n    this.coreService.triggerDataEvent(data, wasUserInput);\n  }\n\n  public resize(x: number, y: number): void {\n    if (isNaN(x) || isNaN(y)) {\n      return;\n    }\n\n    x = Math.max(x, MINIMUM_COLS);\n    y = Math.max(y, MINIMUM_ROWS);\n\n    // Flush pending writes before resize to avoid race conditions where async\n    // writes are processed with incorrect dimensions\n    this._writeBuffer.flushSync();\n\n    this._bufferService.resize(x, y);\n  }\n\n  /**\n   * Scroll the terminal down 1 row, creating a blank line.\n   * @param eraseAttr The attribute data to use the for blank line.\n   * @param isWrapped Whether the new line is wrapped from the previous line.\n   */\n  public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n    this._bufferService.scroll(eraseAttr, isWrapped);\n  }\n\n  /**\n   * Scroll the display of the terminal\n   * @param disp The number of lines to scroll down (negative scroll up).\n   * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n   * unwanted events being handled by the viewport when the event was triggered from the viewport\n   * originally.\n   */\n  public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n    this._bufferService.scrollLines(disp, suppressScrollEvent);\n  }\n\n  public scrollPages(pageCount: number): void {\n    this.scrollLines(pageCount * (this.rows - 1));\n  }\n\n  public scrollToTop(): void {\n    this.scrollLines(-this._bufferService.buffer.ydisp);\n  }\n\n  public scrollToBottom(disableSmoothScroll?: boolean): void {\n    this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n  }\n\n  public scrollToLine(line: number): void {\n    const scrollAmount = line - this._bufferService.buffer.ydisp;\n    if (scrollAmount !== 0) {\n      this.scrollLines(scrollAmount);\n    }\n  }\n\n  /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n  public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerEscHandler(id, callback);\n  }\n\n  /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerDcsHandler(id, callback);\n  }\n\n  /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerCsiHandler(id, callback);\n  }\n\n  /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerOscHandler(ident, callback);\n  }\n\n  /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n  public registerApcHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerApcHandler(ident, callback);\n  }\n\n  protected _setup(): void {\n    this._handleWindowsPtyOptionChange();\n  }\n\n  public reset(): void {\n    this._inputHandler.reset();\n    this._bufferService.reset();\n    this._charsetService.reset();\n    this.coreService.reset();\n    this.mouseStateService.reset();\n  }\n\n\n  private _handleWindowsPtyOptionChange(): void {\n    let value = false;\n    const windowsPty = this.optionsService.rawOptions.windowsPty;\n    if (windowsPty && windowsPty.buildNumber !== undefined && windowsPty.buildNumber !== undefined) {\n      value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n    }\n    if (value) {\n      this._enableWindowsWrappingHeuristics();\n    } else {\n      this._windowsWrappingHeuristics.clear();\n    }\n  }\n\n  protected _enableWindowsWrappingHeuristics(): void {\n    if (!this._windowsWrappingHeuristics.value) {\n      const disposables: IDisposable[] = [];\n      disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n      disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n        updateWindowsModeWrappedState(this._bufferService);\n        return false;\n      }));\n      this._windowsWrappingHeuristics.value = toDisposable(() => {\n        for (const d of disposables) {\n          d.dispose();\n        }\n      });\n    }\n  }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport type { ILogService } from 'common/services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList<T> {\n  private _array: T[] = [];\n\n  private readonly _insertedValues: T[] = [];\n  private readonly _flushInsertedTask: InstanceType<typeof IdleTaskQueue>;\n  private _isFlushingInserted = false;\n\n  private readonly _deletedIndices: number[] = [];\n  private readonly _flushDeletedTask: InstanceType<typeof IdleTaskQueue>;\n  private _isFlushingDeleted = false;\n\n  constructor(\n    private readonly _getKey: (value: T) => number,\n    logService: ILogService\n  ) {\n    this._flushInsertedTask = new IdleTaskQueue(logService);\n    this._flushDeletedTask = new IdleTaskQueue(logService);\n  }\n\n  public clear(): void {\n    this._array.length = 0;\n    this._insertedValues.length = 0;\n    this._flushInsertedTask.clear();\n    this._isFlushingInserted = false;\n    this._deletedIndices.length = 0;\n    this._flushDeletedTask.clear();\n    this._isFlushingDeleted = false;\n  }\n\n  public insert(value: T): void {\n    this._flushCleanupDeleted();\n    if (this._insertedValues.length === 0) {\n      this._flushInsertedTask.enqueue(() => this._flushInserted());\n    }\n    this._insertedValues.push(value);\n  }\n\n  private _flushInserted(): void {\n    const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n    let sortedAddedValuesIndex = 0;\n    let arrayIndex = 0;\n\n    const newArray = new Array(this._array.length + this._insertedValues.length);\n\n    for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n      if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n        newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n        sortedAddedValuesIndex++;\n      } else {\n        newArray[newArrayIndex] = this._array[arrayIndex++];\n      }\n    }\n\n    this._array = newArray;\n    this._insertedValues.length = 0;\n  }\n\n  private _flushCleanupInserted(): void {\n    if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n      this._flushInsertedTask.flush();\n    }\n  }\n\n  public delete(value: T): boolean {\n    this._flushCleanupInserted();\n    if (this._array.length === 0) {\n      return false;\n    }\n    const key = this._getKey(value);\n    if (key === undefined) {\n      return false;\n    }\n    i = this._search(key);\n    if (i === -1) {\n      return false;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return false;\n    }\n    do {\n      if (this._array[i] === value) {\n        if (this._deletedIndices.length === 0) {\n          this._flushDeletedTask.enqueue(() => this._flushDeleted());\n        }\n        this._deletedIndices.push(i);\n        return true;\n      }\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n    return false;\n  }\n\n  private _flushDeleted(): void {\n    this._isFlushingDeleted = true;\n    const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n    let sortedDeletedIndicesIndex = 0;\n    const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n    let newArrayIndex = 0;\n    for (let i = 0; i < this._array.length; i++) {\n      if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n        sortedDeletedIndicesIndex++;\n      } else {\n        newArray[newArrayIndex++] = this._array[i];\n      }\n    }\n    this._array = newArray;\n    this._deletedIndices.length = 0;\n    this._isFlushingDeleted = false;\n  }\n\n  private _flushCleanupDeleted(): void {\n    if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n      this._flushDeletedTask.flush();\n    }\n  }\n\n  public *getKeyIterator(key: number): IterableIterator<T> {\n    this._flushCleanupInserted();\n    this._flushCleanupDeleted();\n    if (this._array.length === 0) {\n      return;\n    }\n    i = this._search(key);\n    if (i < 0 || i >= this._array.length) {\n      return;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return;\n    }\n    do {\n      yield this._array[i];\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n  }\n\n  public forEachByKey(key: number, callback: (value: T) => void): void {\n    this._flushCleanupInserted();\n    this._flushCleanupDeleted();\n    if (this._array.length === 0) {\n      return;\n    }\n    i = this._search(key);\n    if (i < 0 || i >= this._array.length) {\n      return;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return;\n    }\n    do {\n      callback(this._array[i]);\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n  }\n\n  public values(): IterableIterator<T> {\n    this._flushCleanupInserted();\n    this._flushCleanupDeleted();\n    // Duplicate the array to avoid issues when _array changes while iterating\n    return [...this._array].values();\n  }\n\n  private _search(key: number): number {\n    let min = 0;\n    let max = this._array.length - 1;\n    while (max >= min) {\n      let mid = (min + max) >> 1;\n      const midKey = this._getKey(this._array[mid]);\n      if (midKey > key) {\n        max = mid - 1;\n      } else if (midKey < key) {\n        min = mid + 1;\n      } else {\n        // key in list, walk to lowest duplicate\n        while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n          mid--;\n        }\n        return mid;\n      }\n    }\n    // key not in list\n    // still return closest min (also used as insert position)\n    return min;\n  }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { css } from 'common/Color';\nimport { Disposable, DisposableStore, toDisposable } from 'common/Lifecycle';\nimport { IDecorationService, IInternalDecoration, ILogService } from 'common/services/Services';\nimport { SortedList } from 'common/SortedList';\nimport { IColor } from 'common/Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from 'common/Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\nlet $ymin = 0;\nlet $ymax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n  public serviceBrand: any;\n\n  /**\n   * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n   * while marker line values do change, they should all change by the same amount so this should\n   * never become out of order.\n   */\n  private readonly _decorations: SortedList<IInternalDecoration>;\n\n  private readonly _onDecorationRegistered = this._register(new Emitter<IInternalDecoration>());\n  public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n  private readonly _onDecorationRemoved = this._register(new Emitter<IInternalDecoration>());\n  public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n  public get decorations(): IterableIterator<IInternalDecoration> { return this._decorations.values(); }\n\n  constructor(@ILogService private readonly _logService: ILogService) {\n    super();\n\n    this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n    this._register(toDisposable(() => this.reset()));\n  }\n\n  public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n    if (options.marker.isDisposed) {\n      return undefined;\n    }\n    const decoration = new Decoration(options);\n    if (decoration) {\n      const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n      const listener = decoration.onDispose(() => {\n        listener.dispose();\n        if (decoration) {\n          if (this._decorations.delete(decoration)) {\n            this._onDecorationRemoved.fire(decoration);\n          }\n          markerDispose.dispose();\n        }\n      });\n      this._decorations.insert(decoration);\n      this._onDecorationRegistered.fire(decoration);\n    }\n    return decoration;\n  }\n\n  public reset(): void {\n    for (const d of this._decorations.values()) {\n      d.dispose();\n    }\n    this._decorations.clear();\n  }\n\n  public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator<IInternalDecoration> {\n    let xmin = 0;\n    let xmax = 0;\n    let ymin = 0;\n    let ymax = 0;\n    for (const d of this._decorations.values()) {\n      ymin = d.marker.line;\n      ymax = ymin + (d.options.height ?? 1);\n      if (line < ymin || line >= ymax) {\n        continue;\n      }\n      xmin = d.options.x ?? 0;\n      xmax = xmin + (d.options.width ?? 1);\n      if (x >= xmin && x < xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n        yield d;\n      }\n    }\n  }\n\n  public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n    for (const d of this._decorations.values()) {\n      $ymin = d.marker.line;\n      $ymax = $ymin + (d.options.height ?? 1);\n      if (line < $ymin || line >= $ymax) {\n        continue;\n      }\n      $xmin = d.options.x ?? 0;\n      $xmax = $xmin + (d.options.width ?? 1);\n      if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n        callback(d);\n      }\n    }\n  }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n  public readonly marker: IMarker;\n  public element: HTMLElement | undefined;\n\n  public readonly onRenderEmitter = this.add(new Emitter<HTMLElement>());\n  public readonly onRender = this.onRenderEmitter.event;\n  private readonly _onDispose = this.add(new Emitter<void>());\n  public readonly onDispose = this._onDispose.event;\n\n  private _cachedBg: IColor | undefined | null = null;\n  public get backgroundColorRGB(): IColor | undefined {\n    if (this._cachedBg === null) {\n      if (this.options.backgroundColor) {\n        this._cachedBg = css.toColor(this.options.backgroundColor);\n      } else {\n        this._cachedBg = undefined;\n      }\n    }\n    return this._cachedBg;\n  }\n\n  private _cachedFg: IColor | undefined | null = null;\n  public get foregroundColorRGB(): IColor | undefined {\n    if (this._cachedFg === null) {\n      if (this.options.foregroundColor) {\n        this._cachedFg = css.toColor(this.options.foregroundColor);\n      } else {\n        this._cachedFg = undefined;\n      }\n    }\n    return this._cachedFg;\n  }\n\n  constructor(\n    public readonly options: IDecorationOptions\n  ) {\n    super();\n    this.marker = options.marker;\n    if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n      this.options.overviewRulerOptions.position = 'full';\n    }\n  }\n\n  public override dispose(): void {\n    this._onDispose.fire();\n    super.dispose();\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\nimport { IRenderDebouncer } from 'browser/Types';\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n  private _rowStart: number | undefined;\n  private _rowEnd: number | undefined;\n  private _rowCount: number | undefined;\n\n  // The last moment that the Terminal was refreshed at\n  private _lastRefreshMs = 0;\n  // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n  private _additionalRefreshRequested = false;\n\n  private _refreshTimeoutID: number | undefined;\n\n  constructor(\n    private _renderCallback: (start: number, end: number) => void,\n    private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n  ) {\n  }\n\n  public dispose(): void {\n    if (this._refreshTimeoutID) {\n      clearTimeout(this._refreshTimeoutID);\n    }\n  }\n\n  public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n    this._rowCount = rowCount;\n    // Get the min/max row start/end for the arg values\n    rowStart = rowStart ?? 0;\n    rowEnd = rowEnd ?? this._rowCount - 1;\n    // Set the properties to the updated values\n    this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n    this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n    // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n    // enough time to pass before refreshing again.\n    const refreshRequestTime: number = performance.now();\n    if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n      // Enough time has lapsed since the last refresh; refresh immediately\n      this._lastRefreshMs = refreshRequestTime;\n      this._innerRefresh();\n    } else if (!this._additionalRefreshRequested) {\n      // This is the first additional request throttled; set up trailing refresh\n      const elapsed = refreshRequestTime - this._lastRefreshMs;\n      const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n      this._additionalRefreshRequested = true;\n\n      this._refreshTimeoutID = window.setTimeout(() => {\n        this._lastRefreshMs = performance.now();\n        this._innerRefresh();\n        this._additionalRefreshRequested = false;\n        this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n      }, waitPeriodBeforeTrailingRefresh);\n    }\n  }\n\n  private _innerRefresh(): void {\n    // Make sure values are set\n    if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n      return;\n    }\n\n    // Clamp values\n    const start = Math.max(this._rowStart, 0);\n    const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n    // Reset debouncer (this happens before render callback as the render could trigger it again)\n    this._rowStart = undefined;\n    this._rowEnd = undefined;\n\n    // Run render callback\n    this._renderCallback(start, end);\n  }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from 'browser/Types';\nimport { TimeBasedDebouncer } from 'browser/TimeBasedDebouncer';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from 'browser/services/Services';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IInstantiationService } from 'common/services/Services';\nimport { addDisposableListener } from 'browser/Dom';\n\nconst MAX_ROWS_TO_READ = 20;\n\nconst enum BoundaryPosition {\n  TOP,\n  BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n  private _debugRootContainer: HTMLElement | undefined;\n  private _accessibilityContainer: HTMLElement;\n\n  private _rowContainer: HTMLElement;\n  private _rowElements: HTMLElement[];\n  private _rowColumns: WeakMap<HTMLElement, number[]> = new WeakMap();\n\n  private _liveRegion: HTMLElement;\n  private _liveRegionLineCount: number = 0;\n  private _liveRegionDebouncer: IRenderDebouncer;\n\n  private _topBoundaryFocusListener: (e: FocusEvent) => void;\n  private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n  /**\n   * This queue has a character pushed to it for keys that are pressed, if the\n   * next character added to the terminal is equal to the key char then it is\n   * not announced (added to live region) because it has already been announced\n   * by the textarea event (which cannot be canceled). There are some race\n   * condition cases if there is typing while data is streaming, but this covers\n   * the main case of typing into the prompt and inputting the answer to a\n   * question (Y/N, etc.).\n   */\n  private _charsToConsume: string[] = [];\n\n  private _charsToAnnounce: string = '';\n\n  constructor(\n    private readonly _terminal: ITerminal,\n    @IInstantiationService instantiationService: IInstantiationService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    super();\n    const doc = this._coreBrowserService.mainDocument;\n    this._accessibilityContainer = doc.createElement('div');\n    this._accessibilityContainer.classList.add('xterm-accessibility');\n\n    this._rowContainer = doc.createElement('div');\n    this._rowContainer.setAttribute('role', 'list');\n    this._rowContainer.classList.add('xterm-accessibility-tree');\n    this._rowElements = [];\n    for (let i = 0; i < this._terminal.rows; i++) {\n      this._rowElements[i] = this._createAccessibilityTreeNode();\n      this._rowContainer.appendChild(this._rowElements[i]);\n    }\n\n    this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n    this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n    this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    this._accessibilityContainer.appendChild(this._rowContainer);\n\n    this._liveRegion = doc.createElement('div');\n    this._liveRegion.classList.add('live-region');\n    this._liveRegion.setAttribute('aria-live', 'assertive');\n    this._accessibilityContainer.appendChild(this._liveRegion);\n    this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n    if (!this._terminal.element) {\n      throw new Error('Cannot enable accessibility before Terminal.open');\n    }\n\n    if (DEBUG) {\n      this._accessibilityContainer.classList.add('debug');\n      this._rowContainer.classList.add('debug');\n\n      // Use a `<div class=\"xterm\">` container so that the css will still apply.\n      this._debugRootContainer = doc.createElement('div');\n      this._debugRootContainer.classList.add('xterm');\n\n      this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n      this._debugRootContainer.appendChild(this._accessibilityContainer);\n      this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n      this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n    } else {\n      this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n    }\n\n    this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n    this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n    this._register(this._terminal.onScroll(() => this._refreshRows()));\n    // Line feed is an issue as the prompt won't be read out after a command is run\n    this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n    this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n    this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n    this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n    this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n    this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n    this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n    this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n    this._refreshRowsDimensions();\n    this._refreshRows();\n    this._register(toDisposable(() => {\n      if (DEBUG) {\n        this._debugRootContainer!.remove();\n      } else {\n        this._accessibilityContainer.remove();\n      }\n      this._rowElements.length = 0;\n    }));\n  }\n\n  private _handleTab(spaceCount: number): void {\n    for (let i = 0; i < spaceCount; i++) {\n      this._handleChar(' ');\n    }\n  }\n\n  private _handleChar(char: string): void {\n    if (this._liveRegionLineCount < MAX_ROWS_TO_READ + 1) {\n      if (this._charsToConsume.length > 0) {\n        // Have the screen reader ignore the char if it was just input\n        const shiftedChar = this._charsToConsume.shift();\n        if (shiftedChar !== char) {\n          this._charsToAnnounce += char;\n        }\n      } else {\n        this._charsToAnnounce += char;\n      }\n\n      if (char === '\\n') {\n        this._liveRegionLineCount++;\n        if (this._liveRegionLineCount === MAX_ROWS_TO_READ + 1) {\n          this._liveRegion.textContent = Strings.tooMuchOutput.get();\n        }\n      }\n    }\n  }\n\n  private _clearLiveRegion(): void {\n    this._liveRegion.textContent = '';\n    this._liveRegionLineCount = 0;\n  }\n\n  private _handleKey(keyChar: string): void {\n    this._clearLiveRegion();\n    // Only add the char if there is no control character.\n    if (!/\\p{Control}/u.test(keyChar)) {\n      this._charsToConsume.push(keyChar);\n    }\n  }\n\n  private _refreshRows(start?: number, end?: number): void {\n    this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n  }\n\n  private _renderRows(start: number, end: number): void {\n    const buffer: IBuffer = this._terminal.buffer;\n    const setSize = buffer.lines.length.toString();\n    for (let i = start; i <= end; i++) {\n      const line = buffer.lines.get(buffer.ydisp + i);\n      const columns: number[] = [];\n      const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n      const posInSet = (buffer.ydisp + i + 1).toString();\n      const element = this._rowElements[i];\n      if (element) {\n        if (lineData.length === 0) {\n          element.textContent = '\\u00a0';\n          this._rowColumns.set(element, [0, 1]);\n        } else {\n          element.textContent = lineData;\n          this._rowColumns.set(element, columns);\n        }\n        element.setAttribute('aria-posinset', posInSet);\n        element.setAttribute('aria-setsize', setSize);\n        this._alignRowWidth(element);\n      }\n    }\n    this._announceCharacters();\n  }\n\n  private _announceCharacters(): void {\n    if (this._charsToAnnounce.length === 0) {\n      return;\n    }\n    if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n      this._clearLiveRegion();\n    }\n    this._liveRegion.textContent += this._charsToAnnounce;\n    this._charsToAnnounce = '';\n  }\n\n  private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n    const boundaryElement = e.target as HTMLElement;\n    const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n    // Don't scroll if the buffer top has reached the end in that direction\n    const posInSet = boundaryElement.getAttribute('aria-posinset');\n    const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n    if (posInSet === lastRowPos) {\n      return;\n    }\n\n    // Don't scroll when the last focused item was not the second row (focus is going the other\n    // direction)\n    if (e.relatedTarget !== beforeBoundaryElement) {\n      return;\n    }\n\n    // Remove old boundary element from array\n    let topBoundaryElement: HTMLElement;\n    let bottomBoundaryElement: HTMLElement;\n    if (position === BoundaryPosition.TOP) {\n      topBoundaryElement = boundaryElement;\n      bottomBoundaryElement = this._rowElements.pop()!;\n      this._rowContainer.removeChild(bottomBoundaryElement);\n    } else {\n      topBoundaryElement = this._rowElements.shift()!;\n      bottomBoundaryElement = boundaryElement;\n      this._rowContainer.removeChild(topBoundaryElement);\n    }\n\n    // Remove listeners from old boundary elements\n    topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n    bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Add new element to array/DOM\n    if (position === BoundaryPosition.TOP) {\n      const newElement = this._createAccessibilityTreeNode();\n      this._rowElements.unshift(newElement);\n      this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n    } else {\n      const newElement = this._createAccessibilityTreeNode();\n      this._rowElements.push(newElement);\n      this._rowContainer.appendChild(newElement);\n    }\n\n    // Add listeners to new boundary elements\n    this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Scroll up\n    this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n    // Focus new boundary before element\n    this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n    // Prevent the standard behavior\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  }\n\n  private _handleSelectionChange(): void {\n    if (this._rowElements.length === 0) {\n      return;\n    }\n\n    const selection = this._coreBrowserService.mainDocument.getSelection();\n    if (!selection) {\n      return;\n    }\n\n    if (selection.isCollapsed) {\n      // Only do something when the anchorNode is inside the row container. This\n      // behavior mirrors what we do with mouse --- if the mouse clicks\n      // somewhere outside of the terminal, we don't clear the selection.\n      if (this._rowContainer.contains(selection.anchorNode)) {\n        this._terminal.clearSelection();\n      }\n      return;\n    }\n\n    if (!selection.anchorNode || !selection.focusNode) {\n      console.error('anchorNode and/or focusNode are null');\n      return;\n    }\n\n    // Sort the two selection points in document order.\n    let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n    let end = { node: selection.focusNode, offset: selection.focusOffset };\n    if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n      [begin, end] = [end, begin];\n    }\n\n    // Clamp begin/end to the inside of the row container.\n    if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n      begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n    }\n    if (!this._rowContainer.contains(begin.node)) {\n      // This happens when `begin` is below the last row.\n      return;\n    }\n    const lastRowElement = this._rowElements.slice(-1)[0];\n    if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n      end = {\n        node: lastRowElement,\n        offset: lastRowElement.textContent?.length ?? 0\n      };\n    }\n    if (!this._rowContainer.contains(end.node)) {\n      // This happens when `end` is above the first row.\n      return;\n    }\n\n    const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n      // `node` is either the row element or the Text node inside it.\n      const rowElement: any = node instanceof Text ? node.parentNode : node;\n      let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n      if (isNaN(row)) {\n        console.warn('row is invalid. Race condition?');\n        return null;\n      }\n\n      const columns = this._rowColumns.get(rowElement);\n      if (!columns) {\n        console.warn('columns is null. Race condition?');\n        return null;\n      }\n\n      let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n      if (column >= this._terminal.cols) {\n        ++row;\n        column = 0;\n      }\n      return {\n        row,\n        column\n      };\n    };\n\n    const beginRowColumn = toRowColumn(begin);\n    const endRowColumn = toRowColumn(end);\n\n    if (!beginRowColumn || !endRowColumn) {\n      return;\n    }\n\n    if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n      // This should not happen unless we have some bugs.\n      throw new Error('invalid range');\n    }\n\n    this._terminal.select(\n      beginRowColumn.column,\n      beginRowColumn.row,\n      (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n    );\n  }\n\n  private _handleResize(rows: number): void {\n    // Remove bottom boundary listener\n    this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Grow rows as required\n    for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n      this._rowElements[i] = this._createAccessibilityTreeNode();\n      this._rowContainer.appendChild(this._rowElements[i]);\n    }\n    // Shrink rows as required\n    while (this._rowElements.length > rows) {\n      this._rowContainer.removeChild(this._rowElements.pop()!);\n    }\n\n    // Add bottom boundary listener\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    this._refreshRowsDimensions();\n  }\n\n  private _createAccessibilityTreeNode(): HTMLElement {\n    const element = this._coreBrowserService.mainDocument.createElement('div');\n    element.setAttribute('role', 'listitem');\n    element.tabIndex = -1;\n    this._refreshRowDimensions(element);\n    return element;\n  }\n\n  private _refreshRowsDimensions(): void {\n    if (!this._renderService.dimensions.css.cell.height) {\n      return;\n    }\n    Object.assign(this._accessibilityContainer.style, {\n      width: `${this._renderService.dimensions.css.canvas.width}px`,\n      fontSize: `${this._terminal.options.fontSize}px`\n    });\n    if (this._rowElements.length !== this._terminal.rows) {\n      this._handleResize(this._terminal.rows);\n    }\n    for (let i = 0; i < this._terminal.rows; i++) {\n      this._refreshRowDimensions(this._rowElements[i]);\n      this._alignRowWidth(this._rowElements[i]);\n    }\n  }\n\n  private _refreshRowDimensions(element: HTMLElement): void {\n    element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n  }\n\n  /**\n   * Scale the width of a row so that each of the character is (mostly) aligned\n   * with the actual rendering. This will allow the screen reader to draw\n   * selection outline at the correct position.\n   *\n   * On top of using the \"monospace\" font and correct font size, the scaling\n   * here is necessary to handle characters that are not covered by the font\n   * (e.g. CJK).\n   */\n  private _alignRowWidth(element: HTMLElement): void {\n    element.style.transform = '';\n    const width = element.getBoundingClientRect().width;\n    const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n    if (!lastColumn) {\n      return;\n    }\n    const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n    element.style.transform = `scaleX(${targetWidth / width})`;\n  }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { Disposable, dispose, toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { IBufferService } from 'common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n  public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n  protected _currentLink: ILinkWithState | undefined;\n  private _mouseDownLink: ILinkWithState | undefined;\n  private _lastMouseEvent: MouseEvent | undefined;\n  private _linkCacheDisposables: IDisposable[] = [];\n  private _lastBufferCell: IBufferCellPosition | undefined;\n  private _isMouseOut: boolean = true;\n  private _wasResized: boolean = false;\n  private _activeProviderReplies: Map<Number, ILinkWithState[] | undefined> | undefined;\n  private _activeLine: number = -1;\n\n  private readonly _onShowLinkUnderline = this._register(new Emitter<ILinkifierEvent>());\n  public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n  private readonly _onHideLinkUnderline = this._register(new Emitter<ILinkifierEvent>());\n  public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n  constructor(\n    private readonly _element: HTMLElement,\n    @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n  ) {\n    super();\n    this._register(toDisposable(() => {\n      dispose(this._linkCacheDisposables);\n      this._linkCacheDisposables.length = 0;\n      this._lastMouseEvent = undefined;\n      // Clear out link providers as they could easily cause an embedder memory leak\n      this._activeProviderReplies?.clear();\n    }));\n    // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n    this._register(this._bufferService.onResize(() => {\n      this._clearCurrentLink();\n      this._wasResized = true;\n    }));\n    this._register(addDisposableListener(this._element, 'mouseleave', () => {\n      this._isMouseOut = true;\n      this._clearCurrentLink();\n    }));\n    this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n    this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n    this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n  }\n\n  private _handleMouseMove(event: MouseEvent): void {\n    this._lastMouseEvent = event;\n\n    const position = this._positionFromMouseEvent(event, this._element);\n    if (!position) {\n      return;\n    }\n    this._isMouseOut = false;\n\n    // Ignore the event if it's an embedder created hover widget\n    const composedPath = event.composedPath() as HTMLElement[];\n    for (let i = 0; i < composedPath.length; i++) {\n      const target = composedPath[i];\n      // Hit Terminal.element, break and continue\n      if (target.classList.contains('xterm')) {\n        break;\n      }\n      // It's a hover, don't respect hover event\n      if (target.classList.contains('xterm-hover')) {\n        return;\n      }\n    }\n\n    if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n      this._handleHover(position);\n      this._lastBufferCell = position;\n    }\n  }\n\n  private _handleHover(position: IBufferCellPosition): void {\n    // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n    //       should be something like `activeRange: {startY, endY}`\n    // Check if we need to clear the link\n    if (this._activeLine !== position.y || this._wasResized) {\n      this._clearCurrentLink();\n      this._askForLink(position, false);\n      this._wasResized = false;\n      return;\n    }\n\n    // Check the if the link is in the mouse position\n    const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n    if (!isCurrentLinkInPosition) {\n      this._clearCurrentLink();\n      this._askForLink(position, true);\n    }\n  }\n\n  private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n    if (!this._activeProviderReplies || !useLineCache) {\n      this._activeProviderReplies?.forEach(reply => {\n        reply?.forEach(linkWithState => {\n          if (linkWithState.link.dispose) {\n            linkWithState.link.dispose();\n          }\n        });\n      });\n      this._activeProviderReplies = new Map();\n      this._activeLine = position.y;\n    }\n    let linkProvided = false;\n\n    // There is no link cached, so ask for one\n    for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n      if (useLineCache) {\n        const existingReply = this._activeProviderReplies?.get(i);\n        // If there isn't a reply, the provider hasn't responded yet.\n\n        // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n        // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n        // needs promises to get fixed\n        if (existingReply) {\n          linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n        }\n      } else {\n        linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n          if (this._isMouseOut) {\n            return;\n          }\n          const linksWithState: ILinkWithState[] | undefined = links?.map(link  => ({ link }));\n          this._activeProviderReplies?.set(i, linksWithState);\n          linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n          // If all providers have responded, remove lower priority links that intersect ranges of\n          // higher priority links\n          if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n            this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n          }\n        });\n      }\n    }\n  }\n\n  private _removeIntersectingLinks(y: number, replies: Map<Number, ILinkWithState[] | undefined>): void {\n    const occupiedCells = new Set<number>();\n    for (let i = 0; i < replies.size; i++) {\n      const providerReply = replies.get(i);\n      if (!providerReply) {\n        continue;\n      }\n      for (let i = 0; i < providerReply.length; i++) {\n        const linkWithState = providerReply[i];\n        const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n        const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n        for (let x = startX; x <= endX; x++) {\n          if (occupiedCells.has(x)) {\n            providerReply.splice(i--, 1);\n            break;\n          }\n          occupiedCells.add(x);\n        }\n      }\n    }\n  }\n\n  private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n    if (!this._activeProviderReplies) {\n      return linkProvided;\n    }\n\n    const links = this._activeProviderReplies.get(index);\n\n    // Check if every provider before this one has come back undefined\n    let hasLinkBefore = false;\n    for (let j = 0; j < index; j++) {\n      if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n        hasLinkBefore = true;\n      }\n    }\n\n    // If all providers with higher priority came back undefined, then this provider's link for\n    // the position should be used\n    if (!hasLinkBefore && links) {\n      const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n      if (linkAtPosition) {\n        linkProvided = true;\n        this._handleNewLink(linkAtPosition);\n      }\n    }\n\n    // Check if all the providers have responded\n    if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n      // Respect the order of the link providers\n      for (let j = 0; j < this._activeProviderReplies.size; j++) {\n        const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n        if (currentLink) {\n          linkProvided = true;\n          this._handleNewLink(currentLink);\n          break;\n        }\n      }\n    }\n\n    return linkProvided;\n  }\n\n  private _handleMouseDown(): void {\n    this._mouseDownLink = this._currentLink;\n  }\n\n  private _handleMouseUp(event: MouseEvent): void {\n    if (!this._currentLink) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(event, this._element);\n    if (!position) {\n      return;\n    }\n\n    if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n      this._currentLink.link.activate(event, this._currentLink.link.text);\n    }\n  }\n\n  private _clearCurrentLink(startRow?: number, endRow?: number): void {\n    if (!this._currentLink || !this._lastMouseEvent) {\n      return;\n    }\n\n    // If we have a start and end row, check that the link is within it\n    if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n      this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n      this._currentLink = undefined;\n      dispose(this._linkCacheDisposables);\n      this._linkCacheDisposables.length = 0;\n    }\n  }\n\n  private _handleNewLink(linkWithState: ILinkWithState): void {\n    if (!this._lastMouseEvent) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n    if (!position) {\n      return;\n    }\n\n    // Trigger hover if the we have a link at the position\n    if (this._linkAtPosition(linkWithState.link, position)) {\n      this._currentLink = linkWithState;\n      this._currentLink.state = {\n        decorations: {\n          underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n          pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n        },\n        isHovered: true\n      };\n      this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n      // Add listener for tracking decorations changes\n      linkWithState.link.decorations = {} as ILinkDecorations;\n      Object.defineProperties(linkWithState.link.decorations, {\n        pointerCursor: {\n          get: () => this._currentLink?.state?.decorations.pointerCursor,\n          set: v => {\n            if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n              this._currentLink.state.decorations.pointerCursor = v;\n              if (this._currentLink.state.isHovered) {\n                this._element.classList.toggle('xterm-cursor-pointer', v);\n              }\n            }\n          }\n        },\n        underline: {\n          get: () => this._currentLink?.state?.decorations.underline,\n          set: v => {\n            if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n              this._currentLink.state.decorations.underline = v;\n              if (this._currentLink.state.isHovered) {\n                this._fireUnderlineEvent(linkWithState.link, v);\n              }\n            }\n          }\n        }\n      });\n\n      // Listen to viewport changes to re-render the link under the cursor (only when the line the\n      // link is on changes)\n      this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n        // Sanity check, this shouldn't happen in practice as this listener would be disposed\n        if (!this._currentLink) {\n          return;\n        }\n        // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n        // cleared.\n        const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n        const end = this._bufferService.buffer.ydisp + 1 + e.end;\n        // Only clear the link if the viewport change happened on this line\n        if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n          this._clearCurrentLink(start, end);\n          if (this._lastMouseEvent) {\n            // re-eval previously active link after changes\n            const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n            if (position) {\n              this._askForLink(position, false);\n            }\n          }\n        }\n      }));\n    }\n  }\n\n  protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n    if (this._currentLink?.state) {\n      this._currentLink.state.isHovered = true;\n      if (this._currentLink.state.decorations.underline) {\n        this._fireUnderlineEvent(link, true);\n      }\n      if (this._currentLink.state.decorations.pointerCursor) {\n        element.classList.add('xterm-cursor-pointer');\n      }\n    }\n\n    if (link.hover) {\n      link.hover(event, link.text);\n    }\n  }\n\n  private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n    const range = link.range;\n    const scrollOffset = this._bufferService.buffer.ydisp;\n    const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n    const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n    emitter.fire(event);\n  }\n\n  protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n    if (this._currentLink?.state) {\n      this._currentLink.state.isHovered = false;\n      if (this._currentLink.state.decorations.underline) {\n        this._fireUnderlineEvent(link, false);\n      }\n      if (this._currentLink.state.decorations.pointerCursor) {\n        element.classList.remove('xterm-cursor-pointer');\n      }\n    }\n\n    if (link.leave) {\n      link.leave(event, link.text);\n    }\n  }\n\n  /**\n   * Check if the buffer position is within the link\n   * @param link\n   * @param position\n   */\n  private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n    const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n    const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n    const current = position.y * this._bufferService.cols + position.x;\n    return (lower <= current && current <= upper);\n  }\n\n  /**\n   * Get the buffer position from a mouse event\n   * @param event\n   */\n  private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n    const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n    if (!coords) {\n      return;\n    }\n\n    return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n  }\n\n  private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n    return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n  }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n  return (\n    a.text === b.text &&\n    a.range.start.x === b.range.start.x &&\n    a.range.start.y === b.range.start.y &&\n    a.range.end.x === b.range.end.x &&\n    a.range.end.y === b.range.end.y\n  );\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n *   Fabrice Bellard's javascript vt100 for jslinux:\n *   http://bellard.org/jslinux/\n *   Copyright (c) 2011 Fabrice Bellard\n *   The original design remains. The terminal itself\n *   has been extended to include xterm CSI codes, among\n *   other features.\n *\n * Terminal Emulation References:\n *   http://vt100.net/\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n *   http://invisible-island.net/vttest/\n *   http://www.inwap.com/pdp10/ansicode.txt\n *   http://linux.die.net/man/4/console_codes\n *   http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from 'browser/Clipboard';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { OscLinkProvider } from 'browser/OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from 'browser/Types';\nimport { Viewport } from 'browser/Viewport';\nimport { BufferDecorationRenderer } from 'browser/decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from 'browser/decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from 'browser/input/CompositionHelper';\nimport { DomRenderer } from 'browser/renderer/dom/DomRenderer';\nimport { IRenderer } from 'browser/renderer/shared/Types';\nimport { CharSizeService } from 'browser/services/CharSizeService';\nimport { CharacterJoinerService } from 'browser/services/CharacterJoinerService';\nimport { CoreBrowserService } from 'browser/services/CoreBrowserService';\nimport { LinkProviderService } from 'browser/services/LinkProviderService';\nimport { MouseCoordsService } from 'browser/services/MouseCoordsService';\nimport { MouseService } from 'browser/services/MouseService';\nimport { RenderService } from 'browser/services/RenderService';\nimport { SelectionService } from 'browser/services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services';\nimport { ThemeService } from 'browser/services/ThemeService';\nimport { KeyboardService } from 'browser/services/KeyboardService';\nimport { channels, color, rgb } from 'common/Color';\nimport { CoreTerminal } from 'common/CoreTerminal';\nimport * as Browser from 'common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from 'common/Types';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { IBuffer } from 'common/buffer/Types';\nimport { C0, C1ESCAPED } from 'common/data/EscapeSequences';\nimport { toRgbString } from 'common/input/XParseColor';\nimport { DecorationService } from 'common/services/DecorationService';\nimport { IDecorationService } from 'common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\nimport { MutableDisposable, toDisposable } from 'common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n  public textarea: HTMLTextAreaElement | undefined;\n  public element: HTMLElement | undefined;\n  public screenElement: HTMLElement | undefined;\n\n  private _document: Document | undefined;\n  private _viewportElement: HTMLElement | undefined;\n  private _helperContainer: HTMLElement | undefined;\n  private _compositionView: HTMLElement | undefined;\n\n  private readonly _linkifier: MutableDisposable<ILinkifier2> = this._register(new MutableDisposable());\n  public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n  private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n  private _viewport: Viewport | undefined;\n\n  public browser: IBrowser = Browser as any;\n\n  private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n  // Browser services\n  private readonly _decorationService: DecorationService;\n  private readonly _keyboardService: IKeyboardService;\n  private readonly _linkProviderService: ILinkProviderService;\n\n  // Optional browser services\n  private _charSizeService: ICharSizeService | undefined;\n  private _coreBrowserService: ICoreBrowserService | undefined;\n  private _mouseCoordsService: IMouseCoordsService | undefined;\n  private _mouseService: IMouseService | undefined;\n  private _renderService: IRenderService | undefined;\n  private _themeService: IThemeService | undefined;\n  private _characterJoinerService: ICharacterJoinerService | undefined;\n  private _selectionService: ISelectionService | undefined;\n\n  /**\n   * Records whether the keydown event has already been handled and triggered a data event, if so\n   * the keypress event should not trigger a data event but should still print to the textarea so\n   * screen readers will announce it.\n   */\n  private _keyDownHandled: boolean = false;\n\n  /**\n   * Records whether a keydown event has occured since the last keyup event, i.e. whether a key\n   * is currently \"pressed\".\n   */\n  private _keyDownSeen: boolean = false;\n\n  /**\n   * Records whether the keypress event has already been handled and triggered a data event, if so\n   * the input event should not trigger a data event but should still print to the textarea so\n   * screen readers will announce it.\n   */\n  private _keyPressHandled: boolean = false;\n\n  /**\n   * Records whether there has been a keydown event for a dead key without a corresponding keydown\n   * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n   * no events will be emitted for the final character.\n   */\n  private _unprocessedDeadKey: boolean = false;\n\n  private _compositionHelper: ICompositionHelper | undefined;\n  private _accessibilityManager: MutableDisposable<AccessibilityManager> = this._register(new MutableDisposable());\n\n  private readonly _onCursorMove = this._register(new Emitter<void>());\n  public readonly onCursorMove = this._onCursorMove.event;\n  private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n  public readonly onKey = this._onKey.event;\n  private readonly _onSelectionChange = this._register(new Emitter<void>());\n  public readonly onSelectionChange = this._onSelectionChange.event;\n  private readonly _onTitleChange = this._register(new Emitter<string>());\n  public readonly onTitleChange = this._onTitleChange.event;\n  private readonly _onBell = this._register(new Emitter<void>());\n  public readonly onBell = this._onBell.event;\n\n  private _onFocus = this._register(new Emitter<void>());\n  public get onFocus(): IEvent<void> { return this._onFocus.event; }\n  private _onBlur = this._register(new Emitter<void>());\n  public get onBlur(): IEvent<void> { return this._onBlur.event; }\n  private _onA11yCharEmitter = this._register(new Emitter<string>());\n  public get onA11yChar(): IEvent<string> { return this._onA11yCharEmitter.event; }\n  private _onA11yTabEmitter = this._register(new Emitter<number>());\n  public get onA11yTab(): IEvent<number> { return this._onA11yTabEmitter.event; }\n  private _onWillOpen = this._register(new Emitter<HTMLElement>());\n  public get onWillOpen(): IEvent<HTMLElement> { return this._onWillOpen.event; }\n  private readonly _onDimensionsChange = this._register(new Emitter<IRenderDimensionsApi>());\n  public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n  public get dimensions(): IRenderDimensionsApi | undefined {\n    if (!this._renderService) {\n      return undefined;\n    }\n    const dimensions = this._renderService.dimensions;\n    return {\n      css: {\n        canvas: { ...dimensions.css.canvas },\n        cell: { ...dimensions.css.cell }\n      },\n      device: {\n        canvas: { ...dimensions.device.canvas },\n        cell: { ...dimensions.device.cell },\n        char: { ...dimensions.device.char }\n      }\n    };\n  }\n\n  constructor(\n    options: Partial<ITerminalOptions> = {}\n  ) {\n    super(options);\n\n    this._setup();\n\n    this._decorationService = this._instantiationService.createInstance(DecorationService);\n    this._instantiationService.setService(IDecorationService, this._decorationService);\n    this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n    this._instantiationService.setService(IKeyboardService, this._keyboardService);\n    this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n    this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n    this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n    // Setup InputHandler listeners\n    this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n    this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n    this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n    this._register(this._inputHandler.onRequestReset(() => this.reset()));\n    this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n    this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n    this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n    this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n    this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n    this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n    // Setup listeners\n    this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n    this._register(toDisposable(() => {\n      this._customKeyEventHandler = undefined;\n      this.element?.parentNode?.removeChild(this.element);\n    }));\n  }\n\n  /**\n   * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n   * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n   * or none restore requests (resetting all),\n   * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n   */\n  private _handleColorEvent(event: IColorEvent): void {\n    if (!this._themeService) return;\n    for (const req of event) {\n      let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n      let ident = '';\n      switch (req.index) {\n        case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n          acc = 'foreground';\n          ident = '10';\n          break;\n        case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n          acc = 'background';\n          ident = '11';\n          break;\n        case SpecialColorIndex.CURSOR: // OSC 12 | 112\n          acc = 'cursor';\n          ident = '12';\n          break;\n        default: // OSC 4 | 104\n          // we can skip the [0..255] range check here (already done in inputhandler)\n          acc = 'ansi';\n          ident = '4;' + req.index;\n      }\n      switch (req.type) {\n        case ColorRequestType.REPORT:\n          const colorRgb = color.toColorRGB(acc === 'ansi'\n            ? this._themeService.colors.ansi[req.index]\n            : this._themeService.colors[acc]);\n          this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n          break;\n        case ColorRequestType.SET:\n          if (acc === 'ansi') {\n            this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n          } else {\n            const narrowedAcc = acc;\n            this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n          }\n          break;\n        case ColorRequestType.RESTORE:\n          this._themeService.restoreColor(req.index);\n          break;\n      }\n    }\n  }\n\n  /**\n   * Reports the current color scheme (dark or light) based on the relative luminance\n   * of the background and foreground theme colors.\n   * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n   */\n  private _reportColorScheme(): void {\n    if (!this._themeService) return;\n    const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n    const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n    // Dark mode = background is darker than foreground (lower luminance)\n    const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n    this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n  }\n\n  protected _setup(): void {\n    super._setup();\n\n    this._customKeyEventHandler = undefined;\n  }\n\n  /**\n   * Convenience property to active buffer.\n   */\n  public get buffer(): IBuffer {\n    return this.buffers.active;\n  }\n\n  /**\n   * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n   */\n  public focus(): void {\n    if (this.textarea) {\n      this.textarea.focus({ preventScroll: true });\n    }\n  }\n\n  private _handleScreenReaderModeOptionChange(value: boolean): void {\n    if (value) {\n      if (!this._accessibilityManager.value && this._renderService) {\n        this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n      }\n    } else {\n      this._accessibilityManager.clear();\n    }\n  }\n\n  /**\n   * Binds the desired focus behavior on a given terminal object.\n   */\n  private _handleTextAreaFocus(ev: FocusEvent): void {\n    if (this.coreService.decPrivateModes.sendFocus) {\n      this.coreService.triggerDataEvent(C0.ESC + '[I');\n    }\n    this.element!.classList.add('focus');\n    this._showCursor();\n    this._onFocus.fire();\n  }\n\n  /**\n   * Blur the terminal, calling the blur function on the terminal's underlying\n   * textarea.\n   */\n  public blur(): void {\n    return this.textarea?.blur();\n  }\n\n  /**\n   * Binds the desired blur behavior on a given terminal object.\n   */\n  private _handleTextAreaBlur(): void {\n    // Text can safely be removed on blur. Doing it earlier could interfere with\n    // screen readers reading it out.\n    this.textarea!.value = '';\n    this.refresh(this.buffer.y, this.buffer.y);\n    if (this.coreService.decPrivateModes.sendFocus) {\n      this.coreService.triggerDataEvent(C0.ESC + '[O');\n    }\n    this.element!.classList.remove('focus');\n    this._onBlur.fire();\n  }\n\n  private _syncTextArea(): void {\n    if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n      return;\n    }\n    const cursorY = this.buffer.ybase + this.buffer.y;\n    const bufferLine = this.buffer.lines.get(cursorY);\n    if (!bufferLine) {\n      return;\n    }\n    const cursorX = Math.min(this.buffer.x, this.cols - 1);\n    const cellHeight = this._renderService.dimensions.css.cell.height;\n    const width = bufferLine.getWidth(cursorX);\n    const cellWidth = this._renderService.dimensions.css.cell.width * width;\n    const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n    const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n    // Sync the textarea to the exact position of the composition view so the IME knows where the\n    // text is.\n    this.textarea.style.left = cursorLeft + 'px';\n    this.textarea.style.top = cursorTop + 'px';\n    this.textarea.style.width = cellWidth + 'px';\n    this.textarea.style.height = cellHeight + 'px';\n    this.textarea.style.lineHeight = cellHeight + 'px';\n    this.textarea.style.zIndex = '-5';\n  }\n\n  /**\n   * Initialize default behavior\n   */\n  private _initGlobal(): void {\n    this._bindKeys();\n\n    // Bind clipboard functionality\n    this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n      // If mouse events are active it means the selection manager is disabled and\n      // copy should be handled by the host program.\n      if (!this.hasSelection()) {\n        return;\n      }\n      copyHandler(event, this._selectionService!);\n    }));\n    const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n    this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n    this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n    // Handle right click context menus\n    if (Browser.isFirefox) {\n      // Firefox doesn't appear to fire the contextmenu event on right click\n      this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n        if (event.button === 2) {\n          rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n        }\n      }));\n    } else {\n      this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n        rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n      }));\n    }\n\n    // Move the textarea under the cursor when middle clicking on Linux to ensure\n    // middle click to paste selection works. This only appears to work in Chrome\n    // at the time is writing.\n    if (Browser.isLinux) {\n      // Use auxclick event over mousedown the latter doesn't seem to work. Note\n      // that the regular click event doesn't fire for the middle mouse button.\n      this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n        if (event.button === 1) {\n          moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n        }\n      }));\n    }\n  }\n\n  /**\n   * Apply key handling to the terminal\n   */\n  private _bindKeys(): void {\n    this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n    this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n    this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n    this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n      // Ensure the textarea is synced to the latest cursor location before composition begins. This\n      // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n      // would cause the IME to appear in the wrong position. The theory is that when the IME is\n      // triggered during a partial render the textarea position becomes locked and will not move\n      // until it is hidden and a custom move occurs.\n      this._syncTextArea();\n      this._compositionHelper!.compositionstart();\n      this._compositionHelper!.updateCompositionElements();\n    }));\n    this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n    this._register(addDisposableListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n    this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n    this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n  }\n\n  /**\n   * Opens the terminal within an element.\n   *\n   * @param parent The element to create the terminal within.\n   */\n  public open(parent: HTMLElement): void {\n    if (!parent) {\n      throw new Error('Terminal requires a parent element.');\n    }\n\n    if (!parent.isConnected) {\n      this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n    }\n\n    // If the terminal is already opened\n    if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n      // Adjust the window if needed\n      if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n        this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n      }\n      return;\n    }\n\n    this._document = parent.ownerDocument;\n    if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n      this._document = this.optionsService.rawOptions.documentOverride as Document;\n    }\n\n    // Create main element container\n    this.element = this._document.createElement('div');\n    this.element.dir = 'ltr';   // xterm.css assumes LTR\n    this.element.classList.add('terminal');\n    this.element.classList.add('xterm');\n    this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n    this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n    parent.appendChild(this.element);\n\n    // Performance: Use a document fragment to build the terminal\n    // viewport and helper elements detached from the DOM\n    const fragment = this._document.createDocumentFragment();\n    this._viewportElement = this._document.createElement('div');\n    this._viewportElement.classList.add('xterm-viewport');\n    fragment.appendChild(this._viewportElement);\n\n    this.screenElement = this._document.createElement('div');\n    this.screenElement.classList.add('xterm-screen');\n    this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n    // Create the container that will hold helpers like the textarea for\n    // capturing DOM Events. Then produce the helpers.\n    this._helperContainer = this._document.createElement('div');\n    this._helperContainer.classList.add('xterm-helpers');\n    this.screenElement.appendChild(this._helperContainer);\n    fragment.appendChild(this.screenElement);\n\n    const textarea = this.textarea = this._document.createElement('textarea');\n    this.textarea.classList.add('xterm-helper-textarea');\n    this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n    if (!Browser.isChromeOS) {\n      // ChromeVox on ChromeOS does not like this. See\n      // https://issuetracker.google.com/issues/260170397\n      this.textarea.setAttribute('aria-multiline', 'false');\n    }\n    this.textarea.setAttribute('autocorrect', 'off');\n    this.textarea.setAttribute('autocapitalize', 'off');\n    this.textarea.setAttribute('spellcheck', 'false');\n    this.textarea.tabIndex = 0;\n    this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n    this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n    // Register the core browser service before the generic textarea handlers are registered so it\n    // handles them first. Otherwise the renderers may use the wrong focus state.\n    this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n      this.textarea,\n      parent.ownerDocument.defaultView ?? window,\n      // Force unsafe null in node.js environment for tests\n      this._document ?? (typeof window !== 'undefined') ? window.document : null as any\n    ));\n    this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n    this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n    this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n    this._helperContainer.appendChild(this.textarea);\n\n    this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n    this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n    this._themeService = this._instantiationService.createInstance(ThemeService);\n    this._instantiationService.setService(IThemeService, this._themeService);\n\n    // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n    this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n    // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n    this._register(this._themeService.onChangeColors(() => {\n      if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n        this._reportColorScheme();\n      }\n    }));\n\n    this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n    this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n    this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n    this._instantiationService.setService(IRenderService, this._renderService);\n    this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n    this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n      css: {\n        canvas: { ...e.css.canvas },\n        cell: { ...e.css.cell }\n      },\n      device: {\n        canvas: { ...e.device.canvas },\n        cell: { ...e.device.cell },\n        char: { ...e.device.char }\n      }\n    })));\n    this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n    this._compositionView = this._document.createElement('div');\n    this._compositionView.classList.add('composition-view');\n    this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n    this._helperContainer.appendChild(this._compositionView);\n\n    this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n    this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n    const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n    // Performance: Add viewport and helper elements from the fragment\n    this.element.appendChild(fragment);\n\n    try {\n      this._onWillOpen.fire(this.element);\n    }\n    catch { /* fails to load addon for some reason */ }\n    if (!this._renderService.hasRenderer()) {\n      this._renderService.setRenderer(this._createRenderer());\n    }\n\n    this._register(this.onCursorMove(() => {\n      this._renderService!.handleCursorMove();\n      this._syncTextArea();\n    }));\n    this._register(this.onResize(() => {\n      this._renderService!.handleResize(this.cols, this.rows);\n      this._syncTextArea();\n    }));\n    this._register(this.onBlur(() => this._renderService!.handleBlur()));\n    this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n    this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n    this._register(this._viewport.onRequestScrollLines(e => {\n      super.scrollLines(e, false);\n      this.refresh(0, this.rows - 1);\n    }));\n\n    this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n      this.element,\n      this.screenElement,\n      linkifier\n    ));\n    this._instantiationService.setService(ISelectionService, this._selectionService);\n    this._mouseService = this._instantiationService.createInstance(MouseService);\n    this._instantiationService.setService(IMouseService, this._mouseService);\n    this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n    this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n    this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n    this._register(this._selectionService.onLinuxMouseSelection(text => {\n      // If there's a new selection, put it into the textarea, focus and select it\n      // in order to register it as a selection on the OS. This event is fired\n      // only on Linux to enable middle click to paste selection.\n      this.textarea!.value = text;\n      this.textarea!.focus();\n      this.textarea!.select();\n    }));\n    this._register(EventUtils.any(\n      this._onScroll.event,\n      this._inputHandler.onScroll\n    )(() => {\n      this._selectionService!.refresh();\n      this._viewport?.queueSync();\n    }));\n\n    this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n    this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n    // apply mouse event classes set by escape codes before terminal was attached\n    if (this.mouseStateService.areMouseEventsActive) {\n      this._selectionService.disable();\n      this.element.classList.add('enable-mouse-events');\n    } else {\n      this._selectionService.enable();\n    }\n\n    if (this.options.screenReaderMode) {\n      // Note that this must be done *after* the renderer is created in order to\n      // ensure the correct order of the dprchange event\n      this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n    }\n    this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n    const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n    const overviewRulerWidth = this.options.scrollbar?.width;\n    if (showScrollbar && overviewRulerWidth) {\n      this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n    }\n    this.optionsService.onSpecificOptionChange('scrollbar', value => {\n      const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n      if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n        this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n      }\n    });\n    // Measure the character size\n    this._charSizeService.measure();\n\n    // Setup loop that draws to screen\n    this.refresh(0, this.rows - 1);\n\n    // Initialize global actions that need to be taken on the document.\n    this._initGlobal();\n\n    // Listen for mouse events and translate\n    // them into terminal mouse protocols.\n    this._mouseService.bindMouse({\n      element: this.element!,\n      screenElement: this.screenElement!,\n      document: this._document!,\n      handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n    }, disposable => this._register(disposable), () => this.focus());\n  }\n\n  private _createRenderer(): IRenderer {\n    return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n  }\n\n  /**\n   * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n   * opportunity.\n   * @param start The row to start from (between 0 and this.rows - 1).\n   * @param end The row to end at (between start and this.rows - 1).\n   */\n  public refresh(start: number, end: number, sync: boolean = false): void {\n    this._renderService?.refreshRows(start, end, sync);\n  }\n\n  /**\n   * Change the cursor style for different selection modes\n   */\n  public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n    if (this._selectionService?.shouldColumnSelect(ev)) {\n      this.element!.classList.add('column-select');\n    } else {\n      this.element!.classList.remove('column-select');\n    }\n  }\n\n  /**\n   * Display the cursor element\n   */\n  private _showCursor(): void {\n    if (!this.coreService.isCursorInitialized) {\n      this.coreService.isCursorInitialized = true;\n      this.refresh(this.buffer.y, this.buffer.y);\n    }\n  }\n\n  public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n    // All scrollLines methods need to go via the viewport in order to support smooth scroll\n    if (this._viewport) {\n      this._viewport.scrollLines(disp);\n    } else {\n      super.scrollLines(disp, suppressScrollEvent);\n    }\n    this.refresh(0, this.rows - 1);\n  }\n\n  public scrollPages(pageCount: number): void {\n    this.scrollLines(pageCount * (this.rows - 1));\n  }\n\n  public scrollToTop(): void {\n    this.scrollLines(-this._bufferService.buffer.ydisp);\n  }\n\n  public scrollToBottom(disableSmoothScroll?: boolean): void {\n    if (disableSmoothScroll && this._viewport) {\n      this._viewport.scrollToLine(this.buffer.ybase, true);\n    } else {\n      this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n    }\n  }\n\n  public scrollToLine(line: number): void {\n    const scrollAmount = line - this._bufferService.buffer.ydisp;\n    if (scrollAmount !== 0) {\n      this.scrollLines(scrollAmount);\n    }\n  }\n\n  public paste(data: string): void {\n    paste(data, this.textarea!, this.coreService, this.optionsService);\n  }\n\n  public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n    this._customKeyEventHandler = customKeyEventHandler;\n  }\n\n  public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n    this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n  }\n\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    return this._linkProviderService.registerLinkProvider(linkProvider);\n  }\n\n  public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n    if (!this._characterJoinerService) {\n      throw new Error('Terminal must be opened first');\n    }\n    const joinerId = this._characterJoinerService.register(handler);\n    this.refresh(0, this.rows - 1);\n    return joinerId;\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): void {\n    if (!this._characterJoinerService) {\n      throw new Error('Terminal must be opened first');\n    }\n    if (this._characterJoinerService.deregister(joinerId)) {\n      this.refresh(0, this.rows - 1);\n    }\n  }\n\n  public get markers(): IMarker[] {\n    return this.buffer.markers;\n  }\n\n  public registerMarker(cursorYOffset: number): IMarker {\n    return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n  }\n\n  public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n    return this._decorationService.registerDecoration(decorationOptions);\n  }\n\n  /**\n   * Gets whether the terminal has an active selection.\n   */\n  public hasSelection(): boolean {\n    return this._selectionService ? this._selectionService.hasSelection : false;\n  }\n\n  /**\n   * Selects text within the terminal.\n   * @param column The column the selection starts at..\n   * @param row The row the selection starts at.\n   * @param length The length of the selection.\n   */\n  public select(column: number, row: number, length: number): void {\n    this._selectionService!.setSelection(column, row, length);\n  }\n\n  /**\n   * Gets the terminal's current selection, this is useful for implementing copy\n   * behavior outside of xterm.js.\n   */\n  public getSelection(): string {\n    return this._selectionService ? this._selectionService.selectionText : '';\n  }\n\n  public getSelectionPosition(): IBufferRange | undefined {\n    if (!this._selectionService || !this._selectionService.hasSelection) {\n      return undefined;\n    }\n\n    return {\n      start: {\n        x: this._selectionService.selectionStart![0],\n        y: this._selectionService.selectionStart![1]\n      },\n      end: {\n        x: this._selectionService.selectionEnd![0],\n        y: this._selectionService.selectionEnd![1]\n      }\n    };\n  }\n\n  /**\n   * Clears the current terminal selection.\n   */\n  public clearSelection(): void {\n    this._selectionService?.clearSelection();\n  }\n\n  /**\n   * Selects all text within the terminal.\n   */\n  public selectAll(): void {\n    this._selectionService?.selectAll();\n  }\n\n  public selectLines(start: number, end: number): void {\n    this._selectionService?.selectLines(start, end);\n  }\n\n  /**\n   * Handle a keydown [KeyboardEvent].\n   *\n   * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n   */\n  protected _keyDown(event: KeyboardEvent): boolean | undefined {\n    this._keyDownHandled = false;\n    this._keyDownSeen = true;\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n      return false;\n    }\n\n    // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n    const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n    if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n      if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n        this.scrollToBottom(true);\n      }\n      return false;\n    }\n\n    if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n      this._unprocessedDeadKey = true;\n    }\n\n    const result = this._keyboardService.evaluateKeyDown(event);\n\n    this.updateCursorStyle(event);\n\n    if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n      const scrollCount = this.rows - 1;\n      this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n      event.preventDefault();\n      event.stopPropagation();\n      return false;\n    }\n\n    if (result.type === KeyboardResultType.SELECT_ALL) {\n      this.selectAll();\n    }\n\n    if (this._isThirdLevelShift(this.browser, event)) {\n      return true;\n    }\n\n    if (result.cancel) {\n      // The event is canceled at the end already, is this necessary?\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    if (!result.key) {\n      return true;\n    }\n\n    // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n    // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n    // or Win32 input mode as they need to send proper sequences for all key events.\n    if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n      if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n        return true;\n      }\n    }\n\n    if (this._unprocessedDeadKey) {\n      this._unprocessedDeadKey = false;\n      return true;\n    }\n\n    // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n    // will announce deleted characters. This will not work 100% of the time but it should cover\n    // most scenarios.\n    if (result.key === C0.ETX || result.key === C0.CR) {\n      this.textarea!.value = '';\n    }\n\n    const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n    this._onKey.fire({ key: result.key, domEvent: event });\n    this._showCursor();\n    this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n    // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n    // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n    // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n    // reader to read it.\n    if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n      event.preventDefault();\n      event.stopPropagation();\n      return false;\n    }\n\n    this._keyDownHandled = true;\n  }\n\n  private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n    const thirdLevelKey =\n      (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n      (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n      (browser.isWindows && ev.getModifierState('AltGraph'));\n\n    if (ev.type === 'keypress') {\n      return thirdLevelKey;\n    }\n\n    // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n    return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n  }\n\n  protected _keyUp(ev: KeyboardEvent): void {\n    this._keyDownSeen = false;\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n      return;\n    }\n\n    if (!wasModifierKeyOnlyEvent(ev)) {\n      this.focus();\n    }\n\n    // Handle key release for Kitty keyboard protocol\n    const result = this._keyboardService.evaluateKeyUp(ev);\n    if (result?.key) {\n      const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n      this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n    }\n\n    this.updateCursorStyle(ev);\n    this._keyPressHandled = false;\n  }\n\n  /**\n   * Handle a keypress event.\n   * Key Resources:\n   *   - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n   * @param ev The keypress event to be handled.\n   */\n  protected _keyPress(ev: KeyboardEvent): boolean {\n    let key;\n\n    this._keyPressHandled = false;\n\n    if (this._keyDownHandled) {\n      return false;\n    }\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n      return false;\n    }\n\n    if (ev.charCode) {\n      key = ev.charCode;\n    } else if (ev.which === null || ev.which === undefined) {\n      key = ev.keyCode;\n    } else if (ev.which !== 0 && ev.charCode !== 0) {\n      key = ev.which;\n    } else {\n      return false;\n    }\n\n    if (!key || (\n      (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n    )) {\n      return false;\n    }\n\n    key = String.fromCharCode(key);\n\n    this._onKey.fire({ key, domEvent: ev });\n    this._showCursor();\n    this.coreService.triggerDataEvent(key, true);\n\n    this._keyPressHandled = true;\n\n    // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n    // keys could be ignored\n    this._unprocessedDeadKey = false;\n\n    return true;\n  }\n\n  /**\n   * Handle an input event.\n   * Key Resources:\n   *   - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n   * @param ev The input event to be handled.\n   */\n  protected _inputEvent(ev: InputEvent): boolean {\n    // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n    // support reading out character input which can doubling up input characters\n    // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n    if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n      if (this._keyPressHandled) {\n        return false;\n      }\n\n      // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n      // keys could be ignored\n      this._unprocessedDeadKey = false;\n\n      const text = ev.data;\n      this.coreService.triggerDataEvent(text, true);\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Resizes the terminal.\n   *\n   * @param x The number of columns to resize to.\n   * @param y The number of rows to resize to.\n   */\n  public resize(x: number, y: number): void {\n    if (x === this.cols && y === this.rows) {\n      // Check if we still need to measure the char size (fixes #785).\n      if (this._charSizeService && !this._charSizeService.hasValidSize) {\n        this._charSizeService.measure();\n      }\n      return;\n    }\n\n    super.resize(x, y);\n  }\n\n  private _afterResize(x: number, y: number): void {\n    this._charSizeService?.measure();\n  }\n\n  /**\n   * Clear the entire buffer, making the prompt line the new first line.\n   */\n  public clear(): void {\n    if (this.buffer.ybase === 0 && this.buffer.y === 0) {\n      // Don't clear if it's already clear\n      return;\n    }\n    this.buffer.clearAllMarkers();\n    this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n    this.buffer.lines.length = 1;\n    this.buffer.ydisp = 0;\n    this.buffer.ybase = 0;\n    this.buffer.y = 0;\n    for (let i = 1; i < this.rows; i++) {\n      this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n    }\n    // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n    // scroll event and that the viewport's state will be valid for immediate writes.\n    this._onScroll.fire({ position: this.buffer.ydisp });\n    this.refresh(0, this.rows - 1);\n  }\n\n  /**\n   * Reset terminal.\n   * Note: Calling this directly from JS is synchronous but does not clear\n   * input buffers and does not reset the parser, thus the terminal will\n   * continue to apply pending input data.\n   * If you need in band reset (synchronous with input data) consider\n   * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n   */\n  public reset(): void {\n    /**\n     * Since _setup handles a full terminal creation, we have to carry forward\n     * a few things that should not reset.\n     */\n    this.options.rows = this.rows;\n    this.options.cols = this.cols;\n    const customKeyEventHandler = this._customKeyEventHandler;\n\n    this._setup();\n    super.reset();\n    this._mouseService?.reset();\n    this._selectionService?.reset();\n    this._decorationService.reset();\n\n    // reattach\n    this._customKeyEventHandler = customKeyEventHandler;\n\n    // do a full screen refresh\n    this.refresh(0, this.rows - 1, true);\n  }\n\n  public clearTextureAtlas(): void {\n    this._renderService?.clearTextureAtlas();\n  }\n\n  private _reportFocus(): void {\n    if (this.element?.classList.contains('focus')) {\n      this.coreService.triggerDataEvent(C0.ESC + '[I');\n    } else {\n      this.coreService.triggerDataEvent(C0.ESC + '[O');\n    }\n  }\n\n  private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n    if (!this._renderService) {\n      return;\n    }\n\n    switch (type) {\n      case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n        const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n        const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n        this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n        break;\n      case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n        const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n        const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n        this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n        break;\n    }\n  }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n  return ev.keyCode === 16 || // Shift\n    ev.keyCode === 17 || // Ctrl\n    ev.keyCode === 18 || // Alt\n    ev.keyCode === 91 || // Meta (Left)\n    ev.keyCode === 92 || // Meta (Right)\n    ev.keyCode === 93 || // Meta (Menu)\n    ev.keyCode === 224 || // Meta (Firefox)\n    ev.key === 'Meta';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n  instance: ITerminalAddon;\n  dispose: () => void;\n  isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n  protected _addons: ILoadedAddon[] = [];\n\n  public dispose(): void {\n    for (let i = this._addons.length - 1; i >= 0; i--) {\n      this._addons[i].instance.dispose();\n    }\n  }\n\n  public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n    const loadedAddon: ILoadedAddon = {\n      instance,\n      dispose: instance.dispose,\n      isDisposed: false\n    };\n    this._addons.push(loadedAddon);\n    instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n    instance.activate(terminal as any);\n  }\n\n  private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n    if (loadedAddon.isDisposed) {\n      // Do nothing if already disposed\n      return;\n    }\n    let index = -1;\n    for (let i = 0; i < this._addons.length; i++) {\n      if (this._addons[i] === loadedAddon) {\n        index = i;\n        break;\n      }\n    }\n    if (index === -1) {\n      throw new Error('Could not dispose an addon that has not been loaded');\n    }\n    loadedAddon.isDisposed = true;\n    loadedAddon.dispose.apply(loadedAddon.instance);\n    this._addons.splice(index, 1);\n  }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferLine, ICellData } from 'common/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n  constructor(private _line: IBufferLine) { }\n\n  public get isWrapped(): boolean { return this._line.isWrapped; }\n  public get length(): number { return this._line.length; }\n  public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n    if (x < 0 || x >= this._line.length) {\n      return undefined;\n    }\n\n    if (cell) {\n      this._line.loadCell(x, cell as unknown as ICellData);\n      return cell;\n    }\n    return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n  }\n  public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n    return this._line.translateToString(trimRight, startColumn, endColumn);\n  }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from 'common/buffer/Types';\nimport { BufferLineApiView } from 'common/public/BufferLineApiView';\nimport { CellData } from 'common/buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n  constructor(\n    private _buffer: IBuffer,\n    public readonly type: 'normal' | 'alternate'\n  ) { }\n\n  public init(buffer: IBuffer): BufferApiView {\n    this._buffer = buffer;\n    return this;\n  }\n\n  public get cursorY(): number { return this._buffer.y; }\n  public get cursorX(): number { return this._buffer.x; }\n  public get viewportY(): number { return this._buffer.ydisp; }\n  public get baseY(): number { return this._buffer.ybase; }\n  public get length(): number { return this._buffer.lines.length; }\n  public getLine(y: number): IBufferLineApi | undefined {\n    const line = this._buffer.lines.get(y);\n    if (!line) {\n      return undefined;\n    }\n    return new BufferLineApiView(line);\n  }\n  public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from 'common/public/BufferApiView';\nimport { ICoreTerminal } from 'common/Types';\nimport { Disposable } from 'common/Lifecycle';\nimport { Emitter } from 'common/Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n  private _normal: BufferApiView;\n  private _alternate: BufferApiView;\n\n  private readonly _onBufferChange = this._register(new Emitter<IBufferApi>());\n  public readonly onBufferChange = this._onBufferChange.event;\n\n  constructor(private _core: ICoreTerminal) {\n    super();\n    this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n    this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n    this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active));\n  }\n  public get active(): IBufferApi {\n    if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n    if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n    throw new Error('Active buffer is neither normal nor alternate');\n  }\n  public get normal(): IBufferApi {\n    return this._normal.init(this._core.buffers.normal);\n  }\n  public get alternate(): IBufferApi {\n    return this._alternate.init(this._core.buffers.alt);\n  }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from 'common/parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from 'common/Types';\n\nexport class ParserApi implements IParser {\n  constructor(private _core: ICoreTerminal) { }\n\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n  }\n  public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this.registerCsiHandler(id, callback);\n  }\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n  }\n  public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this.registerDcsHandler(id, callback);\n  }\n  public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerEscHandler(id, handler);\n  }\n  public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n    return this.registerEscHandler(id, handler);\n  }\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerOscHandler(ident, callback);\n  }\n  public addOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this.registerOscHandler(ident, callback);\n  }\n  public registerApcHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerApcHandler(ident, callback);\n  }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from 'common/Types';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n  constructor(private _core: ICoreTerminal) { }\n\n  public register(provider: IUnicodeVersionProvider): void {\n    this._core.unicodeService.register(provider);\n  }\n\n  public get versions(): string[] {\n    return this._core.unicodeService.versions;\n  }\n\n  public get activeVersion(): string {\n    return this._core.unicodeService.activeVersion;\n  }\n\n  public set activeVersion(version: string) {\n    this._core.unicodeService.activeVersion = version;\n  }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from 'browser/CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from 'browser/Types';\nimport { Disposable } from 'common/Lifecycle';\nimport { ITerminalOptions } from 'common/Types';\nimport { AddonManager } from 'common/public/AddonManager';\nimport { BufferNamespaceApi } from 'common/public/BufferNamespaceApi';\nimport { ParserApi } from 'common/public/ParserApi';\nimport { UnicodeApi } from 'common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from 'common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n  private _core: ITerminal;\n  private _addonManager: AddonManager;\n  private _parser: IParser | undefined;\n  private _buffer: BufferNamespaceApi | undefined;\n  private _publicOptions: Required<ITerminalOptions>;\n\n  constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n    super();\n\n    this._core = this._register(new TerminalCore(options));\n    this._addonManager = this._register(new AddonManager());\n\n    this._publicOptions = { ... this._core.options };\n    const getter = (propName: string): any => {\n      return this._core.options[propName];\n    };\n    const setter = (propName: string, value: any): void => {\n      this._checkReadonlyOptions(propName);\n      this._core.options[propName] = value;\n    };\n\n    for (const propName in this._core.options) {\n      const desc = {\n        get: getter.bind(this, propName),\n        set: setter.bind(this, propName)\n      };\n      Object.defineProperty(this._publicOptions, propName, desc);\n    }\n  }\n\n  private _checkReadonlyOptions(propName: string): void {\n    // Throw an error if any constructor only option is modified\n    // from terminal.options\n    // Modifications from anywhere else are allowed\n    if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n      throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n    }\n  }\n\n  private _checkProposedApi(): void {\n    if (!this._core.optionsService.rawOptions.allowProposedApi) {\n      throw new Error('You must set the allowProposedApi option to true to use proposed API');\n    }\n  }\n\n  public get onBell(): IEvent<void> { return this._core.onBell; }\n  public get onBinary(): IEvent<string> { return this._core.onBinary; }\n  public get onCursorMove(): IEvent<void> { return this._core.onCursorMove; }\n  public get onData(): IEvent<string> { return this._core.onData; }\n  public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n  public get onLineFeed(): IEvent<void> { return this._core.onLineFeed; }\n  public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n  public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n  public get onScroll(): IEvent<number> { return this._core.onScroll; }\n  public get onSelectionChange(): IEvent<void> { return this._core.onSelectionChange; }\n  public get onTitleChange(): IEvent<string> { return this._core.onTitleChange; }\n  public get onWriteParsed(): IEvent<void> { return this._core.onWriteParsed; }\n  public get onDimensionsChange(): IEvent<IRenderDimensions> { return this._core.onDimensionsChange; }\n\n  public get element(): HTMLElement | undefined { return this._core.element; }\n  public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n  public get parser(): IParser {\n    return this._parser ??= new ParserApi(this._core);\n  }\n  public get unicode(): IUnicodeHandling {\n    this._checkProposedApi();\n    return new UnicodeApi(this._core);\n  }\n  public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n  public get rows(): number { return this._core.rows; }\n  public get cols(): number { return this._core.cols; }\n  public get buffer(): IBufferNamespaceApi {\n    return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n  }\n  public get markers(): ReadonlyArray<IMarker> {\n    return this._core.markers;\n  }\n  public get modes(): IModes {\n    const m = this._core.coreService.decPrivateModes;\n    let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n    switch (this._core.mouseStateService.activeProtocol) {\n      case 'X10': mouseTrackingMode = 'x10'; break;\n      case 'VT200': mouseTrackingMode = 'vt200'; break;\n      case 'DRAG': mouseTrackingMode = 'drag'; break;\n      case 'ANY': mouseTrackingMode = 'any'; break;\n    }\n    return {\n      applicationCursorKeysMode: m.applicationCursorKeys,\n      applicationKeypadMode: m.applicationKeypad,\n      bracketedPasteMode: m.bracketedPasteMode,\n      insertMode: this._core.coreService.modes.insertMode,\n      mouseTrackingMode: mouseTrackingMode,\n      originMode: m.origin,\n      reverseWraparoundMode: m.reverseWraparound,\n      sendFocusMode: m.sendFocus,\n      showCursor: !this._core.coreService.isCursorHidden,\n      synchronizedOutputMode: m.synchronizedOutput,\n      win32InputMode: m.win32InputMode,\n      wraparoundMode: m.wraparound\n    };\n  }\n  public get dimensions(): IRenderDimensions | undefined {\n    return this._core.dimensions;\n  }\n  public get options(): Required<ITerminalOptions> {\n    return this._publicOptions;\n  }\n  public set options(options: ITerminalOptions) {\n    for (const propName in options) {\n      this._publicOptions[propName] = options[propName];\n    }\n  }\n  public blur(): void {\n    this._core.blur();\n  }\n  public focus(): void {\n    this._core.focus();\n  }\n  public input(data: string, wasUserInput: boolean = true): void {\n    this._core.input(data, wasUserInput);\n  }\n  public resize(columns: number, rows: number): void {\n    this._verifyIntegers(columns, rows);\n    this._core.resize(columns, rows);\n  }\n  public open(parent: HTMLElement): void {\n    this._core.open(parent);\n  }\n  public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n    this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n  }\n  public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n    this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n  }\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    return this._core.registerLinkProvider(linkProvider);\n  }\n  public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n    return this._core.registerCharacterJoiner(handler);\n  }\n  public deregisterCharacterJoiner(joinerId: number): void {\n    this._core.deregisterCharacterJoiner(joinerId);\n  }\n  public registerMarker(cursorYOffset: number = 0): IMarker {\n    this._verifyIntegers(cursorYOffset);\n    return this._core.registerMarker(cursorYOffset);\n  }\n  public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n    this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n    return this._core.registerDecoration(decorationOptions);\n  }\n  public hasSelection(): boolean {\n    return this._core.hasSelection();\n  }\n  public select(column: number, row: number, length: number): void {\n    this._verifyIntegers(column, row, length);\n    this._core.select(column, row, length);\n  }\n  public getSelection(): string {\n    return this._core.getSelection();\n  }\n  public getSelectionPosition(): IBufferRange | undefined {\n    return this._core.getSelectionPosition();\n  }\n  public clearSelection(): void {\n    this._core.clearSelection();\n  }\n  public selectAll(): void {\n    this._core.selectAll();\n  }\n  public selectLines(start: number, end: number): void {\n    this._verifyIntegers(start, end);\n    this._core.selectLines(start, end);\n  }\n  public dispose(): void {\n    super.dispose();\n  }\n  public scrollLines(amount: number): void {\n    this._verifyIntegers(amount);\n    this._core.scrollLines(amount);\n  }\n  public scrollPages(pageCount: number): void {\n    this._verifyIntegers(pageCount);\n    this._core.scrollPages(pageCount);\n  }\n  public scrollToTop(): void {\n    this._core.scrollToTop();\n  }\n  public scrollToBottom(): void {\n    this._core.scrollToBottom();\n  }\n  public scrollToLine(line: number): void {\n    this._verifyIntegers(line);\n    this._core.scrollToLine(line);\n  }\n  public clear(): void {\n    this._core.clear();\n  }\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    this._core.write(data, callback);\n  }\n  public writeln(data: string | Uint8Array, callback?: () => void): void {\n    this._core.write(data);\n    this._core.write('\\r\\n', callback);\n  }\n  public paste(data: string): void {\n    this._core.paste(data);\n  }\n  public refresh(start: number, end: number): void {\n    this._verifyIntegers(start, end);\n    this._core.refresh(start, end);\n  }\n  public reset(): void {\n    this._core.reset();\n  }\n  public clearTextureAtlas(): void {\n    this._core.clearTextureAtlas();\n  }\n  public loadAddon(addon: ITerminalAddon): void {\n    this._addonManager.loadAddon(this, addon);\n  }\n  public static get strings(): ILocalizableStrings {\n    // A wrapper is required here because esbuild prevents setting an `export let`\n    return {\n      get promptLabel(): string { return Strings.promptLabel.get(); },\n      set promptLabel(value: string) { Strings.promptLabel.set(value); },\n      get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n      set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n    };\n  }\n\n  private _verifyIntegers(...values: number[]): void {\n    for ($value of values) {\n      if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n        throw new Error('This API only accepts integers');\n      }\n    }\n  }\n\n  private _verifyPositiveIntegers(...values: number[]): void {\n    for ($value of values) {\n      if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n        throw new Error('This API only accepts positive integers');\n      }\n    }\n  }\n}\n"],
  "mappings": "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D,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG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",
  "names": ["promptLabelInternal", "promptLabel", "value", "tooMuchOutputInternal", "tooMuchOutput", "prepareTextForTerminal", "text", "bracketTextForPaste", "bracketedPasteMode", "copyHandler", "ev", "selectionService", "handlePasteEvent", "textarea", "coreService", "optionsService", "paste", "moveTextAreaUnderMouseCursor", "screenElement", "pos", "left", "top", "rightClickHandler", "shouldSelectWord", "stringFromCodePoint", "codePoint", "utf32ToString", "data", "start", "end", "result", "i", "codepoint", "StringToUtf32", "input", "target", "length", "size", "startPos", "second", "code", "Utf8ToUtf32", "byte1", "byte2", "byte3", "byte4", "discardInterim", "cp", "pos", "tmp", "type", "missing", "fourStop", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "DI_TARGET", "DI_DEPENDENCIES", "serviceRegistry", "getServiceDependencies", "ctor", "createDecorator", "id", "decorator", "target", "key", "index", "storeServiceDependency", "IBufferService", "createDecorator", "IMouseStateService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "OscLinkProvider", "_bufferService", "_optionsService", "_oscLinkService", "CellData", "y", "callback", "line", "result", "linkHandler", "cell", "lineLength", "currentLinkId", "currentStart", "finishLink", "x", "text", "range", "ignoreLink", "parsed", "e", "defaultActivate", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "IOscLinkService", "uri", "newWindow", "ICharSizeService", "createDecorator", "ICoreBrowserService", "IMouseCoordsService", "IMouseService", "IRenderService", "ISelectionService", "ICharacterJoinerService", "IThemeService", "ILinkProviderService", "IKeyboardService", "toDisposable", "fn", "dispose", "arg", "d", "DisposableStore", "o", "d", "Disposable", "MutableDisposable", "value", "TimeoutTimer", "runner", "timeout", "IntervalTimer", "interval", "context", "handle", "getWindow", "e", "candidateNode", "candidateEvent", "DomListener", "node", "type", "handler", "options", "addDisposableListener", "useCaptureOrOptions", "addStandardDisposableListener", "useCapture", "eventType", "getDomNodePagePosition", "domNode", "bb", "win", "AnimationFrameQueueItem", "_runner", "priority", "a", "b", "animationFrameState", "getAnimationFrameState", "targetWindow", "state", "animationFrameRunner", "scheduleAtNextAnimationFrame", "runner", "item", "WindowIntervalTimer", "IntervalTimer", "interval", "FastDomNode", "domNode", "_width", "width", "numberAsPixels", "_height", "height", "_top", "top", "_left", "left", "_bottom", "bottom", "_right", "right", "className", "shouldHaveIt", "position", "layerHint", "contain", "name", "value", "Platform_exports", "__export", "getSafariVersion", "getZoomFactor", "isChrome", "isChromeOS", "isFirefox", "isLegacyEdge", "isLinux", "isMac", "isNode", "isSafari", "isWindows", "userAgent", "platform", "_targetWindow", "majorVersion", "sameOriginWindowChainCache", "getParentWindowIfSameOrigin", "w", "location", "parentLocation", "IframeUtils", "targetWindow", "windowChainCache", "parent", "childWindow", "ancestorWindow", "top", "left", "windowChain", "windowChainEl", "windowInChain", "boundingRect", "StandardMouseEvent", "iframeOffsets", "StandardWheelEvent", "e", "deltaX", "deltaY", "shouldFactorDPR", "isChrome", "chromeVersionMatch", "e1", "e2", "devicePixelRatio", "ev", "isFirefox", "isMac", "isSafari", "isWindows", "GlobalPointerMoveMonitor", "DisposableStore", "invokeStopCallback", "onStopCallback", "initialElement", "pointerId", "initialButtons", "pointerMoveCallback", "eventSource", "toDisposable", "getWindow", "addDisposableListener", "eventType", "e", "Widget", "Disposable", "domNode", "listener", "addDisposableListener", "eventType", "e", "StandardMouseEvent", "getWindow", "ScrollbarArrow", "Widget", "opts", "arrowSize", "GlobalPointerMoveMonitor", "addStandardDisposableListener", "eventType", "e", "WindowIntervalTimer", "TimeoutTimer", "scheduleRepeater", "getWindow", "pointerMoveData", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "fn", "listeners", "EventUtils", "forward", "from", "to", "e", "map", "i", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "ScrollState", "_ScrollState", "_forceIntegerValues", "width", "scrollWidth", "scrollLeft", "height", "scrollHeight", "scrollTop", "other", "update", "useRawScrollPositions", "previous", "inSmoothScrolling", "widthChanged", "scrollWidthChanged", "scrollLeftChanged", "heightChanged", "scrollHeightChanged", "scrollTopChanged", "Scrollable", "Disposable", "options", "Emitter", "smoothScrollDuration", "scrollPosition", "dimensions", "newState", "reuseAnimation", "validTarget", "newSmoothScrolling", "SmoothScrollingOperation", "oldState", "SmoothScrollingUpdate", "isDone", "createEaseOutCubic", "from", "to", "delta", "completion", "easeOutCubic", "createComposed", "a", "b", "cut", "_SmoothScrollingOperation", "startTime", "duration", "viewportSize", "stop1", "stop2", "state", "now", "newScrollLeft", "newScrollTop", "easeInCubic", "t", "ScrollbarVisibilityController", "Disposable", "visibility", "visibleClassName", "invisibleClassName", "TimeoutTimer", "rawShouldBeVisible", "shouldBeVisible", "isNeeded", "domNode", "withFadeAway", "POINTER_DRAG_RESET_DISTANCE", "AbstractScrollbar", "Widget", "opts", "ScrollbarVisibilityController", "GlobalPointerMoveMonitor", "FastDomNode", "addDisposableListener", "eventType", "arrow", "ScrollbarArrow", "top", "left", "width", "height", "e", "visibleSize", "elementScrollSize", "elementScrollPosition", "domTop", "sliderStart", "sliderStop", "pointerPos", "offsetX", "offsetY", "domNodePosition", "getDomNodePagePosition", "offset", "initialPointerPosition", "initialPointerOrthogonalPosition", "initialScrollbarState", "pointerMoveData", "pointerOrthogonalPosition", "pointerOrthogonalDelta", "isWindows", "pointerDelta", "_desiredScrollPosition", "desiredScrollPosition", "scrollbarSize", "ScrollbarState", "_ScrollbarState", "arrowSize", "scrollbarSize", "oppositeScrollbarSize", "visibleSize", "scrollSize", "scrollPosition", "iVisibleSize", "iScrollSize", "iScrollPosition", "iArrowSize", "computedAvailableSize", "computedRepresentableSize", "computedIsNeeded", "computedSliderSize", "computedSliderRatio", "computedSliderPosition", "r", "offset", "desiredSliderPosition", "correctedOffset", "desiredScrollPosition", "delta", "HorizontalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "e", "offsetX", "offsetY", "size", "target", "VerticalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "hasArrows", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "offsetX", "offsetY", "size", "target", "delta", "currentPosition", "showArrows", "display", "arrow", "arrowSize", "HIDE_TIMEOUT", "SCROLL_WHEEL_SENSITIVITY", "MouseWheelClassifierItem", "timestamp", "deltaX", "deltaY", "_MouseWheelClassifier", "remainingInfluence", "score", "iteration", "index", "influence", "e", "isChrome", "targetWindow", "getWindow", "pageZoomFactor", "getZoomFactor", "previousItem", "item", "absDeltaX", "absDeltaY", "absPreviousDeltaX", "absPreviousDeltaY", "minDeltaX", "minDeltaY", "maxDeltaX", "maxDeltaY", "value", "MouseWheelClassifier", "SmoothScrollableElement", "Widget", "element", "options", "scrollable", "Emitter", "resolvedScrollable", "ownsScrollable", "Scrollable", "callback", "scheduleAtNextAnimationFrame", "resolveOptions", "scrollbarHost", "mouseWheelEvent", "VerticalScrollbar", "HorizontalScrollbar", "FastDomNode", "TimeoutTimer", "dispose", "dimensions", "update", "newClassName", "isMac", "newOptions", "browserEvent", "StandardWheelEvent", "shouldListen", "onMouseWheel", "addDisposableListener", "eventType", "classifier", "didScroll", "shiftConvert", "futureScrollPosition", "desiredScrollPosition", "deltaScrollTop", "desiredScrollTop", "deltaScrollLeft", "desiredScrollLeft", "consumeMouseWheel", "scrollState", "enableTop", "enableLeft", "leftClassName", "topClassName", "topLeftClassName", "opts", "result", "Viewport", "Disposable", "element", "screenElement", "_bufferService", "coreBrowserService", "_coreService", "mouseStateService", "themeService", "_optionsService", "_renderService", "Emitter", "scrollable", "Scrollable", "cb", "scheduleAtNextAnimationFrame", "SmoothScrollableElement", "type", "EventUtils", "toDisposable", "e", "disp", "pos", "line", "disableSmoothScroll", "showScrollbar", "showArrows", "verticalScrollbarSize", "ydisp", "newRow", "diff", "translationY", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "ICoreService", "IMouseStateService", "IThemeService", "IOptionsService", "IRenderService", "BufferDecorationRenderer", "Disposable", "_screenElement", "_bufferService", "_coreBrowserService", "_decorationService", "_renderService", "decoration", "toDisposable", "element", "x", "line", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "IDecorationService", "IRenderService", "ColorZoneStore", "decoration", "z", "padding", "zone", "line", "position", "drawHeight", "drawWidth", "drawX", "OverviewRulerRenderer", "Disposable", "_viewportElement", "_screenElement", "_bufferService", "_decorationService", "_renderService", "_optionsService", "_themeService", "_coreBrowserService", "ColorZoneStore", "toDisposable", "ctx", "scrollbar", "outerWidth", "innerWidth", "pixelsPerLine", "nonFullHeight", "cssCanvasHeight", "deviceCanvasHeight", "decoration", "zones", "zone", "updateCanvasDimensions", "updateAnchor", "__decorateClass", "__decorateParam", "IBufferService", "IDecorationService", "IRenderService", "IOptionsService", "IThemeService", "ICoreBrowserService", "CompositionHelper", "_textarea", "_compositionView", "_bufferService", "_optionsService", "_coreService", "_renderService", "start", "end", "ev", "waitForPropagation", "currentCompositionPosition", "currentCompositionSuffix", "input", "value", "valueEnd", "oldValue", "newValue", "diff", "dontRecurse", "cursorX", "cellHeight", "cursorTop", "cursorLeft", "maxWidth", "compositionViewBounds", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "ICoreService", "IRenderService", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "g", "b", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "r", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "JoinedCellData", "AttributeData", "firstCell", "chars", "width", "value", "CharacterJoinerService", "_bufferService", "CellData", "handler", "joiner", "joinerId", "i", "row", "line", "ranges", "lineStr", "rangeStartColumn", "currentStringIndex", "rangeStartStringIndex", "rangeAttrFG", "rangeAttrBG", "x", "joinedRanges", "startIndex", "endIndex", "lineData", "startCol", "text", "allJoinedRanges", "error", "joinerRanges", "j", "currentRangeIndex", "currentRangeStarted", "currentRange", "length", "newRange", "inRange", "range", "__decorateClass", "__decorateParam", "IBufferService", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isBoxOrBlockGlyph", "codepoint", "treatGlyphAsBackgroundColor", "codepoint", "isPowerlineGlyph", "isBoxOrBlockGlyph", "createRenderDimensions", "createDimension", "DomRendererRowFactory", "_document", "_characterJoinerService", "_optionsService", "_coreBrowserService", "_coreService", "_decorationService", "_themeService", "CellData", "start", "end", "columnSelectMode", "lineData", "row", "isCursorRow", "cursorStyle", "cursorInactiveStyle", "cursorX", "cursorBlink", "blinkOn", "cellWidth", "widthCache", "linkStart", "linkEnd", "rowInfo", "elements", "joinedRanges", "colors", "lineLength", "charElement", "cellAmount", "text", "i", "oldBg", "oldFg", "oldExt", "oldLinkHover", "oldSpacing", "oldIsInSelection", "spacing", "skipJoinedCheckUntilX", "classes", "hasHover", "x", "width", "isJoined", "isValidJoinRange", "lastCharX", "cell", "range", "firstSelectionState", "JoinedCellData", "isInSelection", "isCursorCell", "isLinkHover", "isDecorated", "d", "chars", "AttributeData", "fg", "fgColorMode", "bg", "bgColorMode", "isInverse", "temp", "temp2", "bgOverride", "fgOverride", "isTop", "resolvedBg", "channels", "color", "element", "treatGlyphAsBackgroundColor", "cache", "adjustedColor", "ratio", "style", "y", "__decorateClass", "__decorateParam", "ICharacterJoinerService", "IOptionsService", "ICoreBrowserService", "ICoreService", "IDecorationService", "IThemeService", "WidthCache", "canvasFactory", "WidthCacheFontVariantCanvas", "font", "fontSize", "weight", "weightBold", "c", "bold", "italic", "cp", "width", "key", "variant", "throwIfFalsy", "fontFamily", "fontWeight", "fontStyle", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "TextBlinkStateManager", "Disposable", "_renderCallback", "_coreBrowserService", "_optionsService", "duration", "toDisposable", "needsBlinkInViewport", "isVisible", "wasBlinkOn", "TERMINAL_CLASS_PREFIX", "ROW_CONTAINER_CLASS", "FG_CLASS_PREFIX", "BG_CLASS_PREFIX", "FOCUS_CLASS", "SELECTION_CLASS", "CURSOR_BLINK_IDLE_CLASS", "nextTerminalId", "DomRenderer", "Disposable", "_terminal", "_document", "_element", "_screenElement", "_viewportElement", "_helperContainer", "_linkifier2", "instantiationService", "_charSizeService", "_optionsService", "_bufferService", "_coreService", "_coreBrowserService", "_themeService", "createSelectionRenderModel", "Emitter", "createRenderDimensions", "e", "DomRendererRowFactory", "CursorBlinkStateManager", "addDisposableListener", "toDisposable", "TextBlinkStateManager", "WidthCache", "dpr", "element", "styles", "colors", "color", "blinkAnimationUnderlineId", "blinkAnimationBarId", "blinkAnimationBlockId", "i", "c", "spacing", "cols", "rows", "row", "isVisible", "start", "end", "columnSelectMode", "oldViewportStart", "oldViewportEnd", "newViewportStart", "newViewportEnd", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "documentFragment", "isXFlipped", "startCol", "endCol", "middleRowsCount", "finalEndCol", "renderStartRow", "renderEndRow", "cursorViewportRow", "colStart", "colEnd", "rowCount", "left", "width", "buffer", "cursorAbsoluteY", "cursorX", "cursorBlink", "cursorStyle", "cursorInactiveStyle", "rowInfo", "y", "rowElement", "lineData", "x", "x2", "y2", "enabled", "maxY", "bufferline", "hasBlinkingCells", "__decorateClass", "__decorateParam", "IInstantiationService", "ICharSizeService", "IOptionsService", "IBufferService", "ICoreService", "ICoreBrowserService", "IThemeService", "_rowContainer", "CharSizeService", "Disposable", "document", "parentElement", "_optionsService", "Emitter", "TextMetricsMeasureStrategy", "DomMeasureStrategy", "result", "__decorateClass", "__decorateParam", "IOptionsService", "BaseMeasureStategy", "Disposable", "width", "height", "DomMeasureStrategy", "_document", "_parentElement", "_optionsService", "TextMetricsMeasureStrategy", "a", "metrics", "CoreBrowserService", "Disposable", "_textarea", "_window", "mainDocument", "Emitter", "ScreenDprMonitor", "w", "EventUtils", "addDisposableListener", "value", "_parentWindow", "MutableDisposable", "toDisposable", "parentWindow", "LinkProviderService", "Disposable", "toDisposable", "linkProvider", "providerIndex", "getCoordsRelativeToElement", "window", "event", "element", "rect", "elementStyle", "leftPadding", "topPadding", "getCoords", "colCount", "rowCount", "hasValidCharSize", "cssCellWidth", "cssCellHeight", "isSelection", "coords", "MouseCoordsService", "_charSizeService", "_renderService", "event", "element", "colCount", "rowCount", "isSelection", "getCoords", "coords", "getCoordsRelativeToElement", "getWindow", "__decorateClass", "__decorateParam", "ICharSizeService", "IRenderService", "mainWindow", "tail", "array", "n", "memoize", "_target", "key", "descriptor", "fnKey", "fn", "memoizeKey", "descriptorAny", "args", "_LinkedListNode", "element", "LinkedListNode", "LinkedList", "atTheEnd", "newNode", "oldLast", "oldFirst", "didRemove", "node", "anchor", "EventType", "_Gesture", "Disposable", "targetWindow", "addDisposableListener", "e", "remove", "toDisposable", "timestamp", "i", "len", "touch", "evt", "activeTouchCount", "data", "holdTime", "finalX", "finalY", "deltaT", "deltaX", "deltaY", "dispatchTo", "t", "type", "initialTarget", "event", "currentTime", "setTapCount", "ignoreTarget", "targets", "target", "depth", "now", "a", "b", "t1", "vX", "dirX", "x", "vY", "dirY", "y", "scheduleAtNextAnimationFrame", "deltaPosX", "deltaPosY", "stopped", "d", "__decorateClass", "Gesture", "MouseService", "_renderService", "_mouseCoordsService", "_mouseStateService", "_coreService", "_bufferService", "_optionsService", "_selectionService", "_logService", "_coreBrowserService", "target", "register", "focus", "element", "document", "requestedEvents", "ctx", "eventListeners", "ev", "events", "toDisposable", "addDisposableListener", "Gesture", "EventType", "e", "pos", "but", "action", "deltaY", "sequence", "cellHeight", "lines", "i", "amount", "dpr", "targetWheelEventPixels", "report", "e1", "e2", "pixels", "__decorateClass", "__decorateParam", "IRenderService", "IMouseCoordsService", "IMouseStateService", "ICoreService", "IBufferService", "IOptionsService", "ISelectionService", "ILogService", "ICoreBrowserService", "RenderDebouncer", "_renderCallback", "_coreBrowserService", "callback", "rowStart", "rowEnd", "rowCount", "start", "end", "TaskQueue", "logService", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "DebouncedIdleTask", "RenderService", "Disposable", "_rowCount", "screenElement", "_optionsService", "_logService", "_charSizeService", "_coreService", "decorationService", "bufferService", "_coreBrowserService", "themeService", "MutableDisposable", "Emitter", "DebouncedIdleTask", "RenderDebouncer", "start", "end", "SynchronizedOutputHandler", "toDisposable", "w", "observer", "e", "entry", "sync", "isRedrawOnly", "buffered", "cols", "rows", "renderer", "callback", "columnSelectMode", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "ICharSizeService", "ICoreService", "IDecorationService", "IBufferService", "ICoreBrowserService", "IThemeService", "_onTimeout", "result", "moveToCellSequence", "targetX", "targetY", "bufferService", "applicationCursor", "startX", "startY", "resetStartingRow", "moveToRequestedRow", "moveToRequestedCol", "direction", "repeat", "sequence", "rowDifference", "cellsToMove", "colsFromRowEnd", "colsFromRowBeginning", "currX", "bufferLine", "wrappedRowsForRow", "startRow", "endRow", "rowsToMove", "wrappedRowsCount", "verticalDirection", "horizontalDirection", "wrappedRows", "i", "currentRow", "rowCount", "line", "lineWraps", "startCol", "endCol", "forward", "currentCol", "bufferStr", "mod", "count", "str", "rpt", "SelectionModel", "_bufferService", "startPlusLength", "start", "end", "amount", "getRangeLength", "range", "bufferCols", "DRAG_SCROLL_MAX_THRESHOLD", "DRAG_SCROLL_MAX_SPEED", "DRAG_SCROLL_INTERVAL", "ALT_CLICK_MOVE_CURSOR_TIME", "NON_BREAKING_SPACE_CHAR", "ALL_NON_BREAKING_SPACE_REGEX", "SelectionService", "Disposable", "_element", "_screenElement", "_linkifier", "_bufferService", "_coreService", "_mouseCoordsService", "_optionsService", "_renderService", "_coreBrowserService", "CellData", "Emitter", "event", "amount", "e", "SelectionModel", "toDisposable", "start", "end", "buffer", "result", "startCol", "endCol", "i", "lineText", "startRowEndCol", "bufferLine", "line", "ALL_NON_BREAKING_SPACE_REGEX", "isWindows", "isLinuxMouseSelection", "isLinux", "coords", "x", "y", "allowWhitespaceOnlySelection", "range", "getRangeLength", "offset", "getCoordsRelativeToElement", "terminalHeight", "DRAG_SCROLL_MAX_THRESHOLD", "DRAG_SCROLL_MAX_SPEED", "isMac", "DRAG_SCROLL_INTERVAL", "hadSelection", "previousSelectionEnd", "timeElapsed", "ALT_CLICK_MOVE_CURSOR_TIME", "coordinates", "sequence", "moveToCellSequence", "hasSelection", "charIndex", "length", "col", "row", "ev", "followWrappedLinesAbove", "followWrappedLinesBelow", "startIndex", "endIndex", "charOffset", "leftWideCharCount", "rightWideCharCount", "leftLongCharOffset", "rightLongCharOffset", "previousBufferLine", "previousLineWordPosition", "nextBufferLine", "nextLineWordPosition", "wordPosition", "endRow", "cell", "wrappedRange", "__decorateClass", "__decorateParam", "IBufferService", "ICoreService", "IMouseCoordsService", "IOptionsService", "IRenderService", "ICoreBrowserService", "TwoKeyMap", "first", "second", "value", "ColorContrastCache", "TwoKeyMap", "bg", "fg", "value", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "r", "g", "b", "channels", "c", "DEFAULT_FOREGROUND", "css", "DEFAULT_BACKGROUND", "DEFAULT_CURSOR", "DEFAULT_CURSOR_ACCENT", "DEFAULT_SELECTION", "DEFAULT_OVERVIEW_RULER_BORDER", "ThemeService", "Disposable", "_optionsService", "ColorContrastCache", "Emitter", "color", "DEFAULT_ANSI_COLORS", "theme", "colors", "parseColor", "NULL_COLOR", "colorCount", "i", "slot", "callback", "__decorateClass", "__decorateParam", "IOptionsService", "cssString", "fallback", "KEYCODE_KEY_MAPPINGS", "evaluateKeyboardEvent", "ev", "applicationCursorMode", "isMac", "macOptionIsMeta", "result", "modifiers", "key", "keyCode", "keyString", "KittyKeyboard", "ev", "suffix", "mods", "numpadCode", "modifierCode", "funcCode", "digit", "code", "letter", "modifiers", "eventType", "reportEventTypes", "needsEventType", "seq", "number", "keyCode", "flags", "isFunc", "isMod", "reportAlternateKeys", "shiftedKey", "textCode", "result", "csiLetter", "ss3Letter", "tildeCode", "useCsiU", "legacyByte", "Win32InputMode", "ev", "vk", "controlChar", "codePoint", "state", "isKeyDown", "sc", "uc", "kd", "cs", "KeyboardService", "_coreService", "_optionsService", "Win32InputMode", "KittyKeyboard", "event", "kittyFlags", "evaluateKeyboardEvent", "isMac", "__decorateClass", "__decorateParam", "ICoreService", "IOptionsService", "ServiceCollection", "entries", "id", "service", "instance", "result", "callback", "key", "value", "InstantiationService", "IInstantiationService", "ctor", "args", "serviceDependencies", "getServiceDependencies", "a", "b", "serviceArgs", "dependency", "firstServiceArgPos", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "optionalParams", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "CircularList", "Disposable", "_maxLength", "Emitter", "newMaxLength", "newArray", "i", "newLength", "index", "value", "start", "deleteCount", "items", "countToTrim", "count", "offset", "expandListBy", "CELL_SIZE", "DEFAULT_ATTR_DATA", "AttributeData", "$startIndex", "$workCell", "CellData", "CLEANUP_THRESHOLD", "BufferLine", "_BufferLine", "cols", "fillCellData", "isWrapped", "CELL_SIZE", "cell", "i", "index", "content", "cp", "stringFromCodePoint", "value", "codePoint", "width", "attrs", "pos", "n", "start", "end", "respectProtect", "uint32Cells", "data", "keys", "key", "extKeys", "line", "el", "newLine", "src", "srcCol", "destCol", "length", "applyInReverse", "srcData", "srcCombinedKeys", "trimRight", "startCol", "endCol", "outColumns", "result", "chars", "reflowLargerGetLinesToRemove", "lines", "oldCols", "newCols", "bufferAbsoluteY", "nullCell", "reflowCursorLine", "toRemove", "y", "i", "nextLine", "wrappedLines", "destLineIndex", "destCol", "getWrappedLineTrimmedLength", "srcLineIndex", "srcCol", "srcTrimmedTineLength", "srcRemainingCells", "destRemainingCells", "cellsToCopy", "countToRemove", "reflowLargerCreateNewLayout", "layout", "nextToRemoveIndex", "nextToRemoveStart", "countRemovedSoFar", "reflowLargerApplyNewLayout", "newLayout", "newLayoutLines", "reflowSmallerGetNewLineLengths", "newLineLengths", "cellsNeeded", "p", "c", "srcLine", "cellsAvailable", "oldTrimmedLength", "endsWithWide", "lineLength", "cols", "endsInNull", "followingLineStartsWithWide", "_Marker", "line", "Emitter", "dispose", "disposable", "Marker", "CHARSETS", "DEFAULT_CHARSET", "MAX_BUFFER_SIZE", "Buffer", "_hasScrollback", "_optionsService", "_bufferService", "_logService", "DEFAULT_ATTR_DATA", "DEFAULT_CHARSET", "CellData", "CircularList", "IdleTaskQueue", "attr", "ExtendedAttrs", "isWrapped", "BufferLine", "relativeY", "rows", "correctBufferLength", "fillAttr", "i", "newCols", "newRows", "nullCell", "dirtyMemoryLines", "newMaxLength", "addToY", "y", "amountToTrim", "maxY", "normalRun", "counted", "windowsPty", "reflowCursorLine", "toRemove", "reflowLargerGetLinesToRemove", "newLayoutResult", "reflowLargerCreateNewLayout", "reflowLargerApplyNewLayout", "countRemoved", "viewportAdjustments", "toInsert", "countToInsert", "nextLine", "wrappedLines", "absoluteY", "lastLineLength", "destLineLengths", "reflowSmallerGetNewLineLengths", "linesToAdd", "trimmedLines", "newLines", "newLine", "destLineIndex", "destCol", "srcLineIndex", "srcCol", "cellsToCopy", "wrappedLinesIndex", "getWrappedLineTrimmedLength", "insertEvents", "originalLines", "originalLinesLength", "originalLineIndex", "nextToInsertIndex", "nextToInsert", "countInsertedSoFar", "nextI", "insertCountEmitted", "lineIndex", "trimRight", "startCol", "endCol", "line", "first", "last", "x", "marker", "Marker", "amount", "event", "BufferSet", "Disposable", "_optionsService", "_bufferService", "_logService", "Emitter", "Buffer", "fillAttr", "newCols", "newRows", "i", "MINIMUM_COLS", "MINIMUM_ROWS", "BufferService", "Disposable", "optionsService", "logService", "Emitter", "BufferSet", "e", "cols", "rows", "colsChanged", "rowsChanged", "eraseAttr", "isWrapped", "buffer", "newLine", "topRow", "bottomRow", "willBufferBeTrimmed", "scrollRegionHeight", "disp", "suppressScrollEvent", "oldYdisp", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "DEFAULT_OPTIONS", "isMac", "FONT_WEIGHT_OPTIONS", "OptionsService", "Disposable", "options", "Emitter", "defaultOptions", "key", "newValue", "e", "toDisposable", "listener", "eventKey", "keys", "getter", "propName", "setter", "value", "desc", "isCursorStyle", "clone", "val", "depth", "clonedObject", "key", "DEFAULT_MODES", "DEFAULT_DEC_PRIVATE_MODES", "DEFAULT_KITTY_KEYBOARD_STATE", "CoreService", "Disposable", "_bufferService", "_logService", "_optionsService", "Emitter", "clone", "data", "wasUserInput", "buffer", "e", "__decorateClass", "__decorateParam", "IBufferService", "ILogService", "IOptionsService", "DEFAULT_PROTOCOLS", "e", "eventCode", "e", "isSGR", "code", "S", "DEFAULT_ENCODINGS", "params", "final", "MouseStateService", "Disposable", "Emitter", "name", "DEFAULT_PROTOCOLS", "protocol", "encoding", "customWheelEventHandler", "ev", "BMP_COMBINING", "HIGH_COMBINING", "table", "bisearch", "ucs", "data", "min", "max", "mid", "UnicodeV6", "r", "num", "codepoint", "preceding", "width", "shouldJoin", "oldWidth", "UnicodeService", "UnicodeService", "_UnicodeService", "Emitter", "defaultProvider", "UnicodeV6", "value", "state", "width", "shouldJoin", "version", "provider", "num", "s", "result", "precedingInfo", "length", "i", "code", "second", "currentInfo", "chWidth", "codepoint", "preceding", "CharsetService", "g", "charset", "updateWindowsModeWrappedState", "bufferService", "lastChar", "nextLine", "MAX_VALUE", "MAX_SUBPARAMS", "Params", "_Params", "maxLength", "maxSubParamsLength", "values", "params", "value", "k", "newParams", "res", "i", "start", "end", "idx", "result", "length", "store", "cur", "EMPTY_HANDLERS", "OscParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "code", "success", "promiseResult", "handlerResult", "fallThrough", "_OscHandler", "_handler", "ret", "res", "OscHandler", "EMPTY_HANDLERS", "DcsParser", "ident", "handler", "handlerList", "handlerIndex", "j", "params", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "EMPTY_PARAMS", "Params", "_DcsHandler", "_handler", "ret", "res", "DcsHandler", "EMPTY_HANDLERS", "ApcParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "_ApcHandler", "_handler", "ret", "res", "ApcHandler", "TransitionTable", "length", "action", "next", "code", "state", "codes", "i", "NON_ASCII_PRINTABLE", "VT500_TRANSITION_TABLE", "table", "blueprint", "unused", "r", "start", "end", "PRINTABLES", "EXECUTABLES", "states", "EscapeSequenceParser", "Disposable", "_transitions", "Params", "data", "ident", "params", "toDisposable", "OscParser", "DcsParser", "ApcParser", "id", "finalRange", "res", "intermediate", "finalCode", "handler", "handlerList", "handlerIndex", "flag", "callback", "handlers", "handlerPos", "transition", "chunkPos", "promiseResult", "handlerResult", "j", "handlersEsc", "jj", "RGB_REX", "HASH_REX", "parseColor", "data", "low", "m", "base", "adv", "result", "i", "c", "pad", "bits", "s", "s2", "toRgbString", "color", "r", "g", "b", "XTERM_VERSION", "GLEVEL", "MAX_PARSEBUFFER_LENGTH", "STACK_LIMIT", "paramToWindowOption", "opts", "SLOW_ASYNC_LIMIT", "$temp", "InputHandler", "Disposable", "_bufferService", "_charsetService", "_coreService", "_logService", "_optionsService", "_oscLinkService", "_mouseStateService", "_unicodeService", "_parser", "EscapeSequenceParser", "StringToUtf32", "Utf8ToUtf32", "DEFAULT_ATTR_DATA", "Emitter", "DirtyRowTracker", "e", "ident", "params", "code", "identifier", "action", "data", "payload", "start", "end", "OscHandler", "flag", "CHARSETS", "state", "DcsHandler", "cursorStartX", "cursorStartY", "decodedLength", "position", "p", "slowTimeout", "slowPromise", "_res", "rej", "err", "promiseResult", "result", "wasPaused", "MAX_PARSEBUFFER_LENGTH", "i", "len", "viewportEnd", "viewportStart", "chWidth", "charset", "screenReaderMode", "cols", "wraparoundMode", "insertMode", "curAttr", "bufferRow", "precedingJoinState", "pos", "ch", "currentInfo", "UnicodeService", "shouldJoin", "oldWidth", "stringFromCodePoint", "oldRow", "oldCol", "BufferLine", "offset", "delta", "id", "callback", "paramToWindowOption", "ApcHandler", "line", "originalX", "maxCol", "x", "y", "diffToTop", "diffToBottom", "param", "clearWrap", "respectProtect", "j", "nextLine", "scrollBackSize", "row", "scrollBottomRowsOffset", "scrollBottomAbsolute", "joinState", "length", "text", "idata", "itext", "tlength", "XTERM_VERSION", "term", "DEFAULT_CHARSET", "ansi", "V", "dm", "mouseProtocol", "mouseEncoding", "cs", "buffers", "active", "alt", "opts", "f", "m", "v", "b2v", "value", "color", "mode", "c1", "c2", "c3", "AttributeData", "attr", "accu", "cSpace", "advance", "subparams", "style", "l", "isBlinking", "top", "bottom", "second", "STACK_LIMIT", "event", "slots", "idx", "spec", "index", "isValidColorIndex", "parseColor", "uri", "parsedParams", "idParamIndex", "collectAndFlag", "GLEVEL", "scrollRegionHeight", "level", "cell", "CellData", "yOffset", "s", "b", "STYLES", "y1", "y2", "flags", "stack", "count", "__decorateClass", "__decorateParam", "IBufferService", "DISCARD_WATERMARK", "WRITE_TIMEOUT_MS", "WRITE_BUFFER_LENGTH_THRESHOLD", "WriteBuffer", "Disposable", "_action", "Emitter", "chunk", "cb", "data", "maxSubsequentCalls", "callback", "lastTime", "promiseResult", "startTime", "result", "continuation", "r", "err", "OscLinkService", "_bufferService", "data", "buffer", "marker", "entry", "castData", "key", "match", "linkId", "y", "e", "linkData", "index", "__decorateClass", "__decorateParam", "IBufferService", "hasWriteSyncWarnHappened", "CoreTerminal", "Disposable", "options", "MutableDisposable", "Emitter", "InstantiationService", "OptionsService", "IOptionsService", "LogService", "ILogService", "BufferService", "IBufferService", "CoreService", "ICoreService", "MouseStateService", "IMouseStateService", "UnicodeService", "IUnicodeService", "CharsetService", "ICharsetService", "OscLinkService", "IOscLinkService", "InputHandler", "EventUtils", "WriteBuffer", "data", "promiseResult", "ev", "key", "callback", "maxSubsequentCalls", "wasUserInput", "x", "y", "MINIMUM_COLS", "MINIMUM_ROWS", "eraseAttr", "isWrapped", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "id", "ident", "value", "windowsPty", "disposables", "updateWindowsModeWrappedState", "toDisposable", "d", "i", "SortedList", "_getKey", "logService", "IdleTaskQueue", "value", "sortedAddedValues", "a", "b", "sortedAddedValuesIndex", "arrayIndex", "newArray", "newArrayIndex", "key", "sortedDeletedIndices", "sortedDeletedIndicesIndex", "callback", "min", "max", "mid", "midKey", "$xmin", "$xmax", "$ymin", "$ymax", "DecorationService", "Disposable", "_logService", "Emitter", "SortedList", "e", "toDisposable", "options", "decoration", "Decoration", "markerDispose", "listener", "d", "x", "line", "layer", "xmin", "xmax", "ymin", "ymax", "callback", "__decorateClass", "__decorateParam", "ILogService", "DisposableStore", "css", "RENDER_DEBOUNCE_THRESHOLD_MS", "TimeBasedDebouncer", "_renderCallback", "_debounceThresholdMS", "rowStart", "rowEnd", "rowCount", "refreshRequestTime", "elapsed", "waitPeriodBeforeTrailingRefresh", "start", "end", "MAX_ROWS_TO_READ", "DEBUG", "AccessibilityManager", "Disposable", "_terminal", "instantiationService", "_coreBrowserService", "_renderService", "doc", "i", "e", "TimeBasedDebouncer", "char", "spaceCount", "addDisposableListener", "toDisposable", "MAX_ROWS_TO_READ", "tooMuchOutput", "keyChar", "start", "end", "buffer", "setSize", "line", "columns", "lineData", "posInSet", "element", "position", "boundaryElement", "beforeBoundaryElement", "lastRowPos", "topBoundaryElement", "bottomBoundaryElement", "newElement", "selection", "begin", "lastRowElement", "toRowColumn", "node", "offset", "rowElement", "row", "column", "beginRowColumn", "endRowColumn", "rows", "width", "lastColumn", "targetWidth", "__decorateClass", "__decorateParam", "IInstantiationService", "ICoreBrowserService", "IRenderService", "Linkifier", "Disposable", "_element", "_mouseCoordsService", "_renderService", "_bufferService", "_linkProviderService", "Emitter", "toDisposable", "dispose", "addDisposableListener", "event", "position", "composedPath", "i", "target", "useLineCache", "reply", "linkWithState", "linkProvided", "linkProvider", "links", "linksWithState", "link", "y", "replies", "occupiedCells", "providerReply", "startX", "endX", "x", "index", "hasLinkBefore", "j", "linkAtPosition", "currentLink", "linkEquals", "startRow", "endRow", "v", "e", "start", "end", "element", "showEvent", "range", "scrollOffset", "lower", "upper", "current", "coords", "x1", "y1", "x2", "y2", "fg", "__decorateClass", "__decorateParam", "IMouseCoordsService", "IRenderService", "IBufferService", "ILinkProviderService", "a", "b", "CoreBrowserTerminal", "CoreTerminal", "options", "MutableDisposable", "Platform_exports", "Emitter", "DecorationService", "IDecorationService", "KeyboardService", "IKeyboardService", "LinkProviderService", "ILinkProviderService", "OscLinkProvider", "e", "type", "event", "EventUtils", "toDisposable", "dimensions", "req", "acc", "ident", "colorRgb", "color", "toRgbString", "colors", "channels", "narrowedAcc", "bgLuminance", "rgb", "fgLuminance", "colorSchemeMode", "value", "AccessibilityManager", "ev", "cursorY", "bufferLine", "cursorX", "cellHeight", "width", "cellWidth", "cursorTop", "cursorLeft", "addDisposableListener", "copyHandler", "pasteHandlerWrapper", "handlePasteEvent", "isFirefox", "rightClickHandler", "isLinux", "moveTextAreaUnderMouseCursor", "parent", "fragment", "textarea", "promptLabel", "isChromeOS", "CoreBrowserService", "ICoreBrowserService", "CharSizeService", "ICharSizeService", "ThemeService", "IThemeService", "CharacterJoinerService", "ICharacterJoinerService", "RenderService", "IRenderService", "CompositionHelper", "MouseCoordsService", "IMouseCoordsService", "linkifier", "Linkifier", "Viewport", "SelectionService", "ISelectionService", "MouseService", "IMouseService", "text", "BufferDecorationRenderer", "showScrollbar", "overviewRulerWidth", "OverviewRulerRenderer", "shouldShow", "amount", "disposable", "DomRenderer", "start", "end", "sync", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "data", "paste", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "shouldIgnoreComposition", "result", "scrollCount", "wasModifierOnly", "wasModifierKeyOnlyEvent", "browser", "thirdLevelKey", "key", "x", "y", "i", "DEFAULT_ATTR_DATA", "canvasWidth", "canvasHeight", "AddonManager", "i", "terminal", "instance", "loadedAddon", "index", "BufferLineApiView", "_line", "x", "cell", "CellData", "trimRight", "startColumn", "endColumn", "BufferApiView", "_buffer", "type", "buffer", "y", "line", "BufferLineApiView", "CellData", "BufferNamespaceApi", "Disposable", "_core", "Emitter", "BufferApiView", "ParserApi", "_core", "id", "callback", "params", "data", "handler", "ident", "UnicodeApi", "_core", "provider", "version", "CONSTRUCTOR_ONLY_OPTIONS", "$value", "Terminal", "Disposable", "options", "CoreBrowserTerminal", "AddonManager", "getter", "propName", "setter", "value", "desc", "ParserApi", "UnicodeApi", "BufferNamespaceApi", "m", "mouseTrackingMode", "data", "wasUserInput", "columns", "rows", "parent", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "start", "end", "amount", "pageCount", "line", "callback", "addon", "promptLabel", "tooMuchOutput", "values"]
}
