{"version":3,"file":"c8y-ngx-components-remote-access-terminal-viewer.mjs","sources":["../../remote-access/terminal-viewer/telnet-negotiator.ts","../../remote-access/terminal-viewer/shell-adapter.ts","../../remote-access/terminal-viewer/terminal-viewer.component.ts","../../remote-access/terminal-viewer/terminal-viewer.component.html","../../remote-access/terminal-viewer/c8y-ngx-components-remote-access-terminal-viewer.ts"],"sourcesContent":["import type { Terminal } from '@xterm/xterm';\n\nexport class TelnetNegotiator {\n  constructor(\n    private terminal: Terminal,\n    private termType: string\n  ) {}\n\n  setTermType(type) {\n    this.termType = type;\n  }\n\n  pushStr(str, arr) {\n    for (let i = 0; i < str.length; i++) {\n      arr.push(str.charCodeAt(i));\n    }\n  }\n\n  negotiate(data) {\n    const arrUint8 = new Uint8Array(data);\n    const arr = [...arrUint8.values()];\n\n    const sendQueue = [];\n    let stringToDisplay = '';\n    let chr: number;\n    let code: number;\n    let value: number;\n\n    while (arr.length > 0) {\n      chr = arr.shift();\n      switch (chr) {\n        case 255: // IAC\n          code = arr.shift();\n          value = arr.shift();\n          switch (code) {\n            case 253: // DO\n              if (value === 24) {\n                // Terminal type\n                sendQueue.push(255, 251, value);\n              } else if (value === 31) {\n                // NAWS (Negotiate About Window Size)\n                // client answers WILL NAWS\n                sendQueue.push(255, 251, 31);\n                // client sends IAC SB NAWS 0 terminalSize.cols 0 terminalSize.rows IAC SE\n                sendQueue.push(\n                  255,\n                  250,\n                  31,\n                  0,\n                  this.terminal.cols,\n                  0,\n                  this.terminal.rows,\n                  255,\n                  240\n                );\n              } else {\n                // Refuse other DO requests with a WONT\n                sendQueue.push(255, 252, value);\n              }\n              break;\n            case 251: // WILL\n              if (value === 1) {\n                // Affirm echo with DO\n                sendQueue.push(255, 253, value);\n              } else {\n                // Reject other WILL offers with a DONT\n                sendQueue.push(255, 254, value);\n              }\n              break;\n            case 250: // SB (subnegotiation)\n              if (value === 24) {\n                // TERM-TYPE subnegotiation\n                if (arr[0] === 1 && arr[1] === 255 && arr[2] === 240) {\n                  arr.shift();\n                  arr.shift();\n                  arr.shift();\n                  sendQueue.push(255, 250, 24, 0);\n                  this.pushStr(this.termType, sendQueue);\n                  sendQueue.push(255, 240);\n                } else {\n                  console.warn('Invalid subnegotiation received' + arr);\n                }\n              } else {\n                console.warn('Ignoring SB ' + value);\n              }\n              break;\n            case 254: // DONT\n            case 252: // WONT\n            default:\n              break;\n          }\n          break;\n        case 242: // Data Mark (Synch)\n          code = arr.shift();\n          value = arr.shift();\n          break;\n        default: // everything else\n          stringToDisplay += String.fromCharCode(chr);\n          break;\n      }\n    }\n\n    return {\n      dataToSend: sendQueue.length ? new Uint8Array(sendQueue) : '',\n      isOutput: !!stringToDisplay.length\n    };\n  }\n}\n","import { TelnetNegotiator } from './telnet-negotiator';\nimport type { Terminal } from '@xterm/xterm';\n\nexport class ShellAdapter {\n  constructor(\n    private terminal: Terminal,\n    private termType = 'xterm-256color'\n  ) {}\n\n  filterNonPrintable(str: string) {\n    // get rid of �\n    const helpArr = str.split('�');\n    str = helpArr.join('');\n\n    return str;\n  }\n\n  setTermType(type) {\n    this.termType = type;\n  }\n\n  filterReceiveData(data) {\n    // negotiate telnet signals, if any\n    const telnet = new TelnetNegotiator(this.terminal, this.termType);\n    const telnetData = telnet.negotiate(data);\n\n    // decode text for display\n    const textDecoder = new TextDecoder();\n    const decodedToDisplay = textDecoder.decode(data);\n\n    return {\n      dataToSend: telnetData.dataToSend,\n      dataToDisplay: telnetData.isOutput ? this.filterNonPrintable(decodedToDisplay) : ''\n    };\n  }\n\n  filterSendData(data) {\n    const sendQueue = [];\n    for (let i = 0; i < data.length; i++) {\n      sendQueue.push(data.charCodeAt(i));\n    }\n\n    return sendQueue.length ? new Uint8Array(sendQueue) : '';\n  }\n}\n","import { AfterViewInit, Component, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport {\n  ActionBarItemComponent,\n  C8yTranslatePipe,\n  IconDirective,\n  TitleComponent\n} from '@c8y/ngx-components';\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport { ShellAdapter } from './shell-adapter';\nimport { RemoteAccessService } from '@c8y/ngx-components/remote-access/data';\nimport { ActivatedRoute } from '@angular/router';\n// workaround as we were unable to import this in component styles\nimport '@xterm/xterm/css/xterm.css';\nimport { NgIf } from '@angular/common';\n\n@Component({\n  selector: 'c8y-terminal-viewer',\n  templateUrl: './terminal-viewer.component.html',\n  encapsulation: ViewEncapsulation.None,\n  standalone: true,\n  imports: [TitleComponent, C8yTranslatePipe, ActionBarItemComponent, IconDirective, NgIf]\n})\nexport class TerminalViewerComponent implements AfterViewInit, OnDestroy {\n  title = '';\n  container: HTMLElement | null = null;\n  terminal: Terminal | null = null;\n  socket: WebSocket | null = null;\n  firstDeviceMessageReceived = false;\n  readonly configurationId: string;\n  readonly deviceId: string;\n  protected observer: ResizeObserver;\n\n  constructor(\n    private remoteAccess: RemoteAccessService,\n    private activatedRoute: ActivatedRoute\n  ) {\n    this.configurationId = this.activatedRoute.snapshot.params.configurationId;\n    this.deviceId = this.activatedRoute.parent.snapshot.params.id;\n  }\n\n  ngOnDestroy(): void {\n    this.observer?.disconnect();\n    const stringToSend = 'exit\\n';\n    const sendQueue = [];\n    for (let i = 0; i < stringToSend.length; i++) {\n      sendQueue.push(stringToSend.charCodeAt(i));\n    }\n    this.socket?.send(new Uint8Array(sendQueue));\n    this.socket?.close();\n  }\n\n  ngAfterViewInit(): void {\n    this.container = document.getElementById('terminal-screen');\n    this.terminal = new Terminal({\n      fontSize: 18,\n      fontFamily: 'consolas, monospace',\n      cursorBlink: true\n    });\n    const fitAddon = new FitAddon();\n    this.socket = new WebSocket(\n      this.remoteAccess.getWebSocketUri(this.deviceId, this.configurationId),\n      'binary'\n    );\n    this.socket.binaryType = 'arraybuffer';\n    this.terminal.loadAddon(fitAddon);\n    this.terminal.open(this.container);\n    fitAddon.fit();\n    const shellAdapter = new ShellAdapter(this.terminal);\n    this.observer = new ResizeObserver(() => {\n      fitAddon.fit();\n    });\n    this.observer.observe(this.container);\n\n    this.terminal.writeln('\\u001b[92mEstablishing Websocket connection... \\u001b[39m \\r\\n');\n    this.terminal.focus();\n    this.socket.onopen = () => {\n      this.terminal.writeln(\n        '\\u001b[92mWebsocket connection was established successfully, waiting for device... \\u001b[39m \\r\\n'\n      );\n    };\n\n    this.socket.onclose = () => {\n      this.terminal.writeln('');\n      this.terminal.writeln('\\r\\n\\u001b[91mDevice disconnected. \\u001b[39m \\r\\n');\n      this.terminal.writeln('\\r\\n\\u001b[91mWebsocket connection was closed. \\u001b[39m \\r\\n');\n    };\n\n    this.socket.onmessage = message => {\n      if (!this.firstDeviceMessageReceived) {\n        this.firstDeviceMessageReceived = true;\n        this.terminal.writeln(\n          '\\u001b[92mDevice connection was established successfully. \\u001b[39m \\r\\n'\n        );\n      }\n      const filteredData = shellAdapter.filterReceiveData(message.data);\n      if (filteredData.dataToSend.length) {\n        this.socket.send(filteredData.dataToSend);\n      }\n      if (filteredData.dataToDisplay.length) {\n        this.terminal.write(filteredData.dataToDisplay);\n      }\n    };\n\n    this.terminal.onData(data => {\n      if (this.firstDeviceMessageReceived) {\n        const encodedToSend = shellAdapter.filterSendData(data);\n\n        if (encodedToSend.length) {\n          this.socket.send(encodedToSend);\n        }\n      }\n    });\n  }\n\n  toggleFullscreen() {\n    if (document.fullscreenElement) {\n      document.exitFullscreen();\n    } else {\n      this.container.requestFullscreen();\n    }\n  }\n}\n","<c8y-title>Terminal Viewer: {{ title | translate }}</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"firstDeviceMessageReceived\">\n    <button\n      class=\"btn btn-link\"\n      (click)=\"toggleFullscreen()\"\n    >\n      <i [c8yIcon]=\"'expand'\"></i>\n      <span translate>Fullscreen</span>\n    </button>\n  </c8y-action-bar-item>\n\n<div class=\"content-fullpage\" >\n    <div id=\"terminal-screen\" class=\"inner-scroll\"></div>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;MAEa,gBAAgB,CAAA;IAC3B,WAAA,CACU,QAAkB,EAClB,QAAgB,EAAA;QADhB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACf;AAEH,IAAA,WAAW,CAAC,IAAI,EAAA;AACd,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEA,OAAO,CAAC,GAAG,EAAE,GAAG,EAAA;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B;IACF;AAEA,IAAA,SAAS,CAAC,IAAI,EAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAElC,MAAM,SAAS,GAAG,EAAE;QACpB,IAAI,eAAe,GAAG,EAAE;AACxB,QAAA,IAAI,GAAW;AACf,QAAA,IAAI,IAAY;AAChB,QAAA,IAAI,KAAa;AAEjB,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE;YACjB,QAAQ,GAAG;gBACT,KAAK,GAAG;AACN,oBAAA,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE;AAClB,oBAAA,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;oBACnB,QAAQ,IAAI;wBACV,KAAK,GAAG;AACN,4BAAA,IAAI,KAAK,KAAK,EAAE,EAAE;;gCAEhB,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;4BACjC;AAAO,iCAAA,IAAI,KAAK,KAAK,EAAE,EAAE;;;gCAGvB,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;;AAE5B,gCAAA,SAAS,CAAC,IAAI,CACZ,GAAG,EACH,GAAG,EACH,EAAE,EACF,CAAC,EACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,CAAC,EACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,GAAG,EACH,GAAG,CACJ;4BACH;iCAAO;;gCAEL,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;4BACjC;4BACA;wBACF,KAAK,GAAG;AACN,4BAAA,IAAI,KAAK,KAAK,CAAC,EAAE;;gCAEf,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;4BACjC;iCAAO;;gCAEL,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;4BACjC;4BACA;wBACF,KAAK,GAAG;AACN,4BAAA,IAAI,KAAK,KAAK,EAAE,EAAE;;gCAEhB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;oCACpD,GAAG,CAAC,KAAK,EAAE;oCACX,GAAG,CAAC,KAAK,EAAE;oCACX,GAAG,CAAC,KAAK,EAAE;oCACX,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;oCAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;AACtC,oCAAA,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;gCAC1B;qCAAO;AACL,oCAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,GAAG,GAAG,CAAC;gCACvD;4BACF;iCAAO;AACL,gCAAA,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;4BACtC;4BACA;wBACF,KAAK,GAAG,CAAC;wBACT,KAAK,GAAG,CAAC;AACT,wBAAA;4BACE;;oBAEJ;gBACF,KAAK,GAAG;AACN,oBAAA,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE;AAClB,oBAAA,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;oBACnB;AACF,gBAAA;AACE,oBAAA,eAAe,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;oBAC3C;;QAEN;QAEA,OAAO;AACL,YAAA,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;AAC7D,YAAA,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC;SAC7B;IACH;AACD;;MCxGY,YAAY,CAAA;IACvB,WAAA,CACU,QAAkB,EAClB,QAAA,GAAW,gBAAgB,EAAA;QAD3B,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACf;AAEH,IAAA,kBAAkB,CAAC,GAAW,EAAA;;QAE5B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,QAAA,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AAEtB,QAAA,OAAO,GAAG;IACZ;AAEA,IAAA,WAAW,CAAC,IAAI,EAAA;AACd,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;AAEA,IAAA,iBAAiB,CAAC,IAAI,EAAA;;AAEpB,QAAA,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;QACjE,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;;AAGzC,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE;QACrC,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjD,OAAO;YACL,UAAU,EAAE,UAAU,CAAC,UAAU;AACjC,YAAA,aAAa,EAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,GAAG;SAClF;IACH;AAEA,IAAA,cAAc,CAAC,IAAI,EAAA;QACjB,MAAM,SAAS,GAAG,EAAE;AACpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACpC;AAEA,QAAA,OAAO,SAAS,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;IAC1D;AACD;;MCrBY,uBAAuB,CAAA;IAUlC,WAAA,CACU,YAAiC,EACjC,cAA8B,EAAA;QAD9B,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,cAAc,GAAd,cAAc;QAXxB,IAAA,CAAA,KAAK,GAAG,EAAE;QACV,IAAA,CAAA,SAAS,GAAuB,IAAI;QACpC,IAAA,CAAA,QAAQ,GAAoB,IAAI;QAChC,IAAA,CAAA,MAAM,GAAqB,IAAI;QAC/B,IAAA,CAAA,0BAA0B,GAAG,KAAK;AAShC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe;AAC1E,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;IAC/D;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE;QAC3B,MAAM,YAAY,GAAG,QAAQ;QAC7B,MAAM,SAAS,GAAG,EAAE;AACpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5C;QACA,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;IACtB;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC;AAC3B,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,UAAU,EAAE,qBAAqB;AACjC,YAAA,WAAW,EAAE;AACd,SAAA,CAAC;AACF,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CACzB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,EACtE,QAAQ,CACT;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,aAAa;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAClC,QAAQ,CAAC,GAAG,EAAE;QACd,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;AACpD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAK;YACtC,QAAQ,CAAC,GAAG,EAAE;AAChB,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;AAErC,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gEAAgE,CAAC;AACvF,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAK;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CACnB,oGAAoG,CACrG;AACH,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAK;AACzB,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oDAAoD,CAAC;AAC3E,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gEAAgE,CAAC;AACzF,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,IAAG;AAChC,YAAA,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;AACpC,gBAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;AACtC,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CACnB,2EAA2E,CAC5E;YACH;YACA,MAAM,YAAY,GAAG,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC;AACjE,YAAA,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE;gBAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAC3C;AACA,YAAA,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC;YACjD;AACF,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAG;AAC1B,YAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE;gBACnC,MAAM,aAAa,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC;AAEvD,gBAAA,IAAI,aAAa,CAAC,MAAM,EAAE;AACxB,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;gBACjC;YACF;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,QAAQ,CAAC,iBAAiB,EAAE;YAC9B,QAAQ,CAAC,cAAc,EAAE;QAC3B;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QACpC;IACF;+GAlGW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBpC,mdAcM,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDOM,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAoB,sBAAsB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA7D,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAE/B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,iBAEhB,iBAAiB,CAAC,IAAI,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP,CAAC,cAAc,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,aAAa,EAAE,IAAI,CAAC,EAAA,QAAA,EAAA,mdAAA,EAAA;;;AErB1F;;AAEG;;;;"}