@melandlabs/integrations-telegram 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/adapter.d.ts +2 -2
- package/dist/adapter.js +3 -3
- package/dist/adapter.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/tdata-converter.js +2 -2
- package/dist/tdata-converter.js.map +1 -1
- package/package.json +6 -6
package/dist/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/markdown.ts","../src/adapter.ts"],"names":["senderName"],"mappings":"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","file":"adapter.js","sourcesContent":["/**\n * Markdown → Telegram HTML converter.\n *\n * Architecture (from OpenClaw):\n * 1. Parse markdown with markdown-it → token stream\n * 2. Convert tokens to an IR: { text, styles: [{start,end,style}], links: [{start,end,href}] }\n * 3. Render IR → Telegram HTML using a boundary-based stack\n *\n * This approach properly handles overlapping styles (e.g. **bold [link](url)**)\n * by ranking styles and rendering from outermost to innermost.\n */\n\nimport MarkdownIt from \"markdown-it\";\n\n// Minimal Token interface matching markdown-it's Token class\ninterface Token {\n\ttype: string;\n\ttag: string;\n\tcontent: string;\n\tchildren: Token[] | null;\n\tattrs?: [string, string][];\n\tattrGet?: (name: string) => string | null;\n}\n\n// ─── IR types ────────────────────────────────────────────────────────────────\n\ninterface StyleSpan {\n\tstart: number;\n\tend: number;\n\tstyle: \"bold\" | \"italic\" | \"strikethrough\" | \"code\" | \"code_block\" | \"blockquote\" | \"spoiler\";\n}\n\ninterface LinkSpan {\n\tstart: number;\n\tend: number;\n\thref: string;\n}\n\ninterface MarkdownIR {\n\ttext: string;\n\tstyles: StyleSpan[];\n\tlinks: LinkSpan[];\n}\n\n// ─── markdown-it setup ────────────────────────────────────────────────────────\n\nfunction createMarkdownIt(): MarkdownIt {\n\tconst md = new MarkdownIt({\n\t\thtml: false,\n\t\tlinkify: true,\n\t\tbreaks: false,\n\t\ttypographer: false,\n\t});\n\tmd.enable(\"strikethrough\");\n\tmd.enable(\"table\");\n\treturn md;\n}\n\n// ─── Token → IR conversion ──────────────────────────────────────────────────\n\ninterface ListEntry {\n\ttype: \"bullet\" | \"ordered\";\n\tindex: number;\n}\n\ninterface TableCellIR {\n\ttext: string;\n\tstyles: StyleSpan[];\n\tlinks: LinkSpan[];\n}\n\ninterface TableIR {\n\theaders: TableCellIR[];\n\trows: TableCellIR[][];\n\tcurrentRow: TableCellIR[];\n\tcurrentCell: {\n\t\ttext: string;\n\t\tstyles: StyleSpan[];\n\t\tlinks: LinkSpan[];\n\t\topenStyles: { style: StyleSpan[\"style\"]; start: number }[];\n\t\tlinkStack: { href: string; labelStart: number }[];\n\t} | null;\n\tinHeader: boolean;\n}\n\ninterface RenderState {\n\ttext: string;\n\tstyles: StyleSpan[];\n\topenStyles: { style: StyleSpan[\"style\"]; start: number }[];\n\tlinks: LinkSpan[];\n\tlinkStack: { href: string; labelStart: number }[];\n\tlistStack: ListEntry[];\n\theadingStyle: \"none\" | \"bold\";\n\tblockquotePrefix: string;\n\ttable: TableIR | null;\n\ttableMode: \"off\" | \"bullets\" | \"code\";\n\tspoilerEnabled: boolean;\n}\n\nfunction initCellState(): {\n\ttext: string;\n\tstyles: StyleSpan[];\n\topenStyles: { style: StyleSpan[\"style\"]; start: number }[];\n\tlinks: LinkSpan[];\n\tlinkStack: { href: string; labelStart: number }[];\n} {\n\treturn {\n\t\ttext: \"\",\n\t\tstyles: [],\n\t\topenStyles: [],\n\t\tlinks: [],\n\t\tlinkStack: [],\n\t};\n}\n\nfunction finishCell(cell: ReturnType<typeof initCellState>): TableCellIR {\n\tcloseRemainingStyles(cell);\n\treturn { text: cell.text, styles: cell.styles, links: cell.links };\n}\n\nfunction resolveTarget(state: RenderState) {\n\treturn state.table?.currentCell ?? state;\n}\n\nfunction appendText(state: RenderState, value: string): void {\n\tif (!value) return;\n\tresolveTarget(state).text += value;\n}\n\nfunction openStyle(state: RenderState, style: StyleSpan[\"style\"]): void {\n\tconst target = resolveTarget(state);\n\ttarget.openStyles.push({ style, start: target.text.length });\n}\n\nfunction closeStyle(state: RenderState, style: StyleSpan[\"style\"]): void {\n\tconst target = resolveTarget(state);\n\tfor (let i = target.openStyles.length - 1; i >= 0; i--) {\n\t\tif (target.openStyles[i]?.style === style) {\n\t\t\tconst start = target.openStyles[i].start;\n\t\t\ttarget.openStyles.splice(i, 1);\n\t\t\tconst end = target.text.length;\n\t\t\tif (end > start) {\n\t\t\t\ttarget.styles.push({ start, end, style });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfunction closeRemainingStyles(target: ReturnType<typeof initCellState>): void {\n\tfor (let i = target.openStyles.length - 1; i >= 0; i--) {\n\t\tconst open = target.openStyles[i];\n\t\tconst end = target.text.length;\n\t\tif (end > open.start) {\n\t\t\ttarget.styles.push({ start: open.start, end, style: open.style });\n\t\t}\n\t}\n\ttarget.openStyles = [];\n}\n\nfunction getAttr(token: Token, name: string): string | null {\n\tif (token.attrGet) return token.attrGet(name);\n\tif (token.attrs) {\n\t\tfor (const [key, value] of token.attrs) {\n\t\t\tif (key === name) return value;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction renderTableAsBullets(state: RenderState): void {\n\tif (!state.table) return;\n\n\tconst headers = state.table.headers;\n\tconst rows = state.table.rows;\n\n\tfor (let ri = 0; ri < rows.length; ri++) {\n\t\tconst row = rows[ri];\n\t\tif (row.length === 0) continue;\n\n\t\t// First cell as bold label\n\t\tconst labelStart = state.text.length;\n\t\tstate.text += row[0].text;\n\t\tif (state.text.length > labelStart) {\n\t\t\tstate.styles.push({\n\t\t\t\tstart: labelStart,\n\t\t\t\tend: state.text.length,\n\t\t\t\tstyle: \"bold\",\n\t\t\t});\n\t\t}\n\t\tstate.text += \"\\n\";\n\n\t\tfor (let ci = 1; ci < row.length; ci++) {\n\t\t\tconst headerText = headers[ci]?.text ?? `Column ${ci}`;\n\t\t\tstate.text += \"• \";\n\t\t\tstate.text += `${headerText}: `;\n\t\t\tstate.text += `${row[ci].text}\\n`;\n\t\t}\n\t}\n}\n\nfunction renderTableAsCode(state: RenderState): void {\n\tif (!state.table) return;\n\n\tconst headers = state.table.headers;\n\tconst rows = state.table.rows;\n\tconst colCount = Math.max(headers.length, ...rows.map((r) => r.length));\n\tif (colCount === 0) return;\n\n\tconst widths = Array.from({ length: colCount }, () => 0);\n\tconst updateWidths = (cells: TableCellIR[]) => {\n\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\twidths[i] = Math.max(widths[i], cells[i]?.text.length ?? 0);\n\t\t}\n\t};\n\tupdateWidths(headers);\n\tfor (const row of rows) updateWidths(row);\n\n\tconst codeStart = state.text.length;\n\n\tconst appendRow = (cells: TableCellIR[]) => {\n\t\tstate.text += \"|\";\n\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\tstate.text += \" \";\n\t\t\tconst cell = cells[i];\n\t\t\tstate.text += cell ? cell.text : \"\";\n\t\t\tconst pad = widths[i] - (cell?.text.length ?? 0);\n\t\t\tstate.text += `${\" \".repeat(Math.max(0, pad))} |`;\n\t\t}\n\t\tstate.text += \"\\n\";\n\t};\n\n\tconst appendDivider = () => {\n\t\tstate.text += \"|\";\n\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\tstate.text += ` ${\"-\".repeat(Math.max(3, widths[i]))} |`;\n\t\t}\n\t\tstate.text += \"\\n\";\n\t};\n\n\tappendRow(headers);\n\tappendDivider();\n\tfor (const row of rows) appendRow(row);\n\n\tconst codeEnd = state.text.length;\n\tif (codeEnd > codeStart) {\n\t\tstate.styles.push({ start: codeStart, end: codeEnd, style: \"code_block\" });\n\t}\n}\n\nfunction processTokens(tokens: Token[], state: RenderState): void {\n\tfor (const token of tokens) {\n\t\tswitch (token.type) {\n\t\t\tcase \"inline\":\n\t\t\t\tif (token.children) processTokens(token.children, state);\n\t\t\t\tbreak;\n\n\t\t\tcase \"text\":\n\t\t\t\tappendText(state, token.content ?? \"\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"em_open\":\n\t\t\t\topenStyle(state, \"italic\");\n\t\t\t\tbreak;\n\t\t\tcase \"em_close\":\n\t\t\t\tcloseStyle(state, \"italic\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"strong_open\":\n\t\t\t\topenStyle(state, \"bold\");\n\t\t\t\tbreak;\n\t\t\tcase \"strong_close\":\n\t\t\t\tcloseStyle(state, \"bold\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"s_open\":\n\t\t\t\topenStyle(state, \"strikethrough\");\n\t\t\t\tbreak;\n\t\t\tcase \"s_close\":\n\t\t\t\tcloseStyle(state, \"strikethrough\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"spoiler_open\":\n\t\t\t\tif (state.spoilerEnabled) openStyle(state, \"spoiler\");\n\t\t\t\tbreak;\n\t\t\tcase \"spoiler_close\":\n\t\t\t\tif (state.spoilerEnabled) closeStyle(state, \"spoiler\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"code_inline\": {\n\t\t\t\tconst content = token.content ?? \"\";\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\tconst start = target.text.length;\n\t\t\t\ttarget.text += content;\n\t\t\t\ttarget.styles.push({\n\t\t\t\t\tstart,\n\t\t\t\t\tend: start + content.length,\n\t\t\t\t\tstyle: \"code\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"link_open\": {\n\t\t\t\tconst href = getAttr(token, \"href\") ?? \"\";\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\ttarget.linkStack.push({ href, labelStart: target.text.length });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"link_close\": {\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\tconst link = target.linkStack.pop();\n\t\t\t\tif (link?.href) {\n\t\t\t\t\tconst href = link.href.trim();\n\t\t\t\t\tif (href) {\n\t\t\t\t\t\ttarget.links.push({\n\t\t\t\t\t\t\tstart: link.labelStart,\n\t\t\t\t\t\t\tend: target.text.length,\n\t\t\t\t\t\t\thref,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"image\":\n\t\t\t\tappendText(state, token.content ?? \"\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"softbreak\":\n\t\t\tcase \"hardbreak\":\n\t\t\t\tappendText(state, \"\\n\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"paragraph_close\": {\n\t\t\t\tif (state.listStack.length === 0 && !state.table) {\n\t\t\t\t\tstate.text += \"\\n\\n\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"heading_open\":\n\t\t\t\tif (state.headingStyle === \"bold\") openStyle(state, \"bold\");\n\t\t\t\tbreak;\n\t\t\tcase \"heading_close\":\n\t\t\t\tif (state.headingStyle === \"bold\") closeStyle(state, \"bold\");\n\t\t\t\tif (state.listStack.length === 0 && !state.table) state.text += \"\\n\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"blockquote_open\":\n\t\t\t\tif (state.blockquotePrefix) state.text += state.blockquotePrefix;\n\t\t\t\topenStyle(state, \"blockquote\");\n\t\t\t\tbreak;\n\t\t\tcase \"blockquote_close\":\n\t\t\t\tcloseStyle(state, \"blockquote\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"bullet_list_open\":\n\t\t\t\tif (state.listStack.length > 0) state.text += \"\\n\";\n\t\t\t\tstate.listStack.push({ type: \"bullet\", index: 0 });\n\t\t\t\tbreak;\n\t\t\tcase \"bullet_list_close\":\n\t\t\t\tstate.listStack.pop();\n\t\t\t\tif (state.listStack.length === 0) state.text += \"\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"ordered_list_open\": {\n\t\t\t\tif (state.listStack.length > 0) state.text += \"\\n\";\n\t\t\t\tconst start = Number(getAttr(token, \"start\") ?? \"1\");\n\t\t\t\tstate.listStack.push({ type: \"ordered\", index: start - 1 });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"ordered_list_close\":\n\t\t\t\tstate.listStack.pop();\n\t\t\t\tif (state.listStack.length === 0) state.text += \"\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"list_item_open\": {\n\t\t\t\tconst top = state.listStack[state.listStack.length - 1];\n\t\t\t\tif (top) {\n\t\t\t\t\ttop.index++;\n\t\t\t\t\tconst indent = \" \".repeat(Math.max(0, state.listStack.length - 1));\n\t\t\t\t\tconst prefix = top.type === \"ordered\" ? `${top.index}. ` : \"• \";\n\t\t\t\t\tstate.text += `${indent}${prefix}`;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"list_item_close\":\n\t\t\t\tif (!state.text.endsWith(\"\\n\")) state.text += \"\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"code_block\":\n\t\t\tcase \"fence\": {\n\t\t\t\tlet code = token.content ?? \"\";\n\t\t\t\tif (!code.endsWith(\"\\n\")) code += \"\\n\";\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\tconst start = target.text.length;\n\t\t\t\ttarget.text += code;\n\t\t\t\ttarget.styles.push({\n\t\t\t\t\tstart,\n\t\t\t\t\tend: start + code.length,\n\t\t\t\t\tstyle: \"code_block\",\n\t\t\t\t});\n\t\t\t\tif (state.listStack.length === 0) target.text += \"\\n\";\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"html_block\":\n\t\t\tcase \"html_inline\":\n\t\t\t\tappendText(state, token.content ?? \"\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"table_open\":\n\t\t\t\tif (state.tableMode !== \"off\") {\n\t\t\t\t\tstate.table = {\n\t\t\t\t\t\theaders: [],\n\t\t\t\t\t\trows: [],\n\t\t\t\t\t\tcurrentRow: [],\n\t\t\t\t\t\tcurrentCell: null,\n\t\t\t\t\t\tinHeader: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"table_close\":\n\t\t\t\tif (state.table) {\n\t\t\t\t\tif (state.tableMode === \"bullets\") renderTableAsBullets(state);\n\t\t\t\t\telse if (state.tableMode === \"code\") renderTableAsCode(state);\n\t\t\t\t}\n\t\t\t\tstate.table = null;\n\t\t\t\tbreak;\n\n\t\t\tcase \"thead_open\":\n\t\t\t\tif (state.table) state.table.inHeader = true;\n\t\t\t\tbreak;\n\t\t\tcase \"thead_close\":\n\t\t\t\tif (state.table) state.table.inHeader = false;\n\t\t\t\tbreak;\n\n\t\t\tcase \"tbody_open\":\n\t\t\tcase \"tbody_close\":\n\t\t\t\tbreak;\n\n\t\t\tcase \"tr_open\":\n\t\t\t\tif (state.table) state.table.currentRow = [];\n\t\t\t\tbreak;\n\t\t\tcase \"tr_close\":\n\t\t\t\tif (state.table) {\n\t\t\t\t\tif (state.table.inHeader) {\n\t\t\t\t\t\tstate.table.headers = state.table.currentRow;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate.table.rows.push(state.table.currentRow);\n\t\t\t\t\t}\n\t\t\t\t\tstate.table.currentRow = [];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"th_open\":\n\t\t\tcase \"td_open\":\n\t\t\t\tif (state.table) state.table.currentCell = initCellState();\n\t\t\t\tbreak;\n\t\t\tcase \"th_close\":\n\t\t\tcase \"td_close\":\n\t\t\t\tif (state.table?.currentCell) {\n\t\t\t\t\tstate.table.currentRow.push(finishCell(state.table.currentCell));\n\t\t\t\t\tstate.table.currentCell = null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"hr\":\n\t\t\t\tstate.text += \"───\\n\\n\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tif (token.children) processTokens(token.children, state);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction markdownToIR(\n\tmarkdown: string,\n\toptions: {\n\t\tlinkify?: boolean;\n\t\tenableSpoilers?: boolean;\n\t\theadingStyle?: \"none\" | \"bold\";\n\t\tblockquotePrefix?: string;\n\t\ttableMode?: \"off\" | \"bullets\" | \"code\";\n\t} = {},\n): MarkdownIR {\n\tconst md = createMarkdownIt();\n\n\tconst env = { listStack: [] as ListEntry[] };\n\tconst tokens = md.parse(markdown ?? \"\", env);\n\n\tconst state: RenderState = {\n\t\ttext: \"\",\n\t\tstyles: [],\n\t\topenStyles: [],\n\t\tlinks: [],\n\t\tlinkStack: [],\n\t\tlistStack: [],\n\t\theadingStyle: options.headingStyle ?? \"none\",\n\t\tblockquotePrefix: options.blockquotePrefix ?? \"\",\n\t\ttable: null,\n\t\ttableMode: options.tableMode ?? \"code\",\n\t\tspoilerEnabled: options.enableSpoilers ?? true,\n\t};\n\n\tprocessTokens(tokens as Token[], state);\n\tcloseRemainingStyles(resolveTarget(state));\n\n\tconst trimmedLen = state.text.trimEnd().length;\n\tlet codeBlockEnd = 0;\n\tfor (const span of state.styles) {\n\t\tif (span.style !== \"code_block\") continue;\n\t\tif (span.end > codeBlockEnd) codeBlockEnd = span.end;\n\t}\n\tconst finalLen = Math.max(trimmedLen, codeBlockEnd);\n\n\treturn {\n\t\ttext: finalLen === state.text.length ? state.text : state.text.slice(0, finalLen),\n\t\tstyles: mergeStyleSpans(clampStyleSpans(state.styles, finalLen)),\n\t\tlinks: clampLinkSpans(state.links, finalLen),\n\t};\n}\n\nfunction clampStyleSpans(spans: StyleSpan[], maxLen: number): StyleSpan[] {\n\treturn spans\n\t\t.map((s) => ({\n\t\t\t...s,\n\t\t\tstart: Math.max(0, Math.min(s.start, maxLen)),\n\t\t\tend: Math.max(0, Math.min(s.end, maxLen)),\n\t\t}))\n\t\t.filter((s) => s.end > s.start);\n}\n\nfunction clampLinkSpans(spans: LinkSpan[], maxLen: number): LinkSpan[] {\n\treturn spans\n\t\t.map((s) => ({\n\t\t\t...s,\n\t\t\tstart: Math.max(0, Math.min(s.start, maxLen)),\n\t\t\tend: Math.max(0, Math.min(s.end, maxLen)),\n\t\t}))\n\t\t.filter((s) => s.end > s.start);\n}\n\nfunction mergeStyleSpans(spans: StyleSpan[]): StyleSpan[] {\n\tif (spans.length === 0) return [];\n\tconst sorted = [...spans].sort((a, b) => {\n\t\tif (a.start !== b.start) return a.start - b.start;\n\t\tif (a.end !== b.end) return b.end - a.end;\n\t\treturn a.style.localeCompare(b.style);\n\t});\n\tconst merged: StyleSpan[] = [];\n\tfor (const s of sorted) {\n\t\tconst prev = merged[merged.length - 1];\n\t\tif (\n\t\t\tprev &&\n\t\t\tprev.style === s.style &&\n\t\t\t(s.start < prev.end || (s.start === prev.end && s.style !== \"blockquote\"))\n\t\t) {\n\t\t\tprev.end = Math.max(prev.end, s.end);\n\t\t\tcontinue;\n\t\t}\n\t\tmerged.push({ ...s });\n\t}\n\treturn merged;\n}\n\n// ─── IR → Telegram HTML rendering ───────────────────────────────────────────\n\nconst STYLE_RANK = new Map<StyleSpan[\"style\"], number>([\n\t[\"blockquote\", 0],\n\t[\"code_block\", 1],\n\t[\"code\", 2],\n\t[\"bold\", 3],\n\t[\"italic\", 4],\n\t[\"strikethrough\", 5],\n\t[\"spoiler\", 6],\n]);\n\nfunction sortStyleSpans(spans: StyleSpan[]): StyleSpan[] {\n\treturn [...spans].sort((a, b) => {\n\t\tif (a.start !== b.start) return a.start - b.start;\n\t\tif (a.end !== b.end) return b.end - a.end;\n\t\treturn (STYLE_RANK.get(a.style) ?? 0) - (STYLE_RANK.get(b.style) ?? 0);\n\t});\n}\n\ninterface RenderLinkResult {\n\tstart: number;\n\tend: number;\n\topen: string;\n\tclose: string;\n}\n\nfunction renderMarkdownWithMarkers(\n\tir: MarkdownIR,\n\toptions: {\n\t\tstyleMarkers: Record<string, { open: string; close: string }>;\n\t\tescapeText: (text: string) => string;\n\t\tbuildLink?: (link: LinkSpan, text: string) => RenderLinkResult | null;\n\t},\n): string {\n\tconst { escapeText: escFn, styleMarkers: markers, buildLink } = options;\n\tconst content = ir.text;\n\tif (!content) return \"\";\n\n\tconst styled = sortStyleSpans(ir.styles.filter((s) => Boolean(markers[s.style])));\n\n\tconst boundaries = new Set<number>();\n\tboundaries.add(0);\n\tboundaries.add(content.length);\n\n\tconst startsAt = new Map<number, StyleSpan[]>();\n\tfor (const span of styled) {\n\t\tif (span.start === span.end) continue;\n\t\tboundaries.add(span.start);\n\t\tboundaries.add(span.end);\n\t\tconst bucket = startsAt.get(span.start);\n\t\tif (bucket) bucket.push(span);\n\t\telse startsAt.set(span.start, [span]);\n\t}\n\n\tfor (const spans of startsAt.values()) {\n\t\tspans.sort((a, b) => {\n\t\t\tif (a.end !== b.end) return b.end - a.end;\n\t\t\treturn (STYLE_RANK.get(a.style) ?? 0) - (STYLE_RANK.get(b.style) ?? 0);\n\t\t});\n\t}\n\n\tconst linkStarts = new Map<number, RenderLinkResult[]>();\n\tif (buildLink) {\n\t\tfor (const link of ir.links) {\n\t\t\tif (link.start === link.end) continue;\n\t\t\tconst rendered = buildLink(link, content);\n\t\t\tif (!rendered) continue;\n\t\t\tboundaries.add(rendered.start);\n\t\t\tboundaries.add(rendered.end);\n\t\t\tconst bucket = linkStarts.get(rendered.start);\n\t\t\tif (bucket) bucket.push(rendered);\n\t\t\telse linkStarts.set(rendered.start, [rendered]);\n\t\t}\n\t}\n\n\tconst points = [...boundaries].sort((a, b) => a - b);\n\tconst stack: { close: string; end: number }[] = [];\n\tlet out = \"\";\n\n\tfor (let i = 0; i < points.length; i++) {\n\t\tconst pos = points[i];\n\n\t\twhile (stack.length && stack[stack.length - 1]?.end === pos) {\n\t\t\tconst item = stack.pop();\n\t\t\tif (item) out += item.close;\n\t\t}\n\n\t\tconst openingItems: {\n\t\t\tend: number;\n\t\t\topen: string;\n\t\t\tclose: string;\n\t\t\tkind: \"link\" | \"style\";\n\t\t\tstyle?: StyleSpan[\"style\"];\n\t\t\tindex: number;\n\t\t}[] = [];\n\n\t\tconst openingLinks = linkStarts.get(pos);\n\t\tif (openingLinks) {\n\t\t\tfor (let idx = 0; idx < openingLinks.length; idx++) {\n\t\t\t\tconst l = openingLinks[idx];\n\t\t\t\topeningItems.push({\n\t\t\t\t\tend: l.end,\n\t\t\t\t\topen: l.open,\n\t\t\t\t\tclose: l.close,\n\t\t\t\t\tkind: \"link\",\n\t\t\t\t\tindex: idx,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst openingStyles = startsAt.get(pos);\n\t\tif (openingStyles) {\n\t\t\tfor (let idx = 0; idx < openingStyles.length; idx++) {\n\t\t\t\tconst span = openingStyles[idx];\n\t\t\t\tconst marker = markers[span.style];\n\t\t\t\tif (!marker) continue;\n\t\t\t\topeningItems.push({\n\t\t\t\t\tend: span.end,\n\t\t\t\t\topen: marker.open,\n\t\t\t\t\tclose: marker.close,\n\t\t\t\t\tkind: \"style\",\n\t\t\t\t\tstyle: span.style,\n\t\t\t\t\tindex: idx,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (openingItems.length > 0) {\n\t\t\topeningItems.sort((a, b) => {\n\t\t\t\tif (a.end !== b.end) return b.end - a.end;\n\t\t\t\tif (a.kind !== b.kind) return a.kind === \"link\" ? -1 : 1;\n\t\t\t\tif (a.kind === \"style\" && b.kind === \"style\") {\n\t\t\t\t\treturn (STYLE_RANK.get(a.style ?? \"bold\") ?? 0) - (STYLE_RANK.get(b.style ?? \"bold\") ?? 0);\n\t\t\t\t}\n\t\t\t\treturn a.index - b.index;\n\t\t\t});\n\t\t\tfor (const item of openingItems) {\n\t\t\t\tout += item.open;\n\t\t\t\tstack.push({ close: item.close, end: item.end });\n\t\t\t}\n\t\t}\n\n\t\tconst next = points[i + 1];\n\t\tif (next === undefined) break;\n\t\tif (next > pos) out += escFn(content.slice(pos, next));\n\t}\n\n\treturn out;\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nconst TELEGRAM_STYLE_MARKERS: Record<string, { open: string; close: string }> = {\n\tbold: { open: \"<b>\", close: \"</b>\" },\n\titalic: { open: \"<i>\", close: \"</i>\" },\n\tstrikethrough: { open: \"<s>\", close: \"</s>\" },\n\tcode: { open: \"<code>\", close: \"</code>\" },\n\tcode_block: { open: \"<pre><code>\", close: \"</code></pre>\" },\n\tspoiler: { open: \"<tg-spoiler>\", close: \"</tg-spoiler>\" },\n\tblockquote: { open: \"<blockquote>\", close: \"</blockquote>\" },\n};\n\nfunction escapeHtml(text: string): string {\n\treturn text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction escapeHtmlAttr(text: string): string {\n\treturn escapeHtml(text).replace(/\"/g, \""\");\n}\n\nfunction buildTelegramLink(link: LinkSpan, text: string): RenderLinkResult | null {\n\tconst href = link.href.trim();\n\tif (!href || link.start === link.end) return null;\n\treturn {\n\t\tstart: link.start,\n\t\tend: link.end,\n\t\topen: `<a href=\"${escapeHtmlAttr(href)}\">`,\n\t\tclose: \"</a>\",\n\t};\n}\n\nexport function markdownToTelegramHtml(markdown: string): string {\n\tif (!markdown?.trim()) return \"\";\n\n\ttry {\n\t\tconst ir = markdownToIR(markdown, {\n\t\t\tlinkify: true,\n\t\t\tenableSpoilers: true,\n\t\t\theadingStyle: \"none\",\n\t\t\tblockquotePrefix: \"\",\n\t\t\ttableMode: \"code\",\n\t\t});\n\n\t\treturn renderMarkdownWithMarkers(ir, {\n\t\t\tstyleMarkers: TELEGRAM_STYLE_MARKERS,\n\t\t\tescapeText: escapeHtml,\n\t\t\tbuildLink: buildTelegramLink,\n\t\t});\n\t} catch (err) {\n\t\tconsole.error(\"[Telegram Markdown] Conversion failed, falling back to plain text:\", err);\n\t\t// Fallback: escape HTML chars so the raw markdown is at least readable\n\t\treturn escapeHtml(markdown);\n\t}\n}\n","/**\n * Telegram Adapter - Platform adapter for Telegram messaging\n *\n * This adapter handles sending/receiving messages through the Telegram Bot API\n * using the gramjs library.\n */\n\nimport { MessagePlatformAdapter } from \"@melandlabs/integrations-channels\";\nimport type { At, Image, Message, Messages } from \"@melandlabs/integrations-channels\";\nimport type { MessageEvent, MessageTarget } from \"@melandlabs/integrations-channels\";\nimport {\n\ttype DialogInfo,\n\ttype ExtractedMessageInfo,\n\tdelay,\n\tisEmptyMessage,\n\ttimeBeforeHours,\n} from \"@melandlabs/integrations-channels/sources/types\";\nimport type { ContactMeta, TelegramContactMeta } from \"@melandlabs/integrations/contacts\";\nimport { isTelegramContactMeta } from \"@melandlabs/integrations/contacts\";\nimport type { ClientRegistry, FileIngester } from \"@melandlabs/integrations/core\";\nimport type { Attachment } from \"@melandlabs/shared\";\nimport bigInt, { type BigInteger } from \"big-integer\";\nimport { TelegramClient } from \"telegram\";\nimport type { TotalList } from \"telegram/Helpers\";\nimport { CustomFile } from \"telegram/client/uploads\";\nimport type { Entity } from \"telegram/define\";\nimport { StringSession } from \"telegram/sessions\";\nimport { Api } from \"telegram/tl\";\nimport type { Dialog } from \"telegram/tl/custom/dialog\";\nimport { markdownToTelegramHtml } from \"./markdown\";\n\nconst DEBUG = process.env.DEBUG_TELEGRAM === \"true\";\n\nconst maxDialogCount = 50;\nconst maxMessageCount = 200;\nconst DEFAULT_MAX_MESSAGE_CHUNK_COUNT = 40;\nconst FIRST_LANDING_MESSAGE_CHUNK_COUNT = 10;\nconst TELEGRAM_MAX_ATTACHMENT_BYTES = 20 * 1024 * 1024;\nconst dialogCacheFetchLimit = 200;\n\n// Timeout constants for network operations (in ms)\nexport const CONNECT_TIMEOUT_MS = 60_000; // 60 seconds for initial connection\nexport const SEND_MESSAGE_TIMEOUT_MS = 30_000; // 30 seconds for sending a message\n\n/**\n * Wraps a promise with a timeout. If the promise doesn't resolve within the timeout,\n * the promise is rejected with a timeout error.\n */\nexport function withTimeout<T>(promise: Promise<T>, ms: number, operationName: string): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst timer = setTimeout(() => {\n\t\t\treject(new Error(`${operationName} timed out after ${ms}ms`));\n\t\t}, ms);\n\n\t\tpromise\n\t\t\t.then((value) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(value);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\treject(err);\n\t\t\t});\n\t});\n}\n\n// Cache interfaces\ninterface EntityCache {\n\t[id: string]: {\n\t\tentity: Entity;\n\t\ttimestamp: number;\n\t};\n}\n\nexport class TelegramAdapter extends MessagePlatformAdapter {\n\tclient: TelegramClient;\n\tmessages: Messages;\n\tbotId: string;\n\tappId: number;\n\tappHash: string;\n\tsession: StringSession;\n\tname = \"Telegram\";\n\tprivate ownerUserId?: string;\n\tprivate ownerUserType?: string;\n\tprivate fileIngester?: FileIngester;\n\tprivate clientRegistry?: ClientRegistry;\n\n\t// Caches with TTL (1 hour default)\n\tprivate senderCache: EntityCache = {};\n\tprivate chatCache: EntityCache = {};\n\tprivate dialogs: DialogInfo[] = [];\n\tprivate dialogEntityCache: EntityCache = {};\n\tprivate dialogsFetchedAt = 0;\n\tprivate contactMetadata: Record<string, TelegramContactMeta> = {};\n\tprivate cacheTTL = 3600000; // 1 hour in milliseconds\n\n\tprivate botToken?: string;\n\tprivate ownUserId?: BigInteger;\n\n\t// Flag indicating if using shared client from User Listener (should not disconnect when shared)\n\tprivate _isSharedClient = false;\n\n\tprivate asyncIteratorState = {\n\t\tdialogs: [] as TotalList<Dialog>,\n\t\tcurrentDialogIndex: 0,\n\t\tcurrentMessageIndex: 0,\n\t\toffsetDate: 0,\n\t\tisInitialized: false,\n\t};\n\n\tconstructor(opts?: {\n\t\tbotId?: string;\n\t\tbotToken?: string;\n\t\tsession?: string;\n\t\tappId?: number;\n\t\tappHash?: string;\n\t\tcacheTTL?: number;\n\t\townerUserId?: string;\n\t\townerUserType?: string;\n\t\tfileIngester?: FileIngester;\n\t\tclientRegistry?: ClientRegistry;\n\t}) {\n\t\tsuper();\n\t\tthis.session = new StringSession(opts?.session ?? \"\");\n\t\tthis.botId = opts?.botId ?? \"\";\n\t\tthis.appId = opts?.appId ?? Number(process.env.TG_APP_ID ?? \"0\");\n\t\tthis.appHash = opts?.appHash ?? process.env.TG_APP_HASH ?? \"\";\n\n\t\t// Prefer to reuse connected client from User Listener via ClientRegistry, avoid creating multiple MTProto connections for same session\n\t\t// Multiple connections cause session conflicts and disrupt User Listener's real-time event reception\n\t\tconst sessionKey = opts?.session ?? \"\";\n\t\tconst clientRegistry = opts?.clientRegistry;\n\t\tlet sharedClient: TelegramClient | undefined;\n\n\t\tif (!opts?.botToken && sessionKey && clientRegistry) {\n\t\t\tsharedClient = clientRegistry.getClientBySessionKey(sessionKey) as TelegramClient | undefined;\n\t\t}\n\n\t\tif (sharedClient) {\n\t\t\tthis.client = sharedClient;\n\t\t\tthis._isSharedClient = true;\n\t\t\tif (DEBUG)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Bot ${opts?.botId}] [telegram] Reusing existing connection from User Listener to avoid session conflict`,\n\t\t\t\t);\n\t\t} else {\n\t\t\tthis.client = new TelegramClient(this.session, this.appId, this.appHash, {\n\t\t\t\tconnectionRetries: 10,\n\t\t\t\ttimeout: 60,\n\t\t\t\trequestRetries: 5,\n\t\t\t\tfloodSleepThreshold: 60,\n\t\t\t});\n\t\t}\n\n\t\tthis.botToken = opts?.botToken;\n\t\tthis.messages = [];\n\t\tthis.ownerUserId = opts?.ownerUserId;\n\t\tthis.ownerUserType = opts?.ownerUserType;\n\t\tthis.fileIngester = opts?.fileIngester;\n\t\tthis.clientRegistry = clientRegistry;\n\n\t\t// Allow custom cache TTL if provided\n\t\tif (opts?.cacheTTL) {\n\t\t\tthis.cacheTTL = opts.cacheTTL;\n\t\t}\n\t}\n\n\tprimeContactMetadata(contactId: string, metadata?: ContactMeta | null): void {\n\t\tif (!contactId || !metadata) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isTelegramContactMeta(metadata)) {\n\t\t\tthis.contactMetadata[contactId] = {\n\t\t\t\t...metadata,\n\t\t\t\tpeerId: metadata.peerId ?? contactId,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync connect() {\n\t\ttry {\n\t\t\t// Shared client already maintained by User Listener, no need to reconnect\n\t\t\tif (this._isSharedClient) {\n\t\t\t\tif (!this.client.connected) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Shared client disconnected, falling back to independent connection`,\n\t\t\t\t\t);\n\t\t\t\t\tthis._isSharedClient = false;\n\t\t\t\t\tthis.client = new TelegramClient(this.session, this.appId, this.appHash, {\n\t\t\t\t\t\tconnectionRetries: 10,\n\t\t\t\t\t\ttimeout: 60,\n\t\t\t\t\t\trequestRetries: 5,\n\t\t\t\t\t\tfloodSleepThreshold: 60,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!this.client.connected) {\n\t\t\t\tif (this.botToken) {\n\t\t\t\t\tawait this.client.start({\n\t\t\t\t\t\tbotAuthToken: this.botToken,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tawait this.client.start({\n\t\t\t\t\t\tphoneNumber: async () => await this.prompt(\"Please enter your phone number: \"),\n\t\t\t\t\t\tpassword: async () => await this.prompt(\"Please enter your password: \"),\n\t\t\t\t\t\tphoneCode: async () => await this.prompt(\"Please enter the verification code: \"),\n\t\t\t\t\t\tonError: (err) => console.error(`[Bot ${this.botId}] [telegram] Login error:`, err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Telegram connection error:`, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect. If using shared client (from User Listener), skip disconnect\n\t * to avoid disrupting User Listener's persistent connection.\n\t */\n\tasync disconnect(): Promise<undefined> {\n\t\tif (this._isSharedClient) {\n\t\t\tif (DEBUG) console.log(`[Bot ${this.botId}] [telegram] Using shared client, skipping disconnect`);\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.client?.connected) {\n\t\t\tawait this.client.disconnect();\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async prompt(question: string): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst readline = require(\"node:readline\").createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\treadline.question(question, (answer: string) => {\n\t\t\t\treadline.close();\n\t\t\t\tresolve(answer);\n\t\t\t});\n\t\t});\n\t}\n\n\tasync getDialogs(): Promise<DialogInfo[]> {\n\t\tif (!this.client.connected) {\n\t\t\tawait this.client.connect();\n\t\t}\n\t\tawait this.refreshDialogsCache();\n\t\treturn this.dialogs;\n\t}\n\n\tprivate async refreshDialogsCache(force = false): Promise<void> {\n\t\tif (!this.client.connected) {\n\t\t\tawait this.client.connect();\n\t\t}\n\n\t\tconst shouldRefresh =\n\t\t\tforce || this.dialogs.length === 0 || Date.now() - this.dialogsFetchedAt > this.cacheTTL;\n\n\t\tif (!shouldRefresh) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dialogs = await this.client.getDialogs({\n\t\t\tlimit: dialogCacheFetchLimit,\n\t\t});\n\n\t\tconst nextDialogs: DialogInfo[] = [];\n\n\t\tfor (const dialog of dialogs) {\n\t\t\tif (!dialog.id || !dialog.entity) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst idStr = dialog.id.toString();\n\t\t\tconst type =\n\t\t\t\tdialog.isUser === true ? \"private\" : dialog.isChannel || dialog.isGroup ? \"group\" : \"unknown\";\n\t\t\tconst resolvedName =\n\t\t\t\tdialog.name && dialog.name.trim().length > 0 ? dialog.name : this.getChatName(dialog.entity);\n\n\t\t\tconst metadata = this.buildMetadataFromEntity(idStr, dialog.entity);\n\t\t\tnextDialogs.push({\n\t\t\t\tid: idStr,\n\t\t\t\tname: resolvedName,\n\t\t\t\ttype,\n\t\t\t\tmetadata: metadata ?? undefined,\n\t\t\t});\n\n\t\t\tthis.addDialogEntityToCache(idStr, dialog.entity);\n\t\t}\n\n\t\tthis.dialogs = nextDialogs;\n\t\tthis.dialogsFetchedAt = Date.now();\n\t}\n\n\t// Cache management methods\n\tprivate isCacheValid(cacheEntry: { timestamp: number }): boolean {\n\t\treturn Date.now() - cacheEntry.timestamp < this.cacheTTL;\n\t}\n\n\tprivate getFromCache(cache: EntityCache, id: BigInteger): Entity | null {\n\t\tconst idStr = id.toString();\n\t\tconst entry = cache[idStr];\n\t\tif (entry && this.isCacheValid(entry)) {\n\t\t\treturn entry.entity;\n\t\t}\n\t\t// Remove expired entry\n\t\tif (entry) {\n\t\t\tdelete cache[idStr];\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate addToCache(cache: EntityCache, id: BigInteger, entity: Entity): void {\n\t\tcache[id.toString()] = {\n\t\t\tentity,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t}\n\n\tprivate addDialogEntityToCache(id: string, entity: Entity): void {\n\t\tthis.dialogEntityCache[id] = {\n\t\t\tentity,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tthis.registerMetadataFromEntity(id, entity);\n\t}\n\n\tprivate registerMetadataFromEntity(id: string, entity: Entity): void {\n\t\tconst metadata = this.buildMetadataFromEntity(id, entity);\n\t\tif (metadata) {\n\t\t\tthis.contactMetadata[id] = metadata;\n\t\t}\n\t}\n\n\tprivate buildMetadataFromEntity(id: string, entity: Entity): TelegramContactMeta | null {\n\t\tif (entity instanceof Api.User) {\n\t\t\tconst firstName = entity.firstName ?? null;\n\t\t\tconst lastName = entity.lastName ?? null;\n\t\t\tconst displayName =\n\t\t\t\tfirstName && lastName\n\t\t\t\t\t? `${firstName} ${lastName}`.trim()\n\t\t\t\t\t: firstName || lastName || entity.username || null;\n\n\t\t\treturn {\n\t\t\t\tplatform: \"telegram\",\n\t\t\t\tpeerId: id,\n\t\t\t\tpeerType: \"user\",\n\t\t\t\taccessHash: entity.accessHash ? entity.accessHash.toString() : undefined,\n\t\t\t\tusername: entity.username ?? null,\n\t\t\t\tfirstName,\n\t\t\t\tlastName,\n\t\t\t\tdisplayName,\n\t\t\t};\n\t\t}\n\n\t\tif (entity instanceof Api.Channel) {\n\t\t\treturn {\n\t\t\t\tplatform: \"telegram\",\n\t\t\t\tpeerId: id,\n\t\t\t\tpeerType: \"channel\",\n\t\t\t\taccessHash: entity.accessHash ? entity.accessHash.toString() : undefined,\n\t\t\t\tusername: entity.username ?? null,\n\t\t\t\tdisplayName: entity.title || null,\n\t\t\t};\n\t\t}\n\n\t\tif (entity instanceof Api.Chat) {\n\t\t\treturn {\n\t\t\t\tplatform: \"telegram\",\n\t\t\t\tpeerId: id,\n\t\t\t\tpeerType: \"chat\",\n\t\t\t\tdisplayName: entity.title || null,\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Convert peer to input peer for API calls\n\tprivate peerToInputPeer(peer: Api.TypePeer): Api.TypeInputPeer {\n\t\tif (peer instanceof Api.PeerUser) {\n\t\t\treturn new Api.InputPeerUser({\n\t\t\t\tuserId: peer.userId,\n\t\t\t\taccessHash: bigInt(0),\n\t\t\t});\n\t\t}\n\t\tif (peer instanceof Api.PeerChat) {\n\t\t\treturn new Api.InputPeerChat({ chatId: peer.chatId });\n\t\t}\n\t\tif (peer instanceof Api.PeerChannel) {\n\t\t\treturn new Api.InputPeerChannel({\n\t\t\t\tchannelId: peer.channelId,\n\t\t\t\taccessHash: bigInt(0), // Use BigInt literal instead\n\t\t\t});\n\t\t}\n\t\treturn new Api.InputPeerEmpty();\n\t}\n\n\t// Get entity with caching\n\tprivate async getEntityWithCache(\n\t\tcache: EntityCache,\n\t\tentityId: BigInteger | Api.TypePeer, // Use native bigint type\n\t): Promise<Entity | null> {\n\t\t// Convert to appropriate input peer type\n\t\tlet inputPeer: Api.TypeInputPeer;\n\t\tlet id: BigInteger;\n\n\t\tif (entityId instanceof Api.PeerUser) {\n\t\t\tid = entityId.userId;\n\t\t\tinputPeer = this.peerToInputPeer(entityId);\n\t\t} else if (entityId instanceof Api.PeerChat) {\n\t\t\tid = entityId.chatId;\n\t\t\tinputPeer = this.peerToInputPeer(entityId);\n\t\t} else if (entityId instanceof Api.PeerChannel) {\n\t\t\tid = entityId.channelId;\n\t\t\tinputPeer = this.peerToInputPeer(entityId);\n\t\t} else if (\n\t\t\tentityId instanceof Api.InputPeerUser ||\n\t\t\tentityId instanceof Api.InputPeerChat ||\n\t\t\tentityId instanceof Api.InputPeerChannel\n\t\t) {\n\t\t\t// Handle existing input peers\n\t\t\tif (entityId instanceof Api.InputPeerUser) {\n\t\t\t\tid = entityId.userId;\n\t\t\t} else if (entityId instanceof Api.InputPeerChat) {\n\t\t\t\tid = entityId.chatId;\n\t\t\t} else {\n\t\t\t\tid = entityId.channelId;\n\t\t\t}\n\t\t\tinputPeer = entityId;\n\t\t} else {\n\t\t\tid = entityId;\n\t\t\tconst entity = await this.client.getEntity(entityId);\n\t\t\tthis.addToCache(cache, id, entity);\n\t\t\treturn entity;\n\t\t}\n\n\t\t// Check cache first\n\t\tconst cachedEntity = this.getFromCache(cache, id);\n\t\tif (cachedEntity) {\n\t\t\treturn cachedEntity;\n\t\t}\n\n\t\t// Fetch from API if not in cache\n\t\ttry {\n\t\t\tconst entity = await this.client.getEntity(inputPeer);\n\t\t\tthis.addToCache(cache, id, entity);\n\t\t\treturn entity;\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Error fetching entity ${id}:`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync sendMessage(target: MessageTarget, id: string, message: string): Promise<void> {\n\t\tawait this.sendMessages(target, id, [message as unknown as Message]);\n\t}\n\n\t/**\n\t * Reply to a message\n\t * @param event - Source message event\n\t * @param messages - Message chain to send as reply\n\t * @param quoteOrigin - Whether to quote the original message (default: false)\n\t */\n\tasync sendMessages(target: MessageTarget, id: string, messages: Messages): Promise<void> {\n\t\tawait this.runWithAdapterError(\"sendMessages\", async () => {\n\t\t\tif (!this.client.connected) {\n\t\t\t\tawait withTimeout(\n\t\t\t\t\tthis.client.connect(),\n\t\t\t\t\tCONNECT_TIMEOUT_MS,\n\t\t\t\t\t`[Bot ${this.botId}] Telegram client.connect()`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (messages.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { textParts, images, unsupported } = this.partitionMessages(messages);\n\t\t\tif (unsupported.length > 0) {\n\t\t\t\tthrow this.createAdapterError(\n\t\t\t\t\t\"sendMessages\",\n\t\t\t\t\t\"invalid_request_error\",\n\t\t\t\t\t`Telegram send does not support message content: ${unsupported.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait this.dispatchMessages(\"sendMessages\", id, textParts, images);\n\t\t});\n\t}\n\n\tasync replyMessages(event: MessageEvent, messages: Messages, quoteOrigin = false): Promise<void> {\n\t\tawait this.runWithAdapterError(\"replyMessages\", async () => {\n\t\t\tif (!this.client.connected) {\n\t\t\t\tawait withTimeout(\n\t\t\t\t\tthis.client.connect(),\n\t\t\t\t\tCONNECT_TIMEOUT_MS,\n\t\t\t\t\t`[Bot ${this.botId}] Telegram client.connect()`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (messages.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst id = event.targetType === \"group\" ? event.sender.group.id : event.sender.id;\n\t\t\tconst { textParts, images, unsupported } = this.partitionMessages(messages);\n\t\t\tif (unsupported.length > 0) {\n\t\t\t\tthrow this.createAdapterError(\n\t\t\t\t\t\"replyMessages\",\n\t\t\t\t\t\"invalid_request_error\",\n\t\t\t\t\t`Telegram reply does not support message content: ${unsupported.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait this.dispatchMessages(\"replyMessages\", id.toString(), textParts, images);\n\t\t});\n\t}\n\n\tasync getChatsByChunk(\n\t\tsince: number,\n\t\tchunkSize?: number,\n\t): Promise<{\n\t\tmessages: ExtractedMessageInfo[];\n\t\thasMore: boolean;\n\t}> {\n\t\t// Use passed chunkSize or default value\n\t\tconst maxMessageChunkCount = chunkSize ?? DEFAULT_MAX_MESSAGE_CHUNK_COUNT;\n\t\t// 1. Ensure client is connected\n\t\tif (!this.client.connected) {\n\t\t\tif (DEBUG) console.log(\"[Telegram] Client not connected, connecting...\");\n\t\t\tawait this.client.connect();\n\t\t\tawait delay(500);\n\t\t}\n\n\t\tconst extractedMessages: ExtractedMessageInfo[] = [];\n\t\t// 2. Initialize on first call: load dialogs + set state (avoid duplicate initialization)\n\t\tif (!this.asyncIteratorState.isInitialized) {\n\t\t\t// Load all valid dialogs (filter out invalid entries without entity/ID)\n\t\t\tconst allDialogs = await this.client.getDialogs();\n\t\t\tthis.asyncIteratorState.dialogs = allDialogs.filter((dialog) => dialog.entity && dialog.id);\n\t\t\t// Reset traversal starting point (first dialog, first message on first call)\n\t\t\tthis.asyncIteratorState.currentDialogIndex = 0;\n\t\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\t\t\t// Mark as initialized (avoid reloading dialogs on next call)\n\t\t\tthis.asyncIteratorState.isInitialized = true;\n\t\t\tthis.asyncIteratorState.offsetDate = since;\n\n\t\t\tif (DEBUG)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Bot ${this.botId}] [telegram] Batch fetch initialization complete: ${this.asyncIteratorState.dialogs.length} valid dialogs`,\n\t\t\t\t);\n\t\t\tif (this.asyncIteratorState.dialogs.length === 0) {\n\t\t\t\tif (DEBUG) console.log(`[Bot ${this.botId}] No valid dialogs to process`);\n\t\t\t\tthis.asyncIteratorState.isInitialized = false;\n\t\t\t\tthis.asyncIteratorState.currentDialogIndex = 0;\n\t\t\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\t\t\t\treturn { messages: extractedMessages, hasMore: false };\n\t\t\t}\n\t\t}\n\n\t\tlet { currentDialogIndex, currentMessageIndex, offsetDate } = this.asyncIteratorState;\n\n\t\tconst targetDialogs = this.asyncIteratorState.dialogs;\n\n\t\tconst MIN_MESSAGES_PER_DIALOG = 5;\n\t\tconst REQUEST_DELAY_MS = 150; // Delay between requests to avoid triggering Telegram rate limits\n\n\t\tfor (let dialogIdx = currentDialogIndex; dialogIdx < targetDialogs.length; dialogIdx++) {\n\t\t\tconst dialog = targetDialogs[dialogIdx];\n\t\t\ttry {\n\t\t\t\tif (!this.client.connected) {\n\t\t\t\t\tif (DEBUG) console.log(\"[Telegram] Client not connected, connecting...\");\n\t\t\t\t\tawait this.client.connect();\n\t\t\t\t\tawait delay(500);\n\t\t\t\t}\n\n\t\t\t\t// Add request delay (except for first request)\n\t\t\t\tif (dialogIdx > currentDialogIndex) {\n\t\t\t\t\tawait delay(REQUEST_DELAY_MS);\n\t\t\t\t}\n\n\t\t\t\t// 4. Get all messages from current dialog that meet time criteria (no API offset, fetch all at once)\n\t\t\t\tconst rawMessages = await this.client.getMessages(dialog.id, {\n\t\t\t\t\toffsetDate: offsetDate,\n\t\t\t\t\treverse: true,\n\t\t\t\t});\n\t\t\t\tif (DEBUG)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${rawMessages.length} messages in the dialog id ${dialog.id}`,\n\t\t\t\t\t);\n\n\t\t\t\tif (rawMessages.length === 0 && dialogIdx >= 10) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// 5. Process starting from current message index (avoid reprocessing extracted messages)\n\t\t\t\tconst startMsgIdx = currentMessageIndex;\n\t\t\t\tlet dialogMessageCount = 0; // Track messages from this dialog\n\n\t\t\t\tfor (let msgIdx = startMsgIdx; msgIdx < rawMessages.length; msgIdx++) {\n\t\t\t\t\tconst rawMsg = rawMessages[msgIdx];\n\t\t\t\t\t// Only process Api.Message type (filter non-message type updates)\n\t\t\t\t\tif (!(rawMsg instanceof Api.Message)) continue;\n\t\t\t\t\t// Extract message details (reuse existing logic)\n\t\t\t\t\tconst extractedInfo = await this.extractMessageInfo(rawMsg);\n\t\t\t\t\tif (extractedInfo && !isEmptyMessage(extractedInfo)) {\n\t\t\t\t\t\textractedMessages.push(extractedInfo);\n\t\t\t\t\t\tdialogMessageCount++;\n\t\t\t\t\t\t// 6. Stop immediately if current batch reaches 40, save current position\n\t\t\t\t\t\tif (extractedMessages.length >= maxMessageChunkCount) {\n\t\t\t\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx; // Continue from current dialog next time\n\t\t\t\t\t\t\tthis.asyncIteratorState.currentMessageIndex = msgIdx + 1; // Start from next message next time\n\t\t\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t`[Bot ${this.botId}] Batch full (${maxMessageChunkCount}), continue from dialog ${dialog.id} message ${msgIdx + 1}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tmessages: extractedMessages,\n\t\t\t\t\t\t\t\thasMore: true,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If fewer than MIN_MESSAGES_PER_DIALOG messages fetched from this dialog, try fetching more history\n\t\t\t\t// If 0 messages fetched initially, no need to fetch more\n\t\t\t\tif (dialogMessageCount < MIN_MESSAGES_PER_DIALOG && rawMessages.length > 0) {\n\t\t\t\t\tconst neededCount = MIN_MESSAGES_PER_DIALOG - dialogMessageCount;\n\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Dialog ${dialog.id} has only ${dialogMessageCount} messages, fetching ${neededCount} more without time filter`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// Add delay to avoid triggering rate limit\n\t\t\t\t\tawait delay(REQUEST_DELAY_MS);\n\n\t\t\t\t\t// Fetch more messages without time filter\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst additionalMessages = await this.client.getMessages(dialog.id, {\n\t\t\t\t\t\t\tlimit: neededCount,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Process additional messages\n\t\t\t\t\t\tfor (const rawMsg of additionalMessages) {\n\t\t\t\t\t\t\tif (!(rawMsg instanceof Api.Message)) continue;\n\t\t\t\t\t\t\tconst extractedInfo = await this.extractMessageInfo(rawMsg);\n\t\t\t\t\t\t\tif (extractedInfo && !isEmptyMessage(extractedInfo)) {\n\t\t\t\t\t\t\t\textractedMessages.push(extractedInfo);\n\t\t\t\t\t\t\t\tdialogMessageCount++;\n\t\t\t\t\t\t\t\tif (extractedMessages.length >= maxMessageChunkCount) {\n\t\t\t\t\t\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx;\n\t\t\t\t\t\t\t\t\tthis.asyncIteratorState.currentMessageIndex = rawMessages.length;\n\t\t\t\t\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\t\t`[Bot ${this.botId}] Batch full (${maxMessageChunkCount}), continue from dialog ${dialog.id}`,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tmessages: extractedMessages,\n\t\t\t\t\t\t\t\t\t\thasMore: true,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${additionalMessages.length} additional messages for dialog ${dialog.id}, total: ${dialogMessageCount}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Failed to fetch additional messages for dialog ${dialog.id}:`,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcurrentMessageIndex = 0;\n\t\t\t\tthis.asyncIteratorState.currentMessageIndex = 0; // Next dialog starts from message 0\n\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx + 1; // Next time start from next dialog\n\t\t\t} catch (error) {\n\t\t\t\t// Single dialog processing failed: skip this dialog, avoid affecting overall traversal\n\t\t\t\tconsole.error(`[Bot ${this.botId}] Failed to process dialog ${dialog.id}:`, error);\n\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx + 1; // Skip current dialog next time\n\t\t\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (DEBUG)\n\t\t\tconsole.log(\n\t\t\t\t`[Bot ${this.botId}] All dialogs processed, returning remaining ${extractedMessages.length} messages`,\n\t\t\t);\n\t\tthis.asyncIteratorState.isInitialized = false; // Mark as uninitialized, reload on next call\n\t\tthis.asyncIteratorState.currentDialogIndex = 0;\n\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\n\t\treturn {\n\t\t\tmessages: extractedMessages,\n\t\t\thasMore: false,\n\t\t};\n\t}\n\n\tasync getChatsByChunkHours(hours = 8): Promise<{\n\t\tmessages: ExtractedMessageInfo[];\n\t\thasMore: boolean;\n\t}> {\n\t\treturn this.getChatsByChunk(timeBeforeHours(hours));\n\t}\n\n\tasync getChatsByTime(cutoffDate: number): Promise<ExtractedMessageInfo[]> {\n\t\tif (!this.client.connected) {\n\t\t\tawait this.client.connect();\n\t\t}\n\n\t\tconst extractedMessages: ExtractedMessageInfo[] = [];\n\t\tconst dialogs = await this.client.getDialogs({});\n\n\t\tif (DEBUG) console.log(`[Bot ${this.botId}] [telegram] Fetched ${dialogs.length} dialogs`);\n\n\t\tlet dialogIndex = 0;\n\t\tconst REQUEST_DELAY_MS = 150; // Delay between each request\n\n\t\tfor (const dialog of dialogs) {\n\t\t\tif (!dialog.entity || !dialog.id) {\n\t\t\t\tdialogIndex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cache the dialog entity\n\t\t\tthis.addToCache(this.chatCache, dialog.id, dialog.entity);\n\n\t\t\t// Add delay (except for first request)\n\t\t\tif (dialogIndex > 0) {\n\t\t\t\tawait delay(REQUEST_DELAY_MS);\n\t\t\t}\n\n\t\t\tconst messages = await this.client.getMessages(dialog.id, {\n\t\t\t\toffsetDate: cutoffDate,\n\t\t\t\treverse: true,\n\t\t\t});\n\n\t\t\tif (DEBUG)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${messages.length} messages in the dialog id ${dialog.id}`,\n\t\t\t\t);\n\n\t\t\t// No more latest messages before the cutoffDate.\n\t\t\t// TODO: fix the hardcode pinned message group 10\n\t\t\tif ((messages.length === 0 && dialogIndex >= 10) || dialogIndex >= maxDialogCount) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdialogIndex += 1;\n\n\t\t\tlet msgIndex = 0;\n\t\t\tfor (const msg of messages) {\n\t\t\t\tif (msgIndex >= maxMessageCount) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (msg instanceof Api.Message) {\n\t\t\t\t\tmsgIndex += 1;\n\t\t\t\t\tconst extractedInfo = await this.extractMessageInfo(msg);\n\t\t\t\t\tif (extractedInfo && !isEmptyMessage(extractedInfo)) {\n\t\t\t\t\t\textractedMessages.push(extractedInfo);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (DEBUG)\n\t\t\tconsole.log(\n\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${extractedMessages.length} total messages (capped at ${maxMessageCount})`,\n\t\t\t);\n\t\treturn extractedMessages;\n\t}\n\n\tasync getChatsByDays(days = 1): Promise<ExtractedMessageInfo[]> {\n\t\tconst cutoffDate = Math.floor((Date.now() - days * 24 * 60 * 60 * 1000) / 1000);\n\t\treturn await this.getChatsByTime(cutoffDate);\n\t}\n\n\tasync getChatsByHours(hours = 1): Promise<ExtractedMessageInfo[]> {\n\t\tconst cutoffDate = Math.floor((Date.now() - hours * 60 * 60 * 1000) / 1000);\n\t\treturn await this.getChatsByTime(cutoffDate);\n\t}\n\n\t// Extract detailed information from a message with caching\n\tprivate async extractMessageInfo(\n\t\tmessage: Api.Message,\n\t\tdepth = 0,\n\t\tmaxDepth = 1,\n\t): Promise<ExtractedMessageInfo | null> {\n\t\ttry {\n\t\t\t// Get chat information with caching\n\t\t\tconst chat =\n\t\t\t\t(await this.getEntityWithCache(this.chatCache, message.peerId)) ??\n\t\t\t\t(await this.client.getEntity(message.peerId));\n\t\t\tif (!chat) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst chatType = this.determineChatType(chat);\n\n\t\t\t// Filter out Saved Messages (self-messages)\n\t\t\t// In Telegram, Saved Messages has chatId equal to the user's own ID\n\t\t\tif (chatType === \"private\" && chat instanceof Api.User) {\n\t\t\t\ttry {\n\t\t\t\t\t// Lazy load and cache own user ID\n\t\t\t\t\tif (!this.ownUserId) {\n\t\t\t\t\t\tconst me = await this.client.getMe();\n\t\t\t\t\t\tthis.ownUserId = me.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (chat.id.equals(this.ownUserId)) {\n\t\t\t\t\t\t// This is a Saved Messages conversation (self-chat), skip it\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Failed to get user info for self-message filter:`,\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get sender information with caching\n\t\t\tlet sender: Entity | null = null;\n\t\t\tif (chatType === \"channel\" || chatType === \"group\") {\n\t\t\t\tif (message.fromId) {\n\t\t\t\t\tsender = await this.getEntityWithCache(this.senderCache, message.fromId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (message.senderId) {\n\t\t\t\t\tsender = await this.getEntityWithCache(this.senderCache, message.senderId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst senderName = this.getSenderName(sender);\n\t\t\tconst chatName = this.getChatName(chat);\n\t\t\tconst chatUserName = \"username\" in chat ? chat.username : null;\n\n\t\t\tconst msgInfo = {\n\t\t\t\tid: message.id, // Save Telegram original message ID for deduplication\n\t\t\t\tsender:\n\t\t\t\t\tchatType === \"private\"\n\t\t\t\t\t\t? (senderName ?? chatName)\n\t\t\t\t\t\t: (senderName ?? chatUserName ?? `anonymous user ${message.senderId}`),\n\t\t\t\tchatName: chatName,\n\t\t\t\tchatType: chatType,\n\t\t\t\ttext: message.message || \"\",\n\t\t\t\ttimestamp: message.date,\n\t\t\t\t// Use message.out property to determine message direction: true means sent by me, false means received from others\n\t\t\t\tisOutgoing: message.out,\n\t\t\t};\n\n\t\t\tif (msgInfo.sender.includes(\"anonymous user\") && message.senderId) {\n\t\t\t\tsender = await this.getEntityWithCache(this.senderCache, message.senderId);\n\t\t\t\tconst senderName = this.getSenderName(sender);\n\t\t\t\tif (senderName) {\n\t\t\t\t\tmsgInfo.sender = senderName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet quoted: ExtractedMessageInfo | null = null;\n\n\t\t\tif (message.replyToMsgId && depth < maxDepth) {\n\t\t\t\ttry {\n\t\t\t\t\tconst quotedMsgList = await this.client.getMessages(message.peerId, {\n\t\t\t\t\t\tids: message.replyToMsgId,\n\t\t\t\t\t});\n\t\t\t\t\tif (quotedMsgList.length > 0 && quotedMsgList[0] instanceof Api.Message) {\n\t\t\t\t\t\tquoted = await this.extractMessageInfo(quotedMsgList[0], depth + 1, maxDepth);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tconst result = isEmptyMessage(quoted) ? msgInfo : { ...msgInfo, quoted };\n\t\t\t// Only add attachments to non-referenced messages, as they may be added repeatedly.\n\t\t\tconst attachments = depth === 0 ? await this.extractAttachmentsFromMessage(message) : [];\n\t\t\treturn attachments.length > 0 ? { ...result, attachments } : result;\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Error extracting message info:`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// Determine the type of chat\n\tprivate determineChatType(chat: Entity): \"private\" | \"group\" | \"channel\" | \"unknown\" {\n\t\tif (chat instanceof Api.User) return \"private\";\n\t\tif (chat instanceof Api.Chat) return \"group\";\n\t\tif (chat instanceof Api.Channel) return \"channel\";\n\t\treturn \"unknown\";\n\t}\n\n\t// Get appropriate chat name based on entity type\n\tprivate getChatName(chat: Entity): string {\n\t\tif (chat instanceof Api.User) {\n\t\t\tconst name = `${chat.firstName || \"\"} ${chat.lastName || \"\"}`.trim();\n\t\t\tif (name) return name;\n\t\t\t// Fallback to username if display name is empty\n\t\t\tif (chat.username) return `@${chat.username}`;\n\t\t\treturn \"Private Chat\";\n\t\t}\n\t\tif (chat instanceof Api.Chat) {\n\t\t\t// For regular chats, try title, then use ID as fallback\n\t\t\tif (chat.title) return chat.title;\n\t\t\tconst chatId = chat.id?.toString();\n\t\t\tif (chatId) {\n\t\t\t\tconsole.warn(`[Bot ${this.botId}] [telegram] Chat ${chatId} missing title, using ID as fallback`);\n\t\t\t\treturn `Chat ${chatId}`;\n\t\t\t}\n\t\t\treturn \"Unnamed Chat\";\n\t\t}\n\t\tif (chat instanceof Api.Channel) {\n\t\t\t// For channels/supergroups, try title, then username, then ID\n\t\t\tif (chat.title) return chat.title;\n\t\t\tif (chat.username) return `@${chat.username}`;\n\t\t\tconst channelId = chat.id?.toString();\n\t\t\tif (channelId) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Bot ${this.botId}] [telegram] Channel ${channelId} missing title and username, using ID as fallback`,\n\t\t\t\t);\n\t\t\t\treturn `Channel ${channelId}`;\n\t\t\t}\n\t\t\treturn \"Unnamed Chat\";\n\t\t}\n\t\t// Unknown entity type - log for debugging\n\t\tconsole.warn(`[Bot ${this.botId}] [telegram] Unknown entity type in getChatName:`, chat?.className);\n\t\treturn \"Unknown Chat\";\n\t}\n\n\tprivate getSenderName(sender: Entity | null): string | null {\n\t\tif (!sender) return null;\n\t\tif (sender instanceof Api.User) {\n\t\t\tif (sender.firstName || sender.lastName) {\n\t\t\t\treturn `${sender.firstName || \"\"} ${sender.lastName || \"\"}`.trim();\n\t\t\t}\n\t\t\treturn sender.username ?? \"\";\n\t\t}\n\t\tif (sender instanceof Api.Channel) {\n\t\t\treturn sender.title;\n\t\t}\n\t\tif (sender instanceof Api.Chat) {\n\t\t\treturn sender.title;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Clear cache manually if needed\n\tclearCache(): void {\n\t\tthis.senderCache = {};\n\t\tthis.chatCache = {};\n\t}\n\n\tprivate isImageMessage(message: Message): message is Image {\n\t\treturn (\n\t\t\ttypeof message === \"object\" &&\n\t\t\tmessage !== null &&\n\t\t\t\"url\" in message &&\n\t\t\t!(\"length\" in message) &&\n\t\t\t!(\"name\" in message) &&\n\t\t\ttypeof (message as Image).url === \"string\" &&\n\t\t\t(message as Image).url.length > 0\n\t\t);\n\t}\n\n\tprivate partitionMessages(messages: Messages): {\n\t\ttextParts: string[];\n\t\timages: Image[];\n\t\tunsupported: string[];\n\t} {\n\t\tconst textParts: string[] = [];\n\t\tconst images: Image[] = [];\n\t\tconst unsupported: string[] = [];\n\n\t\tfor (const message of messages) {\n\t\t\tif (this.isImageMessage(message)) {\n\t\t\t\timages.push(message);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst text = opencontextMessageToTgText(message);\n\t\t\tif (text.trim().length > 0) {\n\t\t\t\ttextParts.push(text);\n\t\t\t} else if (typeof message !== \"string\") {\n\t\t\t\tunsupported.push(describeUnsupportedMessage(message));\n\t\t\t}\n\t\t}\n\n\t\treturn { textParts, images, unsupported };\n\t}\n\n\tprivate inferFileName(image: Image): string {\n\t\tif (image.id && image.id.trim().length > 0) {\n\t\t\treturn image.id;\n\t\t}\n\n\t\tif (image.path) {\n\t\t\tconst segments = image.path.split(\"/\");\n\t\t\tconst candidate = segments[segments.length - 1];\n\t\t\tif (candidate) return candidate;\n\t\t}\n\n\t\tif (image.url) {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(image.url);\n\t\t\t\tconst filename = url.pathname.split(\"/\").pop();\n\t\t\t\tif (filename && filename.trim().length > 0) {\n\t\t\t\t\treturn filename;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`[Bot ${this.botId}] [telegram] Failed to parse filename from URL`, error);\n\t\t\t}\n\t\t}\n\n\t\treturn `image-${Date.now()}.jpg`;\n\t}\n\n\tprivate decodeBase64Payload(image: Image): Buffer | null {\n\t\tif (!image.base64) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst base64String = image.base64.includes(\",\") ? image.base64.split(\",\").pop() : image.base64;\n\n\t\tif (!base64String) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn Buffer.from(base64String, \"base64\");\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to decode base64 image payload`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async downloadMediaBuffer(message: Api.Message): Promise<Buffer | null> {\n\t\ttry {\n\t\t\tconst result = await this.client.downloadMedia(message);\n\t\t\tif (!result) return null;\n\t\t\tif (Buffer.isBuffer(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (typeof result === \"string\") {\n\t\t\t\tconst fs = await import(\"node:fs/promises\");\n\t\t\t\treturn await fs.readFile(result);\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to download media buffer`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async extractAttachmentsFromMessage(message: Api.Message): Promise<Attachment[]> {\n\t\tif (!this.ownerUserId || !this.ownerUserType) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!message.media) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst attachments: Attachment[] = [];\n\n\t\tconst pushAttachment = async (buffer: Buffer, fileName: string, mimeType: string) => {\n\t\t\tif (!this.ownerUserId || !this.ownerUserType) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst downloadPayload = async () => ({\n\t\t\t\tdata: buffer as unknown as ArrayBuffer,\n\t\t\t\tcontentType: mimeType,\n\t\t\t\tsizeBytes: buffer.length,\n\t\t\t});\n\n\t\t\tif (this.fileIngester) {\n\t\t\t\tconst result = await this.fileIngester.ingestExternal({\n\t\t\t\t\tsource: \"telegram\",\n\t\t\t\t\tuserId: this.ownerUserId,\n\t\t\t\t\tmaxSizeBytes: TELEGRAM_MAX_ATTACHMENT_BYTES,\n\t\t\t\t\tmimeTypeHint: mimeType,\n\t\t\t\t\toriginalFileName: fileName,\n\t\t\t\t\tdownloadAttachment: downloadPayload,\n\t\t\t\t});\n\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Skipped attachment due to ${result.reason} mimeType=${mimeType} fileName=${fileName}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!result.attachment) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst ingested = result.attachment;\n\t\t\t\tattachments.push({\n\t\t\t\t\tname: ingested.name,\n\t\t\t\t\turl: ingested.url,\n\t\t\t\t\tdownloadUrl: ingested.downloadUrl,\n\t\t\t\t\tcontentType: ingested.contentType,\n\t\t\t\t\tsizeBytes: ingested.sizeBytes,\n\t\t\t\t\tblobPath: ingested.blobPath,\n\t\t\t\t\tsource: \"telegram\",\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tif (message.media instanceof Api.MessageMediaPhoto) {\n\t\t\tconst buffer = await this.downloadMediaBuffer(message);\n\t\t\tif (buffer) {\n\t\t\t\tconst fileName = `telegram-photo-${message.id ?? Date.now()}.jpg`;\n\t\t\t\tawait pushAttachment(buffer, fileName, \"image/jpeg\");\n\t\t\t}\n\t\t\treturn attachments;\n\t\t}\n\n\t\tif (message.media instanceof Api.MessageMediaDocument) {\n\t\t\tconst document = message.media.document;\n\t\t\tif (!document || !(document instanceof Api.Document)) {\n\t\t\t\treturn attachments;\n\t\t\t}\n\n\t\t\tconst buffer = await this.downloadMediaBuffer(message);\n\t\t\tif (!buffer) {\n\t\t\t\treturn attachments;\n\t\t\t}\n\n\t\t\tconst mimeType = document.mimeType ?? \"application/octet-stream\";\n\t\t\tlet fileName = `telegram-file-${document.id ?? message.id ?? Date.now()}`;\n\n\t\t\tfor (const attr of document.attributes ?? []) {\n\t\t\t\tif (attr instanceof Api.DocumentAttributeFilename) {\n\t\t\t\t\tfileName = attr.fileName;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait pushAttachment(buffer, fileName, mimeType);\n\t\t\treturn attachments;\n\t\t}\n\n\t\treturn attachments;\n\t}\n\n\tprivate async resolveTelegramFile(image: Image): Promise<string | CustomFile> {\n\t\tif (image.base64) {\n\t\t\tconst buffer = this.decodeBase64Payload(image);\n\t\t\tif (buffer) {\n\t\t\t\tconst name = this.inferFileName(image);\n\t\t\t\treturn new CustomFile(name, buffer.length, \"\", buffer);\n\t\t\t}\n\t\t}\n\n\t\tif (image.path) {\n\t\t\treturn image.path;\n\t\t}\n\n\t\tif (image.url) {\n\t\t\treturn image.url;\n\t\t}\n\n\t\tthrow new Error(\"Unable to resolve Telegram file source from image payload\");\n\t}\n\n\t/**\n\t * Build InputPeer based on contactId and metadata\n\t * If metadata lacks accessHash, will try to resolve entity from Telegram API\n\t */\n\tprivate async buildInputPeerFromMetadata(contactId: string): Promise<Api.TypeInputPeer> {\n\t\tconst metadata = this.contactMetadata[contactId];\n\n\t\tif (!metadata) {\n\t\t\t// If no metadata, try to resolve entity from Telegram API\n\t\t\treturn await this.resolveEntityToInputPeer(contactId);\n\t\t}\n\n\t\tconst peerId = bigInt(metadata.peerId);\n\n\t\tif (metadata.peerType === \"user\") {\n\t\t\tif (metadata.accessHash) {\n\t\t\t\treturn new Api.InputPeerUser({\n\t\t\t\t\tuserId: peerId,\n\t\t\t\t\taccessHash: bigInt(metadata.accessHash),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// No accessHash, try to resolve entity from Telegram API\n\t\t\treturn await this.resolveEntityToInputPeer(contactId, peerId, \"user\");\n\t\t}\n\n\t\tif (metadata.peerType === \"channel\") {\n\t\t\tif (metadata.accessHash) {\n\t\t\t\treturn new Api.InputPeerChannel({\n\t\t\t\t\tchannelId: peerId,\n\t\t\t\t\taccessHash: bigInt(metadata.accessHash),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// No accessHash, try to resolve entity from Telegram API\n\t\t\treturn await this.resolveEntityToInputPeer(contactId, peerId, \"channel\");\n\t\t}\n\n\t\tif (metadata.peerType === \"chat\") {\n\t\t\t// Check if peerId is negative\n\t\t\t// Negative ID is actually channel/supergroup, not regular chat\n\t\t\tif (peerId.isNegative()) {\n\t\t\t\t// Negative ID needs to be handled as channel, try to resolve if no accessHash\n\t\t\t\treturn await this.resolveEntityToInputPeer(contactId, peerId, \"channel\");\n\t\t\t}\n\t\t\treturn new Api.InputPeerChat({\n\t\t\t\tchatId: peerId,\n\t\t\t});\n\t\t}\n\n\t\t// Unknown type, try to resolve\n\t\treturn await this.resolveEntityToInputPeer(contactId);\n\t}\n\n\t/**\n\t * Try to resolve entity from Telegram API and build InputPeer\n\t * Updates contactMetadata cache after successful resolution\n\t */\n\tprivate async resolveEntityToInputPeer(\n\t\tcontactId: string,\n\t\tfallbackPeerId?: BigInteger,\n\t\tfallbackType?: \"user\" | \"channel\",\n\t): Promise<Api.TypeInputPeer> {\n\t\ttry {\n\t\t\tif (!this.client.connected) {\n\t\t\t\tawait this.client.connect();\n\t\t\t}\n\n\t\t\t// Try to resolve entity directly using contactId\n\t\t\tconst entity = await this.client.getEntity(contactId);\n\t\t\tif (!entity) {\n\t\t\t\tthrow new Error(`Entity not found for contactId: ${contactId}`);\n\t\t\t}\n\n\t\t\t// Build and cache metadata\n\t\t\tconst metadata = this.buildMetadataFromEntity(contactId, entity);\n\t\t\tif (metadata) {\n\t\t\t\tthis.contactMetadata[contactId] = metadata;\n\t\t\t}\n\n\t\t\t// Build corresponding InputPeer based on entity type\n\t\t\tif (entity instanceof Api.User) {\n\t\t\t\tconst userId = entity.id.valueOf();\n\t\t\t\tconst accessHash = entity.accessHash ? bigInt(entity.accessHash) : bigInt(0);\n\t\t\t\tconst inputPeer = new Api.InputPeerUser({\n\t\t\t\t\tuserId: bigInt(userId),\n\t\t\t\t\taccessHash,\n\t\t\t\t});\n\t\t\t\treturn inputPeer;\n\t\t\t}\n\n\t\t\tif (entity instanceof Api.Channel) {\n\t\t\t\tconst channelId = entity.id.valueOf();\n\t\t\t\tconst accessHash = entity.accessHash ? bigInt(entity.accessHash) : bigInt(0);\n\t\t\t\tconst inputPeer = new Api.InputPeerChannel({\n\t\t\t\t\tchannelId: bigInt(channelId),\n\t\t\t\t\taccessHash,\n\t\t\t\t});\n\t\t\t\treturn inputPeer;\n\t\t\t}\n\n\t\t\tif (entity instanceof Api.Chat) {\n\t\t\t\tconst chatId = entity.id.valueOf();\n\t\t\t\tconst inputPeer = new Api.InputPeerChat({\n\t\t\t\t\tchatId: bigInt(chatId),\n\t\t\t\t});\n\t\t\t\treturn inputPeer;\n\t\t\t}\n\n\t\t\tthrow new Error(`Unsupported entity type for contactId: ${contactId}`);\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to resolve entity for ${contactId}:`, error);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot resolve Telegram peer for ${contactId}. The contact may not exist or may not be accessible.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async dispatchMessages(\n\t\toperation: string,\n\t\tpeer: string,\n\t\ttextParts: string[],\n\t\timages: Image[],\n\t): Promise<void> {\n\t\tconst text = textParts.join(\"\\n\").trim();\n\n\t\t// Build correct InputPeer using metadata (now async)\n\t\tconst inputPeer = await this.buildInputPeerFromMetadata(peer);\n\n\t\tif (images.length === 0) {\n\t\t\tif (text.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait withTimeout(\n\t\t\t\tthis.client.sendMessage(inputPeer, {\n\t\t\t\t\tmessage: markdownToTelegramHtml(text),\n\t\t\t\t\tparseMode: \"html\",\n\t\t\t\t}),\n\t\t\t\tSEND_MESSAGE_TIMEOUT_MS,\n\t\t\t\t`[Bot ${this.botId}] Telegram client.sendMessage()`,\n\t\t\t);\n\t\t\tif (DEBUG) {\n\t\t\t\tconsole.log(`[Bot ${this.botId}] [telegram] Message sent successfully to ${peer}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst caption = text.length > 0 ? text : undefined;\n\t\tlet captionDelivered = false;\n\n\t\tfor (let index = 0; index < images.length; index++) {\n\t\t\tconst image = images[index];\n\t\t\tlet fileLike: string | CustomFile;\n\t\t\ttry {\n\t\t\t\tfileLike = await this.resolveTelegramFile(image);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to resolve file for upload`, error);\n\t\t\t\tthrow this.toAdapterError(operation, error, {\n\t\t\t\t\tfallbackCode: \"invalid_request_error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst options: Parameters<TelegramClient[\"sendFile\"]>[1] = {\n\t\t\t\tfile: fileLike,\n\t\t\t};\n\n\t\t\tif (index === 0 && caption) {\n\t\t\t\toptions.caption = caption;\n\t\t\t}\n\n\t\t\tawait withTimeout(\n\t\t\t\tthis.client.sendFile(inputPeer, options),\n\t\t\t\tSEND_MESSAGE_TIMEOUT_MS,\n\t\t\t\t`[Bot ${this.botId}] Telegram client.sendFile()`,\n\t\t\t);\n\n\t\t\tif (index === 0 && caption) {\n\t\t\t\tcaptionDelivered = true;\n\t\t\t}\n\n\t\t\tif (DEBUG) {\n\t\t\t\tconsole.log(`[Bot ${this.botId}] [telegram] File sent successfully to ${peer}`);\n\t\t\t}\n\t\t}\n\n\t\tif (caption && !captionDelivered) {\n\t\t\tawait withTimeout(\n\t\t\t\tthis.client.sendMessage(inputPeer, {\n\t\t\t\t\tmessage: markdownToTelegramHtml(text),\n\t\t\t\t\tparseMode: \"html\",\n\t\t\t\t}),\n\t\t\t\tSEND_MESSAGE_TIMEOUT_MS,\n\t\t\t\t`[Bot ${this.botId}] Telegram client.sendMessage()`,\n\t\t\t);\n\t\t\tif (DEBUG) {\n\t\t\t\tconsole.log(`[Bot ${this.botId}] [telegram] Caption message sent successfully to ${peer}`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport { getTgUserNameString } from \"@melandlabs/integrations-channels/sources/types\";\nexport type {\n\tDialogInfo,\n\tTgUserInfo,\n\tExtractedMessageInfo,\n} from \"@melandlabs/integrations-channels/sources/types\";\n\nexport function opencontextMessageToTgText(message: Message): string {\n\tif (typeof message === \"string\") {\n\t\treturn message;\n\t}\n\tif (\"text\" in message) {\n\t\treturn message.text;\n\t}\n\tif (\"target\" in message) {\n\t\treturn `@${message.target}`;\n\t}\n\tif (\"nodes\" in message) {\n\t\treturn message.nodes.map((node) => opencontextMessageToTgText(node as unknown as Message)).join(\"\");\n\t}\n\treturn \"\";\n}\n\nfunction describeUnsupportedMessage(message: Message): string {\n\tif (!message || typeof message !== \"object\") return typeof message;\n\tif (\"name\" in message && \"url\" in message) return \"file\";\n\tif (\"length\" in message && \"url\" in message) return \"voice\";\n\tif (\"origin\" in message) return \"quote\";\n\tif (\"time\" in message && \"id\" in message) return \"source\";\n\tif (\"display\" in message && \"nodes\" in message) return \"forward\";\n\tif (\"type\" in message && \"name\" in message) return \"emoji\";\n\treturn \"content\";\n}\n\nexport function tgMessageToopencontextMessage(message: Api.Message): Messages {\n\tconst messages: Messages = [];\n\n\tif (!message.message) {\n\t\tif (message.media) {\n\t\t\tmessages.push(\"[Media content]\");\n\t\t}\n\t\treturn messages;\n\t}\n\n\tmessages.push(message.message);\n\n\tif (message.entities) {\n\t\tfor (const entity of message.entities) {\n\t\t\tif (entity instanceof Api.MessageEntityMention) {\n\t\t\t\tconst mentionText = message.message.substr(entity.offset, entity.length);\n\t\t\t\tmessages.push({ target: mentionText.replace(\"@\", \"\") } as At);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn messages;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/markdown.ts","../src/adapter.ts"],"names":["senderName"],"mappings":";;;;;;;;;;;;;;;;;AA8CA,SAAS,gBAAA,GAA+B;AACvC,EAAA,MAAM,EAAA,GAAK,IAAI,UAAA,CAAW;AAAA,IACzB,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACb,CAAA;AACD,EAAA,EAAA,CAAG,OAAO,eAAe,CAAA;AACzB,EAAA,EAAA,CAAG,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,EAAA;AACR;AA2CA,SAAS,aAAA,GAMP;AACD,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,EAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,YAAY,EAAC;AAAA,IACb,OAAO,EAAC;AAAA,IACR,WAAW;AAAC,GACb;AACD;AAEA,SAAS,WAAW,IAAA,EAAqD;AACxE,EAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,EAAA,OAAO,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,QAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAClE;AAEA,SAAS,cAAc,KAAA,EAAoB;AAC1C,EAAA,OAAO,KAAA,CAAM,OAAO,WAAA,IAAe,KAAA;AACpC;AAEA,SAAS,UAAA,CAAW,OAAoB,KAAA,EAAqB;AAC5D,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,aAAA,CAAc,KAAK,EAAE,IAAA,IAAQ,KAAA;AAC9B;AAEA,SAAS,SAAA,CAAU,OAAoB,KAAA,EAAiC;AACvE,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,MAAA,CAAO,UAAA,CAAW,KAAK,EAAE,KAAA,EAAO,OAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAC5D;AAEA,SAAS,UAAA,CAAW,OAAoB,KAAA,EAAiC;AACxE,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvD,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,EAAG,UAAU,KAAA,EAAO;AAC1C,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,KAAA;AACnC,MAAA,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,MAAA;AACxB,MAAA,IAAI,MAAM,KAAA,EAAO;AAChB,QAAA,MAAA,CAAO,OAAO,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,CAAA;AAAA,MACzC;AACA,MAAA;AAAA,IACD;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB,MAAA,EAAgD;AAC7E,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,MAAA;AACxB,IAAA,IAAI,GAAA,GAAM,KAAK,KAAA,EAAO;AACrB,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,GAAA,EAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,IACjE;AAAA,EACD;AACA,EAAA,MAAA,CAAO,aAAa,EAAC;AACtB;AAEA,SAAS,OAAA,CAAQ,OAAc,IAAA,EAA6B;AAC3D,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC5C,EAAA,IAAI,MAAM,KAAA,EAAO;AAChB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAM,KAAA,EAAO;AACvC,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,KAAA;AAAA,IAC1B;AAAA,EACD;AACA,EAAA,OAAO,IAAA;AACR;AAEA,SAAS,qBAAqB,KAAA,EAA0B;AACvD,EAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAElB,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA;AAEzB,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,QAAQ,EAAA,EAAA,EAAM;AACxC,IAAA,MAAM,GAAA,GAAM,KAAK,EAAE,CAAA;AACnB,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AAGtB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA;AAC9B,IAAA,KAAA,CAAM,IAAA,IAAQ,GAAA,CAAI,CAAC,CAAA,CAAE,IAAA;AACrB,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,UAAA,EAAY;AACnC,MAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,QACjB,KAAA,EAAO,UAAA;AAAA,QACP,GAAA,EAAK,MAAM,IAAA,CAAK,MAAA;AAAA,QAChB,KAAA,EAAO;AAAA,OACP,CAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA,IAAQ,IAAA;AAEd,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,CAAI,QAAQ,EAAA,EAAA,EAAM;AACvC,MAAA,MAAM,aAAa,OAAA,CAAQ,EAAE,CAAA,EAAG,IAAA,IAAQ,UAAU,EAAE,CAAA,CAAA;AACpD,MAAA,KAAA,CAAM,IAAA,IAAQ,SAAA;AACd,MAAA,KAAA,CAAM,IAAA,IAAQ,GAAG,UAAU,CAAA,EAAA,CAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,IAAQ,CAAA,EAAG,GAAA,CAAI,EAAE,EAAE,IAAI;AAAA,CAAA;AAAA,IAC9B;AAAA,EACD;AACD;AAEA,SAAS,kBAAkB,KAAA,EAA0B;AACpD,EAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAElB,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA;AACzB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AACtE,EAAA,IAAI,aAAa,CAAA,EAAG;AAEpB,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAE,QAAQ,QAAA,EAAS,EAAG,MAAM,CAAC,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAyB;AAC9C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA;AAAA,IAC3D;AAAA,EACD,CAAA;AACA,EAAA,YAAA,CAAa,OAAO,CAAA;AACpB,EAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,YAAA,CAAa,GAAG,CAAA;AAExC,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,MAAA;AAE7B,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC3C,IAAA,KAAA,CAAM,IAAA,IAAQ,GAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,MAAA,KAAA,CAAM,IAAA,IAAQ,GAAA;AACd,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,KAAA,CAAM,IAAA,IAAQ,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,EAAA;AACjC,MAAA,MAAM,MAAM,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA,EAAM,KAAK,MAAA,IAAU,CAAA,CAAA;AAC9C,MAAA,KAAA,CAAM,IAAA,IAAQ,GAAG,GAAA,CAAI,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IAC9C;AACA,IAAA,KAAA,CAAM,IAAA,IAAQ,IAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC3B,IAAA,KAAA,CAAM,IAAA,IAAQ,GAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,MAAA,KAAA,CAAM,IAAA,IAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IACrD;AACA,IAAA,KAAA,CAAM,IAAA,IAAQ,IAAA;AAAA,EACf,CAAA;AAEA,EAAA,SAAA,CAAU,OAAO,CAAA;AACjB,EAAA,aAAA,EAAc;AACd,EAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,SAAA,CAAU,GAAG,CAAA;AAErC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAC3B,EAAA,IAAI,UAAU,SAAA,EAAW;AACxB,IAAA,KAAA,CAAM,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,WAAW,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,EAC1E;AACD;AAEA,SAAS,aAAA,CAAc,QAAiB,KAAA,EAA0B;AACjE,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC3B,IAAA,QAAQ,MAAM,IAAA;AAAM,MACnB,KAAK,QAAA;AACJ,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,UAAU,KAAK,CAAA;AACvD,QAAA;AAAA,MAED,KAAK,MAAA;AACJ,QAAA,UAAA,CAAW,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,EAAE,CAAA;AACrC,QAAA;AAAA,MAED,KAAK,SAAA;AACJ,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,QAAA;AAAA,MACD,KAAK,UAAA;AACJ,QAAA,UAAA,CAAW,OAAO,QAAQ,CAAA;AAC1B,QAAA;AAAA,MAED,KAAK,aAAA;AACJ,QAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AACvB,QAAA;AAAA,MACD,KAAK,cAAA;AACJ,QAAA,UAAA,CAAW,OAAO,MAAM,CAAA;AACxB,QAAA;AAAA,MAED,KAAK,QAAA;AACJ,QAAA,SAAA,CAAU,OAAO,eAAe,CAAA;AAChC,QAAA;AAAA,MACD,KAAK,SAAA;AACJ,QAAA,UAAA,CAAW,OAAO,eAAe,CAAA;AACjC,QAAA;AAAA,MAED,KAAK,cAAA;AACJ,QAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA;AACpD,QAAA;AAAA,MACD,KAAK,eAAA;AACJ,QAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,UAAA,CAAW,KAAA,EAAO,SAAS,CAAA;AACrD,QAAA;AAAA,MAED,KAAK,aAAA,EAAe;AACnB,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,EAAA;AACjC,QAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,QAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,MAAA;AAC1B,QAAA,MAAA,CAAO,IAAA,IAAQ,OAAA;AACf,QAAA,MAAA,CAAO,OAAO,IAAA,CAAK;AAAA,UAClB,KAAA;AAAA,UACA,GAAA,EAAK,QAAQ,OAAA,CAAQ,MAAA;AAAA,UACrB,KAAA,EAAO;AAAA,SACP,CAAA;AACD,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,WAAA,EAAa;AACjB,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,IAAK,EAAA;AACvC,QAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,QAAA,MAAA,CAAO,SAAA,CAAU,KAAK,EAAE,IAAA,EAAM,YAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAC9D,QAAA;AAAA,MACD;AAAA,MACA,KAAK,YAAA,EAAc;AAClB,QAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,GAAA,EAAI;AAClC,QAAA,IAAI,MAAM,IAAA,EAAM;AACf,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAC5B,UAAA,IAAI,IAAA,EAAM;AACT,YAAA,MAAA,CAAO,MAAM,IAAA,CAAK;AAAA,cACjB,OAAO,IAAA,CAAK,UAAA;AAAA,cACZ,GAAA,EAAK,OAAO,IAAA,CAAK,MAAA;AAAA,cACjB;AAAA,aACA,CAAA;AAAA,UACF;AAAA,QACD;AACA,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,OAAA;AACJ,QAAA,UAAA,CAAW,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,EAAE,CAAA;AACrC,QAAA;AAAA,MAED,KAAK,WAAA;AAAA,MACL,KAAK,WAAA;AACJ,QAAA,UAAA,CAAW,OAAO,IAAI,CAAA;AACtB,QAAA;AAAA,MAED,KAAK,iBAAA,EAAmB;AACvB,QAAA,IAAI,MAAM,SAAA,CAAU,MAAA,KAAW,CAAA,IAAK,CAAC,MAAM,KAAA,EAAO;AACjD,UAAA,KAAA,CAAM,IAAA,IAAQ,MAAA;AAAA,QACf;AACA,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,cAAA;AACJ,QAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAQ,SAAA,CAAU,OAAO,MAAM,CAAA;AAC1D,QAAA;AAAA,MACD,KAAK,eAAA;AACJ,QAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAQ,UAAA,CAAW,OAAO,MAAM,CAAA;AAC3D,QAAA,IAAI,KAAA,CAAM,UAAU,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,CAAM,KAAA,QAAa,IAAA,IAAQ,MAAA;AAChE,QAAA;AAAA,MAED,KAAK,iBAAA;AACJ,QAAA,IAAI,KAAA,CAAM,gBAAA,EAAkB,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,gBAAA;AAChD,QAAA,SAAA,CAAU,OAAO,YAAY,CAAA;AAC7B,QAAA;AAAA,MACD,KAAK,kBAAA;AACJ,QAAA,UAAA,CAAW,OAAO,YAAY,CAAA;AAC9B,QAAA;AAAA,MAED,KAAK,kBAAA;AACJ,QAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAA,QAAS,IAAA,IAAQ,IAAA;AAC9C,QAAA,KAAA,CAAM,UAAU,IAAA,CAAK,EAAE,MAAM,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AACjD,QAAA;AAAA,MACD,KAAK,mBAAA;AACJ,QAAA,KAAA,CAAM,UAAU,GAAA,EAAI;AACpB,QAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,KAAW,CAAA,QAAS,IAAA,IAAQ,IAAA;AAChD,QAAA;AAAA,MAED,KAAK,mBAAA,EAAqB;AACzB,QAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAA,QAAS,IAAA,IAAQ,IAAA;AAC9C,QAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,OAAO,KAAK,GAAG,CAAA;AACnD,QAAA,KAAA,CAAM,SAAA,CAAU,KAAK,EAAE,IAAA,EAAM,WAAW,KAAA,EAAO,KAAA,GAAQ,GAAG,CAAA;AAC1D,QAAA;AAAA,MACD;AAAA,MACA,KAAK,oBAAA;AACJ,QAAA,KAAA,CAAM,UAAU,GAAA,EAAI;AACpB,QAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,KAAW,CAAA,QAAS,IAAA,IAAQ,IAAA;AAChD,QAAA;AAAA,MAED,KAAK,gBAAA,EAAkB;AACtB,QAAA,MAAM,MAAM,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,SAAS,CAAC,CAAA;AACtD,QAAA,IAAI,GAAA,EAAK;AACR,UAAA,GAAA,CAAI,KAAA,EAAA;AACJ,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAC,CAAC,CAAA;AAClE,UAAA,MAAM,SAAS,GAAA,CAAI,IAAA,KAAS,YAAY,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAA,CAAA,GAAO,SAAA;AAC3D,UAAA,KAAA,CAAM,IAAA,IAAQ,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,QACjC;AACA,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,iBAAA;AACJ,QAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,SAAS,IAAI,CAAA,QAAS,IAAA,IAAQ,IAAA;AAC9C,QAAA;AAAA,MAED,KAAK,YAAA;AAAA,MACL,KAAK,OAAA,EAAS;AACb,QAAA,IAAI,IAAA,GAAO,MAAM,OAAA,IAAW,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,GAAG,IAAA,IAAQ,IAAA;AAClC,QAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,QAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,MAAA;AAC1B,QAAA,MAAA,CAAO,IAAA,IAAQ,IAAA;AACf,QAAA,MAAA,CAAO,OAAO,IAAA,CAAK;AAAA,UAClB,KAAA;AAAA,UACA,GAAA,EAAK,QAAQ,IAAA,CAAK,MAAA;AAAA,UAClB,KAAA,EAAO;AAAA,SACP,CAAA;AACD,QAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,KAAW,CAAA,SAAU,IAAA,IAAQ,IAAA;AACjD,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,YAAA;AAAA,MACL,KAAK,aAAA;AACJ,QAAA,UAAA,CAAW,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,EAAE,CAAA;AACrC,QAAA;AAAA,MAED,KAAK,YAAA;AACJ,QAAA,IAAI,KAAA,CAAM,cAAc,KAAA,EAAO;AAC9B,UAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,YACb,SAAS,EAAC;AAAA,YACV,MAAM,EAAC;AAAA,YACP,YAAY,EAAC;AAAA,YACb,WAAA,EAAa,IAAA;AAAA,YACb,QAAA,EAAU;AAAA,WACX;AAAA,QACD;AACA,QAAA;AAAA,MAED,KAAK,aAAA;AACJ,QAAA,IAAI,MAAM,KAAA,EAAO;AAChB,UAAA,IAAI,KAAA,CAAM,SAAA,KAAc,SAAA,EAAW,oBAAA,CAAqB,KAAK,CAAA;AAAA,eAAA,IACpD,KAAA,CAAM,SAAA,KAAc,MAAA,EAAQ,iBAAA,CAAkB,KAAK,CAAA;AAAA,QAC7D;AACA,QAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,QAAA;AAAA,MAED,KAAK,YAAA;AACJ,QAAA,IAAI,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,QAAA,GAAW,IAAA;AACxC,QAAA;AAAA,MACD,KAAK,aAAA;AACJ,QAAA,IAAI,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,QAAA,GAAW,KAAA;AACxC,QAAA;AAAA,MAED,KAAK,YAAA;AAAA,MACL,KAAK,aAAA;AACJ,QAAA;AAAA,MAED,KAAK,SAAA;AACJ,QAAA,IAAI,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,aAAa,EAAC;AAC3C,QAAA;AAAA,MACD,KAAK,UAAA;AACJ,QAAA,IAAI,MAAM,KAAA,EAAO;AAChB,UAAA,IAAI,KAAA,CAAM,MAAM,QAAA,EAAU;AACzB,YAAA,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,UAAA;AAAA,UACnC,CAAA,MAAO;AACN,YAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,UAAU,CAAA;AAAA,UAC7C;AACA,UAAA,KAAA,CAAM,KAAA,CAAM,aAAa,EAAC;AAAA,QAC3B;AACA,QAAA;AAAA,MAED,KAAK,SAAA;AAAA,MACL,KAAK,SAAA;AACJ,QAAA,IAAI,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,cAAc,aAAA,EAAc;AACzD,QAAA;AAAA,MACD,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AACJ,QAAA,IAAI,KAAA,CAAM,OAAO,WAAA,EAAa;AAC7B,UAAA,KAAA,CAAM,MAAM,UAAA,CAAW,IAAA,CAAK,WAAW,KAAA,CAAM,KAAA,CAAM,WAAW,CAAC,CAAA;AAC/D,UAAA,KAAA,CAAM,MAAM,WAAA,GAAc,IAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MAED,KAAK,IAAA;AACJ,QAAA,KAAA,CAAM,IAAA,IAAQ,wBAAA;AACd,QAAA;AAAA,MAED;AACC,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,UAAU,KAAK,CAAA;AACvD,QAAA;AAAA;AACF,EACD;AACD;AAEA,SAAS,YAAA,CACR,QAAA,EACA,OAAA,GAMI,EAAC,EACQ;AACb,EAAA,MAAM,KAAK,gBAAA,EAAiB;AAE5B,EAAA,MAAM,GAAA,GAAM,EAAE,SAAA,EAAW,EAAC,EAAiB;AAC3C,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,CAAM,QAAA,IAAY,IAAI,GAAG,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAqB;AAAA,IAC1B,IAAA,EAAM,EAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,YAAY,EAAC;AAAA,IACb,OAAO,EAAC;AAAA,IACR,WAAW,EAAC;AAAA,IACZ,WAAW,EAAC;AAAA,IACZ,YAAA,EAAc,QAAQ,YAAA,IAAgB,MAAA;AAAA,IACtC,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,EAAA;AAAA,IAC9C,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,QAAQ,SAAA,IAAa,MAAA;AAAA,IAChC,cAAA,EAAgB,QAAQ,cAAA,IAAkB;AAAA,GAC3C;AAEA,EAAA,aAAA,CAAc,QAAmB,KAAK,CAAA;AACtC,EAAA,oBAAA,CAAqB,aAAA,CAAc,KAAK,CAAC,CAAA;AAEzC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,OAAA,EAAQ,CAAE,MAAA;AACxC,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,MAAA,EAAQ;AAChC,IAAA,IAAI,IAAA,CAAK,UAAU,YAAA,EAAc;AACjC,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,YAAA,EAAc,YAAA,GAAe,IAAA,CAAK,GAAA;AAAA,EAClD;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,YAAY,CAAA;AAElD,EAAA,OAAO;AAAA,IACN,IAAA,EAAM,QAAA,KAAa,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,IAChF,QAAQ,eAAA,CAAgB,eAAA,CAAgB,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,IAC/D,KAAA,EAAO,cAAA,CAAe,KAAA,CAAM,KAAA,EAAO,QAAQ;AAAA,GAC5C;AACD;AAEA,SAAS,eAAA,CAAgB,OAAoB,MAAA,EAA6B;AACzE,EAAA,OAAO,KAAA,CACL,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACZ,GAAG,CAAA;AAAA,IACH,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IAC5C,GAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,MAAM,CAAC;AAAA,GACzC,CAAE,EACD,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,KAAK,CAAA;AAChC;AAEA,SAAS,cAAA,CAAe,OAAmB,MAAA,EAA4B;AACtE,EAAA,OAAO,KAAA,CACL,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACZ,GAAG,CAAA;AAAA,IACH,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IAC5C,GAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,MAAM,CAAC;AAAA,GACzC,CAAE,EACD,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,KAAK,CAAA;AAChC;AAEA,SAAS,gBAAgB,KAAA,EAAiC;AACzD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACxC,IAAA,IAAI,EAAE,KAAA,KAAU,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAC5C,IAAA,IAAI,EAAE,GAAA,KAAQ,CAAA,CAAE,KAAK,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA;AACtC,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAAA,EACrC,CAAC,CAAA;AACD,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IACC,IAAA,IACA,IAAA,CAAK,KAAA,KAAU,CAAA,CAAE,UAChB,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,GAAA,IAAQ,EAAE,KAAA,KAAU,IAAA,CAAK,GAAA,IAAO,CAAA,CAAE,UAAU,YAAA,CAAA,EAC3D;AACD,MAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,EAAE,GAAG,CAAA;AACnC,MAAA;AAAA,IACD;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA;AACR;AAIA,IAAM,UAAA,uBAAiB,GAAA,CAAgC;AAAA,EACtD,CAAC,cAAc,CAAC,CAAA;AAAA,EAChB,CAAC,cAAc,CAAC,CAAA;AAAA,EAChB,CAAC,QAAQ,CAAC,CAAA;AAAA,EACV,CAAC,QAAQ,CAAC,CAAA;AAAA,EACV,CAAC,UAAU,CAAC,CAAA;AAAA,EACZ,CAAC,iBAAiB,CAAC,CAAA;AAAA,EACnB,CAAC,WAAW,CAAC;AACd,CAAC,CAAA;AAED,SAAS,eAAe,KAAA,EAAiC;AACxD,EAAA,OAAO,CAAC,GAAG,KAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAChC,IAAA,IAAI,EAAE,KAAA,KAAU,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAC5C,IAAA,IAAI,EAAE,GAAA,KAAQ,CAAA,CAAE,KAAK,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA;AACtC,IAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,IAAK,MAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA,CAAA;AAAA,EACrE,CAAC,CAAA;AACF;AASA,SAAS,yBAAA,CACR,IACA,OAAA,EAKS;AACT,EAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,WAAU,GAAI,OAAA;AAChE,EAAA,MAAM,UAAU,EAAA,CAAG,IAAA;AACnB,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AAErB,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAC,CAAC,CAAC,CAAA;AAEhF,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,UAAA,CAAW,IAAI,CAAC,CAAA;AAChB,EAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,MAAM,CAAA;AAE7B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,GAAA,EAAK;AAC7B,IAAA,UAAA,CAAW,GAAA,CAAI,KAAK,KAAK,CAAA;AACzB,IAAA,UAAA,CAAW,GAAA,CAAI,KAAK,GAAG,CAAA;AACvB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AACtC,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,kBACd,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,CAAC,IAAI,CAAC,CAAA;AAAA,EACrC;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,MAAA,IAAI,EAAE,GAAA,KAAQ,CAAA,CAAE,KAAK,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA;AACtC,MAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,IAAK,MAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA,CAAA;AAAA,IACrE,CAAC,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAgC;AACvD,EAAA,IAAI,SAAA,EAAW;AACd,IAAA,KAAA,MAAW,IAAA,IAAQ,GAAG,KAAA,EAAO;AAC5B,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,GAAA,EAAK;AAC7B,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA;AACxC,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,UAAA,CAAW,GAAA,CAAI,SAAS,KAAK,CAAA;AAC7B,MAAA,UAAA,CAAW,GAAA,CAAI,SAAS,GAAG,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA;AAC5C,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,sBAChB,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,CAAC,QAAQ,CAAC,CAAA;AAAA,IAC/C;AAAA,EACD;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,UAAU,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACnD,EAAA,MAAM,QAA0C,EAAC;AACjD,EAAA,IAAI,GAAA,GAAM,EAAA;AAEV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAM,OAAO,CAAC,CAAA;AAEpB,IAAA,OAAO,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,EAAG,QAAQ,GAAA,EAAK;AAC5D,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,EAAI;AACvB,MAAA,IAAI,IAAA,SAAa,IAAA,CAAK,KAAA;AAAA,IACvB;AAEA,IAAA,MAAM,eAOA,EAAC;AAEP,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,YAAA,CAAa,QAAQ,GAAA,EAAA,EAAO;AACnD,QAAA,MAAM,CAAA,GAAI,aAAa,GAAG,CAAA;AAC1B,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UACjB,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACP,CAAA;AAAA,MACF;AAAA,IACD;AAEA,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,aAAA,EAAe;AAClB,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,aAAA,CAAc,QAAQ,GAAA,EAAA,EAAO;AACpD,QAAA,MAAM,IAAA,GAAO,cAAc,GAAG,CAAA;AAC9B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACjC,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UACjB,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,IAAA,EAAM,OAAA;AAAA,UACN,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACP,CAAA;AAAA,MACF;AAAA,IACD;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC5B,MAAA,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,QAAA,IAAI,EAAE,GAAA,KAAQ,CAAA,CAAE,KAAK,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA;AACtC,QAAA,IAAI,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,SAAa,CAAA,CAAE,IAAA,KAAS,SAAS,EAAA,GAAK,CAAA;AACvD,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,SAAS,OAAA,EAAS;AAC7C,UAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAA,IAAS,MAAM,CAAA,IAAK,CAAA,KAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAA,IAAS,MAAM,CAAA,IAAK,CAAA,CAAA;AAAA,QACzF;AACA,QAAA,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAAA,MACpB,CAAC,CAAA;AACD,MAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAChC,QAAA,GAAA,IAAO,IAAA,CAAK,IAAA;AACZ,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MAChD;AAAA,IACD;AAEA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,IAAI,SAAS,MAAA,EAAW;AACxB,IAAA,IAAI,IAAA,GAAO,KAAK,GAAA,IAAO,KAAA,CAAM,QAAQ,KAAA,CAAM,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,GAAA;AACR;AAIA,IAAM,sBAAA,GAA0E;AAAA,EAC/E,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,EACnC,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,EACrC,aAAA,EAAe,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,MAAA,EAAO;AAAA,EAC5C,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,EAAU;AAAA,EACzC,UAAA,EAAY,EAAE,IAAA,EAAM,aAAA,EAAe,OAAO,eAAA,EAAgB;AAAA,EAC1D,OAAA,EAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAO,eAAA,EAAgB;AAAA,EACxD,UAAA,EAAY,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAO,eAAA;AAC5C,CAAA;AAEA,SAAS,WAAW,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC9E;AAEA,SAAS,eAAe,IAAA,EAAsB;AAC7C,EAAA,OAAO,UAAA,CAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC/C;AAEA,SAAS,iBAAA,CAAkB,MAAgB,IAAA,EAAuC;AACjF,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,KAAK,OAAO,IAAA;AAC7C,EAAA,OAAO;AAAA,IACN,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,CAAA,SAAA,EAAY,cAAA,CAAe,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,IACtC,KAAA,EAAO;AAAA,GACR;AACD;AAEO,SAAS,uBAAuB,QAAA,EAA0B;AAChE,EAAA,IAAI,CAAC,QAAA,EAAU,IAAA,EAAK,EAAG,OAAO,EAAA;AAE9B,EAAA,IAAI;AACH,IAAA,MAAM,EAAA,GAAK,aAAa,QAAA,EAAU;AAAA,MACjC,OAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAgB,IAAA;AAAA,MAChB,YAAA,EAAc,MAAA;AAAA,MACd,gBAAA,EAAkB,EAAA;AAAA,MAClB,SAAA,EAAW;AAAA,KACX,CAAA;AAED,IAAA,OAAO,0BAA0B,EAAA,EAAI;AAAA,MACpC,YAAA,EAAc,sBAAA;AAAA,MACd,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACX,CAAA;AAAA,EACF,SAAS,GAAA,EAAK;AACb,IAAA,OAAA,CAAQ,KAAA,CAAM,sEAAsE,GAAG,CAAA;AAEvF,IAAA,OAAO,WAAW,QAAQ,CAAA;AAAA,EAC3B;AACD;ACvuBA,IAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,cAAA,KAAmB,MAAA;AAE7C,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,+BAAA,GAAkC,EAAA;AAExC,IAAM,6BAAA,GAAgC,KAAK,IAAA,GAAO,IAAA;AAClD,IAAM,qBAAA,GAAwB,GAAA;AAGvB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,uBAAA,GAA0B;AAMhC,SAAS,WAAA,CAAe,OAAA,EAAqB,EAAA,EAAY,aAAA,EAAmC;AAClG,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACvC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC9B,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,aAAa,CAAA,iBAAA,EAAoB,EAAE,IAAI,CAAC,CAAA;AAAA,IAC7D,GAAG,EAAE,CAAA;AAEL,IAAA,OAAA,CACE,IAAA,CAAK,CAAC,KAAA,KAAU;AAChB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACd,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACf,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACF;AAUO,IAAM,eAAA,GAAN,cAA8B,sBAAA,CAAuB;AAAA,EAC3D,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,UAAA;AAAA,EACC,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAGA,cAA2B,EAAC;AAAA,EAC5B,YAAyB,EAAC;AAAA,EAC1B,UAAwB,EAAC;AAAA,EACzB,oBAAiC,EAAC;AAAA,EAClC,gBAAA,GAAmB,CAAA;AAAA,EACnB,kBAAuD,EAAC;AAAA,EACxD,QAAA,GAAW,IAAA;AAAA;AAAA,EAEX,QAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAGA,eAAA,GAAkB,KAAA;AAAA,EAElB,kBAAA,GAAqB;AAAA,IAC5B,SAAS,EAAC;AAAA,IACV,kBAAA,EAAoB,CAAA;AAAA,IACpB,mBAAA,EAAqB,CAAA;AAAA,IACrB,UAAA,EAAY,CAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GAChB;AAAA,EAEA,YAAY,IAAA,EAWT;AACF,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,aAAA,CAAc,IAAA,EAAM,WAAW,EAAE,CAAA;AACpD,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC5B,IAAA,IAAA,CAAK,QAAQ,IAAA,EAAM,KAAA,IAAS,OAAO,OAAA,CAAQ,GAAA,CAAI,aAAa,GAAG,CAAA;AAC/D,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,EAAM,OAAA,IAAW,OAAA,CAAQ,IAAI,WAAA,IAAe,EAAA;AAI3D,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,IAAW,EAAA;AACpC,IAAA,MAAM,iBAAiB,IAAA,EAAM,cAAA;AAC7B,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,CAAC,IAAA,EAAM,QAAA,IAAY,UAAA,IAAc,cAAA,EAAgB;AACpD,MAAA,YAAA,GAAe,cAAA,CAAe,sBAAsB,UAAU,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AACd,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAI,KAAA;AACH,QAAA,OAAA,CAAQ,GAAA;AAAA,UACP,CAAA,KAAA,EAAQ,MAAM,KAAK,CAAA,qFAAA;AAAA,SACpB;AAAA,IACF,CAAA,MAAO;AACN,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA,EAAO,KAAK,OAAA,EAAS;AAAA,QACxE,iBAAA,EAAmB,EAAA;AAAA,QACnB,OAAA,EAAS,EAAA;AAAA,QACT,cAAA,EAAgB,CAAA;AAAA,QAChB,mBAAA,EAAqB;AAAA,OACrB,CAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAW,IAAA,EAAM,QAAA;AACtB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,cAAc,IAAA,EAAM,WAAA;AACzB,IAAA,IAAA,CAAK,gBAAgB,IAAA,EAAM,aAAA;AAC3B,IAAA,IAAA,CAAK,eAAe,IAAA,EAAM,YAAA;AAC1B,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AAGtB,IAAA,IAAI,MAAM,QAAA,EAAU;AACnB,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,oBAAA,CAAqB,WAAmB,QAAA,EAAqC;AAC5E,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,EAAU;AAC5B,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,qBAAA,CAAsB,QAAQ,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,GAAI;AAAA,QACjC,GAAG,QAAA;AAAA,QACH,MAAA,EAAQ,SAAS,MAAA,IAAU;AAAA,OAC5B;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,OAAA,GAAU;AACf,IAAA,IAAI;AAEH,MAAA,IAAI,KAAK,eAAA,EAAiB;AACzB,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,UAAA,OAAA,CAAQ,IAAA;AAAA,YACP,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,+EAAA;AAAA,WACnB;AACA,UAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,UAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA,EAAO,KAAK,OAAA,EAAS;AAAA,YACxE,iBAAA,EAAmB,EAAA;AAAA,YACnB,OAAA,EAAS,EAAA;AAAA,YACT,cAAA,EAAgB,CAAA;AAAA,YAChB,mBAAA,EAAqB;AAAA,WACrB,CAAA;AAAA,QACF,CAAA,MAAO;AACN,UAAA;AAAA,QACD;AAAA,MACD;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,QAAA,IAAI,KAAK,QAAA,EAAU;AAClB,UAAA,MAAM,IAAA,CAAK,OAAO,KAAA,CAAM;AAAA,YACvB,cAAc,IAAA,CAAK;AAAA,WACnB,CAAA;AAAA,QACF,CAAA,MAAO;AACN,UAAA,MAAM,IAAA,CAAK,OAAO,KAAA,CAAM;AAAA,YACvB,WAAA,EAAa,YAAY,MAAM,IAAA,CAAK,OAAO,kCAAkC,CAAA;AAAA,YAC7E,QAAA,EAAU,YAAY,MAAM,IAAA,CAAK,OAAO,8BAA8B,CAAA;AAAA,YACtE,SAAA,EAAW,YAAY,MAAM,IAAA,CAAK,OAAO,sCAAsC,CAAA;AAAA,YAC/E,OAAA,EAAS,CAAC,GAAA,KAAQ,OAAA,CAAQ,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,yBAAA,CAAA,EAA6B,GAAG;AAAA,WAClF,CAAA;AAAA,QACF;AAAA,MACD;AAAA,IACD,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,2CAA2C,KAAK,CAAA;AAChF,MAAA,MAAM,KAAA;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAAiC;AACtC,IAAA,IAAI,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,qDAAA,CAAuD,CAAA;AAChG,MAAA,OAAO,MAAA;AAAA,IACR;AACA,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,IAC9B;AACA,IAAA,OAAO,MAAA;AAAA,EACR;AAAA,EAEA,MAAc,OAAO,QAAA,EAAmC;AACvD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC/B,MAAA,MAAM,QAAA,GAAW,SAAA,CAAQ,UAAe,CAAA,CAAE,eAAA,CAAgB;AAAA,QACzD,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,QAAQ,OAAA,CAAQ;AAAA,OAChB,CAAA;AAED,MAAA,QAAA,CAAS,QAAA,CAAS,QAAA,EAAU,CAAC,MAAA,KAAmB;AAC/C,QAAA,QAAA,CAAS,KAAA,EAAM;AACf,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MACf,CAAC,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAAoC;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,IAC3B;AACA,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACb;AAAA,EAEA,MAAc,mBAAA,CAAoB,KAAA,GAAQ,KAAA,EAAsB;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,IAC3B;AAEA,IAAA,MAAM,aAAA,GACL,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,QAAA;AAEjF,IAAA,IAAI,CAAC,aAAA,EAAe;AACnB,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW;AAAA,MAC5C,KAAA,EAAO;AAAA,KACP,CAAA;AAED,IAAA,MAAM,cAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC7B,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,OAAO,MAAA,EAAQ;AACjC,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,QAAA,EAAS;AACjC,MAAA,MAAM,IAAA,GACL,OAAO,MAAA,KAAW,IAAA,GAAO,YAAY,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,OAAA,GAAU,OAAA,GAAU,SAAA;AACrF,MAAA,MAAM,YAAA,GACL,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,KAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAE5F,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,uBAAA,CAAwB,KAAA,EAAO,OAAO,MAAM,CAAA;AAClE,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,KAAA;AAAA,QACJ,IAAA,EAAM,YAAA;AAAA,QACN,IAAA;AAAA,QACA,UAAU,QAAA,IAAY;AAAA,OACtB,CAAA;AAED,MAAA,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA;AACf,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,GAAA,EAAI;AAAA,EAClC;AAAA;AAAA,EAGQ,aAAa,UAAA,EAA4C;AAChE,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,UAAA,CAAW,YAAY,IAAA,CAAK,QAAA;AAAA,EACjD;AAAA,EAEQ,YAAA,CAAa,OAAoB,EAAA,EAA+B;AACvE,IAAA,MAAM,KAAA,GAAQ,GAAG,QAAA,EAAS;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,IAAA,IAAI,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AACtC,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACd;AAEA,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,OAAO,MAAM,KAAK,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAAA,EAEQ,UAAA,CAAW,KAAA,EAAoB,EAAA,EAAgB,MAAA,EAAsB;AAC5E,IAAA,KAAA,CAAM,EAAA,CAAG,QAAA,EAAU,CAAA,GAAI;AAAA,MACtB,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB;AAAA,EACD;AAAA,EAEQ,sBAAA,CAAuB,IAAY,MAAA,EAAsB;AAChE,IAAA,IAAA,CAAK,iBAAA,CAAkB,EAAE,CAAA,GAAI;AAAA,MAC5B,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB;AACA,IAAA,IAAA,CAAK,0BAAA,CAA2B,IAAI,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEQ,0BAAA,CAA2B,IAAY,MAAA,EAAsB;AACpE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,uBAAA,CAAwB,EAAA,EAAI,MAAM,CAAA;AACxD,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA,GAAI,QAAA;AAAA,IAC5B;AAAA,EACD;AAAA,EAEQ,uBAAA,CAAwB,IAAY,MAAA,EAA4C;AACvF,IAAA,IAAI,MAAA,YAAkB,IAAI,IAAA,EAAM;AAC/B,MAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,IAAA;AACtC,MAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,IAAA;AACpC,MAAA,MAAM,WAAA,GACL,SAAA,IAAa,QAAA,GACV,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG,IAAA,EAAK,GAChC,SAAA,IAAa,QAAA,IAAY,OAAO,QAAA,IAAY,IAAA;AAEhD,MAAA,OAAO;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,QAAA,EAAU,MAAA;AAAA,QACV,YAAY,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,UAAS,GAAI,MAAA;AAAA,QAC/D,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,QAC7B,SAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACD;AAAA,IACD;AAEA,IAAA,IAAI,MAAA,YAAkB,IAAI,OAAA,EAAS;AAClC,MAAA,OAAO;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,QAAA,EAAU,SAAA;AAAA,QACV,YAAY,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,UAAS,GAAI,MAAA;AAAA,QAC/D,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,QAC7B,WAAA,EAAa,OAAO,KAAA,IAAS;AAAA,OAC9B;AAAA,IACD;AAEA,IAAA,IAAI,MAAA,YAAkB,IAAI,IAAA,EAAM;AAC/B,MAAA,OAAO;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,QAAA,EAAU,MAAA;AAAA,QACV,WAAA,EAAa,OAAO,KAAA,IAAS;AAAA,OAC9B;AAAA,IACD;AAEA,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA,EAGQ,gBAAgB,IAAA,EAAuC;AAC9D,IAAA,IAAI,IAAA,YAAgB,IAAI,QAAA,EAAU;AACjC,MAAA,OAAO,IAAI,IAAI,aAAA,CAAc;AAAA,QAC5B,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAA,EAAY,OAAO,CAAC;AAAA,OACpB,CAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,YAAgB,IAAI,QAAA,EAAU;AACjC,MAAA,OAAO,IAAI,GAAA,CAAI,aAAA,CAAc,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,IAAA,YAAgB,IAAI,WAAA,EAAa;AACpC,MAAA,OAAO,IAAI,IAAI,gBAAA,CAAiB;AAAA,QAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,UAAA,EAAY,OAAO,CAAC;AAAA;AAAA,OACpB,CAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAI,IAAI,cAAA,EAAe;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAc,kBAAA,CACb,KAAA,EACA,QAAA,EACyB;AAEzB,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,EAAA;AAEJ,IAAA,IAAI,QAAA,YAAoB,IAAI,QAAA,EAAU;AACrC,MAAA,EAAA,GAAK,QAAA,CAAS,MAAA;AACd,MAAA,SAAA,GAAY,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,QAAA,YAAoB,GAAA,CAAI,QAAA,EAAU;AAC5C,MAAA,EAAA,GAAK,QAAA,CAAS,MAAA;AACd,MAAA,SAAA,GAAY,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,QAAA,YAAoB,GAAA,CAAI,WAAA,EAAa;AAC/C,MAAA,EAAA,GAAK,QAAA,CAAS,SAAA;AACd,MAAA,SAAA,GAAY,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,IAC1C,CAAA,MAAA,IACC,oBAAoB,GAAA,CAAI,aAAA,IACxB,oBAAoB,GAAA,CAAI,aAAA,IACxB,QAAA,YAAoB,GAAA,CAAI,gBAAA,EACvB;AAED,MAAA,IAAI,QAAA,YAAoB,IAAI,aAAA,EAAe;AAC1C,QAAA,EAAA,GAAK,QAAA,CAAS,MAAA;AAAA,MACf,CAAA,MAAA,IAAW,QAAA,YAAoB,GAAA,CAAI,aAAA,EAAe;AACjD,QAAA,EAAA,GAAK,QAAA,CAAS,MAAA;AAAA,MACf,CAAA,MAAO;AACN,QAAA,EAAA,GAAK,QAAA,CAAS,SAAA;AAAA,MACf;AACA,MAAA,SAAA,GAAY,QAAA;AAAA,IACb,CAAA,MAAO;AACN,MAAA,EAAA,GAAK,QAAA;AACL,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,UAAU,QAAQ,CAAA;AACnD,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,EAAA,EAAI,MAAM,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACR;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,EAAE,CAAA;AAChD,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,OAAO,YAAA;AAAA,IACR;AAGA,IAAA,IAAI;AACH,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,UAAU,SAAS,CAAA;AACpD,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,EAAA,EAAI,MAAM,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACR,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,mCAAA,EAAsC,EAAE,KAAK,KAAK,CAAA;AAClF,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAM,WAAA,CAAY,MAAA,EAAuB,EAAA,EAAY,OAAA,EAAgC;AACpF,IAAA,MAAM,KAAK,YAAA,CAAa,MAAA,EAAQ,EAAA,EAAI,CAAC,OAA6B,CAAC,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CAAa,MAAA,EAAuB,EAAA,EAAY,QAAA,EAAmC;AACxF,IAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,cAAA,EAAgB,YAAY;AAC1D,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,QAAA,MAAM,WAAA;AAAA,UACL,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,UACpB,kBAAA;AAAA,UACA,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,2BAAA;AAAA,SACnB;AAAA,MACD;AAEA,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1B,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,aAAY,GAAI,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAC1E,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,UACV,cAAA;AAAA,UACA,uBAAA;AAAA,UACA,CAAA,gDAAA,EAAmD,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAC1E;AAAA,MACD;AACA,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,cAAA,EAAgB,EAAA,EAAI,WAAW,MAAM,CAAA;AAAA,IAClE,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,KAAA,EAAqB,QAAA,EAAoB,cAAc,KAAA,EAAsB;AAChG,IAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,eAAA,EAAiB,YAAY;AAC3D,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,QAAA,MAAM,WAAA;AAAA,UACL,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,UACpB,kBAAA;AAAA,UACA,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,2BAAA;AAAA,SACnB;AAAA,MACD;AAEA,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC1B,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,EAAA,GAAK,MAAM,UAAA,KAAe,OAAA,GAAU,MAAM,MAAA,CAAO,KAAA,CAAM,EAAA,GAAK,KAAA,CAAM,MAAA,CAAO,EAAA;AAC/E,MAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,aAAY,GAAI,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAC1E,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,UACV,eAAA;AAAA,UACA,uBAAA;AAAA,UACA,CAAA,iDAAA,EAAoD,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAC3E;AAAA,MACD;AACA,MAAA,MAAM,KAAK,gBAAA,CAAiB,eAAA,EAAiB,GAAG,QAAA,EAAS,EAAG,WAAW,MAAM,CAAA;AAAA,IAC9E,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CACL,KAAA,EACA,SAAA,EAIE;AAEF,IAAA,MAAM,uBAAuB,SAAA,IAAa,+BAAA;AAE1C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,MAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,gDAAgD,CAAA;AACvE,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,EAAQ;AAC1B,MAAA,MAAM,MAAM,GAAG,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,oBAA4C,EAAC;AAEnD,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,aAAA,EAAe;AAE3C,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAChD,MAAA,IAAA,CAAK,kBAAA,CAAmB,UAAU,UAAA,CAAW,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,EAAE,CAAA;AAE1F,MAAA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB,CAAA;AAC7C,MAAA,IAAA,CAAK,mBAAmB,mBAAA,GAAsB,CAAA;AAE9C,MAAA,IAAA,CAAK,mBAAmB,aAAA,GAAgB,IAAA;AACxC,MAAA,IAAA,CAAK,mBAAmB,UAAA,GAAa,KAAA;AAErC,MAAA,IAAI,KAAA;AACH,QAAA,OAAA,CAAQ,GAAA;AAAA,UACP,QAAQ,IAAA,CAAK,KAAK,qDAAqD,IAAA,CAAK,kBAAA,CAAmB,QAAQ,MAAM,CAAA,cAAA;AAAA,SAC9G;AACD,MAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjD,QAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,6BAAA,CAA+B,CAAA;AACxE,QAAA,IAAA,CAAK,mBAAmB,aAAA,GAAgB,KAAA;AACxC,QAAA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB,CAAA;AAC7C,QAAA,IAAA,CAAK,mBAAmB,mBAAA,GAAsB,CAAA;AAC9C,QAAA,OAAO,EAAE,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,KAAA,EAAM;AAAA,MACtD;AAAA,IACD;AAEA,IAAA,IAAI,EAAE,kBAAA,EAAoB,mBAAA,EAAqB,UAAA,KAAe,IAAA,CAAK,kBAAA;AAEnE,IAAA,MAAM,aAAA,GAAgB,KAAK,kBAAA,CAAmB,OAAA;AAE9C,IAAA,MAAM,uBAAA,GAA0B,CAAA;AAChC,IAAA,MAAM,gBAAA,GAAmB,GAAA;AAEzB,IAAA,KAAA,IAAS,SAAA,GAAY,kBAAA,EAAoB,SAAA,GAAY,aAAA,CAAc,QAAQ,SAAA,EAAA,EAAa;AACvF,MAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,MAAA,IAAI;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,UAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,gDAAgD,CAAA;AACvE,UAAA,MAAM,IAAA,CAAK,OAAO,OAAA,EAAQ;AAC1B,UAAA,MAAM,MAAM,GAAG,CAAA;AAAA,QAChB;AAGA,QAAA,IAAI,YAAY,kBAAA,EAAoB;AACnC,UAAA,MAAM,MAAM,gBAAgB,CAAA;AAAA,QAC7B;AAGA,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAO,EAAA,EAAI;AAAA,UAC5D,UAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACT,CAAA;AACD,QAAA,IAAI,KAAA;AACH,UAAA,OAAA,CAAQ,GAAA;AAAA,YACP,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,qBAAA,EAAwB,YAAY,MAAM,CAAA,2BAAA,EAA8B,OAAO,EAAE,CAAA;AAAA,WACpG;AAED,QAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,SAAA,IAAa,EAAA,EAAI;AAChD,UAAA;AAAA,QACD;AAGA,QAAA,MAAM,WAAA,GAAc,mBAAA;AACpB,QAAA,IAAI,kBAAA,GAAqB,CAAA;AAEzB,QAAA,KAAA,IAAS,MAAA,GAAS,WAAA,EAAa,MAAA,GAAS,WAAA,CAAY,QAAQ,MAAA,EAAA,EAAU;AACrE,UAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AAEjC,UAAA,IAAI,EAAE,MAAA,YAAkB,GAAA,CAAI,OAAA,CAAA,EAAU;AAEtC,UAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAC1D,UAAA,IAAI,aAAA,IAAiB,CAAC,cAAA,CAAe,aAAa,CAAA,EAAG;AACpD,YAAA,iBAAA,CAAkB,KAAK,aAAa,CAAA;AACpC,YAAA,kBAAA,EAAA;AAEA,YAAA,IAAI,iBAAA,CAAkB,UAAU,oBAAA,EAAsB;AACrD,cAAA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB,SAAA;AAC7C,cAAA,IAAA,CAAK,kBAAA,CAAmB,sBAAsB,MAAA,GAAS,CAAA;AACvD,cAAA,IAAI,KAAA;AACH,gBAAA,OAAA,CAAQ,GAAA;AAAA,kBACP,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,cAAA,EAAiB,oBAAoB,2BAA2B,MAAA,CAAO,EAAE,CAAA,SAAA,EAAY,MAAA,GAAS,CAAC,CAAA;AAAA,iBAClH;AACD,cAAA,OAAO;AAAA,gBACN,QAAA,EAAU,iBAAA;AAAA,gBACV,OAAA,EAAS;AAAA,eACV;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAIA,QAAA,IAAI,kBAAA,GAAqB,uBAAA,IAA2B,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAC3E,UAAA,MAAM,cAAc,uBAAA,GAA0B,kBAAA;AAC9C,UAAA,IAAI,KAAA;AACH,YAAA,OAAA,CAAQ,GAAA;AAAA,cACP,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,oBAAA,EAAuB,OAAO,EAAE,CAAA,UAAA,EAAa,kBAAkB,CAAA,oBAAA,EAAuB,WAAW,CAAA,yBAAA;AAAA,aACpH;AAGD,UAAA,MAAM,MAAM,gBAAgB,CAAA;AAG5B,UAAA,IAAI;AACH,YAAA,MAAM,qBAAqB,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAO,EAAA,EAAI;AAAA,cACnE,KAAA,EAAO;AAAA,aACP,CAAA;AAGD,YAAA,KAAA,MAAW,UAAU,kBAAA,EAAoB;AACxC,cAAA,IAAI,EAAE,MAAA,YAAkB,GAAA,CAAI,OAAA,CAAA,EAAU;AACtC,cAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAC1D,cAAA,IAAI,aAAA,IAAiB,CAAC,cAAA,CAAe,aAAa,CAAA,EAAG;AACpD,gBAAA,iBAAA,CAAkB,KAAK,aAAa,CAAA;AACpC,gBAAA,kBAAA,EAAA;AACA,gBAAA,IAAI,iBAAA,CAAkB,UAAU,oBAAA,EAAsB;AACrD,kBAAA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB,SAAA;AAC7C,kBAAA,IAAA,CAAK,kBAAA,CAAmB,sBAAsB,WAAA,CAAY,MAAA;AAC1D,kBAAA,IAAI,KAAA;AACH,oBAAA,OAAA,CAAQ,GAAA;AAAA,sBACP,QAAQ,IAAA,CAAK,KAAK,iBAAiB,oBAAoB,CAAA,wBAAA,EAA2B,OAAO,EAAE,CAAA;AAAA,qBAC5F;AACD,kBAAA,OAAO;AAAA,oBACN,QAAA,EAAU,iBAAA;AAAA,oBACV,OAAA,EAAS;AAAA,mBACV;AAAA,gBACD;AAAA,cACD;AAAA,YACD;AAEA,YAAA,IAAI,KAAA;AACH,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACP,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,MAAM,CAAA,gCAAA,EAAmC,MAAA,CAAO,EAAE,CAAA,SAAA,EAAY,kBAAkB,CAAA;AAAA,eAC9I;AAAA,UACF,SAAS,KAAA,EAAO;AACf,YAAA,OAAA,CAAQ,IAAA;AAAA,cACP,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,4DAAA,EAA+D,OAAO,EAAE,CAAA,CAAA,CAAA;AAAA,cAC1F;AAAA,aACD;AAAA,UACD;AAAA,QACD;AAEA,QAAA,mBAAA,GAAsB,CAAA;AACtB,QAAA,IAAA,CAAK,mBAAmB,mBAAA,GAAsB,CAAA;AAC9C,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAqB,SAAA,GAAY,CAAA;AAAA,MAC1D,SAAS,KAAA,EAAO;AAEf,QAAA,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAK,8BAA8B,MAAA,CAAO,EAAE,KAAK,KAAK,CAAA;AACjF,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAqB,SAAA,GAAY,CAAA;AACzD,QAAA,IAAA,CAAK,mBAAmB,mBAAA,GAAsB,CAAA;AAAA,MAC/C;AAAA,IACD;AAEA,IAAA,IAAI,KAAA;AACH,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,6CAAA,EAAgD,kBAAkB,MAAM,CAAA,SAAA;AAAA,OAC3F;AACD,IAAA,IAAA,CAAK,mBAAmB,aAAA,GAAgB,KAAA;AACxC,IAAA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB,CAAA;AAC7C,IAAA,IAAA,CAAK,mBAAmB,mBAAA,GAAsB,CAAA;AAE9C,IAAA,OAAO;AAAA,MACN,QAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV;AAAA,EACD;AAAA,EAEA,MAAM,oBAAA,CAAqB,KAAA,GAAQ,CAAA,EAGhC;AACF,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,eAAe,UAAA,EAAqD;AACzE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,IAC3B;AAEA,IAAA,MAAM,oBAA4C,EAAC;AACnD,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAE/C,IAAA,IAAI,KAAA,UAAe,GAAA,CAAI,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,qBAAA,EAAwB,OAAA,CAAQ,MAAM,CAAA,QAAA,CAAU,CAAA;AAEzF,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,MAAM,gBAAA,GAAmB,GAAA;AAEzB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC7B,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,OAAO,EAAA,EAAI;AACjC,QAAA,WAAA,IAAe,CAAA;AACf,QAAA;AAAA,MACD;AAGA,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,EAAA,EAAI,OAAO,MAAM,CAAA;AAGxD,MAAA,IAAI,cAAc,CAAA,EAAG;AACpB,QAAA,MAAM,MAAM,gBAAgB,CAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAO,EAAA,EAAI;AAAA,QACzD,UAAA,EAAY,UAAA;AAAA,QACZ,OAAA,EAAS;AAAA,OACT,CAAA;AAED,MAAA,IAAI,KAAA;AACH,QAAA,OAAA,CAAQ,GAAA;AAAA,UACP,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,qBAAA,EAAwB,SAAS,MAAM,CAAA,2BAAA,EAA8B,OAAO,EAAE,CAAA;AAAA,SACjG;AAID,MAAA,IAAK,SAAS,MAAA,KAAW,CAAA,IAAK,WAAA,IAAe,EAAA,IAAO,eAAe,cAAA,EAAgB;AAClF,QAAA;AAAA,MACD;AACA,MAAA,WAAA,IAAe,CAAA;AAEf,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC3B,QAAA,IAAI,YAAY,eAAA,EAAiB;AAChC,UAAA;AAAA,QACD;AACA,QAAA,IAAI,GAAA,YAAe,IAAI,OAAA,EAAS;AAC/B,UAAA,QAAA,IAAY,CAAA;AACZ,UAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AACvD,UAAA,IAAI,aAAA,IAAiB,CAAC,cAAA,CAAe,aAAa,CAAA,EAAG;AACpD,YAAA,iBAAA,CAAkB,KAAK,aAAa,CAAA;AAAA,UACrC;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAI,KAAA;AACH,MAAA,OAAA,CAAQ,GAAA;AAAA,QACP,QAAQ,IAAA,CAAK,KAAK,wBAAwB,iBAAA,CAAkB,MAAM,8BAA8B,eAAe,CAAA,CAAA;AAAA,OAChH;AACD,IAAA,OAAO,iBAAA;AAAA,EACR;AAAA,EAEA,MAAM,cAAA,CAAe,IAAA,GAAO,CAAA,EAAoC;AAC/D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA,IAAQ,GAAI,CAAA;AAC9E,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,eAAA,CAAgB,KAAA,GAAQ,CAAA,EAAoC;AACjE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,KAAQ,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,GAAA,IAAQ,GAAI,CAAA;AAC1E,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAc,kBAAA,CACb,OAAA,EACA,KAAA,GAAQ,CAAA,EACR,WAAW,CAAA,EAC4B;AACvC,IAAA,IAAI;AAEH,MAAA,MAAM,IAAA,GACJ,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,SAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,IAC5D,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAQ,MAAM,CAAA;AAC5C,MAAA,IAAI,CAAC,IAAA,EAAM;AACV,QAAA,OAAO,IAAA;AAAA,MACR;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAI5C,MAAA,IAAI,QAAA,KAAa,SAAA,IAAa,IAAA,YAAgB,GAAA,CAAI,IAAA,EAAM;AACvD,QAAA,IAAI;AAEH,UAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACpB,YAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AACnC,YAAA,IAAA,CAAK,YAAY,EAAA,CAAG,EAAA;AAAA,UACrB;AACA,UAAA,IAAI,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAEnC,YAAA,OAAO,IAAA;AAAA,UACR;AAAA,QACD,SAAS,KAAA,EAAO;AACf,UAAA,OAAA,CAAQ,IAAA;AAAA,YACP,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,6DAAA,CAAA;AAAA,YAClB;AAAA,WACD;AAAA,QACD;AAAA,MACD;AAGA,MAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,MAAA,IAAI,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,OAAA,EAAS;AACnD,QAAA,IAAI,QAAQ,MAAA,EAAQ;AACnB,UAAA,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,WAAA,EAAa,QAAQ,MAAM,CAAA;AAAA,QACxE;AAAA,MACD,CAAA,MAAO;AACN,QAAA,IAAI,QAAQ,QAAA,EAAU;AACrB,UAAA,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,WAAA,EAAa,QAAQ,QAAQ,CAAA;AAAA,QAC1E;AAAA,MACD;AAEA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACtC,MAAA,MAAM,YAAA,GAAe,UAAA,IAAc,IAAA,GAAO,IAAA,CAAK,QAAA,GAAW,IAAA;AAE1D,MAAA,MAAM,OAAA,GAAU;AAAA,QACf,IAAI,OAAA,CAAQ,EAAA;AAAA;AAAA,QACZ,MAAA,EACC,aAAa,SAAA,GACT,UAAA,IAAc,WACd,UAAA,IAAc,YAAA,IAAgB,CAAA,eAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA,EAAM,QAAQ,OAAA,IAAW,EAAA;AAAA,QACzB,WAAW,OAAA,CAAQ,IAAA;AAAA;AAAA,QAEnB,YAAY,OAAA,CAAQ;AAAA,OACrB;AAEA,MAAA,IAAI,QAAQ,MAAA,CAAO,QAAA,CAAS,gBAAgB,CAAA,IAAK,QAAQ,QAAA,EAAU;AAClE,QAAA,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,WAAA,EAAa,QAAQ,QAAQ,CAAA;AACzE,QAAA,MAAMA,WAAAA,GAAa,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAC5C,QAAA,IAAIA,WAAAA,EAAY;AACf,UAAA,OAAA,CAAQ,MAAA,GAASA,WAAAA;AAAA,QAClB;AAAA,MACD;AAEA,MAAA,IAAI,MAAA,GAAsC,IAAA;AAE1C,MAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,KAAA,GAAQ,QAAA,EAAU;AAC7C,QAAA,IAAI;AACH,UAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,QAAQ,MAAA,EAAQ;AAAA,YACnE,KAAK,OAAA,CAAQ;AAAA,WACb,CAAA;AACD,UAAA,IAAI,cAAc,MAAA,GAAS,CAAA,IAAK,cAAc,CAAC,CAAA,YAAa,IAAI,OAAA,EAAS;AACxE,YAAA,MAAA,GAAS,MAAM,KAAK,kBAAA,CAAmB,aAAA,CAAc,CAAC,CAAA,EAAG,KAAA,GAAQ,GAAG,QAAQ,CAAA;AAAA,UAC7E;AAAA,QACD,SAAS,KAAA,EAAO;AAAA,QAAC;AAAA,MAClB;AACA,MAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA,GAAI,UAAU,EAAE,GAAG,SAAS,MAAA,EAAO;AAEvE,MAAA,MAAM,WAAA,GAAc,UAAU,CAAA,GAAI,MAAM,KAAK,6BAAA,CAA8B,OAAO,IAAI,EAAC;AACvF,MAAA,OAAO,YAAY,MAAA,GAAS,CAAA,GAAI,EAAE,GAAG,MAAA,EAAQ,aAAY,GAAI,MAAA;AAAA,IAC9D,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,+CAA+C,KAAK,CAAA;AACpF,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,EACD;AAAA;AAAA,EAGQ,kBAAkB,IAAA,EAA2D;AACpF,IAAA,IAAI,IAAA,YAAgB,GAAA,CAAI,IAAA,EAAM,OAAO,SAAA;AACrC,IAAA,IAAI,IAAA,YAAgB,GAAA,CAAI,IAAA,EAAM,OAAO,OAAA;AACrC,IAAA,IAAI,IAAA,YAAgB,GAAA,CAAI,OAAA,EAAS,OAAO,SAAA;AACxC,IAAA,OAAO,SAAA;AAAA,EACR;AAAA;AAAA,EAGQ,YAAY,IAAA,EAAsB;AACzC,IAAA,IAAI,IAAA,YAAgB,IAAI,IAAA,EAAM;AAC7B,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAA,IAAa,EAAE,IAAI,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK;AACnE,MAAA,IAAI,MAAM,OAAO,IAAA;AAEjB,MAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,CAAA,EAAI,KAAK,QAAQ,CAAA,CAAA;AAC3C,MAAA,OAAO,cAAA;AAAA,IACR;AACA,IAAA,IAAI,IAAA,YAAgB,IAAI,IAAA,EAAM;AAE7B,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,EAAA,EAAI,QAAA,EAAS;AACjC,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,KAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,kBAAA,EAAqB,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAChG,QAAA,OAAO,QAAQ,MAAM,CAAA,CAAA;AAAA,MACtB;AACA,MAAA,OAAO,cAAA;AAAA,IACR;AACA,IAAA,IAAI,IAAA,YAAgB,IAAI,OAAA,EAAS;AAEhC,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAC5B,MAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,CAAA,EAAI,KAAK,QAAQ,CAAA,CAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,EAAA,EAAI,QAAA,EAAS;AACpC,MAAA,IAAI,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,IAAA;AAAA,UACP,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,qBAAA,EAAwB,SAAS,CAAA,iDAAA;AAAA,SACpD;AACA,QAAA,OAAO,WAAW,SAAS,CAAA,CAAA;AAAA,MAC5B;AACA,MAAA,OAAO,cAAA;AAAA,IACR;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,gDAAA,CAAA,EAAoD,MAAM,SAAS,CAAA;AAClG,IAAA,OAAO,cAAA;AAAA,EACR;AAAA,EAEQ,cAAc,MAAA,EAAsC;AAC3D,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,IAAI,MAAA,YAAkB,IAAI,IAAA,EAAM;AAC/B,MAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,QAAA,EAAU;AACxC,QAAA,OAAO,CAAA,EAAG,OAAO,SAAA,IAAa,EAAE,IAAI,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAClE;AACA,MAAA,OAAO,OAAO,QAAA,IAAY,EAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAA,YAAkB,IAAI,OAAA,EAAS;AAClC,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IACf;AACA,IAAA,IAAI,MAAA,YAAkB,IAAI,IAAA,EAAM;AAC/B,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA,EAGA,UAAA,GAAmB;AAClB,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACnB;AAAA,EAEQ,eAAe,OAAA,EAAoC;AAC1D,IAAA,OACC,OAAO,OAAA,KAAY,QAAA,IACnB,YAAY,IAAA,IACZ,KAAA,IAAS,WACT,EAAE,QAAA,IAAY,YACd,EAAE,MAAA,IAAU,YACZ,OAAQ,OAAA,CAAkB,QAAQ,QAAA,IACjC,OAAA,CAAkB,IAAI,MAAA,GAAS,CAAA;AAAA,EAElC;AAAA,EAEQ,kBAAkB,QAAA,EAIxB;AACD,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,MAAM,SAAkB,EAAC;AACzB,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC/B,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA,EAAG;AACjC,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,IAAA,GAAO,2BAA2B,OAAO,CAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,EAAG;AAC3B,QAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACvC,QAAA,WAAA,CAAY,IAAA,CAAK,0BAAA,CAA2B,OAAO,CAAC,CAAA;AAAA,MACrD;AAAA,IACD;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAY;AAAA,EACzC;AAAA,EAEQ,cAAc,KAAA,EAAsB;AAC3C,IAAA,IAAI,MAAM,EAAA,IAAM,KAAA,CAAM,GAAG,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,KAAA,CAAM,EAAA;AAAA,IACd;AAEA,IAAA,IAAI,MAAM,IAAA,EAAM;AACf,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACrC,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC9C,MAAA,IAAI,WAAW,OAAO,SAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAM,GAAA,EAAK;AACd,MAAA,IAAI;AACH,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC7B,QAAA,MAAM,WAAW,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AAC7C,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAC3C,UAAA,OAAO,QAAA;AAAA,QACR;AAAA,MACD,SAAS,KAAA,EAAO;AACf,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,kDAAkD,KAAK,CAAA;AAAA,MACvF;AAAA,IACD;AAEA,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,IAAA,CAAA;AAAA,EAC3B;AAAA,EAEQ,oBAAoB,KAAA,EAA6B;AACxD,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAClB,MAAA,OAAO,IAAA;AAAA,IACR;AAEA,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,KAAQ,KAAA,CAAM,MAAA;AAExF,IAAA,IAAI,CAAC,YAAA,EAAc;AAClB,MAAA,OAAO,IAAA;AAAA,IACR;AAEA,IAAA,IAAI;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,sDAAsD,KAAK,CAAA;AAC3F,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAc,oBAAoB,OAAA,EAA8C;AAC/E,IAAA,IAAI;AACH,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,cAAc,OAAO,CAAA;AACtD,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,QAAA,OAAO,MAAA;AAAA,MACR;AACA,MAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC/B,QAAA,MAAM,EAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,QAAA,OAAO,MAAM,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA;AAAA,MAChC;AACA,MAAA,OAAO,IAAA;AAAA,IACR,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,gDAAgD,KAAK,CAAA;AACrF,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAc,8BAA8B,OAAA,EAA6C;AACxF,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,aAAA,EAAe;AAC7C,MAAA,OAAO,EAAC;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AACnB,MAAA,OAAO,EAAC;AAAA,IACT;AAEA,IAAA,MAAM,cAA4B,EAAC;AAEnC,IAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,EAAgB,QAAA,EAAkB,QAAA,KAAqB;AACpF,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,aAAA,EAAe;AAC7C,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,kBAAkB,aAAa;AAAA,QACpC,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,QAAA;AAAA,QACb,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAEA,MAAA,IAAI,KAAK,YAAA,EAAc;AACtB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe;AAAA,UACrD,MAAA,EAAQ,UAAA;AAAA,UACR,QAAQ,IAAA,CAAK,WAAA;AAAA,UACb,YAAA,EAAc,6BAAA;AAAA,UACd,YAAA,EAAc,QAAA;AAAA,UACd,gBAAA,EAAkB,QAAA;AAAA,UAClB,kBAAA,EAAoB;AAAA,SACpB,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACP,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,uCAAA,EAA0C,OAAO,MAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,UAAA,EAAa,QAAQ,CAAA;AAAA,WACpH;AACA,UAAA;AAAA,QACD;AAEA,QAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACvB,UAAA;AAAA,QACD;AAEA,QAAA,MAAM,WAAW,MAAA,CAAO,UAAA;AACxB,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UAChB,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,KAAK,QAAA,CAAS,GAAA;AAAA,UACd,aAAa,QAAA,CAAS,WAAA;AAAA,UACtB,aAAa,QAAA,CAAS,WAAA;AAAA,UACtB,WAAW,QAAA,CAAS,SAAA;AAAA,UACpB,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,MAAA,EAAQ;AAAA,SACR,CAAA;AAAA,MACF;AAAA,IACD,CAAA;AAEA,IAAA,IAAI,OAAA,CAAQ,KAAA,YAAiB,GAAA,CAAI,iBAAA,EAAmB;AACnD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACrD,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,MAAM,WAAW,CAAA,eAAA,EAAkB,OAAA,CAAQ,EAAA,IAAM,IAAA,CAAK,KAAK,CAAA,IAAA,CAAA;AAC3D,QAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,QAAA,EAAU,YAAY,CAAA;AAAA,MACpD;AACA,MAAA,OAAO,WAAA;AAAA,IACR;AAEA,IAAA,IAAI,OAAA,CAAQ,KAAA,YAAiB,GAAA,CAAI,oBAAA,EAAsB;AACtD,MAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,CAAM,QAAA;AAC/B,MAAA,IAAI,CAAC,QAAA,IAAY,EAAE,QAAA,YAAoB,IAAI,QAAA,CAAA,EAAW;AACrD,QAAA,OAAO,WAAA;AAAA,MACR;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACrD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,QAAA,OAAO,WAAA;AAAA,MACR;AAEA,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,0BAAA;AACtC,MAAA,IAAI,QAAA,GAAW,iBAAiB,QAAA,CAAS,EAAA,IAAM,QAAQ,EAAA,IAAM,IAAA,CAAK,KAAK,CAAA,CAAA;AAEvE,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,UAAA,IAAc,EAAC,EAAG;AAC7C,QAAA,IAAI,IAAA,YAAgB,IAAI,yBAAA,EAA2B;AAClD,UAAA,QAAA,GAAW,IAAA,CAAK,QAAA;AAChB,UAAA;AAAA,QACD;AAAA,MACD;AAEA,MAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AAC/C,MAAA,OAAO,WAAA;AAAA,IACR;AAEA,IAAA,OAAO,WAAA;AAAA,EACR;AAAA,EAEA,MAAc,oBAAoB,KAAA,EAA4C;AAC7E,IAAA,IAAI,MAAM,MAAA,EAAQ;AACjB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAC7C,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AACrC,QAAA,OAAO,IAAI,UAAA,CAAW,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,IAAI,MAAM,CAAA;AAAA,MACtD;AAAA,IACD;AAEA,IAAA,IAAI,MAAM,IAAA,EAAM;AACf,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACd;AAEA,IAAA,IAAI,MAAM,GAAA,EAAK;AACd,MAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IACd;AAEA,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,2BAA2B,SAAA,EAA+C;AACvF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AAE/C,IAAA,IAAI,CAAC,QAAA,EAAU;AAEd,MAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,SAAS,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAErC,IAAA,IAAI,QAAA,CAAS,aAAa,MAAA,EAAQ;AACjC,MAAA,IAAI,SAAS,UAAA,EAAY;AACxB,QAAA,OAAO,IAAI,IAAI,aAAA,CAAc;AAAA,UAC5B,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,MAAA,CAAO,QAAA,CAAS,UAAU;AAAA,SACtC,CAAA;AAAA,MACF;AAEA,MAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,SAAA,EAAW,QAAQ,MAAM,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,QAAA,CAAS,aAAa,SAAA,EAAW;AACpC,MAAA,IAAI,SAAS,UAAA,EAAY;AACxB,QAAA,OAAO,IAAI,IAAI,gBAAA,CAAiB;AAAA,UAC/B,SAAA,EAAW,MAAA;AAAA,UACX,UAAA,EAAY,MAAA,CAAO,QAAA,CAAS,UAAU;AAAA,SACtC,CAAA;AAAA,MACF;AAEA,MAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,SAAA,EAAW,QAAQ,SAAS,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,QAAA,CAAS,aAAa,MAAA,EAAQ;AAGjC,MAAA,IAAI,MAAA,CAAO,YAAW,EAAG;AAExB,QAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,SAAA,EAAW,QAAQ,SAAS,CAAA;AAAA,MACxE;AACA,MAAA,OAAO,IAAI,IAAI,aAAA,CAAc;AAAA,QAC5B,MAAA,EAAQ;AAAA,OACR,CAAA;AAAA,IACF;AAGA,IAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,SAAS,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,wBAAA,CACb,SAAA,EACA,cAAA,EACA,YAAA,EAC6B;AAC7B,IAAA,IAAI;AACH,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC3B,QAAA,MAAM,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,MAC3B;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,UAAU,SAAS,CAAA;AACpD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,SAAS,CAAA,CAAE,CAAA;AAAA,MAC/D;AAGA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,MAAM,CAAA;AAC/D,MAAA,IAAI,QAAA,EAAU;AACb,QAAA,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,GAAI,QAAA;AAAA,MACnC;AAGA,MAAA,IAAI,MAAA,YAAkB,IAAI,IAAA,EAAM;AAC/B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,EAAA,CAAG,OAAA,EAAQ;AACjC,QAAA,MAAM,UAAA,GAAa,OAAO,UAAA,GAAa,MAAA,CAAO,OAAO,UAAU,CAAA,GAAI,OAAO,CAAC,CAAA;AAC3E,QAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,aAAA,CAAc;AAAA,UACvC,MAAA,EAAQ,OAAO,MAAM,CAAA;AAAA,UACrB;AAAA,SACA,CAAA;AACD,QAAA,OAAO,SAAA;AAAA,MACR;AAEA,MAAA,IAAI,MAAA,YAAkB,IAAI,OAAA,EAAS;AAClC,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,EAAA,CAAG,OAAA,EAAQ;AACpC,QAAA,MAAM,UAAA,GAAa,OAAO,UAAA,GAAa,MAAA,CAAO,OAAO,UAAU,CAAA,GAAI,OAAO,CAAC,CAAA;AAC3E,QAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,gBAAA,CAAiB;AAAA,UAC1C,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,UAC3B;AAAA,SACA,CAAA;AACD,QAAA,OAAO,SAAA;AAAA,MACR;AAEA,MAAA,IAAI,MAAA,YAAkB,IAAI,IAAA,EAAM;AAC/B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,EAAA,CAAG,OAAA,EAAQ;AACjC,QAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,aAAA,CAAc;AAAA,UACvC,MAAA,EAAQ,OAAO,MAAM;AAAA,SACrB,CAAA;AACD,QAAA,OAAO,SAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAE,CAAA;AAAA,IACtE,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,0CAAA,EAA6C,SAAS,KAAK,KAAK,CAAA;AAChG,MAAA,MAAM,IAAI,KAAA;AAAA,QACT,oCAAoC,SAAS,CAAA,qDAAA;AAAA,OAC9C;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAc,gBAAA,CACb,SAAA,EACA,IAAA,EACA,WACA,MAAA,EACgB;AAChB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAGvC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,0BAAA,CAA2B,IAAI,CAAA;AAE5D,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACxB,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACtB,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,WAAA;AAAA,QACL,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,SAAA,EAAW;AAAA,UAClC,OAAA,EAAS,uBAAuB,IAAI,CAAA;AAAA,UACpC,SAAA,EAAW;AAAA,SACX,CAAA;AAAA,QACD,uBAAA;AAAA,QACA,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,+BAAA;AAAA,OACnB;AACA,MAAA,IAAI,KAAA,EAAO;AACV,QAAA,OAAA,CAAQ,IAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,0CAAA,EAA6C,IAAI,CAAA,CAAE,CAAA;AAAA,MAClF;AACA,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,MAAA;AACzC,IAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AACnD,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACH,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAAA,MAChD,SAAS,KAAA,EAAO;AACf,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,kDAAkD,KAAK,CAAA;AACvF,QAAA,MAAM,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,KAAA,EAAO;AAAA,UAC3C,YAAA,EAAc;AAAA,SACd,CAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAqD;AAAA,QAC1D,IAAA,EAAM;AAAA,OACP;AAEA,MAAA,IAAI,KAAA,KAAU,KAAK,OAAA,EAAS;AAC3B,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,MACnB;AAEA,MAAA,MAAM,WAAA;AAAA,QACL,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,OAAO,CAAA;AAAA,QACvC,uBAAA;AAAA,QACA,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,4BAAA;AAAA,OACnB;AAEA,MAAA,IAAI,KAAA,KAAU,KAAK,OAAA,EAAS;AAC3B,QAAA,gBAAA,GAAmB,IAAA;AAAA,MACpB;AAEA,MAAA,IAAI,KAAA,EAAO;AACV,QAAA,OAAA,CAAQ,IAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,uCAAA,EAA0C,IAAI,CAAA,CAAE,CAAA;AAAA,MAC/E;AAAA,IACD;AAEA,IAAA,IAAI,OAAA,IAAW,CAAC,gBAAA,EAAkB;AACjC,MAAA,MAAM,WAAA;AAAA,QACL,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,SAAA,EAAW;AAAA,UAClC,OAAA,EAAS,uBAAuB,IAAI,CAAA;AAAA,UACpC,SAAA,EAAW;AAAA,SACX,CAAA;AAAA,QACD,uBAAA;AAAA,QACA,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAA,+BAAA;AAAA,OACnB;AACA,MAAA,IAAI,KAAA,EAAO;AACV,QAAA,OAAA,CAAQ,IAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,kDAAA,EAAqD,IAAI,CAAA,CAAE,CAAA;AAAA,MAC1F;AAAA,IACD;AAAA,EACD;AACD;AASO,SAAS,2BAA2B,OAAA,EAA0B;AACpE,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAChC,IAAA,OAAO,OAAA;AAAA,EACR;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACtB,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,EAChB;AACA,EAAA,IAAI,YAAY,OAAA,EAAS;AACxB,IAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI,WAAW,OAAA,EAAS;AACvB,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,2BAA2B,IAA0B,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EACnG;AACA,EAAA,OAAO,EAAA;AACR;AAEA,SAAS,2BAA2B,OAAA,EAA0B;AAC7D,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,SAAiB,OAAO,OAAA;AAC3D,EAAA,IAAI,MAAA,IAAU,OAAA,IAAW,KAAA,IAAS,OAAA,EAAS,OAAO,MAAA;AAClD,EAAA,IAAI,QAAA,IAAY,OAAA,IAAW,KAAA,IAAS,OAAA,EAAS,OAAO,OAAA;AACpD,EAAA,IAAI,QAAA,IAAY,SAAS,OAAO,OAAA;AAChC,EAAA,IAAI,MAAA,IAAU,OAAA,IAAW,IAAA,IAAQ,OAAA,EAAS,OAAO,QAAA;AACjD,EAAA,IAAI,SAAA,IAAa,OAAA,IAAW,OAAA,IAAW,OAAA,EAAS,OAAO,SAAA;AACvD,EAAA,IAAI,MAAA,IAAU,OAAA,IAAW,MAAA,IAAU,OAAA,EAAS,OAAO,OAAA;AACnD,EAAA,OAAO,SAAA;AACR;AAEO,SAAS,8BAA8B,OAAA,EAAgC;AAC7E,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACrB,IAAA,IAAI,QAAQ,KAAA,EAAO;AAClB,MAAA,QAAA,CAAS,KAAK,iBAAiB,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,QAAA;AAAA,EACR;AAEA,EAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,OAAO,CAAA;AAE7B,EAAA,IAAI,QAAQ,QAAA,EAAU;AACrB,IAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,QAAA,EAAU;AACtC,MAAA,IAAI,MAAA,YAAkB,IAAI,oBAAA,EAAsB;AAC/C,QAAA,MAAM,cAAc,OAAA,CAAQ,OAAA,CAAQ,OAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AACvE,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAA,CAAY,QAAQ,GAAA,EAAK,EAAE,GAAS,CAAA;AAAA,MAC7D;AAAA,IACD;AAAA,EACD;AAEA,EAAA,OAAO,QAAA;AACR","file":"adapter.js","sourcesContent":["/**\n * Markdown → Telegram HTML converter.\n *\n * Architecture (from OpenClaw):\n * 1. Parse markdown with markdown-it → token stream\n * 2. Convert tokens to an IR: { text, styles: [{start,end,style}], links: [{start,end,href}] }\n * 3. Render IR → Telegram HTML using a boundary-based stack\n *\n * This approach properly handles overlapping styles (e.g. **bold [link](url)**)\n * by ranking styles and rendering from outermost to innermost.\n */\n\nimport MarkdownIt from \"markdown-it\";\n\n// Minimal Token interface matching markdown-it's Token class\ninterface Token {\n\ttype: string;\n\ttag: string;\n\tcontent: string;\n\tchildren: Token[] | null;\n\tattrs?: [string, string][];\n\tattrGet?: (name: string) => string | null;\n}\n\n// ─── IR types ────────────────────────────────────────────────────────────────\n\ninterface StyleSpan {\n\tstart: number;\n\tend: number;\n\tstyle: \"bold\" | \"italic\" | \"strikethrough\" | \"code\" | \"code_block\" | \"blockquote\" | \"spoiler\";\n}\n\ninterface LinkSpan {\n\tstart: number;\n\tend: number;\n\thref: string;\n}\n\ninterface MarkdownIR {\n\ttext: string;\n\tstyles: StyleSpan[];\n\tlinks: LinkSpan[];\n}\n\n// ─── markdown-it setup ────────────────────────────────────────────────────────\n\nfunction createMarkdownIt(): MarkdownIt {\n\tconst md = new MarkdownIt({\n\t\thtml: false,\n\t\tlinkify: true,\n\t\tbreaks: false,\n\t\ttypographer: false,\n\t});\n\tmd.enable(\"strikethrough\");\n\tmd.enable(\"table\");\n\treturn md;\n}\n\n// ─── Token → IR conversion ──────────────────────────────────────────────────\n\ninterface ListEntry {\n\ttype: \"bullet\" | \"ordered\";\n\tindex: number;\n}\n\ninterface TableCellIR {\n\ttext: string;\n\tstyles: StyleSpan[];\n\tlinks: LinkSpan[];\n}\n\ninterface TableIR {\n\theaders: TableCellIR[];\n\trows: TableCellIR[][];\n\tcurrentRow: TableCellIR[];\n\tcurrentCell: {\n\t\ttext: string;\n\t\tstyles: StyleSpan[];\n\t\tlinks: LinkSpan[];\n\t\topenStyles: { style: StyleSpan[\"style\"]; start: number }[];\n\t\tlinkStack: { href: string; labelStart: number }[];\n\t} | null;\n\tinHeader: boolean;\n}\n\ninterface RenderState {\n\ttext: string;\n\tstyles: StyleSpan[];\n\topenStyles: { style: StyleSpan[\"style\"]; start: number }[];\n\tlinks: LinkSpan[];\n\tlinkStack: { href: string; labelStart: number }[];\n\tlistStack: ListEntry[];\n\theadingStyle: \"none\" | \"bold\";\n\tblockquotePrefix: string;\n\ttable: TableIR | null;\n\ttableMode: \"off\" | \"bullets\" | \"code\";\n\tspoilerEnabled: boolean;\n}\n\nfunction initCellState(): {\n\ttext: string;\n\tstyles: StyleSpan[];\n\topenStyles: { style: StyleSpan[\"style\"]; start: number }[];\n\tlinks: LinkSpan[];\n\tlinkStack: { href: string; labelStart: number }[];\n} {\n\treturn {\n\t\ttext: \"\",\n\t\tstyles: [],\n\t\topenStyles: [],\n\t\tlinks: [],\n\t\tlinkStack: [],\n\t};\n}\n\nfunction finishCell(cell: ReturnType<typeof initCellState>): TableCellIR {\n\tcloseRemainingStyles(cell);\n\treturn { text: cell.text, styles: cell.styles, links: cell.links };\n}\n\nfunction resolveTarget(state: RenderState) {\n\treturn state.table?.currentCell ?? state;\n}\n\nfunction appendText(state: RenderState, value: string): void {\n\tif (!value) return;\n\tresolveTarget(state).text += value;\n}\n\nfunction openStyle(state: RenderState, style: StyleSpan[\"style\"]): void {\n\tconst target = resolveTarget(state);\n\ttarget.openStyles.push({ style, start: target.text.length });\n}\n\nfunction closeStyle(state: RenderState, style: StyleSpan[\"style\"]): void {\n\tconst target = resolveTarget(state);\n\tfor (let i = target.openStyles.length - 1; i >= 0; i--) {\n\t\tif (target.openStyles[i]?.style === style) {\n\t\t\tconst start = target.openStyles[i].start;\n\t\t\ttarget.openStyles.splice(i, 1);\n\t\t\tconst end = target.text.length;\n\t\t\tif (end > start) {\n\t\t\t\ttarget.styles.push({ start, end, style });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfunction closeRemainingStyles(target: ReturnType<typeof initCellState>): void {\n\tfor (let i = target.openStyles.length - 1; i >= 0; i--) {\n\t\tconst open = target.openStyles[i];\n\t\tconst end = target.text.length;\n\t\tif (end > open.start) {\n\t\t\ttarget.styles.push({ start: open.start, end, style: open.style });\n\t\t}\n\t}\n\ttarget.openStyles = [];\n}\n\nfunction getAttr(token: Token, name: string): string | null {\n\tif (token.attrGet) return token.attrGet(name);\n\tif (token.attrs) {\n\t\tfor (const [key, value] of token.attrs) {\n\t\t\tif (key === name) return value;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction renderTableAsBullets(state: RenderState): void {\n\tif (!state.table) return;\n\n\tconst headers = state.table.headers;\n\tconst rows = state.table.rows;\n\n\tfor (let ri = 0; ri < rows.length; ri++) {\n\t\tconst row = rows[ri];\n\t\tif (row.length === 0) continue;\n\n\t\t// First cell as bold label\n\t\tconst labelStart = state.text.length;\n\t\tstate.text += row[0].text;\n\t\tif (state.text.length > labelStart) {\n\t\t\tstate.styles.push({\n\t\t\t\tstart: labelStart,\n\t\t\t\tend: state.text.length,\n\t\t\t\tstyle: \"bold\",\n\t\t\t});\n\t\t}\n\t\tstate.text += \"\\n\";\n\n\t\tfor (let ci = 1; ci < row.length; ci++) {\n\t\t\tconst headerText = headers[ci]?.text ?? `Column ${ci}`;\n\t\t\tstate.text += \"• \";\n\t\t\tstate.text += `${headerText}: `;\n\t\t\tstate.text += `${row[ci].text}\\n`;\n\t\t}\n\t}\n}\n\nfunction renderTableAsCode(state: RenderState): void {\n\tif (!state.table) return;\n\n\tconst headers = state.table.headers;\n\tconst rows = state.table.rows;\n\tconst colCount = Math.max(headers.length, ...rows.map((r) => r.length));\n\tif (colCount === 0) return;\n\n\tconst widths = Array.from({ length: colCount }, () => 0);\n\tconst updateWidths = (cells: TableCellIR[]) => {\n\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\twidths[i] = Math.max(widths[i], cells[i]?.text.length ?? 0);\n\t\t}\n\t};\n\tupdateWidths(headers);\n\tfor (const row of rows) updateWidths(row);\n\n\tconst codeStart = state.text.length;\n\n\tconst appendRow = (cells: TableCellIR[]) => {\n\t\tstate.text += \"|\";\n\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\tstate.text += \" \";\n\t\t\tconst cell = cells[i];\n\t\t\tstate.text += cell ? cell.text : \"\";\n\t\t\tconst pad = widths[i] - (cell?.text.length ?? 0);\n\t\t\tstate.text += `${\" \".repeat(Math.max(0, pad))} |`;\n\t\t}\n\t\tstate.text += \"\\n\";\n\t};\n\n\tconst appendDivider = () => {\n\t\tstate.text += \"|\";\n\t\tfor (let i = 0; i < colCount; i++) {\n\t\t\tstate.text += ` ${\"-\".repeat(Math.max(3, widths[i]))} |`;\n\t\t}\n\t\tstate.text += \"\\n\";\n\t};\n\n\tappendRow(headers);\n\tappendDivider();\n\tfor (const row of rows) appendRow(row);\n\n\tconst codeEnd = state.text.length;\n\tif (codeEnd > codeStart) {\n\t\tstate.styles.push({ start: codeStart, end: codeEnd, style: \"code_block\" });\n\t}\n}\n\nfunction processTokens(tokens: Token[], state: RenderState): void {\n\tfor (const token of tokens) {\n\t\tswitch (token.type) {\n\t\t\tcase \"inline\":\n\t\t\t\tif (token.children) processTokens(token.children, state);\n\t\t\t\tbreak;\n\n\t\t\tcase \"text\":\n\t\t\t\tappendText(state, token.content ?? \"\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"em_open\":\n\t\t\t\topenStyle(state, \"italic\");\n\t\t\t\tbreak;\n\t\t\tcase \"em_close\":\n\t\t\t\tcloseStyle(state, \"italic\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"strong_open\":\n\t\t\t\topenStyle(state, \"bold\");\n\t\t\t\tbreak;\n\t\t\tcase \"strong_close\":\n\t\t\t\tcloseStyle(state, \"bold\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"s_open\":\n\t\t\t\topenStyle(state, \"strikethrough\");\n\t\t\t\tbreak;\n\t\t\tcase \"s_close\":\n\t\t\t\tcloseStyle(state, \"strikethrough\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"spoiler_open\":\n\t\t\t\tif (state.spoilerEnabled) openStyle(state, \"spoiler\");\n\t\t\t\tbreak;\n\t\t\tcase \"spoiler_close\":\n\t\t\t\tif (state.spoilerEnabled) closeStyle(state, \"spoiler\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"code_inline\": {\n\t\t\t\tconst content = token.content ?? \"\";\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\tconst start = target.text.length;\n\t\t\t\ttarget.text += content;\n\t\t\t\ttarget.styles.push({\n\t\t\t\t\tstart,\n\t\t\t\t\tend: start + content.length,\n\t\t\t\t\tstyle: \"code\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"link_open\": {\n\t\t\t\tconst href = getAttr(token, \"href\") ?? \"\";\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\ttarget.linkStack.push({ href, labelStart: target.text.length });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"link_close\": {\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\tconst link = target.linkStack.pop();\n\t\t\t\tif (link?.href) {\n\t\t\t\t\tconst href = link.href.trim();\n\t\t\t\t\tif (href) {\n\t\t\t\t\t\ttarget.links.push({\n\t\t\t\t\t\t\tstart: link.labelStart,\n\t\t\t\t\t\t\tend: target.text.length,\n\t\t\t\t\t\t\thref,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"image\":\n\t\t\t\tappendText(state, token.content ?? \"\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"softbreak\":\n\t\t\tcase \"hardbreak\":\n\t\t\t\tappendText(state, \"\\n\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"paragraph_close\": {\n\t\t\t\tif (state.listStack.length === 0 && !state.table) {\n\t\t\t\t\tstate.text += \"\\n\\n\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"heading_open\":\n\t\t\t\tif (state.headingStyle === \"bold\") openStyle(state, \"bold\");\n\t\t\t\tbreak;\n\t\t\tcase \"heading_close\":\n\t\t\t\tif (state.headingStyle === \"bold\") closeStyle(state, \"bold\");\n\t\t\t\tif (state.listStack.length === 0 && !state.table) state.text += \"\\n\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"blockquote_open\":\n\t\t\t\tif (state.blockquotePrefix) state.text += state.blockquotePrefix;\n\t\t\t\topenStyle(state, \"blockquote\");\n\t\t\t\tbreak;\n\t\t\tcase \"blockquote_close\":\n\t\t\t\tcloseStyle(state, \"blockquote\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"bullet_list_open\":\n\t\t\t\tif (state.listStack.length > 0) state.text += \"\\n\";\n\t\t\t\tstate.listStack.push({ type: \"bullet\", index: 0 });\n\t\t\t\tbreak;\n\t\t\tcase \"bullet_list_close\":\n\t\t\t\tstate.listStack.pop();\n\t\t\t\tif (state.listStack.length === 0) state.text += \"\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"ordered_list_open\": {\n\t\t\t\tif (state.listStack.length > 0) state.text += \"\\n\";\n\t\t\t\tconst start = Number(getAttr(token, \"start\") ?? \"1\");\n\t\t\t\tstate.listStack.push({ type: \"ordered\", index: start - 1 });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"ordered_list_close\":\n\t\t\t\tstate.listStack.pop();\n\t\t\t\tif (state.listStack.length === 0) state.text += \"\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"list_item_open\": {\n\t\t\t\tconst top = state.listStack[state.listStack.length - 1];\n\t\t\t\tif (top) {\n\t\t\t\t\ttop.index++;\n\t\t\t\t\tconst indent = \" \".repeat(Math.max(0, state.listStack.length - 1));\n\t\t\t\t\tconst prefix = top.type === \"ordered\" ? `${top.index}. ` : \"• \";\n\t\t\t\t\tstate.text += `${indent}${prefix}`;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"list_item_close\":\n\t\t\t\tif (!state.text.endsWith(\"\\n\")) state.text += \"\\n\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"code_block\":\n\t\t\tcase \"fence\": {\n\t\t\t\tlet code = token.content ?? \"\";\n\t\t\t\tif (!code.endsWith(\"\\n\")) code += \"\\n\";\n\t\t\t\tconst target = resolveTarget(state);\n\t\t\t\tconst start = target.text.length;\n\t\t\t\ttarget.text += code;\n\t\t\t\ttarget.styles.push({\n\t\t\t\t\tstart,\n\t\t\t\t\tend: start + code.length,\n\t\t\t\t\tstyle: \"code_block\",\n\t\t\t\t});\n\t\t\t\tif (state.listStack.length === 0) target.text += \"\\n\";\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"html_block\":\n\t\t\tcase \"html_inline\":\n\t\t\t\tappendText(state, token.content ?? \"\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"table_open\":\n\t\t\t\tif (state.tableMode !== \"off\") {\n\t\t\t\t\tstate.table = {\n\t\t\t\t\t\theaders: [],\n\t\t\t\t\t\trows: [],\n\t\t\t\t\t\tcurrentRow: [],\n\t\t\t\t\t\tcurrentCell: null,\n\t\t\t\t\t\tinHeader: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"table_close\":\n\t\t\t\tif (state.table) {\n\t\t\t\t\tif (state.tableMode === \"bullets\") renderTableAsBullets(state);\n\t\t\t\t\telse if (state.tableMode === \"code\") renderTableAsCode(state);\n\t\t\t\t}\n\t\t\t\tstate.table = null;\n\t\t\t\tbreak;\n\n\t\t\tcase \"thead_open\":\n\t\t\t\tif (state.table) state.table.inHeader = true;\n\t\t\t\tbreak;\n\t\t\tcase \"thead_close\":\n\t\t\t\tif (state.table) state.table.inHeader = false;\n\t\t\t\tbreak;\n\n\t\t\tcase \"tbody_open\":\n\t\t\tcase \"tbody_close\":\n\t\t\t\tbreak;\n\n\t\t\tcase \"tr_open\":\n\t\t\t\tif (state.table) state.table.currentRow = [];\n\t\t\t\tbreak;\n\t\t\tcase \"tr_close\":\n\t\t\t\tif (state.table) {\n\t\t\t\t\tif (state.table.inHeader) {\n\t\t\t\t\t\tstate.table.headers = state.table.currentRow;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate.table.rows.push(state.table.currentRow);\n\t\t\t\t\t}\n\t\t\t\t\tstate.table.currentRow = [];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"th_open\":\n\t\t\tcase \"td_open\":\n\t\t\t\tif (state.table) state.table.currentCell = initCellState();\n\t\t\t\tbreak;\n\t\t\tcase \"th_close\":\n\t\t\tcase \"td_close\":\n\t\t\t\tif (state.table?.currentCell) {\n\t\t\t\t\tstate.table.currentRow.push(finishCell(state.table.currentCell));\n\t\t\t\t\tstate.table.currentCell = null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"hr\":\n\t\t\t\tstate.text += \"───\\n\\n\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tif (token.children) processTokens(token.children, state);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction markdownToIR(\n\tmarkdown: string,\n\toptions: {\n\t\tlinkify?: boolean;\n\t\tenableSpoilers?: boolean;\n\t\theadingStyle?: \"none\" | \"bold\";\n\t\tblockquotePrefix?: string;\n\t\ttableMode?: \"off\" | \"bullets\" | \"code\";\n\t} = {},\n): MarkdownIR {\n\tconst md = createMarkdownIt();\n\n\tconst env = { listStack: [] as ListEntry[] };\n\tconst tokens = md.parse(markdown ?? \"\", env);\n\n\tconst state: RenderState = {\n\t\ttext: \"\",\n\t\tstyles: [],\n\t\topenStyles: [],\n\t\tlinks: [],\n\t\tlinkStack: [],\n\t\tlistStack: [],\n\t\theadingStyle: options.headingStyle ?? \"none\",\n\t\tblockquotePrefix: options.blockquotePrefix ?? \"\",\n\t\ttable: null,\n\t\ttableMode: options.tableMode ?? \"code\",\n\t\tspoilerEnabled: options.enableSpoilers ?? true,\n\t};\n\n\tprocessTokens(tokens as Token[], state);\n\tcloseRemainingStyles(resolveTarget(state));\n\n\tconst trimmedLen = state.text.trimEnd().length;\n\tlet codeBlockEnd = 0;\n\tfor (const span of state.styles) {\n\t\tif (span.style !== \"code_block\") continue;\n\t\tif (span.end > codeBlockEnd) codeBlockEnd = span.end;\n\t}\n\tconst finalLen = Math.max(trimmedLen, codeBlockEnd);\n\n\treturn {\n\t\ttext: finalLen === state.text.length ? state.text : state.text.slice(0, finalLen),\n\t\tstyles: mergeStyleSpans(clampStyleSpans(state.styles, finalLen)),\n\t\tlinks: clampLinkSpans(state.links, finalLen),\n\t};\n}\n\nfunction clampStyleSpans(spans: StyleSpan[], maxLen: number): StyleSpan[] {\n\treturn spans\n\t\t.map((s) => ({\n\t\t\t...s,\n\t\t\tstart: Math.max(0, Math.min(s.start, maxLen)),\n\t\t\tend: Math.max(0, Math.min(s.end, maxLen)),\n\t\t}))\n\t\t.filter((s) => s.end > s.start);\n}\n\nfunction clampLinkSpans(spans: LinkSpan[], maxLen: number): LinkSpan[] {\n\treturn spans\n\t\t.map((s) => ({\n\t\t\t...s,\n\t\t\tstart: Math.max(0, Math.min(s.start, maxLen)),\n\t\t\tend: Math.max(0, Math.min(s.end, maxLen)),\n\t\t}))\n\t\t.filter((s) => s.end > s.start);\n}\n\nfunction mergeStyleSpans(spans: StyleSpan[]): StyleSpan[] {\n\tif (spans.length === 0) return [];\n\tconst sorted = [...spans].sort((a, b) => {\n\t\tif (a.start !== b.start) return a.start - b.start;\n\t\tif (a.end !== b.end) return b.end - a.end;\n\t\treturn a.style.localeCompare(b.style);\n\t});\n\tconst merged: StyleSpan[] = [];\n\tfor (const s of sorted) {\n\t\tconst prev = merged[merged.length - 1];\n\t\tif (\n\t\t\tprev &&\n\t\t\tprev.style === s.style &&\n\t\t\t(s.start < prev.end || (s.start === prev.end && s.style !== \"blockquote\"))\n\t\t) {\n\t\t\tprev.end = Math.max(prev.end, s.end);\n\t\t\tcontinue;\n\t\t}\n\t\tmerged.push({ ...s });\n\t}\n\treturn merged;\n}\n\n// ─── IR → Telegram HTML rendering ───────────────────────────────────────────\n\nconst STYLE_RANK = new Map<StyleSpan[\"style\"], number>([\n\t[\"blockquote\", 0],\n\t[\"code_block\", 1],\n\t[\"code\", 2],\n\t[\"bold\", 3],\n\t[\"italic\", 4],\n\t[\"strikethrough\", 5],\n\t[\"spoiler\", 6],\n]);\n\nfunction sortStyleSpans(spans: StyleSpan[]): StyleSpan[] {\n\treturn [...spans].sort((a, b) => {\n\t\tif (a.start !== b.start) return a.start - b.start;\n\t\tif (a.end !== b.end) return b.end - a.end;\n\t\treturn (STYLE_RANK.get(a.style) ?? 0) - (STYLE_RANK.get(b.style) ?? 0);\n\t});\n}\n\ninterface RenderLinkResult {\n\tstart: number;\n\tend: number;\n\topen: string;\n\tclose: string;\n}\n\nfunction renderMarkdownWithMarkers(\n\tir: MarkdownIR,\n\toptions: {\n\t\tstyleMarkers: Record<string, { open: string; close: string }>;\n\t\tescapeText: (text: string) => string;\n\t\tbuildLink?: (link: LinkSpan, text: string) => RenderLinkResult | null;\n\t},\n): string {\n\tconst { escapeText: escFn, styleMarkers: markers, buildLink } = options;\n\tconst content = ir.text;\n\tif (!content) return \"\";\n\n\tconst styled = sortStyleSpans(ir.styles.filter((s) => Boolean(markers[s.style])));\n\n\tconst boundaries = new Set<number>();\n\tboundaries.add(0);\n\tboundaries.add(content.length);\n\n\tconst startsAt = new Map<number, StyleSpan[]>();\n\tfor (const span of styled) {\n\t\tif (span.start === span.end) continue;\n\t\tboundaries.add(span.start);\n\t\tboundaries.add(span.end);\n\t\tconst bucket = startsAt.get(span.start);\n\t\tif (bucket) bucket.push(span);\n\t\telse startsAt.set(span.start, [span]);\n\t}\n\n\tfor (const spans of startsAt.values()) {\n\t\tspans.sort((a, b) => {\n\t\t\tif (a.end !== b.end) return b.end - a.end;\n\t\t\treturn (STYLE_RANK.get(a.style) ?? 0) - (STYLE_RANK.get(b.style) ?? 0);\n\t\t});\n\t}\n\n\tconst linkStarts = new Map<number, RenderLinkResult[]>();\n\tif (buildLink) {\n\t\tfor (const link of ir.links) {\n\t\t\tif (link.start === link.end) continue;\n\t\t\tconst rendered = buildLink(link, content);\n\t\t\tif (!rendered) continue;\n\t\t\tboundaries.add(rendered.start);\n\t\t\tboundaries.add(rendered.end);\n\t\t\tconst bucket = linkStarts.get(rendered.start);\n\t\t\tif (bucket) bucket.push(rendered);\n\t\t\telse linkStarts.set(rendered.start, [rendered]);\n\t\t}\n\t}\n\n\tconst points = [...boundaries].sort((a, b) => a - b);\n\tconst stack: { close: string; end: number }[] = [];\n\tlet out = \"\";\n\n\tfor (let i = 0; i < points.length; i++) {\n\t\tconst pos = points[i];\n\n\t\twhile (stack.length && stack[stack.length - 1]?.end === pos) {\n\t\t\tconst item = stack.pop();\n\t\t\tif (item) out += item.close;\n\t\t}\n\n\t\tconst openingItems: {\n\t\t\tend: number;\n\t\t\topen: string;\n\t\t\tclose: string;\n\t\t\tkind: \"link\" | \"style\";\n\t\t\tstyle?: StyleSpan[\"style\"];\n\t\t\tindex: number;\n\t\t}[] = [];\n\n\t\tconst openingLinks = linkStarts.get(pos);\n\t\tif (openingLinks) {\n\t\t\tfor (let idx = 0; idx < openingLinks.length; idx++) {\n\t\t\t\tconst l = openingLinks[idx];\n\t\t\t\topeningItems.push({\n\t\t\t\t\tend: l.end,\n\t\t\t\t\topen: l.open,\n\t\t\t\t\tclose: l.close,\n\t\t\t\t\tkind: \"link\",\n\t\t\t\t\tindex: idx,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst openingStyles = startsAt.get(pos);\n\t\tif (openingStyles) {\n\t\t\tfor (let idx = 0; idx < openingStyles.length; idx++) {\n\t\t\t\tconst span = openingStyles[idx];\n\t\t\t\tconst marker = markers[span.style];\n\t\t\t\tif (!marker) continue;\n\t\t\t\topeningItems.push({\n\t\t\t\t\tend: span.end,\n\t\t\t\t\topen: marker.open,\n\t\t\t\t\tclose: marker.close,\n\t\t\t\t\tkind: \"style\",\n\t\t\t\t\tstyle: span.style,\n\t\t\t\t\tindex: idx,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (openingItems.length > 0) {\n\t\t\topeningItems.sort((a, b) => {\n\t\t\t\tif (a.end !== b.end) return b.end - a.end;\n\t\t\t\tif (a.kind !== b.kind) return a.kind === \"link\" ? -1 : 1;\n\t\t\t\tif (a.kind === \"style\" && b.kind === \"style\") {\n\t\t\t\t\treturn (STYLE_RANK.get(a.style ?? \"bold\") ?? 0) - (STYLE_RANK.get(b.style ?? \"bold\") ?? 0);\n\t\t\t\t}\n\t\t\t\treturn a.index - b.index;\n\t\t\t});\n\t\t\tfor (const item of openingItems) {\n\t\t\t\tout += item.open;\n\t\t\t\tstack.push({ close: item.close, end: item.end });\n\t\t\t}\n\t\t}\n\n\t\tconst next = points[i + 1];\n\t\tif (next === undefined) break;\n\t\tif (next > pos) out += escFn(content.slice(pos, next));\n\t}\n\n\treturn out;\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nconst TELEGRAM_STYLE_MARKERS: Record<string, { open: string; close: string }> = {\n\tbold: { open: \"<b>\", close: \"</b>\" },\n\titalic: { open: \"<i>\", close: \"</i>\" },\n\tstrikethrough: { open: \"<s>\", close: \"</s>\" },\n\tcode: { open: \"<code>\", close: \"</code>\" },\n\tcode_block: { open: \"<pre><code>\", close: \"</code></pre>\" },\n\tspoiler: { open: \"<tg-spoiler>\", close: \"</tg-spoiler>\" },\n\tblockquote: { open: \"<blockquote>\", close: \"</blockquote>\" },\n};\n\nfunction escapeHtml(text: string): string {\n\treturn text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction escapeHtmlAttr(text: string): string {\n\treturn escapeHtml(text).replace(/\"/g, \""\");\n}\n\nfunction buildTelegramLink(link: LinkSpan, text: string): RenderLinkResult | null {\n\tconst href = link.href.trim();\n\tif (!href || link.start === link.end) return null;\n\treturn {\n\t\tstart: link.start,\n\t\tend: link.end,\n\t\topen: `<a href=\"${escapeHtmlAttr(href)}\">`,\n\t\tclose: \"</a>\",\n\t};\n}\n\nexport function markdownToTelegramHtml(markdown: string): string {\n\tif (!markdown?.trim()) return \"\";\n\n\ttry {\n\t\tconst ir = markdownToIR(markdown, {\n\t\t\tlinkify: true,\n\t\t\tenableSpoilers: true,\n\t\t\theadingStyle: \"none\",\n\t\t\tblockquotePrefix: \"\",\n\t\t\ttableMode: \"code\",\n\t\t});\n\n\t\treturn renderMarkdownWithMarkers(ir, {\n\t\t\tstyleMarkers: TELEGRAM_STYLE_MARKERS,\n\t\t\tescapeText: escapeHtml,\n\t\t\tbuildLink: buildTelegramLink,\n\t\t});\n\t} catch (err) {\n\t\tconsole.error(\"[Telegram Markdown] Conversion failed, falling back to plain text:\", err);\n\t\t// Fallback: escape HTML chars so the raw markdown is at least readable\n\t\treturn escapeHtml(markdown);\n\t}\n}\n","/**\n * Telegram Adapter - Platform adapter for Telegram messaging\n *\n * This adapter handles sending/receiving messages through the Telegram Bot API\n * using the gramjs library.\n */\n\nimport { MessagePlatformAdapter } from \"@melandlabs/integrations-channels\";\nimport type { At, Image, Message, Messages } from \"@melandlabs/integrations-channels\";\nimport type { MessageEvent, MessageTarget } from \"@melandlabs/integrations-channels\";\nimport {\n\ttype DialogInfo,\n\ttype ExtractedMessageInfo,\n\tdelay,\n\tisEmptyMessage,\n\ttimeBeforeHours,\n} from \"@melandlabs/integrations-channels/sources/types\";\nimport type { ContactMeta, TelegramContactMeta } from \"@melandlabs/integrations/contacts\";\nimport { isTelegramContactMeta } from \"@melandlabs/integrations/contacts\";\nimport type { ClientRegistry, FileIngester } from \"@melandlabs/integrations/core\";\nimport type { Attachment } from \"@melandlabs/shared\";\nimport bigInt, { type BigInteger } from \"big-integer\";\nimport { TelegramClient } from \"telegram\";\nimport type { TotalList } from \"telegram/Helpers.js\";\nimport { CustomFile } from \"telegram/client/uploads.js\";\nimport type { Entity } from \"telegram/define.js\";\nimport { StringSession } from \"telegram/sessions/index.js\";\nimport type { Dialog } from \"telegram/tl/custom/dialog.js\";\nimport { Api } from \"telegram/tl/index.js\";\nimport { markdownToTelegramHtml } from \"./markdown\";\n\nconst DEBUG = process.env.DEBUG_TELEGRAM === \"true\";\n\nconst maxDialogCount = 50;\nconst maxMessageCount = 200;\nconst DEFAULT_MAX_MESSAGE_CHUNK_COUNT = 40;\nconst FIRST_LANDING_MESSAGE_CHUNK_COUNT = 10;\nconst TELEGRAM_MAX_ATTACHMENT_BYTES = 20 * 1024 * 1024;\nconst dialogCacheFetchLimit = 200;\n\n// Timeout constants for network operations (in ms)\nexport const CONNECT_TIMEOUT_MS = 60_000; // 60 seconds for initial connection\nexport const SEND_MESSAGE_TIMEOUT_MS = 30_000; // 30 seconds for sending a message\n\n/**\n * Wraps a promise with a timeout. If the promise doesn't resolve within the timeout,\n * the promise is rejected with a timeout error.\n */\nexport function withTimeout<T>(promise: Promise<T>, ms: number, operationName: string): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst timer = setTimeout(() => {\n\t\t\treject(new Error(`${operationName} timed out after ${ms}ms`));\n\t\t}, ms);\n\n\t\tpromise\n\t\t\t.then((value) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(value);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\treject(err);\n\t\t\t});\n\t});\n}\n\n// Cache interfaces\ninterface EntityCache {\n\t[id: string]: {\n\t\tentity: Entity;\n\t\ttimestamp: number;\n\t};\n}\n\nexport class TelegramAdapter extends MessagePlatformAdapter {\n\tclient: TelegramClient;\n\tmessages: Messages;\n\tbotId: string;\n\tappId: number;\n\tappHash: string;\n\tsession: StringSession;\n\tname = \"Telegram\";\n\tprivate ownerUserId?: string;\n\tprivate ownerUserType?: string;\n\tprivate fileIngester?: FileIngester;\n\tprivate clientRegistry?: ClientRegistry;\n\n\t// Caches with TTL (1 hour default)\n\tprivate senderCache: EntityCache = {};\n\tprivate chatCache: EntityCache = {};\n\tprivate dialogs: DialogInfo[] = [];\n\tprivate dialogEntityCache: EntityCache = {};\n\tprivate dialogsFetchedAt = 0;\n\tprivate contactMetadata: Record<string, TelegramContactMeta> = {};\n\tprivate cacheTTL = 3600000; // 1 hour in milliseconds\n\n\tprivate botToken?: string;\n\tprivate ownUserId?: BigInteger;\n\n\t// Flag indicating if using shared client from User Listener (should not disconnect when shared)\n\tprivate _isSharedClient = false;\n\n\tprivate asyncIteratorState = {\n\t\tdialogs: [] as TotalList<Dialog>,\n\t\tcurrentDialogIndex: 0,\n\t\tcurrentMessageIndex: 0,\n\t\toffsetDate: 0,\n\t\tisInitialized: false,\n\t};\n\n\tconstructor(opts?: {\n\t\tbotId?: string;\n\t\tbotToken?: string;\n\t\tsession?: string;\n\t\tappId?: number;\n\t\tappHash?: string;\n\t\tcacheTTL?: number;\n\t\townerUserId?: string;\n\t\townerUserType?: string;\n\t\tfileIngester?: FileIngester;\n\t\tclientRegistry?: ClientRegistry;\n\t}) {\n\t\tsuper();\n\t\tthis.session = new StringSession(opts?.session ?? \"\");\n\t\tthis.botId = opts?.botId ?? \"\";\n\t\tthis.appId = opts?.appId ?? Number(process.env.TG_APP_ID ?? \"0\");\n\t\tthis.appHash = opts?.appHash ?? process.env.TG_APP_HASH ?? \"\";\n\n\t\t// Prefer to reuse connected client from User Listener via ClientRegistry, avoid creating multiple MTProto connections for same session\n\t\t// Multiple connections cause session conflicts and disrupt User Listener's real-time event reception\n\t\tconst sessionKey = opts?.session ?? \"\";\n\t\tconst clientRegistry = opts?.clientRegistry;\n\t\tlet sharedClient: TelegramClient | undefined;\n\n\t\tif (!opts?.botToken && sessionKey && clientRegistry) {\n\t\t\tsharedClient = clientRegistry.getClientBySessionKey(sessionKey) as TelegramClient | undefined;\n\t\t}\n\n\t\tif (sharedClient) {\n\t\t\tthis.client = sharedClient;\n\t\t\tthis._isSharedClient = true;\n\t\t\tif (DEBUG)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Bot ${opts?.botId}] [telegram] Reusing existing connection from User Listener to avoid session conflict`,\n\t\t\t\t);\n\t\t} else {\n\t\t\tthis.client = new TelegramClient(this.session, this.appId, this.appHash, {\n\t\t\t\tconnectionRetries: 10,\n\t\t\t\ttimeout: 60,\n\t\t\t\trequestRetries: 5,\n\t\t\t\tfloodSleepThreshold: 60,\n\t\t\t});\n\t\t}\n\n\t\tthis.botToken = opts?.botToken;\n\t\tthis.messages = [];\n\t\tthis.ownerUserId = opts?.ownerUserId;\n\t\tthis.ownerUserType = opts?.ownerUserType;\n\t\tthis.fileIngester = opts?.fileIngester;\n\t\tthis.clientRegistry = clientRegistry;\n\n\t\t// Allow custom cache TTL if provided\n\t\tif (opts?.cacheTTL) {\n\t\t\tthis.cacheTTL = opts.cacheTTL;\n\t\t}\n\t}\n\n\tprimeContactMetadata(contactId: string, metadata?: ContactMeta | null): void {\n\t\tif (!contactId || !metadata) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isTelegramContactMeta(metadata)) {\n\t\t\tthis.contactMetadata[contactId] = {\n\t\t\t\t...metadata,\n\t\t\t\tpeerId: metadata.peerId ?? contactId,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync connect() {\n\t\ttry {\n\t\t\t// Shared client already maintained by User Listener, no need to reconnect\n\t\t\tif (this._isSharedClient) {\n\t\t\t\tif (!this.client.connected) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Shared client disconnected, falling back to independent connection`,\n\t\t\t\t\t);\n\t\t\t\t\tthis._isSharedClient = false;\n\t\t\t\t\tthis.client = new TelegramClient(this.session, this.appId, this.appHash, {\n\t\t\t\t\t\tconnectionRetries: 10,\n\t\t\t\t\t\ttimeout: 60,\n\t\t\t\t\t\trequestRetries: 5,\n\t\t\t\t\t\tfloodSleepThreshold: 60,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!this.client.connected) {\n\t\t\t\tif (this.botToken) {\n\t\t\t\t\tawait this.client.start({\n\t\t\t\t\t\tbotAuthToken: this.botToken,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tawait this.client.start({\n\t\t\t\t\t\tphoneNumber: async () => await this.prompt(\"Please enter your phone number: \"),\n\t\t\t\t\t\tpassword: async () => await this.prompt(\"Please enter your password: \"),\n\t\t\t\t\t\tphoneCode: async () => await this.prompt(\"Please enter the verification code: \"),\n\t\t\t\t\t\tonError: (err) => console.error(`[Bot ${this.botId}] [telegram] Login error:`, err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Telegram connection error:`, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect. If using shared client (from User Listener), skip disconnect\n\t * to avoid disrupting User Listener's persistent connection.\n\t */\n\tasync disconnect(): Promise<undefined> {\n\t\tif (this._isSharedClient) {\n\t\t\tif (DEBUG) console.log(`[Bot ${this.botId}] [telegram] Using shared client, skipping disconnect`);\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.client?.connected) {\n\t\t\tawait this.client.disconnect();\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async prompt(question: string): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst readline = require(\"node:readline\").createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\treadline.question(question, (answer: string) => {\n\t\t\t\treadline.close();\n\t\t\t\tresolve(answer);\n\t\t\t});\n\t\t});\n\t}\n\n\tasync getDialogs(): Promise<DialogInfo[]> {\n\t\tif (!this.client.connected) {\n\t\t\tawait this.client.connect();\n\t\t}\n\t\tawait this.refreshDialogsCache();\n\t\treturn this.dialogs;\n\t}\n\n\tprivate async refreshDialogsCache(force = false): Promise<void> {\n\t\tif (!this.client.connected) {\n\t\t\tawait this.client.connect();\n\t\t}\n\n\t\tconst shouldRefresh =\n\t\t\tforce || this.dialogs.length === 0 || Date.now() - this.dialogsFetchedAt > this.cacheTTL;\n\n\t\tif (!shouldRefresh) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dialogs = await this.client.getDialogs({\n\t\t\tlimit: dialogCacheFetchLimit,\n\t\t});\n\n\t\tconst nextDialogs: DialogInfo[] = [];\n\n\t\tfor (const dialog of dialogs) {\n\t\t\tif (!dialog.id || !dialog.entity) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst idStr = dialog.id.toString();\n\t\t\tconst type =\n\t\t\t\tdialog.isUser === true ? \"private\" : dialog.isChannel || dialog.isGroup ? \"group\" : \"unknown\";\n\t\t\tconst resolvedName =\n\t\t\t\tdialog.name && dialog.name.trim().length > 0 ? dialog.name : this.getChatName(dialog.entity);\n\n\t\t\tconst metadata = this.buildMetadataFromEntity(idStr, dialog.entity);\n\t\t\tnextDialogs.push({\n\t\t\t\tid: idStr,\n\t\t\t\tname: resolvedName,\n\t\t\t\ttype,\n\t\t\t\tmetadata: metadata ?? undefined,\n\t\t\t});\n\n\t\t\tthis.addDialogEntityToCache(idStr, dialog.entity);\n\t\t}\n\n\t\tthis.dialogs = nextDialogs;\n\t\tthis.dialogsFetchedAt = Date.now();\n\t}\n\n\t// Cache management methods\n\tprivate isCacheValid(cacheEntry: { timestamp: number }): boolean {\n\t\treturn Date.now() - cacheEntry.timestamp < this.cacheTTL;\n\t}\n\n\tprivate getFromCache(cache: EntityCache, id: BigInteger): Entity | null {\n\t\tconst idStr = id.toString();\n\t\tconst entry = cache[idStr];\n\t\tif (entry && this.isCacheValid(entry)) {\n\t\t\treturn entry.entity;\n\t\t}\n\t\t// Remove expired entry\n\t\tif (entry) {\n\t\t\tdelete cache[idStr];\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate addToCache(cache: EntityCache, id: BigInteger, entity: Entity): void {\n\t\tcache[id.toString()] = {\n\t\t\tentity,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t}\n\n\tprivate addDialogEntityToCache(id: string, entity: Entity): void {\n\t\tthis.dialogEntityCache[id] = {\n\t\t\tentity,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tthis.registerMetadataFromEntity(id, entity);\n\t}\n\n\tprivate registerMetadataFromEntity(id: string, entity: Entity): void {\n\t\tconst metadata = this.buildMetadataFromEntity(id, entity);\n\t\tif (metadata) {\n\t\t\tthis.contactMetadata[id] = metadata;\n\t\t}\n\t}\n\n\tprivate buildMetadataFromEntity(id: string, entity: Entity): TelegramContactMeta | null {\n\t\tif (entity instanceof Api.User) {\n\t\t\tconst firstName = entity.firstName ?? null;\n\t\t\tconst lastName = entity.lastName ?? null;\n\t\t\tconst displayName =\n\t\t\t\tfirstName && lastName\n\t\t\t\t\t? `${firstName} ${lastName}`.trim()\n\t\t\t\t\t: firstName || lastName || entity.username || null;\n\n\t\t\treturn {\n\t\t\t\tplatform: \"telegram\",\n\t\t\t\tpeerId: id,\n\t\t\t\tpeerType: \"user\",\n\t\t\t\taccessHash: entity.accessHash ? entity.accessHash.toString() : undefined,\n\t\t\t\tusername: entity.username ?? null,\n\t\t\t\tfirstName,\n\t\t\t\tlastName,\n\t\t\t\tdisplayName,\n\t\t\t};\n\t\t}\n\n\t\tif (entity instanceof Api.Channel) {\n\t\t\treturn {\n\t\t\t\tplatform: \"telegram\",\n\t\t\t\tpeerId: id,\n\t\t\t\tpeerType: \"channel\",\n\t\t\t\taccessHash: entity.accessHash ? entity.accessHash.toString() : undefined,\n\t\t\t\tusername: entity.username ?? null,\n\t\t\t\tdisplayName: entity.title || null,\n\t\t\t};\n\t\t}\n\n\t\tif (entity instanceof Api.Chat) {\n\t\t\treturn {\n\t\t\t\tplatform: \"telegram\",\n\t\t\t\tpeerId: id,\n\t\t\t\tpeerType: \"chat\",\n\t\t\t\tdisplayName: entity.title || null,\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Convert peer to input peer for API calls\n\tprivate peerToInputPeer(peer: Api.TypePeer): Api.TypeInputPeer {\n\t\tif (peer instanceof Api.PeerUser) {\n\t\t\treturn new Api.InputPeerUser({\n\t\t\t\tuserId: peer.userId,\n\t\t\t\taccessHash: bigInt(0),\n\t\t\t});\n\t\t}\n\t\tif (peer instanceof Api.PeerChat) {\n\t\t\treturn new Api.InputPeerChat({ chatId: peer.chatId });\n\t\t}\n\t\tif (peer instanceof Api.PeerChannel) {\n\t\t\treturn new Api.InputPeerChannel({\n\t\t\t\tchannelId: peer.channelId,\n\t\t\t\taccessHash: bigInt(0), // Use BigInt literal instead\n\t\t\t});\n\t\t}\n\t\treturn new Api.InputPeerEmpty();\n\t}\n\n\t// Get entity with caching\n\tprivate async getEntityWithCache(\n\t\tcache: EntityCache,\n\t\tentityId: BigInteger | Api.TypePeer, // Use native bigint type\n\t): Promise<Entity | null> {\n\t\t// Convert to appropriate input peer type\n\t\tlet inputPeer: Api.TypeInputPeer;\n\t\tlet id: BigInteger;\n\n\t\tif (entityId instanceof Api.PeerUser) {\n\t\t\tid = entityId.userId;\n\t\t\tinputPeer = this.peerToInputPeer(entityId);\n\t\t} else if (entityId instanceof Api.PeerChat) {\n\t\t\tid = entityId.chatId;\n\t\t\tinputPeer = this.peerToInputPeer(entityId);\n\t\t} else if (entityId instanceof Api.PeerChannel) {\n\t\t\tid = entityId.channelId;\n\t\t\tinputPeer = this.peerToInputPeer(entityId);\n\t\t} else if (\n\t\t\tentityId instanceof Api.InputPeerUser ||\n\t\t\tentityId instanceof Api.InputPeerChat ||\n\t\t\tentityId instanceof Api.InputPeerChannel\n\t\t) {\n\t\t\t// Handle existing input peers\n\t\t\tif (entityId instanceof Api.InputPeerUser) {\n\t\t\t\tid = entityId.userId;\n\t\t\t} else if (entityId instanceof Api.InputPeerChat) {\n\t\t\t\tid = entityId.chatId;\n\t\t\t} else {\n\t\t\t\tid = entityId.channelId;\n\t\t\t}\n\t\t\tinputPeer = entityId;\n\t\t} else {\n\t\t\tid = entityId;\n\t\t\tconst entity = await this.client.getEntity(entityId);\n\t\t\tthis.addToCache(cache, id, entity);\n\t\t\treturn entity;\n\t\t}\n\n\t\t// Check cache first\n\t\tconst cachedEntity = this.getFromCache(cache, id);\n\t\tif (cachedEntity) {\n\t\t\treturn cachedEntity;\n\t\t}\n\n\t\t// Fetch from API if not in cache\n\t\ttry {\n\t\t\tconst entity = await this.client.getEntity(inputPeer);\n\t\t\tthis.addToCache(cache, id, entity);\n\t\t\treturn entity;\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Error fetching entity ${id}:`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync sendMessage(target: MessageTarget, id: string, message: string): Promise<void> {\n\t\tawait this.sendMessages(target, id, [message as unknown as Message]);\n\t}\n\n\t/**\n\t * Reply to a message\n\t * @param event - Source message event\n\t * @param messages - Message chain to send as reply\n\t * @param quoteOrigin - Whether to quote the original message (default: false)\n\t */\n\tasync sendMessages(target: MessageTarget, id: string, messages: Messages): Promise<void> {\n\t\tawait this.runWithAdapterError(\"sendMessages\", async () => {\n\t\t\tif (!this.client.connected) {\n\t\t\t\tawait withTimeout(\n\t\t\t\t\tthis.client.connect(),\n\t\t\t\t\tCONNECT_TIMEOUT_MS,\n\t\t\t\t\t`[Bot ${this.botId}] Telegram client.connect()`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (messages.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { textParts, images, unsupported } = this.partitionMessages(messages);\n\t\t\tif (unsupported.length > 0) {\n\t\t\t\tthrow this.createAdapterError(\n\t\t\t\t\t\"sendMessages\",\n\t\t\t\t\t\"invalid_request_error\",\n\t\t\t\t\t`Telegram send does not support message content: ${unsupported.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait this.dispatchMessages(\"sendMessages\", id, textParts, images);\n\t\t});\n\t}\n\n\tasync replyMessages(event: MessageEvent, messages: Messages, quoteOrigin = false): Promise<void> {\n\t\tawait this.runWithAdapterError(\"replyMessages\", async () => {\n\t\t\tif (!this.client.connected) {\n\t\t\t\tawait withTimeout(\n\t\t\t\t\tthis.client.connect(),\n\t\t\t\t\tCONNECT_TIMEOUT_MS,\n\t\t\t\t\t`[Bot ${this.botId}] Telegram client.connect()`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (messages.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst id = event.targetType === \"group\" ? event.sender.group.id : event.sender.id;\n\t\t\tconst { textParts, images, unsupported } = this.partitionMessages(messages);\n\t\t\tif (unsupported.length > 0) {\n\t\t\t\tthrow this.createAdapterError(\n\t\t\t\t\t\"replyMessages\",\n\t\t\t\t\t\"invalid_request_error\",\n\t\t\t\t\t`Telegram reply does not support message content: ${unsupported.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait this.dispatchMessages(\"replyMessages\", id.toString(), textParts, images);\n\t\t});\n\t}\n\n\tasync getChatsByChunk(\n\t\tsince: number,\n\t\tchunkSize?: number,\n\t): Promise<{\n\t\tmessages: ExtractedMessageInfo[];\n\t\thasMore: boolean;\n\t}> {\n\t\t// Use passed chunkSize or default value\n\t\tconst maxMessageChunkCount = chunkSize ?? DEFAULT_MAX_MESSAGE_CHUNK_COUNT;\n\t\t// 1. Ensure client is connected\n\t\tif (!this.client.connected) {\n\t\t\tif (DEBUG) console.log(\"[Telegram] Client not connected, connecting...\");\n\t\t\tawait this.client.connect();\n\t\t\tawait delay(500);\n\t\t}\n\n\t\tconst extractedMessages: ExtractedMessageInfo[] = [];\n\t\t// 2. Initialize on first call: load dialogs + set state (avoid duplicate initialization)\n\t\tif (!this.asyncIteratorState.isInitialized) {\n\t\t\t// Load all valid dialogs (filter out invalid entries without entity/ID)\n\t\t\tconst allDialogs = await this.client.getDialogs();\n\t\t\tthis.asyncIteratorState.dialogs = allDialogs.filter((dialog) => dialog.entity && dialog.id);\n\t\t\t// Reset traversal starting point (first dialog, first message on first call)\n\t\t\tthis.asyncIteratorState.currentDialogIndex = 0;\n\t\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\t\t\t// Mark as initialized (avoid reloading dialogs on next call)\n\t\t\tthis.asyncIteratorState.isInitialized = true;\n\t\t\tthis.asyncIteratorState.offsetDate = since;\n\n\t\t\tif (DEBUG)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Bot ${this.botId}] [telegram] Batch fetch initialization complete: ${this.asyncIteratorState.dialogs.length} valid dialogs`,\n\t\t\t\t);\n\t\t\tif (this.asyncIteratorState.dialogs.length === 0) {\n\t\t\t\tif (DEBUG) console.log(`[Bot ${this.botId}] No valid dialogs to process`);\n\t\t\t\tthis.asyncIteratorState.isInitialized = false;\n\t\t\t\tthis.asyncIteratorState.currentDialogIndex = 0;\n\t\t\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\t\t\t\treturn { messages: extractedMessages, hasMore: false };\n\t\t\t}\n\t\t}\n\n\t\tlet { currentDialogIndex, currentMessageIndex, offsetDate } = this.asyncIteratorState;\n\n\t\tconst targetDialogs = this.asyncIteratorState.dialogs;\n\n\t\tconst MIN_MESSAGES_PER_DIALOG = 5;\n\t\tconst REQUEST_DELAY_MS = 150; // Delay between requests to avoid triggering Telegram rate limits\n\n\t\tfor (let dialogIdx = currentDialogIndex; dialogIdx < targetDialogs.length; dialogIdx++) {\n\t\t\tconst dialog = targetDialogs[dialogIdx];\n\t\t\ttry {\n\t\t\t\tif (!this.client.connected) {\n\t\t\t\t\tif (DEBUG) console.log(\"[Telegram] Client not connected, connecting...\");\n\t\t\t\t\tawait this.client.connect();\n\t\t\t\t\tawait delay(500);\n\t\t\t\t}\n\n\t\t\t\t// Add request delay (except for first request)\n\t\t\t\tif (dialogIdx > currentDialogIndex) {\n\t\t\t\t\tawait delay(REQUEST_DELAY_MS);\n\t\t\t\t}\n\n\t\t\t\t// 4. Get all messages from current dialog that meet time criteria (no API offset, fetch all at once)\n\t\t\t\tconst rawMessages = await this.client.getMessages(dialog.id, {\n\t\t\t\t\toffsetDate: offsetDate,\n\t\t\t\t\treverse: true,\n\t\t\t\t});\n\t\t\t\tif (DEBUG)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${rawMessages.length} messages in the dialog id ${dialog.id}`,\n\t\t\t\t\t);\n\n\t\t\t\tif (rawMessages.length === 0 && dialogIdx >= 10) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// 5. Process starting from current message index (avoid reprocessing extracted messages)\n\t\t\t\tconst startMsgIdx = currentMessageIndex;\n\t\t\t\tlet dialogMessageCount = 0; // Track messages from this dialog\n\n\t\t\t\tfor (let msgIdx = startMsgIdx; msgIdx < rawMessages.length; msgIdx++) {\n\t\t\t\t\tconst rawMsg = rawMessages[msgIdx];\n\t\t\t\t\t// Only process Api.Message type (filter non-message type updates)\n\t\t\t\t\tif (!(rawMsg instanceof Api.Message)) continue;\n\t\t\t\t\t// Extract message details (reuse existing logic)\n\t\t\t\t\tconst extractedInfo = await this.extractMessageInfo(rawMsg);\n\t\t\t\t\tif (extractedInfo && !isEmptyMessage(extractedInfo)) {\n\t\t\t\t\t\textractedMessages.push(extractedInfo);\n\t\t\t\t\t\tdialogMessageCount++;\n\t\t\t\t\t\t// 6. Stop immediately if current batch reaches 40, save current position\n\t\t\t\t\t\tif (extractedMessages.length >= maxMessageChunkCount) {\n\t\t\t\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx; // Continue from current dialog next time\n\t\t\t\t\t\t\tthis.asyncIteratorState.currentMessageIndex = msgIdx + 1; // Start from next message next time\n\t\t\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t`[Bot ${this.botId}] Batch full (${maxMessageChunkCount}), continue from dialog ${dialog.id} message ${msgIdx + 1}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tmessages: extractedMessages,\n\t\t\t\t\t\t\t\thasMore: true,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If fewer than MIN_MESSAGES_PER_DIALOG messages fetched from this dialog, try fetching more history\n\t\t\t\t// If 0 messages fetched initially, no need to fetch more\n\t\t\t\tif (dialogMessageCount < MIN_MESSAGES_PER_DIALOG && rawMessages.length > 0) {\n\t\t\t\t\tconst neededCount = MIN_MESSAGES_PER_DIALOG - dialogMessageCount;\n\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Dialog ${dialog.id} has only ${dialogMessageCount} messages, fetching ${neededCount} more without time filter`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// Add delay to avoid triggering rate limit\n\t\t\t\t\tawait delay(REQUEST_DELAY_MS);\n\n\t\t\t\t\t// Fetch more messages without time filter\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst additionalMessages = await this.client.getMessages(dialog.id, {\n\t\t\t\t\t\t\tlimit: neededCount,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Process additional messages\n\t\t\t\t\t\tfor (const rawMsg of additionalMessages) {\n\t\t\t\t\t\t\tif (!(rawMsg instanceof Api.Message)) continue;\n\t\t\t\t\t\t\tconst extractedInfo = await this.extractMessageInfo(rawMsg);\n\t\t\t\t\t\t\tif (extractedInfo && !isEmptyMessage(extractedInfo)) {\n\t\t\t\t\t\t\t\textractedMessages.push(extractedInfo);\n\t\t\t\t\t\t\t\tdialogMessageCount++;\n\t\t\t\t\t\t\t\tif (extractedMessages.length >= maxMessageChunkCount) {\n\t\t\t\t\t\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx;\n\t\t\t\t\t\t\t\t\tthis.asyncIteratorState.currentMessageIndex = rawMessages.length;\n\t\t\t\t\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\t\t`[Bot ${this.botId}] Batch full (${maxMessageChunkCount}), continue from dialog ${dialog.id}`,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tmessages: extractedMessages,\n\t\t\t\t\t\t\t\t\t\thasMore: true,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (DEBUG)\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${additionalMessages.length} additional messages for dialog ${dialog.id}, total: ${dialogMessageCount}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Failed to fetch additional messages for dialog ${dialog.id}:`,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcurrentMessageIndex = 0;\n\t\t\t\tthis.asyncIteratorState.currentMessageIndex = 0; // Next dialog starts from message 0\n\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx + 1; // Next time start from next dialog\n\t\t\t} catch (error) {\n\t\t\t\t// Single dialog processing failed: skip this dialog, avoid affecting overall traversal\n\t\t\t\tconsole.error(`[Bot ${this.botId}] Failed to process dialog ${dialog.id}:`, error);\n\t\t\t\tthis.asyncIteratorState.currentDialogIndex = dialogIdx + 1; // Skip current dialog next time\n\t\t\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (DEBUG)\n\t\t\tconsole.log(\n\t\t\t\t`[Bot ${this.botId}] All dialogs processed, returning remaining ${extractedMessages.length} messages`,\n\t\t\t);\n\t\tthis.asyncIteratorState.isInitialized = false; // Mark as uninitialized, reload on next call\n\t\tthis.asyncIteratorState.currentDialogIndex = 0;\n\t\tthis.asyncIteratorState.currentMessageIndex = 0;\n\n\t\treturn {\n\t\t\tmessages: extractedMessages,\n\t\t\thasMore: false,\n\t\t};\n\t}\n\n\tasync getChatsByChunkHours(hours = 8): Promise<{\n\t\tmessages: ExtractedMessageInfo[];\n\t\thasMore: boolean;\n\t}> {\n\t\treturn this.getChatsByChunk(timeBeforeHours(hours));\n\t}\n\n\tasync getChatsByTime(cutoffDate: number): Promise<ExtractedMessageInfo[]> {\n\t\tif (!this.client.connected) {\n\t\t\tawait this.client.connect();\n\t\t}\n\n\t\tconst extractedMessages: ExtractedMessageInfo[] = [];\n\t\tconst dialogs = await this.client.getDialogs({});\n\n\t\tif (DEBUG) console.log(`[Bot ${this.botId}] [telegram] Fetched ${dialogs.length} dialogs`);\n\n\t\tlet dialogIndex = 0;\n\t\tconst REQUEST_DELAY_MS = 150; // Delay between each request\n\n\t\tfor (const dialog of dialogs) {\n\t\t\tif (!dialog.entity || !dialog.id) {\n\t\t\t\tdialogIndex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cache the dialog entity\n\t\t\tthis.addToCache(this.chatCache, dialog.id, dialog.entity);\n\n\t\t\t// Add delay (except for first request)\n\t\t\tif (dialogIndex > 0) {\n\t\t\t\tawait delay(REQUEST_DELAY_MS);\n\t\t\t}\n\n\t\t\tconst messages = await this.client.getMessages(dialog.id, {\n\t\t\t\toffsetDate: cutoffDate,\n\t\t\t\treverse: true,\n\t\t\t});\n\n\t\t\tif (DEBUG)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${messages.length} messages in the dialog id ${dialog.id}`,\n\t\t\t\t);\n\n\t\t\t// No more latest messages before the cutoffDate.\n\t\t\t// TODO: fix the hardcode pinned message group 10\n\t\t\tif ((messages.length === 0 && dialogIndex >= 10) || dialogIndex >= maxDialogCount) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdialogIndex += 1;\n\n\t\t\tlet msgIndex = 0;\n\t\t\tfor (const msg of messages) {\n\t\t\t\tif (msgIndex >= maxMessageCount) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (msg instanceof Api.Message) {\n\t\t\t\t\tmsgIndex += 1;\n\t\t\t\t\tconst extractedInfo = await this.extractMessageInfo(msg);\n\t\t\t\t\tif (extractedInfo && !isEmptyMessage(extractedInfo)) {\n\t\t\t\t\t\textractedMessages.push(extractedInfo);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (DEBUG)\n\t\t\tconsole.log(\n\t\t\t\t`[Bot ${this.botId}] [telegram] Fetched ${extractedMessages.length} total messages (capped at ${maxMessageCount})`,\n\t\t\t);\n\t\treturn extractedMessages;\n\t}\n\n\tasync getChatsByDays(days = 1): Promise<ExtractedMessageInfo[]> {\n\t\tconst cutoffDate = Math.floor((Date.now() - days * 24 * 60 * 60 * 1000) / 1000);\n\t\treturn await this.getChatsByTime(cutoffDate);\n\t}\n\n\tasync getChatsByHours(hours = 1): Promise<ExtractedMessageInfo[]> {\n\t\tconst cutoffDate = Math.floor((Date.now() - hours * 60 * 60 * 1000) / 1000);\n\t\treturn await this.getChatsByTime(cutoffDate);\n\t}\n\n\t// Extract detailed information from a message with caching\n\tprivate async extractMessageInfo(\n\t\tmessage: Api.Message,\n\t\tdepth = 0,\n\t\tmaxDepth = 1,\n\t): Promise<ExtractedMessageInfo | null> {\n\t\ttry {\n\t\t\t// Get chat information with caching\n\t\t\tconst chat =\n\t\t\t\t(await this.getEntityWithCache(this.chatCache, message.peerId)) ??\n\t\t\t\t(await this.client.getEntity(message.peerId));\n\t\t\tif (!chat) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst chatType = this.determineChatType(chat);\n\n\t\t\t// Filter out Saved Messages (self-messages)\n\t\t\t// In Telegram, Saved Messages has chatId equal to the user's own ID\n\t\t\tif (chatType === \"private\" && chat instanceof Api.User) {\n\t\t\t\ttry {\n\t\t\t\t\t// Lazy load and cache own user ID\n\t\t\t\t\tif (!this.ownUserId) {\n\t\t\t\t\t\tconst me = await this.client.getMe();\n\t\t\t\t\t\tthis.ownUserId = me.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (chat.id.equals(this.ownUserId)) {\n\t\t\t\t\t\t// This is a Saved Messages conversation (self-chat), skip it\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Failed to get user info for self-message filter:`,\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get sender information with caching\n\t\t\tlet sender: Entity | null = null;\n\t\t\tif (chatType === \"channel\" || chatType === \"group\") {\n\t\t\t\tif (message.fromId) {\n\t\t\t\t\tsender = await this.getEntityWithCache(this.senderCache, message.fromId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (message.senderId) {\n\t\t\t\t\tsender = await this.getEntityWithCache(this.senderCache, message.senderId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst senderName = this.getSenderName(sender);\n\t\t\tconst chatName = this.getChatName(chat);\n\t\t\tconst chatUserName = \"username\" in chat ? chat.username : null;\n\n\t\t\tconst msgInfo = {\n\t\t\t\tid: message.id, // Save Telegram original message ID for deduplication\n\t\t\t\tsender:\n\t\t\t\t\tchatType === \"private\"\n\t\t\t\t\t\t? (senderName ?? chatName)\n\t\t\t\t\t\t: (senderName ?? chatUserName ?? `anonymous user ${message.senderId}`),\n\t\t\t\tchatName: chatName,\n\t\t\t\tchatType: chatType,\n\t\t\t\ttext: message.message || \"\",\n\t\t\t\ttimestamp: message.date,\n\t\t\t\t// Use message.out property to determine message direction: true means sent by me, false means received from others\n\t\t\t\tisOutgoing: message.out,\n\t\t\t};\n\n\t\t\tif (msgInfo.sender.includes(\"anonymous user\") && message.senderId) {\n\t\t\t\tsender = await this.getEntityWithCache(this.senderCache, message.senderId);\n\t\t\t\tconst senderName = this.getSenderName(sender);\n\t\t\t\tif (senderName) {\n\t\t\t\t\tmsgInfo.sender = senderName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet quoted: ExtractedMessageInfo | null = null;\n\n\t\t\tif (message.replyToMsgId && depth < maxDepth) {\n\t\t\t\ttry {\n\t\t\t\t\tconst quotedMsgList = await this.client.getMessages(message.peerId, {\n\t\t\t\t\t\tids: message.replyToMsgId,\n\t\t\t\t\t});\n\t\t\t\t\tif (quotedMsgList.length > 0 && quotedMsgList[0] instanceof Api.Message) {\n\t\t\t\t\t\tquoted = await this.extractMessageInfo(quotedMsgList[0], depth + 1, maxDepth);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tconst result = isEmptyMessage(quoted) ? msgInfo : { ...msgInfo, quoted };\n\t\t\t// Only add attachments to non-referenced messages, as they may be added repeatedly.\n\t\t\tconst attachments = depth === 0 ? await this.extractAttachmentsFromMessage(message) : [];\n\t\t\treturn attachments.length > 0 ? { ...result, attachments } : result;\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Error extracting message info:`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t// Determine the type of chat\n\tprivate determineChatType(chat: Entity): \"private\" | \"group\" | \"channel\" | \"unknown\" {\n\t\tif (chat instanceof Api.User) return \"private\";\n\t\tif (chat instanceof Api.Chat) return \"group\";\n\t\tif (chat instanceof Api.Channel) return \"channel\";\n\t\treturn \"unknown\";\n\t}\n\n\t// Get appropriate chat name based on entity type\n\tprivate getChatName(chat: Entity): string {\n\t\tif (chat instanceof Api.User) {\n\t\t\tconst name = `${chat.firstName || \"\"} ${chat.lastName || \"\"}`.trim();\n\t\t\tif (name) return name;\n\t\t\t// Fallback to username if display name is empty\n\t\t\tif (chat.username) return `@${chat.username}`;\n\t\t\treturn \"Private Chat\";\n\t\t}\n\t\tif (chat instanceof Api.Chat) {\n\t\t\t// For regular chats, try title, then use ID as fallback\n\t\t\tif (chat.title) return chat.title;\n\t\t\tconst chatId = chat.id?.toString();\n\t\t\tif (chatId) {\n\t\t\t\tconsole.warn(`[Bot ${this.botId}] [telegram] Chat ${chatId} missing title, using ID as fallback`);\n\t\t\t\treturn `Chat ${chatId}`;\n\t\t\t}\n\t\t\treturn \"Unnamed Chat\";\n\t\t}\n\t\tif (chat instanceof Api.Channel) {\n\t\t\t// For channels/supergroups, try title, then username, then ID\n\t\t\tif (chat.title) return chat.title;\n\t\t\tif (chat.username) return `@${chat.username}`;\n\t\t\tconst channelId = chat.id?.toString();\n\t\t\tif (channelId) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Bot ${this.botId}] [telegram] Channel ${channelId} missing title and username, using ID as fallback`,\n\t\t\t\t);\n\t\t\t\treturn `Channel ${channelId}`;\n\t\t\t}\n\t\t\treturn \"Unnamed Chat\";\n\t\t}\n\t\t// Unknown entity type - log for debugging\n\t\tconsole.warn(`[Bot ${this.botId}] [telegram] Unknown entity type in getChatName:`, chat?.className);\n\t\treturn \"Unknown Chat\";\n\t}\n\n\tprivate getSenderName(sender: Entity | null): string | null {\n\t\tif (!sender) return null;\n\t\tif (sender instanceof Api.User) {\n\t\t\tif (sender.firstName || sender.lastName) {\n\t\t\t\treturn `${sender.firstName || \"\"} ${sender.lastName || \"\"}`.trim();\n\t\t\t}\n\t\t\treturn sender.username ?? \"\";\n\t\t}\n\t\tif (sender instanceof Api.Channel) {\n\t\t\treturn sender.title;\n\t\t}\n\t\tif (sender instanceof Api.Chat) {\n\t\t\treturn sender.title;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Clear cache manually if needed\n\tclearCache(): void {\n\t\tthis.senderCache = {};\n\t\tthis.chatCache = {};\n\t}\n\n\tprivate isImageMessage(message: Message): message is Image {\n\t\treturn (\n\t\t\ttypeof message === \"object\" &&\n\t\t\tmessage !== null &&\n\t\t\t\"url\" in message &&\n\t\t\t!(\"length\" in message) &&\n\t\t\t!(\"name\" in message) &&\n\t\t\ttypeof (message as Image).url === \"string\" &&\n\t\t\t(message as Image).url.length > 0\n\t\t);\n\t}\n\n\tprivate partitionMessages(messages: Messages): {\n\t\ttextParts: string[];\n\t\timages: Image[];\n\t\tunsupported: string[];\n\t} {\n\t\tconst textParts: string[] = [];\n\t\tconst images: Image[] = [];\n\t\tconst unsupported: string[] = [];\n\n\t\tfor (const message of messages) {\n\t\t\tif (this.isImageMessage(message)) {\n\t\t\t\timages.push(message);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst text = opencontextMessageToTgText(message);\n\t\t\tif (text.trim().length > 0) {\n\t\t\t\ttextParts.push(text);\n\t\t\t} else if (typeof message !== \"string\") {\n\t\t\t\tunsupported.push(describeUnsupportedMessage(message));\n\t\t\t}\n\t\t}\n\n\t\treturn { textParts, images, unsupported };\n\t}\n\n\tprivate inferFileName(image: Image): string {\n\t\tif (image.id && image.id.trim().length > 0) {\n\t\t\treturn image.id;\n\t\t}\n\n\t\tif (image.path) {\n\t\t\tconst segments = image.path.split(\"/\");\n\t\t\tconst candidate = segments[segments.length - 1];\n\t\t\tif (candidate) return candidate;\n\t\t}\n\n\t\tif (image.url) {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(image.url);\n\t\t\t\tconst filename = url.pathname.split(\"/\").pop();\n\t\t\t\tif (filename && filename.trim().length > 0) {\n\t\t\t\t\treturn filename;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`[Bot ${this.botId}] [telegram] Failed to parse filename from URL`, error);\n\t\t\t}\n\t\t}\n\n\t\treturn `image-${Date.now()}.jpg`;\n\t}\n\n\tprivate decodeBase64Payload(image: Image): Buffer | null {\n\t\tif (!image.base64) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst base64String = image.base64.includes(\",\") ? image.base64.split(\",\").pop() : image.base64;\n\n\t\tif (!base64String) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn Buffer.from(base64String, \"base64\");\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to decode base64 image payload`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async downloadMediaBuffer(message: Api.Message): Promise<Buffer | null> {\n\t\ttry {\n\t\t\tconst result = await this.client.downloadMedia(message);\n\t\t\tif (!result) return null;\n\t\t\tif (Buffer.isBuffer(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (typeof result === \"string\") {\n\t\t\t\tconst fs = await import(\"node:fs/promises\");\n\t\t\t\treturn await fs.readFile(result);\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to download media buffer`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async extractAttachmentsFromMessage(message: Api.Message): Promise<Attachment[]> {\n\t\tif (!this.ownerUserId || !this.ownerUserType) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!message.media) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst attachments: Attachment[] = [];\n\n\t\tconst pushAttachment = async (buffer: Buffer, fileName: string, mimeType: string) => {\n\t\t\tif (!this.ownerUserId || !this.ownerUserType) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst downloadPayload = async () => ({\n\t\t\t\tdata: buffer as unknown as ArrayBuffer,\n\t\t\t\tcontentType: mimeType,\n\t\t\t\tsizeBytes: buffer.length,\n\t\t\t});\n\n\t\t\tif (this.fileIngester) {\n\t\t\t\tconst result = await this.fileIngester.ingestExternal({\n\t\t\t\t\tsource: \"telegram\",\n\t\t\t\t\tuserId: this.ownerUserId,\n\t\t\t\t\tmaxSizeBytes: TELEGRAM_MAX_ATTACHMENT_BYTES,\n\t\t\t\t\tmimeTypeHint: mimeType,\n\t\t\t\t\toriginalFileName: fileName,\n\t\t\t\t\tdownloadAttachment: downloadPayload,\n\t\t\t\t});\n\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Bot ${this.botId}] [telegram] Skipped attachment due to ${result.reason} mimeType=${mimeType} fileName=${fileName}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!result.attachment) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst ingested = result.attachment;\n\t\t\t\tattachments.push({\n\t\t\t\t\tname: ingested.name,\n\t\t\t\t\turl: ingested.url,\n\t\t\t\t\tdownloadUrl: ingested.downloadUrl,\n\t\t\t\t\tcontentType: ingested.contentType,\n\t\t\t\t\tsizeBytes: ingested.sizeBytes,\n\t\t\t\t\tblobPath: ingested.blobPath,\n\t\t\t\t\tsource: \"telegram\",\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tif (message.media instanceof Api.MessageMediaPhoto) {\n\t\t\tconst buffer = await this.downloadMediaBuffer(message);\n\t\t\tif (buffer) {\n\t\t\t\tconst fileName = `telegram-photo-${message.id ?? Date.now()}.jpg`;\n\t\t\t\tawait pushAttachment(buffer, fileName, \"image/jpeg\");\n\t\t\t}\n\t\t\treturn attachments;\n\t\t}\n\n\t\tif (message.media instanceof Api.MessageMediaDocument) {\n\t\t\tconst document = message.media.document;\n\t\t\tif (!document || !(document instanceof Api.Document)) {\n\t\t\t\treturn attachments;\n\t\t\t}\n\n\t\t\tconst buffer = await this.downloadMediaBuffer(message);\n\t\t\tif (!buffer) {\n\t\t\t\treturn attachments;\n\t\t\t}\n\n\t\t\tconst mimeType = document.mimeType ?? \"application/octet-stream\";\n\t\t\tlet fileName = `telegram-file-${document.id ?? message.id ?? Date.now()}`;\n\n\t\t\tfor (const attr of document.attributes ?? []) {\n\t\t\t\tif (attr instanceof Api.DocumentAttributeFilename) {\n\t\t\t\t\tfileName = attr.fileName;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait pushAttachment(buffer, fileName, mimeType);\n\t\t\treturn attachments;\n\t\t}\n\n\t\treturn attachments;\n\t}\n\n\tprivate async resolveTelegramFile(image: Image): Promise<string | CustomFile> {\n\t\tif (image.base64) {\n\t\t\tconst buffer = this.decodeBase64Payload(image);\n\t\t\tif (buffer) {\n\t\t\t\tconst name = this.inferFileName(image);\n\t\t\t\treturn new CustomFile(name, buffer.length, \"\", buffer);\n\t\t\t}\n\t\t}\n\n\t\tif (image.path) {\n\t\t\treturn image.path;\n\t\t}\n\n\t\tif (image.url) {\n\t\t\treturn image.url;\n\t\t}\n\n\t\tthrow new Error(\"Unable to resolve Telegram file source from image payload\");\n\t}\n\n\t/**\n\t * Build InputPeer based on contactId and metadata\n\t * If metadata lacks accessHash, will try to resolve entity from Telegram API\n\t */\n\tprivate async buildInputPeerFromMetadata(contactId: string): Promise<Api.TypeInputPeer> {\n\t\tconst metadata = this.contactMetadata[contactId];\n\n\t\tif (!metadata) {\n\t\t\t// If no metadata, try to resolve entity from Telegram API\n\t\t\treturn await this.resolveEntityToInputPeer(contactId);\n\t\t}\n\n\t\tconst peerId = bigInt(metadata.peerId);\n\n\t\tif (metadata.peerType === \"user\") {\n\t\t\tif (metadata.accessHash) {\n\t\t\t\treturn new Api.InputPeerUser({\n\t\t\t\t\tuserId: peerId,\n\t\t\t\t\taccessHash: bigInt(metadata.accessHash),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// No accessHash, try to resolve entity from Telegram API\n\t\t\treturn await this.resolveEntityToInputPeer(contactId, peerId, \"user\");\n\t\t}\n\n\t\tif (metadata.peerType === \"channel\") {\n\t\t\tif (metadata.accessHash) {\n\t\t\t\treturn new Api.InputPeerChannel({\n\t\t\t\t\tchannelId: peerId,\n\t\t\t\t\taccessHash: bigInt(metadata.accessHash),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// No accessHash, try to resolve entity from Telegram API\n\t\t\treturn await this.resolveEntityToInputPeer(contactId, peerId, \"channel\");\n\t\t}\n\n\t\tif (metadata.peerType === \"chat\") {\n\t\t\t// Check if peerId is negative\n\t\t\t// Negative ID is actually channel/supergroup, not regular chat\n\t\t\tif (peerId.isNegative()) {\n\t\t\t\t// Negative ID needs to be handled as channel, try to resolve if no accessHash\n\t\t\t\treturn await this.resolveEntityToInputPeer(contactId, peerId, \"channel\");\n\t\t\t}\n\t\t\treturn new Api.InputPeerChat({\n\t\t\t\tchatId: peerId,\n\t\t\t});\n\t\t}\n\n\t\t// Unknown type, try to resolve\n\t\treturn await this.resolveEntityToInputPeer(contactId);\n\t}\n\n\t/**\n\t * Try to resolve entity from Telegram API and build InputPeer\n\t * Updates contactMetadata cache after successful resolution\n\t */\n\tprivate async resolveEntityToInputPeer(\n\t\tcontactId: string,\n\t\tfallbackPeerId?: BigInteger,\n\t\tfallbackType?: \"user\" | \"channel\",\n\t): Promise<Api.TypeInputPeer> {\n\t\ttry {\n\t\t\tif (!this.client.connected) {\n\t\t\t\tawait this.client.connect();\n\t\t\t}\n\n\t\t\t// Try to resolve entity directly using contactId\n\t\t\tconst entity = await this.client.getEntity(contactId);\n\t\t\tif (!entity) {\n\t\t\t\tthrow new Error(`Entity not found for contactId: ${contactId}`);\n\t\t\t}\n\n\t\t\t// Build and cache metadata\n\t\t\tconst metadata = this.buildMetadataFromEntity(contactId, entity);\n\t\t\tif (metadata) {\n\t\t\t\tthis.contactMetadata[contactId] = metadata;\n\t\t\t}\n\n\t\t\t// Build corresponding InputPeer based on entity type\n\t\t\tif (entity instanceof Api.User) {\n\t\t\t\tconst userId = entity.id.valueOf();\n\t\t\t\tconst accessHash = entity.accessHash ? bigInt(entity.accessHash) : bigInt(0);\n\t\t\t\tconst inputPeer = new Api.InputPeerUser({\n\t\t\t\t\tuserId: bigInt(userId),\n\t\t\t\t\taccessHash,\n\t\t\t\t});\n\t\t\t\treturn inputPeer;\n\t\t\t}\n\n\t\t\tif (entity instanceof Api.Channel) {\n\t\t\t\tconst channelId = entity.id.valueOf();\n\t\t\t\tconst accessHash = entity.accessHash ? bigInt(entity.accessHash) : bigInt(0);\n\t\t\t\tconst inputPeer = new Api.InputPeerChannel({\n\t\t\t\t\tchannelId: bigInt(channelId),\n\t\t\t\t\taccessHash,\n\t\t\t\t});\n\t\t\t\treturn inputPeer;\n\t\t\t}\n\n\t\t\tif (entity instanceof Api.Chat) {\n\t\t\t\tconst chatId = entity.id.valueOf();\n\t\t\t\tconst inputPeer = new Api.InputPeerChat({\n\t\t\t\t\tchatId: bigInt(chatId),\n\t\t\t\t});\n\t\t\t\treturn inputPeer;\n\t\t\t}\n\n\t\t\tthrow new Error(`Unsupported entity type for contactId: ${contactId}`);\n\t\t} catch (error) {\n\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to resolve entity for ${contactId}:`, error);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot resolve Telegram peer for ${contactId}. The contact may not exist or may not be accessible.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async dispatchMessages(\n\t\toperation: string,\n\t\tpeer: string,\n\t\ttextParts: string[],\n\t\timages: Image[],\n\t): Promise<void> {\n\t\tconst text = textParts.join(\"\\n\").trim();\n\n\t\t// Build correct InputPeer using metadata (now async)\n\t\tconst inputPeer = await this.buildInputPeerFromMetadata(peer);\n\n\t\tif (images.length === 0) {\n\t\t\tif (text.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait withTimeout(\n\t\t\t\tthis.client.sendMessage(inputPeer, {\n\t\t\t\t\tmessage: markdownToTelegramHtml(text),\n\t\t\t\t\tparseMode: \"html\",\n\t\t\t\t}),\n\t\t\t\tSEND_MESSAGE_TIMEOUT_MS,\n\t\t\t\t`[Bot ${this.botId}] Telegram client.sendMessage()`,\n\t\t\t);\n\t\t\tif (DEBUG) {\n\t\t\t\tconsole.log(`[Bot ${this.botId}] [telegram] Message sent successfully to ${peer}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst caption = text.length > 0 ? text : undefined;\n\t\tlet captionDelivered = false;\n\n\t\tfor (let index = 0; index < images.length; index++) {\n\t\t\tconst image = images[index];\n\t\t\tlet fileLike: string | CustomFile;\n\t\t\ttry {\n\t\t\t\tfileLike = await this.resolveTelegramFile(image);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[Bot ${this.botId}] [telegram] Failed to resolve file for upload`, error);\n\t\t\t\tthrow this.toAdapterError(operation, error, {\n\t\t\t\t\tfallbackCode: \"invalid_request_error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst options: Parameters<TelegramClient[\"sendFile\"]>[1] = {\n\t\t\t\tfile: fileLike,\n\t\t\t};\n\n\t\t\tif (index === 0 && caption) {\n\t\t\t\toptions.caption = caption;\n\t\t\t}\n\n\t\t\tawait withTimeout(\n\t\t\t\tthis.client.sendFile(inputPeer, options),\n\t\t\t\tSEND_MESSAGE_TIMEOUT_MS,\n\t\t\t\t`[Bot ${this.botId}] Telegram client.sendFile()`,\n\t\t\t);\n\n\t\t\tif (index === 0 && caption) {\n\t\t\t\tcaptionDelivered = true;\n\t\t\t}\n\n\t\t\tif (DEBUG) {\n\t\t\t\tconsole.log(`[Bot ${this.botId}] [telegram] File sent successfully to ${peer}`);\n\t\t\t}\n\t\t}\n\n\t\tif (caption && !captionDelivered) {\n\t\t\tawait withTimeout(\n\t\t\t\tthis.client.sendMessage(inputPeer, {\n\t\t\t\t\tmessage: markdownToTelegramHtml(text),\n\t\t\t\t\tparseMode: \"html\",\n\t\t\t\t}),\n\t\t\t\tSEND_MESSAGE_TIMEOUT_MS,\n\t\t\t\t`[Bot ${this.botId}] Telegram client.sendMessage()`,\n\t\t\t);\n\t\t\tif (DEBUG) {\n\t\t\t\tconsole.log(`[Bot ${this.botId}] [telegram] Caption message sent successfully to ${peer}`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport { getTgUserNameString } from \"@melandlabs/integrations-channels/sources/types\";\nexport type {\n\tDialogInfo,\n\tTgUserInfo,\n\tExtractedMessageInfo,\n} from \"@melandlabs/integrations-channels/sources/types\";\n\nexport function opencontextMessageToTgText(message: Message): string {\n\tif (typeof message === \"string\") {\n\t\treturn message;\n\t}\n\tif (\"text\" in message) {\n\t\treturn message.text;\n\t}\n\tif (\"target\" in message) {\n\t\treturn `@${message.target}`;\n\t}\n\tif (\"nodes\" in message) {\n\t\treturn message.nodes.map((node) => opencontextMessageToTgText(node as unknown as Message)).join(\"\");\n\t}\n\treturn \"\";\n}\n\nfunction describeUnsupportedMessage(message: Message): string {\n\tif (!message || typeof message !== \"object\") return typeof message;\n\tif (\"name\" in message && \"url\" in message) return \"file\";\n\tif (\"length\" in message && \"url\" in message) return \"voice\";\n\tif (\"origin\" in message) return \"quote\";\n\tif (\"time\" in message && \"id\" in message) return \"source\";\n\tif (\"display\" in message && \"nodes\" in message) return \"forward\";\n\tif (\"type\" in message && \"name\" in message) return \"emoji\";\n\treturn \"content\";\n}\n\nexport function tgMessageToopencontextMessage(message: Api.Message): Messages {\n\tconst messages: Messages = [];\n\n\tif (!message.message) {\n\t\tif (message.media) {\n\t\t\tmessages.push(\"[Media content]\");\n\t\t}\n\t\treturn messages;\n\t}\n\n\tmessages.push(message.message);\n\n\tif (message.entities) {\n\t\tfor (const entity of message.entities) {\n\t\t\tif (entity instanceof Api.MessageEntityMention) {\n\t\t\t\tconst mentionText = message.message.substr(entity.offset, entity.length);\n\t\t\t\tmessages.push({ target: mentionText.replace(\"@\", \"\") } as At);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn messages;\n}\n"]}
|