@vervedoc/core 3.0.10

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.
Files changed (45) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +405 -0
  3. package/dist/DocxEditor.d.ts +17 -0
  4. package/dist/actuator/Actuator.d.ts +22 -0
  5. package/dist/assets/runtime.worker-BUGfHnel.js.map +1 -0
  6. package/dist/core.js +3997 -0
  7. package/dist/core.js.map +1 -0
  8. package/dist/core.umd.cjs +135 -0
  9. package/dist/core.umd.cjs.map +1 -0
  10. package/dist/docxParser/constants.d.ts +42 -0
  11. package/dist/docxParser/docx.parser.d.ts +13 -0
  12. package/dist/docxParser/index.d.ts +13 -0
  13. package/dist/docxParser/types.d.ts +170 -0
  14. package/dist/docxParser/worker/builder/element.builder.d.ts +6 -0
  15. package/dist/docxParser/worker/docx.parse.worker.d.ts +1 -0
  16. package/dist/docxParser/worker/numbering.resolver.d.ts +29 -0
  17. package/dist/docxParser/worker/parsers/chart.parser.d.ts +16 -0
  18. package/dist/docxParser/worker/parsers/comment.parser.d.ts +5 -0
  19. package/dist/docxParser/worker/parsers/hyperlink.parser.d.ts +14 -0
  20. package/dist/docxParser/worker/parsers/image.parser.d.ts +12 -0
  21. package/dist/docxParser/worker/parsers/list.parser.d.ts +6 -0
  22. package/dist/docxParser/worker/parsers/ooxml.chart.parser.d.ts +4 -0
  23. package/dist/docxParser/worker/parsers/paragraph.parser.d.ts +10 -0
  24. package/dist/docxParser/worker/parsers/run.parser.d.ts +22 -0
  25. package/dist/docxParser/worker/parsers/section.parser.d.ts +20 -0
  26. package/dist/docxParser/worker/parsers/table.parser.d.ts +11 -0
  27. package/dist/docxParser/worker/parsers/toc.parser.d.ts +13 -0
  28. package/dist/docxParser/worker/relationship.resolver.d.ts +17 -0
  29. package/dist/docxParser/worker/style.resolver.d.ts +33 -0
  30. package/dist/docxParser/worker/theme.resolver.d.ts +21 -0
  31. package/dist/docxParser/worker/xml.helper.d.ts +36 -0
  32. package/dist/export/ExportComponent.d.ts +9 -0
  33. package/dist/i18n/I18n.d.ts +8 -0
  34. package/dist/index-OrDfS8Mp.js +16762 -0
  35. package/dist/index-OrDfS8Mp.js.map +1 -0
  36. package/dist/index.d.ts +26 -0
  37. package/dist/table-contextmenu/TableContextMenu.d.ts +48 -0
  38. package/dist/table-contextmenu/TableContextMenuComponent.d.ts +7 -0
  39. package/dist/utils/clipboard.d.ts +11 -0
  40. package/dist/utils/print.d.ts +7 -0
  41. package/dist/worker/WorkerComponent.d.ts +8 -0
  42. package/dist/worker/WorkerManager.d.ts +21 -0
  43. package/dist/worker/WorkerMessage.d.ts +21 -0
  44. package/dist/worker/runtime.worker.d.ts +1 -0
  45. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sources":["../src/worker/WorkerManager.ts","../src/worker/WorkerComponent.ts","../src/export/ExportComponent.ts","../node_modules/vanilla-picker/dist/vanilla-picker.mjs","../src/table-contextmenu/TableContextMenu.ts","../src/table-contextmenu/TableContextMenuComponent.ts","../src/utils/print.ts","../src/DocxEditor.ts","../src/i18n/I18n.ts","../src/actuator/Actuator.ts","../src/utils/clipboard.ts","../src/docxParser/types.ts","../src/docxParser/constants.ts","../src/docxParser/worker/xml.helper.ts","../src/docxParser/worker/theme.resolver.ts","../src/docxParser/worker/style.resolver.ts","../src/docxParser/worker/numbering.resolver.ts","../src/docxParser/worker/relationship.resolver.ts","../src/docxParser/worker/parsers/run.parser.ts","../src/docxParser/worker/parsers/image.parser.ts","../src/docxParser/worker/parsers/chart.parser.ts","../src/docxParser/worker/parsers/hyperlink.parser.ts","../src/docxParser/worker/parsers/paragraph.parser.ts","../src/docxParser/worker/parsers/table.parser.ts","../src/docxParser/worker/parsers/toc.parser.ts","../src/docxParser/worker/parsers/section.parser.ts","../src/docxParser/worker/parsers/ooxml.chart.parser.ts","../src/docxParser/worker/parsers/comment.parser.ts","../src/docxParser/worker/builder/element.builder.ts","../src/docxParser/docx.parser.ts","../src/docxParser/index.ts"],"sourcesContent":["import { DOCX_EDITOR_DATA_VERSION, DOCX_EDITOR_SCHEMA_VERSION, getTextFromElementList } from '@vervedoc/docx-editor-schema'\r\nimport type { IEditorResult, IElement, IGetValueOption } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport RuntimeWorker from './runtime.worker?worker&inline'\r\nimport type { IWorkerRequest, IWorkerResponse, IWorkerTaskPayload, WorkerRequestType } from './WorkerMessage'\r\n\r\ntype Draw = any\r\n\r\ninterface IPendingTask<T> {\r\n resolve: (value: T | PromiseLike<T>) => void\r\n reject: (reason?: unknown) => void\r\n}\r\n\r\nfunction collectGroupIds(elementList: IElement[], groupIdSet = new Set<string>(), result: string[] = []) {\r\n for (const element of elementList) {\r\n if (Array.isArray(element?.groupIds)) {\r\n for (const groupId of element.groupIds) {\r\n if (groupId && !groupIdSet.has(groupId)) {\r\n groupIdSet.add(groupId)\r\n result.push(groupId)\r\n }\r\n }\r\n }\r\n if (element?.type === ElementType.TABLE) {\r\n for (const tr of element.trList || []) {\r\n for (const td of tr.tdList || []) {\r\n collectGroupIds(td.value || [], groupIdSet, result)\r\n }\r\n }\r\n continue\r\n }\r\n if (Array.isArray(element?.valueList)) {\r\n collectGroupIds(element.valueList, groupIdSet, result)\r\n }\r\n }\r\n return result\r\n}\r\n\r\nexport class WorkerManager {\r\n private readonly draw: Draw\r\n private worker: Worker | null = null\r\n private readonly pendingTaskMap = new Map<string, IPendingTask<any>>()\r\n private readonly warnedFallbackSet = new Set<string>()\r\n private requestSeed = 0\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this._initWorker()\r\n }\r\n\r\n public getValue(options?: IGetValueOption): Promise<IEditorResult> {\r\n return this._runTask<IEditorResult>(\r\n 'getValue',\r\n {\r\n dataVersion: DOCX_EDITOR_DATA_VERSION,\r\n schemaVersion: DOCX_EDITOR_SCHEMA_VERSION,\r\n editorOptions: this.draw.getOptions(),\r\n valueOptions: options,\r\n originData: this.draw.getOriginValue(options)\r\n },\r\n () => Promise.resolve(this.draw.getValue(options))\r\n )\r\n }\r\n\r\n public getGroupIds(): Promise<string[]> {\r\n return this._runTask<string[]>(\r\n 'getGroupIds',\r\n {\r\n dataVersion: DOCX_EDITOR_DATA_VERSION,\r\n schemaVersion: DOCX_EDITOR_SCHEMA_VERSION,\r\n mainElementList: this.draw.getOriginalMainElementList()\r\n },\r\n () => Promise.resolve(collectGroupIds(this.draw.getOriginalMainElementList()))\r\n )\r\n }\r\n\r\n public getWordCount(): Promise<number> {\r\n return this._runTask<number>(\r\n 'getWordCount',\r\n {\r\n dataVersion: DOCX_EDITOR_DATA_VERSION,\r\n schemaVersion: DOCX_EDITOR_SCHEMA_VERSION,\r\n mainElementList: this.draw.getOriginalMainElementList()\r\n },\r\n () => {\r\n const text = getTextFromElementList(this.draw.getOriginalMainElementList()).replace(/\\u200B/g, '')\r\n return Promise.resolve(text.replace(/\\s/g, '').length)\r\n }\r\n )\r\n }\r\n\r\n public terminate(): void {\r\n this.worker?.terminate()\r\n this.worker = null\r\n this._rejectPendingTasks(new Error('Worker terminated'))\r\n }\r\n\r\n private _initWorker() {\r\n if (typeof Worker === 'undefined') {\r\n this._warnFallback('worker-unavailable', '当前环境不支持 Worker,已降级为主线程执行。')\r\n return\r\n }\r\n try {\r\n this.worker = new RuntimeWorker()\r\n this.worker.onmessage = this._handleMessage\r\n this.worker.onerror = this._handleError\r\n } catch (error) {\r\n this.worker = null\r\n this._warnFallback(\r\n 'worker-init-failed',\r\n `Worker 初始化失败,已降级为主线程执行。`,\r\n error\r\n )\r\n }\r\n }\r\n\r\n private _handleMessage = (event: MessageEvent<IWorkerResponse>) => {\r\n const { id, success, data, error } = event.data\r\n const pendingTask = this.pendingTaskMap.get(id)\r\n if (!pendingTask) return\r\n this.pendingTaskMap.delete(id)\r\n if (success) {\r\n pendingTask.resolve(data)\r\n } else {\r\n pendingTask.reject(new Error(error || 'Worker task failed'))\r\n }\r\n }\r\n\r\n private _handleError = () => {\r\n this._warnFallback('worker-runtime-error', 'Worker 运行时异常,后续任务将降级为主线程执行。')\r\n this.terminate()\r\n }\r\n\r\n private _runTask<T>(\r\n type: WorkerRequestType,\r\n payload: IWorkerTaskPayload,\r\n fallback: () => Promise<T>\r\n ): Promise<T> {\r\n if (!this.worker) {\r\n this._warnFallback(`fallback-${type}`, `${type} 未使用 Worker,已降级为主线程执行。`)\r\n return fallback()\r\n }\r\n const id = `${Date.now()}-${this.requestSeed++}`\r\n const request: IWorkerRequest = { id, type, payload }\r\n return new Promise<T>((resolve, reject) => {\r\n this.pendingTaskMap.set(id, { resolve, reject })\r\n try {\r\n this.worker!.postMessage(request)\r\n } catch (error) {\r\n this.pendingTaskMap.delete(id)\r\n reject(error)\r\n }\r\n }).catch((error) => {\r\n this._warnFallback(`fallback-${type}`, `${type} 的 Worker 执行失败,已降级为主线程执行。`, error)\r\n return fallback()\r\n })\r\n }\r\n\r\n private _rejectPendingTasks(error: Error) {\r\n for (const [, pendingTask] of this.pendingTaskMap) {\r\n pendingTask.reject(error)\r\n }\r\n this.pendingTaskMap.clear()\r\n }\r\n\r\n private _warnFallback(key: string, message: string, error?: unknown) {\r\n if (this.warnedFallbackSet.has(key)) return\r\n this.warnedFallbackSet.add(key)\r\n if (error) {\r\n console.warn(`[WorkerManager] ${message}`, error)\r\n } else {\r\n console.warn(`[WorkerManager] ${message}`)\r\n }\r\n }\r\n}\r\n","import { WorkerManager } from './WorkerManager'\r\n\r\ntype Draw = any\r\n\r\nexport class WorkerComponent {\r\n private workerManager: WorkerManager | null = null\r\n\r\n public install(draw: Draw): this {\r\n this.workerManager = new WorkerManager(draw)\r\n if (typeof draw.setWorkerManager === 'function') {\r\n draw.setWorkerManager(this.workerManager)\r\n }\r\n return this\r\n }\r\n\r\n public getWorkerManager(): WorkerManager | null {\r\n return this.workerManager\r\n }\r\n}\r\n","type Draw = any\r\ntype Command = any\r\n\r\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\r\n const binaryString = atob(base64.replace(/^data:[^;]+;base64,/, ''))\r\n const bytes = new Uint8Array(binaryString.length)\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n return bytes.buffer\r\n}\r\n\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;')\r\n}\r\n\r\nfunction generateTableHtml(element: any): string {\r\n if (!element.trList || !Array.isArray(element.trList)) return ''\r\n\r\n const borderWidth = Number.isFinite(Number(element.borderWidth)) ? Number(element.borderWidth) : 1\r\n const borderColor = typeof element.borderColor === 'string' && element.borderColor ? element.borderColor : '#000000'\r\n const borderStyle = element.borderType === 'dash' ? 'dashed' : 'solid'\r\n const isEmpty = element.borderType === 'empty'\r\n const isExternal = element.borderType === 'external'\r\n const tableBorderStyle = isEmpty\r\n ? 'border: none;'\r\n : isExternal\r\n ? `border: ${borderWidth}px ${borderStyle} ${borderColor};`\r\n : 'border: none;'\r\n const tdBorderStyle = isEmpty\r\n ? 'border: none;'\r\n : isExternal\r\n ? 'border: none;'\r\n : `border: ${borderWidth}px ${borderStyle} ${borderColor};`\r\n\r\n let html = `<table style=\"border-collapse: collapse; width: 100%; ${tableBorderStyle}\">`\r\n for (const tr of element.trList) {\r\n html += '<tr>'\r\n if (tr.tdList && Array.isArray(tr.tdList)) {\r\n for (const td of tr.tdList) {\r\n const colspan = td.colspan ? ` colspan=\"${td.colspan}\"` : ''\r\n const rowspan = td.rowspan ? ` rowspan=\"${td.rowspan}\"` : ''\r\n html += `<td${colspan}${rowspan} style=\"${tdBorderStyle} padding: 4px 8px;\">`\r\n if (td.value && Array.isArray(td.value)) {\r\n for (const item of td.value) {\r\n if (item.value) html += escapeHtml(item.value)\r\n }\r\n }\r\n html += '</td>'\r\n }\r\n }\r\n html += '</tr>'\r\n }\r\n html += '</table>'\r\n return html\r\n}\r\n\r\nexport class ExportComponent {\r\n private _command: Command | null = null\r\n\r\n public install(draw: Draw, command: Command): this {\r\n this._command = command\r\n\r\n const structureAdapter = (draw as any).__structureAdapter\r\n if (structureAdapter) {\r\n structureAdapter.exportDocx = this.exportDocx.bind(this)\r\n structureAdapter.previewHtml = this.previewHtml.bind(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n public async exportDocx(payload?: any): Promise<Blob | null> {\r\n const callback = payload?.callback\r\n try {\r\n const result = this._command.getValue()\r\n const { Document, Packer, Paragraph, TextRun, ImageRun, Table, TableRow, TableCell, WidthType, BorderStyle } = await import('docx')\r\n\r\n const children: any[] = []\r\n const mainData = result.data.main || []\r\n let currentParagraph: any[] = []\r\n\r\n for (const element of mainData) {\r\n const marker = (element as any)?.extension && typeof (element as any).extension === 'object' ? (element as any).extension.bookmarkMarker : null\r\n if (marker?.name) continue\r\n if (element.value === '\\n' || element.type === 'pageBreak') {\r\n if (currentParagraph.length > 0) {\r\n children.push(new Paragraph({ children: currentParagraph }))\r\n currentParagraph = []\r\n }\r\n if (element.type === 'pageBreak') {\r\n children.push(new Paragraph({ pageBreakBefore: true }))\r\n }\r\n } else if (element.type === 'image' && element.value) {\r\n if (currentParagraph.length > 0) {\r\n children.push(new Paragraph({ children: currentParagraph }))\r\n currentParagraph = []\r\n }\r\n try {\r\n const imageData = base64ToArrayBuffer(element.value)\r\n const width = element.width || 200\r\n const height = element.height || 200\r\n children.push(new Paragraph({\r\n children: [\r\n new ImageRun({\r\n data: imageData,\r\n transformation: { width, height },\r\n type: 'png'\r\n })\r\n ]\r\n }))\r\n } catch (imgError) {\r\n console.warn('[ExportComponent] 图片导出失败:', imgError)\r\n }\r\n } else if (element.type === 'table' && element.trList) {\r\n if (currentParagraph.length > 0) {\r\n children.push(new Paragraph({ children: currentParagraph }))\r\n currentParagraph = []\r\n }\r\n try {\r\n const normalizeBorderColor = (color: unknown): string => {\r\n if (typeof color !== 'string') return '000000'\r\n const c = color.trim()\r\n if (!c) return '000000'\r\n return c.startsWith('#') ? c.slice(1) : c\r\n }\r\n const getBorderStyle = (borderType: unknown): any => {\r\n const bt = borderType === 'dash' ? 'dash' : 'single'\r\n if (bt === 'dash') return (BorderStyle as any).DASHED ?? 'dashed'\r\n return (BorderStyle as any).SINGLE ?? 'single'\r\n }\r\n const noneBorderStyle = (BorderStyle as any).NONE ?? (BorderStyle as any).NIL ?? 'none'\r\n const toDocxBorderSize = (w: unknown): number => {\r\n const width = Number(w)\r\n if (!Number.isFinite(width) || width <= 0) return 8\r\n return Math.max(1, Math.round(width * 8))\r\n }\r\n const makeBorder = (payload: { style: any; size: number; color: string }) => ({\r\n style: payload.style,\r\n size: payload.size,\r\n color: payload.color\r\n })\r\n\r\n const borderType = element.borderType ?? 'all'\r\n const borderColor = normalizeBorderColor(element.borderColor)\r\n const baseBorderSize = toDocxBorderSize(element.borderWidth)\r\n const externalBorderSize = element.borderExternalWidth !== undefined ? toDocxBorderSize(element.borderExternalWidth) : baseBorderSize\r\n const lineStyle = getBorderStyle(borderType)\r\n const noneBorder = makeBorder({ style: noneBorderStyle, size: 0, color: borderColor })\r\n const innerBorder = makeBorder({ style: lineStyle, size: baseBorderSize, color: borderColor })\r\n const outerBorder = makeBorder({ style: lineStyle, size: externalBorderSize, color: borderColor })\r\n\r\n const tableBorders =\r\n borderType === 'empty'\r\n ? { top: noneBorder, bottom: noneBorder, left: noneBorder, right: noneBorder, insideHorizontal: noneBorder, insideVertical: noneBorder }\r\n : borderType === 'external'\r\n ? { top: outerBorder, bottom: outerBorder, left: outerBorder, right: outerBorder, insideHorizontal: noneBorder, insideVertical: noneBorder }\r\n : borderType === 'internal'\r\n ? { top: noneBorder, bottom: noneBorder, left: noneBorder, right: noneBorder, insideHorizontal: innerBorder, insideVertical: innerBorder }\r\n : { top: outerBorder, bottom: outerBorder, left: outerBorder, right: outerBorder, insideHorizontal: innerBorder, insideVertical: innerBorder }\r\n\r\n const rows = element.trList.map((tr: any) => {\r\n const cells = (tr.tdList || []).map((td: any) => {\r\n const cellContent = (td.value || []).map((item: any) => item.value || '').join('')\r\n const cellBorders = Array.isArray(td.borderTypes) && td.borderTypes.length\r\n ? {\r\n ...(td.borderTypes.includes('top') ? { top: innerBorder } : {}),\r\n ...(td.borderTypes.includes('right') ? { right: innerBorder } : {}),\r\n ...(td.borderTypes.includes('bottom') ? { bottom: innerBorder } : {}),\r\n ...(td.borderTypes.includes('left') ? { left: innerBorder } : {})\r\n }\r\n : undefined\r\n return new TableCell({\r\n children: [new Paragraph({ children: [new TextRun(cellContent)] })],\r\n columnSpan: td.colspan || 1,\r\n rowSpan: td.rowspan || 1,\r\n ...(cellBorders ? { borders: cellBorders } : {})\r\n })\r\n })\r\n return new TableRow({ children: cells })\r\n })\r\n children.push(new Table({ rows, width: { size: 100, type: WidthType.PERCENTAGE }, borders: tableBorders }))\r\n } catch (tableError) {\r\n console.warn('[ExportComponent] 表格导出失败:', tableError)\r\n }\r\n } else if (element.value) {\r\n const textRunOptions: any = {\r\n text: element.value,\r\n bold: element.bold,\r\n italics: element.italic,\r\n size: (element.size || 10.5) * 2,\r\n font: element.font?.split(',')[0] || 'SimSun',\r\n color: element.color?.replace('#', ''),\r\n underline: element.underline ? {} : undefined,\r\n strike: element.strikeout\r\n }\r\n if (element.revisionType && element.revisionId) {\r\n textRunOptions.revision = {\r\n id: element.revisionId,\r\n author: element.revisionAuthor || '',\r\n date: element.revisionDate || '',\r\n type: element.revisionType === 'insert' ? 'insert' : 'delete'\r\n }\r\n }\r\n currentParagraph.push(new TextRun(textRunOptions))\r\n }\r\n }\r\n\r\n if (currentParagraph.length > 0) {\r\n children.push(new Paragraph({ children: currentParagraph }))\r\n }\r\n\r\n const doc = new Document({ sections: [{ children }] })\r\n const blob = await Packer.toBlob(doc)\r\n if (callback) callback(blob)\r\n return blob\r\n } catch (error) {\r\n console.error('[ExportComponent] 导出 Docx 失败:', error)\r\n return null\r\n }\r\n }\r\n\r\n public previewHtml(payload?: any): string {\r\n const callback = payload?.callback\r\n try {\r\n const result = this._command.getValue()\r\n const mainData = result.data.main || []\r\n let html = ''\r\n\r\n for (const element of mainData) {\r\n if (element.value === '\\n') {\r\n html += '<br>'\r\n } else if (element.type === 'pageBreak') {\r\n html += '<div style=\"page-break-after: always;\"></div>'\r\n } else if (element.type === 'image' && element.value) {\r\n html += `<img src=\"${element.value}\" style=\"max-width: 100%; height: auto;\" />`\r\n } else if (element.type === 'table') {\r\n html += generateTableHtml(element)\r\n } else if (element.value) {\r\n const styles: string[] = []\r\n if (element.bold) styles.push('font-weight: bold')\r\n if (element.italic) styles.push('font-style: italic')\r\n if (element.underline) styles.push('text-decoration: underline')\r\n if (element.strikeout) styles.push('text-decoration: line-through')\r\n if (element.color) styles.push(`color: ${element.color}`)\r\n if (element.highlight) styles.push(`background-color: ${element.highlight}`)\r\n if (element.size) styles.push(`font-size: ${element.size}px`)\r\n if (element.font) styles.push(`font-family: ${element.font}`)\r\n const styleStr = styles.length > 0 ? ` style=\"${styles.join('; ')}\"` : ''\r\n html += `<span${styleStr}>${escapeHtml(element.value)}</span>`\r\n }\r\n }\r\n\r\n if (callback) callback(html)\r\n return html\r\n } catch (error) {\r\n console.error('[ExportComponent] 预览 HTML 失败:', error)\r\n if (callback) callback('<p>预览失败</p>')\r\n return '<p>预览失败</p>'\r\n }\r\n }\r\n}\r\n","/*!\n * vanilla-picker v2.12.3\n * https://vanilla-picker.js.org\n *\n * Copyright 2017-2024 Andreas Borgen (https://github.com/Sphinxxxx), Adam Brooks (https://github.com/dissimulate)\n * Released under the ISC license.\n */\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar slicedToArray = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n}();\n\nString.prototype.startsWith = String.prototype.startsWith || function (needle) {\n return this.indexOf(needle) === 0;\n};\nString.prototype.padStart = String.prototype.padStart || function (len, pad) {\n var str = this;while (str.length < len) {\n str = pad + str;\n }return str;\n};\n\nvar colorNames = { cb: '0f8ff', tqw: 'aebd7', q: '-ffff', qmrn: '7fffd4', zr: '0ffff', bg: '5f5dc', bsq: 'e4c4', bck: '---', nch: 'ebcd', b: '--ff', bvt: '8a2be2', brwn: 'a52a2a', brw: 'deb887', ctb: '5f9ea0', hrt: '7fff-', chcT: 'd2691e', cr: '7f50', rnw: '6495ed', crns: '8dc', crms: 'dc143c', cn: '-ffff', Db: '--8b', Dcn: '-8b8b', Dgnr: 'b8860b', Dgr: 'a9a9a9', Dgrn: '-64-', Dkhk: 'bdb76b', Dmgn: '8b-8b', Dvgr: '556b2f', Drng: '8c-', Drch: '9932cc', Dr: '8b--', Dsmn: 'e9967a', Dsgr: '8fbc8f', DsTb: '483d8b', DsTg: '2f4f4f', Dtrq: '-ced1', Dvt: '94-d3', ppnk: '1493', pskb: '-bfff', mgr: '696969', grb: '1e90ff', rbrc: 'b22222', rwht: 'af0', stg: '228b22', chs: '-ff', gnsb: 'dcdcdc', st: '8f8ff', g: 'd7-', gnr: 'daa520', gr: '808080', grn: '-8-0', grnw: 'adff2f', hnw: '0fff0', htpn: '69b4', nnr: 'cd5c5c', ng: '4b-82', vr: '0', khk: '0e68c', vnr: 'e6e6fa', nrb: '0f5', wngr: '7cfc-', mnch: 'acd', Lb: 'add8e6', Lcr: '08080', Lcn: 'e0ffff', Lgnr: 'afad2', Lgr: 'd3d3d3', Lgrn: '90ee90', Lpnk: 'b6c1', Lsmn: 'a07a', Lsgr: '20b2aa', Lskb: '87cefa', LsTg: '778899', Lstb: 'b0c4de', Lw: 'e0', m: '-ff-', mgrn: '32cd32', nn: 'af0e6', mgnt: '-ff', mrn: '8--0', mqm: '66cdaa', mmb: '--cd', mmrc: 'ba55d3', mmpr: '9370db', msg: '3cb371', mmsT: '7b68ee', '': '-fa9a', mtr: '48d1cc', mmvt: 'c71585', mnLb: '191970', ntc: '5fffa', mstr: 'e4e1', mccs: 'e4b5', vjw: 'dead', nv: '--80', c: 'df5e6', v: '808-0', vrb: '6b8e23', rng: 'a5-', rngr: '45-', rch: 'da70d6', pgnr: 'eee8aa', pgrn: '98fb98', ptrq: 'afeeee', pvtr: 'db7093', ppwh: 'efd5', pchp: 'dab9', pr: 'cd853f', pnk: 'c0cb', pm: 'dda0dd', pwrb: 'b0e0e6', prp: '8-080', cc: '663399', r: '--', sbr: 'bc8f8f', rb: '4169e1', sbrw: '8b4513', smn: 'a8072', nbr: '4a460', sgrn: '2e8b57', ssh: '5ee', snn: 'a0522d', svr: 'c0c0c0', skb: '87ceeb', sTb: '6a5acd', sTgr: '708090', snw: 'afa', n: '-ff7f', stb: '4682b4', tn: 'd2b48c', t: '-8080', thst: 'd8bfd8', tmT: '6347', trqs: '40e0d0', vt: 'ee82ee', whT: '5deb3', wht: '', hts: '5f5f5', w: '-', wgrn: '9acd32' };\n\nfunction printNum(num) {\n var decs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n var str = decs > 0 ? num.toFixed(decs).replace(/0+$/, '').replace(/\\.$/, '') : num.toString();\n return str || '0';\n}\n\nvar Color = function () {\n function Color(r, g, b, a) {\n classCallCheck(this, Color);\n\n\n var that = this;\n function parseString(input) {\n\n if (input.startsWith('hsl')) {\n var _input$match$map = input.match(/([\\-\\d\\.e]+)/g).map(Number),\n _input$match$map2 = slicedToArray(_input$match$map, 4),\n h = _input$match$map2[0],\n s = _input$match$map2[1],\n l = _input$match$map2[2],\n _a = _input$match$map2[3];\n\n if (_a === undefined) {\n _a = 1;\n }\n\n h /= 360;\n s /= 100;\n l /= 100;\n that.hsla = [h, s, l, _a];\n } else if (input.startsWith('rgb')) {\n var _input$match$map3 = input.match(/([\\-\\d\\.e]+)/g).map(Number),\n _input$match$map4 = slicedToArray(_input$match$map3, 4),\n _r = _input$match$map4[0],\n _g = _input$match$map4[1],\n _b = _input$match$map4[2],\n _a2 = _input$match$map4[3];\n\n if (_a2 === undefined) {\n _a2 = 1;\n }\n\n that.rgba = [_r, _g, _b, _a2];\n } else {\n if (input.startsWith('#')) {\n that.rgba = Color.hexToRgb(input);\n } else {\n that.rgba = Color.nameToRgb(input) || Color.hexToRgb(input);\n }\n }\n }\n\n if (r === undefined) ; else if (Array.isArray(r)) {\n this.rgba = r;\n } else if (b === undefined) {\n var color = r && '' + r;\n if (color) {\n parseString(color.toLowerCase());\n }\n } else {\n this.rgba = [r, g, b, a === undefined ? 1 : a];\n }\n }\n\n createClass(Color, [{\n key: 'printRGB',\n value: function printRGB(alpha) {\n var rgb = alpha ? this.rgba : this.rgba.slice(0, 3),\n vals = rgb.map(function (x, i) {\n return printNum(x, i === 3 ? 3 : 0);\n });\n\n return alpha ? 'rgba(' + vals + ')' : 'rgb(' + vals + ')';\n }\n }, {\n key: 'printHSL',\n value: function printHSL(alpha) {\n var mults = [360, 100, 100, 1],\n suff = ['', '%', '%', ''];\n\n var hsl = alpha ? this.hsla : this.hsla.slice(0, 3),\n vals = hsl.map(function (x, i) {\n return printNum(x * mults[i], i === 3 ? 3 : 1) + suff[i];\n });\n\n return alpha ? 'hsla(' + vals + ')' : 'hsl(' + vals + ')';\n }\n }, {\n key: 'printHex',\n value: function printHex(alpha) {\n var hex = this.hex;\n return alpha ? hex : hex.substring(0, 7);\n }\n }, {\n key: 'rgba',\n get: function get() {\n if (this._rgba) {\n return this._rgba;\n }\n if (!this._hsla) {\n throw new Error('No color is set');\n }\n\n return this._rgba = Color.hslToRgb(this._hsla);\n },\n set: function set(rgb) {\n if (rgb.length === 3) {\n rgb[3] = 1;\n }\n\n this._rgba = rgb;\n this._hsla = null;\n }\n }, {\n key: 'rgbString',\n get: function get() {\n return this.printRGB();\n }\n }, {\n key: 'rgbaString',\n get: function get() {\n return this.printRGB(true);\n }\n }, {\n key: 'hsla',\n get: function get() {\n if (this._hsla) {\n return this._hsla;\n }\n if (!this._rgba) {\n throw new Error('No color is set');\n }\n\n return this._hsla = Color.rgbToHsl(this._rgba);\n },\n set: function set(hsl) {\n if (hsl.length === 3) {\n hsl[3] = 1;\n }\n\n this._hsla = hsl;\n this._rgba = null;\n }\n }, {\n key: 'hslString',\n get: function get() {\n return this.printHSL();\n }\n }, {\n key: 'hslaString',\n get: function get() {\n return this.printHSL(true);\n }\n }, {\n key: 'hex',\n get: function get() {\n var rgb = this.rgba,\n hex = rgb.map(function (x, i) {\n return i < 3 ? x.toString(16) : Math.round(x * 255).toString(16);\n });\n\n return '#' + hex.map(function (x) {\n return x.padStart(2, '0');\n }).join('');\n },\n set: function set(hex) {\n this.rgba = Color.hexToRgb(hex);\n }\n }], [{\n key: 'hexToRgb',\n value: function hexToRgb(input) {\n\n var hex = (input.startsWith('#') ? input.slice(1) : input).replace(/^(\\w{3})$/, '$1F').replace(/^(\\w)(\\w)(\\w)(\\w)$/, '$1$1$2$2$3$3$4$4').replace(/^(\\w{6})$/, '$1FF');\n\n if (!hex.match(/^([0-9a-fA-F]{8})$/)) {\n throw new Error('Unknown hex color; ' + input);\n }\n\n var rgba = hex.match(/^(\\w\\w)(\\w\\w)(\\w\\w)(\\w\\w)$/).slice(1).map(function (x) {\n return parseInt(x, 16);\n });\n\n rgba[3] = rgba[3] / 255;\n return rgba;\n }\n }, {\n key: 'nameToRgb',\n value: function nameToRgb(input) {\n\n var hash = input.toLowerCase().replace('at', 'T').replace(/[aeiouyldf]/g, '').replace('ght', 'L').replace('rk', 'D').slice(-5, 4),\n hex = colorNames[hash];\n return hex === undefined ? hex : Color.hexToRgb(hex.replace(/\\-/g, '00').padStart(6, 'f'));\n }\n }, {\n key: 'rgbToHsl',\n value: function rgbToHsl(_ref) {\n var _ref2 = slicedToArray(_ref, 4),\n r = _ref2[0],\n g = _ref2[1],\n b = _ref2[2],\n a = _ref2[3];\n\n r /= 255;\n g /= 255;\n b /= 255;\n\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h = void 0,\n s = void 0,\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0;\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);break;\n case g:\n h = (b - r) / d + 2;break;\n case b:\n h = (r - g) / d + 4;break;\n }\n\n h /= 6;\n }\n\n return [h, s, l, a];\n }\n }, {\n key: 'hslToRgb',\n value: function hslToRgb(_ref3) {\n var _ref4 = slicedToArray(_ref3, 4),\n h = _ref4[0],\n s = _ref4[1],\n l = _ref4[2],\n a = _ref4[3];\n\n var r = void 0,\n g = void 0,\n b = void 0;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n var hue2rgb = function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s,\n p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n var rgba = [r * 255, g * 255, b * 255].map(Math.round);\n rgba[3] = a;\n\n return rgba;\n }\n }]);\n return Color;\n}();\n\nvar EventBucket = function () {\n function EventBucket() {\n classCallCheck(this, EventBucket);\n\n this._events = [];\n }\n\n createClass(EventBucket, [{\n key: 'add',\n value: function add(target, type, handler) {\n target.addEventListener(type, handler, false);\n this._events.push({\n target: target,\n type: type,\n handler: handler\n });\n }\n }, {\n key: 'remove',\n value: function remove(target, type, handler) {\n this._events = this._events.filter(function (e) {\n var isMatch = true;\n if (target && target !== e.target) {\n isMatch = false;\n }\n if (type && type !== e.type) {\n isMatch = false;\n }\n if (handler && handler !== e.handler) {\n isMatch = false;\n }\n\n if (isMatch) {\n EventBucket._doRemove(e.target, e.type, e.handler);\n }\n return !isMatch;\n });\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this._events.forEach(function (e) {\n return EventBucket._doRemove(e.target, e.type, e.handler);\n });\n this._events = [];\n }\n }], [{\n key: '_doRemove',\n value: function _doRemove(target, type, handler) {\n target.removeEventListener(type, handler, false);\n }\n }]);\n return EventBucket;\n}();\n\nfunction parseHTML(htmlString) {\n\n var div = document.createElement('div');\n div.innerHTML = htmlString;\n return div.firstElementChild;\n}\n\nfunction dragTrack(eventBucket, area, callback) {\n var dragging = false;\n\n function clamp(val, min, max) {\n return Math.max(min, Math.min(val, max));\n }\n\n function onMove(e, info, starting) {\n if (starting) {\n dragging = true;\n }\n if (!dragging) {\n return;\n }\n\n e.preventDefault();\n\n var bounds = area.getBoundingClientRect(),\n w = bounds.width,\n h = bounds.height,\n x = info.clientX,\n y = info.clientY;\n\n var relX = clamp(x - bounds.left, 0, w),\n relY = clamp(y - bounds.top, 0, h);\n\n callback(relX / w, relY / h);\n }\n\n function onMouse(e, starting) {\n var button = e.buttons === undefined ? e.which : e.buttons;\n if (button === 1) {\n onMove(e, e, starting);\n } else {\n dragging = false;\n }\n }\n\n function onTouch(e, starting) {\n if (e.touches.length === 1) {\n onMove(e, e.touches[0], starting);\n } else {\n dragging = false;\n }\n }\n\n eventBucket.add(area, 'mousedown', function (e) {\n onMouse(e, true);\n });\n eventBucket.add(area, 'touchstart', function (e) {\n onTouch(e, true);\n });\n eventBucket.add(window, 'mousemove', onMouse);\n eventBucket.add(area, 'touchmove', onTouch);\n eventBucket.add(window, 'mouseup', function (e) {\n dragging = false;\n });\n eventBucket.add(area, 'touchend', function (e) {\n dragging = false;\n });\n eventBucket.add(area, 'touchcancel', function (e) {\n dragging = false;\n });\n}\n\nvar BG_TRANSP = 'linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em,\\n linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em';\nvar HUES = 360;\n\nvar EVENT_KEY = 'keydown',\n EVENT_CLICK_OUTSIDE = 'mousedown',\n EVENT_TAB_MOVE = 'focusin';\n\nfunction $(selector, context) {\n return (context || document).querySelector(selector);\n}\n\nfunction stopEvent(e) {\n\n e.preventDefault();\n e.stopPropagation();\n}\nfunction onKey(bucket, target, keys, handler, stop) {\n bucket.add(target, EVENT_KEY, function (e) {\n if (keys.indexOf(e.key) >= 0) {\n if (stop) {\n stopEvent(e);\n }\n handler(e);\n }\n });\n}\n\nvar Picker = function () {\n function Picker(options) {\n classCallCheck(this, Picker);\n\n\n this.settings = {\n\n popup: 'right',\n layout: 'default',\n alpha: true,\n editor: true,\n editorFormat: 'hex',\n cancelButton: false,\n defaultColor: '#0cf'\n };\n\n this._events = new EventBucket();\n\n this.onChange = null;\n\n this.onDone = null;\n\n this.onOpen = null;\n\n this.onClose = null;\n\n this.setOptions(options);\n }\n\n createClass(Picker, [{\n key: 'setOptions',\n value: function setOptions(options) {\n var _this = this;\n\n if (!options) {\n return;\n }\n var settings = this.settings;\n\n function transfer(source, target, skipKeys) {\n for (var key in source) {\n if (skipKeys && skipKeys.indexOf(key) >= 0) {\n continue;\n }\n\n target[key] = source[key];\n }\n }\n\n if (options instanceof HTMLElement) {\n settings.parent = options;\n } else {\n\n if (settings.parent && options.parent && settings.parent !== options.parent) {\n this._events.remove(settings.parent);\n this._popupInited = false;\n }\n\n transfer(options, settings);\n\n if (options.onChange) {\n this.onChange = options.onChange;\n }\n if (options.onDone) {\n this.onDone = options.onDone;\n }\n if (options.onOpen) {\n this.onOpen = options.onOpen;\n }\n if (options.onClose) {\n this.onClose = options.onClose;\n }\n\n var col = options.color || options.colour;\n if (col) {\n this._setColor(col);\n }\n }\n\n var parent = settings.parent;\n if (parent && settings.popup && !this._popupInited) {\n\n var openProxy = function openProxy(e) {\n return _this.openHandler(e);\n };\n\n this._events.add(parent, 'click', openProxy);\n\n onKey(this._events, parent, [' ', 'Spacebar', 'Enter'], openProxy);\n\n this._popupInited = true;\n } else if (options.parent && !settings.popup) {\n this.show();\n }\n }\n }, {\n key: 'openHandler',\n value: function openHandler(e) {\n if (this.show()) {\n\n e && e.preventDefault();\n\n this.settings.parent.style.pointerEvents = 'none';\n\n var toFocus = e && e.type === EVENT_KEY ? this._domEdit : this.domElement;\n setTimeout(function () {\n return toFocus.focus();\n }, 100);\n\n if (this.onOpen) {\n this.onOpen(this.colour);\n }\n }\n }\n }, {\n key: 'closeHandler',\n value: function closeHandler(e) {\n var event = e && e.type;\n var doHide = false;\n\n if (!e) {\n doHide = true;\n } else if (event === EVENT_CLICK_OUTSIDE || event === EVENT_TAB_MOVE) {\n\n var knownTime = (this.__containedEvent || 0) + 100;\n if (e.timeStamp > knownTime) {\n doHide = true;\n }\n } else {\n\n stopEvent(e);\n\n doHide = true;\n }\n\n if (doHide && this.hide()) {\n this.settings.parent.style.pointerEvents = '';\n\n if (event !== EVENT_CLICK_OUTSIDE) {\n this.settings.parent.focus();\n }\n\n if (this.onClose) {\n this.onClose(this.colour);\n }\n }\n }\n }, {\n key: 'movePopup',\n value: function movePopup(options, open) {\n\n this.closeHandler();\n\n this.setOptions(options);\n if (open) {\n this.openHandler();\n }\n }\n }, {\n key: 'setColor',\n value: function setColor(color, silent) {\n this._setColor(color, { silent: silent });\n }\n }, {\n key: '_setColor',\n value: function _setColor(color, flags) {\n if (typeof color === 'string') {\n color = color.trim();\n }\n if (!color) {\n return;\n }\n\n flags = flags || {};\n var c = void 0;\n try {\n\n c = new Color(color);\n } catch (ex) {\n if (flags.failSilently) {\n return;\n }\n throw ex;\n }\n\n if (!this.settings.alpha) {\n var hsla = c.hsla;\n hsla[3] = 1;\n c.hsla = hsla;\n }\n this.colour = this.color = c;\n this._setHSLA(null, null, null, null, flags);\n }\n }, {\n key: 'setColour',\n value: function setColour(colour, silent) {\n this.setColor(colour, silent);\n }\n }, {\n key: 'show',\n value: function show() {\n var parent = this.settings.parent;\n if (!parent) {\n return false;\n }\n\n if (this.domElement) {\n var toggled = this._toggleDOM(true);\n\n this._setPosition();\n\n return toggled;\n }\n\n var html = this.settings.template || '<div class=\"picker_wrapper\" tabindex=\"-1\"><div class=\"picker_arrow\"></div><div class=\"picker_hue picker_slider\"><div class=\"picker_selector\"></div></div><div class=\"picker_sl\"><div class=\"picker_selector\"></div></div><div class=\"picker_alpha picker_slider\"><div class=\"picker_selector\"></div></div><div class=\"picker_editor\"><input aria-label=\"Type a color name or hex value\"/></div><div class=\"picker_sample\"></div><div class=\"picker_done\"><button>Ok</button></div><div class=\"picker_cancel\"><button>Cancel</button></div></div>';\n var wrapper = parseHTML(html);\n\n this.domElement = wrapper;\n this._domH = $('.picker_hue', wrapper);\n this._domSL = $('.picker_sl', wrapper);\n this._domA = $('.picker_alpha', wrapper);\n this._domEdit = $('.picker_editor input', wrapper);\n this._domSample = $('.picker_sample', wrapper);\n this._domOkay = $('.picker_done button', wrapper);\n this._domCancel = $('.picker_cancel button', wrapper);\n\n wrapper.classList.add('layout_' + this.settings.layout);\n if (!this.settings.alpha) {\n wrapper.classList.add('no_alpha');\n }\n if (!this.settings.editor) {\n wrapper.classList.add('no_editor');\n }\n if (!this.settings.cancelButton) {\n wrapper.classList.add('no_cancel');\n }\n this._ifPopup(function () {\n return wrapper.classList.add('popup');\n });\n\n this._setPosition();\n\n if (this.colour) {\n this._updateUI();\n } else {\n this._setColor(this.settings.defaultColor);\n }\n this._bindEvents();\n\n return true;\n }\n }, {\n key: 'hide',\n value: function hide() {\n return this._toggleDOM(false);\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this._events.destroy();\n if (this.domElement) {\n this.settings.parent.removeChild(this.domElement);\n }\n }\n }, {\n key: '_bindEvents',\n value: function _bindEvents() {\n var _this2 = this;\n\n var that = this,\n dom = this.domElement,\n events = this._events;\n\n function addEvent(target, type, handler) {\n events.add(target, type, handler);\n }\n\n addEvent(dom, 'click', function (e) {\n return e.preventDefault();\n });\n\n dragTrack(events, this._domH, function (x, y) {\n return that._setHSLA(x);\n });\n\n dragTrack(events, this._domSL, function (x, y) {\n return that._setHSLA(null, x, 1 - y);\n });\n\n if (this.settings.alpha) {\n dragTrack(events, this._domA, function (x, y) {\n return that._setHSLA(null, null, null, 1 - y);\n });\n }\n\n var editInput = this._domEdit;\n {\n addEvent(editInput, 'input', function (e) {\n that._setColor(this.value, { fromEditor: true, failSilently: true });\n });\n\n addEvent(editInput, 'focus', function (e) {\n var input = this;\n\n if (input.selectionStart === input.selectionEnd) {\n input.select();\n }\n });\n }\n\n this._ifPopup(function () {\n\n var popupCloseProxy = function popupCloseProxy(e) {\n return _this2.closeHandler(e);\n };\n\n addEvent(window, EVENT_CLICK_OUTSIDE, popupCloseProxy);\n addEvent(window, EVENT_TAB_MOVE, popupCloseProxy);\n onKey(events, dom, ['Esc', 'Escape'], popupCloseProxy);\n\n var timeKeeper = function timeKeeper(e) {\n _this2.__containedEvent = e.timeStamp;\n };\n addEvent(dom, EVENT_CLICK_OUTSIDE, timeKeeper);\n\n addEvent(dom, EVENT_TAB_MOVE, timeKeeper);\n\n addEvent(_this2._domCancel, 'click', popupCloseProxy);\n });\n\n var onDoneProxy = function onDoneProxy(e) {\n _this2._ifPopup(function () {\n return _this2.closeHandler(e);\n });\n if (_this2.onDone) {\n _this2.onDone(_this2.colour);\n }\n };\n addEvent(this._domOkay, 'click', onDoneProxy);\n onKey(events, dom, ['Enter'], onDoneProxy);\n }\n }, {\n key: '_setPosition',\n value: function _setPosition() {\n var parent = this.settings.parent,\n elm = this.domElement;\n\n if (parent !== elm.parentNode) {\n parent.appendChild(elm);\n }\n\n this._ifPopup(function (popup) {\n\n if (getComputedStyle(parent).position === 'static') {\n parent.style.position = 'relative';\n }\n\n var cssClass = popup === true ? 'popup_right' : 'popup_' + popup;\n\n ['popup_top', 'popup_bottom', 'popup_left', 'popup_right'].forEach(function (c) {\n\n if (c === cssClass) {\n elm.classList.add(c);\n } else {\n elm.classList.remove(c);\n }\n });\n\n elm.classList.add(cssClass);\n });\n }\n }, {\n key: '_setHSLA',\n value: function _setHSLA(h, s, l, a, flags) {\n flags = flags || {};\n\n var col = this.colour,\n hsla = col.hsla;\n\n [h, s, l, a].forEach(function (x, i) {\n if (x || x === 0) {\n hsla[i] = x;\n }\n });\n col.hsla = hsla;\n\n this._updateUI(flags);\n\n if (this.onChange && !flags.silent) {\n this.onChange(col);\n }\n }\n }, {\n key: '_updateUI',\n value: function _updateUI(flags) {\n if (!this.domElement) {\n return;\n }\n flags = flags || {};\n\n var col = this.colour,\n hsl = col.hsla,\n cssHue = 'hsl(' + hsl[0] * HUES + ', 100%, 50%)',\n cssHSL = col.hslString,\n cssHSLA = col.hslaString;\n\n var uiH = this._domH,\n uiSL = this._domSL,\n uiA = this._domA,\n thumbH = $('.picker_selector', uiH),\n thumbSL = $('.picker_selector', uiSL),\n thumbA = $('.picker_selector', uiA);\n\n function posX(parent, child, relX) {\n child.style.left = relX * 100 + '%';\n }\n function posY(parent, child, relY) {\n child.style.top = relY * 100 + '%';\n }\n\n posX(uiH, thumbH, hsl[0]);\n\n this._domSL.style.backgroundColor = this._domH.style.color = cssHue;\n\n posX(uiSL, thumbSL, hsl[1]);\n posY(uiSL, thumbSL, 1 - hsl[2]);\n\n uiSL.style.color = cssHSL;\n\n posY(uiA, thumbA, 1 - hsl[3]);\n\n var opaque = cssHSL,\n transp = opaque.replace('hsl', 'hsla').replace(')', ', 0)'),\n bg = 'linear-gradient(' + [opaque, transp] + ')';\n\n this._domA.style.background = bg + ', ' + BG_TRANSP;\n\n if (!flags.fromEditor) {\n var format = this.settings.editorFormat,\n alpha = this.settings.alpha;\n\n var value = void 0;\n switch (format) {\n case 'rgb':\n value = col.printRGB(alpha);break;\n case 'hsl':\n value = col.printHSL(alpha);break;\n default:\n value = col.printHex(alpha);\n }\n this._domEdit.value = value;\n }\n\n this._domSample.style.color = cssHSLA;\n }\n }, {\n key: '_ifPopup',\n value: function _ifPopup(actionIf, actionElse) {\n if (this.settings.parent && this.settings.popup) {\n actionIf && actionIf(this.settings.popup);\n } else {\n actionElse && actionElse();\n }\n }\n }, {\n key: '_toggleDOM',\n value: function _toggleDOM(toVisible) {\n var dom = this.domElement;\n if (!dom) {\n return false;\n }\n\n var displayStyle = toVisible ? '' : 'none',\n toggle = dom.style.display !== displayStyle;\n\n if (toggle) {\n dom.style.display = displayStyle;\n }\n return toggle;\n }\n }]);\n return Picker;\n}();\n\n{\n var style = document.createElement('style');\n style.textContent = '.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:\"\";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:\"\";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:\"\";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:\"\";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}';\n document.documentElement.firstElementChild.appendChild(style);\n\n Picker.StyleElement = style;\n}\n\nexport { Picker as default };\n","import { EDITOR_PREFIX, RowFlex, TableBorder, TdBorder, TdSlash, VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport type { IElement, ITd } from '@vervedoc/docx-editor-schema'\r\nimport type { Draw } from '@vervedoc/docx-editor-view'\r\nimport Picker from 'vanilla-picker'\r\n\r\ninterface IMenuItem {\r\n label?: string\r\n icon?: string\r\n title?: string\r\n shortcut?: string\r\n disabled?: boolean\r\n children?: IMenuItem[]\r\n childrenLayout?: 'default' | 'icon-grid'\r\n action?: (anchorElement?: HTMLElement) => void\r\n closeOnClick?: boolean\r\n divider?: boolean\r\n danger?: boolean\r\n active?: boolean\r\n iconOnly?: boolean\r\n inputType?: 'number'\r\n inputDefault?: number\r\n inputMin?: number\r\n inputMax?: number\r\n inputStep?: number\r\n inputAction?: (value: number) => void\r\n unit?: string\r\n previewColor?: string\r\n}\r\n\r\nconst createIcon = (content: string) => `<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">${content}</svg>`\r\n\r\nconst createCellAlignIcon = (\r\n horizontal: 'left' | 'center' | 'right',\r\n vertical: 'top' | 'middle' | 'bottom'\r\n) => {\r\n const lineWidth = horizontal === 'center' ? 5.5 : 4\r\n const x =\r\n horizontal === 'left'\r\n ? 5\r\n : horizontal === 'center'\r\n ? 9 - lineWidth / 2\r\n : 13 - lineWidth\r\n const y = vertical === 'top' ? 5.2 : vertical === 'middle' ? 9 : 12.8\r\n\r\n return createIcon(`\r\n <rect x=\"3.25\" y=\"3.25\" width=\"11.5\" height=\"11.5\" stroke=\"currentColor\" stroke-width=\"1.1\"/>\r\n <path d=\"M${x} ${y}H${x + lineWidth}\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n `)\r\n}\r\n\r\nconst ICONS = {\r\n tableBorder: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M9 2.75V15.25M2.75 9H15.25\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\"/>\r\n `),\r\n borderAll: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M9 2.75V15.25M2.75 9H15.25\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n borderExternal: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\r\n `),\r\n borderInternal: createIcon(`\r\n <path d=\"M9 2.75V15.25M2.75 9H15.25\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"0.8\" stroke-dasharray=\"2 2\" opacity=\"0.45\"/>\r\n `),\r\n borderDash: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-dasharray=\"2 2\"/>\r\n <path d=\"M9 2.75V15.25M2.75 9H15.25\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-dasharray=\"2 2\" stroke-linecap=\"round\"/>\r\n `),\r\n borderNone: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-dasharray=\"2 2\"/>\r\n <path d=\"M4 4L14 14\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n borderColor: createIcon(`\r\n <path d=\"M4 12L9.5 6.5L12 9L6.5 14.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M10.8 5.2L12.8 3.2L14.8 5.2L12.8 7.2\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M4 15H14\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n borderWidth: createIcon(`\r\n <path d=\"M4 5H14\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n <path d=\"M4 9H14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n <path d=\"M4 13H14\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"/>\r\n `),\r\n cellAlign: createCellAlignIcon('center', 'middle'),\r\n alignTopLeft: createCellAlignIcon('left', 'top'),\r\n alignTopCenter: createCellAlignIcon('center', 'top'),\r\n alignTopRight: createCellAlignIcon('right', 'top'),\r\n alignMiddleLeft: createCellAlignIcon('left', 'middle'),\r\n alignMiddleCenter: createCellAlignIcon('center', 'middle'),\r\n alignMiddleRight: createCellAlignIcon('right', 'middle'),\r\n alignBottomLeft: createCellAlignIcon('left', 'bottom'),\r\n alignBottomCenter: createCellAlignIcon('center', 'bottom'),\r\n alignBottomRight: createCellAlignIcon('right', 'bottom'),\r\n insert: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M9 5.25V12.75M5.25 9H12.75\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n insertColLeft: createIcon(`\r\n <rect x=\"6.2\" y=\"2.75\" width=\"8.05\" height=\"12.5\" rx=\"1.2\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M2.8 9H6.2M4.5 7.3V10.7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n insertColRight: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"8.05\" height=\"12.5\" rx=\"1.2\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M11.8 9H15.2M13.5 7.3V10.7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n insertRowAbove: createIcon(`\r\n <rect x=\"2.75\" y=\"6.2\" width=\"12.5\" height=\"8.05\" rx=\"1.2\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M9 2.8V6.2M7.3 4.5H10.7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n insertRowBelow: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"8.05\" rx=\"1.2\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M9 11.8V15.2M7.3 13.5H10.7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n delete: createIcon(`\r\n <path d=\"M5 5L13 13M13 5L5 13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\r\n `),\r\n deleteRow: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M5 9H13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\r\n `),\r\n deleteTable: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M5 5L13 13M13 5L5 13\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n cancelMerge: createIcon(`\r\n <rect x=\"3\" y=\"4\" width=\"5\" height=\"10\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <rect x=\"10\" y=\"4\" width=\"5\" height=\"10\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M8.5 9H9.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\r\n `),\r\n merge: createIcon(`\r\n <rect x=\"3\" y=\"4\" width=\"5\" height=\"10\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <rect x=\"10\" y=\"4\" width=\"5\" height=\"10\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M7.5 9H10.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\r\n `),\r\n split: createIcon(`\r\n <rect x=\"3\" y=\"4\" width=\"12\" height=\"10\" rx=\"1.4\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M9 4V14\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n selectAll: createIcon(`\r\n <rect x=\"2.75\" y=\"2.75\" width=\"12.5\" height=\"12.5\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <rect x=\"5\" y=\"5\" width=\"2.8\" height=\"2.8\" fill=\"currentColor\" opacity=\"0.5\"/>\r\n <rect x=\"10.2\" y=\"5\" width=\"2.8\" height=\"2.8\" fill=\"currentColor\" opacity=\"0.5\"/>\r\n <rect x=\"5\" y=\"10.2\" width=\"2.8\" height=\"2.8\" fill=\"currentColor\" opacity=\"0.5\"/>\r\n <rect x=\"10.2\" y=\"10.2\" width=\"2.8\" height=\"2.8\" fill=\"currentColor\" opacity=\"0.5\"/>\r\n `),\r\n backgroundColor: createIcon(`\r\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <rect x=\"5.5\" y=\"5.5\" width=\"7\" height=\"7\" rx=\"1\" fill=\"currentColor\" opacity=\"0.35\"/>\r\n `),\r\n cellBorder: createIcon(`\r\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M6 6H12M6 9H12M6 12H12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `),\r\n slash: createIcon(`\r\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M5 13L13 5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\r\n `)\r\n}\r\n\r\nexport class TableContextMenu {\r\n private draw: Draw\r\n private menuElement: HTMLDivElement | null = null\r\n private _removeContextmenuHandler: (() => void) | null = null\r\n private subMenuElement: HTMLDivElement | null = null\r\n private _hideSubMenuTimer: number | null = null\r\n private activeColorPanel: HTMLDivElement | null = null\r\n private activePicker: Picker | null = null\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n }\r\n\r\n public show(x: number, y: number, element: IElement) {\r\n this.close()\r\n const menuItems = this._buildMenuItems(element)\r\n this.menuElement = this._createMenuElement(menuItems, x, y)\r\n document.body.appendChild(this.menuElement)\r\n this._bindGlobalEvents()\r\n }\r\n\r\n public close() {\r\n this._destroyActiveColorPanel()\r\n if (this.menuElement) {\r\n this.menuElement.remove()\r\n this.menuElement = null\r\n }\r\n if (this.subMenuElement) {\r\n this.subMenuElement.remove()\r\n this.subMenuElement = null\r\n }\r\n if (this._removeContextmenuHandler) {\r\n this._removeContextmenuHandler()\r\n this._removeContextmenuHandler = null\r\n }\r\n }\r\n\r\n private _buildMenuItems(element: IElement): IMenuItem[] {\r\n const currentTd = this._getCurrentTd(element)\r\n const borderColor = element.borderColor || this._getDefaultBorderColor()\r\n const borderWidth = Number(element.borderWidth ?? 0.5)\r\n const borderExternalWidth = Number(element.borderExternalWidth ?? 0)\r\n const backgroundColor = currentTd?.backgroundColor || '#ffffff'\r\n const isCrossRowCol = !!this.draw.getRange().getRange().isCrossRowCol\r\n const canCancelMerge = this._canCancelMerge(currentTd)\r\n\r\n return [\r\n {\r\n label: '表格边框',\r\n icon: ICONS.tableBorder,\r\n children: [\r\n {\r\n label: '全部边框',\r\n icon: ICONS.borderAll,\r\n active: (element.borderType || TableBorder.ALL) === TableBorder.ALL,\r\n action: () => this._setBorderType(TableBorder.ALL)\r\n },\r\n {\r\n label: '外侧边框',\r\n icon: ICONS.borderExternal,\r\n active: element.borderType === TableBorder.EXTERNAL,\r\n action: () => this._setBorderType(TableBorder.EXTERNAL)\r\n },\r\n {\r\n label: '内部边框',\r\n icon: ICONS.borderInternal,\r\n active: element.borderType === TableBorder.INTERNAL,\r\n action: () => this._setBorderType(TableBorder.INTERNAL)\r\n },\r\n {\r\n label: '虚线边框',\r\n icon: ICONS.borderDash,\r\n active: element.borderType === TableBorder.DASH,\r\n action: () => this._setBorderType(TableBorder.DASH)\r\n },\r\n {\r\n label: '无边框',\r\n icon: ICONS.borderNone,\r\n active: element.borderType === TableBorder.EMPTY,\r\n action: () => this._setBorderType(TableBorder.EMPTY)\r\n },\r\n {\r\n divider: true\r\n },\r\n {\r\n label: '边框颜色',\r\n icon: ICONS.borderColor,\r\n previewColor: borderColor,\r\n closeOnClick: false,\r\n action: (anchorElement) => this._showBorderColorPicker(borderColor, anchorElement)\r\n },\r\n {\r\n label: '边框宽度',\r\n icon: ICONS.borderWidth,\r\n inputType: 'number',\r\n inputDefault: borderWidth,\r\n inputMin: 0,\r\n inputMax: 12,\r\n inputStep: 0.5,\r\n inputAction: (value) => this._setBorderWidth(value)\r\n },\r\n {\r\n label: '外边框宽度',\r\n icon: ICONS.borderExternal,\r\n inputType: 'number',\r\n inputDefault: borderExternalWidth,\r\n inputMin: 0,\r\n inputMax: 12,\r\n inputStep: 0.5,\r\n inputAction: (value) => this._setBorderExternalWidth(value)\r\n }\r\n ]\r\n },\r\n {\r\n label: '单元格对齐方式',\r\n icon: ICONS.cellAlign,\r\n childrenLayout: 'icon-grid',\r\n children: [\r\n {\r\n title: '左上对齐',\r\n icon: ICONS.alignTopLeft,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.TOP, RowFlex.LEFT),\r\n action: () => this._setCellAlign(VerticalAlign.TOP, RowFlex.LEFT)\r\n },\r\n {\r\n title: '中上对齐',\r\n icon: ICONS.alignTopCenter,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.TOP, RowFlex.CENTER),\r\n action: () => this._setCellAlign(VerticalAlign.TOP, RowFlex.CENTER)\r\n },\r\n {\r\n title: '右上对齐',\r\n icon: ICONS.alignTopRight,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.TOP, RowFlex.RIGHT),\r\n action: () => this._setCellAlign(VerticalAlign.TOP, RowFlex.RIGHT)\r\n },\r\n {\r\n title: '左中对齐',\r\n icon: ICONS.alignMiddleLeft,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.MIDDLE, RowFlex.LEFT),\r\n action: () => this._setCellAlign(VerticalAlign.MIDDLE, RowFlex.LEFT)\r\n },\r\n {\r\n title: '居中对齐',\r\n icon: ICONS.alignMiddleCenter,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.MIDDLE, RowFlex.CENTER),\r\n action: () => this._setCellAlign(VerticalAlign.MIDDLE, RowFlex.CENTER)\r\n },\r\n {\r\n title: '右中对齐',\r\n icon: ICONS.alignMiddleRight,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.MIDDLE, RowFlex.RIGHT),\r\n action: () => this._setCellAlign(VerticalAlign.MIDDLE, RowFlex.RIGHT)\r\n },\r\n {\r\n title: '左下对齐',\r\n icon: ICONS.alignBottomLeft,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.BOTTOM, RowFlex.LEFT),\r\n action: () => this._setCellAlign(VerticalAlign.BOTTOM, RowFlex.LEFT)\r\n },\r\n {\r\n title: '中下对齐',\r\n icon: ICONS.alignBottomCenter,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.BOTTOM, RowFlex.CENTER),\r\n action: () => this._setCellAlign(VerticalAlign.BOTTOM, RowFlex.CENTER)\r\n },\r\n {\r\n title: '右下对齐',\r\n icon: ICONS.alignBottomRight,\r\n iconOnly: true,\r\n active: this._isCellAlignActive(currentTd, VerticalAlign.BOTTOM, RowFlex.RIGHT),\r\n action: () => this._setCellAlign(VerticalAlign.BOTTOM, RowFlex.RIGHT)\r\n }\r\n ]\r\n },\r\n {\r\n label: '插入行列',\r\n icon: ICONS.insert,\r\n children: [\r\n {\r\n label: '在左侧插入',\r\n icon: ICONS.insertColLeft,\r\n inputType: 'number',\r\n inputDefault: 1,\r\n inputMin: 1,\r\n inputMax: 100,\r\n inputStep: 1,\r\n inputAction: (count) => this._repeatAction(count, () => {\r\n this.draw.getTableOperate().insertTableLeftCol()\r\n }),\r\n unit: '列'\r\n },\r\n {\r\n label: '在右侧插入',\r\n icon: ICONS.insertColRight,\r\n inputType: 'number',\r\n inputDefault: 1,\r\n inputMin: 1,\r\n inputMax: 100,\r\n inputStep: 1,\r\n inputAction: (count) => this._repeatAction(count, () => {\r\n this.draw.getTableOperate().insertTableRightCol()\r\n }),\r\n unit: '列'\r\n },\r\n {\r\n label: '在上方插入',\r\n icon: ICONS.insertRowAbove,\r\n inputType: 'number',\r\n inputDefault: 1,\r\n inputMin: 1,\r\n inputMax: 100,\r\n inputStep: 1,\r\n inputAction: (count) => this._repeatAction(count, () => {\r\n this.draw.getTableOperate().insertTableTopRow()\r\n }),\r\n unit: '行'\r\n },\r\n {\r\n label: '在下方插入',\r\n icon: ICONS.insertRowBelow,\r\n inputType: 'number',\r\n inputDefault: 1,\r\n inputMin: 1,\r\n inputMax: 100,\r\n inputStep: 1,\r\n inputAction: (count) => this._repeatAction(count, () => {\r\n this.draw.getTableOperate().insertTableBottomRow()\r\n }),\r\n unit: '行'\r\n }\r\n ]\r\n },\r\n {\r\n label: '删除行列',\r\n icon: ICONS.delete,\r\n children: [\r\n {\r\n label: '删除当前行',\r\n icon: ICONS.deleteRow,\r\n action: () => this._deleteRow()\r\n },\r\n {\r\n label: '删除当前列',\r\n icon: ICONS.deleteRow,\r\n action: () => this._deleteColumn()\r\n },\r\n {\r\n label: '删除表格',\r\n icon: ICONS.deleteTable,\r\n danger: true,\r\n action: () => this._deleteTable()\r\n }\r\n ]\r\n },\r\n {\r\n label: '取消合并',\r\n icon: ICONS.cancelMerge,\r\n disabled: !canCancelMerge,\r\n action: () => this._cancelMergeTableCell()\r\n },\r\n {\r\n divider: true\r\n },\r\n {\r\n label: '合并单元格',\r\n icon: ICONS.merge,\r\n disabled: !isCrossRowCol,\r\n action: () => this._mergeTableCell()\r\n },\r\n {\r\n label: '拆分单元格',\r\n icon: ICONS.split,\r\n children: [\r\n {\r\n label: '左右拆分',\r\n icon: ICONS.split,\r\n action: () => this._splitVerticalTableCell()\r\n },\r\n {\r\n label: '上下拆分',\r\n icon: ICONS.split,\r\n action: () => this._splitHorizontalTableCell()\r\n }\r\n ]\r\n },\r\n {\r\n label: '单元格边框',\r\n icon: ICONS.cellBorder,\r\n children: [\r\n {\r\n label: '上边框',\r\n icon: ICONS.cellBorder,\r\n action: () => this._toggleTdBorderType(TdBorder.TOP)\r\n },\r\n {\r\n label: '右边框',\r\n icon: ICONS.cellBorder,\r\n action: () => this._toggleTdBorderType(TdBorder.RIGHT)\r\n },\r\n {\r\n label: '下边框',\r\n icon: ICONS.cellBorder,\r\n action: () => this._toggleTdBorderType(TdBorder.BOTTOM)\r\n },\r\n {\r\n label: '左边框',\r\n icon: ICONS.cellBorder,\r\n action: () => this._toggleTdBorderType(TdBorder.LEFT)\r\n }\r\n ]\r\n },\r\n {\r\n label: '斜线样式',\r\n icon: ICONS.slash,\r\n children: [\r\n {\r\n label: '正斜线',\r\n icon: ICONS.slash,\r\n action: () => this._toggleTdSlashType(TdSlash.FORWARD)\r\n },\r\n {\r\n label: '反斜线',\r\n icon: ICONS.slash,\r\n action: () => this._toggleTdSlashType(TdSlash.BACK)\r\n }\r\n ]\r\n },\r\n {\r\n label: '单元格底纹',\r\n icon: ICONS.backgroundColor,\r\n previewColor: backgroundColor,\r\n closeOnClick: false,\r\n action: (anchorElement) => this._showBackgroundColorPicker(backgroundColor, anchorElement)\r\n },\r\n {\r\n divider: true\r\n },\r\n {\r\n label: '全选表格',\r\n icon: ICONS.selectAll,\r\n action: () => this._selectAllTable()\r\n }\r\n ]\r\n }\r\n\r\n private _createMenuElement(items: IMenuItem[], x: number, y: number): HTMLDivElement {\r\n const menu = document.createElement('div')\r\n menu.classList.add(`${EDITOR_PREFIX}-table-context-menu`)\r\n\r\n items.forEach(item => {\r\n if (item.divider) {\r\n const divider = document.createElement('div')\r\n divider.classList.add(`${EDITOR_PREFIX}-table-context-menu__divider`)\r\n menu.appendChild(divider)\r\n } else {\r\n const menuItem = this._createMenuItem(item)\r\n menu.appendChild(menuItem)\r\n }\r\n })\r\n\r\n menu.style.left = `${x}px`\r\n menu.style.top = `${y}px`\r\n\r\n const rect = menu.getBoundingClientRect()\r\n const viewportWidth = window.innerWidth\r\n const viewportHeight = window.innerHeight\r\n\r\n if (x + rect.width > viewportWidth) {\r\n menu.style.left = `${viewportWidth - rect.width - 10}px`\r\n }\r\n if (y + rect.height > viewportHeight) {\r\n menu.style.top = `${viewportHeight - rect.height - 10}px`\r\n }\r\n\r\n return menu\r\n }\r\n\r\n private _createMenuItem(item: IMenuItem): HTMLDivElement {\r\n const menuItem = document.createElement('div')\r\n menuItem.classList.add(`${EDITOR_PREFIX}-table-context-menu__item`)\r\n if (item.iconOnly) {\r\n menuItem.classList.add(`${EDITOR_PREFIX}-table-context-menu__item--icon-only`)\r\n }\r\n if (item.title || item.label) {\r\n menuItem.title = item.title || item.label || ''\r\n }\r\n\r\n if (item.disabled) {\r\n menuItem.classList.add('disabled')\r\n }\r\n if (item.danger) {\r\n menuItem.classList.add('danger')\r\n }\r\n if (item.active) {\r\n menuItem.classList.add('active')\r\n }\r\n\r\n const main = document.createElement('div')\r\n main.classList.add(`${EDITOR_PREFIX}-table-context-menu__main`)\r\n menuItem.appendChild(main)\r\n\r\n const meta = document.createElement('div')\r\n meta.classList.add(`${EDITOR_PREFIX}-table-context-menu__meta`)\r\n menuItem.appendChild(meta)\r\n\r\n if (item.icon) {\r\n const iconSpan = document.createElement('span')\r\n iconSpan.classList.add(`${EDITOR_PREFIX}-table-context-menu__icon`)\r\n iconSpan.innerHTML = item.icon\r\n main.appendChild(iconSpan)\r\n }\r\n\r\n if (item.label && !item.iconOnly) {\r\n const labelSpan = document.createElement('span')\r\n labelSpan.classList.add(`${EDITOR_PREFIX}-table-context-menu__label`)\r\n labelSpan.textContent = item.label\r\n main.appendChild(labelSpan)\r\n }\r\n\r\n if (item.inputType === 'number') {\r\n const input = document.createElement('input')\r\n input.type = 'number'\r\n input.min = String(item.inputMin ?? 1)\r\n input.max = String(item.inputMax ?? 100)\r\n input.step = String(item.inputStep ?? 1)\r\n input.value = String(item.inputDefault || 1)\r\n input.classList.add(`${EDITOR_PREFIX}-table-context-menu__input-number`)\r\n\r\n input.addEventListener('click', (evt) => evt.stopPropagation())\r\n input.addEventListener('mousedown', (evt) => evt.stopPropagation())\r\n meta.appendChild(input)\r\n\r\n if (item.unit) {\r\n const unitSpan = document.createElement('span')\r\n unitSpan.classList.add(`${EDITOR_PREFIX}-table-context-menu__unit`)\r\n unitSpan.textContent = item.unit\r\n meta.appendChild(unitSpan)\r\n }\r\n\r\n if (item.inputAction) {\r\n menuItem.addEventListener('click', (evt) => {\r\n const value = Number.parseFloat(input.value)\r\n evt.stopPropagation()\r\n item.inputAction!(Number.isFinite(value) ? value : item.inputDefault || 1)\r\n this.close()\r\n })\r\n }\r\n } else {\r\n if (item.previewColor) {\r\n const preview = document.createElement('span')\r\n preview.classList.add(`${EDITOR_PREFIX}-table-context-menu__color-preview`)\r\n preview.style.backgroundColor = item.previewColor\r\n meta.appendChild(preview)\r\n }\r\n\r\n if (item.shortcut) {\r\n const shortcut = document.createElement('span')\r\n shortcut.classList.add(`${EDITOR_PREFIX}-table-context-menu__shortcut`)\r\n shortcut.textContent = item.shortcut\r\n meta.appendChild(shortcut)\r\n }\r\n\r\n if (item.children && item.children.length > 0) {\r\n const arrow = document.createElement('span')\r\n arrow.classList.add(`${EDITOR_PREFIX}-table-context-menu__arrow`)\r\n arrow.textContent = '>'\r\n meta.appendChild(arrow)\r\n\r\n menuItem.addEventListener('mouseenter', (evt) => {\r\n if (this._hideSubMenuTimer) {\r\n clearTimeout(this._hideSubMenuTimer)\r\n this._hideSubMenuTimer = null\r\n }\r\n this._showSubMenu(\r\n evt.currentTarget as HTMLDivElement,\r\n item.children!,\r\n item.childrenLayout || 'default'\r\n )\r\n })\r\n menuItem.addEventListener('mouseleave', () => {\r\n this._delayHideSubMenu()\r\n })\r\n }\r\n\r\n if (item.action && !item.disabled) {\r\n menuItem.addEventListener('click', (evt) => {\r\n evt.stopPropagation()\r\n item.action!(menuItem)\r\n if (item.closeOnClick !== false) {\r\n this.close()\r\n }\r\n })\r\n }\r\n }\r\n\r\n return menuItem\r\n }\r\n\r\n private _showSubMenu(parentItem: HTMLDivElement, children: IMenuItem[], layout: 'default' | 'icon-grid' = 'default') {\r\n this._hideSubMenu()\r\n\r\n const subMenu = document.createElement('div')\r\n subMenu.classList.add(`${EDITOR_PREFIX}-table-context-menu`)\r\n subMenu.classList.add(`${EDITOR_PREFIX}-table-context-menu--sub`)\r\n if (layout === 'icon-grid') {\r\n subMenu.classList.add(`${EDITOR_PREFIX}-table-context-menu--icon-grid`)\r\n }\r\n\r\n children.forEach(child => {\r\n if (child.divider) {\r\n const divider = document.createElement('div')\r\n divider.classList.add(`${EDITOR_PREFIX}-table-context-menu__divider`)\r\n subMenu.appendChild(divider)\r\n } else {\r\n const childItem = this._createMenuItem(child)\r\n subMenu.appendChild(childItem)\r\n }\r\n })\r\n\r\n const parentRect = parentItem.getBoundingClientRect()\r\n const subMenuGap = 5\r\n\r\n let x = parentRect.right + subMenuGap\r\n let y = parentRect.top\r\n\r\n document.body.appendChild(subMenu)\r\n const subRect = subMenu.getBoundingClientRect()\r\n\r\n if (x + subRect.width > window.innerWidth) {\r\n x = parentRect.left - subRect.width - subMenuGap\r\n }\r\n\r\n if (y + subRect.height > window.innerHeight) {\r\n y = window.innerHeight - subRect.height - 10\r\n }\r\n\r\n subMenu.style.left = `${x}px`\r\n subMenu.style.top = `${y}px`\r\n\r\n subMenu.addEventListener('mouseenter', () => {\r\n if (this._hideSubMenuTimer) {\r\n clearTimeout(this._hideSubMenuTimer)\r\n this._hideSubMenuTimer = null\r\n }\r\n })\r\n subMenu.addEventListener('mouseleave', () => {\r\n this._delayHideSubMenu()\r\n })\r\n\r\n this.subMenuElement = subMenu\r\n }\r\n\r\n private _delayHideSubMenu() {\r\n if (this._hideSubMenuTimer) {\r\n clearTimeout(this._hideSubMenuTimer)\r\n }\r\n this._hideSubMenuTimer = window.setTimeout(() => {\r\n this._hideSubMenu()\r\n this._hideSubMenuTimer = null\r\n }, 150)\r\n }\r\n\r\n private _hideSubMenu() {\r\n if (this._hideSubMenuTimer) {\r\n clearTimeout(this._hideSubMenuTimer)\r\n this._hideSubMenuTimer = null\r\n }\r\n if (this.subMenuElement) {\r\n this.subMenuElement.remove()\r\n this.subMenuElement = null\r\n }\r\n }\r\n\r\n private _bindGlobalEvents() {\r\n const clickHandler = (evt: MouseEvent) => {\r\n const target = evt.target as Node\r\n const isMenuTarget =\r\n !!this.menuElement?.contains(target) ||\r\n !!this.subMenuElement?.contains(target) ||\r\n !!this.activeColorPanel?.contains(target)\r\n if (!isMenuTarget) {\r\n this.close()\r\n }\r\n }\r\n\r\n const keyHandler = (evt: KeyboardEvent) => {\r\n if (evt.key === 'Escape') {\r\n this.close()\r\n }\r\n }\r\n\r\n const scrollHandler = () => {\r\n this.close()\r\n }\r\n\r\n document.addEventListener('click', clickHandler)\r\n document.addEventListener('keydown', keyHandler)\r\n window.addEventListener('scroll', scrollHandler, true)\r\n window.addEventListener('resize', scrollHandler)\r\n\r\n this._removeContextmenuHandler = () => {\r\n document.removeEventListener('click', clickHandler)\r\n document.removeEventListener('keydown', keyHandler)\r\n window.removeEventListener('scroll', scrollHandler, true)\r\n window.removeEventListener('resize', scrollHandler)\r\n }\r\n }\r\n\r\n private _repeatAction(count: number, action: () => void) {\r\n const times = Math.max(1, Math.floor(count))\r\n for (let i = 0; i < times; i++) {\r\n action()\r\n }\r\n }\r\n\r\n private _getCurrentTd(element: IElement): ITd | null {\r\n const positionContext = this.draw.getPosition().getPositionContext()\r\n if (\r\n !positionContext.isTable ||\r\n positionContext.trIndex === undefined ||\r\n positionContext.tdIndex === undefined\r\n ) {\r\n return null\r\n }\r\n return (\r\n element.trList?.[positionContext.trIndex]?.tdList[positionContext.tdIndex] || null\r\n )\r\n }\r\n\r\n private _canCancelMerge(td: ITd | null) {\r\n if (!td) return false\r\n return td.rowspan > 1 || td.colspan > 1\r\n }\r\n\r\n private _getDefaultBorderColor() {\r\n return this.draw.getOptions().table.defaultBorderColor\r\n }\r\n\r\n private _deleteTable() {\r\n this.draw.getTableOperate().deleteTable()\r\n }\r\n\r\n private _deleteRow() {\r\n this.draw.getTableOperate().deleteTableRow()\r\n }\r\n\r\n private _deleteColumn() {\r\n this.draw.getTableOperate().deleteTableCol()\r\n }\r\n\r\n private _selectAllTable() {\r\n this.draw.getTableOperate().tableSelectAll()\r\n }\r\n\r\n private _setBorderType(borderType: TableBorder) {\r\n this.draw.getTableOperate().tableBorderType(borderType)\r\n }\r\n\r\n private _setBorderWidth(value: number) {\r\n this.draw.getTableOperate().tableBorderWidth(value)\r\n }\r\n\r\n private _setBorderExternalWidth(value: number) {\r\n this.draw.getTableOperate().tableBorderExternalWidth(value)\r\n }\r\n\r\n private _isCellAlignActive(td: ITd | null, verticalAlign: VerticalAlign, rowFlex: RowFlex) {\r\n const currentVerticalAlign = td?.verticalAlign || VerticalAlign.TOP\r\n const currentHorizontalAlign = this._getTdRowFlex(td)\r\n return currentVerticalAlign === verticalAlign && currentHorizontalAlign === rowFlex\r\n }\r\n\r\n private _getTdRowFlex(td: ITd | null) {\r\n const rowFlex = td?.value.find(item => item.rowFlex)?.rowFlex\r\n return rowFlex || RowFlex.LEFT\r\n }\r\n\r\n private _getSelectedTds() {\r\n const rowCol = this.draw.getTableParticle().getRangeRowCol()\r\n if (!rowCol) return []\r\n const selectedTds: ITd[] = []\r\n const seen = new Set<string>()\r\n\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const td = row[c]\r\n if (!td) continue\r\n const tdKey = td.id || `${td.rowIndex}-${td.colIndex}-${td.trIndex}-${td.tdIndex}`\r\n if (seen.has(tdKey)) continue\r\n seen.add(tdKey)\r\n selectedTds.push(td)\r\n }\r\n }\r\n\r\n return selectedTds\r\n }\r\n\r\n private _setCellAlign(verticalAlign: VerticalAlign, rowFlex: RowFlex) {\r\n const selectedTds = this._getSelectedTds()\r\n if (!selectedTds.length) return\r\n\r\n let hasChanged = false\r\n for (let i = 0; i < selectedTds.length; i++) {\r\n const td = selectedTds[i]\r\n const currentVerticalAlign = td.verticalAlign || VerticalAlign.TOP\r\n if (currentVerticalAlign !== verticalAlign) {\r\n td.verticalAlign = verticalAlign\r\n hasChanged = true\r\n }\r\n\r\n for (let j = 0; j < td.value.length; j++) {\r\n const element = td.value[j]\r\n const currentRowFlex = element.rowFlex || RowFlex.LEFT\r\n if (currentRowFlex === rowFlex) continue\r\n if (rowFlex === RowFlex.LEFT) {\r\n delete element.rowFlex\r\n } else {\r\n element.rowFlex = rowFlex\r\n }\r\n hasChanged = true\r\n }\r\n }\r\n\r\n if (!hasChanged) return\r\n const { endIndex } = this.draw.getRange().getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n private _toggleTdBorderType(borderType: TdBorder) {\r\n this.draw.getTableOperate().tableTdBorderType(borderType)\r\n }\r\n\r\n private _toggleTdSlashType(slashType: TdSlash) {\r\n this.draw.getTableOperate().tableTdSlashType(slashType)\r\n }\r\n\r\n private _mergeTableCell() {\r\n this.draw.getTableOperate().mergeTableCell()\r\n }\r\n\r\n private _cancelMergeTableCell() {\r\n this.draw.getTableOperate().cancelMergeTableCell()\r\n }\r\n\r\n private _splitVerticalTableCell() {\r\n this.draw.getTableOperate().splitVerticalTableCell()\r\n }\r\n\r\n private _splitHorizontalTableCell() {\r\n this.draw.getTableOperate().splitHorizontalTableCell()\r\n }\r\n\r\n private _showBorderColorPicker(currentColor: string, anchorElement?: HTMLElement) {\r\n this._showColorPanel(currentColor, anchorElement, (nextColor) => {\r\n this.draw.getTableOperate().tableBorderColor(nextColor)\r\n })\r\n }\r\n\r\n private _showBackgroundColorPicker(currentColor: string, anchorElement?: HTMLElement) {\r\n this._showColorPanel(currentColor, anchorElement, (nextColor) => {\r\n this.draw.getTableOperate().tableTdBackgroundColor(nextColor)\r\n })\r\n }\r\n\r\n private _showColorPanel(\r\n currentColor: string,\r\n anchorElement: HTMLElement | undefined,\r\n onApply: (color: string) => void\r\n ) {\r\n this._destroyActiveColorPanel()\r\n\r\n const normalizedColor = this._normalizeColorValue(currentColor)\r\n const panel = document.createElement('div')\r\n panel.classList.add(`${EDITOR_PREFIX}-table-context-menu__color-panel`)\r\n\r\n const pickerHost = document.createElement('div')\r\n pickerHost.classList.add(`${EDITOR_PREFIX}-table-context-menu__picker-host`)\r\n panel.appendChild(pickerHost)\r\n document.body.appendChild(panel)\r\n this.activeColorPanel = panel\r\n this._positionColorPanel(panel, anchorElement)\r\n\r\n const picker = new Picker({\r\n parent: pickerHost,\r\n popup: false,\r\n color: normalizedColor,\r\n editor: true,\r\n editorFormat: 'hex',\r\n cancelButton: false,\r\n onChange: (color) => {\r\n onApply(color.hex)\r\n },\r\n onDone: () => {\r\n this.close()\r\n },\r\n onClose: () => {\r\n this.close()\r\n }\r\n })\r\n this.activePicker = picker\r\n\r\n const doneButton = pickerHost.querySelector('.picker_done button')\r\n if (doneButton) {\r\n doneButton.textContent = '确认'\r\n }\r\n }\r\n\r\n private _destroyActiveColorPanel() {\r\n if (this.activePicker) {\r\n const picker = this.activePicker\r\n this.activePicker = null\r\n picker.destroy()\r\n }\r\n if (this.activeColorPanel) {\r\n this.activeColorPanel.remove()\r\n this.activeColorPanel = null\r\n }\r\n }\r\n\r\n private _positionColorPanel(panel: HTMLDivElement, anchorElement?: HTMLElement) {\r\n const anchor = anchorElement || this.subMenuElement || this.menuElement\r\n if (!anchor) return\r\n\r\n const gap = 8\r\n const margin = 8\r\n const anchorRect = anchor.getBoundingClientRect()\r\n const panelRect = panel.getBoundingClientRect()\r\n\r\n let left = anchorRect.right + gap\r\n let top = anchorRect.top\r\n\r\n if (left + panelRect.width > window.innerWidth - margin) {\r\n left = anchorRect.left - panelRect.width - gap\r\n }\r\n if (left < margin) {\r\n left = Math.max(margin, window.innerWidth - panelRect.width - margin)\r\n }\r\n\r\n if (top + panelRect.height > window.innerHeight - margin) {\r\n top = window.innerHeight - panelRect.height - margin\r\n }\r\n if (top < margin) {\r\n top = margin\r\n }\r\n\r\n panel.style.left = `${left}px`\r\n panel.style.top = `${top}px`\r\n }\r\n\r\n private _normalizeColorValue(color: string, fallback = true) {\r\n const trimmed = color.trim()\r\n const normalized = trimmed.startsWith('#') ? trimmed : `#${trimmed}`\r\n if (/^#[0-9a-fA-F]{6}$/.test(normalized)) {\r\n return normalized\r\n }\r\n return fallback ? '#000000' : ''\r\n }\r\n}\r\n","import { TableContextMenu } from './TableContextMenu'\r\n\r\ntype Draw = any\r\n\r\nexport class TableContextMenuComponent {\r\n private _contextMenu: any\r\n\r\n public install(draw: Draw): this {\r\n this._contextMenu = new TableContextMenu(draw)\r\n ;(draw as any).__tableContextMenu = this._contextMenu\r\n return this\r\n }\r\n\r\n public getContextMenu() {\r\n return this._contextMenu\r\n }\r\n}\r\n","import { PaperDirection } from '@vervedoc/docx-editor-schema'\r\n\r\nfunction convertPxToPaperSize(width: number, height: number) {\r\n if (width === 1125 && height === 1593) {\r\n return {\r\n size: 'a3',\r\n width: '297mm',\r\n height: '420mm'\r\n }\r\n }\r\n if (width === 794 && height === 1123) {\r\n return {\r\n size: 'a4',\r\n width: '210mm',\r\n height: '297mm'\r\n }\r\n }\r\n if (width === 565 && height === 796) {\r\n return {\r\n size: 'a5',\r\n width: '148mm',\r\n height: '210mm'\r\n }\r\n }\r\n // 其他默认不转换\r\n return {\r\n size: '',\r\n width: `${width}px`,\r\n height: `${height}px`\r\n }\r\n}\r\n\r\nexport interface IPrintImageBase64Option {\r\n width: number\r\n height: number\r\n direction?: PaperDirection\r\n}\r\nexport function printImageBase64(\r\n base64List: string[],\r\n options: IPrintImageBase64Option\r\n) {\r\n const { width, height, direction = PaperDirection.VERTICAL } = options\r\n const iframe = document.createElement('iframe')\r\n // 离屏渲染\r\n iframe.style.visibility = 'hidden'\r\n iframe.style.position = 'absolute'\r\n iframe.style.left = '0'\r\n iframe.style.top = '0'\r\n iframe.style.width = '0'\r\n iframe.style.height = '0'\r\n iframe.style.border = 'none'\r\n document.body.append(iframe)\r\n const contentWindow = iframe.contentWindow!\r\n const doc = contentWindow.document\r\n doc.open()\r\n const container = document.createElement('div')\r\n const paperSize = convertPxToPaperSize(width, height)\r\n base64List.forEach(base64 => {\r\n const image = document.createElement('img')\r\n image.style.width =\r\n direction === PaperDirection.HORIZONTAL\r\n ? paperSize.height\r\n : paperSize.width\r\n image.style.height =\r\n direction === PaperDirection.HORIZONTAL\r\n ? paperSize.width\r\n : paperSize.height\r\n image.src = base64\r\n container.append(image)\r\n })\r\n const style = document.createElement('style')\r\n const stylesheet = `\r\n * {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n @page {\r\n margin: 0;\r\n size: ${paperSize.size} ${\r\n direction === PaperDirection.HORIZONTAL ? `landscape` : `portrait`\r\n };\r\n }\r\n /* 隐藏浏览器默认的页眉页脚 */\r\n @media print {\r\n @page {\r\n margin: 0;\r\n }\r\n body {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n }\r\n `\r\n style.append(document.createTextNode(stylesheet))\r\n setTimeout(() => {\r\n doc.write(`${style.outerHTML}${container.innerHTML}`)\r\n contentWindow.print()\r\n doc.close()\r\n // 移除iframe\r\n window.addEventListener(\r\n 'mouseover',\r\n () => {\r\n iframe?.remove()\r\n },\r\n {\r\n once: true\r\n }\r\n )\r\n })\r\n}\r\n","import './assets/css/index.css'\r\nimport { formatElementList, deepClone, mergeOption } from '@vervedoc/docx-editor-schema'\r\nimport type { IEditorData, IEditorOption, IElement, EventBusMap, UsePlugin } from '@vervedoc/docx-editor-schema'\r\n\r\nimport { Draw, pasteByApi } from '@vervedoc/docx-editor-view'\r\nimport { Command } from '@vervedoc/docx-editor-transform'\r\nimport { CommandAdapt } from '@vervedoc/docx-editor-transform'\r\nimport { Listener } from '@vervedoc/docx-editor-state'\r\nimport { Register } from '@vervedoc/docx-editor-view'\r\nimport { FloatingBar } from '@vervedoc/docx-editor-view'\r\nimport { Plugin } from '@vervedoc/docx-editor-view'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { Override } from '@vervedoc/docx-editor-view'\r\nimport { HistoryComponent } from '@vervedoc/docx-editor-history'\r\nimport { KeymapComponent, Shortcut } from '@vervedoc/docx-editor-keymap'\r\nimport { BlockParticle, ControlComponent, GadgetComponent } from '@vervedoc/docx-editor-commands'\r\nimport { CommentComponent, RevisionComponent } from '@vervedoc/docx-editor-comment'\r\nimport { WorkerComponent } from './worker/WorkerComponent'\r\nimport { ExportComponent } from './export/ExportComponent'\r\nimport { TableContextMenuComponent } from './table-contextmenu/TableContextMenuComponent'\r\nimport { printImageBase64 } from './utils/print'\r\n\r\nexport default class DocxEditor {\r\n public command: Command\r\n public listener: Listener\r\n public eventBus: EventBus<EventBusMap>\r\n public override: Override\r\n public register: Register\r\n public comment: CommentComponent\r\n public revision: RevisionComponent\r\n public destroy: () => void\r\n public use: UsePlugin\r\n\r\n constructor(\r\n container: HTMLDivElement,\r\n data: IEditorData | IElement[],\r\n options: IEditorOption = {}\r\n ) {\r\n const editorOptions = mergeOption(options)\r\n data = deepClone(data)\r\n let headerElementList: IElement[] = []\r\n let mainElementList: IElement[] = []\r\n let footerElementList: IElement[] = []\r\n if (Array.isArray(data)) {\r\n mainElementList = data\r\n } else {\r\n headerElementList = data.header || []\r\n mainElementList = data.main\r\n footerElementList = data.footer || []\r\n }\r\n const pageComponentData = [\r\n headerElementList,\r\n mainElementList,\r\n footerElementList\r\n ]\r\n pageComponentData.forEach(elementList => {\r\n formatElementList(elementList, {\r\n editorOptions,\r\n isForceCompensation: true\r\n })\r\n })\r\n this.listener = new Listener()\r\n this.eventBus = new EventBus<EventBusMap>()\r\n this.override = new Override()\r\n const draw = new Draw(\r\n container,\r\n editorOptions,\r\n {\r\n header: headerElementList,\r\n main: mainElementList,\r\n footer: footerElementList\r\n },\r\n this.listener,\r\n this.eventBus,\r\n this.override\r\n )\r\n // Replace the view-layer stub with the real block particle renderer\r\n // so audio/video/chart block elements can mount their DOM overlays.\r\n draw.setBlockParticle(new BlockParticle(draw as any) as any)\r\n new HistoryComponent().install(draw)\r\n new ControlComponent().install(draw)\r\n const workerComponent = new WorkerComponent().install(draw)\r\n\r\n const commandAdapt = new CommandAdapt(draw as any, {\r\n pasteByApi,\r\n printImageBase64\r\n })\r\n this.command = new Command(commandAdapt)\r\n\r\n ;(draw as any).__structureAdapter = commandAdapt._structure\r\n\r\n new GadgetComponent().install(draw, this.command)\r\n new ExportComponent().install(draw, this.command)\r\n new TableContextMenuComponent().install(draw)\r\n this.comment = new CommentComponent().install(this.command)\r\n this.revision = new RevisionComponent()\r\n\r\n const keymapComponent = new KeymapComponent().install(draw, this.command)\r\n\r\n const floatingBarEnabled = editorOptions.floatingBar?.enabled !== false\r\n const floatingBar = floatingBarEnabled\r\n ? new FloatingBar(draw, this.command)\r\n : null\r\n\r\n const shortcut = keymapComponent.getShortcut()! as Shortcut\r\n this.register = new Register({\r\n shortcut,\r\n i18n: draw.getI18n()\r\n })\r\n draw.setRegister(this.register)\r\n this.destroy = () => {\r\n draw.destroy()\r\n shortcut.removeEvent()\r\n floatingBar?.destroy()\r\n workerComponent.getWorkerManager()?.terminate()\r\n }\r\n const plugin = new Plugin(this as any)\r\n this.use = plugin.use.bind(plugin)\r\n }\r\n}\r\n","type Draw = any\r\ntype ILang = any\r\ntype DeepPartial<T> = T\r\n\r\nexport class I18n {\r\n public install(_draw: Draw): this {\r\n return this\r\n }\r\n\r\n public setLang(_locale: string, _lang: DeepPartial<ILang>): void {}\r\n}\r\n","export interface AutoSaveOptions {\r\n interval?: number\r\n enabled?: boolean\r\n isReadonly?: () => boolean\r\n onSave: (content: any) => void | Promise<void>\r\n getContent: () => any\r\n}\r\n\r\nexport class Actuator {\r\n private _saveTimer: ReturnType<typeof setTimeout> | null = null\r\n private _saving = false\r\n private _pendingSave = false\r\n private _autoSaveOptions: AutoSaveOptions | null = null\r\n\r\n public install(): this {\r\n return this\r\n }\r\n\r\n public configureAutoSave(options: AutoSaveOptions): void {\r\n this._autoSaveOptions = {\r\n interval: 800,\r\n enabled: true,\r\n ...options\r\n }\r\n }\r\n\r\n public async saveNow(_options?: { silent?: boolean }): Promise<void> {\r\n if (this._saving) {\r\n this._pendingSave = true\r\n return\r\n }\r\n if (!this._autoSaveOptions) return\r\n if (this._autoSaveOptions.isReadonly?.()) return\r\n\r\n const content = this._autoSaveOptions.getContent()\r\n if (!content) return\r\n\r\n this._saving = true\r\n this._pendingSave = false\r\n try {\r\n await this._autoSaveOptions.onSave(content)\r\n } finally {\r\n this._saving = false\r\n if (this._pendingSave) this.scheduleSave()\r\n }\r\n }\r\n\r\n public scheduleSave(): void {\r\n if (!this._autoSaveOptions || !this._autoSaveOptions.enabled) return\r\n if (this._autoSaveOptions.isReadonly?.()) return\r\n if (this._saveTimer) clearTimeout(this._saveTimer)\r\n this._saveTimer = setTimeout(() => {\r\n void this.saveNow({ silent: true })\r\n }, this._autoSaveOptions.interval || 800)\r\n }\r\n\r\n public stopAutoSave(): void {\r\n if (this._saveTimer) {\r\n clearTimeout(this._saveTimer)\r\n this._saveTimer = null\r\n }\r\n }\r\n\r\n public isSaving(): boolean {\r\n return this._saving\r\n }\r\n\r\n public destroy(): void {\r\n this.stopAutoSave()\r\n this._autoSaveOptions = null\r\n }\r\n}\r\n","import { EDITOR_CLIPBOARD, DeepRequired, IEditorOption, IElement, createDomFromElementList, zipElementList } from '@vervedoc/docx-editor-schema'\r\n\r\nexport interface IClipboardData {\r\n text: string\r\n elementList: IElement[]\r\n}\r\n\r\nexport function setClipboardData(data: IClipboardData) {\r\n localStorage.setItem(\r\n EDITOR_CLIPBOARD,\r\n JSON.stringify({\r\n text: data.text,\r\n elementList: data.elementList\r\n })\r\n )\r\n}\r\n\r\nexport function getClipboardData(): IClipboardData | null {\r\n const clipboardText = localStorage.getItem(EDITOR_CLIPBOARD)\r\n return clipboardText ? JSON.parse(clipboardText) : null\r\n}\r\n\r\nexport function removeClipboardData() {\r\n localStorage.removeItem(EDITOR_CLIPBOARD)\r\n}\r\n\r\nexport function writeClipboardItem(\r\n text: string,\r\n html: string,\r\n elementList: IElement[]\r\n) {\r\n if (!text && !html && !elementList.length) return\r\n const plainText = new Blob([text], { type: 'text/plain' })\r\n const htmlText = new Blob([html], { type: 'text/html' })\r\n if (window.ClipboardItem) {\r\n // @ts-ignore\r\n const item = new ClipboardItem({\r\n [plainText.type]: plainText,\r\n [htmlText.type]: htmlText\r\n })\r\n window.navigator.clipboard.write([item])\r\n } else {\r\n const fakeElement = document.createElement('div')\r\n fakeElement.setAttribute('contenteditable', 'true')\r\n fakeElement.innerHTML = html\r\n document.body.append(fakeElement)\r\n // add new range\r\n const selection = window.getSelection()\r\n const range = document.createRange()\r\n // 增加尾行换行字符避免dom复制缺失\r\n const br = document.createElement('span')\r\n br.innerText = '\\n'\r\n fakeElement.append(br)\r\n // 扩选选区并执行复制\r\n range.selectNodeContents(fakeElement)\r\n selection?.removeAllRanges()\r\n selection?.addRange(range)\r\n document.execCommand('copy')\r\n fakeElement.remove()\r\n }\r\n // 编辑器结构化数据\r\n setClipboardData({ text, elementList })\r\n}\r\n\r\nexport function writeElementList(\r\n elementList: IElement[],\r\n options: DeepRequired<IEditorOption>\r\n) {\r\n const clipboardDom = createDomFromElementList(elementList, options)\r\n // 写入剪贴板\r\n document.body.append(clipboardDom)\r\n const text = clipboardDom.innerText\r\n // 先追加后移除,否则innerText无法解析换行符\r\n clipboardDom.remove()\r\n const html = clipboardDom.innerHTML\r\n if (!text && !html && !elementList.length) return\r\n writeClipboardItem(text, html, zipElementList(elementList))\r\n}\r\n\r\nexport function getIsClipboardContainFile(clipboardData: DataTransfer) {\r\n let isFile = false\r\n for (let i = 0; i < clipboardData.items.length; i++) {\r\n const item = clipboardData.items[i]\r\n if (item.kind === 'file') {\r\n isFile = true\r\n break\r\n }\r\n }\r\n return isFile\r\n}\r\n","import type { IElement } from '@vervedoc/docx-editor-schema'\r\n\r\n// ---- 解析结果 & 选项(对外 API) ----\r\n\r\nexport interface IDocxParseResult {\r\n success: boolean\r\n elements: IElement[]\r\n comments?: DocxCommentMeta[]\r\n html?: string\r\n error?: string\r\n}\r\n\r\nexport interface IChartRenderer {\r\n renderToDataUrl(option: unknown, width: number, height: number, pixelRatio?: number): string\r\n}\r\n\r\nexport interface IDocxParseOptions {\r\n preserveStyles?: boolean\r\n defaultFont?: string\r\n defaultSize?: number\r\n targetInnerWidth?: number\r\n tableWidthMode?: 'fit' | 'word'\r\n defaultTableRowHeight?: number\r\n defaultTableTdPadding?: [number, number, number, number]\r\n forceDefaultLineHeight?: number\r\n chartRenderer?: IChartRenderer\r\n}\r\n\r\nexport const DEFAULT_OPTIONS: Required<\r\n Pick<\r\n IDocxParseOptions,\r\n | 'preserveStyles'\r\n | 'defaultFont'\r\n | 'defaultSize'\r\n | 'tableWidthMode'\r\n | 'defaultTableRowHeight'\r\n | 'forceDefaultLineHeight'\r\n >\r\n> & { defaultTableTdPadding: [number, number, number, number] } = {\r\n preserveStyles: true,\r\n defaultFont: 'SimSun, serif',\r\n defaultSize: 12,\r\n tableWidthMode: 'fit',\r\n defaultTableRowHeight: 32,\r\n defaultTableTdPadding: [0, 4, 0, 4],\r\n forceDefaultLineHeight: 1\r\n}\r\n\r\n// ---- Worker 消息 ----\r\n\r\nexport interface IWorkerRequest {\r\n documentXml: string\r\n stylesXml: string | null\r\n numberingXml: string | null\r\n themeXml: string | null\r\n documentRels: string | null\r\n commentsXml: string | null\r\n chartRelsMap: Record<string, string>\r\n chartXmlMap: Record<string, string>\r\n mediaMap: Record<string, string>\r\n options: IDocxParseOptions\r\n}\r\n\r\nexport interface IWorkerResponse {\r\n success: boolean\r\n elements: IElement[]\r\n error?: string\r\n}\r\n\r\n// ---- 中间表示(IR) ----\r\n\r\nexport type DocNode = ParagraphNode | TableNode | ColumnNode\r\n\r\nexport interface ParagraphNode {\r\n type: 'paragraph'\r\n chunks: InlineChunk[]\r\n style: ParagraphStyle\r\n}\r\n\r\nexport interface TableNode {\r\n type: 'table'\r\n rows: TableRowNode[]\r\n colWidths: number[]\r\n borderType?: string\r\n borderColor?: string\r\n borderWidth?: number\r\n}\r\n\r\nexport interface ColumnNode {\r\n type: 'column'\r\n columns: number\r\n colWidths: number[]\r\n colSpace: number\r\n separator: boolean\r\n groups: ParagraphNode[][]\r\n}\r\n\r\nexport interface TableRowNode {\r\n height?: number\r\n cells: TableCellNode[]\r\n}\r\n\r\nexport interface TableCellNode {\r\n paragraphs: ParagraphNode[]\r\n colspan: number\r\n rowspan: number\r\n backgroundColor?: string\r\n verticalAlign?: string\r\n borderTypes?: number[]\r\n borderStyle?: string\r\n width?: number\r\n}\r\n\r\nexport interface ParagraphStyle {\r\n rowFlex?: string\r\n spacingBefore?: number\r\n spacingAfter?: number\r\n lineHeight?: number\r\n /** 行高规则:auto=倍率, exact=精确值(px), atLeast=最小值(px) */\r\n lineHeightRule?: 'auto' | 'exact' | 'atLeast'\r\n indentLeft?: number\r\n indentRight?: number\r\n firstLineIndent?: number\r\n paragraphColor?: string\r\n titleLevel?: number\r\n listType?: string\r\n listStyle?: string\r\n listLevel?: number\r\n numId?: string\r\n /** 制表符停止位 */\r\n tabStops?: Array<{ pos: number; type: string }>\r\n}\r\n\r\nexport type InlineChunk =\r\n | TextChunk\r\n | ImageChunk\r\n | HyperlinkChunk\r\n | BreakChunk\r\n | TabChunk\r\n | BookmarkChunk\r\n | CommentMarkerChunk\r\n\r\nexport interface TextChunk {\r\n type: 'text'\r\n value: string\r\n style: RunStyle\r\n revision?: {\r\n id: string\r\n type: 'insert' | 'delete'\r\n author: string\r\n date: string\r\n }\r\n}\r\n\r\nexport interface ImageChunk {\r\n type: 'image'\r\n src: string\r\n width: number\r\n height: number\r\n display?: string\r\n floatPosition?: { x: number; y: number }\r\n}\r\n\r\nexport interface HyperlinkChunk {\r\n type: 'hyperlink'\r\n url: string\r\n children: TextChunk[]\r\n}\r\n\r\nexport interface BreakChunk {\r\n type: 'break'\r\n breakType: 'line' | 'page' | 'column'\r\n}\r\n\r\nexport interface TabChunk {\r\n type: 'tab'\r\n}\r\n\r\nexport interface BookmarkChunk {\r\n type: 'bookmark'\r\n name: string\r\n}\r\n\r\nexport interface CommentMarkerChunk {\r\n type: 'commentMarker'\r\n markType: 'start' | 'end'\r\n commentId: string\r\n}\r\n\r\nexport interface RunStyle {\r\n bold?: boolean\r\n italic?: boolean\r\n underline?: boolean\r\n strikeout?: boolean\r\n font?: string\r\n size?: number\r\n color?: string\r\n highlight?: string\r\n letterSpacing?: number\r\n vertAlign?: 'superscript' | 'subscript'\r\n textDecoration?: { style: string }\r\n}\r\n\r\n// ---- 样式解析辅助 ----\r\n\r\nexport interface ResolvedStyle {\r\n paragraph: ParagraphStyle\r\n run: RunStyle\r\n}\r\n\r\n// ---- 批注元数据 ----\r\n\r\nexport interface DocxCommentMeta {\r\n id: string\r\n author: string\r\n date: string\r\n initials?: string\r\n content: string\r\n}\r\n","// ---- XML 命名空间 ----\r\n\r\nexport const NS = {\r\n w: 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\r\n r: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\r\n a: 'http://schemas.openxmlformats.org/drawingml/2006/main',\r\n wp: 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',\r\n c: 'http://schemas.openxmlformats.org/drawingml/2006/chart',\r\n v: 'urn:schemas-microsoft-com:vml',\r\n pic: 'http://schemas.openxmlformats.org/drawingml/2006/picture',\r\n mc: 'http://schemas.openxmlformats.org/markup-compatibility/2006',\r\n wps: 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',\r\n rel: 'http://schemas.openxmlformats.org/package/2006/relationships',\r\n m: 'http://schemas.openxmlformats.org/officeDocument/2006/math'\r\n} as const\r\n\r\n// ---- 单位转换 ----\r\n\r\n/** Twip(1/1440 英寸)转 px(96dpi) */\r\nexport function twipToPx(twip: number): number {\r\n return (twip / 1440) * 96\r\n}\r\n\r\n/** 半磅转磅(字号:Word sz 值 / 2) */\r\nexport function halfPtToPt(halfPt: number): number {\r\n return halfPt / 2\r\n}\r\n\r\n/**\r\n * 半磅转像素(Word sz 单位 → canvas px,96dpi)\r\n * Word sz = 半磅,pt = sz/2,px = pt × 96/72\r\n * 即 px = sz × (96 / 144) = sz × (2/3)\r\n */\r\nexport function halfPtToPx(halfPt: number): number {\r\n return halfPt * (96 / 144)\r\n}\r\n\r\n/** EMU 转 px(1 英寸 = 914400 EMU = 96px) */\r\nexport function emuToPx(emu: number): number {\r\n return emu / 9525\r\n}\r\n\r\n/** 八分之一磅转 px(边框宽度) */\r\nexport function eighthPtToPx(val: number): number {\r\n return (val / 8) * (96 / 72)\r\n}\r\n\r\n// ---- 颜色映射 ----\r\n\r\n/** Word 高亮颜色名 → CSS hex */\r\nexport const HIGHLIGHT_COLOR_MAP: Record<string, string> = {\r\n yellow: '#FFFF00',\r\n green: '#00FF00',\r\n cyan: '#00FFFF',\r\n magenta: '#FF00FF',\r\n blue: '#0000FF',\r\n red: '#FF0000',\r\n darkBlue: '#000080',\r\n darkCyan: '#008080',\r\n darkGreen: '#008000',\r\n darkMagenta: '#800080',\r\n darkRed: '#800000',\r\n darkYellow: '#808000',\r\n darkGray: '#808080',\r\n lightGray: '#C0C0C0',\r\n black: '#000000',\r\n white: '#FFFFFF'\r\n}\r\n\r\n// ---- 字体规范化 ----\r\n\r\n/**\r\n * Word / WPS 字体名 → Web 安全字体名映射\r\n * 中文字体优先映射到对应系统字体名\r\n */\r\nconst FONT_NORMALIZE_MAP: Record<string, string> = {\r\n // 宋体系列\r\n '宋体': 'SimSun',\r\n 'Song Ti': 'SimSun',\r\n '新宋体': 'NSimSun',\r\n // 黑体系列\r\n '黑体': 'SimHei',\r\n 'Hei Ti': 'SimHei',\r\n // 楷体系列\r\n '楷体': 'KaiTi',\r\n '楷体_GB2312': 'KaiTi',\r\n 'Kai Ti': 'KaiTi',\r\n // 仿宋系列\r\n '仿宋': 'FangSong',\r\n '仿宋_GB2312': 'FangSong',\r\n 'Fang Song': 'FangSong',\r\n // 微软雅黑\r\n '微软雅黑': 'Microsoft YaHei',\r\n 'Microsoft YaHei': 'Microsoft YaHei',\r\n // 等线\r\n '等线': 'DengXian',\r\n '等线 Light': 'DengXian Light',\r\n '等线 Regular': 'DengXian',\r\n // 幼圆\r\n '幼圆': 'YouYuan',\r\n // 华文系列\r\n '华文细黑': 'STXihei',\r\n '华文宋体': 'STSong',\r\n '华文仿宋': 'STFangsong',\r\n '华文楷体': 'STKaiti',\r\n '华文中宋': 'STZhongsong',\r\n '华文琥珀': 'STHupo',\r\n '华文新魏': 'STXinwei',\r\n '华文彩云': 'STCaiyun',\r\n '华文行楷': 'STXingkai',\r\n '华文隶书': 'STLiti',\r\n // 方正系列\r\n '方正舒体': 'FZShuTi',\r\n '方正姚体': 'FZYaoti',\r\n // 西文通用(保留原名)\r\n 'Times New Roman': 'Times New Roman',\r\n 'Calibri': 'Calibri',\r\n 'Calibri Light': 'Calibri Light',\r\n 'Arial': 'Arial',\r\n 'Arial Narrow': 'Arial Narrow',\r\n 'Verdana': 'Verdana',\r\n 'Tahoma': 'Tahoma',\r\n 'Courier New': 'Courier New',\r\n 'Georgia': 'Georgia',\r\n 'Comic Sans MS': 'Comic Sans MS',\r\n 'Impact': 'Impact',\r\n 'Trebuchet MS': 'Trebuchet MS',\r\n 'Palatino Linotype': 'Palatino Linotype',\r\n 'Garamond': 'Garamond',\r\n 'Century': 'Century',\r\n 'Cambria': 'Cambria',\r\n 'Cambria Math': 'Cambria Math',\r\n 'Consolas': 'Consolas',\r\n 'Franklin Gothic Medium': 'Franklin Gothic Medium'\r\n}\r\n\r\nexport function normalizeFont(rawFontName: string | undefined): string | undefined {\r\n if (!rawFontName) return undefined\r\n return FONT_NORMALIZE_MAP[rawFontName] ?? rawFontName\r\n}\r\n\r\n// ---- 列表格式映射 ----\r\n\r\nexport const NUM_FMT_MAP: Record<string, { listType: string; listStyle: string }> = {\r\n bullet: { listType: 'ul', listStyle: 'disc' },\r\n decimal: { listType: 'ol', listStyle: 'decimal' },\r\n lowerLetter: { listType: 'ol', listStyle: 'lower-alpha' },\r\n upperLetter: { listType: 'ol', listStyle: 'upper-alpha' },\r\n lowerRoman: { listType: 'ol', listStyle: 'lower-roman' },\r\n upperRoman: { listType: 'ol', listStyle: 'upper-roman' },\r\n chineseCounting: { listType: 'ol', listStyle: 'cjk-ideographic' },\r\n chineseCountingThousand: { listType: 'ol', listStyle: 'cjk-ideographic' },\r\n ideographTraditional: { listType: 'ol', listStyle: 'cjk-ideographic' },\r\n japaneseCounting: { listType: 'ol', listStyle: 'decimal' },\r\n ordinal: { listType: 'ol', listStyle: 'decimal' },\r\n cardinalText: { listType: 'ol', listStyle: 'decimal' },\r\n none: { listType: 'ul', listStyle: 'none' }\r\n}\r\n\r\n// ---- 对齐方式映射 ----\r\n\r\nexport const ALIGNMENT_MAP: Record<string, string> = {\r\n left: 'left',\r\n center: 'center',\r\n right: 'right',\r\n both: 'justify',\r\n justify: 'justify',\r\n distribute: 'justify',\r\n numTab: 'left',\r\n highKashida: 'left',\r\n lowKashida: 'left',\r\n thaiDistribute: 'justify'\r\n}\r\n\r\n// ---- 边框类型映射 ----\r\n\r\nexport const BORDER_TYPE_MAP: Record<string, number> = {\r\n none: 0,\r\n nil: 0,\r\n single: 1,\r\n thick: 1,\r\n double: 2,\r\n dotted: 3,\r\n dashed: 4,\r\n dashSmallGap: 4,\r\n dotDash: 5,\r\n dotDotDash: 6,\r\n triple: 7,\r\n wave: 8,\r\n thinThickSmallGap: 1,\r\n thickThinSmallGap: 1,\r\n thinThickThinSmallGap: 1\r\n}\r\n\r\n// ---- 主题色语义名映射到槽位名 ----\r\n\r\n/**\r\n * OOXML 中 themeFill / themeColor 可能使用语义名(如 background1),\r\n * 需映射到 clrScheme 中的实际槽位名(如 lt1)\r\n */\r\nexport const THEME_COLOR_SEMANTIC_MAP: Record<string, string> = {\r\n background1: 'lt1',\r\n background2: 'lt2',\r\n text1: 'dk1',\r\n text2: 'dk2',\r\n // 以下为别名,部分文档直接用语义名\r\n light1: 'lt1',\r\n light2: 'lt2',\r\n dark1: 'dk1',\r\n dark2: 'dk2'\r\n}\r\n\r\n// ---- 1x1 透明占位图(用于不可渲染格式降级) ----\r\n\r\nexport const TRANSPARENT_1PX_PNG =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=='\r\n","import { NS } from '../constants'\r\n\r\n/**\r\n * 解析 XML 字符串为 Document\r\n */\r\nexport function parseXml(xmlString: string): Document {\r\n const parser = new DOMParser()\r\n return parser.parseFromString(xmlString, 'application/xml')\r\n}\r\n\r\n/**\r\n * 获取指定命名空间下的子元素(直接子元素)\r\n */\r\nexport function getChildrenByTag(parent: Element, ns: string, localName: string): Element[] {\r\n const result: Element[] = []\r\n for (let i = 0; i < parent.childNodes.length; i++) {\r\n const child = parent.childNodes[i]\r\n if (\r\n child.nodeType === 1 &&\r\n (child as Element).localName === localName &&\r\n (child as Element).namespaceURI === ns\r\n ) {\r\n result.push(child as Element)\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * 获取第一个指定命名空间下的子元素\r\n */\r\nexport function getFirstChildByTag(parent: Element, ns: string, localName: string): Element | null {\r\n for (let i = 0; i < parent.childNodes.length; i++) {\r\n const child = parent.childNodes[i]\r\n if (\r\n child.nodeType === 1 &&\r\n (child as Element).localName === localName &&\r\n (child as Element).namespaceURI === ns\r\n ) {\r\n return child as Element\r\n }\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 获取 w:val 属性值\r\n */\r\nexport function getWVal(el: Element | null): string | null {\r\n if (!el) return null\r\n return el.getAttributeNS(NS.w, 'val') || el.getAttribute('w:val') || null\r\n}\r\n\r\n/**\r\n * 获取指定命名空间的属性值\r\n */\r\nexport function getAttr(el: Element, ns: string, name: string): string | null {\r\n return el.getAttributeNS(ns, name) || el.getAttribute(getPrefixedName(ns, name)) || null\r\n}\r\n\r\n/**\r\n * 获取属性(兼容带前缀和不带前缀的写法)\r\n */\r\nexport function getAttrVal(el: Element, attrName: string): string | null {\r\n // 尝试 w:val, r:embed 等带前缀的写法\r\n return el.getAttribute(attrName) || null\r\n}\r\n\r\n/**\r\n * 遍历直接子元素(所有命名空间)\r\n */\r\nexport function forEachChild(parent: Element, callback: (child: Element) => void): void {\r\n for (let i = 0; i < parent.childNodes.length; i++) {\r\n const child = parent.childNodes[i]\r\n if (child.nodeType === 1) {\r\n callback(child as Element)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 获取所有后代元素(指定命名空间和标签名)\r\n */\r\nexport function getElementsByTag(parent: Element, ns: string, localName: string): Element[] {\r\n const result: Element[] = []\r\n const all = parent.getElementsByTagNameNS(ns, localName)\r\n for (let i = 0; i < all.length; i++) {\r\n result.push(all[i])\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * 检查元素是否存在(用于 boolean 属性如 <w:b/>)\r\n */\r\nexport function hasChild(parent: Element, ns: string, localName: string): boolean {\r\n return getFirstChildByTag(parent, ns, localName) !== null\r\n}\r\n\r\n/**\r\n * 从命名空间 URI 获取前缀名称\r\n */\r\nfunction getPrefixedName(ns: string, name: string): string {\r\n for (const [prefix, uri] of Object.entries(NS)) {\r\n if (uri === ns) return `${prefix}:${name}`\r\n }\r\n return name\r\n}\r\n","import { NS, THEME_COLOR_SEMANTIC_MAP } from '../constants'\r\nimport { parseXml, getFirstChildByTag, forEachChild } from './xml.helper'\r\n\r\nexport interface ThemeData {\r\n colors: Map<string, string> // slotName → RRGGBB (大写,不含 #)\r\n majorFont: string | null\r\n minorFont: string | null\r\n}\r\n\r\n/**\r\n * 解析 word/theme/theme1.xml,提取颜色方案和字体方案\r\n */\r\nexport function parseTheme(themeXml: string | null): ThemeData {\r\n const result: ThemeData = {\r\n colors: new Map(),\r\n majorFont: null,\r\n minorFont: null\r\n }\r\n if (!themeXml) return result\r\n\r\n const doc = parseXml(themeXml)\r\n const root = doc.documentElement\r\n\r\n parseColorScheme(root, result)\r\n parseFontScheme(root, result)\r\n\r\n return result\r\n}\r\n\r\nfunction parseColorScheme(root: Element, result: ThemeData): void {\r\n const clrSchemes = root.getElementsByTagNameNS(NS.a, 'clrScheme')\r\n if (clrSchemes.length === 0) return\r\n\r\n const clrScheme = clrSchemes[0]\r\n forEachChild(clrScheme, (slotEl) => {\r\n const slotName = slotEl.localName\r\n\r\n // <a:srgbClr val=\"RRGGBB\"/>\r\n const srgbClr = getFirstChildByTag(slotEl, NS.a, 'srgbClr')\r\n if (srgbClr) {\r\n const val = srgbClr.getAttribute('val')\r\n if (val) {\r\n result.colors.set(slotName, val.toUpperCase())\r\n return\r\n }\r\n }\r\n\r\n // <a:sysClr lastClr=\"RRGGBB\"/> — 系统颜色用 lastClr 作为实际渲染值\r\n const sysClr = getFirstChildByTag(slotEl, NS.a, 'sysClr')\r\n if (sysClr) {\r\n const lastClr = sysClr.getAttribute('lastClr')\r\n if (lastClr) {\r\n result.colors.set(slotName, lastClr.toUpperCase())\r\n }\r\n }\r\n })\r\n}\r\n\r\nfunction parseFontScheme(root: Element, result: ThemeData): void {\r\n const fontSchemes = root.getElementsByTagNameNS(NS.a, 'fontScheme')\r\n if (fontSchemes.length === 0) return\r\n\r\n const fontScheme = fontSchemes[0]\r\n\r\n const majorFontEl = getFirstChildByTag(fontScheme, NS.a, 'majorFont')\r\n if (majorFontEl) {\r\n result.majorFont = resolveFontFromSchemeElement(majorFontEl)\r\n }\r\n\r\n const minorFontEl = getFirstChildByTag(fontScheme, NS.a, 'minorFont')\r\n if (minorFontEl) {\r\n result.minorFont = resolveFontFromSchemeElement(minorFontEl)\r\n }\r\n}\r\n\r\n/**\r\n * 从 <a:majorFont> / <a:minorFont> 提取字体名\r\n * 优先取东亚字体 <a:ea>,其次西文 <a:latin>\r\n */\r\nfunction resolveFontFromSchemeElement(schemeEl: Element): string | null {\r\n const ea = getFirstChildByTag(schemeEl, NS.a, 'ea')\r\n if (ea) {\r\n const typeface = ea.getAttribute('typeface')\r\n if (typeface && typeface !== '') return typeface\r\n }\r\n const latin = getFirstChildByTag(schemeEl, NS.a, 'latin')\r\n if (latin) {\r\n const typeface = latin.getAttribute('typeface')\r\n if (typeface && typeface !== '') return typeface\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 将主题颜色名(含语义别名)解析为 #RRGGBB 颜色字符串\r\n *\r\n * tint / shade 为 OOXML 十六进制字符串(0x00-0xFF),在 HSL 色彩空间运算:\r\n * tint:L_new = L + (1 - L) * factor (变亮)\r\n * shade:L_new = L * factor (变暗)\r\n */\r\nexport function resolveThemeColor(\r\n theme: ThemeData,\r\n themeColorName: string,\r\n themeTint?: string,\r\n themeShade?: string\r\n): string | null {\r\n // 语义名映射到槽位名\r\n const slotName = THEME_COLOR_SEMANTIC_MAP[themeColorName] ?? themeColorName\r\n const hex = theme.colors.get(slotName)\r\n if (!hex) return null\r\n\r\n // 无 tint/shade 时直接返回\r\n if (!themeTint && !themeShade) {\r\n return `#${hex}`\r\n }\r\n\r\n // RGB → HSL → 应用 tint/shade → HSL → RGB\r\n const r = parseInt(hex.substring(0, 2), 16) / 255\r\n const g = parseInt(hex.substring(2, 4), 16) / 255\r\n const b = parseInt(hex.substring(4, 6), 16) / 255\r\n\r\n const [h, s, l] = rgbToHsl(r, g, b)\r\n let lightness = l\r\n\r\n if (themeTint) {\r\n const factor = parseInt(themeTint, 16) / 255\r\n lightness = l + (1 - l) * factor\r\n }\r\n\r\n if (themeShade) {\r\n const factor = parseInt(themeShade, 16) / 255\r\n lightness = l * factor\r\n }\r\n\r\n lightness = Math.min(1, Math.max(0, lightness))\r\n\r\n const [nr, ng, nb] = hslToRgb(h, s, lightness)\r\n return `#${toHex2(nr)}${toHex2(ng)}${toHex2(nb)}`.toUpperCase()\r\n}\r\n\r\n/**\r\n * 解析主题字体引用(asciiTheme / eastAsiaTheme 属性值)\r\n */\r\nexport function resolveThemeFont(\r\n theme: ThemeData,\r\n fontRef: string | null | undefined\r\n): string | null {\r\n if (!fontRef) return null\r\n const lower = fontRef.toLowerCase()\r\n if (lower.startsWith('major')) return theme.majorFont\r\n if (lower.startsWith('minor')) return theme.minorFont\r\n return null\r\n}\r\n\r\n// ---- 颜色空间转换工具 ----\r\n\r\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n const delta = max - min\r\n let h = 0\r\n let s = 0\r\n const l = (max + min) / 2\r\n\r\n if (delta !== 0) {\r\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min)\r\n if (max === r) {\r\n h = ((g - b) / delta + (g < b ? 6 : 0)) / 6\r\n } else if (max === g) {\r\n h = ((b - r) / delta + 2) / 6\r\n } else {\r\n h = ((r - g) / delta + 4) / 6\r\n }\r\n }\r\n\r\n return [h, s, l]\r\n}\r\n\r\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\r\n if (s === 0) {\r\n const v = Math.round(l * 255)\r\n return [v, v, v]\r\n }\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\r\n const p = 2 * l - q\r\n return [\r\n Math.round(hueToRgbChannel(p, q, h + 1 / 3) * 255),\r\n Math.round(hueToRgbChannel(p, q, h) * 255),\r\n Math.round(hueToRgbChannel(p, q, h - 1 / 3) * 255)\r\n ]\r\n}\r\n\r\nfunction hueToRgbChannel(p: number, q: number, t: number): number {\r\n if (t < 0) t += 1\r\n if (t > 1) t -= 1\r\n if (t < 1 / 6) return p + (q - p) * 6 * t\r\n if (t < 1 / 2) return q\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\r\n return p\r\n}\r\n\r\nfunction toHex2(value: number): string {\r\n return Math.min(255, Math.max(0, value)).toString(16).padStart(2, '0')\r\n}\r\n","import {\r\n NS, HIGHLIGHT_COLOR_MAP, THEME_COLOR_SEMANTIC_MAP,\r\n normalizeFont, halfPtToPx, twipToPx\r\n} from '../constants'\r\nimport type { ParagraphStyle, RunStyle, ResolvedStyle } from '../types'\r\nimport { ThemeData, resolveThemeColor, resolveThemeFont } from './theme.resolver'\r\nimport {\r\n parseXml, getFirstChildByTag, getWVal, hasChild\r\n} from './xml.helper'\r\n\r\ninterface StyleDefinition {\r\n id: string\r\n name: string\r\n basedOnId: string | null\r\n paragraphStyle: ParagraphStyle\r\n runStyle: RunStyle\r\n}\r\n\r\n/**\r\n * 样式解析器:解析 word/styles.xml,提供完整的样式继承链查询\r\n *\r\n * 合并优先级(低 → 高):\r\n * docDefaults → basedOn 链(从根祖先到直接父级)→ 当前 styleId → 段落/run 局部属性\r\n */\r\nexport class StyleResolver {\r\n private styleMap = new Map<string, StyleDefinition>()\r\n private defaultParagraphStyle: ParagraphStyle = {}\r\n private defaultRunStyle: RunStyle = {}\r\n private theme: ThemeData\r\n\r\n constructor(stylesXml: string | null, theme: ThemeData) {\r\n this.theme = theme\r\n if (stylesXml) {\r\n this.parseStylesXml(stylesXml)\r\n }\r\n }\r\n\r\n // ---- 公开方法 ----\r\n\r\n /**\r\n * 解析段落属性 <w:pPr>,返回局部 ParagraphStyle(不含继承链)\r\n */\r\n parseParagraphProperties(pPr: Element): ParagraphStyle {\r\n const style: ParagraphStyle = {}\r\n\r\n // 对齐 <w:jc w:val=\"center\"/>\r\n const jcEl = getFirstChildByTag(pPr, NS.w, 'jc')\r\n if (jcEl) {\r\n const val = getWVal(jcEl)\r\n if (val) style.rowFlex = val\r\n }\r\n\r\n // 间距 <w:spacing w:before=\"X\" w:after=\"Y\" w:line=\"Z\" w:lineRule=\"R\"/>\r\n parseSpacingProperties(pPr, style)\r\n\r\n // 缩进 <w:ind .../>\r\n parseIndentProperties(pPr, style)\r\n\r\n // 段落底纹 <w:shd .../>\r\n const shdEl = getFirstChildByTag(pPr, NS.w, 'shd')\r\n if (shdEl) {\r\n const fill = resolveShdFill(shdEl, this.theme)\r\n // 显式赋值(含空字符串),以覆盖继承的 paragraphColor\r\n style.paragraphColor = fill ?? ''\r\n }\r\n\r\n // 标题级别 <w:outlineLvl w:val=\"0\"/> (0=一级标题)\r\n const outlineLvlEl = getFirstChildByTag(pPr, NS.w, 'outlineLvl')\r\n if (outlineLvlEl) {\r\n const val = getWVal(outlineLvlEl)\r\n if (val !== null) {\r\n const level = parseInt(val, 10)\r\n if (level >= 0 && level <= 5) {\r\n style.titleLevel = level + 1\r\n }\r\n }\r\n }\r\n\r\n // 编号引用 <w:numPr><w:numId w:val=\"1\"/><w:ilvl w:val=\"0\"/></w:numPr>\r\n const numPrEl = getFirstChildByTag(pPr, NS.w, 'numPr')\r\n if (numPrEl) {\r\n const numIdEl = getFirstChildByTag(numPrEl, NS.w, 'numId')\r\n const ilvlEl = getFirstChildByTag(numPrEl, NS.w, 'ilvl')\r\n if (numIdEl) {\r\n style.numId = getWVal(numIdEl) ?? undefined\r\n }\r\n if (ilvlEl) {\r\n const levelVal = getWVal(ilvlEl)\r\n if (levelVal !== null) {\r\n style.listLevel = parseInt(levelVal, 10)\r\n }\r\n }\r\n }\r\n\r\n // 制表符停止位 <w:tabs><w:tab .../></w:tabs>\r\n const tabsEl = getFirstChildByTag(pPr, NS.w, 'tabs')\r\n if (tabsEl) {\r\n style.tabStops = parseTabStops(tabsEl)\r\n }\r\n\r\n return style\r\n }\r\n\r\n /**\r\n * 解析 Run 属性 <w:rPr>,返回局部 RunStyle(不含继承链)\r\n */\r\n parseRunProperties(rPr: Element): RunStyle {\r\n const style: RunStyle = {}\r\n\r\n // 粗体 <w:b/>\r\n if (hasChild(rPr, NS.w, 'b')) {\r\n const bEl = getFirstChildByTag(rPr, NS.w, 'b')\r\n const val = bEl ? getWVal(bEl) : null\r\n style.bold = val !== '0' && val !== 'false'\r\n }\r\n\r\n // 斜体 <w:i/>\r\n if (hasChild(rPr, NS.w, 'i')) {\r\n const iEl = getFirstChildByTag(rPr, NS.w, 'i')\r\n const val = iEl ? getWVal(iEl) : null\r\n style.italic = val !== '0' && val !== 'false'\r\n }\r\n\r\n // 下划线 <w:u w:val=\"single\"/> / <w:u w:val=\"none\"/>\r\n // 必须显式设置 false,否则子样式无法覆盖父样式的 underline:true\r\n const uEl = getFirstChildByTag(rPr, NS.w, 'u')\r\n if (uEl) {\r\n const val = getWVal(uEl)\r\n style.underline = val !== 'none' && val !== '0'\r\n }\r\n\r\n // 删除线 <w:strike/>\r\n if (hasChild(rPr, NS.w, 'strike')) {\r\n const sEl = getFirstChildByTag(rPr, NS.w, 'strike')\r\n const val = sEl ? getWVal(sEl) : null\r\n style.strikeout = val !== '0' && val !== 'false'\r\n }\r\n\r\n // 字号 <w:sz w:val=\"24\"/>(半磅);备选 <w:szCs>(复杂脚本字号)\r\n const szEl = getFirstChildByTag(rPr, NS.w, 'sz') ??\r\n getFirstChildByTag(rPr, NS.w, 'szCs')\r\n if (szEl) {\r\n const val = getWVal(szEl)\r\n if (val) style.size = halfPtToPx(parseInt(val, 10))\r\n }\r\n\r\n // 字体 <w:rFonts .../>\r\n const rFontsEl = getFirstChildByTag(rPr, NS.w, 'rFonts')\r\n if (rFontsEl) {\r\n style.font = resolveRunFont(rFontsEl, this.theme)\r\n }\r\n\r\n // 颜色 <w:color w:val=\"FF0000\"/> 或 w:themeColor\r\n const colorEl = getFirstChildByTag(rPr, NS.w, 'color')\r\n if (colorEl) {\r\n style.color = resolveRunColor(colorEl, this.theme)\r\n }\r\n\r\n // 高亮 <w:highlight w:val=\"yellow\"/>\r\n const highlightEl = getFirstChildByTag(rPr, NS.w, 'highlight')\r\n if (highlightEl) {\r\n const val = getWVal(highlightEl)\r\n if (val && val !== 'none') {\r\n style.highlight = HIGHLIGHT_COLOR_MAP[val] ?? `#${val}`\r\n }\r\n }\r\n\r\n // Run 级底纹 <w:shd .../> → 视为高亮背景色\r\n if (!style.highlight) {\r\n const shdEl = getFirstChildByTag(rPr, NS.w, 'shd')\r\n if (shdEl) {\r\n const fill = resolveShdFill(shdEl, this.theme)\r\n if (fill) style.highlight = fill\r\n }\r\n }\r\n\r\n // 字符间距 <w:spacing w:val=\"20\"/>(单位 twip,正值加宽,负值收紧)\r\n const charSpacingEl = getFirstChildByTag(rPr, NS.w, 'spacing')\r\n if (charSpacingEl) {\r\n const val = getWVal(charSpacingEl)\r\n if (val) {\r\n const twip = parseInt(val, 10)\r\n const px = twipToPx(twip)\r\n // 仅在明显可感知时应用(过小的微调值忽略,避免 WPS 打印调整干扰)\r\n if (Math.abs(px) >= 0.5) {\r\n style.letterSpacing = px\r\n }\r\n }\r\n }\r\n\r\n // 上标 / 下标 <w:vertAlign w:val=\"superscript\"/>\r\n const vertAlignEl = getFirstChildByTag(rPr, NS.w, 'vertAlign')\r\n if (vertAlignEl) {\r\n const val = getWVal(vertAlignEl)\r\n if (val === 'superscript' || val === 'subscript') {\r\n style.vertAlign = val\r\n }\r\n }\r\n\r\n return style\r\n }\r\n\r\n /**\r\n * 根据 styleId 解析完整样式(含 docDefaults + 完整继承链)\r\n */\r\n resolveStyle(styleId: string | null): ResolvedStyle {\r\n const result: ResolvedStyle = {\r\n paragraph: { ...this.defaultParagraphStyle },\r\n run: { ...this.defaultRunStyle }\r\n }\r\n if (!styleId) return result\r\n\r\n // 收集继承链(从当前 styleId 向上追溯,unshift 保证从祖先到子的顺序)\r\n const chain: StyleDefinition[] = []\r\n let currentId: string | null = styleId\r\n const visited = new Set<string>()\r\n\r\n while (currentId && !visited.has(currentId)) {\r\n visited.add(currentId)\r\n const def = this.styleMap.get(currentId)\r\n if (!def) break\r\n chain.unshift(def) // 祖先排前面\r\n currentId = def.basedOnId\r\n }\r\n\r\n // 从祖先到子依次合并,后者覆盖前者\r\n for (const def of chain) {\r\n mergeInto(result.paragraph, def.paragraphStyle)\r\n mergeInto(result.run, def.runStyle)\r\n }\r\n\r\n return result\r\n }\r\n\r\n getDefaultRunStyle(): RunStyle {\r\n return { ...this.defaultRunStyle }\r\n }\r\n\r\n getDefaultParagraphStyle(): ParagraphStyle {\r\n return { ...this.defaultParagraphStyle }\r\n }\r\n\r\n // ---- 私有方法 ----\r\n\r\n private parseStylesXml(xml: string): void {\r\n const doc = parseXml(xml)\r\n const root = doc.documentElement\r\n\r\n // docDefaults\r\n const docDefaultsEl = getFirstChildByTag(root, NS.w, 'docDefaults')\r\n if (docDefaultsEl) {\r\n this.parseDocDefaults(docDefaultsEl)\r\n }\r\n\r\n // 所有 <w:style> 元素\r\n const styleEls = root.getElementsByTagNameNS(NS.w, 'style')\r\n for (let i = 0; i < styleEls.length; i++) {\r\n this.parseStyleElement(styleEls[i])\r\n }\r\n }\r\n\r\n private parseDocDefaults(docDefaultsEl: Element): void {\r\n const rPrDefaultEl = getFirstChildByTag(docDefaultsEl, NS.w, 'rPrDefault')\r\n if (rPrDefaultEl) {\r\n const rPrEl = getFirstChildByTag(rPrDefaultEl, NS.w, 'rPr')\r\n if (rPrEl) {\r\n this.defaultRunStyle = this.parseRunProperties(rPrEl)\r\n }\r\n }\r\n\r\n const pPrDefaultEl = getFirstChildByTag(docDefaultsEl, NS.w, 'pPrDefault')\r\n if (pPrDefaultEl) {\r\n const pPrEl = getFirstChildByTag(pPrDefaultEl, NS.w, 'pPr')\r\n if (pPrEl) {\r\n this.defaultParagraphStyle = this.parseParagraphProperties(pPrEl)\r\n }\r\n }\r\n }\r\n\r\n private parseStyleElement(styleEl: Element): void {\r\n const id = styleEl.getAttributeNS(NS.w, 'styleId')\r\n ?? styleEl.getAttribute('w:styleId')\r\n ?? styleEl.getAttribute('styleId')\r\n ?? ''\r\n if (!id) return\r\n\r\n const nameEl = getFirstChildByTag(styleEl, NS.w, 'name')\r\n const name = getWVal(nameEl) ?? ''\r\n const basedOnEl = getFirstChildByTag(styleEl, NS.w, 'basedOn')\r\n const basedOnId = getWVal(basedOnEl)\r\n\r\n let paragraphStyle: ParagraphStyle = {}\r\n let runStyle: RunStyle = {}\r\n\r\n const pPrEl = getFirstChildByTag(styleEl, NS.w, 'pPr')\r\n if (pPrEl) {\r\n paragraphStyle = this.parseParagraphProperties(pPrEl)\r\n }\r\n\r\n // 通过样式名称兜底检测标题级别\r\n if (paragraphStyle.titleLevel === undefined) {\r\n const level = detectHeadingLevel(name, id)\r\n if (level !== undefined) {\r\n paragraphStyle.titleLevel = level\r\n }\r\n }\r\n\r\n const rPrEl = getFirstChildByTag(styleEl, NS.w, 'rPr')\r\n if (rPrEl) {\r\n runStyle = this.parseRunProperties(rPrEl)\r\n }\r\n\r\n this.styleMap.set(id, { id, name, basedOnId, paragraphStyle, runStyle })\r\n }\r\n}\r\n\r\n// ---- 段落属性解析工具函数 ----\r\n\r\nfunction parseSpacingProperties(pPr: Element, style: ParagraphStyle): void {\r\n const spacingEl = getFirstChildByTag(pPr, NS.w, 'spacing')\r\n if (!spacingEl) return\r\n\r\n const before = spacingEl.getAttributeNS(NS.w, 'before') ?? spacingEl.getAttribute('w:before')\r\n const after = spacingEl.getAttributeNS(NS.w, 'after') ?? spacingEl.getAttribute('w:after')\r\n const line = spacingEl.getAttributeNS(NS.w, 'line') ?? spacingEl.getAttribute('w:line')\r\n const lineRule = spacingEl.getAttributeNS(NS.w, 'lineRule') ?? spacingEl.getAttribute('w:lineRule')\r\n\r\n if (before) style.spacingBefore = twipToPx(parseInt(before, 10))\r\n if (after) style.spacingAfter = twipToPx(parseInt(after, 10))\r\n\r\n if (line) {\r\n const lineVal = parseInt(line, 10)\r\n if (!lineRule || lineRule === 'auto') {\r\n // auto:line / 240 = 行高倍率(240 = 单倍行距)\r\n style.lineHeight = lineVal / 240\r\n style.lineHeightRule = 'auto'\r\n } else if (lineRule === 'exact') {\r\n // exact:绝对行高(twip),内容不可超出\r\n style.lineHeight = twipToPx(lineVal)\r\n style.lineHeightRule = 'exact'\r\n } else if (lineRule === 'atLeast') {\r\n // atLeast:最小行高(twip),实际可更大\r\n style.lineHeight = twipToPx(lineVal)\r\n style.lineHeightRule = 'atLeast'\r\n }\r\n }\r\n}\r\n\r\nfunction parseIndentProperties(pPr: Element, style: ParagraphStyle): void {\r\n const indEl = getFirstChildByTag(pPr, NS.w, 'ind')\r\n if (!indEl) return\r\n\r\n const left = indEl.getAttributeNS(NS.w, 'left') ?? indEl.getAttribute('w:left')\r\n const right = indEl.getAttributeNS(NS.w, 'right') ?? indEl.getAttribute('w:right')\r\n const firstLine = indEl.getAttributeNS(NS.w, 'firstLine') ?? indEl.getAttribute('w:firstLine')\r\n const hanging = indEl.getAttributeNS(NS.w, 'hanging') ?? indEl.getAttribute('w:hanging')\r\n\r\n const leftPx = left ? twipToPx(parseInt(left, 10)) : 0\r\n const hangingPx = hanging ? twipToPx(parseInt(hanging, 10)) : 0\r\n\r\n // WPS 打印微调:left 与 hanging 几乎抵消时(净缩进 < 2px)忽略两者\r\n if (left && hanging && Math.abs(leftPx - hangingPx) < 2) {\r\n return\r\n }\r\n\r\n if (left) style.indentLeft = leftPx\r\n if (right) style.indentRight = twipToPx(parseInt(right, 10))\r\n\r\n if (firstLine) {\r\n // 首行缩进(在 indentLeft 基础上额外增加)\r\n style.firstLineIndent = twipToPx(parseInt(firstLine, 10))\r\n } else if (hanging) {\r\n // 悬挂缩进:indentLeft 需加上 hanging,首行为负缩进\r\n style.indentLeft = (leftPx + hangingPx)\r\n style.firstLineIndent = -hangingPx\r\n }\r\n}\r\n\r\nfunction parseTabStops(tabsEl: Element): Array<{ pos: number; type: string }> {\r\n const stops: Array<{ pos: number; type: string }> = []\r\n const tabEls = tabsEl.getElementsByTagNameNS(NS.w, 'tab')\r\n for (let i = 0; i < tabEls.length; i++) {\r\n const tabEl = tabEls[i]\r\n const val = tabEl.getAttributeNS(NS.w, 'val') ?? tabEl.getAttribute('w:val') ?? 'left'\r\n const pos = tabEl.getAttributeNS(NS.w, 'pos') ?? tabEl.getAttribute('w:pos')\r\n if (pos) {\r\n stops.push({ pos: twipToPx(parseInt(pos, 10)), type: val })\r\n }\r\n }\r\n return stops\r\n}\r\n\r\n// ---- Run 属性解析工具函数 ----\r\n\r\nfunction resolveRunFont(rFontsEl: Element, theme: ThemeData): string | undefined {\r\n // 优先东亚字体(中文文档)\r\n const eastAsia = rFontsEl.getAttributeNS(NS.w, 'eastAsia') ?? rFontsEl.getAttribute('w:eastAsia')\r\n if (eastAsia) return normalizeFont(eastAsia)\r\n\r\n // 西文字体\r\n const ascii = rFontsEl.getAttributeNS(NS.w, 'ascii') ?? rFontsEl.getAttribute('w:ascii')\r\n if (ascii) return normalizeFont(ascii)\r\n\r\n const hAnsi = rFontsEl.getAttributeNS(NS.w, 'hAnsi') ?? rFontsEl.getAttribute('w:hAnsi')\r\n if (hAnsi) return normalizeFont(hAnsi)\r\n\r\n // 主题字体引用(东亚优先)\r\n const eastAsiaTheme = rFontsEl.getAttributeNS(NS.w, 'eastAsiaTheme') ?? rFontsEl.getAttribute('w:eastAsiaTheme')\r\n const asciiTheme = rFontsEl.getAttributeNS(NS.w, 'asciiTheme') ?? rFontsEl.getAttribute('w:asciiTheme')\r\n const themeFont = resolveThemeFont(theme, eastAsiaTheme ?? asciiTheme)\r\n if (themeFont) return normalizeFont(themeFont)\r\n\r\n return undefined\r\n}\r\n\r\nfunction resolveRunColor(colorEl: Element, theme: ThemeData): string | undefined {\r\n const themeColorName = colorEl.getAttributeNS(NS.w, 'themeColor') ?? colorEl.getAttribute('w:themeColor')\r\n if (themeColorName) {\r\n const slotName = THEME_COLOR_SEMANTIC_MAP[themeColorName] ?? themeColorName\r\n const tint = colorEl.getAttributeNS(NS.w, 'themeTint') ?? colorEl.getAttribute('w:themeTint') ?? undefined\r\n const shade = colorEl.getAttributeNS(NS.w, 'themeShade') ?? colorEl.getAttribute('w:themeShade') ?? undefined\r\n const resolved = resolveThemeColor(theme, slotName, tint, shade)\r\n return resolved ?? undefined\r\n }\r\n\r\n const val = getWVal(colorEl)\r\n if (!val || val === 'auto') return undefined // auto → 使用编辑器默认颜色\r\n return `#${val}`\r\n}\r\n\r\n// ---- 底纹填充色解析(段落 shd / 单元格 shd 通用) ----\r\n\r\nexport function resolveShdFill(shd: Element, theme: ThemeData): string | null {\r\n const shdVal = shd.getAttributeNS(NS.w, 'val') ?? shd.getAttribute('w:val')\r\n\r\n // nil = 无底纹\r\n if (shdVal === 'nil') return null\r\n\r\n // solid = 前景色覆盖背景:使用 themeColor 或 w:color\r\n if (shdVal === 'solid') {\r\n return resolveShdForegroundColor(shd, theme)\r\n }\r\n\r\n // 优先使用 themeFill(主题填充色)\r\n const themeFill = shd.getAttributeNS(NS.w, 'themeFill') ?? shd.getAttribute('w:themeFill')\r\n if (themeFill) {\r\n const slotName = THEME_COLOR_SEMANTIC_MAP[themeFill] ?? themeFill\r\n const tint = shd.getAttributeNS(NS.w, 'themeFillTint') ?? shd.getAttribute('w:themeFillTint') ?? undefined\r\n const shade = shd.getAttributeNS(NS.w, 'themeFillShade') ?? shd.getAttribute('w:themeFillShade') ?? undefined\r\n const resolved = resolveThemeColor(theme, slotName, tint, shade)\r\n if (resolved) {\r\n return isWhiteOrTransparent(resolved) ? null : resolved\r\n }\r\n // themeFill 存在但解析失败:不回退到 w:fill(w:fill 可能是错误的黑色默认值)\r\n return null\r\n }\r\n\r\n // 无 themeFill 时使用 w:fill\r\n const fill = shd.getAttributeNS(NS.w, 'fill') ?? shd.getAttribute('w:fill')\r\n if (!fill || fill === 'auto') return null\r\n if (isWhiteOrTransparent(`#${fill}`)) return null\r\n return `#${fill}`\r\n}\r\n\r\nfunction resolveShdForegroundColor(shd: Element, theme: ThemeData): string | null {\r\n const themeColor = shd.getAttributeNS(NS.w, 'themeColor') ?? shd.getAttribute('w:themeColor')\r\n if (themeColor) {\r\n const slotName = THEME_COLOR_SEMANTIC_MAP[themeColor] ?? themeColor\r\n const tint = shd.getAttributeNS(NS.w, 'themeTint') ?? shd.getAttribute('w:themeTint') ?? undefined\r\n const shade = shd.getAttributeNS(NS.w, 'themeShade') ?? shd.getAttribute('w:themeShade') ?? undefined\r\n const resolved = resolveThemeColor(theme, slotName, tint, shade)\r\n if (resolved) return isWhiteOrTransparent(resolved) ? null : resolved\r\n return null\r\n }\r\n const color = shd.getAttributeNS(NS.w, 'color') ?? shd.getAttribute('w:color')\r\n if (!color || color === 'auto') return null\r\n if (isWhiteOrTransparent(`#${color}`)) return null\r\n return `#${color}`\r\n}\r\n\r\nfunction isWhiteOrTransparent(color: string): boolean {\r\n const c = color.toUpperCase().replace('#', '')\r\n return c === 'FFFFFF' || c === 'FFF' || c === 'AUTO'\r\n}\r\n\r\n// ---- 标题级别检测 ----\r\n\r\nfunction detectHeadingLevel(styleName: string, styleId: string): number | undefined {\r\n const patterns = [\r\n /^heading\\s*(\\d+)$/i,\r\n /^标题\\s*(\\d+)$/,\r\n ]\r\n for (const re of patterns) {\r\n const m = styleName.match(re) ?? styleId.match(re)\r\n if (m) {\r\n const level = parseInt(m[1], 10)\r\n if (level >= 1 && level <= 6) return level\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\n// ---- 工具函数 ----\r\n\r\n/**\r\n * 将 source 中非 undefined 的属性合并到 target(浅合并,source 覆盖 target)\r\n */\r\nfunction mergeInto<T extends object>(target: T, source: Partial<T>): void {\r\n for (const key of Object.keys(source) as Array<keyof T>) {\r\n if (source[key] !== undefined) {\r\n target[key] = source[key]!\r\n }\r\n }\r\n}\r\n","import { NS, NUM_FMT_MAP, twipToPx } from '../constants'\r\nimport { parseXml, getFirstChildByTag, getWVal } from './xml.helper'\r\n\r\ninterface LevelDefinition {\r\n numFmt: string\r\n lvlText: string\r\n start: number\r\n indentLeft?: number\r\n indentHanging?: number\r\n}\r\n\r\ninterface AbstractNumbering {\r\n abstractNumId: string\r\n levels: Map<number, LevelDefinition>\r\n}\r\n\r\ninterface LevelOverride {\r\n ilvl: number\r\n startOverride?: number\r\n overrideLevelDef?: LevelDefinition\r\n}\r\n\r\ninterface NumberingReference {\r\n numId: string\r\n abstractNumId: string\r\n levelOverrides: Map<number, LevelOverride>\r\n}\r\n\r\nexport interface NumberingInfo {\r\n listType: string\r\n listStyle: string\r\n level: number\r\n indentLeft?: number\r\n indentHanging?: number\r\n}\r\n\r\n/**\r\n * 列表编号解析器:解析 word/numbering.xml\r\n *\r\n * 支持:\r\n * - <w:abstractNum>:抽象编号定义(含各级格式)\r\n * - <w:num>:具体编号实例(引用 abstractNum)\r\n * - <w:lvlOverride>:级别覆盖(如 startOverride 重置起始值)\r\n */\r\nexport class NumberingResolver {\r\n private abstractNums = new Map<string, AbstractNumbering>()\r\n private numRefs = new Map<string, NumberingReference>()\r\n\r\n constructor(numberingXml: string | null) {\r\n if (numberingXml) {\r\n this.parseNumberingXml(numberingXml)\r\n }\r\n }\r\n\r\n /**\r\n * 根据 numId 和列表层级解析编号信息\r\n * 返回 null 表示找不到对应定义\r\n */\r\n resolve(numId: string, level: number): NumberingInfo | null {\r\n const numRef = this.numRefs.get(numId)\r\n if (!numRef) return null\r\n\r\n const abstractNum = this.abstractNums.get(numRef.abstractNumId)\r\n if (!abstractNum) return null\r\n\r\n // 检查该 num 是否有对应层级的 lvlOverride\r\n const override = numRef.levelOverrides.get(level)\r\n if (override?.overrideLevelDef) {\r\n return this.mapLevelToInfo(override.overrideLevelDef, level)\r\n }\r\n\r\n // 使用 abstractNum 的级别定义\r\n const levelDef = abstractNum.levels.get(level)\r\n if (!levelDef) {\r\n // 找不到该层级,回退到 level 0\r\n const fallback = abstractNum.levels.get(0)\r\n if (!fallback) return null\r\n return this.mapLevelToInfo(fallback, level)\r\n }\r\n\r\n return this.mapLevelToInfo(levelDef, level)\r\n }\r\n\r\n // ---- 私有方法 ----\r\n\r\n private parseNumberingXml(xml: string): void {\r\n const doc = parseXml(xml)\r\n const root = doc.documentElement\r\n\r\n this.parseAbstractNums(root)\r\n this.parseNumReferences(root)\r\n }\r\n\r\n private parseAbstractNums(root: Element): void {\r\n const abstractNumEls = root.getElementsByTagNameNS(NS.w, 'abstractNum')\r\n for (let i = 0; i < abstractNumEls.length; i++) {\r\n const el = abstractNumEls[i]\r\n const abstractNumId = el.getAttributeNS(NS.w, 'abstractNumId')\r\n ?? el.getAttribute('w:abstractNumId')\r\n ?? ''\r\n\r\n const levels = new Map<number, LevelDefinition>()\r\n const lvlEls = el.getElementsByTagNameNS(NS.w, 'lvl')\r\n\r\n for (let j = 0; j < lvlEls.length; j++) {\r\n const lvlEl = lvlEls[j]\r\n // 只处理直接子 lvl(避免嵌套 abstractNum 干扰)\r\n if (lvlEl.parentElement !== el) continue\r\n\r\n const ilvlAttr = lvlEl.getAttributeNS(NS.w, 'ilvl') ?? lvlEl.getAttribute('w:ilvl') ?? '0'\r\n const ilvl = parseInt(ilvlAttr, 10)\r\n levels.set(ilvl, parseLevelDefinition(lvlEl))\r\n }\r\n\r\n this.abstractNums.set(abstractNumId, { abstractNumId, levels })\r\n }\r\n }\r\n\r\n private parseNumReferences(root: Element): void {\r\n const numEls = root.getElementsByTagNameNS(NS.w, 'num')\r\n for (let i = 0; i < numEls.length; i++) {\r\n const el = numEls[i]\r\n const numId = el.getAttributeNS(NS.w, 'numId') ?? el.getAttribute('w:numId') ?? ''\r\n\r\n const abstractNumIdEl = getFirstChildByTag(el, NS.w, 'abstractNumId')\r\n const abstractNumId = getWVal(abstractNumIdEl) ?? ''\r\n\r\n const levelOverrides = new Map<number, LevelOverride>()\r\n const lvlOverrideEls = el.getElementsByTagNameNS(NS.w, 'lvlOverride')\r\n for (let j = 0; j < lvlOverrideEls.length; j++) {\r\n const lvlOverrideEl = lvlOverrideEls[j]\r\n const ilvlAttr = lvlOverrideEl.getAttributeNS(NS.w, 'ilvl') ?? lvlOverrideEl.getAttribute('w:ilvl') ?? '0'\r\n const ilvl = parseInt(ilvlAttr, 10)\r\n\r\n const override: LevelOverride = { ilvl }\r\n\r\n // startOverride:覆盖起始编号\r\n const startOverrideEl = getFirstChildByTag(lvlOverrideEl, NS.w, 'startOverride')\r\n if (startOverrideEl) {\r\n const val = getWVal(startOverrideEl)\r\n if (val) override.startOverride = parseInt(val, 10)\r\n }\r\n\r\n // lvl:完整级别定义覆盖\r\n const lvlEl = getFirstChildByTag(lvlOverrideEl, NS.w, 'lvl')\r\n if (lvlEl) {\r\n override.overrideLevelDef = parseLevelDefinition(lvlEl)\r\n if (override.startOverride !== undefined) {\r\n override.overrideLevelDef.start = override.startOverride\r\n }\r\n }\r\n\r\n levelOverrides.set(ilvl, override)\r\n }\r\n\r\n this.numRefs.set(numId, { numId, abstractNumId, levelOverrides })\r\n }\r\n }\r\n\r\n private mapLevelToInfo(levelDef: LevelDefinition, level: number): NumberingInfo {\r\n const mapped = NUM_FMT_MAP[levelDef.numFmt]\r\n if (mapped) {\r\n return {\r\n listType: mapped.listType,\r\n listStyle: mapped.listStyle,\r\n level,\r\n indentLeft: levelDef.indentLeft,\r\n indentHanging: levelDef.indentHanging\r\n }\r\n }\r\n\r\n // 未映射格式:通过 lvlText 判断是否为项目符号\r\n if (isBulletLvlText(levelDef.lvlText)) {\r\n return { listType: 'ul', listStyle: 'disc', level }\r\n }\r\n\r\n return { listType: 'ol', listStyle: 'decimal', level }\r\n }\r\n}\r\n\r\n// ---- 工具函数 ----\r\n\r\nfunction parseLevelDefinition(lvlEl: Element): LevelDefinition {\r\n const numFmtEl = getFirstChildByTag(lvlEl, NS.w, 'numFmt')\r\n const numFmt = getWVal(numFmtEl) ?? 'decimal'\r\n\r\n const lvlTextEl = getFirstChildByTag(lvlEl, NS.w, 'lvlText')\r\n const lvlText = getWVal(lvlTextEl) ?? ''\r\n\r\n const startEl = getFirstChildByTag(lvlEl, NS.w, 'start')\r\n const start = startEl ? parseInt(getWVal(startEl) ?? '1', 10) : 1\r\n\r\n // 列表缩进 <w:pPr><w:ind .../>\r\n let indentLeft: number | undefined\r\n let indentHanging: number | undefined\r\n const pPrEl = getFirstChildByTag(lvlEl, NS.w, 'pPr')\r\n if (pPrEl) {\r\n const indEl = getFirstChildByTag(pPrEl, NS.w, 'ind')\r\n if (indEl) {\r\n const left = indEl.getAttributeNS(NS.w, 'left') ?? indEl.getAttribute('w:left')\r\n const hanging = indEl.getAttributeNS(NS.w, 'hanging') ?? indEl.getAttribute('w:hanging')\r\n if (left) indentLeft = twipToPx(parseInt(left, 10))\r\n if (hanging) indentHanging = twipToPx(parseInt(hanging, 10))\r\n }\r\n }\r\n\r\n return { numFmt, lvlText, start, indentLeft, indentHanging }\r\n}\r\n\r\n/**\r\n * 判断 lvlText 是否为项目符号(无序列表)\r\n * 常见的项目符号字符:'·', 'o', '', '–', '•', '-'\r\n */\r\nfunction isBulletLvlText(lvlText: string): boolean {\r\n if (lvlText === '') return true\r\n const bulletChars = ['·', 'o', '–', '•', '-', '●', '○', '■', '□', '◆', '◇', '★', '☆']\r\n return bulletChars.includes(lvlText.trim())\r\n}\r\n","import { parseXml, forEachChild } from './xml.helper'\r\n\r\nexport interface RelationshipEntry {\r\n id: string\r\n type: string\r\n target: string\r\n}\r\n\r\n/**\r\n * 解析 .rels 文件,建立 rId → target 映射\r\n */\r\nexport function parseRelationships(relsXml: string): Map<string, RelationshipEntry> {\r\n const map = new Map<string, RelationshipEntry>()\r\n const doc = parseXml(relsXml)\r\n const root = doc.documentElement\r\n forEachChild(root, (child) => {\r\n if (child.localName === 'Relationship') {\r\n const id = child.getAttribute('Id') || ''\r\n const type = child.getAttribute('Type') || ''\r\n const target = child.getAttribute('Target') || ''\r\n if (id) {\r\n map.set(id, { id, type, target })\r\n }\r\n }\r\n })\r\n return map\r\n}\r\n\r\n/**\r\n * 通过 rId 获取 target 路径\r\n */\r\nexport function getTargetByRId(\r\n rels: Map<string, RelationshipEntry>,\r\n rId: string\r\n): string | null {\r\n const entry = rels.get(rId)\r\n return entry?.target || null\r\n}\r\n\r\n/**\r\n * 查找指定类型的 relationship\r\n */\r\nexport function findRelByType(\r\n rels: Map<string, RelationshipEntry>,\r\n typeSubstring: string\r\n): RelationshipEntry | null {\r\n for (const entry of rels.values()) {\r\n if (entry.type.includes(typeSubstring)) {\r\n return entry\r\n }\r\n }\r\n return null\r\n}\r\n","import { NS } from '../../constants'\r\nimport type { RunStyle, InlineChunk, BreakChunk } from '../../types'\r\nimport { StyleResolver } from '../style.resolver'\r\nimport { ThemeData } from '../theme.resolver'\r\nimport { getFirstChildByTag, forEachChild } from '../xml.helper'\r\n\r\n/**\r\n * 全局脚注 / 尾注计数器(每次 parseSync 开始前由 DocxParser 重置)\r\n */\r\nexport const footnoteCounter = { value: 0 }\r\n\r\n/**\r\n * 解析 <w:r> 元素,返回 InlineChunk 列表\r\n *\r\n * 处理内容:\r\n * <w:t> 文本\r\n * <w:br> 换行 / 分页 / 分栏符\r\n * <w:tab> 制表符\r\n * <w:sym> 符号字符\r\n * <w:softHyphen> 软连字符(忽略)\r\n * <w:noBreakHyphen> 不换行连字符(输出 \"-\")\r\n * <w:footnoteReference> / <w:endnoteReference> 脚注 / 尾注(输出上标序号)\r\n */\r\nexport function parseRun(\r\n runEl: Element,\r\n styleResolver: StyleResolver,\r\n _theme: ThemeData,\r\n baseRunStyle: RunStyle\r\n): InlineChunk[] {\r\n const chunks: InlineChunk[] = []\r\n\r\n // 解析 run 属性 <w:rPr>\r\n const rPrEl = getFirstChildByTag(runEl, NS.w, 'rPr')\r\n const localStyle = rPrEl ? styleResolver.parseRunProperties(rPrEl) : {}\r\n const mergedStyle: RunStyle = mergeRunStyles(baseRunStyle, localStyle)\r\n\r\n // 连续换行合并:跟踪上一个 break 类型\r\n let lastBreakType: string | null = null\r\n\r\n forEachChild(runEl, (child) => {\r\n const tag = child.localName\r\n\r\n if (tag === 't') {\r\n // 文本内容:只过滤完全为空字符串的节点,保留含空格的文本\r\n const text = child.textContent ?? ''\r\n if (text !== '') {\r\n chunks.push({ type: 'text', value: text, style: { ...mergedStyle } })\r\n }\r\n lastBreakType = null\r\n } else if (tag === 'delText') {\r\n const text = child.textContent ?? ''\r\n if (text !== '') {\r\n\r\n chunks.push({ type: 'text', value: text, style: { ...mergedStyle } })\r\n }\r\n lastBreakType = null\r\n } else if (tag === 'br') {\r\n const breakTypeAttr = child.getAttributeNS(NS.w, 'type') ?? child.getAttribute('w:type')\r\n const resolvedBreakType = resolveBreakType(breakTypeAttr)\r\n\r\n // 连续相同类型换行只保留一个,避免堆叠空行\r\n if (resolvedBreakType !== lastBreakType) {\r\n chunks.push({ type: 'break', breakType: resolvedBreakType } as BreakChunk)\r\n lastBreakType = resolvedBreakType\r\n }\r\n } else if (tag === 'tab') {\r\n chunks.push({ type: 'tab' })\r\n lastBreakType = null\r\n } else if (tag === 'sym') {\r\n // 符号字符:<w:sym w:char=\"F0B7\"/>\r\n const charCode = child.getAttributeNS(NS.w, 'char') ?? child.getAttribute('w:char')\r\n if (charCode) {\r\n const codePoint = parseInt(charCode, 16)\r\n // 部分 Symbol / Wingdings 字符编码在私有区 (F000-F0FF),还原为基础字符\r\n const normalized = codePoint >= 0xF000 && codePoint <= 0xF0FF\r\n ? codePoint - 0xF000\r\n : codePoint\r\n chunks.push({\r\n type: 'text',\r\n value: String.fromCharCode(normalized),\r\n style: { ...mergedStyle }\r\n })\r\n }\r\n lastBreakType = null\r\n } else if (tag === 'softHyphen') {\r\n // 软连字符:Web 渲染中忽略(浏览器会自动处理换行)\r\n lastBreakType = null\r\n } else if (tag === 'noBreakHyphen') {\r\n // 不换行连字符:输出普通连字符\r\n chunks.push({ type: 'text', value: '-', style: { ...mergedStyle } })\r\n lastBreakType = null\r\n } else if (tag === 'footnoteReference' || tag === 'endnoteReference') {\r\n // 脚注 / 尾注引用:输出自增上标序号\r\n footnoteCounter.value++\r\n chunks.push({\r\n type: 'text',\r\n value: String(footnoteCounter.value),\r\n style: { ...mergedStyle, vertAlign: 'superscript' }\r\n })\r\n lastBreakType = null\r\n } else if (tag === 'lastRenderedPageBreak') {\r\n // 渲染引擎插入的分页标记,非文档内容,忽略\r\n }\r\n // drawing / pict 由外层 paragraphParser 处理,此处跳过\r\n })\r\n\r\n return chunks\r\n}\r\n\r\n// ---- 工具函数 ----\r\n\r\nfunction resolveBreakType(typeAttr: string | null): 'line' | 'page' | 'column' {\r\n if (typeAttr === 'page') return 'page'\r\n if (typeAttr === 'column') return 'column'\r\n // textWrapping 或无 type 属性 → 行内换行\r\n return 'line'\r\n}\r\n\r\n/**\r\n * 合并 base 与 local run 样式(local 中非 undefined 的属性覆盖 base)\r\n */\r\nfunction mergeRunStyles(base: RunStyle, local: RunStyle): RunStyle {\r\n const merged: RunStyle = { ...base }\r\n for (const key of Object.keys(local) as Array<keyof RunStyle>) {\r\n if (local[key] !== undefined) {\r\n (merged as any)[key] = local[key]\r\n }\r\n }\r\n return merged\r\n}\r\n","import { NS, emuToPx } from '../../constants'\r\nimport type { ImageChunk } from '../../types'\r\nimport { RelationshipEntry } from '../relationship.resolver'\r\nimport {\r\n getFirstChildByTag\r\n} from '../xml.helper'\r\n\r\nexport interface PageMargins {\r\n top: number\r\n bottom: number\r\n left: number\r\n right: number\r\n}\r\n\r\n/**\r\n * 解析 <w:drawing> 元素\r\n */\r\nexport function parseImage(\r\n drawingEl: Element,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n pageMargins?: PageMargins\r\n): ImageChunk | null {\r\n // 查找 <wp:inline> 或 <wp:anchor>\r\n const inline = getFirstChildByTag(drawingEl, NS.wp, 'inline')\r\n const anchor = getFirstChildByTag(drawingEl, NS.wp, 'anchor')\r\n const container = inline || anchor\r\n\r\n if (!container) {\r\n return null\r\n }\r\n\r\n // 获取尺寸 <wp:extent cx=\"...\" cy=\"...\"/>\r\n const extent = getFirstChildByTag(container, NS.wp, 'extent')\r\n let width = 100\r\n let height = 100\r\n if (extent) {\r\n const cx = extent.getAttribute('cx')\r\n const cy = extent.getAttribute('cy')\r\n if (cx) width = emuToPx(parseInt(cx, 10))\r\n if (cy) height = emuToPx(parseInt(cy, 10))\r\n }\r\n\r\n // 查找 <a:blip r:embed=\"rIdX\"/>\r\n const blips = container.getElementsByTagNameNS(NS.a, 'blip')\r\n if (blips.length === 0) {\r\n return null\r\n }\r\n\r\n const blip = blips[0]\r\n const rId =\r\n blip.getAttributeNS(NS.r, 'embed') ||\r\n blip.getAttribute('r:embed') ||\r\n blip.getAttributeNS(NS.r, 'link') ||\r\n blip.getAttribute('r:link') ||\r\n ''\r\n\r\n if (!rId) {\r\n return null\r\n }\r\n\r\n const rel = rels.get(rId)\r\n if (!rel) {\r\n return null\r\n }\r\n\r\n // 解析路径\r\n const target = rel.target.replace(/^\\.\\.\\//, '')\r\n const mediaPath = target.startsWith('word/') ? target : `word/${target}`\r\n const src = mediaMap[mediaPath] || mediaMap[target]\r\n if (!src) {\r\n return null\r\n }\r\n\r\n // 图片显示方式\r\n let display: string | undefined\r\n let floatPosition: { x: number; y: number } | undefined\r\n if (anchor) {\r\n // 检测 wrap type 和 behindDoc 属性,映射到编辑器 display 模式\r\n display = resolveAnchorDisplay(anchor)\r\n const margins = pageMargins || { top: 72, bottom: 72, left: 90, right: 90 }\r\n\r\n const posH = getFirstChildByTag(anchor, NS.wp, 'positionH')\r\n const posV = getFirstChildByTag(anchor, NS.wp, 'positionV')\r\n let x = margins.left\r\n let y = margins.top\r\n\r\n if (posH) {\r\n const relFrom = posH.getAttribute('relativeFrom') || 'column'\r\n const posOffset = getFirstChildByTag(posH, NS.wp, 'posOffset')\r\n if (posOffset?.textContent) {\r\n const offset = emuToPx(parseInt(posOffset.textContent, 10))\r\n if (relFrom === 'page') {\r\n x = offset\r\n } else {\r\n // margin / column / character / paragraph → offset from content area\r\n x = margins.left + offset\r\n }\r\n } else {\r\n // <wp:align> fallback\r\n const align = getFirstChildByTag(posH, NS.wp, 'align')\r\n if (align?.textContent) {\r\n x = resolveHAlign(align.textContent.trim(), margins, Math.round(width))\r\n }\r\n }\r\n }\r\n\r\n if (posV) {\r\n const relFrom = posV.getAttribute('relativeFrom') || 'paragraph'\r\n const posOffset = getFirstChildByTag(posV, NS.wp, 'posOffset')\r\n if (posOffset?.textContent) {\r\n const offset = emuToPx(parseInt(posOffset.textContent, 10))\r\n if (relFrom === 'page') {\r\n y = offset\r\n } else {\r\n // margin / paragraph / line → offset from content area\r\n y = margins.top + offset\r\n }\r\n } else {\r\n const align = getFirstChildByTag(posV, NS.wp, 'align')\r\n if (align?.textContent) {\r\n y = resolveVAlign(align.textContent.trim(), margins, Math.round(height))\r\n }\r\n }\r\n }\r\n\r\n floatPosition = { x, y }\r\n } else if (inline) {\r\n display = 'inline'\r\n }\r\n\r\n return {\r\n type: 'image',\r\n src,\r\n width: Math.round(width),\r\n height: Math.round(height),\r\n display,\r\n floatPosition\r\n }\r\n}\r\n\r\nfunction resolveHAlign(\r\n align: string,\r\n margins: PageMargins,\r\n imgWidth: number\r\n): number {\r\n // 默认 A4 页面宽度 794px\r\n const pageWidth = 794\r\n const contentWidth = pageWidth - margins.left - margins.right\r\n switch (align) {\r\n case 'left':\r\n return margins.left\r\n case 'center':\r\n return margins.left + (contentWidth - imgWidth) / 2\r\n case 'right':\r\n return margins.left + contentWidth - imgWidth\r\n default:\r\n return margins.left\r\n }\r\n}\r\n\r\nfunction resolveVAlign(\r\n align: string,\r\n margins: PageMargins,\r\n imgHeight: number\r\n): number {\r\n // 默认 A4 页面高度 1123px\r\n const pageHeight = 1123\r\n const contentHeight = pageHeight - margins.top - margins.bottom\r\n switch (align) {\r\n case 'top':\r\n return margins.top\r\n case 'center':\r\n return margins.top + (contentHeight - imgHeight) / 2\r\n case 'bottom':\r\n return margins.top + contentHeight - imgHeight\r\n default:\r\n return margins.top\r\n }\r\n}\r\n\r\n/**\r\n * 根据 anchor 的 wrap type 和 behindDoc 属性,映射到编辑器的 display 模式\r\n * 编辑器支持: 'inline' | 'block' | 'surround' | 'float-top' | 'float-bottom'\r\n */\r\nfunction resolveAnchorDisplay(anchor: Element): string {\r\n const behindDoc = anchor.getAttribute('behindDoc') === '1'\r\n\r\n // 检测 wrap type 子元素\r\n const wrapNone = getFirstChildByTag(anchor, NS.wp, 'wrapNone')\r\n const wrapSquare = getFirstChildByTag(anchor, NS.wp, 'wrapSquare')\r\n const wrapTight = getFirstChildByTag(anchor, NS.wp, 'wrapTight')\r\n const wrapThrough = getFirstChildByTag(anchor, NS.wp, 'wrapThrough')\r\n const wrapTopAndBottom = getFirstChildByTag(anchor, NS.wp, 'wrapTopAndBottom')\r\n\r\n if (wrapSquare || wrapTight || wrapThrough) {\r\n // 文字环绕模式\r\n return 'surround'\r\n }\r\n if (wrapTopAndBottom) {\r\n // 上下环绕 → 作为块级浮动处理\r\n return behindDoc ? 'float-bottom' : 'float-top'\r\n }\r\n if (wrapNone) {\r\n // 无环绕:根据 behindDoc 决定浮于文字上方/下方\r\n return behindDoc ? 'float-bottom' : 'float-top'\r\n }\r\n\r\n // 默认:浮于文字上方\r\n return behindDoc ? 'float-bottom' : 'float-top'\r\n}\r\n","import { NS, emuToPx } from '../../constants'\r\nimport type { ImageChunk } from '../../types'\r\nimport { RelationshipEntry, parseRelationships } from '../relationship.resolver'\r\nimport { getFirstChildByTag } from '../xml.helper'\r\n\r\n/**\r\n * 从 <w:drawing> 中提取图表预览图\r\n *\r\n * 策略:\r\n * 1. 检测 <c:chart r:id=\"rIdX\"/>\r\n * 2. 查找图表 .rels 文件中的预览图\r\n * 3. 回退到 <a:blipFill> 缓存图片\r\n * 4. 无预览图则返回 null\r\n */\r\nexport function parseChart(\r\n drawingEl: Element,\r\n documentRels: Map<string, RelationshipEntry>,\r\n chartRelsMap: Record<string, string>,\r\n mediaMap: Record<string, string>\r\n): ImageChunk | null {\r\n // 查找 <c:chart>\r\n const chartElements = drawingEl.getElementsByTagNameNS(NS.c, 'chart')\r\n if (chartElements.length === 0) return null\r\n\r\n const chartEl = chartElements[0]\r\n const rId =\r\n chartEl.getAttributeNS(NS.r, 'id') || chartEl.getAttribute('r:id') || ''\r\n if (!rId) {\r\n return null\r\n }\r\n\r\n // 获取图表路径\r\n const rel = documentRels.get(rId)\r\n if (!rel) {\r\n return null\r\n }\r\n\r\n const chartPath = rel.target.startsWith('word/')\r\n ? rel.target\r\n : `word/${rel.target.replace(/^\\.\\.\\//, '')}`\r\n\r\n\r\n // 获取尺寸\r\n let width = 400\r\n let height = 300\r\n const container =\r\n getFirstChildByTag(drawingEl, NS.wp, 'inline') ||\r\n getFirstChildByTag(drawingEl, NS.wp, 'anchor')\r\n if (container) {\r\n const extent = getFirstChildByTag(container, NS.wp, 'extent')\r\n if (extent) {\r\n const cx = extent.getAttribute('cx')\r\n const cy = extent.getAttribute('cy')\r\n if (cx) width = emuToPx(parseInt(cx, 10))\r\n if (cy) height = emuToPx(parseInt(cy, 10))\r\n }\r\n }\r\n\r\n // 查找图表的 .rels 文件\r\n const chartRelsPath = chartPath.replace(\r\n /\\/([^/]+)$/,\r\n '/_rels/$1.rels'\r\n )\r\n const chartRelsXml = chartRelsMap[chartRelsPath]\r\n\r\n if (chartRelsXml) {\r\n const chartRels = parseRelationships(chartRelsXml)\r\n // 查找 image relationship\r\n for (const entry of chartRels.values()) {\r\n if (entry.type.includes('image') || entry.target.match(/\\.(png|jpg|jpeg|gif|bmp|tiff)$/i)) {\r\n const imagePath = resolveRelativePath(chartPath, entry.target)\r\n const src = mediaMap[imagePath] || mediaMap[entry.target]\r\n if (src) {\r\n return {\r\n type: 'image',\r\n src,\r\n width: Math.round(width),\r\n height: Math.round(height)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 回退:检查 <a:blipFill> 中的缓存图片\r\n const blips = drawingEl.getElementsByTagNameNS(NS.a, 'blip')\r\n for (let i = 0; i < blips.length; i++) {\r\n const blip = blips[i]\r\n const embedId =\r\n blip.getAttributeNS(NS.r, 'embed') || blip.getAttribute('r:embed') || ''\r\n if (embedId) {\r\n const imgRel = documentRels.get(embedId)\r\n if (imgRel) {\r\n const target = imgRel.target.replace(/^\\.\\.\\//, '')\r\n const mediaPath = target.startsWith('word/') ? target : `word/${target}`\r\n const src = mediaMap[mediaPath] || mediaMap[target]\r\n if (src) {\r\n return {\r\n type: 'image',\r\n src,\r\n width: Math.round(width),\r\n height: Math.round(height)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\n/**\r\n * 检测 drawing 中是否包含图表\r\n */\r\nexport function isChartDrawing(drawingEl: Element): boolean {\r\n return drawingEl.getElementsByTagNameNS(NS.c, 'chart').length > 0\r\n}\r\n\r\nfunction resolveRelativePath(basePath: string, relativePath: string): string {\r\n const baseDir = basePath.substring(0, basePath.lastIndexOf('/'))\r\n const parts = relativePath.split('/')\r\n const baseParts = baseDir.split('/')\r\n\r\n for (const part of parts) {\r\n if (part === '..') {\r\n baseParts.pop()\r\n } else if (part !== '.') {\r\n baseParts.push(part)\r\n }\r\n }\r\n\r\n return baseParts.join('/')\r\n}\r\n","import { NS } from '../../constants'\r\nimport type { HyperlinkChunk, TextChunk, RunStyle } from '../../types'\r\nimport { StyleResolver } from '../style.resolver'\r\nimport { ThemeData } from '../theme.resolver'\r\nimport { RelationshipEntry } from '../relationship.resolver'\r\nimport { parseRun } from './run.parser'\r\nimport { forEachChild, getFirstChildByTag } from '../xml.helper'\r\n\r\n/** Word 标准超链接蓝色 */\r\nconst DEFAULT_HYPERLINK_COLOR = '#0563C1'\r\n\r\n/**\r\n * 解析 <w:hyperlink> 元素\r\n *\r\n * 支持:\r\n * - 外部链接(r:id → rels 中的目标 URL)\r\n * - 内部书签锚点(w:anchor → \"#anchorName\")\r\n *\r\n * 默认样式:rPr 未明确设置颜色时使用超链接蓝色,未明确设置下划线时添加下划线\r\n */\r\nexport function parseHyperlink(\r\n hyperlinkEl: Element,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n baseRunStyle: RunStyle,\r\n rels: Map<string, RelationshipEntry>\r\n): HyperlinkChunk | null {\r\n // 解析目标 URL\r\n const url = resolveHyperlinkUrl(hyperlinkEl, rels)\r\n\r\n // 收集子 run 文本\r\n const children: TextChunk[] = []\r\n forEachChild(hyperlinkEl, (child) => {\r\n if (child.localName === 'r' && child.namespaceURI === NS.w) {\r\n const runChunks = parseRun(child, styleResolver, theme, baseRunStyle)\r\n for (const chunk of runChunks) {\r\n if (chunk.type === 'text') {\r\n children.push(applyHyperlinkDefaults(chunk, child, styleResolver))\r\n }\r\n }\r\n } else if (child.localName === 'ins' && child.namespaceURI === NS.w) {\r\n const rawRevId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? ''\r\n const revAuthor = child.getAttributeNS(NS.w, 'author') ?? child.getAttribute('w:author') ?? ''\r\n const revDate = child.getAttributeNS(NS.w, 'date') ?? child.getAttribute('w:date') ?? ''\r\n\r\n let revId = rawRevId || `rev_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`\r\n for (let ci = children.length - 1; ci >= 0; ci--) {\r\n const c = children[ci]\r\n if (c.type === 'text' && c.revision?.type === 'delete' && c.revision.author === revAuthor && c.revision.date === revDate) {\r\n if (c.revision.id !== revId) {\r\n revId = c.revision.id\r\n }\r\n break\r\n }\r\n if (c.type === 'text' && c.revision?.type === 'delete') continue\r\n if (c.type === 'text' && !c.revision) continue\r\n break\r\n }\r\n const revision = { id: revId, type: 'insert' as const, author: revAuthor, date: revDate }\r\n forEachChild(child, (insChild) => {\r\n if (insChild.localName === 'r' && insChild.namespaceURI === NS.w) {\r\n const runChunks = parseRun(insChild, styleResolver, theme, baseRunStyle)\r\n for (const chunk of runChunks) {\r\n if (chunk.type === 'text') {\r\n chunk.revision = revision\r\n children.push(applyHyperlinkDefaults(chunk, insChild, styleResolver))\r\n }\r\n }\r\n }\r\n })\r\n } else if (child.localName === 'del' && child.namespaceURI === NS.w) {\r\n const revId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? `rev_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`\r\n const revAuthor = child.getAttributeNS(NS.w, 'author') ?? child.getAttribute('w:author') ?? ''\r\n const revDate = child.getAttributeNS(NS.w, 'date') ?? child.getAttribute('w:date') ?? ''\r\n const revision = { id: revId, type: 'delete' as const, author: revAuthor, date: revDate }\r\n forEachChild(child, (delChild) => {\r\n if (delChild.localName === 'r' && delChild.namespaceURI === NS.w) {\r\n const runChunks = parseRun(delChild, styleResolver, theme, baseRunStyle)\r\n for (const chunk of runChunks) {\r\n if (chunk.type === 'text') {\r\n chunk.revision = revision\r\n children.push(applyHyperlinkDefaults(chunk, delChild, styleResolver))\r\n }\r\n }\r\n }\r\n })\r\n }\r\n })\r\n\r\n if (children.length === 0) return null\r\n\r\n return { type: 'hyperlink', url, children }\r\n}\r\n\r\n// ---- 工具函数 ----\r\n\r\nfunction resolveHyperlinkUrl(\r\n hyperlinkEl: Element,\r\n rels: Map<string, RelationshipEntry>\r\n): string {\r\n // 外部链接:通过 r:id 在 rels 中查找\r\n const rId = hyperlinkEl.getAttributeNS(NS.r, 'id') ?? hyperlinkEl.getAttribute('r:id') ?? ''\r\n if (rId) {\r\n const rel = rels.get(rId)\r\n if (rel?.target) return rel.target\r\n }\r\n\r\n // 内部书签锚点:w:anchor\r\n const anchor = hyperlinkEl.getAttributeNS(NS.w, 'anchor') ?? hyperlinkEl.getAttribute('w:anchor')\r\n if (anchor) return `#${anchor}`\r\n\r\n return ''\r\n}\r\n\r\n/**\r\n * 为超链接文字应用默认颜色和下划线\r\n * 仅在 rPr 中未显式声明时才应用默认值\r\n */\r\nfunction applyHyperlinkDefaults(\r\n chunk: TextChunk,\r\n runEl: Element,\r\n styleResolver: StyleResolver\r\n): TextChunk {\r\n const rPrEl = getFirstChildByTag(runEl, NS.w, 'rPr')\r\n const localStyle = rPrEl ? styleResolver.parseRunProperties(rPrEl) : {}\r\n\r\n const style: RunStyle = { ...chunk.style }\r\n\r\n // 未显式设置颜色 → 使用超链接默认蓝色\r\n if (localStyle.color === undefined && !style.color) {\r\n style.color = DEFAULT_HYPERLINK_COLOR\r\n }\r\n\r\n // 未显式设置下划线 → 添加下划线\r\n if (localStyle.underline === undefined && style.underline === undefined) {\r\n style.underline = true\r\n }\r\n\r\n return { ...chunk, style }\r\n}\r\n","import { NS } from '../../constants'\r\nimport type {\r\n ParagraphNode, ParagraphStyle, InlineChunk, RunStyle, ImageChunk\r\n} from '../../types'\r\nimport { StyleResolver } from '../style.resolver'\r\nimport { ThemeData } from '../theme.resolver'\r\nimport { NumberingResolver } from '../numbering.resolver'\r\nimport { RelationshipEntry } from '../relationship.resolver'\r\nimport { parseRun } from './run.parser'\r\nimport { parseImage } from './image.parser'\r\nimport type { PageMargins } from './image.parser'\r\nimport { isChartDrawing } from './chart.parser'\r\nimport { parseHyperlink } from './hyperlink.parser'\r\nimport {\r\n getFirstChildByTag, getWVal, forEachChild\r\n} from '../xml.helper'\r\n\r\n/** 域代码状态机状态 */\r\ntype FieldState = 'none' | 'instr' | 'cached'\r\n\r\n/**\r\n * 解析 <w:p> 元素为 ParagraphNode\r\n */\r\nexport function parseParagraph(\r\n paragraphEl: Element,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n numberingResolver: NumberingResolver,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n pageMargins?: PageMargins,\r\n defaultFontSize?: number\r\n): ParagraphNode {\r\n // 1. 解析段落属性 <w:pPr>\r\n const pPrEl = getFirstChildByTag(paragraphEl, NS.w, 'pPr')\r\n let paragraphStyle: ParagraphStyle = {}\r\n let baseRunStyle: RunStyle = {}\r\n\r\n // 从样式继承链解析\r\n let styleId: string | null = null\r\n if (pPrEl) {\r\n const pStyleEl = getFirstChildByTag(pPrEl, NS.w, 'pStyle')\r\n styleId = getWVal(pStyleEl)\r\n }\r\n\r\n if (styleId) {\r\n const resolved = styleResolver.resolveStyle(styleId)\r\n paragraphStyle = { ...resolved.paragraph }\r\n baseRunStyle = { ...resolved.run }\r\n }\r\n\r\n // 合并段落本地属性(本地属性覆盖继承样式)\r\n if (pPrEl) {\r\n const localParaStyle = styleResolver.parseParagraphProperties(pPrEl)\r\n mergeDefinedProps(paragraphStyle, localParaStyle)\r\n\r\n // 段落内 run 默认属性 <w:rPr>(应用于该段所有 run 的基准)\r\n const rPrEl = getFirstChildByTag(pPrEl, NS.w, 'rPr')\r\n if (rPrEl) {\r\n const localRunStyle = styleResolver.parseRunProperties(rPrEl)\r\n mergeDefinedProps(baseRunStyle, localRunStyle)\r\n }\r\n }\r\n\r\n // 兜底:通过 pStyle id 直接检测标题(样式链未能解析 titleLevel 时)\r\n if (!paragraphStyle.titleLevel && styleId) {\r\n const level = detectHeadingByStyleId(styleId)\r\n if (level !== undefined) {\r\n paragraphStyle.titleLevel = level\r\n }\r\n }\r\n\r\n // 2. 解析列表信息\r\n if (paragraphStyle.numId && paragraphStyle.numId !== '0') {\r\n const level = paragraphStyle.listLevel ?? 0\r\n const numInfo = numberingResolver.resolve(paragraphStyle.numId, level)\r\n if (numInfo) {\r\n paragraphStyle.listType = numInfo.listType\r\n paragraphStyle.listStyle = numInfo.listStyle\r\n paragraphStyle.listLevel = numInfo.level\r\n }\r\n }\r\n\r\n // 3. 遍历 <w:p> 子节点,收集 inline chunks\r\n const chunks: InlineChunk[] = []\r\n // 域代码状态机\r\n let fieldState: FieldState = 'none'\r\n\r\n forEachChild(paragraphEl, (child) => {\r\n const tag = child.localName\r\n const childNs = child.namespaceURI\r\n\r\n if (tag === 'pPr') {\r\n // 段落属性已处理\r\n } else if (tag === 'r' && childNs === NS.w) {\r\n // 处理域代码状态机\r\n if (processFieldChar(child, fieldState, (newState) => { fieldState = newState })) {\r\n return // 域代码控制 run,跳过正常 run 处理\r\n }\r\n // 在 cached 状态(fldChar separate ~ end 之间)输出缓存显示值\r\n if (fieldState === 'cached') {\r\n const cachedChunks = collectCachedFieldText(child, mergedStyle => {\r\n return { type: 'text' as const, value: mergedStyle, style: { ...baseRunStyle } }\r\n }, styleResolver, theme, baseRunStyle)\r\n chunks.push(...cachedChunks)\r\n return\r\n }\r\n processRunElement(child, chunks, rels, mediaMap, styleResolver, theme, baseRunStyle, pageMargins)\r\n } else if (tag === 'ins' && childNs === NS.w) {\r\n const rawRevId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? ''\r\n const revAuthor = child.getAttributeNS(NS.w, 'author') ?? child.getAttribute('w:author') ?? ''\r\n const revDate = child.getAttributeNS(NS.w, 'date') ?? child.getAttribute('w:date') ?? ''\r\n\r\n let revId = rawRevId || `rev_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`\r\n for (let ci = chunks.length - 1; ci >= 0; ci--) {\r\n const c = chunks[ci]\r\n if (c.type === 'text' && c.revision?.type === 'delete' && c.revision.author === revAuthor && c.revision.date === revDate) {\r\n if (c.revision.id !== revId) {\r\n revId = c.revision.id\r\n }\r\n break\r\n }\r\n if (c.type === 'text' && c.revision?.type === 'delete') continue\r\n if (c.type === 'text' && !c.revision) continue\r\n break\r\n }\r\n\r\n forEachChild(child, (insChild) => {\r\n if (insChild.localName === 'r' && insChild.namespaceURI === NS.w) {\r\n processRunElement(insChild, chunks, rels, mediaMap, styleResolver, theme, baseRunStyle, pageMargins, { id: revId, type: 'insert', author: revAuthor, date: revDate })\r\n }\r\n })\r\n } else if (tag === 'del' && childNs === NS.w) {\r\n const revId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? `rev_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`\r\n const revAuthor = child.getAttributeNS(NS.w, 'author') ?? child.getAttribute('w:author') ?? ''\r\n const revDate = child.getAttributeNS(NS.w, 'date') ?? child.getAttribute('w:date') ?? ''\r\n\r\n forEachChild(child, (delChild) => {\r\n if (delChild.localName === 'r' && delChild.namespaceURI === NS.w) {\r\n processRunElement(delChild, chunks, rels, mediaMap, styleResolver, theme, baseRunStyle, pageMargins, { id: revId, type: 'delete', author: revAuthor, date: revDate })\r\n }\r\n })\r\n } else if (tag === 'hyperlink' && childNs === NS.w) {\r\n const hlChunk = parseHyperlink(child, styleResolver, theme, baseRunStyle, rels)\r\n if (hlChunk) chunks.push(hlChunk)\r\n } else if (tag === 'AlternateContent' && childNs === NS.mc) {\r\n // <mc:AlternateContent> 直接出现在段落级别\r\n processAlternateContentElement(child, chunks, rels, mediaMap, styleResolver, theme, baseRunStyle, pageMargins)\r\n } else if (tag === 'oMath' && childNs === NS.m) {\r\n // 数学公式:提取文本降级\r\n const mathChunks = extractMathText(child, baseRunStyle)\r\n chunks.push(...mathChunks)\r\n } else if (tag === 'commentRangeStart' && childNs === NS.w) {\r\n const commentId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? ''\r\n if (commentId) chunks.push({ type: 'commentMarker', markType: 'start', commentId })\r\n } else if (tag === 'commentRangeEnd' && childNs === NS.w) {\r\n const commentId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? ''\r\n if (commentId) chunks.push({ type: 'commentMarker', markType: 'end', commentId })\r\n } else if (tag === 'bookmarkStart' || tag === 'bookmarkEnd') {\r\n // 书签:忽略\r\n }\r\n })\r\n\r\n // 空段落:插入占位符,字号明确继承(避免编辑器从上下文继承大字号标题行高)\r\n if (chunks.length === 0) {\r\n const placeholderSize = baseRunStyle.size ?? defaultFontSize ?? 12\r\n chunks.push({\r\n type: 'text',\r\n value: '\\u200B',\r\n style: { ...baseRunStyle, size: placeholderSize }\r\n })\r\n }\r\n\r\n return {\r\n type: 'paragraph',\r\n chunks,\r\n style: paragraphStyle\r\n }\r\n}\r\n\r\n// ---- 域代码状态机 ----\r\n\r\n/**\r\n * 处理 run 中的 <w:fldChar>,更新域代码状态机\r\n * 返回 true 表示该 run 是纯域代码控制 run(不应输出文字)\r\n */\r\nfunction processFieldChar(\r\n runEl: Element,\r\n currentState: FieldState,\r\n setState: (s: FieldState) => void\r\n): boolean {\r\n const fldChar = getFirstChildByTag(runEl, NS.w, 'fldChar')\r\n const instrText = getFirstChildByTag(runEl, NS.w, 'instrText')\r\n\r\n if (fldChar) {\r\n const fldCharType = fldChar.getAttributeNS(NS.w, 'fldCharType') ?? fldChar.getAttribute('w:fldCharType')\r\n if (fldCharType === 'begin') {\r\n setState('instr')\r\n return true\r\n } else if (fldCharType === 'separate') {\r\n setState('cached')\r\n return true\r\n } else if (fldCharType === 'end') {\r\n setState('none')\r\n return true\r\n }\r\n return true\r\n }\r\n\r\n if (instrText && currentState === 'instr') {\r\n return true // 忽略域代码指令文本\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * 从 cached 状态的 run 中提取显示文本\r\n */\r\nfunction collectCachedFieldText(\r\n runEl: Element,\r\n _createChunk: (text: string) => InlineChunk,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n baseRunStyle: RunStyle\r\n): InlineChunk[] {\r\n return parseRun(runEl, styleResolver, theme, baseRunStyle)\r\n}\r\n\r\n// ---- Run / Drawing 处理 ----\r\n\r\nfunction processRunElement(\r\n runEl: Element,\r\n chunks: InlineChunk[],\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n baseRunStyle: RunStyle,\r\n pageMargins?: PageMargins,\r\n revision?: { id: string; type: 'insert' | 'delete'; author: string; date: string }\r\n): void {\r\n // 优先检测 drawing,再检测 pict,最后作为普通文字 run 处理\r\n let drawingEl = getFirstChildByTag(runEl, NS.w, 'drawing')\r\n let pictEl = getFirstChildByTag(runEl, NS.w, 'pict')\r\n\r\n // 兼容 WPS:drawing / pict 可能封装在 mc:AlternateContent 内\r\n if (!drawingEl && !pictEl) {\r\n const mcEl = getFirstChildByTag(runEl, NS.mc, 'AlternateContent')\r\n if (mcEl) {\r\n const choiceEl = getFirstChildByTag(mcEl, NS.mc, 'Choice')\r\n if (choiceEl) drawingEl = getFirstChildByTag(choiceEl, NS.w, 'drawing')\r\n if (!drawingEl) {\r\n const fallbackEl = getFirstChildByTag(mcEl, NS.mc, 'Fallback')\r\n if (fallbackEl) pictEl = getFirstChildByTag(fallbackEl, NS.w, 'pict')\r\n }\r\n }\r\n }\r\n\r\n if (drawingEl) {\r\n if (!isChartDrawing(drawingEl)) {\r\n const imgChunk = parseImage(drawingEl, rels, mediaMap, pageMargins)\r\n if (imgChunk) {\r\n chunks.push(imgChunk)\r\n } else {\r\n // 非图片 drawing → 尝试提取文本框内容\r\n chunks.push(...extractTextBoxContent(drawingEl, styleResolver, theme, baseRunStyle))\r\n }\r\n }\r\n // 图表由 DocxParser 顶层统一处理,此处跳过\r\n } else if (pictEl) {\r\n const imgChunk = parsePictureImage(pictEl, rels, mediaMap)\r\n if (imgChunk) {\r\n chunks.push(imgChunk)\r\n } else {\r\n chunks.push(...extractTextBoxContent(pictEl, styleResolver, theme, baseRunStyle))\r\n }\r\n } else {\r\n // 普通文字 run\r\n const runChunks = parseRun(runEl, styleResolver, theme, baseRunStyle)\r\n if (revision) {\r\n\r\n for (const chunk of runChunks) {\r\n if (chunk.type === 'text') {\r\n chunk.revision = revision\r\n }\r\n }\r\n }\r\n chunks.push(...runChunks)\r\n }\r\n}\r\n\r\n/**\r\n * 处理段落级别的 <mc:AlternateContent>\r\n * WPS 将一些特殊内容封装在 mc:AlternateContent 中\r\n */\r\nfunction processAlternateContentElement(\r\n mcEl: Element,\r\n chunks: InlineChunk[],\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n baseRunStyle: RunStyle,\r\n pageMargins?: PageMargins\r\n): void {\r\n const choiceEl = getFirstChildByTag(mcEl, NS.mc, 'Choice')\r\n if (choiceEl) {\r\n let handled = false\r\n forEachChild(choiceEl, (child) => {\r\n if (child.localName === 'r' && child.namespaceURI === NS.w) {\r\n processRunElement(child, chunks, rels, mediaMap, styleResolver, theme, baseRunStyle, pageMargins)\r\n handled = true\r\n } else if (child.localName === 'drawing' && child.namespaceURI === NS.w) {\r\n if (!isChartDrawing(child)) {\r\n const imgChunk = parseImage(child, rels, mediaMap, pageMargins)\r\n if (imgChunk) {\r\n chunks.push(imgChunk)\r\n } else {\r\n chunks.push(...extractTextBoxContent(child, styleResolver, theme, baseRunStyle))\r\n }\r\n }\r\n handled = true\r\n }\r\n })\r\n if (handled) return\r\n }\r\n\r\n // 回退到 Fallback 内容\r\n const fallbackEl = getFirstChildByTag(mcEl, NS.mc, 'Fallback')\r\n if (fallbackEl) {\r\n forEachChild(fallbackEl, (child) => {\r\n if (child.localName === 'r' && child.namespaceURI === NS.w) {\r\n processRunElement(child, chunks, rels, mediaMap, styleResolver, theme, baseRunStyle, pageMargins)\r\n } else if (child.localName === 'pict' && child.namespaceURI === NS.w) {\r\n const imgChunk = parsePictureImage(child, rels, mediaMap)\r\n if (imgChunk) {\r\n chunks.push(imgChunk)\r\n } else {\r\n chunks.push(...extractTextBoxContent(child, styleResolver, theme, baseRunStyle))\r\n }\r\n }\r\n })\r\n }\r\n}\r\n\r\n// ---- 文本框内容提取 ----\r\n\r\n/**\r\n * 提取 <wps:txbx> 或 <v:textbox> 内的 <w:txbxContent> 文本\r\n * 段落间插入换行符,作为 inline chunks 返回\r\n */\r\nfunction extractTextBoxContent(\r\n containerEl: Element,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n baseRunStyle: RunStyle\r\n): InlineChunk[] {\r\n const txbxContents = containerEl.getElementsByTagNameNS(NS.w, 'txbxContent')\r\n if (txbxContents.length === 0) return []\r\n\r\n const chunks: InlineChunk[] = []\r\n const txbxContent = txbxContents[0]\r\n let isFirstParagraph = true\r\n\r\n forEachChild(txbxContent, (child) => {\r\n if (child.localName === 'p' && child.namespaceURI === NS.w) {\r\n if (!isFirstParagraph) {\r\n chunks.push({ type: 'break', breakType: 'line' })\r\n }\r\n isFirstParagraph = false\r\n\r\n forEachChild(child, (pChild) => {\r\n if (pChild.localName === 'r' && pChild.namespaceURI === NS.w) {\r\n chunks.push(...parseRun(pChild, styleResolver, theme, baseRunStyle))\r\n }\r\n })\r\n }\r\n })\r\n\r\n return chunks\r\n}\r\n\r\n// ---- VML 图片解析 ----\r\n\r\n/**\r\n * 从 <w:pict> 中解析 <v:imagedata> 图片\r\n */\r\nfunction parsePictureImage(\r\n pictEl: Element,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>\r\n): ImageChunk | null {\r\n const NS_VML = 'urn:schemas-microsoft-com:vml'\r\n const imageDataList = pictEl.getElementsByTagNameNS(NS_VML, 'imagedata')\r\n if (imageDataList.length === 0) return null\r\n\r\n const imageData = imageDataList[0]\r\n const rId = imageData.getAttributeNS(NS.r, 'id')\r\n ?? imageData.getAttribute('r:id')\r\n ?? imageData.getAttributeNS(NS.r, 'href')\r\n ?? ''\r\n if (!rId) return null\r\n\r\n const rel = rels.get(rId)\r\n if (!rel) return null\r\n\r\n const target = rel.target.replace(/^\\.\\.\\//, '')\r\n const mediaPath = target.startsWith('word/') ? target : `word/${target}`\r\n const src = mediaMap[mediaPath] ?? mediaMap[target]\r\n if (!src) return null\r\n\r\n // 从 <v:shape> 的 style 属性解析尺寸\r\n const shapeEls = pictEl.getElementsByTagNameNS(NS_VML, 'shape')\r\n let width = 100\r\n let height = 100\r\n if (shapeEls.length > 0) {\r\n const styleStr = shapeEls[0].getAttribute('style') ?? ''\r\n const widthMatch = styleStr.match(/width:\\s*([\\d.]+)pt/)\r\n const heightMatch = styleStr.match(/height:\\s*([\\d.]+)pt/)\r\n // pt → px(96dpi)\r\n if (widthMatch) width = parseFloat(widthMatch[1]) * (96 / 72)\r\n if (heightMatch) height = parseFloat(heightMatch[1]) * (96 / 72)\r\n }\r\n\r\n return { type: 'image', src, width: Math.round(width), height: Math.round(height) }\r\n}\r\n\r\n// ---- 数学公式降级处理 ----\r\n\r\n/**\r\n * 从 <m:oMath> 提取纯文本作为近似表示\r\n * 无法提取时输出 \"[公式]\" 占位\r\n */\r\nfunction extractMathText(oMathEl: Element, baseRunStyle: RunStyle): InlineChunk[] {\r\n const mathTextEls = oMathEl.getElementsByTagNameNS(NS.m, 't')\r\n const parts: string[] = []\r\n for (let i = 0; i < mathTextEls.length; i++) {\r\n const text = mathTextEls[i].textContent ?? ''\r\n if (text.trim()) parts.push(text)\r\n }\r\n\r\n const displayText = parts.length > 0 ? parts.join('') : '[公式]'\r\n return [{\r\n type: 'text',\r\n value: displayText,\r\n style: { ...baseRunStyle, italic: true }\r\n }]\r\n}\r\n\r\n// ---- 标题检测 ----\r\n\r\nfunction detectHeadingByStyleId(styleId: string): number | undefined {\r\n const m1 = styleId.match(/^heading\\s*(\\d+)$/i)\r\n if (m1) {\r\n const level = parseInt(m1[1], 10)\r\n if (level >= 1 && level <= 6) return level\r\n }\r\n const m2 = styleId.match(/^标题\\s*(\\d+)$/)\r\n if (m2) {\r\n const level = parseInt(m2[1], 10)\r\n if (level >= 1 && level <= 6) return level\r\n }\r\n return undefined\r\n}\r\n\r\n// ---- 工具函数 ----\r\n\r\n/**\r\n * 将 source 中非 undefined 的属性合并到 target\r\n */\r\nfunction mergeDefinedProps<T extends object>(target: T, source: Partial<T>): void {\r\n for (const key of Object.keys(source) as Array<keyof T>) {\r\n if (source[key] !== undefined) {\r\n target[key] = source[key]!\r\n }\r\n }\r\n}\r\n","import { NS, twipToPx, BORDER_TYPE_MAP, eighthPtToPx } from '../../constants'\r\nimport type {\r\n TableNode, TableRowNode, TableCellNode, ParagraphNode\r\n} from '../../types'\r\nimport { StyleResolver, resolveShdFill } from '../style.resolver'\r\nimport { ThemeData, resolveThemeColor } from '../theme.resolver'\r\nimport { NumberingResolver } from '../numbering.resolver'\r\nimport { RelationshipEntry } from '../relationship.resolver'\r\nimport { parseParagraph } from './paragraph.parser'\r\nimport type { PageMargins } from './image.parser'\r\nimport {\r\n getFirstChildByTag, getWVal, getChildrenByTag, forEachChild\r\n} from '../xml.helper'\r\n\r\n/**\r\n * 解析 <w:tbl> 元素为 TableNode\r\n * 支持嵌套表格、合并单元格(colspan / rowspan)、单元格边框\r\n */\r\nexport function parseTable(\r\n tableEl: Element,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n numberingResolver: NumberingResolver,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n pageMargins?: PageMargins\r\n): TableNode {\r\n // 1. 列宽 <w:tblGrid>\r\n const colWidths = parseTableGrid(tableEl)\r\n\r\n // 2. 表格属性 <w:tblPr>\r\n const { borderType, borderColor, borderWidth } = parseTableBorders(tableEl, theme)\r\n\r\n // 3. 行解析 <w:tr>\r\n const trElements = getChildrenByTag(tableEl, NS.w, 'tr')\r\n const rawRows: RawRow[] = []\r\n\r\n for (const trEl of trElements) {\r\n rawRows.push(\r\n parseTableRow(trEl, styleResolver, theme, numberingResolver, rels, mediaMap, pageMargins)\r\n )\r\n }\r\n\r\n // 4. vMerge 处理:计算 rowspan 并移除被合并单元格\r\n const rows = resolveVerticalMerge(rawRows)\r\n\r\n return { type: 'table', rows, colWidths, borderType, borderColor, borderWidth }\r\n}\r\n\r\n// ---- 表格级属性解析 ----\r\n\r\nfunction parseTableGrid(tableEl: Element): number[] {\r\n const colWidths: number[] = []\r\n const tblGridEl = getFirstChildByTag(tableEl, NS.w, 'tblGrid')\r\n if (!tblGridEl) return colWidths\r\n\r\n for (const colEl of getChildrenByTag(tblGridEl, NS.w, 'gridCol')) {\r\n const w = colEl.getAttributeNS(NS.w, 'w') ?? colEl.getAttribute('w:w')\r\n colWidths.push(w ? twipToPx(parseInt(w, 10)) : 100)\r\n }\r\n return colWidths\r\n}\r\n\r\nfunction parseTableBorders(\r\n tableEl: Element,\r\n theme: ThemeData\r\n): { borderType?: string; borderColor?: string; borderWidth?: number } {\r\n const tblPrEl = getFirstChildByTag(tableEl, NS.w, 'tblPr')\r\n if (!tblPrEl) return {}\r\n\r\n const tblBordersEl = getFirstChildByTag(tblPrEl, NS.w, 'tblBorders')\r\n if (!tblBordersEl) return {}\r\n\r\n // 取上边框作为全局边框的代表(四边通常一致)\r\n const topBorderEl = getFirstChildByTag(tblBordersEl, NS.w, 'top')\r\n if (!topBorderEl) return {}\r\n\r\n const val = getWVal(topBorderEl)\r\n const borderType = val === 'none' || val === 'nil' ? 'EMPTY' : 'ALL'\r\n\r\n // 颜色:优先 themeColor\r\n const themeColor = topBorderEl.getAttributeNS(NS.w, 'themeColor') ?? topBorderEl.getAttribute('w:themeColor')\r\n let borderColor: string | undefined\r\n if (themeColor) {\r\n const resolved = resolveThemeColor(theme, themeColor)\r\n if (resolved) borderColor = resolved\r\n } else {\r\n const color = topBorderEl.getAttributeNS(NS.w, 'color') ?? topBorderEl.getAttribute('w:color')\r\n if (color && color !== 'auto') borderColor = `#${color}`\r\n }\r\n\r\n // 宽度:sz 单位为 1/8 磅\r\n const sz = topBorderEl.getAttributeNS(NS.w, 'sz') ?? topBorderEl.getAttribute('w:sz')\r\n const borderWidth = sz ? eighthPtToPx(parseInt(sz, 10)) : undefined\r\n\r\n return { borderType, borderColor, borderWidth }\r\n}\r\n\r\n// ---- 行解析 ----\r\n\r\ninterface RawRow {\r\n height?: number\r\n cells: RawCell[]\r\n}\r\n\r\ninterface RawCell {\r\n paragraphs: ParagraphNode[]\r\n colspan: number\r\n vMerge: 'restart' | 'continue' | null\r\n backgroundColor?: string\r\n verticalAlign?: string\r\n borderTypes?: number[]\r\n borderColor?: string\r\n width?: number\r\n}\r\n\r\nfunction parseTableRow(\r\n rowEl: Element,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n numberingResolver: NumberingResolver,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n pageMargins?: PageMargins\r\n): RawRow {\r\n let height: number | undefined\r\n const trPrEl = getFirstChildByTag(rowEl, NS.w, 'trPr')\r\n if (trPrEl) {\r\n const trHeightEl = getFirstChildByTag(trPrEl, NS.w, 'trHeight')\r\n if (trHeightEl) {\r\n const val = trHeightEl.getAttributeNS(NS.w, 'val') ?? trHeightEl.getAttribute('w:val')\r\n const hRule = trHeightEl.getAttributeNS(NS.w, 'hRule') ?? trHeightEl.getAttribute('w:hRule')\r\n if (val) {\r\n const px = twipToPx(parseInt(val, 10))\r\n if (hRule === 'exact') {\r\n height = px\r\n } else {\r\n // atLeast / auto:限制上限防止极端值\r\n height = Math.min(px, 200)\r\n }\r\n }\r\n }\r\n }\r\n\r\n const cells: RawCell[] = []\r\n for (const tcEl of getChildrenByTag(rowEl, NS.w, 'tc')) {\r\n cells.push(parseTableCell(tcEl, styleResolver, theme, numberingResolver, rels, mediaMap, pageMargins))\r\n }\r\n\r\n return { height, cells }\r\n}\r\n\r\nfunction parseTableCell(\r\n cellEl: Element,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n numberingResolver: NumberingResolver,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n pageMargins?: PageMargins\r\n): RawCell {\r\n const tcPrEl = getFirstChildByTag(cellEl, NS.w, 'tcPr')\r\n\r\n // colspan <w:gridSpan>\r\n let colspan = 1\r\n if (tcPrEl) {\r\n const gridSpanEl = getFirstChildByTag(tcPrEl, NS.w, 'gridSpan')\r\n if (gridSpanEl) {\r\n const val = getWVal(gridSpanEl)\r\n if (val) colspan = parseInt(val, 10)\r\n }\r\n }\r\n\r\n // vMerge\r\n let vMerge: 'restart' | 'continue' | null = null\r\n if (tcPrEl) {\r\n const vMergeEl = getFirstChildByTag(tcPrEl, NS.w, 'vMerge')\r\n if (vMergeEl) {\r\n const val = getWVal(vMergeEl)\r\n vMerge = val === 'restart' ? 'restart' : 'continue'\r\n }\r\n }\r\n\r\n // 背景色\r\n let backgroundColor: string | undefined\r\n if (tcPrEl) {\r\n const shdEl = getFirstChildByTag(tcPrEl, NS.w, 'shd')\r\n if (shdEl) {\r\n backgroundColor = resolveShdFill(shdEl, theme) ?? undefined\r\n }\r\n }\r\n\r\n // 垂直对齐\r\n let verticalAlign: string | undefined\r\n if (tcPrEl) {\r\n const vAlignEl = getFirstChildByTag(tcPrEl, NS.w, 'vAlign')\r\n if (vAlignEl) verticalAlign = getWVal(vAlignEl) ?? undefined\r\n }\r\n\r\n // 单元格宽度\r\n let width: number | undefined\r\n if (tcPrEl) {\r\n const tcWEl = getFirstChildByTag(tcPrEl, NS.w, 'tcW')\r\n if (tcWEl) {\r\n const w = tcWEl.getAttributeNS(NS.w, 'w') ?? tcWEl.getAttribute('w:w')\r\n const wType = tcWEl.getAttributeNS(NS.w, 'type') ?? tcWEl.getAttribute('w:type')\r\n if (w && wType === 'dxa') {\r\n width = twipToPx(parseInt(w, 10))\r\n }\r\n }\r\n }\r\n\r\n // 单元格边框(上右下左)\r\n const borderTypes = parseCellBorders(tcPrEl)\r\n\r\n // 解析单元格内容:段落 + 嵌套表格\r\n const paragraphs: ParagraphNode[] = []\r\n parseCellContent(cellEl, paragraphs, styleResolver, theme, numberingResolver, rels, mediaMap, pageMargins)\r\n\r\n return { paragraphs, colspan, vMerge, backgroundColor, verticalAlign, borderTypes, width }\r\n}\r\n\r\n/**\r\n * 解析单元格边框,返回 [top, right, bottom, left] 的 BORDER_TYPE_MAP 值\r\n * -1 表示未声明(继承表格边框)\r\n */\r\nfunction parseCellBorders(tcPrEl: Element | null): number[] | undefined {\r\n if (!tcPrEl) return undefined\r\n\r\n const tcBordersEl = getFirstChildByTag(tcPrEl, NS.w, 'tcBorders')\r\n if (!tcBordersEl) return undefined\r\n\r\n const sides = ['top', 'right', 'bottom', 'left'] as const\r\n const types: number[] = []\r\n let hasAnyBorder = false\r\n\r\n for (const side of sides) {\r\n const borderEl = getFirstChildByTag(tcBordersEl, NS.w, side)\r\n if (borderEl) {\r\n const val = getWVal(borderEl) ?? 'single'\r\n types.push(BORDER_TYPE_MAP[val] ?? 1)\r\n hasAnyBorder = true\r\n } else {\r\n types.push(-1) // -1 = 继承表格边框\r\n }\r\n }\r\n\r\n return hasAnyBorder ? types : undefined\r\n}\r\n\r\n/**\r\n * 解析单元格内容:段落和嵌套表格均支持\r\n */\r\nfunction parseCellContent(\r\n cellEl: Element,\r\n paragraphs: ParagraphNode[],\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n numberingResolver: NumberingResolver,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n pageMargins?: PageMargins\r\n): void {\r\n forEachChild(cellEl, (child) => {\r\n if (child.localName === 'p' && child.namespaceURI === NS.w) {\r\n paragraphs.push(\r\n parseParagraph(child, styleResolver, theme, numberingResolver, rels, mediaMap, pageMargins)\r\n )\r\n } else if (child.localName === 'tbl' && child.namespaceURI === NS.w) {\r\n // 嵌套表格:转换为带 table chunk 的特殊段落节点\r\n const nestedTable = parseTable(child, styleResolver, theme, numberingResolver, rels, mediaMap, pageMargins)\r\n // 将嵌套表格包装成 ParagraphNode 占位(element.builder 中会识别并处理)\r\n paragraphs.push({\r\n type: 'paragraph',\r\n chunks: [{ type: 'nestedTable', table: nestedTable } as any],\r\n style: {}\r\n })\r\n } else if (child.localName === 'sdt' && child.namespaceURI === NS.w) {\r\n // 结构化文档标签:提取内容\r\n const sdtContentEl = getFirstChildByTag(child, NS.w, 'sdtContent')\r\n if (sdtContentEl) {\r\n forEachChild(sdtContentEl, (sdtChild) => {\r\n if (sdtChild.localName === 'p' && sdtChild.namespaceURI === NS.w) {\r\n paragraphs.push(\r\n parseParagraph(sdtChild, styleResolver, theme, numberingResolver, rels, mediaMap, pageMargins)\r\n )\r\n }\r\n })\r\n }\r\n }\r\n })\r\n}\r\n\r\n// ---- vMerge 处理 ----\r\n\r\nfunction resolveVerticalMerge(rawRows: RawRow[]): TableRowNode[] {\r\n const rows: TableRowNode[] = []\r\n // 跟踪每列位置的合并起始位置:colIndex → { rowIdx, cellIdx }\r\n const mergeTracker = new Map<number, { rowIdx: number; cellIdx: number }>()\r\n\r\n for (let rowIdx = 0; rowIdx < rawRows.length; rowIdx++) {\r\n const rawRow = rawRows[rowIdx]\r\n const cells: TableCellNode[] = []\r\n let colIndex = 0\r\n\r\n for (const rawCell of rawRow.cells) {\r\n if (rawCell.vMerge === 'restart') {\r\n mergeTracker.set(colIndex, { rowIdx: rows.length, cellIdx: cells.length })\r\n cells.push(buildCellNode(rawCell, 1))\r\n } else if (rawCell.vMerge === 'continue') {\r\n // 增加起始单元格的 rowspan\r\n const tracker = mergeTracker.get(colIndex)\r\n if (tracker) {\r\n rows[tracker.rowIdx].cells[tracker.cellIdx].rowspan++\r\n }\r\n // 被合并的单元格不放入 cells\r\n } else {\r\n mergeTracker.delete(colIndex)\r\n cells.push(buildCellNode(rawCell, 1))\r\n }\r\n colIndex += rawCell.colspan\r\n }\r\n\r\n rows.push({ height: rawRow.height, cells })\r\n }\r\n\r\n return rows\r\n}\r\n\r\nfunction buildCellNode(raw: RawCell, rowspan: number): TableCellNode {\r\n return {\r\n paragraphs: raw.paragraphs,\r\n colspan: raw.colspan,\r\n rowspan,\r\n backgroundColor: raw.backgroundColor,\r\n verticalAlign: raw.verticalAlign,\r\n borderTypes: raw.borderTypes,\r\n width: raw.width\r\n }\r\n}\r\n","import { NS } from '../../constants'\r\nimport type { ParagraphNode } from '../../types'\r\nimport { StyleResolver } from '../style.resolver'\r\nimport { ThemeData } from '../theme.resolver'\r\nimport { NumberingResolver } from '../numbering.resolver'\r\nimport { RelationshipEntry } from '../relationship.resolver'\r\nimport { parseParagraph } from './paragraph.parser'\r\nimport {\r\n getFirstChildByTag, forEachChild, getWVal\r\n} from '../xml.helper'\r\n\r\n/**\r\n * 检测元素是否为 TOC(目录)结构化文档标签\r\n */\r\nexport function isTocSdt(sdtEl: Element): boolean {\r\n const sdtPr = getFirstChildByTag(sdtEl, NS.w, 'sdtPr')\r\n if (!sdtPr) return false\r\n\r\n // 方式1: docPartGallery 包含 \"Table of Contents\"(不区分大小写)\r\n const docPartObj = getFirstChildByTag(sdtPr, NS.w, 'docPartObj')\r\n if (docPartObj) {\r\n const gallery = getFirstChildByTag(docPartObj, NS.w, 'docPartGallery')\r\n const val = getWVal(gallery)\r\n if (val && val.toLowerCase().includes('table of contents')) return true\r\n }\r\n\r\n // 方式2: alias 包含目录关键词\r\n const alias = getFirstChildByTag(sdtPr, NS.w, 'alias')\r\n const aliasVal = getWVal(alias)\r\n if (aliasVal) {\r\n const lower = aliasVal.toLowerCase()\r\n if (lower.includes('目录') || lower.includes('toc') || lower.includes('table of contents')) return true\r\n }\r\n\r\n // 方式3: tag 包含目录关键词\r\n const tag = getFirstChildByTag(sdtPr, NS.w, 'tag')\r\n const tagVal = getWVal(tag)\r\n if (tagVal) {\r\n const lower = tagVal.toLowerCase()\r\n if (lower.includes('目录') || lower.includes('toc')) return true\r\n }\r\n\r\n // 方式4: 检查内容中是否有 TOC 域代码\r\n const sdtContent = getFirstChildByTag(sdtEl, NS.w, 'sdtContent')\r\n if (sdtContent) {\r\n const instrTexts = sdtContent.getElementsByTagNameNS(NS.w, 'instrText')\r\n for (let i = 0; i < instrTexts.length; i++) {\r\n const text = instrTexts[i].textContent || ''\r\n if (text.trim().startsWith('TOC')) return true\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * 解析 TOC SDT 为段落列表(当作普通段落处理)\r\n */\r\nexport function parseTocContent(\r\n sdtEl: Element,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n numberingResolver: NumberingResolver,\r\n rels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>\r\n): ParagraphNode[] {\r\n const result: ParagraphNode[] = []\r\n\r\n const sdtContent = getFirstChildByTag(sdtEl, NS.w, 'sdtContent')\r\n if (!sdtContent) return result\r\n\r\n forEachChild(sdtContent, (child) => {\r\n if (child.localName === 'p' && child.namespaceURI === NS.w) {\r\n result.push(\r\n parseParagraph(child, styleResolver, theme, numberingResolver, rels, mediaMap)\r\n )\r\n }\r\n })\r\n\r\n return result\r\n}\r\n","import { NS, twipToPx } from '../../constants'\r\nimport type { ParagraphNode, ColumnNode } from '../../types'\r\nimport { getFirstChildByTag, getChildrenByTag } from '../xml.helper'\r\n\r\n/** 分节类型:nextPage / evenPage / oddPage 均产生分页,continuous / nextColumn 不分页 */\r\nexport type SectionBreakType = 'nextPage' | 'evenPage' | 'oddPage' | 'continuous' | 'nextColumn'\r\n\r\nexport interface SectionProperties {\r\n /** 分节类型,默认 nextPage */\r\n breakType: SectionBreakType\r\n columns: number\r\n colWidths: number[]\r\n colSpace: number\r\n separator: boolean\r\n}\r\n\r\n/**\r\n * 解析 <w:sectPr> 中的分节属性(分页类型 + 分栏)\r\n */\r\nexport function parseSectionProperties(sectPrEl: Element): SectionProperties {\r\n const result: SectionProperties = {\r\n breakType: 'nextPage',\r\n columns: 1,\r\n colWidths: [],\r\n colSpace: 0,\r\n separator: false\r\n }\r\n\r\n // 分节类型 <w:type w:val=\"continuous\"/>\r\n const typeEl = getFirstChildByTag(sectPrEl, NS.w, 'type')\r\n if (typeEl) {\r\n const typeVal = typeEl.getAttributeNS(NS.w, 'val') ?? typeEl.getAttribute('w:val')\r\n if (typeVal === 'continuous' || typeVal === 'nextColumn' ||\r\n typeVal === 'evenPage' || typeVal === 'oddPage' || typeVal === 'nextPage') {\r\n result.breakType = typeVal\r\n }\r\n }\r\n\r\n const colsEl = getFirstChildByTag(sectPrEl, NS.w, 'cols')\r\n if (!colsEl) return result\r\n\r\n const numAttr = colsEl.getAttributeNS(NS.w, 'num') ?? colsEl.getAttribute('w:num')\r\n const spaceAttr = colsEl.getAttributeNS(NS.w, 'space') ?? colsEl.getAttribute('w:space')\r\n const sepAttr = colsEl.getAttributeNS(NS.w, 'sep') ?? colsEl.getAttribute('w:sep')\r\n\r\n if (numAttr) result.columns = Math.max(1, parseInt(numAttr, 10))\r\n if (spaceAttr) result.colSpace = twipToPx(parseInt(spaceAttr, 10))\r\n // sep=\"1\" 表示分栏之间显示分隔线\r\n result.separator = sepAttr === '1' || sepAttr === 'true'\r\n\r\n // 各列独立宽度 <w:col w:w=\"...\" w:space=\"...\"/>\r\n for (const colEl of getChildrenByTag(colsEl, NS.w, 'col')) {\r\n const w = colEl.getAttributeNS(NS.w, 'w') ?? colEl.getAttribute('w:w')\r\n if (w) result.colWidths.push(twipToPx(parseInt(w, 10)))\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * 将段落列表按分栏属性分组,构建 ColumnNode\r\n * ColumnNode 是编辑器原生分栏格式(推荐)\r\n */\r\nexport function buildColumnNode(\r\n paragraphs: ParagraphNode[],\r\n sectionProps: SectionProperties,\r\n targetInnerWidth: number\r\n): ColumnNode {\r\n const { columns, colWidths, colSpace, separator } = sectionProps\r\n\r\n // 计算每列宽度\r\n const calculatedColWidths = calculateColumnWidths(columns, colWidths, colSpace, targetInnerWidth)\r\n\r\n // 按 column break 将段落分组到各列\r\n const columnGroups = groupParagraphsByColumnBreak(paragraphs, columns)\r\n\r\n return {\r\n type: 'column',\r\n columns,\r\n colWidths: calculatedColWidths,\r\n colSpace,\r\n separator,\r\n groups: columnGroups\r\n }\r\n}\r\n\r\n// ---- 工具函数 ----\r\n\r\n/**\r\n * 计算各列实际宽度\r\n * 优先使用文档中声明的列宽;不足时等分 targetInnerWidth\r\n */\r\nfunction calculateColumnWidths(\r\n columns: number,\r\n declaredWidths: number[],\r\n colSpace: number,\r\n targetInnerWidth: number\r\n): number[] {\r\n if (declaredWidths.length >= columns) {\r\n return declaredWidths.slice(0, columns)\r\n }\r\n\r\n // 等分:减去列间距\r\n const totalGap = colSpace * Math.max(0, columns - 1)\r\n const colWidth = (targetInnerWidth - totalGap) / columns\r\n\r\n return Array.from({ length: columns }, () => Math.max(colWidth, 50))\r\n}\r\n\r\n/**\r\n * 按 column break chunk 将段落切分到各列数组\r\n * column break 所在段落:break 前内容留在当前列,break 后(若有)开启下一列\r\n */\r\nfunction groupParagraphsByColumnBreak(\r\n paragraphs: ParagraphNode[],\r\n columns: number\r\n): ParagraphNode[][] {\r\n const groups: ParagraphNode[][] = [[]]\r\n\r\n for (const para of paragraphs) {\r\n const hasColumnBreak = para.chunks.some(\r\n (c) => c.type === 'break' && c.breakType === 'column'\r\n )\r\n\r\n if (hasColumnBreak && groups.length < columns) {\r\n // 过滤掉 column break chunk 后,将段落内容放到新列开头\r\n const chunksWithoutBreak = para.chunks.filter(\r\n (c) => !(c.type === 'break' && c.breakType === 'column')\r\n )\r\n // 有实质内容才放入新列\r\n if (chunksWithoutBreak.length > 0) {\r\n groups.push([{ ...para, chunks: chunksWithoutBreak }])\r\n } else {\r\n groups.push([])\r\n }\r\n } else {\r\n groups[groups.length - 1].push(para)\r\n }\r\n }\r\n\r\n return groups\r\n}\r\n","/**\r\n * OOXML Chart XML 解析器\r\n * 从 word/charts/chartN.xml 中提取图表类型和数据,转换为 ECharts option\r\n */\r\nimport { NS } from '../../constants'\r\nimport { parseXml } from '../xml.helper'\r\n\r\ninterface ChartSeriesData {\r\n name: string\r\n values: number[]\r\n}\r\n\r\ninterface OoxmlChartData {\r\n type: string // bar, line, pie, area, scatter, radar, doughnut\r\n title: string\r\n categories: string[]\r\n series: ChartSeriesData[]\r\n}\r\n\r\n// c:chartSpace 命名空间(与 c:chart 引用命名空间不同)\r\nconst NS_CHART = 'http://schemas.openxmlformats.org/drawingml/2006/chart'\r\nconst NS_A = NS.a\r\n\r\n/**\r\n * 解析 OOXML chart XML,返回 ECharts option\r\n */\r\nexport function parseOoxmlChartToOption(chartXml: string): any | null {\r\n try {\r\n const data = extractChartData(chartXml)\r\n if (!data || data.series.length === 0) {\r\n return null\r\n }\r\n return buildEChartsOption(data)\r\n } catch (e) {\r\n console.error('[ooxmlChartParser] parse error:', e)\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * 从 chart XML 提取图表数据\r\n */\r\nfunction extractChartData(chartXml: string): OoxmlChartData | null {\r\n const doc = parseXml(chartXml)\r\n const root = doc.documentElement // c:chartSpace\r\n\r\n // 查找 c:chart\r\n const chartEls = root.getElementsByTagNameNS(NS_CHART, 'chart')\r\n if (chartEls.length === 0) return null\r\n const chartEl = chartEls[0]\r\n\r\n // 提取标题\r\n const title = extractTitle(chartEl)\r\n\r\n // 查找 c:plotArea\r\n const plotAreaEls = chartEl.getElementsByTagNameNS(NS_CHART, 'plotArea')\r\n if (plotAreaEls.length === 0) return null\r\n const plotArea = plotAreaEls[0]\r\n\r\n // 检测图表类型并提取数据\r\n const chartTypeMap: Record<string, string> = {\r\n 'barChart': 'bar',\r\n 'bar3DChart': 'bar',\r\n 'lineChart': 'line',\r\n 'line3DChart': 'line',\r\n 'pieChart': 'pie',\r\n 'pie3DChart': 'pie',\r\n 'areaChart': 'area',\r\n 'area3DChart': 'area',\r\n 'scatterChart': 'scatter',\r\n 'radarChart': 'radar',\r\n 'doughnutChart': 'doughnut',\r\n 'ofPieChart': 'pie'\r\n }\r\n\r\n for (const [xmlTag, chartType] of Object.entries(chartTypeMap)) {\r\n const chartTypeEls = plotArea.getElementsByTagNameNS(NS_CHART, xmlTag)\r\n if (chartTypeEls.length > 0) {\r\n const seriesData = extractSeriesFromChartType(chartTypeEls[0])\r\n if (seriesData.series.length > 0) {\r\n return {\r\n type: chartType,\r\n title,\r\n categories: seriesData.categories,\r\n series: seriesData.series\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\n/**\r\n * 提取图表标题\r\n */\r\nfunction extractTitle(chartEl: Element): string {\r\n const titleEls = chartEl.getElementsByTagNameNS(NS_CHART, 'title')\r\n if (titleEls.length === 0) return ''\r\n\r\n // 尝试从 c:tx -> c:rich -> a:p -> a:r -> a:t 获取\r\n const tEls = titleEls[0].getElementsByTagNameNS(NS_A, 't')\r\n if (tEls.length > 0) {\r\n return Array.from(tEls).map(t => t.textContent || '').join('')\r\n }\r\n\r\n // 尝试从 c:tx -> c:strRef -> c:strCache -> c:pt -> c:v 获取\r\n const vEls = titleEls[0].getElementsByTagNameNS(NS_CHART, 'v')\r\n if (vEls.length > 0) {\r\n return vEls[0].textContent || ''\r\n }\r\n\r\n return ''\r\n}\r\n\r\n/**\r\n * 从图表类型元素(如 c:barChart)中提取系列数据\r\n */\r\nfunction extractSeriesFromChartType(chartTypeEl: Element): { categories: string[], series: ChartSeriesData[] } {\r\n const serEls = chartTypeEl.getElementsByTagNameNS(NS_CHART, 'ser')\r\n const series: ChartSeriesData[] = []\r\n let categories: string[] = []\r\n\r\n for (let i = 0; i < serEls.length; i++) {\r\n const serEl = serEls[i]\r\n\r\n // 提取系列名称\r\n const name = extractSeriesName(serEl) || `系列${i + 1}`\r\n\r\n // 提取分类(只需从第一个系列取一次)\r\n if (categories.length === 0) {\r\n categories = extractCategories(serEl)\r\n }\r\n\r\n // 提取数值\r\n const values = extractValues(serEl)\r\n\r\n if (values.length > 0) {\r\n series.push({ name, values })\r\n }\r\n }\r\n\r\n // 如果没有明确的分类,生成默认分类\r\n if (categories.length === 0 && series.length > 0) {\r\n const maxLen = Math.max(...series.map(s => s.values.length))\r\n categories = Array.from({ length: maxLen }, (_, i) => `${i + 1}`)\r\n }\r\n\r\n return { categories, series }\r\n}\r\n\r\n/**\r\n * 提取系列名称 c:tx\r\n */\r\nfunction extractSeriesName(serEl: Element): string {\r\n const txEls = getDirectChildren(serEl, NS_CHART, 'tx')\r\n if (txEls.length === 0) return ''\r\n\r\n // c:strRef -> c:strCache -> c:pt -> c:v\r\n const cacheVals = extractCacheValues(txEls[0], 'strCache')\r\n if (cacheVals.length > 0) return cacheVals[0]\r\n\r\n // 直接 c:v\r\n const vEls = txEls[0].getElementsByTagNameNS(NS_CHART, 'v')\r\n if (vEls.length > 0) return vEls[0].textContent || ''\r\n\r\n return ''\r\n}\r\n\r\n/**\r\n * 提取分类数据 c:cat\r\n */\r\nfunction extractCategories(serEl: Element): string[] {\r\n const catEls = getDirectChildren(serEl, NS_CHART, 'cat')\r\n if (catEls.length === 0) return []\r\n\r\n // 优先从 strCache 获取\r\n const strVals = extractCacheValues(catEls[0], 'strCache')\r\n if (strVals.length > 0) return strVals\r\n\r\n // 从 numCache 获取\r\n const numVals = extractCacheValues(catEls[0], 'numCache')\r\n if (numVals.length > 0) return numVals\r\n\r\n return []\r\n}\r\n\r\n/**\r\n * 提取数值数据 c:val\r\n */\r\nfunction extractValues(serEl: Element): number[] {\r\n const valEls = getDirectChildren(serEl, NS_CHART, 'val')\r\n if (valEls.length === 0) return []\r\n\r\n const numVals = extractCacheValues(valEls[0], 'numCache')\r\n return numVals.map(v => parseFloat(v) || 0)\r\n}\r\n\r\n/**\r\n * 从 cache 元素中提取值列表\r\n * 路径:c:strRef/c:numRef -> c:strCache/c:numCache -> c:pt -> c:v\r\n */\r\nfunction extractCacheValues(parentEl: Element, cacheTag: string): string[] {\r\n const cacheEls = parentEl.getElementsByTagNameNS(NS_CHART, cacheTag)\r\n if (cacheEls.length === 0) return []\r\n\r\n const cache = cacheEls[0]\r\n const ptEls = cache.getElementsByTagNameNS(NS_CHART, 'pt')\r\n if (ptEls.length === 0) return []\r\n\r\n // 按 idx 排序提取值\r\n const indexed: { idx: number; val: string }[] = []\r\n for (let i = 0; i < ptEls.length; i++) {\r\n const pt = ptEls[i]\r\n const idx = parseInt(pt.getAttribute('idx') || '0', 10)\r\n const vEls = pt.getElementsByTagNameNS(NS_CHART, 'v')\r\n const val = vEls.length > 0 ? (vEls[0].textContent || '') : ''\r\n indexed.push({ idx, val })\r\n }\r\n\r\n indexed.sort((a, b) => a.idx - b.idx)\r\n\r\n // 填充空位\r\n const result: string[] = []\r\n for (const item of indexed) {\r\n while (result.length < item.idx) result.push('')\r\n result.push(item.val)\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * 获取直接子元素(不递归)\r\n */\r\nfunction getDirectChildren(parent: Element, ns: string, localName: string): Element[] {\r\n const result: Element[] = []\r\n for (let i = 0; i < parent.childNodes.length; i++) {\r\n const child = parent.childNodes[i]\r\n if (child.nodeType === 1 && (child as Element).localName === localName && (child as Element).namespaceURI === ns) {\r\n result.push(child as Element)\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * 将解析出的图表数据转换为 ECharts option\r\n */\r\nfunction buildEChartsOption(data: OoxmlChartData): any {\r\n const { type, title, categories, series } = data\r\n\r\n const colors = ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc']\r\n\r\n const baseOption: any = {\r\n animation: false,\r\n color: colors,\r\n grid: {\r\n left: '3%',\r\n right: '4%',\r\n bottom: '12%',\r\n top: title ? '15%' : '10%',\r\n containLabel: true\r\n }\r\n }\r\n\r\n if (title) {\r\n baseOption.title = { text: title, left: 'center', textStyle: { fontSize: 14 } }\r\n }\r\n\r\n if (series.length > 1) {\r\n baseOption.legend = {\r\n show: true,\r\n bottom: 0,\r\n data: series.map(s => s.name)\r\n }\r\n }\r\n\r\n // 饼图 / 环形图\r\n if (type === 'pie' || type === 'doughnut') {\r\n const pieData = categories.map((cat, i) => ({\r\n name: cat,\r\n value: series[0]?.values[i] || 0\r\n }))\r\n const radius = type === 'doughnut' ? ['40%', '70%'] : '55%'\r\n return {\r\n ...baseOption,\r\n tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },\r\n series: [{\r\n type: 'pie',\r\n radius,\r\n data: pieData,\r\n label: { formatter: '{b}: {d}%' }\r\n }]\r\n }\r\n }\r\n\r\n // 雷达图\r\n if (type === 'radar') {\r\n const maxVal = Math.max(...series.flatMap(s => s.values)) * 1.2 || 100\r\n const indicator = categories.map(cat => ({ name: cat, max: maxVal }))\r\n return {\r\n ...baseOption,\r\n tooltip: { trigger: 'item' },\r\n radar: { indicator, shape: 'circle' },\r\n series: [{\r\n type: 'radar',\r\n data: series.map(s => ({\r\n name: s.name,\r\n value: s.values\r\n }))\r\n }]\r\n }\r\n }\r\n\r\n // 散点图\r\n if (type === 'scatter') {\r\n return {\r\n ...baseOption,\r\n tooltip: { trigger: 'item' },\r\n xAxis: { type: 'value' },\r\n yAxis: { type: 'value' },\r\n series: series.map(s => ({\r\n name: s.name,\r\n type: 'scatter',\r\n data: s.values.map((v, i) => [categories[i] ? parseFloat(categories[i]) || i : i, v])\r\n }))\r\n }\r\n }\r\n\r\n // 柱状图 / 折线图 / 面积图(默认)\r\n const echartsType = type === 'area' ? 'line' : (type === 'bar' || type === 'line') ? type : 'bar'\r\n return {\r\n ...baseOption,\r\n tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },\r\n xAxis: {\r\n type: 'category',\r\n data: categories,\r\n axisLabel: { rotate: categories.length > 8 ? 45 : 0 }\r\n },\r\n yAxis: { type: 'value' },\r\n series: series.map(s => ({\r\n name: s.name,\r\n type: echartsType,\r\n data: s.values,\r\n ...(type === 'area' ? { areaStyle: {} } : {})\r\n }))\r\n }\r\n}\r\n","import { NS } from '../../constants'\r\nimport type { DocxCommentMeta } from '../../types'\r\nimport { parseXml, forEachChild } from '../xml.helper'\r\n\r\n/**\r\n * 解析 word/comments.xml,返回 commentId → DocxCommentMeta 映射\r\n */\r\nexport function parseComments(commentsXml: string | null): Map<string, DocxCommentMeta> {\r\n const map = new Map<string, DocxCommentMeta>()\r\n if (!commentsXml) return map\r\n\r\n const doc = parseXml(commentsXml)\r\n const root = doc.documentElement\r\n\r\n // 遍历 <w:comment> 元素\r\n const commentEls = root.getElementsByTagNameNS(NS.w, 'comment')\r\n for (let i = 0; i < commentEls.length; i++) {\r\n const commentEl = commentEls[i]\r\n const id = commentEl.getAttributeNS(NS.w, 'id') || commentEl.getAttribute('w:id') || ''\r\n const author = commentEl.getAttributeNS(NS.w, 'author') || commentEl.getAttribute('w:author') || ''\r\n const date = commentEl.getAttributeNS(NS.w, 'date') || commentEl.getAttribute('w:date') || ''\r\n const initials = commentEl.getAttributeNS(NS.w, 'initials') || commentEl.getAttribute('w:initials') || undefined\r\n\r\n if (!id) continue\r\n\r\n // 提取批注正文:遍历 <w:p> → <w:r> → <w:t>\r\n const content = extractCommentText(commentEl)\r\n\r\n map.set(id, { id, author, date, initials, content })\r\n }\r\n\r\n return map\r\n}\r\n\r\n/**\r\n * 从 <w:comment> 元素中提取纯文本内容\r\n */\r\nfunction extractCommentText(commentEl: Element): string {\r\n const paragraphs: string[] = []\r\n\r\n forEachChild(commentEl, (child) => {\r\n if (child.localName === 'p' && child.namespaceURI === NS.w) {\r\n const texts: string[] = []\r\n forEachChild(child, (pChild) => {\r\n if (pChild.localName === 'r' && pChild.namespaceURI === NS.w) {\r\n forEachChild(pChild, (rChild) => {\r\n if (rChild.localName === 't' && rChild.namespaceURI === NS.w) {\r\n texts.push(rChild.textContent || '')\r\n }\r\n })\r\n }\r\n })\r\n paragraphs.push(texts.join(''))\r\n }\r\n })\r\n\r\n return paragraphs.join('\\n')\r\n}\r\n","import type { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { ALIGNMENT_MAP } from '../../constants'\r\nimport type {\r\n DocNode, ParagraphNode, TableNode, ColumnNode, InlineChunk,\r\n TextChunk, ImageChunk, HyperlinkChunk, BreakChunk,\r\n RunStyle, IDocxParseOptions, DocxCommentMeta\r\n} from '../../types'\r\n\r\nconst ZERO_WIDTH_SPACE = '\\u200B'\r\n\r\nconst TITLE_LEVEL_MAP: Record<number, string> = {\r\n 1: 'first', 2: 'second', 3: 'third',\r\n 4: 'fourth', 5: 'fifth', 6: 'sixth'\r\n}\r\n\r\nconst VERTICAL_ALIGN_MAP: Record<string, string> = {\r\n top: 'top',\r\n center: 'middle',\r\n bottom: 'bottom'\r\n}\r\n\r\nlet elementIdCounter = 0\r\n\r\nfunction generateElementId(): string {\r\n return `docx_${Date.now()}_${++elementIdCounter}`\r\n}\r\n\r\n// ---- 公开入口 ----\r\n\r\n/**\r\n * 将中间表示 DocNode[] 转换为编辑器 IElement[]\r\n */\r\nexport function buildElements(\r\n nodes: DocNode[],\r\n options: IDocxParseOptions,\r\n _commentMetas?: Map<string, DocxCommentMeta>\r\n): IElement[] {\r\n const elements: IElement[] = []\r\n const activeCommentIds = new Set<string>()\r\n const defaultSize = options.defaultSize ?? 12\r\n\r\n // 预处理:合并连续空段落\r\n const processedNodes = collapseEmptyParagraphs(nodes, defaultSize)\r\n\r\n let prevEndSize = defaultSize\r\n\r\n for (let i = 0; i < processedNodes.length; i++) {\r\n const node = processedNodes[i]\r\n const isFirst = elements.length === 0\r\n\r\n if (node.type === 'paragraph') {\r\n const endSize = buildParagraph(\r\n node, elements, options, isFirst, activeCommentIds, prevEndSize\r\n )\r\n prevEndSize = endSize\r\n } else if (node.type === 'table') {\r\n buildTable(node, elements, options, activeCommentIds)\r\n prevEndSize = defaultSize\r\n } else if (node.type === 'column') {\r\n buildColumn(node, elements, options, activeCommentIds)\r\n prevEndSize = defaultSize\r\n }\r\n }\r\n\r\n if (elements.length === 0) {\r\n elements.push({ value: ZERO_WIDTH_SPACE })\r\n }\r\n\r\n return elements\r\n}\r\n\r\n// ---- 空段落预处理 ----\r\n\r\n/**\r\n * 将连续的空段落合并为单个带 spacingAfter 的分隔,\r\n * 避免 N 个空段落产生 N 个大行高分隔符\r\n */\r\nfunction collapseEmptyParagraphs(nodes: DocNode[], defaultSize: number): DocNode[] {\r\n const result: DocNode[] = []\r\n let emptyCount = 0\r\n\r\n const flushEmpty = () => {\r\n if (emptyCount <= 0) return\r\n // 连续 N 个空段落合并为一个,spacingAfter 叠加\r\n const accumulated = emptyCount\r\n emptyCount = 0\r\n result.push({\r\n type: 'paragraph',\r\n chunks: [{\r\n type: 'text',\r\n value: ZERO_WIDTH_SPACE,\r\n style: { size: defaultSize }\r\n }],\r\n style: {\r\n spacingAfter: accumulated > 1 ? (accumulated - 1) * defaultSize * 1.2 : 0\r\n }\r\n } as ParagraphNode)\r\n }\r\n\r\n for (const node of nodes) {\r\n if (node.type === 'paragraph' && isParagraphEmpty(node)) {\r\n emptyCount++\r\n } else {\r\n flushEmpty()\r\n result.push(node)\r\n }\r\n }\r\n flushEmpty()\r\n\r\n return result\r\n}\r\n\r\nfunction isParagraphEmpty(para: ParagraphNode): boolean {\r\n if (para.chunks.length === 0) return true\r\n if (para.chunks.length === 1) {\r\n const chunk = para.chunks[0]\r\n return chunk.type === 'text' && chunk.value === ZERO_WIDTH_SPACE\r\n }\r\n return false\r\n}\r\n\r\n// ---- 段落构建 ----\r\n\r\n/**\r\n * 构建段落对应的 IElement[],插入到 elements 中\r\n * 返回该段落末尾元素的字号(供下一个段落的分隔符使用)\r\n */\r\nfunction buildParagraph(\r\n para: ParagraphNode,\r\n elements: IElement[],\r\n options: IDocxParseOptions,\r\n isFirst: boolean,\r\n activeCommentIds: Set<string>,\r\n prevEndSize: number\r\n): number {\r\n const { style, chunks } = para\r\n const defaultSize = options.defaultSize ?? 12\r\n const forceLineHeight = options.forceDefaultLineHeight\r\n\r\n // 段落级属性\r\n const paragraphAttrs: Partial<IElement> = {}\r\n\r\n // 对齐\r\n if (style.rowFlex) {\r\n const mapped = ALIGNMENT_MAP[style.rowFlex]\r\n if (mapped) paragraphAttrs.rowFlex = mapped as any\r\n }\r\n\r\n // 段前 / 段后间距\r\n if (style.spacingBefore !== undefined) {\r\n paragraphAttrs.paragraphSpacingBefore = style.spacingBefore\r\n }\r\n if (style.spacingAfter !== undefined) {\r\n paragraphAttrs.paragraphSpacingAfter = style.spacingAfter\r\n }\r\n\r\n // 行高:forceDefaultLineHeight > exact/atLeast (px) > auto (倍率)\r\n if (forceLineHeight) {\r\n paragraphAttrs.lineHeight = forceLineHeight\r\n } else if (style.lineHeight !== undefined) {\r\n paragraphAttrs.lineHeight = style.lineHeight\r\n }\r\n\r\n // 缩进\r\n if (style.indentLeft !== undefined) {\r\n paragraphAttrs.paragraphIndentLeft = style.indentLeft\r\n }\r\n if (style.firstLineIndent !== undefined) {\r\n paragraphAttrs.paragraphFirstLineIndent = style.firstLineIndent\r\n }\r\n\r\n // 段落背景色\r\n if (style.paragraphColor) {\r\n (paragraphAttrs as any).paragraphColor = style.paragraphColor\r\n }\r\n\r\n const isTitled = style.titleLevel !== undefined && style.titleLevel >= 1 && style.titleLevel <= 6\r\n const isList = !!style.listType\r\n\r\n // 段落间分隔符(非第一个段落前插入)\r\n // 字号使用上一个段落末尾的字号,避免继承大字号标题行高\r\n if (!isFirst && elements.length > 0) {\r\n const separatorEl: IElement = { value: ZERO_WIDTH_SPACE, size: prevEndSize as any }\r\n elements.push(separatorEl)\r\n }\r\n\r\n // 构建内容元素\r\n const contentElements: IElement[] = []\r\n for (const chunk of chunks) {\r\n buildChunk(chunk, contentElements, options, activeCommentIds)\r\n }\r\n\r\n if (contentElements.length === 0) {\r\n contentElements.push({ value: ZERO_WIDTH_SPACE, size: defaultSize as any })\r\n }\r\n\r\n // 应用段落属性\r\n if (isTitled) {\r\n applyRowFlexToChildren(contentElements, paragraphAttrs)\r\n const titleEl: IElement = {\r\n value: '',\r\n type: 'title' as any,\r\n level: TITLE_LEVEL_MAP[style.titleLevel!] as any,\r\n valueList: contentElements,\r\n ...paragraphAttrs\r\n }\r\n elements.push(titleEl)\r\n } else if (isList) {\r\n applyRowFlexToChildren(contentElements, paragraphAttrs)\r\n const listEl: IElement = {\r\n value: '',\r\n type: 'list' as any,\r\n listType: style.listType as any,\r\n listStyle: style.listStyle as any,\r\n listLevel: style.listLevel,\r\n valueList: contentElements,\r\n ...paragraphAttrs\r\n }\r\n elements.push(listEl)\r\n } else {\r\n // 普通段落:段落属性应用到每个元素\r\n for (let i = 0; i < contentElements.length; i++) {\r\n const el = contentElements[i]\r\n if (i === 0) {\r\n Object.assign(el, paragraphAttrs)\r\n } else {\r\n // rowFlex、段落背景色需传播到每个元素\r\n if (paragraphAttrs.rowFlex) el.rowFlex = paragraphAttrs.rowFlex\r\n if ((paragraphAttrs as any).paragraphColor) {\r\n (el as any).paragraphColor = (paragraphAttrs as any).paragraphColor\r\n }\r\n }\r\n elements.push(el)\r\n }\r\n }\r\n\r\n // 返回该段落末尾文字元素的字号\r\n return resolveEndSize(contentElements, defaultSize)\r\n}\r\n\r\n/** 将 rowFlex 和 paragraphColor 传播到 valueList 子元素 */\r\nfunction applyRowFlexToChildren(children: IElement[], paragraphAttrs: Partial<IElement>): void {\r\n for (const el of children) {\r\n if (paragraphAttrs.rowFlex) el.rowFlex = paragraphAttrs.rowFlex\r\n if ((paragraphAttrs as any).paragraphColor) {\r\n (el as any).paragraphColor = (paragraphAttrs as any).paragraphColor\r\n }\r\n }\r\n}\r\n\r\n/** 取最后一个有字号的元素的 size,回退到 defaultSize */\r\nfunction resolveEndSize(elements: IElement[], defaultSize: number): number {\r\n for (let i = elements.length - 1; i >= 0; i--) {\r\n const size = (elements[i] as any).size\r\n if (typeof size === 'number' && size > 0) return size\r\n }\r\n return defaultSize\r\n}\r\n\r\n// ---- Chunk 构建 ----\r\n\r\nfunction buildChunk(\r\n chunk: InlineChunk,\r\n elements: IElement[],\r\n options: IDocxParseOptions,\r\n activeCommentIds: Set<string>\r\n): void {\r\n switch (chunk.type) {\r\n case 'text':\r\n buildTextChunk(chunk, elements, options, activeCommentIds)\r\n break\r\n case 'image':\r\n buildImageChunk(chunk, elements, activeCommentIds)\r\n break\r\n case 'hyperlink':\r\n buildHyperlinkChunk(chunk, elements, options, activeCommentIds)\r\n break\r\n case 'break':\r\n buildBreakChunk(chunk, elements)\r\n break\r\n case 'tab':\r\n elements.push({ value: '', type: 'tab' as any })\r\n break\r\n case 'commentMarker':\r\n if (chunk.markType === 'start') {\r\n activeCommentIds.add(`comment_${chunk.commentId}`)\r\n } else {\r\n activeCommentIds.delete(`comment_${chunk.commentId}`)\r\n }\r\n break\r\n case 'bookmark':\r\n // 书签:忽略\r\n break\r\n default:\r\n // 嵌套表格 chunk(来自单元格内的 parseTable 结果)\r\n if ((chunk as any).type === 'nestedTable') {\r\n // 嵌套表格在 buildTable 中处理,此处跳过(已在 parseCellContent 中作为 ParagraphNode 包装)\r\n }\r\n }\r\n}\r\n\r\nfunction buildTextChunk(\r\n chunk: TextChunk,\r\n elements: IElement[],\r\n options: IDocxParseOptions,\r\n activeCommentIds: Set<string>\r\n): void {\r\n const { value, style } = chunk\r\n const defaultSize = options.defaultSize ?? 12\r\n\r\n for (const char of value) {\r\n const el: IElement = { value: char }\r\n applyRunStyle(el, style, defaultSize)\r\n\r\n if (style.vertAlign === 'superscript') {\r\n el.type = 'superscript' as any\r\n el.actualSize = ((style.size ?? defaultSize) * 0.6) as any\r\n } else if (style.vertAlign === 'subscript') {\r\n el.type = 'subscript' as any\r\n el.actualSize = ((style.size ?? defaultSize) * 0.6) as any\r\n }\r\n\r\n if (activeCommentIds.size > 0) {\r\n el.groupIds = [...activeCommentIds]\r\n }\r\n\r\n if (chunk.revision) {\r\n el.revisionId = chunk.revision.id\r\n el.revisionType = chunk.revision.type\r\n el.revisionAuthor = chunk.revision.author\r\n el.revisionDate = chunk.revision.date\r\n if (chunk.revision.type === 'insert') {\r\n el.color = el.color || '#1a73e8'\r\n } else if (chunk.revision.type === 'delete') {\r\n el.color = el.color || '#f56c6c'\r\n }\r\n\r\n }\r\n\r\n elements.push(el)\r\n }\r\n}\r\n\r\nfunction buildImageChunk(\r\n chunk: ImageChunk,\r\n elements: IElement[],\r\n activeCommentIds: Set<string>\r\n): void {\r\n const el: IElement = {\r\n value: chunk.src,\r\n type: 'image' as any,\r\n width: chunk.width,\r\n height: chunk.height,\r\n id: generateElementId()\r\n }\r\n\r\n if (chunk.display) {\r\n el.imgDisplay = normalizeImageDisplay(chunk.display) as any\r\n if (chunk.floatPosition && el.imgDisplay !== 'inline' && el.imgDisplay !== 'block') {\r\n el.imgFloatPosition = chunk.floatPosition\r\n }\r\n }\r\n\r\n if (activeCommentIds.size > 0) {\r\n el.groupIds = [...activeCommentIds]\r\n }\r\n\r\n elements.push(el)\r\n}\r\n\r\nfunction normalizeImageDisplay(display: string): string {\r\n const displayMap: Record<string, string> = {\r\n 'inline': 'inline',\r\n 'block': 'block',\r\n 'surround': 'surround',\r\n 'float-top': 'float-top',\r\n 'float-bottom': 'float-bottom',\r\n 'floatTop': 'float-top' // 兼容旧值\r\n }\r\n return displayMap[display] ?? 'inline'\r\n}\r\n\r\nfunction buildHyperlinkChunk(\r\n chunk: HyperlinkChunk,\r\n elements: IElement[],\r\n options: IDocxParseOptions,\r\n activeCommentIds: Set<string>\r\n): void {\r\n const defaultSize = options.defaultSize ?? 12\r\n const valueList: IElement[] = []\r\n\r\n for (const textChunk of chunk.children) {\r\n for (const char of textChunk.value) {\r\n const el: IElement = { value: char }\r\n applyRunStyle(el, textChunk.style, defaultSize)\r\n if (activeCommentIds.size > 0) el.groupIds = [...activeCommentIds]\r\n if (textChunk.revision) {\r\n el.revisionId = textChunk.revision.id\r\n el.revisionType = textChunk.revision.type\r\n el.revisionAuthor = textChunk.revision.author\r\n el.revisionDate = textChunk.revision.date\r\n if (textChunk.revision.type === 'insert') {\r\n el.color = el.color || '#1a73e8'\r\n } else if (textChunk.revision.type === 'delete') {\r\n el.color = el.color || '#f56c6c'\r\n }\r\n }\r\n valueList.push(el)\r\n }\r\n }\r\n\r\n if (valueList.length === 0) return\r\n\r\n const hyperlinkEl: IElement = {\r\n value: '',\r\n type: 'hyperlink' as any,\r\n url: chunk.url,\r\n hyperlinkId: generateElementId(),\r\n valueList\r\n }\r\n if (activeCommentIds.size > 0) hyperlinkEl.groupIds = [...activeCommentIds]\r\n elements.push(hyperlinkEl)\r\n}\r\n\r\nfunction buildBreakChunk(chunk: BreakChunk, elements: IElement[]): void {\r\n if (chunk.breakType === 'page') {\r\n elements.push({ value: '\\n', type: 'pageBreak' as any })\r\n } else if (chunk.breakType === 'line') {\r\n elements.push({ value: '\\n' })\r\n }\r\n // column break 在 buildColumn 中通过 columnBreak 元素处理\r\n}\r\n\r\nfunction applyRunStyle(el: IElement, style: RunStyle, _defaultSize: number): void {\r\n if (style.bold) el.bold = true\r\n if (style.italic) el.italic = true\r\n if (style.underline !== undefined) el.underline = style.underline\r\n if (style.strikeout) el.strikeout = true\r\n if (style.font) el.font = style.font\r\n if (style.size) el.size = style.size as any\r\n if (style.color) el.color = style.color\r\n if (style.highlight) el.highlight = style.highlight\r\n if (style.letterSpacing) el.letterSpacing = style.letterSpacing\r\n}\r\n\r\n// ---- 表格构建 ----\r\n\r\nfunction buildTable(\r\n table: TableNode,\r\n elements: IElement[],\r\n options: IDocxParseOptions,\r\n activeCommentIds: Set<string>\r\n): void {\r\n const targetInnerWidth = options.targetInnerWidth\r\n const tableWidthMode = options.tableWidthMode ?? 'fit'\r\n const defaultRowHeight = options.defaultTableRowHeight ?? 32\r\n const defaultTdPadding = options.defaultTableTdPadding ?? [0, 4, 0, 4]\r\n\r\n // 计算列宽\r\n let colWidths = [...table.colWidths]\r\n if (targetInnerWidth && tableWidthMode === 'fit' && colWidths.length > 0) {\r\n const totalWidth = colWidths.reduce((a, b) => a + b, 0)\r\n if (totalWidth > 0) {\r\n const ratio = targetInnerWidth / totalWidth\r\n colWidths = colWidths.map(w => Math.round(w * ratio))\r\n }\r\n }\r\n\r\n const colgroup = colWidths.map(w => ({ width: w }))\r\n\r\n const trList: any[] = []\r\n for (const row of table.rows) {\r\n const tdList: any[] = []\r\n for (const cell of row.cells) {\r\n const cellElements: IElement[] = []\r\n\r\n for (let pi = 0; pi < cell.paragraphs.length; pi++) {\r\n const para = cell.paragraphs[pi]\r\n // 检测嵌套表格包装段落\r\n if (isNestedTableParagraph(para)) {\r\n const nestedTable = (para.chunks[0] as any).table as TableNode\r\n buildTable(nestedTable, cellElements, options, activeCommentIds)\r\n } else {\r\n buildParagraph(para, cellElements, options, pi === 0 && cellElements.length === 0, activeCommentIds, options.defaultSize ?? 12)\r\n }\r\n }\r\n\r\n if (cellElements.length === 0) {\r\n cellElements.push({ value: ZERO_WIDTH_SPACE })\r\n }\r\n\r\n const td: any = {\r\n value: cellElements,\r\n colspan: cell.colspan,\r\n rowspan: cell.rowspan\r\n }\r\n\r\n if (cell.backgroundColor) td.backgroundColor = cell.backgroundColor\r\n if (cell.verticalAlign) {\r\n td.verticalAlign = VERTICAL_ALIGN_MAP[cell.verticalAlign] ?? 'top'\r\n }\r\n if (cell.borderTypes) td.borderTypes = cell.borderTypes\r\n if (cell.width) td.width = cell.width\r\n\r\n tdList.push(td)\r\n }\r\n\r\n trList.push({\r\n height: row.height ?? defaultRowHeight,\r\n tdList\r\n })\r\n }\r\n\r\n const tableEl: IElement = {\r\n value: '',\r\n type: 'table' as any,\r\n colgroup,\r\n trList,\r\n tdPadding: defaultTdPadding as any\r\n }\r\n\r\n if (table.borderType === 'EMPTY') {\r\n tableEl.borderType = 0 as any\r\n } else if (table.borderType === 'ALL') {\r\n tableEl.borderType = 1 as any\r\n }\r\n if (table.borderColor) tableEl.borderColor = table.borderColor\r\n if (table.borderWidth) tableEl.borderWidth = table.borderWidth\r\n\r\n elements.push(tableEl)\r\n}\r\n\r\nfunction isNestedTableParagraph(para: ParagraphNode): boolean {\r\n return para.chunks.length === 1 && (para.chunks[0] as any).type === 'nestedTable'\r\n}\r\n\r\n// ---- 分栏构建 ----\r\n\r\nfunction buildColumn(\r\n column: ColumnNode,\r\n elements: IElement[],\r\n options: IDocxParseOptions,\r\n activeCommentIds: Set<string>\r\n): void {\r\n const columnId = generateElementId()\r\n\r\n // 分栏开始标记\r\n elements.push({\r\n value: ZERO_WIDTH_SPACE,\r\n columnId,\r\n columnCount: column.columns,\r\n columnGap: column.colSpace,\r\n columnSeparator: column.separator,\r\n columnWidths: column.colWidths\r\n } as IElement)\r\n\r\n for (let colIdx = 0; colIdx < column.groups.length; colIdx++) {\r\n const group = column.groups[colIdx]\r\n\r\n // 非第一列前插入 column break\r\n if (colIdx > 0) {\r\n elements.push({\r\n value: '\\n',\r\n type: 'columnBreak' as any,\r\n columnId\r\n } as IElement)\r\n }\r\n\r\n let prevEndSize = options.defaultSize ?? 12\r\n for (let pi = 0; pi < group.length; pi++) {\r\n const isFirst = pi === 0 && colIdx === 0\r\n const endSize = buildParagraph(group[pi], elements, options, isFirst, activeCommentIds, prevEndSize)\r\n prevEndSize = endSize\r\n\r\n // 为该列的元素附加 columnId\r\n const lastEl = elements[elements.length - 1]\r\n if (lastEl && !(lastEl as any).columnId) {\r\n (lastEl as any).columnId = columnId\r\n }\r\n }\r\n }\r\n\r\n // 分栏结束标记\r\n elements.push({ value: ZERO_WIDTH_SPACE } as IElement)\r\n}\r\n","import JSZip from 'jszip'\r\nimport type {\r\n IDocxParseResult, IDocxParseOptions, IWorkerRequest, IChartRenderer,\r\n DocNode, ParagraphNode, ImageChunk\r\n} from './types'\r\nimport { DEFAULT_OPTIONS } from './types'\r\nimport type { PageMargins } from './worker/parsers/image.parser'\r\nimport { NS } from './constants'\r\nimport { parseXml, forEachChild, getFirstChildByTag } from './worker/xml.helper'\r\nimport { parseTheme, type ThemeData } from './worker/theme.resolver'\r\nimport { StyleResolver } from './worker/style.resolver'\r\nimport { NumberingResolver } from './worker/numbering.resolver'\r\nimport { parseRelationships, type RelationshipEntry } from './worker/relationship.resolver'\r\nimport { parseParagraph } from './worker/parsers/paragraph.parser'\r\nimport { parseTable } from './worker/parsers/table.parser'\r\nimport { isTocSdt, parseTocContent } from './worker/parsers/toc.parser'\r\nimport { parseSectionProperties, buildColumnNode } from './worker/parsers/section.parser'\r\nimport { parseChart } from './worker/parsers/chart.parser'\r\nimport { parseOoxmlChartToOption } from './worker/parsers/ooxml.chart.parser'\r\nimport { parseComments } from './worker/parsers/comment.parser'\r\nimport { buildElements } from './worker/builder/element.builder'\r\nimport { footnoteCounter } from './worker/parsers/run.parser'\r\n\r\nexport class DocxParser {\r\n private options: IDocxParseOptions\r\n\r\n constructor(options?: IDocxParseOptions) {\r\n this.options = { ...options }\r\n }\r\n\r\n async parse(arrayBuffer: ArrayBuffer): Promise<IDocxParseResult> {\r\n try {\r\n const zip = await JSZip.loadAsync(arrayBuffer)\r\n\r\n const [\r\n documentXml,\r\n stylesXml,\r\n numberingXml,\r\n themeXml,\r\n documentRels,\r\n commentsXml\r\n ] = await Promise.all([\r\n this.readZipEntry(zip, 'word/document.xml'),\r\n this.readZipEntry(zip, 'word/styles.xml'),\r\n this.readZipEntry(zip, 'word/numbering.xml'),\r\n this.readZipEntry(zip, 'word/theme/theme1.xml'),\r\n this.readZipEntry(zip, 'word/_rels/document.xml.rels'),\r\n this.readZipEntry(zip, 'word/comments.xml')\r\n ])\r\n\r\n if (!documentXml) {\r\n return { success: false, elements: [], error: 'Missing word/document.xml' }\r\n }\r\n\r\n const mediaMap = await this.extractMediaFiles(zip)\r\n const chartRelsMap = await this.extractChartRelFiles(zip)\r\n const chartXmlMap = await this.extractChartXmlFiles(zip)\r\n\r\n const workerRequest: IWorkerRequest = {\r\n documentXml,\r\n stylesXml,\r\n numberingXml,\r\n themeXml,\r\n documentRels,\r\n commentsXml,\r\n chartRelsMap,\r\n chartXmlMap,\r\n mediaMap,\r\n options: this.getMergedOptions()\r\n }\r\n\r\n return this.parseDocumentSync(workerRequest)\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error)\r\n return { success: false, elements: [], error: msg }\r\n }\r\n }\r\n\r\n async parseFromFile(file: File): Promise<IDocxParseResult> {\r\n const arrayBuffer = await file.arrayBuffer()\r\n return this.parse(arrayBuffer)\r\n }\r\n\r\n private async parseDocumentSync(request: IWorkerRequest): Promise<IDocxParseResult> {\r\n try {\r\n footnoteCounter.value = 0\r\n\r\n let renderChartToDataUrl: ((option: unknown, w: number, h: number, pixelRatio?: number) => string) | null = null\r\n if (request.options.chartRenderer && Object.keys(request.chartXmlMap).length > 0) {\r\n const renderer: IChartRenderer = request.options.chartRenderer\r\n renderChartToDataUrl = (option, w, h, pr) => renderer.renderToDataUrl(option, w, h, pr)\r\n }\r\n\r\n const theme = parseTheme(request.themeXml)\r\n const styleResolver = new StyleResolver(request.stylesXml, theme)\r\n const numberingResolver = new NumberingResolver(request.numberingXml)\r\n const commentMetasMap = parseComments(request.commentsXml)\r\n const documentRels: Map<string, RelationshipEntry> = request.documentRels\r\n ? parseRelationships(request.documentRels)\r\n : new Map()\r\n\r\n const doc = parseXml(request.documentXml)\r\n const bodyElements = doc.documentElement.getElementsByTagNameNS(NS.w, 'body')\r\n if (bodyElements.length === 0) {\r\n return { success: false, elements: [], error: 'No <w:body> found' }\r\n }\r\n\r\n const body = bodyElements[0]\r\n const pageMargins = extractPageMargins(body, NS.w, getFirstChildByTag)\r\n const defaultSize = request.options.defaultSize ?? 12\r\n\r\n const docNodes: DocNode[] = []\r\n let pendingSectionParagraphs: ParagraphNode[] = []\r\n const pendingBodyCommentMarkers: Array<{\r\n type: 'commentMarker'; markType: 'start' | 'end'; commentId: string\r\n }> = []\r\n\r\n const flushSectionParagraphs = () => {\r\n for (const p of pendingSectionParagraphs) docNodes.push(p)\r\n pendingSectionParagraphs = []\r\n }\r\n\r\n const injectPendingCommentMarkers = (para: ParagraphNode) => {\r\n if (pendingBodyCommentMarkers.length > 0) {\r\n para.chunks.unshift(...pendingBodyCommentMarkers)\r\n pendingBodyCommentMarkers.length = 0\r\n }\r\n }\r\n\r\n forEachChild(body, (child) => {\r\n const tag = child.localName\r\n const childNs = child.namespaceURI\r\n\r\n if (tag === 'p' && childNs === NS.w) {\r\n const para = parseParagraph(\r\n child, styleResolver, theme, numberingResolver,\r\n documentRels, request.mediaMap, pageMargins, defaultSize\r\n )\r\n injectPendingCommentMarkers(para)\r\n\r\n injectChartChunks(\r\n child, para, documentRels, request.chartRelsMap,\r\n request.chartXmlMap, request.mediaMap,\r\n renderChartToDataUrl,\r\n { c: NS.c, r: NS.r, wp: NS.wp, w: NS.w }, getFirstChildByTag\r\n )\r\n\r\n const pPrEl = getFirstChildByTag(child, NS.w, 'pPr')\r\n const sectPrEl = pPrEl ? getFirstChildByTag(pPrEl, NS.w, 'sectPr') : null\r\n\r\n if (sectPrEl) {\r\n const sectionProps = parseSectionProperties(sectPrEl)\r\n if (sectionProps.columns > 1) {\r\n pendingSectionParagraphs.push(para)\r\n const targetWidth = request.options.targetInnerWidth ?? 600\r\n docNodes.push(buildColumnNode(pendingSectionParagraphs, sectionProps, targetWidth))\r\n pendingSectionParagraphs = []\r\n } else {\r\n flushSectionParagraphs()\r\n docNodes.push(para)\r\n }\r\n const bt = sectionProps.breakType\r\n if (bt !== 'continuous' && bt !== 'nextColumn') {\r\n docNodes.push({\r\n type: 'paragraph',\r\n chunks: [{ type: 'break', breakType: 'page' }],\r\n style: {}\r\n })\r\n }\r\n } else {\r\n pendingSectionParagraphs.push(para)\r\n }\r\n\r\n } else if (tag === 'tbl' && childNs === NS.w) {\r\n flushSectionParagraphs()\r\n docNodes.push(\r\n parseTable(child, styleResolver, theme, numberingResolver, documentRels, request.mediaMap, pageMargins)\r\n )\r\n\r\n } else if (tag === 'sdt' && childNs === NS.w) {\r\n processSdtElement(\r\n child, pendingSectionParagraphs, docNodes, flushSectionParagraphs,\r\n styleResolver, theme, numberingResolver, documentRels,\r\n request.mediaMap, pageMargins, defaultSize,\r\n NS.w, getFirstChildByTag, forEachChild\r\n )\r\n\r\n } else if (tag === 'customXml' && childNs === NS.w) {\r\n forEachChild(child, (xmlChild) => {\r\n if (xmlChild.localName === 'p' && xmlChild.namespaceURI === NS.w) {\r\n pendingSectionParagraphs.push(\r\n parseParagraph(xmlChild, styleResolver, theme, numberingResolver, documentRels, request.mediaMap, pageMargins, defaultSize)\r\n )\r\n } else if (xmlChild.localName === 'tbl' && xmlChild.namespaceURI === NS.w) {\r\n flushSectionParagraphs()\r\n docNodes.push(\r\n parseTable(xmlChild, styleResolver, theme, numberingResolver, documentRels, request.mediaMap, pageMargins)\r\n )\r\n }\r\n })\r\n\r\n } else if (tag === 'sectPr' && childNs === NS.w) {\r\n const sectionProps = parseSectionProperties(child)\r\n if (sectionProps.columns > 1 && pendingSectionParagraphs.length > 0) {\r\n const targetWidth = request.options.targetInnerWidth ?? 600\r\n docNodes.push(buildColumnNode(pendingSectionParagraphs, sectionProps, targetWidth))\r\n pendingSectionParagraphs = []\r\n }\r\n\r\n } else if (tag === 'commentRangeStart' && childNs === NS.w) {\r\n const commentId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? ''\r\n if (commentId) {\r\n pendingBodyCommentMarkers.push({ type: 'commentMarker', markType: 'start', commentId })\r\n }\r\n } else if (tag === 'commentRangeEnd' && childNs === NS.w) {\r\n const commentId = child.getAttributeNS(NS.w, 'id') ?? child.getAttribute('w:id') ?? ''\r\n if (commentId) {\r\n pendingBodyCommentMarkers.push({ type: 'commentMarker', markType: 'end', commentId })\r\n }\r\n }\r\n })\r\n\r\n flushSectionParagraphs()\r\n\r\n const elements = buildElements(docNodes, request.options, commentMetasMap)\r\n const comments = commentMetasMap.size > 0 ? [...commentMetasMap.values()] : undefined\r\n\r\n return { success: true, elements, comments }\r\n } catch (error: unknown) {\r\n const msg = error instanceof Error ? error.message : String(error)\r\n return { success: false, elements: [], error: `Parse failed: ${msg}` }\r\n }\r\n }\r\n\r\n private async readZipEntry(zip: JSZip, path: string): Promise<string | null> {\r\n const file = zip.file(path)\r\n return file ? file.async('string') : null\r\n }\r\n\r\n private async extractMediaFiles(zip: JSZip): Promise<Record<string, string>> {\r\n const mediaMap: Record<string, string> = {}\r\n const MIME_MAP: Record<string, string> = {\r\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',\r\n gif: 'image/gif', bmp: 'image/bmp', tiff: 'image/tiff',\r\n tif: 'image/tiff', svg: 'image/svg+xml', emf: 'image/x-emf', wmf: 'image/x-wmf'\r\n }\r\n\r\n const promises: Promise<void>[] = []\r\n zip.forEach((relativePath, zipEntry) => {\r\n if (relativePath.startsWith('word/media/') && !zipEntry.dir) {\r\n promises.push(\r\n zipEntry.async('base64').then((base64) => {\r\n const ext = relativePath.split('.').pop()?.toLowerCase() ?? 'png'\r\n const mime = MIME_MAP[ext] ?? 'image/png'\r\n const dataUrl = `data:${mime};base64,${base64}`\r\n mediaMap[relativePath] = dataUrl\r\n mediaMap[relativePath.replace('word/', '')] = dataUrl\r\n })\r\n )\r\n }\r\n })\r\n\r\n await Promise.all(promises)\r\n return mediaMap\r\n }\r\n\r\n private async extractChartRelFiles(zip: JSZip): Promise<Record<string, string>> {\r\n const chartRelsMap: Record<string, string> = {}\r\n const promises: Promise<void>[] = []\r\n\r\n zip.forEach((relativePath, zipEntry) => {\r\n if (relativePath.includes('charts/_rels/') && relativePath.endsWith('.rels') && !zipEntry.dir) {\r\n promises.push(\r\n zipEntry.async('string').then((content) => {\r\n chartRelsMap[relativePath] = content\r\n })\r\n )\r\n }\r\n })\r\n\r\n await Promise.all(promises)\r\n return chartRelsMap\r\n }\r\n\r\n private async extractChartXmlFiles(zip: JSZip): Promise<Record<string, string>> {\r\n const chartXmlMap: Record<string, string> = {}\r\n const promises: Promise<void>[] = []\r\n\r\n zip.forEach((relativePath, zipEntry) => {\r\n if (relativePath.match(/^word\\/charts\\/chart\\d+\\.xml$/) && !zipEntry.dir) {\r\n promises.push(\r\n zipEntry.async('string').then((content) => {\r\n chartXmlMap[relativePath] = content\r\n })\r\n )\r\n }\r\n })\r\n\r\n await Promise.all(promises)\r\n return chartXmlMap\r\n }\r\n\r\n private getMergedOptions(): IDocxParseOptions {\r\n return { ...DEFAULT_OPTIONS, ...this.options }\r\n }\r\n}\r\n\r\nfunction processSdtElement(\r\n sdtEl: Element,\r\n pendingSectionParagraphs: ParagraphNode[],\r\n docNodes: DocNode[],\r\n flushSectionParagraphs: () => void,\r\n styleResolver: StyleResolver,\r\n theme: ThemeData,\r\n numberingResolver: NumberingResolver,\r\n documentRels: Map<string, RelationshipEntry>,\r\n mediaMap: Record<string, string>,\r\n pageMargins: PageMargins | undefined,\r\n defaultSize: number,\r\n wNs: string,\r\n getFirstChildByTag: (el: Element, ns: string, tag: string) => Element | null,\r\n forEachChild: (el: Element, cb: (child: Element) => void) => void\r\n): void {\r\n if (isTocSdt(sdtEl)) {\r\n const tocParagraphs = parseTocContent(\r\n sdtEl, styleResolver, theme, numberingResolver, documentRels, mediaMap\r\n )\r\n for (const p of tocParagraphs) pendingSectionParagraphs.push(p)\r\n return\r\n }\r\n\r\n const sdtContentEl = getFirstChildByTag(sdtEl, wNs, 'sdtContent')\r\n if (!sdtContentEl) return\r\n\r\n forEachChild(sdtContentEl, (child: Element) => {\r\n if (child.localName === 'p' && child.namespaceURI === wNs) {\r\n pendingSectionParagraphs.push(\r\n parseParagraph(child, styleResolver, theme, numberingResolver, documentRels, mediaMap, pageMargins, defaultSize)\r\n )\r\n } else if (child.localName === 'tbl' && child.namespaceURI === wNs) {\r\n flushSectionParagraphs()\r\n docNodes.push(\r\n parseTable(child, styleResolver, theme, numberingResolver, documentRels, mediaMap, pageMargins)\r\n )\r\n } else if (child.localName === 'sdt' && child.namespaceURI === wNs) {\r\n processSdtElement(\r\n child, pendingSectionParagraphs, docNodes, flushSectionParagraphs,\r\n styleResolver, theme, numberingResolver, documentRels, mediaMap, pageMargins, defaultSize,\r\n wNs, getFirstChildByTag, forEachChild\r\n )\r\n }\r\n })\r\n}\r\n\r\nfunction injectChartChunks(\r\n paragraphEl: Element,\r\n para: ParagraphNode,\r\n documentRels: Map<string, RelationshipEntry>,\r\n chartRelsMap: Record<string, string>,\r\n chartXmlMap: Record<string, string>,\r\n mediaMap: Record<string, string>,\r\n renderChartToDataUrl: ((option: unknown, w: number, h: number, pr?: number) => string) | null,\r\n NS: { c: string; r: string; wp: string; w: string },\r\n getFirstChildByTag: (el: Element, ns: string, tag: string) => Element | null\r\n): void {\r\n const drawings = paragraphEl.getElementsByTagNameNS(NS.w, 'drawing')\r\n\r\n for (let i = 0; i < drawings.length; i++) {\r\n const drawing = drawings[i]\r\n if (!drawing.getElementsByTagNameNS(NS.c, 'chart').length) continue\r\n\r\n let chartImage = parseChart(drawing, documentRels, chartRelsMap, mediaMap)\r\n\r\n if (!chartImage && renderChartToDataUrl) {\r\n chartImage = renderChartFromXml(\r\n drawing, documentRels, chartXmlMap,\r\n renderChartToDataUrl, NS, getFirstChildByTag\r\n )\r\n }\r\n\r\n if (chartImage) para.chunks.push(chartImage)\r\n }\r\n}\r\n\r\nfunction renderChartFromXml(\r\n drawingEl: Element,\r\n documentRels: Map<string, RelationshipEntry>,\r\n chartXmlMap: Record<string, string>,\r\n renderFn: (option: unknown, w: number, h: number, pr?: number) => string,\r\n NS: { c: string; r: string; wp: string; w: string },\r\n getFirstChildByTag: (el: Element, ns: string, tag: string) => Element | null\r\n): ImageChunk | null {\r\n const chartEls = drawingEl.getElementsByTagNameNS(NS.c, 'chart')\r\n if (chartEls.length === 0) return null\r\n\r\n const rId = chartEls[0].getAttributeNS(NS.r, 'id') ?? chartEls[0].getAttribute('r:id') ?? ''\r\n if (!rId) return null\r\n\r\n const rel = documentRels.get(rId)\r\n if (!rel) return null\r\n\r\n const chartPath = rel.target.startsWith('word/')\r\n ? rel.target\r\n : `word/${rel.target.replace(/^\\.\\.\\//, '')}`\r\n\r\n const chartXml = chartXmlMap[chartPath]\r\n if (!chartXml) return null\r\n\r\n let width = 400\r\n let height = 300\r\n const container = getFirstChildByTag(drawingEl, NS.wp, 'inline')\r\n ?? getFirstChildByTag(drawingEl, NS.wp, 'anchor')\r\n if (container) {\r\n const extent = getFirstChildByTag(container, NS.wp, 'extent')\r\n if (extent) {\r\n const cx = extent.getAttribute('cx')\r\n const cy = extent.getAttribute('cy')\r\n if (cx) width = Math.round(parseInt(cx, 10) / 9525)\r\n if (cy) height = Math.round(parseInt(cy, 10) / 9525)\r\n }\r\n }\r\n\r\n const option = parseOoxmlChartToOption(chartXml)\r\n if (!option) return null\r\n\r\n try {\r\n const src = renderFn(option, width, height, 2)\r\n return { type: 'image', src, width, height }\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction extractPageMargins(\r\n body: Element,\r\n wNs: string,\r\n getFirstChildByTag: (el: Element, ns: string, tag: string) => Element | null\r\n): PageMargins {\r\n const defaults: PageMargins = { top: 72, bottom: 72, left: 90, right: 90 }\r\n\r\n const sectPrEl = getFirstChildByTag(body, wNs, 'sectPr')\r\n if (!sectPrEl) return defaults\r\n\r\n const pgMarEl = getFirstChildByTag(sectPrEl, wNs, 'pgMar')\r\n if (!pgMarEl) return defaults\r\n\r\n const toNum = (attr: string | null) => (attr ? parseInt(attr, 10) : null)\r\n const toPx = (twip: number) => (twip / 1440) * 96\r\n\r\n const top = toNum(pgMarEl.getAttributeNS(wNs, 'top') ?? pgMarEl.getAttribute('w:top'))\r\n const bottom = toNum(pgMarEl.getAttributeNS(wNs, 'bottom') ?? pgMarEl.getAttribute('w:bottom'))\r\n const left = toNum(pgMarEl.getAttributeNS(wNs, 'left') ?? pgMarEl.getAttribute('w:left'))\r\n const right = toNum(pgMarEl.getAttributeNS(wNs, 'right') ?? pgMarEl.getAttribute('w:right'))\r\n\r\n return {\r\n top: top !== null ? toPx(top) : defaults.top,\r\n bottom: bottom !== null ? toPx(bottom) : defaults.bottom,\r\n left: left !== null ? toPx(left) : defaults.left,\r\n right: right !== null ? toPx(right) : defaults.right\r\n }\r\n}\r\n","export type {\r\n IDocxParseResult,\r\n IDocxParseOptions\r\n} from './types'\r\n\r\nexport { DocxParser } from './docx.parser'\r\n\r\nimport { DocxParser } from './docx.parser'\r\nimport type { IDocxParseOptions, IDocxParseResult } from './types'\r\n\r\n/**\r\n * 创建解析器实例的工厂函数\r\n */\r\nexport function createDocxParser(options?: IDocxParseOptions): DocxParser {\r\n return new DocxParser(options)\r\n}\r\n\r\n/**\r\n * 快捷解析函数(保持与旧 API 兼容)\r\n */\r\nexport async function parseDocx(\r\n data: ArrayBuffer | File,\r\n options?: IDocxParseOptions\r\n): Promise<IDocxParseResult> {\r\n const parser = createDocxParser(options)\r\n\r\n if (data instanceof File) {\r\n return parser.parseFromFile(data)\r\n }\r\n\r\n return parser.parse(data)\r\n}\r\n\r\nexport default DocxParser\r\n"],"names":["collectGroupIds","elementList","groupIdSet","result","element","groupId","ElementType","tr","td","WorkerManager","draw","__publicField","event","id","success","data","error","pendingTask","options","DOCX_EDITOR_DATA_VERSION","DOCX_EDITOR_SCHEMA_VERSION","text","getTextFromElementList","_a","RuntimeWorker","type","payload","fallback","request","resolve","reject","key","message","WorkerComponent","base64ToArrayBuffer","base64","binaryString","bytes","i","escapeHtml","generateTableHtml","borderWidth","borderColor","borderStyle","isEmpty","isExternal","tableBorderStyle","tdBorderStyle","html","colspan","rowspan","item","ExportComponent","command","structureAdapter","callback","Document","Packer","Paragraph","TextRun","ImageRun","Table","TableRow","TableCell","WidthType","BorderStyle","children","mainData","currentParagraph","marker","imageData","width","height","imgError","normalizeBorderColor","color","c","getBorderStyle","borderType","noneBorderStyle","toDocxBorderSize","w","makeBorder","baseBorderSize","externalBorderSize","lineStyle","noneBorder","innerBorder","outerBorder","tableBorders","rows","cells","cellContent","cellBorders","tableError","textRunOptions","_b","doc","blob","styles","styleStr","classCallCheck","instance","Constructor","createClass","defineProperties","target","props","descriptor","protoProps","staticProps","slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","_i","_s","err","needle","len","pad","str","colorNames","printNum","num","decs","Color","r","g","b","a","that","parseString","input","_input$match$map","_input$match$map2","h","s","l","_input$match$map3","_input$match$map4","_r","_g","_a2","alpha","rgb","vals","x","mults","suff","hsl","hex","rgba","hash","_ref","_ref2","max","min","d","_ref3","_ref4","hue2rgb","p","q","t","EventBucket","handler","e","isMatch","parseHTML","htmlString","div","dragTrack","eventBucket","area","dragging","clamp","val","onMove","info","starting","bounds","y","relX","relY","onMouse","button","onTouch","BG_TRANSP","HUES","EVENT_KEY","EVENT_CLICK_OUTSIDE","EVENT_TAB_MOVE","$","selector","context","stopEvent","onKey","bucket","keys","stop","Picker","_this","settings","transfer","source","skipKeys","col","parent","openProxy","toFocus","doHide","knownTime","open","silent","flags","ex","hsla","colour","toggled","wrapper","_this2","dom","events","addEvent","editInput","popupCloseProxy","timeKeeper","onDoneProxy","elm","popup","cssClass","cssHue","cssHSL","cssHSLA","uiH","uiSL","uiA","thumbH","thumbSL","thumbA","posX","child","posY","opaque","transp","bg","format","value","actionIf","actionElse","toVisible","displayStyle","toggle","style","createIcon","content","createCellAlignIcon","horizontal","vertical","lineWidth","ICONS","TableContextMenu","menuItems","currentTd","borderExternalWidth","backgroundColor","isCrossRowCol","canCancelMerge","TableBorder","anchorElement","VerticalAlign","RowFlex","count","TdBorder","TdSlash","items","menu","EDITOR_PREFIX","divider","menuItem","rect","viewportWidth","viewportHeight","main","meta","iconSpan","labelSpan","evt","unitSpan","preview","shortcut","arrow","parentItem","layout","subMenu","childItem","parentRect","subMenuGap","subRect","clickHandler","_c","keyHandler","scrollHandler","action","times","positionContext","verticalAlign","rowFlex","currentVerticalAlign","currentHorizontalAlign","rowCol","selectedTds","seen","row","tdKey","hasChanged","j","endIndex","slashType","currentColor","nextColor","onApply","normalizedColor","panel","pickerHost","picker","doneButton","anchor","gap","margin","anchorRect","panelRect","left","top","trimmed","normalized","TableContextMenuComponent","convertPxToPaperSize","printImageBase64","base64List","direction","PaperDirection","iframe","contentWindow","container","paperSize","image","stylesheet","DocxEditor","editorOptions","mergeOption","deepClone","headerElementList","mainElementList","footerElementList","formatElementList","Listener","EventBus","Override","Draw","BlockParticle","HistoryComponent","ControlComponent","workerComponent","commandAdapt","CommandAdapt","pasteByApi","Command","GadgetComponent","CommentComponent","RevisionComponent","keymapComponent","KeymapComponent","floatingBar","FloatingBar","Register","plugin","Plugin","I18n","_draw","_locale","_lang","Actuator","_options","getClipboardData","clipboardText","EDITOR_CLIPBOARD","removeClipboardData","getIsClipboardContainFile","clipboardData","isFile","DEFAULT_OPTIONS","NS","twipToPx","twip","halfPtToPx","halfPt","emuToPx","emu","eighthPtToPx","HIGHLIGHT_COLOR_MAP","FONT_NORMALIZE_MAP","normalizeFont","rawFontName","NUM_FMT_MAP","ALIGNMENT_MAP","BORDER_TYPE_MAP","THEME_COLOR_SEMANTIC_MAP","parseXml","xmlString","getChildrenByTag","ns","localName","getFirstChildByTag","getWVal","el","forEachChild","hasChild","parseTheme","themeXml","root","parseColorScheme","parseFontScheme","clrSchemes","clrScheme","slotEl","slotName","srgbClr","sysClr","lastClr","fontSchemes","fontScheme","majorFontEl","resolveFontFromSchemeElement","minorFontEl","schemeEl","ea","typeface","latin","resolveThemeColor","theme","themeColorName","themeTint","themeShade","rgbToHsl","lightness","factor","nr","ng","nb","hslToRgb","toHex2","resolveThemeFont","fontRef","lower","delta","v","hueToRgbChannel","StyleResolver","stylesXml","pPr","jcEl","parseSpacingProperties","parseIndentProperties","shdEl","fill","resolveShdFill","outlineLvlEl","level","numPrEl","numIdEl","ilvlEl","levelVal","tabsEl","parseTabStops","rPr","bEl","iEl","uEl","sEl","szEl","rFontsEl","resolveRunFont","colorEl","resolveRunColor","highlightEl","charSpacingEl","px","vertAlignEl","styleId","chain","currentId","visited","def","mergeInto","xml","docDefaultsEl","styleEls","rPrDefaultEl","rPrEl","pPrDefaultEl","pPrEl","styleEl","nameEl","name","basedOnEl","basedOnId","paragraphStyle","runStyle","detectHeadingLevel","spacingEl","before","after","line","lineRule","lineVal","indEl","right","firstLine","hanging","leftPx","hangingPx","stops","tabEls","tabEl","pos","eastAsia","ascii","hAnsi","eastAsiaTheme","asciiTheme","themeFont","tint","shade","shd","shdVal","resolveShdForegroundColor","themeFill","resolved","isWhiteOrTransparent","themeColor","styleName","patterns","re","m","NumberingResolver","numberingXml","numId","numRef","abstractNum","override","levelDef","abstractNumEls","abstractNumId","levels","lvlEls","lvlEl","ilvlAttr","ilvl","parseLevelDefinition","numEls","abstractNumIdEl","levelOverrides","lvlOverrideEls","lvlOverrideEl","startOverrideEl","mapped","isBulletLvlText","numFmtEl","numFmt","lvlTextEl","lvlText","startEl","start","indentLeft","indentHanging","parseRelationships","relsXml","map","footnoteCounter","parseRun","runEl","styleResolver","_theme","baseRunStyle","chunks","localStyle","mergedStyle","mergeRunStyles","lastBreakType","tag","breakTypeAttr","resolvedBreakType","resolveBreakType","charCode","codePoint","typeAttr","base","local","merged","parseImage","drawingEl","rels","mediaMap","pageMargins","inline","extent","cx","cy","blips","blip","rId","rel","mediaPath","src","display","floatPosition","resolveAnchorDisplay","margins","posH","posV","relFrom","posOffset","offset","align","resolveHAlign","resolveVAlign","imgWidth","contentWidth","imgHeight","contentHeight","behindDoc","wrapNone","wrapSquare","wrapTight","wrapThrough","wrapTopAndBottom","parseChart","documentRels","chartRelsMap","chartElements","chartEl","chartPath","chartRelsPath","chartRelsXml","chartRels","entry","imagePath","resolveRelativePath","embedId","imgRel","isChartDrawing","basePath","relativePath","baseDir","parts","baseParts","part","DEFAULT_HYPERLINK_COLOR","parseHyperlink","hyperlinkEl","url","resolveHyperlinkUrl","runChunks","chunk","applyHyperlinkDefaults","rawRevId","revAuthor","revDate","revId","ci","revision","insChild","delChild","parseParagraph","paragraphEl","numberingResolver","defaultFontSize","pStyleEl","localParaStyle","mergeDefinedProps","localRunStyle","detectHeadingByStyleId","numInfo","fieldState","childNs","processFieldChar","newState","cachedChunks","collectCachedFieldText","processRunElement","hlChunk","processAlternateContentElement","mathChunks","extractMathText","commentId","placeholderSize","currentState","setState","fldChar","instrText","fldCharType","_createChunk","pictEl","mcEl","choiceEl","fallbackEl","imgChunk","extractTextBoxContent","parsePictureImage","handled","containerEl","txbxContents","txbxContent","isFirstParagraph","pChild","NS_VML","imageDataList","shapeEls","widthMatch","heightMatch","oMathEl","mathTextEls","m1","m2","parseTable","tableEl","colWidths","parseTableGrid","parseTableBorders","trElements","rawRows","trEl","parseTableRow","resolveVerticalMerge","tblGridEl","colEl","tblPrEl","tblBordersEl","topBorderEl","sz","rowEl","trPrEl","trHeightEl","hRule","tcEl","parseTableCell","cellEl","tcPrEl","gridSpanEl","vMerge","vMergeEl","vAlignEl","tcWEl","wType","borderTypes","parseCellBorders","paragraphs","parseCellContent","tcBordersEl","sides","types","hasAnyBorder","side","borderEl","nestedTable","sdtContentEl","sdtChild","mergeTracker","rowIdx","rawRow","colIndex","rawCell","buildCellNode","tracker","raw","isTocSdt","sdtEl","sdtPr","docPartObj","gallery","alias","aliasVal","tagVal","sdtContent","instrTexts","parseTocContent","parseSectionProperties","sectPrEl","typeEl","typeVal","colsEl","numAttr","spaceAttr","sepAttr","buildColumnNode","sectionProps","targetInnerWidth","columns","colSpace","separator","calculatedColWidths","calculateColumnWidths","columnGroups","groupParagraphsByColumnBreak","declaredWidths","totalGap","colWidth","groups","para","chunksWithoutBreak","NS_CHART","NS_A","parseOoxmlChartToOption","chartXml","extractChartData","buildEChartsOption","chartEls","title","extractTitle","plotAreaEls","plotArea","chartTypeMap","xmlTag","chartType","chartTypeEls","seriesData","extractSeriesFromChartType","titleEls","tEls","vEls","chartTypeEl","serEls","series","categories","serEl","extractSeriesName","extractCategories","values","extractValues","maxLen","_","txEls","getDirectChildren","cacheVals","extractCacheValues","catEls","strVals","numVals","valEls","parentEl","cacheTag","cacheEls","ptEls","indexed","pt","idx","baseOption","pieData","cat","maxVal","indicator","echartsType","parseComments","commentsXml","commentEls","commentEl","author","date","initials","extractCommentText","texts","rChild","ZERO_WIDTH_SPACE","TITLE_LEVEL_MAP","VERTICAL_ALIGN_MAP","elementIdCounter","generateElementId","buildElements","nodes","_commentMetas","elements","activeCommentIds","defaultSize","processedNodes","collapseEmptyParagraphs","prevEndSize","node","isFirst","buildParagraph","buildTable","buildColumn","emptyCount","flushEmpty","accumulated","isParagraphEmpty","forceLineHeight","paragraphAttrs","isTitled","isList","separatorEl","contentElements","buildChunk","applyRowFlexToChildren","titleEl","listEl","resolveEndSize","size","buildTextChunk","buildImageChunk","buildHyperlinkChunk","buildBreakChunk","char","applyRunStyle","normalizeImageDisplay","valueList","textChunk","_defaultSize","table","tableWidthMode","defaultRowHeight","defaultTdPadding","totalWidth","ratio","colgroup","trList","tdList","cell","cellElements","pi","isNestedTableParagraph","column","columnId","colIdx","group","lastEl","DocxParser","arrayBuffer","zip","JSZip","documentXml","chartXmlMap","workerRequest","msg","file","renderChartToDataUrl","renderer","option","pr","commentMetasMap","bodyElements","body","extractPageMargins","docNodes","pendingSectionParagraphs","pendingBodyCommentMarkers","flushSectionParagraphs","injectPendingCommentMarkers","injectChartChunks","targetWidth","bt","processSdtElement","xmlChild","comments","path","MIME_MAP","promises","zipEntry","ext","dataUrl","wNs","tocParagraphs","drawings","drawing","chartImage","renderChartFromXml","renderFn","defaults","pgMarEl","toNum","attr","toPx","bottom","createDocxParser","parseDocx","parser"],"mappings":"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AAO,MAAM,UAAU,IAAI,SAAS,IAAI,QAAQ,KAAK,SAAS,MAAM,UAAU,KAAK,UAAU,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,MAAM,UAAU,MAAM,OAAO,MAAM,UAAU,IAAI,QAAQ,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,SAAS,KAAK,SAAS,MAAM,QAAQ,MAAM,SAAS,KAAK,UAAU,KAAK,UAAU,MAAM,UAAU,MAAM,OAAO,KAAK,UAAU,KAAK,OAAO,MAAM,UAAU,IAAI,SAAS,GAAG,OAAO,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,MAAM,UAAU,KAAK,SAAS,MAAM,QAAQ,KAAK,UAAU,IAAI,SAAS,IAAI,KAAK,KAAK,SAAS,KAAK,UAAU,KAAK,OAAO,MAAM,SAAS,MAAM,OAAO,IAAI,UAAU,KAAK,SAAS,KAAK,UAAU,MAAM,SAAS,KAAK,UAAU,MAAM,UAAU,MAAM,QAAQ,MAAM,QAAQ,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,IAAI,MAAM,GAAG,QAAQ,MAAM,UAAU,IAAI,SAAS,MAAM,OAAO,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAQ,MAAM,UAAU,MAAM,UAAU,KAAK,UAAU,MAAM,UAAU,IAAI,SAAS,KAAK,UAAU,MAAM,UAAU,MAAM,UAAU,KAAK,SAAS,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,SAAS,GAAG,SAAS,KAAK,UAAU,KAAK,OAAO,MAAM,OAAO,KAAK,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,QAAQ,MAAM,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,MAAM,KAAK,UAAU,IAAI,UAAU,MAAM,UAAU,KAAK,SAAS,KAAK,SAAS,MAAM,UAAU,KAAK,OAAO,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,MAAM,UAAU,KAAK,OAAO,GAAG,SAAS,KAAK,UAAU,IAAI,UAAU,GAAG,SAAS,MAAM,UAAU,KAAK,QAAQ,MAAM,UAAU,IAAI,UAAU,KAAK,SAAS,KAAK,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,SAAQ;AAEv9D,SAASC,GAASC,GAAK;AACnB,MAAIC,IAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,GAE3EJ,IAAMI,IAAO,IAAID,EAAI,QAAQC,CAAI,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE,IAAID,EAAI,SAAQ;AAC3F,SAAOH,KAAO;AAClB;AAEA,IAAIK,KAAQ,WAAY;AACpB,WAASA,EAAMC,GAAGC,GAAGC,GAAGC,GAAG;AACvB,IAAAhC,GAAe,MAAM4B,CAAK;AAG1B,QAAIK,IAAO;AACX,aAASC,EAAYC,GAAO;AAExB,UAAIA,EAAM,WAAW,KAAK,GAAG;AACzB,YAAIC,IAAmBD,EAAM,MAAM,eAAe,EAAE,IAAI,MAAM,GAC1DE,IAAoB3B,GAAc0B,GAAkB,CAAC,GACrDE,IAAID,EAAkB,CAAC,GACvBE,IAAIF,EAAkB,CAAC,GACvBG,IAAIH,EAAkB,CAAC,GACvBnH,IAAKmH,EAAkB,CAAC;AAE5B,QAAInH,MAAO,WACPA,IAAK,IAGToH,KAAK,KACLC,KAAK,KACLC,KAAK,KACLP,EAAK,OAAO,CAACK,GAAGC,GAAGC,GAAGtH,CAAE;AAAA,MAC5B,WAAWiH,EAAM,WAAW,KAAK,GAAG;AAChC,YAAIM,IAAoBN,EAAM,MAAM,eAAe,EAAE,IAAI,MAAM,GAC3DO,IAAoBhC,GAAc+B,GAAmB,CAAC,GACtDE,IAAKD,EAAkB,CAAC,GACxBE,IAAKF,EAAkB,CAAC,GACxB/C,IAAK+C,EAAkB,CAAC,GACxBG,IAAMH,EAAkB,CAAC;AAE7B,QAAIG,MAAQ,WACRA,IAAM,IAGVZ,EAAK,OAAO,CAACU,GAAIC,GAAIjD,GAAIkD,CAAG;AAAA,MAChC;AACI,QAAIV,EAAM,WAAW,GAAG,IACpBF,EAAK,OAAOL,EAAM,SAASO,CAAK,IAEhCF,EAAK,OAAOL,EAAM,UAAUO,CAAK,KAAKP,EAAM,SAASO,CAAK;AAAA,IAGtE;AAEA,QAAIN,MAAM,OAAkB,KAAI,MAAM,QAAQA,CAAC;AAC3C,WAAK,OAAOA;AAAA,aACLE,MAAM,QAAW;AACxB,UAAIzD,IAAQuD,KAAK,KAAKA;AACtB,MAAIvD,KACA4D,EAAY5D,EAAM,aAAa;AAAA,IAEvC;AACI,WAAK,OAAO,CAACuD,GAAGC,GAAGC,GAAGC,MAAM,SAAY,IAAIA,CAAC;AAAA,EAErD;AAEA,SAAA7B,GAAYyB,GAAO,CAAC;AAAA,IAChB,KAAK;AAAA,IACL,OAAO,SAAkBkB,GAAO;AAC5B,UAAIC,IAAMD,IAAQ,KAAK,OAAO,KAAK,KAAK,MAAM,GAAG,CAAC,GAC9CE,IAAOD,EAAI,IAAI,SAAUE,GAAGhH,GAAG;AAC/B,eAAOwF,GAASwB,GAAGhH,MAAM,IAAI,IAAI,CAAC;AAAA,MACtC,CAAC;AAED,aAAO6G,IAAQ,UAAUE,IAAO,MAAM,SAASA,IAAO;AAAA,IAC1D;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAkBF,GAAO;AAC5B,UAAII,IAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,GACzBC,IAAO,CAAC,IAAI,KAAK,KAAK,EAAE,GAExBC,IAAMN,IAAQ,KAAK,OAAO,KAAK,KAAK,MAAM,GAAG,CAAC,GAC9CE,IAAOI,EAAI,IAAI,SAAUH,GAAGhH,GAAG;AAC/B,eAAOwF,GAASwB,IAAIC,EAAMjH,CAAC,GAAGA,MAAM,IAAI,IAAI,CAAC,IAAIkH,EAAKlH,CAAC;AAAA,MAC3D,CAAC;AAED,aAAO6G,IAAQ,UAAUE,IAAO,MAAM,SAASA,IAAO;AAAA,IAC1D;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAkBF,GAAO;AAC5B,UAAIO,IAAM,KAAK;AACf,aAAOP,IAAQO,IAAMA,EAAI,UAAU,GAAG,CAAC;AAAA,IAC3C;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,KAAK,WAAe;AAChB,UAAI,KAAK;AACL,eAAO,KAAK;AAEhB,UAAI,CAAC,KAAK;AACN,cAAM,IAAI,MAAM,iBAAiB;AAGrC,aAAO,KAAK,QAAQzB,EAAM,SAAS,KAAK,KAAK;AAAA,IACjD;AAAA,IACA,KAAK,SAAamB,GAAK;AACnB,MAAIA,EAAI,WAAW,MACfA,EAAI,CAAC,IAAI,IAGb,KAAK,QAAQA,GACb,KAAK,QAAQ;AAAA,IACjB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,KAAK,WAAe;AAChB,aAAO,KAAK,SAAQ;AAAA,IACxB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,KAAK,WAAe;AAChB,aAAO,KAAK,SAAS,EAAI;AAAA,IAC7B;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,KAAK,WAAe;AAChB,UAAI,KAAK;AACL,eAAO,KAAK;AAEhB,UAAI,CAAC,KAAK;AACN,cAAM,IAAI,MAAM,iBAAiB;AAGrC,aAAO,KAAK,QAAQnB,EAAM,SAAS,KAAK,KAAK;AAAA,IACjD;AAAA,IACA,KAAK,SAAawB,GAAK;AACnB,MAAIA,EAAI,WAAW,MACfA,EAAI,CAAC,IAAI,IAGb,KAAK,QAAQA,GACb,KAAK,QAAQ;AAAA,IACjB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,KAAK,WAAe;AAChB,aAAO,KAAK,SAAQ;AAAA,IACxB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,KAAK,WAAe;AAChB,aAAO,KAAK,SAAS,EAAI;AAAA,IAC7B;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,KAAK,WAAe;AAChB,UAAIL,IAAM,KAAK,MACXM,IAAMN,EAAI,IAAI,SAAUE,GAAGhH,GAAG;AAC9B,eAAOA,IAAI,IAAIgH,EAAE,SAAS,EAAE,IAAI,KAAK,MAAMA,IAAI,GAAG,EAAE,SAAS,EAAE;AAAA,MACnE,CAAC;AAED,aAAO,MAAMI,EAAI,IAAI,SAAUJ,GAAG;AAC9B,eAAOA,EAAE,SAAS,GAAG,GAAG;AAAA,MAC5B,CAAC,EAAE,KAAK,EAAE;AAAA,IACd;AAAA,IACA,KAAK,SAAaI,GAAK;AACnB,WAAK,OAAOzB,EAAM,SAASyB,CAAG;AAAA,IAClC;AAAA,EACR,CAAK,GAAG,CAAC;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAkBlB,GAAO;AAE5B,UAAIkB,KAAOlB,EAAM,WAAW,GAAG,IAAIA,EAAM,MAAM,CAAC,IAAIA,GAAO,QAAQ,aAAa,KAAK,EAAE,QAAQ,sBAAsB,kBAAkB,EAAE,QAAQ,aAAa,MAAM;AAEpK,UAAI,CAACkB,EAAI,MAAM,oBAAoB;AAC/B,cAAM,IAAI,MAAM,wBAAwBlB,CAAK;AAGjD,UAAImB,IAAOD,EAAI,MAAM,4BAA4B,EAAE,MAAM,CAAC,EAAE,IAAI,SAAUJ,GAAG;AACzE,eAAO,SAASA,GAAG,EAAE;AAAA,MACzB,CAAC;AAED,aAAAK,EAAK,CAAC,IAAIA,EAAK,CAAC,IAAI,KACbA;AAAA,IACX;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAmBnB,GAAO;AAE7B,UAAIoB,IAAOpB,EAAM,cAAc,QAAQ,MAAM,GAAG,EAAE,QAAQ,gBAAgB,EAAE,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,GAAG,EAAE,MAAM,IAAI,CAAC,GAC5HkB,IAAM7B,GAAW+B,CAAI;AACzB,aAAOF,MAAQ,SAAYA,IAAMzB,EAAM,SAASyB,EAAI,QAAQ,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IAC7F;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAkBG,GAAM;AAC3B,UAAIC,IAAQ/C,GAAc8C,GAAM,CAAC,GAC7B,IAAIC,EAAM,CAAC,GACX3B,IAAI2B,EAAM,CAAC,GACX1B,IAAI0B,EAAM,CAAC,GACX,IAAIA,EAAM,CAAC;AAEf,WAAK,KACL3B,KAAK,KACLC,KAAK;AAEL,UAAI2B,IAAM,KAAK,IAAI,GAAG5B,GAAGC,CAAC,GACtB4B,IAAM,KAAK,IAAI,GAAG7B,GAAGC,CAAC,GACtBO,IAAI,QACJC,IAAI,QACJC,KAAKkB,IAAMC,KAAO;AAEtB,UAAID,MAAQC;AACR,QAAArB,IAAIC,IAAI;AAAA,WACL;AACH,YAAIqB,IAAIF,IAAMC;AAEd,gBADApB,IAAIC,IAAI,MAAMoB,KAAK,IAAIF,IAAMC,KAAOC,KAAKF,IAAMC,IACvCD,GAAG;AAAA,UACP,KAAK;AACD,YAAApB,KAAKR,IAAIC,KAAK6B,KAAK9B,IAAIC,IAAI,IAAI;AAAG;AAAA,UACtC,KAAKD;AACD,YAAAQ,KAAKP,IAAI,KAAK6B,IAAI;AAAE;AAAA,UACxB,KAAK7B;AACD,YAAAO,KAAK,IAAIR,KAAK8B,IAAI;AAAE;AAAA,QAC5C;AAEgB,QAAAtB,KAAK;AAAA,MACT;AAEA,aAAO,CAACA,GAAGC,GAAGC,GAAG,CAAC;AAAA,IACtB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAkBqB,GAAO;AAC5B,UAAIC,IAAQpD,GAAcmD,GAAO,CAAC,GAC9BvB,IAAIwB,EAAM,CAAC,GACXvB,IAAIuB,EAAM,CAAC,GACXtB,IAAIsB,EAAM,CAAC,GACX,IAAIA,EAAM,CAAC,GAEXjC,IAAI,QACJC,IAAI,QACJC,IAAI;AAER,UAAIQ,MAAM;AACN,QAAAV,IAAIC,IAAIC,IAAIS;AAAA,WACT;AACH,YAAIuB,IAAU,SAAiBC,GAAGC,GAAGC,GAAG;AAGpC,iBAFIA,IAAI,MAAGA,KAAK,IACZA,IAAI,MAAGA,KAAK,IACZA,IAAI,sBAAcF,KAAKC,IAAID,KAAK,IAAIE,IACpCA,IAAI,MAAcD,IAClBC,IAAI,qBAAcF,KAAKC,IAAID,MAAM,qBAAQE,KAAK,IAC3CF;AAAA,QACX,GAEIC,IAAIzB,IAAI,MAAMA,KAAK,IAAID,KAAKC,IAAID,IAAIC,IAAID,GACxCyB,IAAI,IAAIxB,IAAIyB;AAEhB,QAAApC,IAAIkC,EAAQC,GAAGC,GAAG3B,IAAI,IAAI,CAAC,GAC3BR,IAAIiC,EAAQC,GAAGC,GAAG3B,CAAC,GACnBP,IAAIgC,EAAQC,GAAGC,GAAG3B,IAAI,IAAI,CAAC;AAAA,MAC/B;AAEA,UAAIgB,IAAO,CAACzB,IAAI,KAAKC,IAAI,KAAKC,IAAI,GAAG,EAAE,IAAI,KAAK,KAAK;AACrD,aAAAuB,EAAK,CAAC,IAAI,GAEHA;AAAA,IACX;AAAA,EACR,CAAK,CAAC,GACK1B;AACX,EAAC,GAEGuC,KAAc,WAAY;AAC1B,WAASA,IAAc;AACnB,IAAAnE,GAAe,MAAMmE,CAAW,GAEhC,KAAK,UAAU,CAAA;AAAA,EACnB;AAEA,SAAAhE,GAAYgE,GAAa,CAAC;AAAA,IACtB,KAAK;AAAA,IACL,OAAO,SAAa9D,GAAQjF,GAAMgJ,GAAS;AACvC,MAAA/D,EAAO,iBAAiBjF,GAAMgJ,GAAS,EAAK,GAC5C,KAAK,QAAQ,KAAK;AAAA,QACd,QAAQ/D;AAAA,QACR,MAAMjF;AAAA,QACN,SAASgJ;AAAA,MACzB,CAAa;AAAA,IACL;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAgB/D,GAAQjF,GAAMgJ,GAAS;AAC1C,WAAK,UAAU,KAAK,QAAQ,OAAO,SAAUC,GAAG;AAC5C,YAAIC,IAAU;AACd,eAAIjE,KAAUA,MAAWgE,EAAE,WACvBC,IAAU,KAEVlJ,KAAQA,MAASiJ,EAAE,SACnBC,IAAU,KAEVF,KAAWA,MAAYC,EAAE,YACzBC,IAAU,KAGVA,KACAH,EAAY,UAAUE,EAAE,QAAQA,EAAE,MAAMA,EAAE,OAAO,GAE9C,CAACC;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,WAAmB;AACtB,WAAK,QAAQ,QAAQ,SAAU,GAAG;AAC9B,eAAOH,EAAY,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO;AAAA,MAC5D,CAAC,GACD,KAAK,UAAU,CAAA;AAAA,IACnB;AAAA,EACR,CAAK,GAAG,CAAC;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAmB9D,GAAQjF,GAAMgJ,GAAS;AAC7C,MAAA/D,EAAO,oBAAoBjF,GAAMgJ,GAAS,EAAK;AAAA,IACnD;AAAA,EACR,CAAK,CAAC,GACKD;AACX,EAAC;AAED,SAASI,GAAUC,GAAY;AAE3B,MAAIC,IAAM,SAAS,cAAc,KAAK;AACtC,SAAAA,EAAI,YAAYD,GACTC,EAAI;AACf;AAEA,SAASC,GAAUC,GAAaC,GAAM1H,GAAU;AAC5C,MAAI2H,IAAW;AAEf,WAASC,EAAMC,GAAKpB,GAAKD,GAAK;AAC1B,WAAO,KAAK,IAAIC,GAAK,KAAK,IAAIoB,GAAKrB,CAAG,CAAC;AAAA,EAC3C;AAEA,WAASsB,EAAOX,GAAGY,GAAMC,GAAU;AAI/B,QAHIA,MACAL,IAAW,KAEX,EAACA,GAIL;AAAA,MAAAR,EAAE,eAAc;AAEhB,UAAIc,IAASP,EAAK,sBAAqB,GACnChG,IAAIuG,EAAO,OACX7C,IAAI6C,EAAO,QACXlC,IAAIgC,EAAK,SACTG,IAAIH,EAAK,SAETI,IAAOP,EAAM7B,IAAIkC,EAAO,MAAM,GAAGvG,CAAC,GAClC0G,IAAOR,EAAMM,IAAID,EAAO,KAAK,GAAG7C,CAAC;AAErC,MAAApF,EAASmI,IAAOzG,GAAG0G,IAAOhD,CAAC;AAAA;AAAA,EAC/B;AAEA,WAASiD,EAAQlB,GAAGa,GAAU;AAC1B,QAAIM,IAASnB,EAAE,YAAY,SAAYA,EAAE,QAAQA,EAAE;AACnD,IAAImB,MAAW,IACXR,EAAOX,GAAGA,GAAGa,CAAQ,IAErBL,IAAW;AAAA,EAEnB;AAEA,WAASY,EAAQpB,GAAGa,GAAU;AAC1B,IAAIb,EAAE,QAAQ,WAAW,IACrBW,EAAOX,GAAGA,EAAE,QAAQ,CAAC,GAAGa,CAAQ,IAEhCL,IAAW;AAAA,EAEnB;AAEA,EAAAF,EAAY,IAAIC,GAAM,aAAa,SAAUP,GAAG;AAC5C,IAAAkB,EAAQlB,GAAG,EAAI;AAAA,EACnB,CAAC,GACDM,EAAY,IAAIC,GAAM,cAAc,SAAUP,GAAG;AAC7C,IAAAoB,EAAQpB,GAAG,EAAI;AAAA,EACnB,CAAC,GACDM,EAAY,IAAI,QAAQ,aAAaY,CAAO,GAC5CZ,EAAY,IAAIC,GAAM,aAAaa,CAAO,GAC1Cd,EAAY,IAAI,QAAQ,WAAW,SAAUN,GAAG;AAC5C,IAAAQ,IAAW;AAAA,EACf,CAAC,GACDF,EAAY,IAAIC,GAAM,YAAY,SAAUP,GAAG;AAC3C,IAAAQ,IAAW;AAAA,EACf,CAAC,GACDF,EAAY,IAAIC,GAAM,eAAe,SAAUP,GAAG;AAC9C,IAAAQ,IAAW;AAAA,EACf,CAAC;AACL;AAEA,IAAIa,KAAY;AAAA,8HACZC,KAAO,KAEPC,KAAY,WACZC,KAAsB,aACtBC,KAAiB;AAErB,SAASC,EAAEC,GAAUC,GAAS;AAC1B,UAAQA,KAAW,UAAU,cAAcD,CAAQ;AACvD;AAEA,SAASE,GAAU7B,GAAG;AAElB,EAAAA,EAAE,eAAc,GAChBA,EAAE,gBAAe;AACrB;AACA,SAAS8B,GAAMC,GAAQ/F,GAAQgG,GAAMjC,GAASkC,GAAM;AAChD,EAAAF,EAAO,IAAI/F,GAAQuF,IAAW,SAAUvB,GAAG;AACvC,IAAIgC,EAAK,QAAQhC,EAAE,GAAG,KAAK,KAIvBD,EAAQC,CAAC;AAAA,EAEjB,CAAC;AACL;AAEA,IAAIkC,KAAS,WAAY;AACrB,WAASA,EAAO1L,GAAS;AACrB,IAAAmF,GAAe,MAAMuG,CAAM,GAG3B,KAAK,WAAW;AAAA,MAEZ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IAC1B,GAEQ,KAAK,UAAU,IAAIpC,GAAW,GAE9B,KAAK,WAAW,MAEhB,KAAK,SAAS,MAEd,KAAK,SAAS,MAEd,KAAK,UAAU,MAEf,KAAK,WAAWtJ,CAAO;AAAA,EAC3B;AAEA,SAAAsF,GAAYoG,GAAQ,CAAC;AAAA,IACjB,KAAK;AAAA,IACL,OAAO,SAAoB1L,GAAS;AAChC,UAAI2L,IAAQ;AAEZ,UAAI,CAAC3L;AACD;AAEJ,UAAI4L,IAAW,KAAK;AAEpB,eAASC,EAASC,GAAQtG,GAAQuG,GAAU;AACxC,iBAASlL,KAAOiL;AAKZ,UAAAtG,EAAO3E,CAAG,IAAIiL,EAAOjL,CAAG;AAAA,MAEhC;AAEA,UAAIb,aAAmB;AACnB,QAAA4L,EAAS,SAAS5L;AAAA,WACf;AAEH,QAAI4L,EAAS,UAAU5L,EAAQ,UAAU4L,EAAS,WAAW5L,EAAQ,WACjE,KAAK,QAAQ,OAAO4L,EAAS,MAAM,GACnC,KAAK,eAAe,KAGxBC,EAAS7L,GAAS4L,CAAQ,GAEtB5L,EAAQ,aACR,KAAK,WAAWA,EAAQ,WAExBA,EAAQ,WACR,KAAK,SAASA,EAAQ,SAEtBA,EAAQ,WACR,KAAK,SAASA,EAAQ,SAEtBA,EAAQ,YACR,KAAK,UAAUA,EAAQ;AAG3B,YAAIgM,IAAMhM,EAAQ,SAASA,EAAQ;AACnC,QAAIgM,KACA,KAAK,UAAUA,CAAG;AAAA,MAE1B;AAEA,UAAIC,IAASL,EAAS;AACtB,UAAIK,KAAUL,EAAS,SAAS,CAAC,KAAK,cAAc;AAEhD,YAAIM,IAAY,SAAmB1C,GAAG;AAClC,iBAAOmC,EAAM,YAAYnC,CAAC;AAAA,QAC9B;AAEA,aAAK,QAAQ,IAAIyC,GAAQ,SAASC,CAAS,GAE3CZ,GAAM,KAAK,SAASW,GAAQ,CAAC,KAAK,YAAY,OAAO,GAAGC,CAAS,GAEjE,KAAK,eAAe;AAAA,MACxB,MAAO,CAAIlM,EAAQ,UAAU,CAAC4L,EAAS,SACnC,KAAK,KAAI;AAAA,IAEjB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAqB,GAAG;AAC3B,UAAI,KAAK,QAAQ;AAEb,aAAK,EAAE,eAAc,GAErB,KAAK,SAAS,OAAO,MAAM,gBAAgB;AAE3C,YAAIO,IAAU,KAAK,EAAE,SAASpB,KAAY,KAAK,WAAW,KAAK;AAC/D,mBAAW,WAAY;AACnB,iBAAOoB,EAAQ,MAAK;AAAA,QACxB,GAAG,GAAG,GAEF,KAAK,UACL,KAAK,OAAO,KAAK,MAAM;AAAA,MAE/B;AAAA,IACJ;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAsB,GAAG;AAC5B,UAAIzM,IAAQ,KAAK,EAAE,MACf0M,IAAS;AAEb,UAAI,CAAC;AACD,QAAAA,IAAS;AAAA,eACF1M,MAAUsL,MAAuBtL,MAAUuL,IAAgB;AAElE,YAAIoB,KAAa,KAAK,oBAAoB,KAAK;AAC/C,QAAI,EAAE,YAAYA,MACdD,IAAS;AAAA,MAEjB;AAEI,QAAAf,GAAU,CAAC,GAEXe,IAAS;AAGb,MAAIA,KAAU,KAAK,WACf,KAAK,SAAS,OAAO,MAAM,gBAAgB,IAEvC1M,MAAUsL,MACV,KAAK,SAAS,OAAO,MAAK,GAG1B,KAAK,WACL,KAAK,QAAQ,KAAK,MAAM;AAAA,IAGpC;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAmBhL,GAASsM,GAAM;AAErC,WAAK,aAAY,GAEjB,KAAK,WAAWtM,CAAO,GACnBsM,KACA,KAAK,YAAW;AAAA,IAExB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAkB7I,GAAO8I,GAAQ;AACpC,WAAK,UAAU9I,GAAO,EAAE,QAAQ8I,EAAM,CAAE;AAAA,IAC5C;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAmB9I,GAAO+I,GAAO;AAIpC,UAHI,OAAO/I,KAAU,aACjBA,IAAQA,EAAM,KAAI,IAElB,EAACA,GAIL;AAAA,QAAA+I,IAAQA,KAAS,CAAA;AACjB,YAAI9I,IAAI;AACR,YAAI;AAEA,UAAAA,IAAI,IAAIqD,GAAMtD,CAAK;AAAA,QACvB,SAASgJ,GAAI;AACT,cAAID,EAAM;AACN;AAEJ,gBAAMC;AAAA,QACV;AAEA,YAAI,CAAC,KAAK,SAAS,OAAO;AACtB,cAAIC,IAAOhJ,EAAE;AACb,UAAAgJ,EAAK,CAAC,IAAI,GACVhJ,EAAE,OAAOgJ;AAAA,QACb;AACA,aAAK,SAAS,KAAK,QAAQhJ,GAC3B,KAAK,SAAS,MAAM,MAAM,MAAM,MAAM8I,CAAK;AAAA;AAAA,IAC/C;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAmBG,GAAQJ,GAAQ;AACtC,WAAK,SAASI,GAAQJ,CAAM;AAAA,IAChC;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,WAAgB;AACnB,UAAIN,IAAS,KAAK,SAAS;AAC3B,UAAI,CAACA;AACD,eAAO;AAGX,UAAI,KAAK,YAAY;AACjB,YAAIW,IAAU,KAAK,WAAW,EAAI;AAElC,oBAAK,aAAY,GAEVA;AAAA,MACX;AAEA,UAAI9K,IAAO,KAAK,SAAS,YAAY,ohBACjC+K,IAAUnD,GAAU5H,CAAI;AAE5B,kBAAK,aAAa+K,GAClB,KAAK,QAAQ3B,EAAE,eAAe2B,CAAO,GACrC,KAAK,SAAS3B,EAAE,cAAc2B,CAAO,GACrC,KAAK,QAAQ3B,EAAE,iBAAiB2B,CAAO,GACvC,KAAK,WAAW3B,EAAE,wBAAwB2B,CAAO,GACjD,KAAK,aAAa3B,EAAE,kBAAkB2B,CAAO,GAC7C,KAAK,WAAW3B,EAAE,uBAAuB2B,CAAO,GAChD,KAAK,aAAa3B,EAAE,yBAAyB2B,CAAO,GAEpDA,EAAQ,UAAU,IAAI,YAAY,KAAK,SAAS,MAAM,GACjD,KAAK,SAAS,SACfA,EAAQ,UAAU,IAAI,UAAU,GAE/B,KAAK,SAAS,UACfA,EAAQ,UAAU,IAAI,WAAW,GAEhC,KAAK,SAAS,gBACfA,EAAQ,UAAU,IAAI,WAAW,GAErC,KAAK,SAAS,WAAY;AACtB,eAAOA,EAAQ,UAAU,IAAI,OAAO;AAAA,MACxC,CAAC,GAED,KAAK,aAAY,GAEb,KAAK,SACL,KAAK,UAAS,IAEd,KAAK,UAAU,KAAK,SAAS,YAAY,GAE7C,KAAK,YAAW,GAET;AAAA,IACX;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,WAAgB;AACnB,aAAO,KAAK,WAAW,EAAK;AAAA,IAChC;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,WAAmB;AACtB,WAAK,QAAQ,QAAO,GAChB,KAAK,cACL,KAAK,SAAS,OAAO,YAAY,KAAK,UAAU;AAAA,IAExD;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,WAAuB;AAC1B,UAAIC,IAAS,MAET1F,IAAO,MACP2F,IAAM,KAAK,YACXC,IAAS,KAAK;AAElB,eAASC,EAASzH,GAAQjF,GAAMgJ,GAAS;AACrC,QAAAyD,EAAO,IAAIxH,GAAQjF,GAAMgJ,CAAO;AAAA,MACpC;AAEA,MAAA0D,EAASF,GAAK,SAAS,SAAUvD,GAAG;AAChC,eAAOA,EAAE,eAAc;AAAA,MAC3B,CAAC,GAEDK,GAAUmD,GAAQ,KAAK,OAAO,SAAU5E,GAAGmC,GAAG;AAC1C,eAAOnD,EAAK,SAASgB,CAAC;AAAA,MAC1B,CAAC,GAEDyB,GAAUmD,GAAQ,KAAK,QAAQ,SAAU5E,GAAGmC,GAAG;AAC3C,eAAOnD,EAAK,SAAS,MAAMgB,GAAG,IAAImC,CAAC;AAAA,MACvC,CAAC,GAEG,KAAK,SAAS,SACdV,GAAUmD,GAAQ,KAAK,OAAO,SAAU5E,GAAGmC,GAAG;AAC1C,eAAOnD,EAAK,SAAS,MAAM,MAAM,MAAM,IAAImD,CAAC;AAAA,MAChD,CAAC;AAGL,UAAI2C,IAAY,KAAK;AAEjB,MAAAD,EAASC,GAAW,SAAS,SAAU1D,GAAG;AACtC,QAAApC,EAAK,UAAU,KAAK,OAAO,EAAE,YAAY,IAAM,cAAc,IAAM;AAAA,MACvE,CAAC,GAED6F,EAASC,GAAW,SAAS,SAAU1D,GAAG;AACtC,YAAIlC,IAAQ;AAEZ,QAAIA,EAAM,mBAAmBA,EAAM,gBAC/BA,EAAM,OAAM;AAAA,MAEpB,CAAC,GAGL,KAAK,SAAS,WAAY;AAEtB,YAAI6F,IAAkB,SAAyB3D,GAAG;AAC9C,iBAAOsD,EAAO,aAAatD,CAAC;AAAA,QAChC;AAEA,QAAAyD,EAAS,QAAQjC,IAAqBmC,CAAe,GACrDF,EAAS,QAAQhC,IAAgBkC,CAAe,GAChD7B,GAAM0B,GAAQD,GAAK,CAAC,OAAO,QAAQ,GAAGI,CAAe;AAErD,YAAIC,IAAa,SAAoB5D,GAAG;AACpC,UAAAsD,EAAO,mBAAmBtD,EAAE;AAAA,QAChC;AACA,QAAAyD,EAASF,GAAK/B,IAAqBoC,CAAU,GAE7CH,EAASF,GAAK9B,IAAgBmC,CAAU,GAExCH,EAASH,EAAO,YAAY,SAASK,CAAe;AAAA,MACxD,CAAC;AAED,UAAIE,IAAc,SAAqB7D,GAAG;AACtC,QAAAsD,EAAO,SAAS,WAAY;AACxB,iBAAOA,EAAO,aAAatD,CAAC;AAAA,QAChC,CAAC,GACGsD,EAAO,UACPA,EAAO,OAAOA,EAAO,MAAM;AAAA,MAEnC;AACA,MAAAG,EAAS,KAAK,UAAU,SAASI,CAAW,GAC5C/B,GAAM0B,GAAQD,GAAK,CAAC,OAAO,GAAGM,CAAW;AAAA,IAC7C;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,WAAwB;AAC3B,UAAIpB,IAAS,KAAK,SAAS,QACvBqB,IAAM,KAAK;AAEf,MAAIrB,MAAWqB,EAAI,cACfrB,EAAO,YAAYqB,CAAG,GAG1B,KAAK,SAAS,SAAUC,GAAO;AAE3B,QAAI,iBAAiBtB,CAAM,EAAE,aAAa,aACtCA,EAAO,MAAM,WAAW;AAG5B,YAAIuB,IAAWD,MAAU,KAAO,gBAAgB,WAAWA;AAE3D,SAAC,aAAa,gBAAgB,cAAc,aAAa,EAAE,QAAQ,SAAU7J,GAAG;AAE5E,UAAIA,MAAM8J,IACNF,EAAI,UAAU,IAAI5J,CAAC,IAEnB4J,EAAI,UAAU,OAAO5J,CAAC;AAAA,QAE9B,CAAC,GAED4J,EAAI,UAAU,IAAIE,CAAQ;AAAA,MAC9B,CAAC;AAAA,IACL;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAkB/F,GAAGC,GAAGC,GAAGR,GAAGqF,GAAO;AACxC,MAAAA,IAAQA,KAAS,CAAA;AAEjB,UAAIR,IAAM,KAAK,QACXU,IAAOV,EAAI;AAEf,OAACvE,GAAGC,GAAGC,GAAGR,CAAC,EAAE,QAAQ,SAAUiB,GAAGhH,GAAG;AACjC,SAAIgH,KAAKA,MAAM,OACXsE,EAAKtL,CAAC,IAAIgH;AAAA,MAElB,CAAC,GACD4D,EAAI,OAAOU,GAEX,KAAK,UAAUF,CAAK,GAEhB,KAAK,YAAY,CAACA,EAAM,UACxB,KAAK,SAASR,CAAG;AAAA,IAEzB;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAmBQ,GAAO;AAC7B,UAAI,CAAC,KAAK;AACN;AAEJ,MAAAA,IAAQA,KAAS,CAAA;AAEjB,UAAIR,IAAM,KAAK,QACXzD,IAAMyD,EAAI,MACVyB,IAAS,SAASlF,EAAI,CAAC,IAAIuC,KAAO,gBAClC4C,IAAS1B,EAAI,WACb2B,IAAU3B,EAAI,YAEd4B,IAAM,KAAK,OACXC,IAAO,KAAK,QACZC,IAAM,KAAK,OACXC,IAAS7C,EAAE,oBAAoB0C,CAAG,GAClCI,IAAU9C,EAAE,oBAAoB2C,CAAI,GACpCI,IAAS/C,EAAE,oBAAoB4C,CAAG;AAEtC,eAASI,EAAKjC,GAAQkC,GAAO3D,GAAM;AAC/B,QAAA2D,EAAM,MAAM,OAAO3D,IAAO,MAAM;AAAA,MACpC;AACA,eAAS4D,EAAKnC,GAAQkC,GAAO1D,GAAM;AAC/B,QAAA0D,EAAM,MAAM,MAAM1D,IAAO,MAAM;AAAA,MACnC;AAEA,MAAAyD,EAAKN,GAAKG,GAAQxF,EAAI,CAAC,CAAC,GAExB,KAAK,OAAO,MAAM,kBAAkB,KAAK,MAAM,MAAM,QAAQkF,GAE7DS,EAAKL,GAAMG,GAASzF,EAAI,CAAC,CAAC,GAC1B6F,EAAKP,GAAMG,GAAS,IAAIzF,EAAI,CAAC,CAAC,GAE9BsF,EAAK,MAAM,QAAQH,GAEnBU,EAAKN,GAAKG,GAAQ,IAAI1F,EAAI,CAAC,CAAC;AAE5B,UAAI8F,IAASX,GACTY,IAASD,EAAO,QAAQ,OAAO,MAAM,EAAE,QAAQ,KAAK,MAAM,GAC1DE,IAAK,qBAAqB,CAACF,GAAQC,CAAM,IAAI;AAIjD,UAFA,KAAK,MAAM,MAAM,aAAaC,IAAK,OAAO1D,IAEtC,CAAC2B,EAAM,YAAY;AACnB,YAAIgC,IAAS,KAAK,SAAS,cACvBvG,IAAQ,KAAK,SAAS,OAEtBwG,IAAQ;AACZ,gBAAQD,GAAM;AAAA,UACV,KAAK;AACD,YAAAC,IAAQzC,EAAI,SAAS/D,CAAK;AAAE;AAAA,UAChC,KAAK;AACD,YAAAwG,IAAQzC,EAAI,SAAS/D,CAAK;AAAE;AAAA,UAChC;AACI,YAAAwG,IAAQzC,EAAI,SAAS/D,CAAK;AAAA,QAClD;AACgB,aAAK,SAAS,QAAQwG;AAAA,MAC1B;AAEA,WAAK,WAAW,MAAM,QAAQd;AAAA,IAClC;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAkBe,GAAUC,GAAY;AAC3C,MAAI,KAAK,SAAS,UAAU,KAAK,SAAS,QACtCD,KAAYA,EAAS,KAAK,SAAS,KAAK,IAExCC,KAAcA,EAAU;AAAA,IAEhC;AAAA,EACR,GAAO;AAAA,IACC,KAAK;AAAA,IACL,OAAO,SAAoBC,GAAW;AAClC,UAAI7B,IAAM,KAAK;AACf,UAAI,CAACA;AACD,eAAO;AAGX,UAAI8B,IAAeD,IAAY,KAAK,QAChCE,IAAS/B,EAAI,MAAM,YAAY8B;AAEnC,aAAIC,MACA/B,EAAI,MAAM,UAAU8B,IAEjBC;AAAA,IACX;AAAA,EACR,CAAK,CAAC,GACKpD;AACX,EAAC;AAED;AACI,MAAIqD,KAAQ,SAAS,cAAc,OAAO;AAC1C,EAAAA,GAAM,cAAc,mqIACpB,SAAS,gBAAgB,kBAAkB,YAAYA,EAAK,GAE5DrD,GAAO,eAAeqD;AAC1B;ACz8BA,MAAMC,IAAa,CAACC,MAAoB,kGAAkGA,CAAO,UAE3IC,IAAsB,CAC1BC,GACAC,MACG;AACH,QAAMC,IAAYF,MAAe,WAAW,MAAM,GAC5C/G,IACJ+G,MAAe,SACX,IACAA,MAAe,WACb,IAAIE,IAAY,IAChB,KAAKA;AAGb,SAAOL,EAAW;AAAA;AAAA,gBAEJ5G,CAAC,IAJLgH,MAAa,QAAQ,MAAMA,MAAa,WAAW,IAAI,IAI7C,IAAIhH,IAAIiH,CAAS;AAAA,GACpC;AACH,GAEMC,IAAQ;AAAA,EACZ,aAAaN,EAAW;AAAA;AAAA;AAAA,GAGvB;AAAA,EACD,WAAWA,EAAW;AAAA;AAAA;AAAA,GAGrB;AAAA,EACD,gBAAgBA,EAAW;AAAA;AAAA,GAE1B;AAAA,EACD,gBAAgBA,EAAW;AAAA;AAAA;AAAA,GAG1B;AAAA,EACD,YAAYA,EAAW;AAAA;AAAA;AAAA,GAGtB;AAAA,EACD,YAAYA,EAAW;AAAA;AAAA;AAAA,GAGtB;AAAA,EACD,aAAaA,EAAW;AAAA;AAAA;AAAA;AAAA,GAIvB;AAAA,EACD,aAAaA,EAAW;AAAA;AAAA;AAAA;AAAA,GAIvB;AAAA,EACD,WAAWE,EAAoB,UAAU,QAAQ;AAAA,EACjD,cAAcA,EAAoB,QAAQ,KAAK;AAAA,EAC/C,gBAAgBA,EAAoB,UAAU,KAAK;AAAA,EACnD,eAAeA,EAAoB,SAAS,KAAK;AAAA,EACjD,iBAAiBA,EAAoB,QAAQ,QAAQ;AAAA,EACrD,mBAAmBA,EAAoB,UAAU,QAAQ;AAAA,EACzD,kBAAkBA,EAAoB,SAAS,QAAQ;AAAA,EACvD,iBAAiBA,EAAoB,QAAQ,QAAQ;AAAA,EACrD,mBAAmBA,EAAoB,UAAU,QAAQ;AAAA,EACzD,kBAAkBA,EAAoB,SAAS,QAAQ;AAAA,EACvD,QAAQF,EAAW;AAAA;AAAA;AAAA,GAGlB;AAAA,EACD,eAAeA,EAAW;AAAA;AAAA;AAAA,GAGzB;AAAA,EACD,gBAAgBA,EAAW;AAAA;AAAA;AAAA,GAG1B;AAAA,EACD,gBAAgBA,EAAW;AAAA;AAAA;AAAA,GAG1B;AAAA,EACD,gBAAgBA,EAAW;AAAA;AAAA;AAAA,GAG1B;AAAA,EACD,QAAQA,EAAW;AAAA;AAAA,GAElB;AAAA,EACD,WAAWA,EAAW;AAAA;AAAA;AAAA,GAGrB;AAAA,EACD,aAAaA,EAAW;AAAA;AAAA;AAAA,GAGvB;AAAA,EACD,aAAaA,EAAW;AAAA;AAAA;AAAA;AAAA,GAIvB;AAAA,EACD,OAAOA,EAAW;AAAA;AAAA;AAAA;AAAA,GAIjB;AAAA,EACD,OAAOA,EAAW;AAAA;AAAA;AAAA,GAGjB;AAAA,EACD,WAAWA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMrB;AAAA,EACD,iBAAiBA,EAAW;AAAA;AAAA;AAAA,GAG3B;AAAA,EACD,YAAYA,EAAW;AAAA;AAAA;AAAA,GAGtB;AAAA,EACD,OAAOA,EAAW;AAAA;AAAA;AAAA,GAGjB;AACH;AAEO,MAAMO,GAAiB;AAAA,EAS5B,YAAY/P,GAAY;AARhB,IAAAC,EAAA;AACA,IAAAA,EAAA,qBAAqC;AACrC,IAAAA,EAAA,mCAAiD;AACjD,IAAAA,EAAA,wBAAwC;AACxC,IAAAA,EAAA,2BAAmC;AACnC,IAAAA,EAAA,0BAA0C;AAC1C,IAAAA,EAAA,sBAA8B;AAGpC,SAAK,OAAOD;AAAA,EACd;AAAA,EAEO,KAAK4I,GAAWmC,GAAWrL,GAAmB;AACnD,SAAK,MAAA;AACL,UAAMsQ,IAAY,KAAK,gBAAgBtQ,CAAO;AAC9C,SAAK,cAAc,KAAK,mBAAmBsQ,GAAWpH,GAAGmC,CAAC,GAC1D,SAAS,KAAK,YAAY,KAAK,WAAW,GAC1C,KAAK,kBAAA;AAAA,EACP;AAAA,EAEO,QAAQ;AACb,SAAK,yBAAA,GACD,KAAK,gBACP,KAAK,YAAY,OAAA,GACjB,KAAK,cAAc,OAEjB,KAAK,mBACP,KAAK,eAAe,OAAA,GACpB,KAAK,iBAAiB,OAEpB,KAAK,8BACP,KAAK,0BAAA,GACL,KAAK,4BAA4B;AAAA,EAErC;AAAA,EAEQ,gBAAgBrL,GAAgC;AACtD,UAAMuQ,IAAY,KAAK,cAAcvQ,CAAO,GACtCsC,IAActC,EAAQ,eAAe,KAAK,uBAAA,GAC1CqC,IAAc,OAAOrC,EAAQ,eAAe,GAAG,GAC/CwQ,IAAsB,OAAOxQ,EAAQ,uBAAuB,CAAC,GAC7DyQ,KAAkBF,KAAA,gBAAAA,EAAW,oBAAmB,WAChDG,IAAgB,CAAC,CAAC,KAAK,KAAK,SAAA,EAAW,WAAW,eAClDC,IAAiB,KAAK,gBAAgBJ,CAAS;AAErD,WAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,MAAMH,EAAM;AAAA,QACZ,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,SAASpQ,EAAQ,cAAc4Q,EAAY,SAASA,EAAY;AAAA,YAChE,QAAQ,MAAM,KAAK,eAAeA,EAAY,GAAG;AAAA,UAAA;AAAA,UAEnD;AAAA,YACE,OAAO;AAAA,YACP,MAAMR,EAAM;AAAA,YACZ,QAAQpQ,EAAQ,eAAe4Q,EAAY;AAAA,YAC3C,QAAQ,MAAM,KAAK,eAAeA,EAAY,QAAQ;AAAA,UAAA;AAAA,UAExD;AAAA,YACE,OAAO;AAAA,YACP,MAAMR,EAAM;AAAA,YACZ,QAAQpQ,EAAQ,eAAe4Q,EAAY;AAAA,YAC3C,QAAQ,MAAM,KAAK,eAAeA,EAAY,QAAQ;AAAA,UAAA;AAAA,UAExD;AAAA,YACE,OAAO;AAAA,YACP,MAAMR,EAAM;AAAA,YACZ,QAAQpQ,EAAQ,eAAe4Q,EAAY;AAAA,YAC3C,QAAQ,MAAM,KAAK,eAAeA,EAAY,IAAI;AAAA,UAAA;AAAA,UAEpD;AAAA,YACE,OAAO;AAAA,YACP,MAAMR,EAAM;AAAA,YACZ,QAAQpQ,EAAQ,eAAe4Q,EAAY;AAAA,YAC3C,QAAQ,MAAM,KAAK,eAAeA,EAAY,KAAK;AAAA,UAAA;AAAA,UAErD;AAAA,YACE,SAAS;AAAA,UAAA;AAAA,UAEX;AAAA,YACE,OAAO;AAAA,YACP,MAAMR,EAAM;AAAA,YACZ,cAAc9N;AAAA,YACd,cAAc;AAAA,YACd,QAAQ,CAACuO,MAAkB,KAAK,uBAAuBvO,GAAauO,CAAa;AAAA,UAAA;AAAA,UAEnF;AAAA,YACE,OAAO;AAAA,YACP,MAAMT,EAAM;AAAA,YACZ,WAAW;AAAA,YACX,cAAc/N;AAAA,YACd,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAW;AAAA,YACX,aAAa,CAACkN,MAAU,KAAK,gBAAgBA,CAAK;AAAA,UAAA;AAAA,UAEpD;AAAA,YACE,OAAO;AAAA,YACP,MAAMa,EAAM;AAAA,YACZ,WAAW;AAAA,YACX,cAAcI;AAAA,YACd,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAW;AAAA,YACX,aAAa,CAACjB,MAAU,KAAK,wBAAwBA,CAAK;AAAA,UAAA;AAAA,QAC5D;AAAA,MACF;AAAA,MAEF;AAAA,QACE,OAAO;AAAA,QACP,MAAMa,EAAM;AAAA,QACZ,gBAAgB;AAAA,QAChB,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,KAAKC,EAAQ,IAAI;AAAA,YAC1E,QAAQ,MAAM,KAAK,cAAcD,EAAc,KAAKC,EAAQ,IAAI;AAAA,UAAA;AAAA,UAElE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,KAAKC,EAAQ,MAAM;AAAA,YAC5E,QAAQ,MAAM,KAAK,cAAcD,EAAc,KAAKC,EAAQ,MAAM;AAAA,UAAA;AAAA,UAEpE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,KAAKC,EAAQ,KAAK;AAAA,YAC3E,QAAQ,MAAM,KAAK,cAAcD,EAAc,KAAKC,EAAQ,KAAK;AAAA,UAAA;AAAA,UAEnE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,QAAQC,EAAQ,IAAI;AAAA,YAC7E,QAAQ,MAAM,KAAK,cAAcD,EAAc,QAAQC,EAAQ,IAAI;AAAA,UAAA;AAAA,UAErE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,QAAQC,EAAQ,MAAM;AAAA,YAC/E,QAAQ,MAAM,KAAK,cAAcD,EAAc,QAAQC,EAAQ,MAAM;AAAA,UAAA;AAAA,UAEvE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,QAAQC,EAAQ,KAAK;AAAA,YAC9E,QAAQ,MAAM,KAAK,cAAcD,EAAc,QAAQC,EAAQ,KAAK;AAAA,UAAA;AAAA,UAEtE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,QAAQC,EAAQ,IAAI;AAAA,YAC7E,QAAQ,MAAM,KAAK,cAAcD,EAAc,QAAQC,EAAQ,IAAI;AAAA,UAAA;AAAA,UAErE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,QAAQC,EAAQ,MAAM;AAAA,YAC/E,QAAQ,MAAM,KAAK,cAAcD,EAAc,QAAQC,EAAQ,MAAM;AAAA,UAAA;AAAA,UAEvE;AAAA,YACE,OAAO;AAAA,YACP,MAAMX,EAAM;AAAA,YACZ,UAAU;AAAA,YACV,QAAQ,KAAK,mBAAmBG,GAAWO,EAAc,QAAQC,EAAQ,KAAK;AAAA,YAC9E,QAAQ,MAAM,KAAK,cAAcD,EAAc,QAAQC,EAAQ,KAAK;AAAA,UAAA;AAAA,QACtE;AAAA,MACF;AAAA,MAEF;AAAA,QACE,OAAO;AAAA,QACP,MAAMX,EAAM;AAAA,QACZ,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,WAAW;AAAA,YACX,cAAc;AAAA,YACd,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAW;AAAA,YACX,aAAa,CAACY,MAAU,KAAK,cAAcA,GAAO,MAAM;AACtD,mBAAK,KAAK,gBAAA,EAAkB,mBAAA;AAAA,YAC9B,CAAC;AAAA,YACD,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,OAAO;AAAA,YACP,MAAMZ,EAAM;AAAA,YACZ,WAAW;AAAA,YACX,cAAc;AAAA,YACd,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAW;AAAA,YACX,aAAa,CAACY,MAAU,KAAK,cAAcA,GAAO,MAAM;AACtD,mBAAK,KAAK,gBAAA,EAAkB,oBAAA;AAAA,YAC9B,CAAC;AAAA,YACD,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,OAAO;AAAA,YACP,MAAMZ,EAAM;AAAA,YACZ,WAAW;AAAA,YACX,cAAc;AAAA,YACd,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAW;AAAA,YACX,aAAa,CAACY,MAAU,KAAK,cAAcA,GAAO,MAAM;AACtD,mBAAK,KAAK,gBAAA,EAAkB,kBAAA;AAAA,YAC9B,CAAC;AAAA,YACD,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,OAAO;AAAA,YACP,MAAMZ,EAAM;AAAA,YACZ,WAAW;AAAA,YACX,cAAc;AAAA,YACd,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAW;AAAA,YACX,aAAa,CAACY,MAAU,KAAK,cAAcA,GAAO,MAAM;AACtD,mBAAK,KAAK,gBAAA,EAAkB,qBAAA;AAAA,YAC9B,CAAC;AAAA,YACD,MAAM;AAAA,UAAA;AAAA,QACR;AAAA,MACF;AAAA,MAEF;AAAA,QACE,OAAO;AAAA,QACP,MAAMZ,EAAM;AAAA,QACZ,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,WAAA;AAAA,UAAW;AAAA,UAEhC;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,cAAA;AAAA,UAAc;AAAA,UAEnC;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ,MAAM,KAAK,aAAA;AAAA,UAAa;AAAA,QAClC;AAAA,MACF;AAAA,MAEF;AAAA,QACE,OAAO;AAAA,QACP,MAAMA,EAAM;AAAA,QACZ,UAAU,CAACO;AAAA,QACX,QAAQ,MAAM,KAAK,sBAAA;AAAA,MAAsB;AAAA,MAE3C;AAAA,QACE,SAAS;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,OAAO;AAAA,QACP,MAAMP,EAAM;AAAA,QACZ,UAAU,CAACM;AAAA,QACX,QAAQ,MAAM,KAAK,gBAAA;AAAA,MAAgB;AAAA,MAErC;AAAA,QACE,OAAO;AAAA,QACP,MAAMN,EAAM;AAAA,QACZ,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,wBAAA;AAAA,UAAwB;AAAA,UAE7C;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,0BAAA;AAAA,UAA0B;AAAA,QAC/C;AAAA,MACF;AAAA,MAEF;AAAA,QACE,OAAO;AAAA,QACP,MAAMA,EAAM;AAAA,QACZ,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,oBAAoBa,GAAS,GAAG;AAAA,UAAA;AAAA,UAErD;AAAA,YACE,OAAO;AAAA,YACP,MAAMb,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,oBAAoBa,GAAS,KAAK;AAAA,UAAA;AAAA,UAEvD;AAAA,YACE,OAAO;AAAA,YACP,MAAMb,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,oBAAoBa,GAAS,MAAM;AAAA,UAAA;AAAA,UAExD;AAAA,YACE,OAAO;AAAA,YACP,MAAMb,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,oBAAoBa,GAAS,IAAI;AAAA,UAAA;AAAA,QACtD;AAAA,MACF;AAAA,MAEF;AAAA,QACE,OAAO;AAAA,QACP,MAAMb,EAAM;AAAA,QACZ,UAAU;AAAA,UACR;AAAA,YACE,OAAO;AAAA,YACP,MAAMA,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,mBAAmBc,GAAQ,OAAO;AAAA,UAAA;AAAA,UAEvD;AAAA,YACE,OAAO;AAAA,YACP,MAAMd,EAAM;AAAA,YACZ,QAAQ,MAAM,KAAK,mBAAmBc,GAAQ,IAAI;AAAA,UAAA;AAAA,QACpD;AAAA,MACF;AAAA,MAEF;AAAA,QACE,OAAO;AAAA,QACP,MAAMd,EAAM;AAAA,QACZ,cAAcK;AAAA,QACd,cAAc;AAAA,QACd,QAAQ,CAACI,MAAkB,KAAK,2BAA2BJ,GAAiBI,CAAa;AAAA,MAAA;AAAA,MAE3F;AAAA,QACE,SAAS;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,OAAO;AAAA,QACP,MAAMT,EAAM;AAAA,QACZ,QAAQ,MAAM,KAAK,gBAAA;AAAA,MAAgB;AAAA,IACrC;AAAA,EAEJ;AAAA,EAEQ,mBAAmBe,GAAoBjI,GAAWmC,GAA2B;AACnF,UAAM+F,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,UAAU,IAAI,GAAGC,CAAa,qBAAqB,GAExDF,EAAM,QAAQ,CAAApO,MAAQ;AACpB,UAAIA,EAAK,SAAS;AAChB,cAAMuO,IAAU,SAAS,cAAc,KAAK;AAC5C,QAAAA,EAAQ,UAAU,IAAI,GAAGD,CAAa,8BAA8B,GACpED,EAAK,YAAYE,CAAO;AAAA,MAC1B,OAAO;AACL,cAAMC,IAAW,KAAK,gBAAgBxO,CAAI;AAC1C,QAAAqO,EAAK,YAAYG,CAAQ;AAAA,MAC3B;AAAA,IACF,CAAC,GAEDH,EAAK,MAAM,OAAO,GAAGlI,CAAC,MACtBkI,EAAK,MAAM,MAAM,GAAG/F,CAAC;AAErB,UAAMmG,IAAOJ,EAAK,sBAAA,GACZK,IAAgB,OAAO,YACvBC,IAAiB,OAAO;AAE9B,WAAIxI,IAAIsI,EAAK,QAAQC,MACnBL,EAAK,MAAM,OAAO,GAAGK,IAAgBD,EAAK,QAAQ,EAAE,OAElDnG,IAAImG,EAAK,SAASE,MACpBN,EAAK,MAAM,MAAM,GAAGM,IAAiBF,EAAK,SAAS,EAAE,OAGhDJ;AAAA,EACT;AAAA,EAEQ,gBAAgBrO,GAAiC;AACvD,UAAMwO,IAAW,SAAS,cAAc,KAAK;AAC7C,IAAAA,EAAS,UAAU,IAAI,GAAGF,CAAa,2BAA2B,GAC9DtO,EAAK,YACPwO,EAAS,UAAU,IAAI,GAAGF,CAAa,sCAAsC,IAE3EtO,EAAK,SAASA,EAAK,WACrBwO,EAAS,QAAQxO,EAAK,SAASA,EAAK,SAAS,KAG3CA,EAAK,YACPwO,EAAS,UAAU,IAAI,UAAU,GAE/BxO,EAAK,UACPwO,EAAS,UAAU,IAAI,QAAQ,GAE7BxO,EAAK,UACPwO,EAAS,UAAU,IAAI,QAAQ;AAGjC,UAAMI,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,UAAU,IAAI,GAAGN,CAAa,2BAA2B,GAC9DE,EAAS,YAAYI,CAAI;AAEzB,UAAMC,IAAO,SAAS,cAAc,KAAK;AAIzC,QAHAA,EAAK,UAAU,IAAI,GAAGP,CAAa,2BAA2B,GAC9DE,EAAS,YAAYK,CAAI,GAErB7O,EAAK,MAAM;AACb,YAAM8O,IAAW,SAAS,cAAc,MAAM;AAC9C,MAAAA,EAAS,UAAU,IAAI,GAAGR,CAAa,2BAA2B,GAClEQ,EAAS,YAAY9O,EAAK,MAC1B4O,EAAK,YAAYE,CAAQ;AAAA,IAC3B;AAEA,QAAI9O,EAAK,SAAS,CAACA,EAAK,UAAU;AAChC,YAAM+O,IAAY,SAAS,cAAc,MAAM;AAC/C,MAAAA,EAAU,UAAU,IAAI,GAAGT,CAAa,4BAA4B,GACpES,EAAU,cAAc/O,EAAK,OAC7B4O,EAAK,YAAYG,CAAS;AAAA,IAC5B;AAEA,QAAI/O,EAAK,cAAc,UAAU;AAC/B,YAAMqF,IAAQ,SAAS,cAAc,OAAO;AAY5C,UAXAA,EAAM,OAAO,UACbA,EAAM,MAAM,OAAOrF,EAAK,YAAY,CAAC,GACrCqF,EAAM,MAAM,OAAOrF,EAAK,YAAY,GAAG,GACvCqF,EAAM,OAAO,OAAOrF,EAAK,aAAa,CAAC,GACvCqF,EAAM,QAAQ,OAAOrF,EAAK,gBAAgB,CAAC,GAC3CqF,EAAM,UAAU,IAAI,GAAGiJ,CAAa,mCAAmC,GAEvEjJ,EAAM,iBAAiB,SAAS,CAAC2J,MAAQA,EAAI,iBAAiB,GAC9D3J,EAAM,iBAAiB,aAAa,CAAC2J,MAAQA,EAAI,iBAAiB,GAClEH,EAAK,YAAYxJ,CAAK,GAElBrF,EAAK,MAAM;AACb,cAAMiP,IAAW,SAAS,cAAc,MAAM;AAC9C,QAAAA,EAAS,UAAU,IAAI,GAAGX,CAAa,2BAA2B,GAClEW,EAAS,cAAcjP,EAAK,MAC5B6O,EAAK,YAAYI,CAAQ;AAAA,MAC3B;AAEA,MAAIjP,EAAK,eACPwO,EAAS,iBAAiB,SAAS,CAACQ,MAAQ;AAC1C,cAAMxC,IAAQ,OAAO,WAAWnH,EAAM,KAAK;AAC3C,QAAA2J,EAAI,gBAAA,GACJhP,EAAK,YAAa,OAAO,SAASwM,CAAK,IAAIA,IAAQxM,EAAK,gBAAgB,CAAC,GACzE,KAAK,MAAA;AAAA,MACP,CAAC;AAAA,IAEL,OAAO;AACL,UAAIA,EAAK,cAAc;AACrB,cAAMkP,IAAU,SAAS,cAAc,MAAM;AAC7C,QAAAA,EAAQ,UAAU,IAAI,GAAGZ,CAAa,oCAAoC,GAC1EY,EAAQ,MAAM,kBAAkBlP,EAAK,cACrC6O,EAAK,YAAYK,CAAO;AAAA,MAC1B;AAEA,UAAIlP,EAAK,UAAU;AACjB,cAAMmP,IAAW,SAAS,cAAc,MAAM;AAC9C,QAAAA,EAAS,UAAU,IAAI,GAAGb,CAAa,+BAA+B,GACtEa,EAAS,cAAcnP,EAAK,UAC5B6O,EAAK,YAAYM,CAAQ;AAAA,MAC3B;AAEA,UAAInP,EAAK,YAAYA,EAAK,SAAS,SAAS,GAAG;AAC7C,cAAMoP,IAAQ,SAAS,cAAc,MAAM;AAC3C,QAAAA,EAAM,UAAU,IAAI,GAAGd,CAAa,4BAA4B,GAChEc,EAAM,cAAc,KACpBP,EAAK,YAAYO,CAAK,GAEtBZ,EAAS,iBAAiB,cAAc,CAACQ,MAAQ;AAC/C,UAAI,KAAK,sBACP,aAAa,KAAK,iBAAiB,GACnC,KAAK,oBAAoB,OAE3B,KAAK;AAAA,YACHA,EAAI;AAAA,YACJhP,EAAK;AAAA,YACLA,EAAK,kBAAkB;AAAA,UAAA;AAAA,QAE3B,CAAC,GACDwO,EAAS,iBAAiB,cAAc,MAAM;AAC5C,eAAK,kBAAA;AAAA,QACP,CAAC;AAAA,MACH;AAEA,MAAIxO,EAAK,UAAU,CAACA,EAAK,YACvBwO,EAAS,iBAAiB,SAAS,CAACQ,MAAQ;AAC1C,QAAAA,EAAI,gBAAA,GACJhP,EAAK,OAAQwO,CAAQ,GACjBxO,EAAK,iBAAiB,MACxB,KAAK,MAAA;AAAA,MAET,CAAC;AAAA,IAEL;AAEA,WAAOwO;AAAA,EACT;AAAA,EAEQ,aAAaa,GAA4BtO,GAAuBuO,IAAkC,WAAW;AACnH,SAAK,aAAA;AAEL,UAAMC,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,UAAU,IAAI,GAAGjB,CAAa,qBAAqB,GAC3DiB,EAAQ,UAAU,IAAI,GAAGjB,CAAa,0BAA0B,GAC5DgB,MAAW,eACbC,EAAQ,UAAU,IAAI,GAAGjB,CAAa,gCAAgC,GAGxEvN,EAAS,QAAQ,CAAAmL,MAAS;AACxB,UAAIA,EAAM,SAAS;AACjB,cAAMqC,IAAU,SAAS,cAAc,KAAK;AAC5C,QAAAA,EAAQ,UAAU,IAAI,GAAGD,CAAa,8BAA8B,GACpEiB,EAAQ,YAAYhB,CAAO;AAAA,MAC7B,OAAO;AACL,cAAMiB,IAAY,KAAK,gBAAgBtD,CAAK;AAC5C,QAAAqD,EAAQ,YAAYC,CAAS;AAAA,MAC/B;AAAA,IACF,CAAC;AAED,UAAMC,IAAaJ,EAAW,sBAAA,GACxBK,IAAa;AAEnB,QAAIvJ,IAAIsJ,EAAW,QAAQC,GACvBpH,IAAImH,EAAW;AAEnB,aAAS,KAAK,YAAYF,CAAO;AACjC,UAAMI,IAAUJ,EAAQ,sBAAA;AAExB,IAAIpJ,IAAIwJ,EAAQ,QAAQ,OAAO,eAC7BxJ,IAAIsJ,EAAW,OAAOE,EAAQ,QAAQD,IAGpCpH,IAAIqH,EAAQ,SAAS,OAAO,gBAC9BrH,IAAI,OAAO,cAAcqH,EAAQ,SAAS,KAG5CJ,EAAQ,MAAM,OAAO,GAAGpJ,CAAC,MACzBoJ,EAAQ,MAAM,MAAM,GAAGjH,CAAC,MAExBiH,EAAQ,iBAAiB,cAAc,MAAM;AAC3C,MAAI,KAAK,sBACP,aAAa,KAAK,iBAAiB,GACnC,KAAK,oBAAoB;AAAA,IAE7B,CAAC,GACDA,EAAQ,iBAAiB,cAAc,MAAM;AAC3C,WAAK,kBAAA;AAAA,IACP,CAAC,GAED,KAAK,iBAAiBA;AAAA,EACxB;AAAA,EAEQ,oBAAoB;AAC1B,IAAI,KAAK,qBACP,aAAa,KAAK,iBAAiB,GAErC,KAAK,oBAAoB,OAAO,WAAW,MAAM;AAC/C,WAAK,aAAA,GACL,KAAK,oBAAoB;AAAA,IAC3B,GAAG,GAAG;AAAA,EACR;AAAA,EAEQ,eAAe;AACrB,IAAI,KAAK,sBACP,aAAa,KAAK,iBAAiB,GACnC,KAAK,oBAAoB,OAEvB,KAAK,mBACP,KAAK,eAAe,OAAA,GACpB,KAAK,iBAAiB;AAAA,EAE1B;AAAA,EAEQ,oBAAoB;AAC1B,UAAMK,IAAe,CAACZ,MAAoB;;AACxC,YAAMzL,IAASyL,EAAI;AAKnB,MAHE,CAAC,GAAC5Q,IAAA,KAAK,gBAAL,QAAAA,EAAkB,SAASmF,OAC7B,CAAC,GAACV,IAAA,KAAK,mBAAL,QAAAA,EAAqB,SAASU,OAChC,CAAC,GAACsM,IAAA,KAAK,qBAAL,QAAAA,EAAuB,SAAStM,OAElC,KAAK,MAAA;AAAA,IAET,GAEMuM,IAAa,CAACd,MAAuB;AACzC,MAAIA,EAAI,QAAQ,YACd,KAAK,MAAA;AAAA,IAET,GAEMe,IAAgB,MAAM;AAC1B,WAAK,MAAA;AAAA,IACP;AAEA,aAAS,iBAAiB,SAASH,CAAY,GAC/C,SAAS,iBAAiB,WAAWE,CAAU,GAC/C,OAAO,iBAAiB,UAAUC,GAAe,EAAI,GACrD,OAAO,iBAAiB,UAAUA,CAAa,GAE/C,KAAK,4BAA4B,MAAM;AACrC,eAAS,oBAAoB,SAASH,CAAY,GAClD,SAAS,oBAAoB,WAAWE,CAAU,GAClD,OAAO,oBAAoB,UAAUC,GAAe,EAAI,GACxD,OAAO,oBAAoB,UAAUA,CAAa;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,cAAc9B,GAAe+B,GAAoB;AACvD,UAAMC,IAAQ,KAAK,IAAI,GAAG,KAAK,MAAMhC,CAAK,CAAC;AAC3C,aAAS9O,IAAI,GAAGA,IAAI8Q,GAAO9Q;AACzB,MAAA6Q,EAAA;AAAA,EAEJ;AAAA,EAEQ,cAAc/S,GAA+B;;AACnD,UAAMiT,IAAkB,KAAK,KAAK,YAAA,EAAc,mBAAA;AAChD,WACE,CAACA,EAAgB,WACjBA,EAAgB,YAAY,UAC5BA,EAAgB,YAAY,SAErB,SAGPrN,KAAAzE,IAAAnB,EAAQ,WAAR,gBAAAmB,EAAiB8R,EAAgB,aAAjC,gBAAArN,EAA2C,OAAOqN,EAAgB,aAAY;AAAA,EAElF;AAAA,EAEQ,gBAAgB7S,GAAgB;AACtC,WAAKA,IACEA,EAAG,UAAU,KAAKA,EAAG,UAAU,IADtB;AAAA,EAElB;AAAA,EAEQ,yBAAyB;AAC/B,WAAO,KAAK,KAAK,WAAA,EAAa,MAAM;AAAA,EACtC;AAAA,EAEQ,eAAe;AACrB,SAAK,KAAK,gBAAA,EAAkB,YAAA;AAAA,EAC9B;AAAA,EAEQ,aAAa;AACnB,SAAK,KAAK,gBAAA,EAAkB,eAAA;AAAA,EAC9B;AAAA,EAEQ,gBAAgB;AACtB,SAAK,KAAK,gBAAA,EAAkB,eAAA;AAAA,EAC9B;AAAA,EAEQ,kBAAkB;AACxB,SAAK,KAAK,gBAAA,EAAkB,eAAA;AAAA,EAC9B;AAAA,EAEQ,eAAesE,GAAyB;AAC9C,SAAK,KAAK,kBAAkB,gBAAgBA,CAAU;AAAA,EACxD;AAAA,EAEQ,gBAAgB6K,GAAe;AACrC,SAAK,KAAK,kBAAkB,iBAAiBA,CAAK;AAAA,EACpD;AAAA,EAEQ,wBAAwBA,GAAe;AAC7C,SAAK,KAAK,kBAAkB,yBAAyBA,CAAK;AAAA,EAC5D;AAAA,EAEQ,mBAAmBnP,GAAgB8S,GAA8BC,GAAkB;AACzF,UAAMC,KAAuBhT,KAAA,gBAAAA,EAAI,kBAAiB0Q,EAAc,KAC1DuC,IAAyB,KAAK,cAAcjT,CAAE;AACpD,WAAOgT,MAAyBF,KAAiBG,MAA2BF;AAAA,EAC9E;AAAA,EAEQ,cAAc/S,GAAgB;;AAEpC,aADgBe,IAAAf,KAAA,gBAAAA,EAAI,MAAM,KAAK,CAAA2C,MAAQA,EAAK,aAA5B,gBAAA5B,EAAsC,YACpC4P,EAAQ;AAAA,EAC5B;AAAA,EAEQ,kBAAkB;AACxB,UAAMuC,IAAS,KAAK,KAAK,iBAAA,EAAmB,eAAA;AAC5C,QAAI,CAACA,EAAQ,QAAO,CAAA;AACpB,UAAMC,IAAqB,CAAA,GACrBC,wBAAW,IAAA;AAEjB,aAAS,IAAI,GAAG,IAAIF,EAAO,QAAQ,KAAK;AACtC,YAAMG,IAAMH,EAAO,CAAC;AACpB,eAAS9O,IAAI,GAAGA,IAAIiP,EAAI,QAAQjP,KAAK;AACnC,cAAMpE,IAAKqT,EAAIjP,CAAC;AAChB,YAAI,CAACpE,EAAI;AACT,cAAMsT,IAAQtT,EAAG,MAAM,GAAGA,EAAG,QAAQ,IAAIA,EAAG,QAAQ,IAAIA,EAAG,OAAO,IAAIA,EAAG,OAAO;AAChF,QAAIoT,EAAK,IAAIE,CAAK,MAClBF,EAAK,IAAIE,CAAK,GACdH,EAAY,KAAKnT,CAAE;AAAA,MACrB;AAAA,IACF;AAEA,WAAOmT;AAAA,EACT;AAAA,EAEQ,cAAcL,GAA8BC,GAAkB;AACpE,UAAMI,IAAc,KAAK,gBAAA;AACzB,QAAI,CAACA,EAAY,OAAQ;AAEzB,QAAII,IAAa;AACjB,aAASzR,IAAI,GAAGA,IAAIqR,EAAY,QAAQrR,KAAK;AAC3C,YAAM9B,IAAKmT,EAAYrR,CAAC;AAExB,OAD6B9B,EAAG,iBAAiB0Q,EAAc,SAClCoC,MAC3B9S,EAAG,gBAAgB8S,GACnBS,IAAa;AAGf,eAASC,IAAI,GAAGA,IAAIxT,EAAG,MAAM,QAAQwT,KAAK;AACxC,cAAM5T,IAAUI,EAAG,MAAMwT,CAAC;AAE1B,SADuB5T,EAAQ,WAAW+Q,EAAQ,UAC3BoC,MACnBA,MAAYpC,EAAQ,OACtB,OAAO/Q,EAAQ,UAEfA,EAAQ,UAAUmT,GAEpBQ,IAAa;AAAA,MACf;AAAA,IACF;AAEA,QAAI,CAACA,EAAY;AACjB,UAAM,EAAE,UAAAE,EAAA,IAAa,KAAK,KAAK,SAAA,EAAW,SAAA;AAC1C,SAAK,KAAK,OAAO;AAAA,MACf,UAAUA;AAAA,IAAA,CACX;AAAA,EACH;AAAA,EAEQ,oBAAoBnP,GAAsB;AAChD,SAAK,KAAK,kBAAkB,kBAAkBA,CAAU;AAAA,EAC1D;AAAA,EAEQ,mBAAmBoP,GAAoB;AAC7C,SAAK,KAAK,kBAAkB,iBAAiBA,CAAS;AAAA,EACxD;AAAA,EAEQ,kBAAkB;AACxB,SAAK,KAAK,gBAAA,EAAkB,eAAA;AAAA,EAC9B;AAAA,EAEQ,wBAAwB;AAC9B,SAAK,KAAK,gBAAA,EAAkB,qBAAA;AAAA,EAC9B;AAAA,EAEQ,0BAA0B;AAChC,SAAK,KAAK,gBAAA,EAAkB,uBAAA;AAAA,EAC9B;AAAA,EAEQ,4BAA4B;AAClC,SAAK,KAAK,gBAAA,EAAkB,yBAAA;AAAA,EAC9B;AAAA,EAEQ,uBAAuBC,GAAsBlD,GAA6B;AAChF,SAAK,gBAAgBkD,GAAclD,GAAe,CAACmD,MAAc;AAC/D,WAAK,KAAK,kBAAkB,iBAAiBA,CAAS;AAAA,IACxD,CAAC;AAAA,EACH;AAAA,EAEQ,2BAA2BD,GAAsBlD,GAA6B;AACpF,SAAK,gBAAgBkD,GAAclD,GAAe,CAACmD,MAAc;AAC/D,WAAK,KAAK,kBAAkB,uBAAuBA,CAAS;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA,EAEQ,gBACND,GACAlD,GACAoD,GACA;AACA,SAAK,yBAAA;AAEL,UAAMC,IAAkB,KAAK,qBAAqBH,CAAY,GACxDI,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,UAAU,IAAI,GAAG9C,CAAa,kCAAkC;AAEtE,UAAM+C,IAAa,SAAS,cAAc,KAAK;AAC/C,IAAAA,EAAW,UAAU,IAAI,GAAG/C,CAAa,kCAAkC,GAC3E8C,EAAM,YAAYC,CAAU,GAC5B,SAAS,KAAK,YAAYD,CAAK,GAC/B,KAAK,mBAAmBA,GACxB,KAAK,oBAAoBA,GAAOtD,CAAa;AAE7C,UAAMwD,IAAS,IAAI7H,GAAO;AAAA,MACxB,QAAQ4H;AAAA,MACR,OAAO;AAAA,MACP,OAAOF;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,cAAc;AAAA,MACd,UAAU,CAAC3P,MAAU;AACnB,QAAA0P,EAAQ1P,EAAM,GAAG;AAAA,MACnB;AAAA,MACA,QAAQ,MAAM;AACZ,aAAK,MAAA;AAAA,MACP;AAAA,MACA,SAAS,MAAM;AACb,aAAK,MAAA;AAAA,MACP;AAAA,IAAA,CACD;AACD,SAAK,eAAe8P;AAEpB,UAAMC,IAAaF,EAAW,cAAc,qBAAqB;AACjE,IAAIE,MACFA,EAAW,cAAc;AAAA,EAE7B;AAAA,EAEQ,2BAA2B;AACjC,QAAI,KAAK,cAAc;AACrB,YAAMD,IAAS,KAAK;AACpB,WAAK,eAAe,MACpBA,EAAO,QAAA;AAAA,IACT;AACA,IAAI,KAAK,qBACP,KAAK,iBAAiB,OAAA,GACtB,KAAK,mBAAmB;AAAA,EAE5B;AAAA,EAEQ,oBAAoBF,GAAuBtD,GAA6B;AAC9E,UAAM0D,IAAS1D,KAAiB,KAAK,kBAAkB,KAAK;AAC5D,QAAI,CAAC0D,EAAQ;AAEb,UAAMC,IAAM,GACNC,IAAS,GACTC,IAAaH,EAAO,sBAAA,GACpBI,IAAYR,EAAM,sBAAA;AAExB,QAAIS,IAAOF,EAAW,QAAQF,GAC1BK,IAAMH,EAAW;AAErB,IAAIE,IAAOD,EAAU,QAAQ,OAAO,aAAaF,MAC/CG,IAAOF,EAAW,OAAOC,EAAU,QAAQH,IAEzCI,IAAOH,MACTG,IAAO,KAAK,IAAIH,GAAQ,OAAO,aAAaE,EAAU,QAAQF,CAAM,IAGlEI,IAAMF,EAAU,SAAS,OAAO,cAAcF,MAChDI,IAAM,OAAO,cAAcF,EAAU,SAASF,IAE5CI,IAAMJ,MACRI,IAAMJ,IAGRN,EAAM,MAAM,OAAO,GAAGS,CAAI,MAC1BT,EAAM,MAAM,MAAM,GAAGU,CAAG;AAAA,EAC1B;AAAA,EAEQ,qBAAqBtQ,GAAehD,IAAW,IAAM;AAC3D,UAAMuT,IAAUvQ,EAAM,KAAA,GAChBwQ,IAAaD,EAAQ,WAAW,GAAG,IAAIA,IAAU,IAAIA,CAAO;AAClE,WAAI,oBAAoB,KAAKC,CAAU,IAC9BA,IAEFxT,IAAW,YAAY;AAAA,EAChC;AACF;ACjgCO,MAAMyT,GAA0B;AAAA,EAAhC;AACG,IAAAzU,EAAA;AAAA;AAAA,EAED,QAAQD,GAAkB;AAC/B,gBAAK,eAAe,IAAI+P,GAAiB/P,CAAI,GAC3CA,EAAa,qBAAqB,KAAK,cAClC;AAAA,EACT;AAAA,EAEO,iBAAiB;AACtB,WAAO,KAAK;AAAA,EACd;AACF;ACdA,SAAS2U,GAAqB9Q,GAAeC,GAAgB;AAC3D,SAAID,MAAU,QAAQC,MAAW,OACxB;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA,IAGRD,MAAU,OAAOC,MAAW,OACvB;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA,IAGRD,MAAU,OAAOC,MAAW,MACvB;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA,IAIL;AAAA,IACL,MAAM;AAAA,IACN,OAAO,GAAGD,CAAK;AAAA,IACf,QAAQ,GAAGC,CAAM;AAAA,EAAA;AAErB;AAOO,SAAS8Q,GACdC,GACArU,GACA;AACA,QAAM,EAAE,OAAAqD,GAAO,QAAAC,GAAQ,WAAAgR,IAAYC,GAAe,aAAavU,GACzDwU,IAAS,SAAS,cAAc,QAAQ;AAE9C,EAAAA,EAAO,MAAM,aAAa,UAC1BA,EAAO,MAAM,WAAW,YACxBA,EAAO,MAAM,OAAO,KACpBA,EAAO,MAAM,MAAM,KACnBA,EAAO,MAAM,QAAQ,KACrBA,EAAO,MAAM,SAAS,KACtBA,EAAO,MAAM,SAAS,QACtB,SAAS,KAAK,OAAOA,CAAM;AAC3B,QAAMC,IAAgBD,EAAO,eACvBzP,IAAM0P,EAAc;AAC1B,EAAA1P,EAAI,KAAA;AACJ,QAAM2P,IAAY,SAAS,cAAc,KAAK,GACxCC,IAAYR,GAAqB9Q,GAAOC,CAAM;AACpD,EAAA+Q,EAAW,QAAQ,CAAApT,MAAU;AAC3B,UAAM2T,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,MAAM,QACVN,MAAcC,GAAe,aACzBI,EAAU,SACVA,EAAU,OAChBC,EAAM,MAAM,SACVN,MAAcC,GAAe,aACzBI,EAAU,QACVA,EAAU,QAChBC,EAAM,MAAM3T,GACZyT,EAAU,OAAOE,CAAK;AAAA,EACxB,CAAC;AACD,QAAM7F,IAAQ,SAAS,cAAc,OAAO,GACtC8F,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOTF,EAAU,IAAI,IACtBL,MAAcC,GAAe,aAAa,cAAc,UAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,EAAAxF,EAAM,OAAO,SAAS,eAAe8F,CAAU,CAAC,GAChD,WAAW,MAAM;AACf,IAAA9P,EAAI,MAAM,GAAGgK,EAAM,SAAS,GAAG2F,EAAU,SAAS,EAAE,GACpDD,EAAc,MAAA,GACd1P,EAAI,MAAA,GAEJ,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AACJ,QAAAyP,KAAA,QAAAA,EAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAEJ,CAAC;AACH;ACvFA,MAAqBM,GAAW;AAAA,EAW9B,YACEJ,GACA7U,GACAG,IAAyB,CAAA,GACzB;AAdK,IAAAP,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;;AAOL,UAAMsV,IAAgBC,GAAYhV,CAAO;AACzC,IAAAH,IAAOoV,GAAUpV,CAAI;AACrB,QAAIqV,IAAgC,CAAA,GAChCC,IAA8B,CAAA,GAC9BC,IAAgC,CAAA;AACpC,IAAI,MAAM,QAAQvV,CAAI,IACpBsV,IAAkBtV,KAElBqV,IAAoBrV,EAAK,UAAU,CAAA,GACnCsV,IAAkBtV,EAAK,MACvBuV,IAAoBvV,EAAK,UAAU,CAAA,IAEX;AAAA,MACxBqV;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA,EAEgB,QAAQ,CAAArW,MAAe;AACvC,MAAAsW,GAAkBtW,GAAa;AAAA,QAC7B,eAAAgW;AAAA,QACA,qBAAqB;AAAA,MAAA,CACtB;AAAA,IACH,CAAC,GACD,KAAK,WAAW,IAAIO,GAAA,GACpB,KAAK,WAAW,IAAIC,GAAA,GACpB,KAAK,WAAW,IAAIC,GAAA;AACpB,UAAMhW,IAAO,IAAIiW;AAAA,MACff;AAAA,MACAK;AAAA,MACA;AAAA,QACE,QAAQG;AAAA,QACR,MAAMC;AAAA,QACN,QAAQC;AAAA,MAAA;AAAA,MAEV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAIP,IAAA5V,EAAK,iBAAiB,IAAIkW,GAAclW,CAAW,CAAQ,GAC3D,IAAImW,GAAA,EAAmB,QAAQnW,CAAI,GACnC,IAAIoW,GAAA,EAAmB,QAAQpW,CAAI;AACnC,UAAMqW,IAAkB,IAAI9U,KAAkB,QAAQvB,CAAI,GAEpDsW,IAAe,IAAIC,GAAavW,GAAa;AAAA,MACjD,YAAAwW;AAAA,MACA,kBAAA5B;AAAA,IAAA,CACD;AACD,SAAK,UAAU,IAAI6B,GAAQH,CAAY,GAErCtW,EAAa,qBAAqBsW,EAAa,YAEjD,IAAII,GAAA,EAAkB,QAAQ1W,GAAM,KAAK,OAAO,GAChD,IAAI0C,GAAA,EAAkB,QAAQ1C,GAAM,KAAK,OAAO,GAChD,IAAI0U,GAAA,EAA4B,QAAQ1U,CAAI,GAC5C,KAAK,UAAU,IAAI2W,GAAA,EAAmB,QAAQ,KAAK,OAAO,GAC1D,KAAK,WAAW,IAAIC,GAAA;AAEpB,UAAMC,IAAkB,IAAIC,GAAA,EAAkB,QAAQ9W,GAAM,KAAK,OAAO,GAGlE+W,MADqBlW,IAAA0U,EAAc,gBAAd,gBAAA1U,EAA2B,aAAY,KAE9D,IAAImW,GAAYhX,GAAM,KAAK,OAAO,IAClC,MAEE4R,IAAWiF,EAAgB,YAAA;AACjC,SAAK,WAAW,IAAII,GAAS;AAAA,MAC3B,UAAArF;AAAA,MACA,MAAM5R,EAAK,QAAA;AAAA,IAAQ,CACpB,GACDA,EAAK,YAAY,KAAK,QAAQ,GAC9B,KAAK,UAAU,MAAM;;AACnB,MAAAA,EAAK,QAAA,GACL4R,EAAS,YAAA,GACTmF,KAAA,QAAAA,EAAa,YACblW,IAAAwV,EAAgB,iBAAA,MAAhB,QAAAxV,EAAoC;AAAA,IACtC;AACA,UAAMqW,IAAS,IAAIC,GAAO,IAAW;AACrC,SAAK,MAAMD,EAAO,IAAI,KAAKA,CAAM;AAAA,EACnC;AACF;ACnHO,MAAME,GAAK;AAAA,EACT,QAAQC,GAAmB;AAChC,WAAO;AAAA,EACT;AAAA,EAEO,QAAQC,GAAiBC,GAAiC;AAAA,EAAC;AACpE;ACFO,MAAMC,GAAS;AAAA,EAAf;AACG,IAAAvX,EAAA,oBAAmD;AACnD,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,0BAA2C;AAAA;AAAA,EAE5C,UAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,kBAAkBO,GAAgC;AACvD,SAAK,mBAAmB;AAAA,MACtB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,GAAGA;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,MAAa,QAAQiX,GAAgD;;AACnE,QAAI,KAAK,SAAS;AAChB,WAAK,eAAe;AACpB;AAAA,IACF;AAEA,QADI,CAAC,KAAK,qBACNnS,KAAAzE,IAAA,KAAK,kBAAiB,eAAtB,QAAAyE,EAAA,KAAAzE,GAAsC;AAE1C,UAAM4O,IAAU,KAAK,iBAAiB,WAAA;AACtC,QAAKA,GAEL;AAAA,WAAK,UAAU,IACf,KAAK,eAAe;AACpB,UAAI;AACF,cAAM,KAAK,iBAAiB,OAAOA,CAAO;AAAA,MAC5C,UAAA;AACE,aAAK,UAAU,IACX,KAAK,gBAAc,KAAK,aAAA;AAAA,MAC9B;AAAA;AAAA,EACF;AAAA,EAEO,eAAqB;;AAC1B,IAAI,CAAC,KAAK,oBAAoB,CAAC,KAAK,iBAAiB,YACjDnK,KAAAzE,IAAA,KAAK,kBAAiB,eAAtB,QAAAyE,EAAA,KAAAzE,OACA,KAAK,cAAY,aAAa,KAAK,UAAU,GACjD,KAAK,aAAa,WAAW,MAAM;AACjC,MAAK,KAAK,QAAQ,EAAE,QAAQ,IAAM;AAAA,IACpC,GAAG,KAAK,iBAAiB,YAAY,GAAG;AAAA,EAC1C;AAAA,EAEO,eAAqB;AAC1B,IAAI,KAAK,eACP,aAAa,KAAK,UAAU,GAC5B,KAAK,aAAa;AAAA,EAEtB;AAAA,EAEO,WAAoB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAAgB;AACrB,SAAK,aAAA,GACL,KAAK,mBAAmB;AAAA,EAC1B;AACF;ACtDO,SAAS6W,KAA0C;AACxD,QAAMC,IAAgB,aAAa,QAAQC,EAAgB;AAC3D,SAAOD,IAAgB,KAAK,MAAMA,CAAa,IAAI;AACrD;AAEO,SAASE,KAAsB;AACpC,eAAa,WAAWD,EAAgB;AAC1C;AAuDO,SAASE,GAA0BC,GAA6B;AACrE,MAAIC,IAAS;AACb,WAASpW,IAAI,GAAGA,IAAImW,EAAc,MAAM,QAAQnW;AAE9C,QADamW,EAAc,MAAMnW,CAAC,EACzB,SAAS,QAAQ;AACxB,MAAAoW,IAAS;AACT;AAAA,IACF;AAEF,SAAOA;AACT;qBC7DaC,KAUqD;AAAA,EAChE,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,uBAAuB,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EAClC,wBAAwB;AAC1B,GC5CaC,IAAK;AAAA,EAChB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,GAAG;AACL;AAKO,SAASC,EAASC,GAAsB;AAC7C,SAAQA,IAAO,OAAQ;AACzB;AAYO,SAASC,GAAWC,GAAwB;AACjD,SAAOA,KAAU,KAAK;AACxB;AAGO,SAASC,EAAQC,GAAqB;AAC3C,SAAOA,IAAM;AACf;AAGO,SAASC,GAAa/N,GAAqB;AAChD,SAAQA,IAAM,KAAM,KAAK;AAC3B;AAKO,MAAMgO,KAA8C;AAAA,EACzD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AACT,GAQMC,KAA6C;AAAA;AAAA,EAEjD,IAAM;AAAA,EACN,WAAW;AAAA,EACX,KAAO;AAAA;AAAA,EAEP,IAAM;AAAA,EACN,UAAU;AAAA;AAAA,EAEV,IAAM;AAAA,EACN,WAAa;AAAA,EACb,UAAU;AAAA;AAAA,EAEV,IAAM;AAAA,EACN,WAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,MAAQ;AAAA,EACR,mBAAmB;AAAA;AAAA,EAEnB,IAAM;AAAA,EACN,YAAY;AAAA,EACZ,cAAc;AAAA;AAAA,EAEd,IAAM;AAAA;AAAA,EAEN,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,MAAQ;AAAA;AAAA,EAER,MAAQ;AAAA,EACR,MAAQ;AAAA;AAAA,EAER,mBAAmB;AAAA,EACnB,SAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,OAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,SAAW;AAAA,EACX,QAAU;AAAA,EACV,eAAe;AAAA,EACf,SAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,QAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,UAAY;AAAA,EACZ,SAAW;AAAA,EACX,SAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,UAAY;AAAA,EACZ,0BAA0B;AAC5B;AAEO,SAASC,GAAcC,GAAqD;AACjF,MAAKA;AACL,WAAOF,GAAmBE,CAAW,KAAKA;AAC5C;AAIO,MAAMC,KAAuE;AAAA,EAClF,QAAQ,EAAE,UAAU,MAAM,WAAW,OAAA;AAAA,EACrC,SAAS,EAAE,UAAU,MAAM,WAAW,UAAA;AAAA,EACtC,aAAa,EAAE,UAAU,MAAM,WAAW,cAAA;AAAA,EAC1C,aAAa,EAAE,UAAU,MAAM,WAAW,cAAA;AAAA,EAC1C,YAAY,EAAE,UAAU,MAAM,WAAW,cAAA;AAAA,EACzC,YAAY,EAAE,UAAU,MAAM,WAAW,cAAA;AAAA,EACzC,iBAAiB,EAAE,UAAU,MAAM,WAAW,kBAAA;AAAA,EAC9C,yBAAyB,EAAE,UAAU,MAAM,WAAW,kBAAA;AAAA,EACtD,sBAAsB,EAAE,UAAU,MAAM,WAAW,kBAAA;AAAA,EACnD,kBAAkB,EAAE,UAAU,MAAM,WAAW,UAAA;AAAA,EAC/C,SAAS,EAAE,UAAU,MAAM,WAAW,UAAA;AAAA,EACtC,cAAc,EAAE,UAAU,MAAM,WAAW,UAAA;AAAA,EAC3C,MAAM,EAAE,UAAU,MAAM,WAAW,OAAA;AACrC,GAIaC,KAAwC;AAAA,EACnD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAClB,GAIaC,KAA0C;AAAA,EACrD,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,uBAAuB;AACzB,GAQaC,KAAmD;AAAA,EAC9D,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAEP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT;AC7MO,SAASC,EAASC,GAA6B;AAEpD,SADe,IAAI,UAAA,EACL,gBAAgBA,GAAW,iBAAiB;AAC5D;AAKO,SAASC,GAAiB3M,GAAiB4M,GAAYC,GAA8B;AAC1F,QAAM7Z,IAAoB,CAAA;AAC1B,WAASmC,IAAI,GAAGA,IAAI6K,EAAO,WAAW,QAAQ7K,KAAK;AACjD,UAAM+M,IAAQlC,EAAO,WAAW7K,CAAC;AACjC,IACE+M,EAAM,aAAa,KAClBA,EAAkB,cAAc2K,KAChC3K,EAAkB,iBAAiB0K,KAEpC5Z,EAAO,KAAKkP,CAAgB;AAAA,EAEhC;AACA,SAAOlP;AACT;AAKO,SAAS8Z,EAAmB9M,GAAiB4M,GAAYC,GAAmC;AACjG,WAAS1X,IAAI,GAAGA,IAAI6K,EAAO,WAAW,QAAQ7K,KAAK;AACjD,UAAM+M,IAAQlC,EAAO,WAAW7K,CAAC;AACjC,QACE+M,EAAM,aAAa,KAClBA,EAAkB,cAAc2K,KAChC3K,EAAkB,iBAAiB0K;AAEpC,aAAO1K;AAAA,EAEX;AACA,SAAO;AACT;AAKO,SAAS6K,EAAQC,GAAmC;AACzD,SAAKA,MACEA,EAAG,eAAevB,EAAG,GAAG,KAAK,KAAKuB,EAAG,aAAa,OAAO,MAAK;AACvE;AAoBO,SAASC,EAAajN,GAAiB5J,GAA0C;AACtF,WAASjB,IAAI,GAAGA,IAAI6K,EAAO,WAAW,QAAQ7K,KAAK;AACjD,UAAM+M,IAAQlC,EAAO,WAAW7K,CAAC;AACjC,IAAI+M,EAAM,aAAa,KACrB9L,EAAS8L,CAAgB;AAAA,EAE7B;AACF;AAiBO,SAASgL,GAASlN,GAAiB4M,GAAYC,GAA4B;AAChF,SAAOC,EAAmB9M,GAAQ4M,GAAIC,CAAS,MAAM;AACvD;ACrFO,SAASM,GAAWC,GAAoC;AAC7D,QAAMpa,IAAoB;AAAA,IACxB,4BAAY,IAAA;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,EAAA;AAEb,MAAI,CAACoa,EAAU,QAAOpa;AAGtB,QAAMqa,IADMZ,EAASW,CAAQ,EACZ;AAEjB,SAAAE,GAAiBD,GAAMra,CAAM,GAC7Bua,GAAgBF,GAAMra,CAAM,GAErBA;AACT;AAEA,SAASsa,GAAiBD,GAAera,GAAyB;AAChE,QAAMwa,IAAaH,EAAK,uBAAuB5B,EAAG,GAAG,WAAW;AAChE,MAAI+B,EAAW,WAAW,EAAG;AAE7B,QAAMC,IAAYD,EAAW,CAAC;AAC9B,EAAAP,EAAaQ,GAAW,CAACC,MAAW;AAClC,UAAMC,IAAWD,EAAO,WAGlBE,IAAUd,EAAmBY,GAAQjC,EAAG,GAAG,SAAS;AAC1D,QAAImC,GAAS;AACX,YAAM3P,IAAM2P,EAAQ,aAAa,KAAK;AACtC,UAAI3P,GAAK;AACP,QAAAjL,EAAO,OAAO,IAAI2a,GAAU1P,EAAI,aAAa;AAC7C;AAAA,MACF;AAAA,IACF;AAGA,UAAM4P,IAASf,EAAmBY,GAAQjC,EAAG,GAAG,QAAQ;AACxD,QAAIoC,GAAQ;AACV,YAAMC,IAAUD,EAAO,aAAa,SAAS;AAC7C,MAAIC,KACF9a,EAAO,OAAO,IAAI2a,GAAUG,EAAQ,aAAa;AAAA,IAErD;AAAA,EACF,CAAC;AACH;AAEA,SAASP,GAAgBF,GAAera,GAAyB;AAC/D,QAAM+a,IAAcV,EAAK,uBAAuB5B,EAAG,GAAG,YAAY;AAClE,MAAIsC,EAAY,WAAW,EAAG;AAE9B,QAAMC,IAAaD,EAAY,CAAC,GAE1BE,IAAcnB,EAAmBkB,GAAYvC,EAAG,GAAG,WAAW;AACpE,EAAIwC,MACFjb,EAAO,YAAYkb,GAA6BD,CAAW;AAG7D,QAAME,IAAcrB,EAAmBkB,GAAYvC,EAAG,GAAG,WAAW;AACpE,EAAI0C,MACFnb,EAAO,YAAYkb,GAA6BC,CAAW;AAE/D;AAMA,SAASD,GAA6BE,GAAkC;AACtE,QAAMC,IAAKvB,EAAmBsB,GAAU3C,EAAG,GAAG,IAAI;AAClD,MAAI4C,GAAI;AACN,UAAMC,IAAWD,EAAG,aAAa,UAAU;AAC3C,QAAIC,KAAYA,MAAa,GAAI,QAAOA;AAAA,EAC1C;AACA,QAAMC,IAAQzB,EAAmBsB,GAAU3C,EAAG,GAAG,OAAO;AACxD,MAAI8C,GAAO;AACT,UAAMD,IAAWC,EAAM,aAAa,UAAU;AAC9C,QAAID,KAAYA,MAAa,GAAI,QAAOA;AAAA,EAC1C;AACA,SAAO;AACT;AASO,SAASE,GACdC,GACAC,GACAC,GACAC,GACe;AAEf,QAAMjB,IAAWnB,GAAyBkC,CAAc,KAAKA,GACvDnS,IAAMkS,EAAM,OAAO,IAAId,CAAQ;AACrC,MAAI,CAACpR,EAAK,QAAO;AAGjB,MAAI,CAACoS,KAAa,CAACC;AACjB,WAAO,IAAIrS,CAAG;AAIhB,QAAMxB,IAAI,SAASwB,EAAI,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,KACxCvB,IAAI,SAASuB,EAAI,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,KACxCtB,IAAI,SAASsB,EAAI,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,KAExC,CAACf,GAAGC,GAAGC,CAAC,IAAImT,GAAS9T,GAAGC,GAAGC,CAAC;AAClC,MAAI6T,IAAYpT;AAEhB,MAAIiT,GAAW;AACb,UAAMI,IAAS,SAASJ,GAAW,EAAE,IAAI;AACzC,IAAAG,IAAYpT,KAAK,IAAIA,KAAKqT;AAAA,EAC5B;AAEA,MAAIH,GAAY;AACd,UAAMG,IAAS,SAASH,GAAY,EAAE,IAAI;AAC1C,IAAAE,IAAYpT,IAAIqT;AAAA,EAClB;AAEA,EAAAD,IAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAS,CAAC;AAE9C,QAAM,CAACE,GAAIC,GAAIC,CAAE,IAAIC,GAAS3T,GAAGC,GAAGqT,CAAS;AAC7C,SAAO,IAAIM,GAAOJ,CAAE,CAAC,GAAGI,GAAOH,CAAE,CAAC,GAAGG,GAAOF,CAAE,CAAC,GAAG,YAAA;AACpD;AAKO,SAASG,GACdZ,GACAa,GACe;AACf,MAAI,CAACA,EAAS,QAAO;AACrB,QAAMC,IAAQD,EAAQ,YAAA;AACtB,SAAIC,EAAM,WAAW,OAAO,IAAUd,EAAM,YACxCc,EAAM,WAAW,OAAO,IAAUd,EAAM,YACrC;AACT;AAIA,SAASI,GAAS9T,GAAWC,GAAWC,GAAqC;AAC3E,QAAM2B,IAAM,KAAK,IAAI7B,GAAGC,GAAGC,CAAC,GACtB4B,IAAM,KAAK,IAAI9B,GAAGC,GAAGC,CAAC,GACtBuU,IAAQ5S,IAAMC;AACpB,MAAIrB,IAAI,GACJC,IAAI;AACR,QAAM,KAAKmB,IAAMC,KAAO;AAExB,SAAI2S,MAAU,MACZ/T,IAAI,IAAI,MAAM+T,KAAS,IAAI5S,IAAMC,KAAO2S,KAAS5S,IAAMC,IACnDD,MAAQ7B,IACVS,MAAMR,IAAIC,KAAKuU,KAASxU,IAAIC,IAAI,IAAI,MAAM,IACjC2B,MAAQ5B,IACjBQ,MAAMP,IAAIF,KAAKyU,IAAQ,KAAK,IAE5BhU,MAAMT,IAAIC,KAAKwU,IAAQ,KAAK,IAIzB,CAAChU,GAAGC,GAAG,CAAC;AACjB;AAEA,SAAS0T,GAAS3T,GAAWC,GAAWC,GAAqC;AAC3E,MAAID,MAAM,GAAG;AACX,UAAMgU,IAAI,KAAK,MAAM/T,IAAI,GAAG;AAC5B,WAAO,CAAC+T,GAAGA,GAAGA,CAAC;AAAA,EACjB;AACA,QAAMtS,IAAIzB,IAAI,MAAMA,KAAK,IAAID,KAAKC,IAAID,IAAIC,IAAID,GACxCyB,IAAI,IAAIxB,IAAIyB;AAClB,SAAO;AAAA,IACL,KAAK,MAAMuS,GAAgBxS,GAAGC,GAAG3B,IAAI,IAAI,CAAC,IAAI,GAAG;AAAA,IACjD,KAAK,MAAMkU,GAAgBxS,GAAGC,GAAG3B,CAAC,IAAI,GAAG;AAAA,IACzC,KAAK,MAAMkU,GAAgBxS,GAAGC,GAAG3B,IAAI,IAAI,CAAC,IAAI,GAAG;AAAA,EAAA;AAErD;AAEA,SAASkU,GAAgBxS,GAAWC,GAAWC,GAAmB;AAGhE,SAFIA,IAAI,MAAGA,KAAK,IACZA,IAAI,MAAGA,KAAK,IACZA,IAAI,IAAI,IAAUF,KAAKC,IAAID,KAAK,IAAIE,IACpCA,IAAI,IAAI,IAAUD,IAClBC,IAAI,IAAI,IAAUF,KAAKC,IAAID,MAAM,IAAI,IAAIE,KAAK,IAC3CF;AACT;AAEA,SAASkS,GAAO5M,GAAuB;AACrC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGA,CAAK,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACvE;ACnLO,MAAMmN,GAAc;AAAA,EAMzB,YAAYC,GAA0BnB,GAAkB;AALhD,IAAAjb,EAAA,sCAAe,IAAA;AACf,IAAAA,EAAA,+BAAwC,CAAA;AACxC,IAAAA,EAAA,yBAA4B,CAAA;AAC5B,IAAAA,EAAA;AAGN,SAAK,QAAQib,GACTmB,KACF,KAAK,eAAeA,CAAS;AAAA,EAEjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,yBAAyBC,GAA8B;AACrD,UAAM/M,IAAwB,CAAA,GAGxBgN,IAAOhD,EAAmB+C,GAAKpE,EAAG,GAAG,IAAI;AAC/C,QAAIqE,GAAM;AACR,YAAM7R,IAAM8O,EAAQ+C,CAAI;AACxB,MAAI7R,QAAW,UAAUA;AAAA,IAC3B;AAGA,IAAA8R,GAAuBF,GAAK/M,CAAK,GAGjCkN,GAAsBH,GAAK/M,CAAK;AAGhC,UAAMmN,IAAQnD,EAAmB+C,GAAKpE,EAAG,GAAG,KAAK;AACjD,QAAIwE,GAAO;AACT,YAAMC,IAAOC,GAAeF,GAAO,KAAK,KAAK;AAE7C,MAAAnN,EAAM,iBAAiBoN,KAAQ;AAAA,IACjC;AAGA,UAAME,IAAetD,EAAmB+C,GAAKpE,EAAG,GAAG,YAAY;AAC/D,QAAI2E,GAAc;AAChB,YAAMnS,IAAM8O,EAAQqD,CAAY;AAChC,UAAInS,MAAQ,MAAM;AAChB,cAAMoS,IAAQ,SAASpS,GAAK,EAAE;AAC9B,QAAIoS,KAAS,KAAKA,KAAS,MACzBvN,EAAM,aAAauN,IAAQ;AAAA,MAE/B;AAAA,IACF;AAGA,UAAMC,IAAUxD,EAAmB+C,GAAKpE,EAAG,GAAG,OAAO;AACrD,QAAI6E,GAAS;AACX,YAAMC,IAAUzD,EAAmBwD,GAAS7E,EAAG,GAAG,OAAO,GACnD+E,IAAS1D,EAAmBwD,GAAS7E,EAAG,GAAG,MAAM;AAIvD,UAHI8E,MACFzN,EAAM,QAAQiK,EAAQwD,CAAO,KAAK,SAEhCC,GAAQ;AACV,cAAMC,IAAW1D,EAAQyD,CAAM;AAC/B,QAAIC,MAAa,SACf3N,EAAM,YAAY,SAAS2N,GAAU,EAAE;AAAA,MAE3C;AAAA,IACF;AAGA,UAAMC,IAAS5D,EAAmB+C,GAAKpE,EAAG,GAAG,MAAM;AACnD,WAAIiF,MACF5N,EAAM,WAAW6N,GAAcD,CAAM,IAGhC5N;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB8N,GAAwB;AACzC,UAAM9N,IAAkB,CAAA;AAGxB,QAAIoK,GAAS0D,GAAKnF,EAAG,GAAG,GAAG,GAAG;AAC5B,YAAMoF,IAAM/D,EAAmB8D,GAAKnF,EAAG,GAAG,GAAG,GACvCxN,IAAM4S,IAAM9D,EAAQ8D,CAAG,IAAI;AACjC,MAAA/N,EAAM,OAAO7E,MAAQ,OAAOA,MAAQ;AAAA,IACtC;AAGA,QAAIiP,GAAS0D,GAAKnF,EAAG,GAAG,GAAG,GAAG;AAC5B,YAAMqF,IAAMhE,EAAmB8D,GAAKnF,EAAG,GAAG,GAAG,GACvCxN,IAAM6S,IAAM/D,EAAQ+D,CAAG,IAAI;AACjC,MAAAhO,EAAM,SAAS7E,MAAQ,OAAOA,MAAQ;AAAA,IACxC;AAIA,UAAM8S,IAAMjE,EAAmB8D,GAAKnF,EAAG,GAAG,GAAG;AAC7C,QAAIsF,GAAK;AACP,YAAM9S,IAAM8O,EAAQgE,CAAG;AACvB,MAAAjO,EAAM,YAAY7E,MAAQ,UAAUA,MAAQ;AAAA,IAC9C;AAGA,QAAIiP,GAAS0D,GAAKnF,EAAG,GAAG,QAAQ,GAAG;AACjC,YAAMuF,IAAMlE,EAAmB8D,GAAKnF,EAAG,GAAG,QAAQ,GAC5CxN,IAAM+S,IAAMjE,EAAQiE,CAAG,IAAI;AACjC,MAAAlO,EAAM,YAAY7E,MAAQ,OAAOA,MAAQ;AAAA,IAC3C;AAGA,UAAMgT,IAAOnE,EAAmB8D,GAAKnF,EAAG,GAAG,IAAI,KAC7CqB,EAAmB8D,GAAKnF,EAAG,GAAG,MAAM;AACtC,QAAIwF,GAAM;AACR,YAAMhT,IAAM8O,EAAQkE,CAAI;AACxB,MAAIhT,MAAK6E,EAAM,OAAO8I,GAAW,SAAS3N,GAAK,EAAE,CAAC;AAAA,IACpD;AAGA,UAAMiT,IAAWpE,EAAmB8D,GAAKnF,EAAG,GAAG,QAAQ;AACvD,IAAIyF,MACFpO,EAAM,OAAOqO,GAAeD,GAAU,KAAK,KAAK;AAIlD,UAAME,IAAUtE,EAAmB8D,GAAKnF,EAAG,GAAG,OAAO;AACrD,IAAI2F,MACFtO,EAAM,QAAQuO,GAAgBD,GAAS,KAAK,KAAK;AAInD,UAAME,IAAcxE,EAAmB8D,GAAKnF,EAAG,GAAG,WAAW;AAC7D,QAAI6F,GAAa;AACf,YAAMrT,IAAM8O,EAAQuE,CAAW;AAC/B,MAAIrT,KAAOA,MAAQ,WACjB6E,EAAM,YAAYmJ,GAAoBhO,CAAG,KAAK,IAAIA,CAAG;AAAA,IAEzD;AAGA,QAAI,CAAC6E,EAAM,WAAW;AACpB,YAAMmN,IAAQnD,EAAmB8D,GAAKnF,EAAG,GAAG,KAAK;AACjD,UAAIwE,GAAO;AACT,cAAMC,IAAOC,GAAeF,GAAO,KAAK,KAAK;AAC7C,QAAIC,QAAY,YAAYA;AAAA,MAC9B;AAAA,IACF;AAGA,UAAMqB,IAAgBzE,EAAmB8D,GAAKnF,EAAG,GAAG,SAAS;AAC7D,QAAI8F,GAAe;AACjB,YAAMtT,IAAM8O,EAAQwE,CAAa;AACjC,UAAItT,GAAK;AACP,cAAM0N,IAAO,SAAS1N,GAAK,EAAE,GACvBuT,IAAK9F,EAASC,CAAI;AAExB,QAAI,KAAK,IAAI6F,CAAE,KAAK,QAClB1O,EAAM,gBAAgB0O;AAAA,MAE1B;AAAA,IACF;AAGA,UAAMC,IAAc3E,EAAmB8D,GAAKnF,EAAG,GAAG,WAAW;AAC7D,QAAIgG,GAAa;AACf,YAAMxT,IAAM8O,EAAQ0E,CAAW;AAC/B,OAAIxT,MAAQ,iBAAiBA,MAAQ,iBACnC6E,EAAM,YAAY7E;AAAA,IAEtB;AAEA,WAAO6E;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa4O,GAAuC;AAClD,UAAM1e,IAAwB;AAAA,MAC5B,WAAW,EAAE,GAAG,KAAK,sBAAA;AAAA,MACrB,KAAK,EAAE,GAAG,KAAK,gBAAA;AAAA,IAAgB;AAEjC,QAAI,CAAC0e,EAAS,QAAO1e;AAGrB,UAAM2e,IAA2B,CAAA;AACjC,QAAIC,IAA2BF;AAC/B,UAAMG,wBAAc,IAAA;AAEpB,WAAOD,KAAa,CAACC,EAAQ,IAAID,CAAS,KAAG;AAC3C,MAAAC,EAAQ,IAAID,CAAS;AACrB,YAAME,IAAM,KAAK,SAAS,IAAIF,CAAS;AACvC,UAAI,CAACE,EAAK;AACV,MAAAH,EAAM,QAAQG,CAAG,GACjBF,IAAYE,EAAI;AAAA,IAClB;AAGA,eAAWA,KAAOH;AAChB,MAAAI,GAAU/e,EAAO,WAAW8e,EAAI,cAAc,GAC9CC,GAAU/e,EAAO,KAAK8e,EAAI,QAAQ;AAGpC,WAAO9e;AAAA,EACT;AAAA,EAEA,qBAA+B;AAC7B,WAAO,EAAE,GAAG,KAAK,gBAAA;AAAA,EACnB;AAAA,EAEA,2BAA2C;AACzC,WAAO,EAAE,GAAG,KAAK,sBAAA;AAAA,EACnB;AAAA;AAAA,EAIQ,eAAegf,GAAmB;AAExC,UAAM3E,IADMZ,EAASuF,CAAG,EACP,iBAGXC,IAAgBnF,EAAmBO,GAAM5B,EAAG,GAAG,aAAa;AAClE,IAAIwG,KACF,KAAK,iBAAiBA,CAAa;AAIrC,UAAMC,IAAW7E,EAAK,uBAAuB5B,EAAG,GAAG,OAAO;AAC1D,aAAStW,IAAI,GAAGA,IAAI+c,EAAS,QAAQ/c;AACnC,WAAK,kBAAkB+c,EAAS/c,CAAC,CAAC;AAAA,EAEtC;AAAA,EAEQ,iBAAiB8c,GAA8B;AACrD,UAAME,IAAerF,EAAmBmF,GAAexG,EAAG,GAAG,YAAY;AACzE,QAAI0G,GAAc;AAChB,YAAMC,IAAQtF,EAAmBqF,GAAc1G,EAAG,GAAG,KAAK;AAC1D,MAAI2G,MACF,KAAK,kBAAkB,KAAK,mBAAmBA,CAAK;AAAA,IAExD;AAEA,UAAMC,IAAevF,EAAmBmF,GAAexG,EAAG,GAAG,YAAY;AACzE,QAAI4G,GAAc;AAChB,YAAMC,IAAQxF,EAAmBuF,GAAc5G,EAAG,GAAG,KAAK;AAC1D,MAAI6G,MACF,KAAK,wBAAwB,KAAK,yBAAyBA,CAAK;AAAA,IAEpE;AAAA,EACF;AAAA,EAEQ,kBAAkBC,GAAwB;AAChD,UAAM7e,IAAK6e,EAAQ,eAAe9G,EAAG,GAAG,SAAS,KAC5C8G,EAAQ,aAAa,WAAW,KAChCA,EAAQ,aAAa,SAAS,KAC9B;AACL,QAAI,CAAC7e,EAAI;AAET,UAAM8e,IAAS1F,EAAmByF,GAAS9G,EAAG,GAAG,MAAM,GACjDgH,IAAO1F,EAAQyF,CAAM,KAAK,IAC1BE,IAAY5F,EAAmByF,GAAS9G,EAAG,GAAG,SAAS,GACvDkH,IAAY5F,EAAQ2F,CAAS;AAEnC,QAAIE,IAAiC,CAAA,GACjCC,IAAqB,CAAA;AAEzB,UAAMP,IAAQxF,EAAmByF,GAAS9G,EAAG,GAAG,KAAK;AAMrD,QALI6G,MACFM,IAAiB,KAAK,yBAAyBN,CAAK,IAIlDM,EAAe,eAAe,QAAW;AAC3C,YAAMvC,IAAQyC,GAAmBL,GAAM/e,CAAE;AACzC,MAAI2c,MAAU,WACZuC,EAAe,aAAavC;AAAA,IAEhC;AAEA,UAAM+B,IAAQtF,EAAmByF,GAAS9G,EAAG,GAAG,KAAK;AACrD,IAAI2G,MACFS,IAAW,KAAK,mBAAmBT,CAAK,IAG1C,KAAK,SAAS,IAAI1e,GAAI,EAAE,IAAAA,GAAI,MAAA+e,GAAM,WAAAE,GAAW,gBAAAC,GAAgB,UAAAC,GAAU;AAAA,EACzE;AACF;AAIA,SAAS9C,GAAuBF,GAAc/M,GAA6B;AACzE,QAAMiQ,IAAYjG,EAAmB+C,GAAKpE,EAAG,GAAG,SAAS;AACzD,MAAI,CAACsH,EAAW;AAEhB,QAAMC,IAASD,EAAU,eAAetH,EAAG,GAAG,QAAQ,KAAKsH,EAAU,aAAa,UAAU,GACtFE,IAAQF,EAAU,eAAetH,EAAG,GAAG,OAAO,KAAKsH,EAAU,aAAa,SAAS,GACnFG,IAAOH,EAAU,eAAetH,EAAG,GAAG,MAAM,KAAKsH,EAAU,aAAa,QAAQ,GAChFI,IAAWJ,EAAU,eAAetH,EAAG,GAAG,UAAU,KAAKsH,EAAU,aAAa,YAAY;AAKlG,MAHIC,MAAQlQ,EAAM,gBAAgB4I,EAAS,SAASsH,GAAQ,EAAE,CAAC,IAC3DC,MAAOnQ,EAAM,eAAe4I,EAAS,SAASuH,GAAO,EAAE,CAAC,IAExDC,GAAM;AACR,UAAME,IAAU,SAASF,GAAM,EAAE;AACjC,IAAI,CAACC,KAAYA,MAAa,UAE5BrQ,EAAM,aAAasQ,IAAU,KAC7BtQ,EAAM,iBAAiB,UACdqQ,MAAa,WAEtBrQ,EAAM,aAAa4I,EAAS0H,CAAO,GACnCtQ,EAAM,iBAAiB,WACdqQ,MAAa,cAEtBrQ,EAAM,aAAa4I,EAAS0H,CAAO,GACnCtQ,EAAM,iBAAiB;AAAA,EAE3B;AACF;AAEA,SAASkN,GAAsBH,GAAc/M,GAA6B;AACxE,QAAMuQ,IAAQvG,EAAmB+C,GAAKpE,EAAG,GAAG,KAAK;AACjD,MAAI,CAAC4H,EAAO;AAEZ,QAAMxL,IAAOwL,EAAM,eAAe5H,EAAG,GAAG,MAAM,KAAK4H,EAAM,aAAa,QAAQ,GACxEC,IAAQD,EAAM,eAAe5H,EAAG,GAAG,OAAO,KAAK4H,EAAM,aAAa,SAAS,GAC3EE,IAAYF,EAAM,eAAe5H,EAAG,GAAG,WAAW,KAAK4H,EAAM,aAAa,aAAa,GACvFG,IAAUH,EAAM,eAAe5H,EAAG,GAAG,SAAS,KAAK4H,EAAM,aAAa,WAAW,GAEjFI,IAAS5L,IAAO6D,EAAS,SAAS7D,GAAM,EAAE,CAAC,IAAI,GAC/C6L,IAAYF,IAAU9H,EAAS,SAAS8H,GAAS,EAAE,CAAC,IAAI;AAG9D,EAAI3L,KAAQ2L,KAAW,KAAK,IAAIC,IAASC,CAAS,IAAI,MAIlD7L,QAAY,aAAa4L,IACzBH,MAAOxQ,EAAM,cAAc4I,EAAS,SAAS4H,GAAO,EAAE,CAAC,IAEvDC,IAEFzQ,EAAM,kBAAkB4I,EAAS,SAAS6H,GAAW,EAAE,CAAC,IAC/CC,MAET1Q,EAAM,aAAc2Q,IAASC,GAC7B5Q,EAAM,kBAAkB,CAAC4Q;AAE7B;AAEA,SAAS/C,GAAcD,GAAuD;AAC5E,QAAMiD,IAA8C,CAAA,GAC9CC,IAASlD,EAAO,uBAAuBjF,EAAG,GAAG,KAAK;AACxD,WAAStW,IAAI,GAAGA,IAAIye,EAAO,QAAQze,KAAK;AACtC,UAAM0e,IAAQD,EAAOze,CAAC,GAChB8I,IAAM4V,EAAM,eAAepI,EAAG,GAAG,KAAK,KAAKoI,EAAM,aAAa,OAAO,KAAK,QAC1EC,IAAMD,EAAM,eAAepI,EAAG,GAAG,KAAK,KAAKoI,EAAM,aAAa,OAAO;AAC3E,IAAIC,KACFH,EAAM,KAAK,EAAE,KAAKjI,EAAS,SAASoI,GAAK,EAAE,CAAC,GAAG,MAAM7V,EAAA,CAAK;AAAA,EAE9D;AACA,SAAO0V;AACT;AAIA,SAASxC,GAAeD,GAAmBzC,GAAsC;AAE/E,QAAMsF,IAAW7C,EAAS,eAAezF,EAAG,GAAG,UAAU,KAAKyF,EAAS,aAAa,YAAY;AAChG,MAAI6C,EAAU,QAAO5H,GAAc4H,CAAQ;AAG3C,QAAMC,IAAQ9C,EAAS,eAAezF,EAAG,GAAG,OAAO,KAAKyF,EAAS,aAAa,SAAS;AACvF,MAAI8C,EAAO,QAAO7H,GAAc6H,CAAK;AAErC,QAAMC,IAAQ/C,EAAS,eAAezF,EAAG,GAAG,OAAO,KAAKyF,EAAS,aAAa,SAAS;AACvF,MAAI+C,EAAO,QAAO9H,GAAc8H,CAAK;AAGrC,QAAMC,IAAgBhD,EAAS,eAAezF,EAAG,GAAG,eAAe,KAAKyF,EAAS,aAAa,iBAAiB,GACzGiD,IAAajD,EAAS,eAAezF,EAAG,GAAG,YAAY,KAAKyF,EAAS,aAAa,cAAc,GAChGkD,IAAY/E,GAAiBZ,GAAOyF,KAAiBC,CAAU;AACrE,MAAIC,EAAW,QAAOjI,GAAciI,CAAS;AAG/C;AAEA,SAAS/C,GAAgBD,GAAkB3C,GAAsC;AAC/E,QAAMC,IAAiB0C,EAAQ,eAAe3F,EAAG,GAAG,YAAY,KAAK2F,EAAQ,aAAa,cAAc;AACxG,MAAI1C,GAAgB;AAClB,UAAMf,IAAWnB,GAAyBkC,CAAc,KAAKA,GACvD2F,IAAOjD,EAAQ,eAAe3F,EAAG,GAAG,WAAW,KAAK2F,EAAQ,aAAa,aAAa,KAAK,QAC3FkD,IAAQlD,EAAQ,eAAe3F,EAAG,GAAG,YAAY,KAAK2F,EAAQ,aAAa,cAAc,KAAK;AAEpG,WADiB5C,GAAkBC,GAAOd,GAAU0G,GAAMC,CAAK,KAC5C;AAAA,EACrB;AAEA,QAAMrW,IAAM8O,EAAQqE,CAAO;AAC3B,MAAI,GAACnT,KAAOA,MAAQ;AACpB,WAAO,IAAIA,CAAG;AAChB;AAIO,SAASkS,GAAeoE,GAAc9F,GAAiC;AAC5E,QAAM+F,IAASD,EAAI,eAAe9I,EAAG,GAAG,KAAK,KAAK8I,EAAI,aAAa,OAAO;AAG1E,MAAIC,MAAW,MAAO,QAAO;AAG7B,MAAIA,MAAW;AACb,WAAOC,GAA0BF,GAAK9F,CAAK;AAI7C,QAAMiG,IAAYH,EAAI,eAAe9I,EAAG,GAAG,WAAW,KAAK8I,EAAI,aAAa,aAAa;AACzF,MAAIG,GAAW;AACb,UAAM/G,IAAWnB,GAAyBkI,CAAS,KAAKA,GAClDL,IAAOE,EAAI,eAAe9I,EAAG,GAAG,eAAe,KAAK8I,EAAI,aAAa,iBAAiB,KAAK,QAC3FD,IAAQC,EAAI,eAAe9I,EAAG,GAAG,gBAAgB,KAAK8I,EAAI,aAAa,kBAAkB,KAAK,QAC9FI,IAAWnG,GAAkBC,GAAOd,GAAU0G,GAAMC,CAAK;AAC/D,WAAIK,IACKC,GAAqBD,CAAQ,IAAI,OAAOA,IAG1C;AAAA,EACT;AAGA,QAAMzE,IAAOqE,EAAI,eAAe9I,EAAG,GAAG,MAAM,KAAK8I,EAAI,aAAa,QAAQ;AAE1E,SADI,CAACrE,KAAQA,MAAS,UAClB0E,GAAqB,IAAI1E,CAAI,EAAE,IAAU,OACtC,IAAIA,CAAI;AACjB;AAEA,SAASuE,GAA0BF,GAAc9F,GAAiC;AAChF,QAAMoG,IAAaN,EAAI,eAAe9I,EAAG,GAAG,YAAY,KAAK8I,EAAI,aAAa,cAAc;AAC5F,MAAIM,GAAY;AACd,UAAMlH,IAAWnB,GAAyBqI,CAAU,KAAKA,GACnDR,IAAOE,EAAI,eAAe9I,EAAG,GAAG,WAAW,KAAK8I,EAAI,aAAa,aAAa,KAAK,QACnFD,IAAQC,EAAI,eAAe9I,EAAG,GAAG,YAAY,KAAK8I,EAAI,aAAa,cAAc,KAAK,QACtFI,IAAWnG,GAAkBC,GAAOd,GAAU0G,GAAMC,CAAK;AAC/D,WAAIK,IAAiBC,GAAqBD,CAAQ,IAAI,OAAOA,IACtD;AAAA,EACT;AACA,QAAMnd,IAAQ+c,EAAI,eAAe9I,EAAG,GAAG,OAAO,KAAK8I,EAAI,aAAa,SAAS;AAE7E,SADI,CAAC/c,KAASA,MAAU,UACpBod,GAAqB,IAAIpd,CAAK,EAAE,IAAU,OACvC,IAAIA,CAAK;AAClB;AAEA,SAASod,GAAqBpd,GAAwB;AACpD,QAAMC,IAAID,EAAM,YAAA,EAAc,QAAQ,KAAK,EAAE;AAC7C,SAAOC,MAAM,YAAYA,MAAM,SAASA,MAAM;AAChD;AAIA,SAASqb,GAAmBgC,GAAmBpD,GAAqC;AAClF,QAAMqD,IAAW;AAAA,IACf;AAAA,IACA;AAAA,EAAA;AAEF,aAAWC,KAAMD,GAAU;AACzB,UAAME,IAAIH,EAAU,MAAME,CAAE,KAAKtD,EAAQ,MAAMsD,CAAE;AACjD,QAAIC,GAAG;AACL,YAAM5E,IAAQ,SAAS4E,EAAE,CAAC,GAAG,EAAE;AAC/B,UAAI5E,KAAS,KAAKA,KAAS,EAAG,QAAOA;AAAA,IACvC;AAAA,EACF;AAEF;AAOA,SAAS0B,GAA4BxY,GAAWsG,GAA0B;AACxE,aAAWjL,KAAO,OAAO,KAAKiL,CAAM;AAClC,IAAIA,EAAOjL,CAAG,MAAM,WAClB2E,EAAO3E,CAAG,IAAIiL,EAAOjL,CAAG;AAG9B;ACrdO,MAAMsgB,GAAkB;AAAA,EAI7B,YAAYC,GAA6B;AAHjC,IAAA3hB,EAAA,0CAAmB,IAAA;AACnB,IAAAA,EAAA,qCAAc,IAAA;AAGpB,IAAI2hB,KACF,KAAK,kBAAkBA,CAAY;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQC,GAAe/E,GAAqC;AAC1D,UAAMgF,IAAS,KAAK,QAAQ,IAAID,CAAK;AACrC,QAAI,CAACC,EAAQ,QAAO;AAEpB,UAAMC,IAAc,KAAK,aAAa,IAAID,EAAO,aAAa;AAC9D,QAAI,CAACC,EAAa,QAAO;AAGzB,UAAMC,IAAWF,EAAO,eAAe,IAAIhF,CAAK;AAChD,QAAIkF,KAAA,QAAAA,EAAU;AACZ,aAAO,KAAK,eAAeA,EAAS,kBAAkBlF,CAAK;AAI7D,UAAMmF,IAAWF,EAAY,OAAO,IAAIjF,CAAK;AAC7C,QAAI,CAACmF,GAAU;AAEb,YAAMhhB,IAAW8gB,EAAY,OAAO,IAAI,CAAC;AACzC,aAAK9gB,IACE,KAAK,eAAeA,GAAU6b,CAAK,IADpB;AAAA,IAExB;AAEA,WAAO,KAAK,eAAemF,GAAUnF,CAAK;AAAA,EAC5C;AAAA;AAAA,EAIQ,kBAAkB2B,GAAmB;AAE3C,UAAM3E,IADMZ,EAASuF,CAAG,EACP;AAEjB,SAAK,kBAAkB3E,CAAI,GAC3B,KAAK,mBAAmBA,CAAI;AAAA,EAC9B;AAAA,EAEQ,kBAAkBA,GAAqB;AAC7C,UAAMoI,IAAiBpI,EAAK,uBAAuB5B,EAAG,GAAG,aAAa;AACtE,aAAStW,IAAI,GAAGA,IAAIsgB,EAAe,QAAQtgB,KAAK;AAC9C,YAAM6X,IAAKyI,EAAetgB,CAAC,GACrBugB,IAAgB1I,EAAG,eAAevB,EAAG,GAAG,eAAe,KACxDuB,EAAG,aAAa,iBAAiB,KACjC,IAEC2I,wBAAa,IAAA,GACbC,IAAS5I,EAAG,uBAAuBvB,EAAG,GAAG,KAAK;AAEpD,eAAS5E,IAAI,GAAGA,IAAI+O,EAAO,QAAQ/O,KAAK;AACtC,cAAMgP,IAAQD,EAAO/O,CAAC;AAEtB,YAAIgP,EAAM,kBAAkB7I,EAAI;AAEhC,cAAM8I,IAAWD,EAAM,eAAepK,EAAG,GAAG,MAAM,KAAKoK,EAAM,aAAa,QAAQ,KAAK,KACjFE,IAAO,SAASD,GAAU,EAAE;AAClC,QAAAH,EAAO,IAAII,GAAMC,GAAqBH,CAAK,CAAC;AAAA,MAC9C;AAEA,WAAK,aAAa,IAAIH,GAAe,EAAE,eAAAA,GAAe,QAAAC,GAAQ;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,mBAAmBtI,GAAqB;AAC9C,UAAM4I,IAAS5I,EAAK,uBAAuB5B,EAAG,GAAG,KAAK;AACtD,aAAStW,IAAI,GAAGA,IAAI8gB,EAAO,QAAQ9gB,KAAK;AACtC,YAAM6X,IAAKiJ,EAAO9gB,CAAC,GACbigB,IAAQpI,EAAG,eAAevB,EAAG,GAAG,OAAO,KAAKuB,EAAG,aAAa,SAAS,KAAK,IAE1EkJ,IAAkBpJ,EAAmBE,GAAIvB,EAAG,GAAG,eAAe,GAC9DiK,IAAgB3I,EAAQmJ,CAAe,KAAK,IAE5CC,wBAAqB,IAAA,GACrBC,IAAiBpJ,EAAG,uBAAuBvB,EAAG,GAAG,aAAa;AACpE,eAAS5E,IAAI,GAAGA,IAAIuP,EAAe,QAAQvP,KAAK;AAC9C,cAAMwP,IAAgBD,EAAevP,CAAC,GAChCiP,IAAWO,EAAc,eAAe5K,EAAG,GAAG,MAAM,KAAK4K,EAAc,aAAa,QAAQ,KAAK,KACjGN,IAAO,SAASD,GAAU,EAAE,GAE5BP,IAA0B,EAAE,MAAAQ,EAAA,GAG5BO,IAAkBxJ,EAAmBuJ,GAAe5K,EAAG,GAAG,eAAe;AAC/E,YAAI6K,GAAiB;AACnB,gBAAMrY,IAAM8O,EAAQuJ,CAAe;AACnC,UAAIrY,MAAKsX,EAAS,gBAAgB,SAAStX,GAAK,EAAE;AAAA,QACpD;AAGA,cAAM4X,IAAQ/I,EAAmBuJ,GAAe5K,EAAG,GAAG,KAAK;AAC3D,QAAIoK,MACFN,EAAS,mBAAmBS,GAAqBH,CAAK,GAClDN,EAAS,kBAAkB,WAC7BA,EAAS,iBAAiB,QAAQA,EAAS,iBAI/CY,EAAe,IAAIJ,GAAMR,CAAQ;AAAA,MACnC;AAEA,WAAK,QAAQ,IAAIH,GAAO,EAAE,OAAAA,GAAO,eAAAM,GAAe,gBAAAS,GAAgB;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,eAAeX,GAA2BnF,GAA8B;AAC9E,UAAMkG,IAASlK,GAAYmJ,EAAS,MAAM;AAC1C,WAAIe,IACK;AAAA,MACL,UAAUA,EAAO;AAAA,MACjB,WAAWA,EAAO;AAAA,MAClB,OAAAlG;AAAA,MACA,YAAYmF,EAAS;AAAA,MACrB,eAAeA,EAAS;AAAA,IAAA,IAKxBgB,GAAgBhB,EAAS,OAAO,IAC3B,EAAE,UAAU,MAAM,WAAW,QAAQ,OAAAnF,EAAA,IAGvC,EAAE,UAAU,MAAM,WAAW,WAAW,OAAAA,EAAA;AAAA,EACjD;AACF;AAIA,SAAS2F,GAAqBH,GAAiC;AAC7D,QAAMY,IAAW3J,EAAmB+I,GAAOpK,EAAG,GAAG,QAAQ,GACnDiL,IAAS3J,EAAQ0J,CAAQ,KAAK,WAE9BE,IAAY7J,EAAmB+I,GAAOpK,EAAG,GAAG,SAAS,GACrDmL,IAAU7J,EAAQ4J,CAAS,KAAK,IAEhCE,IAAU/J,EAAmB+I,GAAOpK,EAAG,GAAG,OAAO,GACjDqL,IAAQD,IAAU,SAAS9J,EAAQ8J,CAAO,KAAK,KAAK,EAAE,IAAI;AAGhE,MAAIE,GACAC;AACJ,QAAM1E,IAAQxF,EAAmB+I,GAAOpK,EAAG,GAAG,KAAK;AACnD,MAAI6G,GAAO;AACT,UAAMe,IAAQvG,EAAmBwF,GAAO7G,EAAG,GAAG,KAAK;AACnD,QAAI4H,GAAO;AACT,YAAMxL,IAAOwL,EAAM,eAAe5H,EAAG,GAAG,MAAM,KAAK4H,EAAM,aAAa,QAAQ,GACxEG,IAAUH,EAAM,eAAe5H,EAAG,GAAG,SAAS,KAAK4H,EAAM,aAAa,WAAW;AACvF,MAAIxL,MAAMkP,IAAarL,EAAS,SAAS7D,GAAM,EAAE,CAAC,IAC9C2L,MAASwD,IAAgBtL,EAAS,SAAS8H,GAAS,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,EAAE,QAAAkD,GAAQ,SAAAE,GAAS,OAAAE,GAAO,YAAAC,GAAY,eAAAC,EAAA;AAC/C;AAMA,SAASR,GAAgBI,GAA0B;AACjD,SAAIA,MAAY,KAAW,KACP,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,EACjE,SAASA,EAAQ,KAAA,CAAM;AAC5C;AC9MO,SAASK,GAAmBC,GAAiD;AAClF,QAAMC,wBAAU,IAAA,GAEV9J,IADMZ,EAASyK,CAAO,EACX;AACjB,SAAAjK,EAAaI,GAAM,CAACnL,MAAU;AAC5B,QAAIA,EAAM,cAAc,gBAAgB;AACtC,YAAMxO,IAAKwO,EAAM,aAAa,IAAI,KAAK,IACjC5N,IAAO4N,EAAM,aAAa,MAAM,KAAK,IACrC3I,IAAS2I,EAAM,aAAa,QAAQ,KAAK;AAC/C,MAAIxO,KACFyjB,EAAI,IAAIzjB,GAAI,EAAE,IAAAA,GAAI,MAAAY,GAAM,QAAAiF,GAAQ;AAAA,IAEpC;AAAA,EACF,CAAC,GACM4d;AACT;ACjBO,MAAMC,KAAkB,EAAE,OAAO,EAAA;AAcjC,SAASC,EACdC,GACAC,GACAC,GACAC,GACe;AACf,QAAMC,IAAwB,CAAA,GAGxBtF,IAAQtF,EAAmBwK,GAAO7L,EAAG,GAAG,KAAK,GAC7CkM,IAAavF,IAAQmF,EAAc,mBAAmBnF,CAAK,IAAI,CAAA,GAC/DwF,IAAwBC,GAAeJ,GAAcE,CAAU;AAGrE,MAAIG,IAA+B;AAEnC,SAAA7K,EAAaqK,GAAO,CAACpV,MAAU;AAC7B,UAAM6V,IAAM7V,EAAM;AAElB,QAAI6V,MAAQ,KAAK;AAEf,YAAM7jB,IAAOgO,EAAM,eAAe;AAClC,MAAIhO,MAAS,MACXwjB,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAOxjB,GAAM,OAAO,EAAE,GAAG0jB,EAAA,GAAe,GAEtEE,IAAgB;AAAA,IAClB,WAAWC,MAAQ,WAAW;AAC5B,YAAM7jB,IAAOgO,EAAM,eAAe;AAClC,MAAIhO,MAAS,MAEXwjB,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAOxjB,GAAM,OAAO,EAAE,GAAG0jB,EAAA,GAAe,GAEtEE,IAAgB;AAAA,IAClB,WAAWC,MAAQ,MAAM;AACvB,YAAMC,IAAgB9V,EAAM,eAAeuJ,EAAG,GAAG,MAAM,KAAKvJ,EAAM,aAAa,QAAQ,GACjF+V,IAAoBC,GAAiBF,CAAa;AAGxD,MAAIC,MAAsBH,MACxBJ,EAAO,KAAK,EAAE,MAAM,SAAS,WAAWO,GAAiC,GACzEH,IAAgBG;AAAA,IAEpB,WAAWF,MAAQ;AACjB,MAAAL,EAAO,KAAK,EAAE,MAAM,MAAA,CAAO,GAC3BI,IAAgB;AAAA,aACPC,MAAQ,OAAO;AAExB,YAAMI,IAAWjW,EAAM,eAAeuJ,EAAG,GAAG,MAAM,KAAKvJ,EAAM,aAAa,QAAQ;AAClF,UAAIiW,GAAU;AACZ,cAAMC,IAAY,SAASD,GAAU,EAAE,GAEjCnQ,IAAaoQ,KAAa,SAAUA,KAAa,QACnDA,IAAY,QACZA;AACJ,QAAAV,EAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,OAAO,OAAO,aAAa1P,CAAU;AAAA,UACrC,OAAO,EAAE,GAAG4P,EAAA;AAAA,QAAY,CACzB;AAAA,MACH;AACA,MAAAE,IAAgB;AAAA,IAClB,MAAA,CAAWC,MAAQ,eAEjBD,IAAgB,OACPC,MAAQ,mBAEjBL,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,OAAO,EAAE,GAAGE,EAAA,GAAe,GACnEE,IAAgB,SACPC,MAAQ,uBAAuBA,MAAQ,wBAEhDX,GAAgB,SAChBM,EAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,OAAO,OAAON,GAAgB,KAAK;AAAA,MACnC,OAAO,EAAE,GAAGQ,GAAa,WAAW,cAAA;AAAA,IAAc,CACnD,GACDE,IAAgB;AAAA,EAKpB,CAAC,GAEMJ;AACT;AAIA,SAASQ,GAAiBG,GAAqD;AAC7E,SAAIA,MAAa,SAAe,SAC5BA,MAAa,WAAiB,WAE3B;AACT;AAKA,SAASR,GAAeS,GAAgBC,GAA2B;AACjE,QAAMC,IAAmB,EAAE,GAAGF,EAAA;AAC9B,aAAW1jB,KAAO,OAAO,KAAK2jB,CAAK;AACjC,IAAIA,EAAM3jB,CAAG,MAAM,WAChB4jB,EAAe5jB,CAAG,IAAI2jB,EAAM3jB,CAAG;AAGpC,SAAO4jB;AACT;AChHO,SAASC,GACdC,GACAC,GACAC,GACAC,GACmB;AAEnB,QAAMC,IAAShM,EAAmB4L,GAAWjN,EAAG,IAAI,QAAQ,GACtDjE,IAASsF,EAAmB4L,GAAWjN,EAAG,IAAI,QAAQ,GACtDhD,IAAYqQ,KAAUtR;AAE5B,MAAI,CAACiB;AACH,WAAO;AAIT,QAAMsQ,IAASjM,EAAmBrE,GAAWgD,EAAG,IAAI,QAAQ;AAC5D,MAAIrU,IAAQ,KACRC,IAAS;AACb,MAAI0hB,GAAQ;AACV,UAAMC,IAAKD,EAAO,aAAa,IAAI,GAC7BE,IAAKF,EAAO,aAAa,IAAI;AACnC,IAAIC,MAAI5hB,IAAQ0U,EAAQ,SAASkN,GAAI,EAAE,CAAC,IACpCC,MAAI5hB,IAASyU,EAAQ,SAASmN,GAAI,EAAE,CAAC;AAAA,EAC3C;AAGA,QAAMC,IAAQzQ,EAAU,uBAAuBgD,EAAG,GAAG,MAAM;AAC3D,MAAIyN,EAAM,WAAW;AACnB,WAAO;AAGT,QAAMC,IAAOD,EAAM,CAAC,GACdE,IACJD,EAAK,eAAe1N,EAAG,GAAG,OAAO,KACjC0N,EAAK,aAAa,SAAS,KAC3BA,EAAK,eAAe1N,EAAG,GAAG,MAAM,KAChC0N,EAAK,aAAa,QAAQ,KAC1B;AAEF,MAAI,CAACC;AACH,WAAO;AAGT,QAAMC,IAAMV,EAAK,IAAIS,CAAG;AACxB,MAAI,CAACC;AACH,WAAO;AAIT,QAAM9f,IAAS8f,EAAI,OAAO,QAAQ,WAAW,EAAE,GACzCC,IAAY/f,EAAO,WAAW,OAAO,IAAIA,IAAS,QAAQA,CAAM,IAChEggB,IAAMX,EAASU,CAAS,KAAKV,EAASrf,CAAM;AAClD,MAAI,CAACggB;AACH,WAAO;AAIT,MAAIC,GACAC;AACJ,MAAIjS,GAAQ;AAEV,IAAAgS,IAAUE,GAAqBlS,CAAM;AACrC,UAAMmS,IAAUd,KAAe,EAAE,KAAK,IAAI,QAAQ,IAAI,MAAM,IAAI,OAAO,GAAA,GAEjEe,IAAO9M,EAAmBtF,GAAQiE,EAAG,IAAI,WAAW,GACpDoO,IAAO/M,EAAmBtF,GAAQiE,EAAG,IAAI,WAAW;AAC1D,QAAItP,IAAIwd,EAAQ,MACZrb,IAAIqb,EAAQ;AAEhB,QAAIC,GAAM;AACR,YAAME,IAAUF,EAAK,aAAa,cAAc,KAAK,UAC/CG,IAAYjN,EAAmB8M,GAAMnO,EAAG,IAAI,WAAW;AAC7D,UAAIsO,KAAA,QAAAA,EAAW,aAAa;AAC1B,cAAMC,IAASlO,EAAQ,SAASiO,EAAU,aAAa,EAAE,CAAC;AAC1D,QAAID,MAAY,SACd3d,IAAI6d,IAGJ7d,IAAIwd,EAAQ,OAAOK;AAAA,MAEvB,OAAO;AAEL,cAAMC,IAAQnN,EAAmB8M,GAAMnO,EAAG,IAAI,OAAO;AACrD,QAAIwO,KAAA,QAAAA,EAAO,gBACT9d,IAAI+d,GAAcD,EAAM,YAAY,QAAQN,GAAS,KAAK,MAAMviB,CAAK,CAAC;AAAA,MAE1E;AAAA,IACF;AAEA,QAAIyiB,GAAM;AACR,YAAMC,IAAUD,EAAK,aAAa,cAAc,KAAK,aAC/CE,IAAYjN,EAAmB+M,GAAMpO,EAAG,IAAI,WAAW;AAC7D,UAAIsO,KAAA,QAAAA,EAAW,aAAa;AAC1B,cAAMC,IAASlO,EAAQ,SAASiO,EAAU,aAAa,EAAE,CAAC;AAC1D,QAAID,MAAY,SACdxb,IAAI0b,IAGJ1b,IAAIqb,EAAQ,MAAMK;AAAA,MAEtB,OAAO;AACL,cAAMC,IAAQnN,EAAmB+M,GAAMpO,EAAG,IAAI,OAAO;AACrD,QAAIwO,KAAA,QAAAA,EAAO,gBACT3b,IAAI6b,GAAcF,EAAM,YAAY,QAAQN,GAAS,KAAK,MAAMtiB,CAAM,CAAC;AAAA,MAE3E;AAAA,IACF;AAEA,IAAAoiB,IAAgB,EAAE,GAAAtd,GAAG,GAAAmC,EAAA;AAAA,EACvB,OAAWwa,MACTU,IAAU;AAGZ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAAD;AAAA,IACA,OAAO,KAAK,MAAMniB,CAAK;AAAA,IACvB,QAAQ,KAAK,MAAMC,CAAM;AAAA,IACzB,SAAAmiB;AAAA,IACA,eAAAC;AAAA,EAAA;AAEJ;AAEA,SAASS,GACPD,GACAN,GACAS,GACQ;AAGR,QAAMC,IAAe,MAAYV,EAAQ,OAAOA,EAAQ;AACxD,UAAQM,GAAA;AAAA,IACN,KAAK;AACH,aAAON,EAAQ;AAAA,IACjB,KAAK;AACH,aAAOA,EAAQ,QAAQU,IAAeD,KAAY;AAAA,IACpD,KAAK;AACH,aAAOT,EAAQ,OAAOU,IAAeD;AAAA,IACvC;AACE,aAAOT,EAAQ;AAAA,EAAA;AAErB;AAEA,SAASQ,GACPF,GACAN,GACAW,GACQ;AAGR,QAAMC,IAAgB,OAAaZ,EAAQ,MAAMA,EAAQ;AACzD,UAAQM,GAAA;AAAA,IACN,KAAK;AACH,aAAON,EAAQ;AAAA,IACjB,KAAK;AACH,aAAOA,EAAQ,OAAOY,IAAgBD,KAAa;AAAA,IACrD,KAAK;AACH,aAAOX,EAAQ,MAAMY,IAAgBD;AAAA,IACvC;AACE,aAAOX,EAAQ;AAAA,EAAA;AAErB;AAMA,SAASD,GAAqBlS,GAAyB;AACrD,QAAMgT,IAAYhT,EAAO,aAAa,WAAW,MAAM,KAGjDiT,IAAW3N,EAAmBtF,GAAQiE,EAAG,IAAI,UAAU,GACvDiP,IAAa5N,EAAmBtF,GAAQiE,EAAG,IAAI,YAAY,GAC3DkP,IAAY7N,EAAmBtF,GAAQiE,EAAG,IAAI,WAAW,GACzDmP,IAAc9N,EAAmBtF,GAAQiE,EAAG,IAAI,aAAa,GAC7DoP,IAAmB/N,EAAmBtF,GAAQiE,EAAG,IAAI,kBAAkB;AAE7E,SAAIiP,KAAcC,KAAaC,IAEtB,aAQAJ,IAAY,iBAAiB;AAKxC;ACpMO,SAASM,GACdpC,GACAqC,GACAC,GACApC,GACmB;AAEnB,QAAMqC,IAAgBvC,EAAU,uBAAuBjN,EAAG,GAAG,OAAO;AACpE,MAAIwP,EAAc,WAAW,EAAG,QAAO;AAEvC,QAAMC,IAAUD,EAAc,CAAC,GACzB7B,IACJ8B,EAAQ,eAAezP,EAAG,GAAG,IAAI,KAAKyP,EAAQ,aAAa,MAAM,KAAK;AACxE,MAAI,CAAC9B;AACH,WAAO;AAIT,QAAMC,IAAM0B,EAAa,IAAI3B,CAAG;AAChC,MAAI,CAACC;AACH,WAAO;AAGT,QAAM8B,IAAY9B,EAAI,OAAO,WAAW,OAAO,IAC3CA,EAAI,SACJ,QAAQA,EAAI,OAAO,QAAQ,WAAW,EAAE,CAAC;AAI7C,MAAIjiB,IAAQ,KACRC,IAAS;AACb,QAAMoR,IACJqE,EAAmB4L,GAAWjN,EAAG,IAAI,QAAQ,KAC7CqB,EAAmB4L,GAAWjN,EAAG,IAAI,QAAQ;AAC/C,MAAIhD,GAAW;AACb,UAAMsQ,IAASjM,EAAmBrE,GAAWgD,EAAG,IAAI,QAAQ;AAC5D,QAAIsN,GAAQ;AACV,YAAMC,IAAKD,EAAO,aAAa,IAAI,GAC7BE,IAAKF,EAAO,aAAa,IAAI;AACnC,MAAIC,MAAI5hB,IAAQ0U,EAAQ,SAASkN,GAAI,EAAE,CAAC,IACpCC,MAAI5hB,IAASyU,EAAQ,SAASmN,GAAI,EAAE,CAAC;AAAA,IAC3C;AAAA,EACF;AAGA,QAAMmC,IAAgBD,EAAU;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA,GAEIE,IAAeL,EAAaI,CAAa;AAE/C,MAAIC,GAAc;AAChB,UAAMC,IAAYrE,GAAmBoE,CAAY;AAEjD,eAAWE,KAASD,EAAU;AAC5B,UAAIC,EAAM,KAAK,SAAS,OAAO,KAAKA,EAAM,OAAO,MAAM,iCAAiC,GAAG;AACzF,cAAMC,IAAYC,GAAoBN,GAAWI,EAAM,MAAM,GACvDhC,IAAMX,EAAS4C,CAAS,KAAK5C,EAAS2C,EAAM,MAAM;AACxD,YAAIhC;AACF,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAAA;AAAA,YACA,OAAO,KAAK,MAAMniB,CAAK;AAAA,YACvB,QAAQ,KAAK,MAAMC,CAAM;AAAA,UAAA;AAAA,MAG/B;AAAA,EAEJ;AAGA,QAAM6hB,IAAQR,EAAU,uBAAuBjN,EAAG,GAAG,MAAM;AAC3D,WAAStW,IAAI,GAAGA,IAAI+jB,EAAM,QAAQ/jB,KAAK;AACrC,UAAMgkB,IAAOD,EAAM/jB,CAAC,GACdumB,IACJvC,EAAK,eAAe1N,EAAG,GAAG,OAAO,KAAK0N,EAAK,aAAa,SAAS,KAAK;AACxE,QAAIuC,GAAS;AACX,YAAMC,IAASZ,EAAa,IAAIW,CAAO;AACvC,UAAIC,GAAQ;AACV,cAAMpiB,IAASoiB,EAAO,OAAO,QAAQ,WAAW,EAAE,GAC5CrC,IAAY/f,EAAO,WAAW,OAAO,IAAIA,IAAS,QAAQA,CAAM,IAChEggB,IAAMX,EAASU,CAAS,KAAKV,EAASrf,CAAM;AAClD,YAAIggB;AACF,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAAA;AAAA,YACA,OAAO,KAAK,MAAMniB,CAAK;AAAA,YACvB,QAAQ,KAAK,MAAMC,CAAM;AAAA,UAAA;AAAA,MAG/B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAASukB,GAAelD,GAA6B;AAC1D,SAAOA,EAAU,uBAAuBjN,EAAG,GAAG,OAAO,EAAE,SAAS;AAClE;AAEA,SAASgQ,GAAoBI,GAAkBC,GAA8B;AAC3E,QAAMC,IAAUF,EAAS,UAAU,GAAGA,EAAS,YAAY,GAAG,CAAC,GACzDG,IAAQF,EAAa,MAAM,GAAG,GAC9BG,IAAYF,EAAQ,MAAM,GAAG;AAEnC,aAAWG,KAAQF;AACjB,IAAIE,MAAS,OACXD,EAAU,IAAA,IACDC,MAAS,OAClBD,EAAU,KAAKC,CAAI;AAIvB,SAAOD,EAAU,KAAK,GAAG;AAC3B;AC3HA,MAAME,KAA0B;AAWzB,SAASC,GACdC,GACA9E,GACA9I,GACAgJ,GACAkB,GACuB;AAEvB,QAAM2D,IAAMC,GAAoBF,GAAa1D,CAAI,GAG3C5hB,IAAwB,CAAA;AA0D9B,SAzDAkW,EAAaoP,GAAa,CAACna,MAAU;;AACnC,QAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBuJ,EAAG,GAAG;AAC1D,YAAM+Q,IAAYnF,EAASnV,GAAOqV,GAAe9I,GAAOgJ,CAAY;AACpE,iBAAWgF,KAASD;AAClB,QAAIC,EAAM,SAAS,UACjB1lB,EAAS,KAAK2lB,GAAuBD,GAAOva,GAAOqV,CAAa,CAAC;AAAA,IAGvE,WAAWrV,EAAM,cAAc,SAASA,EAAM,iBAAiBuJ,EAAG,GAAG;AACnE,YAAMkR,IAAWza,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK,IAC7E0a,IAAY1a,EAAM,eAAeuJ,EAAG,GAAG,QAAQ,KAAKvJ,EAAM,aAAa,UAAU,KAAK,IACtF2a,IAAU3a,EAAM,eAAeuJ,EAAG,GAAG,MAAM,KAAKvJ,EAAM,aAAa,QAAQ,KAAK;AAEtF,UAAI4a,IAAQH,KAAY,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACnF,eAASI,IAAKhmB,EAAS,SAAS,GAAGgmB,KAAM,GAAGA,KAAM;AAChD,cAAMtlB,IAAIV,EAASgmB,CAAE;AACrB,YAAItlB,EAAE,SAAS,YAAUrD,IAAAqD,EAAE,aAAF,gBAAArD,EAAY,UAAS,YAAYqD,EAAE,SAAS,WAAWmlB,KAAanlB,EAAE,SAAS,SAASolB,GAAS;AACxH,UAAIplB,EAAE,SAAS,OAAOqlB,MACpBA,IAAQrlB,EAAE,SAAS;AAErB;AAAA,QACF;AACA,YAAI,EAAAA,EAAE,SAAS,YAAUoB,IAAApB,EAAE,aAAF,gBAAAoB,EAAY,UAAS,aAC1C,EAAApB,EAAE,SAAS,UAAU,CAACA,EAAE;AAC5B;AAAA,MACF;AACA,YAAMulB,IAAW,EAAE,IAAIF,GAAO,MAAM,UAAmB,QAAQF,GAAW,MAAMC,EAAA;AAChF,MAAA5P,EAAa/K,GAAO,CAAC+a,MAAa;AAChC,YAAIA,EAAS,cAAc,OAAOA,EAAS,iBAAiBxR,EAAG,GAAG;AAChE,gBAAM+Q,IAAYnF,EAAS4F,GAAU1F,GAAe9I,GAAOgJ,CAAY;AACvE,qBAAWgF,KAASD;AAClB,YAAIC,EAAM,SAAS,WACjBA,EAAM,WAAWO,GACjBjmB,EAAS,KAAK2lB,GAAuBD,GAAOQ,GAAU1F,CAAa,CAAC;AAAA,QAG1E;AAAA,MACF,CAAC;AAAA,IACH,WAAWrV,EAAM,cAAc,SAASA,EAAM,iBAAiBuJ,EAAG,GAAG;AACnE,YAAMqR,IAAQ5a,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,IACrI0a,IAAY1a,EAAM,eAAeuJ,EAAG,GAAG,QAAQ,KAAKvJ,EAAM,aAAa,UAAU,KAAK,IACtF2a,IAAU3a,EAAM,eAAeuJ,EAAG,GAAG,MAAM,KAAKvJ,EAAM,aAAa,QAAQ,KAAK,IAChF8a,IAAW,EAAE,IAAIF,GAAO,MAAM,UAAmB,QAAQF,GAAW,MAAMC,EAAA;AAChF,MAAA5P,EAAa/K,GAAO,CAACgb,MAAa;AAChC,YAAIA,EAAS,cAAc,OAAOA,EAAS,iBAAiBzR,EAAG,GAAG;AAChE,gBAAM+Q,IAAYnF,EAAS6F,GAAU3F,GAAe9I,GAAOgJ,CAAY;AACvE,qBAAWgF,KAASD;AAClB,YAAIC,EAAM,SAAS,WACjBA,EAAM,WAAWO,GACjBjmB,EAAS,KAAK2lB,GAAuBD,GAAOS,GAAU3F,CAAa,CAAC;AAAA,QAG1E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC,GAEGxgB,EAAS,WAAW,IAAU,OAE3B,EAAE,MAAM,aAAa,KAAAulB,GAAK,UAAAvlB,EAAA;AACnC;AAIA,SAASwlB,GACPF,GACA1D,GACQ;AAER,QAAMS,IAAMiD,EAAY,eAAe5Q,EAAG,GAAG,IAAI,KAAK4Q,EAAY,aAAa,MAAM,KAAK;AAC1F,MAAIjD,GAAK;AACP,UAAMC,IAAMV,EAAK,IAAIS,CAAG;AACxB,QAAIC,KAAA,QAAAA,EAAK,OAAQ,QAAOA,EAAI;AAAA,EAC9B;AAGA,QAAM7R,IAAS6U,EAAY,eAAe5Q,EAAG,GAAG,QAAQ,KAAK4Q,EAAY,aAAa,UAAU;AAChG,SAAI7U,IAAe,IAAIA,CAAM,KAEtB;AACT;AAMA,SAASkV,GACPD,GACAnF,GACAC,GACW;AACX,QAAMnF,IAAQtF,EAAmBwK,GAAO7L,EAAG,GAAG,KAAK,GAC7CkM,IAAavF,IAAQmF,EAAc,mBAAmBnF,CAAK,IAAI,CAAA,GAE/DtP,IAAkB,EAAE,GAAG2Z,EAAM,MAAA;AAGnC,SAAI9E,EAAW,UAAU,UAAa,CAAC7U,EAAM,UAC3CA,EAAM,QAAQqZ,KAIZxE,EAAW,cAAc,UAAa7U,EAAM,cAAc,WAC5DA,EAAM,YAAY,KAGb,EAAE,GAAG2Z,GAAO,OAAA3Z,EAAA;AACrB;ACpHO,SAASqa,GACdC,GACA7F,GACA9I,GACA4O,GACA1E,GACAC,GACAC,GACAyE,GACe;AAEf,QAAMhL,IAAQxF,EAAmBsQ,GAAa3R,EAAG,GAAG,KAAK;AACzD,MAAImH,IAAiC,CAAA,GACjC6E,IAAyB,CAAA,GAGzB/F,IAAyB;AAC7B,MAAIY,GAAO;AACT,UAAMiL,IAAWzQ,EAAmBwF,GAAO7G,EAAG,GAAG,QAAQ;AACzD,IAAAiG,IAAU3E,EAAQwQ,CAAQ;AAAA,EAC5B;AAEA,MAAI7L,GAAS;AACX,UAAMiD,IAAW4C,EAAc,aAAa7F,CAAO;AACnD,IAAAkB,IAAiB,EAAE,GAAG+B,EAAS,UAAA,GAC/B8C,IAAe,EAAE,GAAG9C,EAAS,IAAA;AAAA,EAC/B;AAGA,MAAIrC,GAAO;AACT,UAAMkL,IAAiBjG,EAAc,yBAAyBjF,CAAK;AACnE,IAAAmL,GAAkB7K,GAAgB4K,CAAc;AAGhD,UAAMpL,IAAQtF,EAAmBwF,GAAO7G,EAAG,GAAG,KAAK;AACnD,QAAI2G,GAAO;AACT,YAAMsL,IAAgBnG,EAAc,mBAAmBnF,CAAK;AAC5D,MAAAqL,GAAkBhG,GAAciG,CAAa;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,CAAC9K,EAAe,cAAclB,GAAS;AACzC,UAAMrB,IAAQsN,GAAuBjM,CAAO;AAC5C,IAAIrB,MAAU,WACZuC,EAAe,aAAavC;AAAA,EAEhC;AAGA,MAAIuC,EAAe,SAASA,EAAe,UAAU,KAAK;AACxD,UAAMvC,IAAQuC,EAAe,aAAa,GACpCgL,IAAUP,EAAkB,QAAQzK,EAAe,OAAOvC,CAAK;AACrE,IAAIuN,MACFhL,EAAe,WAAWgL,EAAQ,UAClChL,EAAe,YAAYgL,EAAQ,WACnChL,EAAe,YAAYgL,EAAQ;AAAA,EAEvC;AAGA,QAAMlG,IAAwB,CAAA;AAE9B,MAAImG,IAAyB;AA8E7B,MA5EA5Q,EAAamQ,GAAa,CAAClb,MAAU;;AACnC,UAAM6V,IAAM7V,EAAM,WACZ4b,IAAU5b,EAAM;AAEtB,QAAI6V,MAAQ;AAEZ,UAAWA,MAAQ,OAAO+F,MAAYrS,EAAG,GAAG;AAE1C,YAAIsS,GAAiB7b,GAAO2b,GAAY,CAACG,MAAa;AAAE,UAAAH,IAAaG;AAAA,QAAS,CAAC;AAC7E;AAGF,YAAIH,MAAe,UAAU;AAC3B,gBAAMI,IAAeC,GAAuBhc,GAAO,CAAA0V,OAC1C,EAAE,MAAM,QAAiB,OAAOA,GAAa,OAAO,EAAE,GAAGH,IAAa,IAC5EF,GAAe9I,GAAOgJ,CAAY;AACrC,UAAAC,EAAO,KAAK,GAAGuG,CAAY;AAC3B;AAAA,QACF;AACA,QAAAE,GAAkBjc,GAAOwV,GAAQiB,GAAMC,GAAUrB,GAAe9I,GAAOgJ,GAAcoB,CAAW;AAAA,MAClG,WAAWd,MAAQ,SAAS+F,MAAYrS,EAAG,GAAG;AAC5C,cAAMkR,IAAWza,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK,IAC7E0a,IAAY1a,EAAM,eAAeuJ,EAAG,GAAG,QAAQ,KAAKvJ,EAAM,aAAa,UAAU,KAAK,IACtF2a,IAAU3a,EAAM,eAAeuJ,EAAG,GAAG,MAAM,KAAKvJ,EAAM,aAAa,QAAQ,KAAK;AAEtF,YAAI4a,IAAQH,KAAY,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACnF,iBAASI,IAAKrF,EAAO,SAAS,GAAGqF,KAAM,GAAGA,KAAM;AAC9C,gBAAMtlB,IAAIigB,EAAOqF,CAAE;AACnB,cAAItlB,EAAE,SAAS,YAAUrD,IAAAqD,EAAE,aAAF,gBAAArD,EAAY,UAAS,YAAYqD,EAAE,SAAS,WAAWmlB,KAAanlB,EAAE,SAAS,SAASolB,GAAS;AACxH,YAAIplB,EAAE,SAAS,OAAOqlB,MACpBA,IAAQrlB,EAAE,SAAS;AAErB;AAAA,UACF;AACA,cAAI,EAAAA,EAAE,SAAS,YAAUoB,IAAApB,EAAE,aAAF,gBAAAoB,EAAY,UAAS,aAC1C,EAAApB,EAAE,SAAS,UAAU,CAACA,EAAE;AAC5B;AAAA,QACF;AAEA,QAAAwV,EAAa/K,GAAO,CAAC+a,MAAa;AAChC,UAAIA,EAAS,cAAc,OAAOA,EAAS,iBAAiBxR,EAAG,KAC7D0S,GAAkBlB,GAAUvF,GAAQiB,GAAMC,GAAUrB,GAAe9I,GAAOgJ,GAAcoB,GAAa,EAAE,IAAIiE,GAAO,MAAM,UAAU,QAAQF,GAAW,MAAMC,GAAS;AAAA,QAExK,CAAC;AAAA,MACH,WAAW9E,MAAQ,SAAS+F,MAAYrS,EAAG,GAAG;AAC5C,cAAMqR,IAAQ5a,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,IACrI0a,IAAY1a,EAAM,eAAeuJ,EAAG,GAAG,QAAQ,KAAKvJ,EAAM,aAAa,UAAU,KAAK,IACtF2a,IAAU3a,EAAM,eAAeuJ,EAAG,GAAG,MAAM,KAAKvJ,EAAM,aAAa,QAAQ,KAAK;AAEtF,QAAA+K,EAAa/K,GAAO,CAACgb,MAAa;AAChC,UAAIA,EAAS,cAAc,OAAOA,EAAS,iBAAiBzR,EAAG,KAC7D0S,GAAkBjB,GAAUxF,GAAQiB,GAAMC,GAAUrB,GAAe9I,GAAOgJ,GAAcoB,GAAa,EAAE,IAAIiE,GAAO,MAAM,UAAU,QAAQF,GAAW,MAAMC,GAAS;AAAA,QAExK,CAAC;AAAA,MACH,WAAW9E,MAAQ,eAAe+F,MAAYrS,EAAG,GAAG;AAClD,cAAM2S,IAAUhC,GAAela,GAAOqV,GAAe9I,GAAOgJ,GAAckB,CAAI;AAC9E,QAAIyF,KAAS1G,EAAO,KAAK0G,CAAO;AAAA,MAClC,WAAWrG,MAAQ,sBAAsB+F,MAAYrS,EAAG;AAEtD,QAAA4S,GAA+Bnc,GAAOwV,GAAQiB,GAAMC,GAAUrB,GAAe9I,GAAOgJ,GAAcoB,CAAW;AAAA,eACpGd,MAAQ,WAAW+F,MAAYrS,EAAG,GAAG;AAE9C,cAAM6S,IAAaC,GAAgBrc,GAAOuV,CAAY;AACtD,QAAAC,EAAO,KAAK,GAAG4G,CAAU;AAAA,MAC3B,WAAWvG,MAAQ,uBAAuB+F,MAAYrS,EAAG,GAAG;AAC1D,cAAM+S,IAAYtc,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK;AACpF,QAAIsc,OAAkB,KAAK,EAAE,MAAM,iBAAiB,UAAU,SAAS,WAAAA,GAAW;AAAA,MACpF,WAAWzG,MAAQ,qBAAqB+F,MAAYrS,EAAG,GAAG;AACxD,cAAM+S,IAAYtc,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK;AACpF,QAAIsc,OAAkB,KAAK,EAAE,MAAM,iBAAiB,UAAU,OAAO,WAAAA,GAAW;AAAA,MAClF;AAAA;AAAA,EAGF,CAAC,GAGG9G,EAAO,WAAW,GAAG;AACvB,UAAM+G,IAAkBhH,EAAa,QAAQ6F,KAAmB;AAChE,IAAA5F,EAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,EAAE,GAAGD,GAAc,MAAMgH,EAAA;AAAA,IAAgB,CACjD;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAA/G;AAAA,IACA,OAAO9E;AAAA,EAAA;AAEX;AAQA,SAASmL,GACPzG,GACAoH,GACAC,GACS;AACT,QAAMC,IAAU9R,EAAmBwK,GAAO7L,EAAG,GAAG,SAAS,GACnDoT,IAAY/R,EAAmBwK,GAAO7L,EAAG,GAAG,WAAW;AAE7D,MAAImT,GAAS;AACX,UAAME,IAAcF,EAAQ,eAAenT,EAAG,GAAG,aAAa,KAAKmT,EAAQ,aAAa,eAAe;AACvG,WAAIE,MAAgB,WAClBH,EAAS,OAAO,GACT,MACEG,MAAgB,cACzBH,EAAS,QAAQ,GACV,OACEG,MAAgB,SACzBH,EAAS,MAAM,GACR;AAAA,EAGX;AAEA,SAAI,GAAAE,KAAaH,MAAiB;AAKpC;AAKA,SAASR,GACP5G,GACAyH,GACAxH,GACA9I,GACAgJ,GACe;AACf,SAAOJ,EAASC,GAAOC,GAAe9I,GAAOgJ,CAAY;AAC3D;AAIA,SAAS0G,GACP7G,GACAI,GACAiB,GACAC,GACArB,GACA9I,GACAgJ,GACAoB,GACAmE,GACM;AAEN,MAAItE,IAAY5L,EAAmBwK,GAAO7L,EAAG,GAAG,SAAS,GACrDuT,IAASlS,EAAmBwK,GAAO7L,EAAG,GAAG,MAAM;AAGnD,MAAI,CAACiN,KAAa,CAACsG,GAAQ;AACzB,UAAMC,IAAOnS,EAAmBwK,GAAO7L,EAAG,IAAI,kBAAkB;AAChE,QAAIwT,GAAM;AACR,YAAMC,IAAWpS,EAAmBmS,GAAMxT,EAAG,IAAI,QAAQ;AAEzD,UADIyT,MAAUxG,IAAY5L,EAAmBoS,GAAUzT,EAAG,GAAG,SAAS,IAClE,CAACiN,GAAW;AACd,cAAMyG,IAAarS,EAAmBmS,GAAMxT,EAAG,IAAI,UAAU;AAC7D,QAAI0T,MAAYH,IAASlS,EAAmBqS,GAAY1T,EAAG,GAAG,MAAM;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,MAAIiN;AACF,QAAI,CAACkD,GAAelD,CAAS,GAAG;AAC9B,YAAM0G,IAAW3G,GAAWC,GAAWC,GAAMC,GAAUC,CAAW;AAClE,MAAIuG,IACF1H,EAAO,KAAK0H,CAAQ,IAGpB1H,EAAO,KAAK,GAAG2H,GAAsB3G,GAAWnB,GAAe9I,GAAOgJ,CAAY,CAAC;AAAA,IAEvF;AAAA,aAESuH,GAAQ;AACjB,UAAMI,IAAWE,GAAkBN,GAAQrG,GAAMC,CAAQ;AACzD,IAAIwG,IACF1H,EAAO,KAAK0H,CAAQ,IAEpB1H,EAAO,KAAK,GAAG2H,GAAsBL,GAAQzH,GAAe9I,GAAOgJ,CAAY,CAAC;AAAA,EAEpF,OAAO;AAEL,UAAM+E,IAAYnF,EAASC,GAAOC,GAAe9I,GAAOgJ,CAAY;AACpE,QAAIuF;AAEF,iBAAWP,KAASD;AAClB,QAAIC,EAAM,SAAS,WACjBA,EAAM,WAAWO;AAIvB,IAAAtF,EAAO,KAAK,GAAG8E,CAAS;AAAA,EAC1B;AACF;AAMA,SAAS6B,GACPY,GACAvH,GACAiB,GACAC,GACArB,GACA9I,GACAgJ,GACAoB,GACM;AACN,QAAMqG,IAAWpS,EAAmBmS,GAAMxT,EAAG,IAAI,QAAQ;AACzD,MAAIyT,GAAU;AACZ,QAAIK,IAAU;AAiBd,QAhBAtS,EAAaiS,GAAU,CAAChd,MAAU;AAChC,UAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBuJ,EAAG;AACvD,QAAA0S,GAAkBjc,GAAOwV,GAAQiB,GAAMC,GAAUrB,GAAe9I,GAAOgJ,GAAcoB,CAAW,GAChG0G,IAAU;AAAA,eACDrd,EAAM,cAAc,aAAaA,EAAM,iBAAiBuJ,EAAG,GAAG;AACvE,YAAI,CAACmQ,GAAe1Z,CAAK,GAAG;AAC1B,gBAAMkd,IAAW3G,GAAWvW,GAAOyW,GAAMC,GAAUC,CAAW;AAC9D,UAAIuG,IACF1H,EAAO,KAAK0H,CAAQ,IAEpB1H,EAAO,KAAK,GAAG2H,GAAsBnd,GAAOqV,GAAe9I,GAAOgJ,CAAY,CAAC;AAAA,QAEnF;AACA,QAAA8H,IAAU;AAAA,MACZ;AAAA,IACF,CAAC,GACGA,EAAS;AAAA,EACf;AAGA,QAAMJ,IAAarS,EAAmBmS,GAAMxT,EAAG,IAAI,UAAU;AAC7D,EAAI0T,KACFlS,EAAakS,GAAY,CAACjd,MAAU;AAClC,QAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBuJ,EAAG;AACvD,MAAA0S,GAAkBjc,GAAOwV,GAAQiB,GAAMC,GAAUrB,GAAe9I,GAAOgJ,GAAcoB,CAAW;AAAA,aACvF3W,EAAM,cAAc,UAAUA,EAAM,iBAAiBuJ,EAAG,GAAG;AACpE,YAAM2T,IAAWE,GAAkBpd,GAAOyW,GAAMC,CAAQ;AACxD,MAAIwG,IACF1H,EAAO,KAAK0H,CAAQ,IAEpB1H,EAAO,KAAK,GAAG2H,GAAsBnd,GAAOqV,GAAe9I,GAAOgJ,CAAY,CAAC;AAAA,IAEnF;AAAA,EACF,CAAC;AAEL;AAQA,SAAS4H,GACPG,GACAjI,GACA9I,GACAgJ,GACe;AACf,QAAMgI,IAAeD,EAAY,uBAAuB/T,EAAG,GAAG,aAAa;AAC3E,MAAIgU,EAAa,WAAW,EAAG,QAAO,CAAA;AAEtC,QAAM/H,IAAwB,CAAA,GACxBgI,IAAcD,EAAa,CAAC;AAClC,MAAIE,IAAmB;AAEvB,SAAA1S,EAAayS,GAAa,CAACxd,MAAU;AACnC,IAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBuJ,EAAG,MAClDkU,KACHjI,EAAO,KAAK,EAAE,MAAM,SAAS,WAAW,QAAQ,GAElDiI,IAAmB,IAEnB1S,EAAa/K,GAAO,CAAC0d,MAAW;AAC9B,MAAIA,EAAO,cAAc,OAAOA,EAAO,iBAAiBnU,EAAG,KACzDiM,EAAO,KAAK,GAAGL,EAASuI,GAAQrI,GAAe9I,GAAOgJ,CAAY,CAAC;AAAA,IAEvE,CAAC;AAAA,EAEL,CAAC,GAEMC;AACT;AAOA,SAAS4H,GACPN,GACArG,GACAC,GACmB;AACnB,QAAMiH,IAAS,iCACTC,IAAgBd,EAAO,uBAAuBa,GAAQ,WAAW;AACvE,MAAIC,EAAc,WAAW,EAAG,QAAO;AAEvC,QAAM3oB,IAAY2oB,EAAc,CAAC,GAC3B1G,IAAMjiB,EAAU,eAAesU,EAAG,GAAG,IAAI,KAC1CtU,EAAU,aAAa,MAAM,KAC7BA,EAAU,eAAesU,EAAG,GAAG,MAAM,KACrC;AACL,MAAI,CAAC2N,EAAK,QAAO;AAEjB,QAAMC,IAAMV,EAAK,IAAIS,CAAG;AACxB,MAAI,CAACC,EAAK,QAAO;AAEjB,QAAM9f,IAAS8f,EAAI,OAAO,QAAQ,WAAW,EAAE,GACzCC,IAAY/f,EAAO,WAAW,OAAO,IAAIA,IAAS,QAAQA,CAAM,IAChEggB,IAAMX,EAASU,CAAS,KAAKV,EAASrf,CAAM;AAClD,MAAI,CAACggB,EAAK,QAAO;AAGjB,QAAMwG,IAAWf,EAAO,uBAAuBa,GAAQ,OAAO;AAC9D,MAAIzoB,IAAQ,KACRC,IAAS;AACb,MAAI0oB,EAAS,SAAS,GAAG;AACvB,UAAM9mB,IAAW8mB,EAAS,CAAC,EAAE,aAAa,OAAO,KAAK,IAChDC,IAAa/mB,EAAS,MAAM,qBAAqB,GACjDgnB,IAAchnB,EAAS,MAAM,sBAAsB;AAEzD,IAAI+mB,MAAY5oB,IAAQ,WAAW4oB,EAAW,CAAC,CAAC,KAAK,KAAK,MACtDC,MAAa5oB,IAAS,WAAW4oB,EAAY,CAAC,CAAC,KAAK,KAAK;AAAA,EAC/D;AAEA,SAAO,EAAE,MAAM,SAAS,KAAA1G,GAAK,OAAO,KAAK,MAAMniB,CAAK,GAAG,QAAQ,KAAK,MAAMC,CAAM,EAAA;AAClF;AAQA,SAASknB,GAAgB2B,GAAkBzI,GAAuC;AAChF,QAAM0I,IAAcD,EAAQ,uBAAuBzU,EAAG,GAAG,GAAG,GACtDuQ,IAAkB,CAAA;AACxB,WAAS7mB,IAAI,GAAGA,IAAIgrB,EAAY,QAAQhrB,KAAK;AAC3C,UAAMjB,IAAOisB,EAAYhrB,CAAC,EAAE,eAAe;AAC3C,IAAIjB,EAAK,KAAA,KAAQ8nB,EAAM,KAAK9nB,CAAI;AAAA,EAClC;AAGA,SAAO,CAAC;AAAA,IACN,MAAM;AAAA,IACN,OAHkB8nB,EAAM,SAAS,IAAIA,EAAM,KAAK,EAAE,IAAI;AAAA,IAItD,OAAO,EAAE,GAAGvE,GAAc,QAAQ,GAAA;AAAA,EAAK,CACxC;AACH;AAIA,SAASkG,GAAuBjM,GAAqC;AACnE,QAAM0O,IAAK1O,EAAQ,MAAM,oBAAoB;AAC7C,MAAI0O,GAAI;AACN,UAAM/P,IAAQ,SAAS+P,EAAG,CAAC,GAAG,EAAE;AAChC,QAAI/P,KAAS,KAAKA,KAAS,EAAG,QAAOA;AAAA,EACvC;AACA,QAAMgQ,IAAK3O,EAAQ,MAAM,cAAc;AACvC,MAAI2O,GAAI;AACN,UAAMhQ,IAAQ,SAASgQ,EAAG,CAAC,GAAG,EAAE;AAChC,QAAIhQ,KAAS,KAAKA,KAAS,EAAG,QAAOA;AAAA,EACvC;AAEF;AAOA,SAASoN,GAAoClkB,GAAWsG,GAA0B;AAChF,aAAWjL,KAAO,OAAO,KAAKiL,CAAM;AAClC,IAAIA,EAAOjL,CAAG,MAAM,WAClB2E,EAAO3E,CAAG,IAAIiL,EAAOjL,CAAG;AAG9B;AC3cO,SAAS0rB,GACdC,GACAhJ,GACA9I,GACA4O,GACA1E,GACAC,GACAC,GACW;AAEX,QAAM2H,IAAYC,GAAeF,CAAO,GAGlC,EAAE,YAAA5oB,GAAY,aAAApC,GAAa,aAAAD,MAAgBorB,GAAkBH,GAAS9R,CAAK,GAG3EkS,IAAahU,GAAiB4T,GAAS9U,EAAG,GAAG,IAAI,GACjDmV,IAAoB,CAAA;AAE1B,aAAWC,KAAQF;AACjB,IAAAC,EAAQ;AAAA,MACNE,GAAcD,GAAMtJ,GAAe9I,GAAO4O,GAAmB1E,GAAMC,GAAUC,CAAW;AAAA,IAAA;AAO5F,SAAO,EAAE,MAAM,SAAS,MAFXkI,GAAqBH,CAAO,GAEX,WAAAJ,GAAW,YAAA7oB,GAAY,aAAApC,GAAa,aAAAD,EAAA;AACpE;AAIA,SAASmrB,GAAeF,GAA4B;AAClD,QAAMC,IAAsB,CAAA,GACtBQ,IAAYlU,EAAmByT,GAAS9U,EAAG,GAAG,SAAS;AAC7D,MAAI,CAACuV,EAAW,QAAOR;AAEvB,aAAWS,KAAStU,GAAiBqU,GAAWvV,EAAG,GAAG,SAAS,GAAG;AAChE,UAAM3T,IAAImpB,EAAM,eAAexV,EAAG,GAAG,GAAG,KAAKwV,EAAM,aAAa,KAAK;AACrE,IAAAT,EAAU,KAAK1oB,IAAI4T,EAAS,SAAS5T,GAAG,EAAE,CAAC,IAAI,GAAG;AAAA,EACpD;AACA,SAAO0oB;AACT;AAEA,SAASE,GACPH,GACA9R,GACqE;AACrE,QAAMyS,IAAUpU,EAAmByT,GAAS9U,EAAG,GAAG,OAAO;AACzD,MAAI,CAACyV,EAAS,QAAO,CAAA;AAErB,QAAMC,IAAerU,EAAmBoU,GAASzV,EAAG,GAAG,YAAY;AACnE,MAAI,CAAC0V,EAAc,QAAO,CAAA;AAG1B,QAAMC,IAActU,EAAmBqU,GAAc1V,EAAG,GAAG,KAAK;AAChE,MAAI,CAAC2V,EAAa,QAAO,CAAA;AAEzB,QAAMnjB,IAAM8O,EAAQqU,CAAW,GACzBzpB,IAAasG,MAAQ,UAAUA,MAAQ,QAAQ,UAAU,OAGzD4W,IAAauM,EAAY,eAAe3V,EAAG,GAAG,YAAY,KAAK2V,EAAY,aAAa,cAAc;AAC5G,MAAI7rB;AACJ,MAAIsf,GAAY;AACd,UAAMF,IAAWnG,GAAkBC,GAAOoG,CAAU;AACpD,IAAIF,MAAUpf,IAAcof;AAAA,EAC9B,OAAO;AACL,UAAMnd,IAAQ4pB,EAAY,eAAe3V,EAAG,GAAG,OAAO,KAAK2V,EAAY,aAAa,SAAS;AAC7F,IAAI5pB,KAASA,MAAU,WAAQjC,IAAc,IAAIiC,CAAK;AAAA,EACxD;AAGA,QAAM6pB,IAAKD,EAAY,eAAe3V,EAAG,GAAG,IAAI,KAAK2V,EAAY,aAAa,MAAM,GAC9E9rB,IAAc+rB,IAAKrV,GAAa,SAASqV,GAAI,EAAE,CAAC,IAAI;AAE1D,SAAO,EAAE,YAAA1pB,GAAY,aAAApC,GAAa,aAAAD,EAAA;AACpC;AAoBA,SAASwrB,GACPQ,GACA/J,GACA9I,GACA4O,GACA1E,GACAC,GACAC,GACQ;AACR,MAAIxhB;AACJ,QAAMkqB,IAASzU,EAAmBwU,GAAO7V,EAAG,GAAG,MAAM;AACrD,MAAI8V,GAAQ;AACV,UAAMC,IAAa1U,EAAmByU,GAAQ9V,EAAG,GAAG,UAAU;AAC9D,QAAI+V,GAAY;AACd,YAAMvjB,IAAMujB,EAAW,eAAe/V,EAAG,GAAG,KAAK,KAAK+V,EAAW,aAAa,OAAO,GAC/EC,IAAQD,EAAW,eAAe/V,EAAG,GAAG,OAAO,KAAK+V,EAAW,aAAa,SAAS;AAC3F,UAAIvjB,GAAK;AACP,cAAMuT,IAAK9F,EAAS,SAASzN,GAAK,EAAE,CAAC;AACrC,QAAIwjB,MAAU,UACZpqB,IAASma,IAGTna,IAAS,KAAK,IAAIma,GAAI,GAAG;AAAA,MAE7B;AAAA,IACF;AAAA,EACF;AAEA,QAAMhZ,IAAmB,CAAA;AACzB,aAAWkpB,KAAQ/U,GAAiB2U,GAAO7V,EAAG,GAAG,IAAI;AACnD,IAAAjT,EAAM,KAAKmpB,GAAeD,GAAMnK,GAAe9I,GAAO4O,GAAmB1E,GAAMC,GAAUC,CAAW,CAAC;AAGvG,SAAO,EAAE,QAAAxhB,GAAQ,OAAAmB,EAAA;AACnB;AAEA,SAASmpB,GACPC,GACArK,GACA9I,GACA4O,GACA1E,GACAC,GACAC,GACS;AACT,QAAMgJ,IAAS/U,EAAmB8U,GAAQnW,EAAG,GAAG,MAAM;AAGtD,MAAI3V,IAAU;AACd,MAAI+rB,GAAQ;AACV,UAAMC,IAAahV,EAAmB+U,GAAQpW,EAAG,GAAG,UAAU;AAC9D,QAAIqW,GAAY;AACd,YAAM7jB,IAAM8O,EAAQ+U,CAAU;AAC9B,MAAI7jB,MAAKnI,IAAU,SAASmI,GAAK,EAAE;AAAA,IACrC;AAAA,EACF;AAGA,MAAI8jB,IAAwC;AAC5C,MAAIF,GAAQ;AACV,UAAMG,IAAWlV,EAAmB+U,GAAQpW,EAAG,GAAG,QAAQ;AAC1D,IAAIuW,MAEFD,IADYhV,EAAQiV,CAAQ,MACX,YAAY,YAAY;AAAA,EAE7C;AAGA,MAAIte;AACJ,MAAIme,GAAQ;AACV,UAAM5R,IAAQnD,EAAmB+U,GAAQpW,EAAG,GAAG,KAAK;AACpD,IAAIwE,MACFvM,IAAkByM,GAAeF,GAAOxB,CAAK,KAAK;AAAA,EAEtD;AAGA,MAAItI;AACJ,MAAI0b,GAAQ;AACV,UAAMI,IAAWnV,EAAmB+U,GAAQpW,EAAG,GAAG,QAAQ;AAC1D,IAAIwW,MAAU9b,IAAgB4G,EAAQkV,CAAQ,KAAK;AAAA,EACrD;AAGA,MAAI7qB;AACJ,MAAIyqB,GAAQ;AACV,UAAMK,IAAQpV,EAAmB+U,GAAQpW,EAAG,GAAG,KAAK;AACpD,QAAIyW,GAAO;AACT,YAAMpqB,IAAIoqB,EAAM,eAAezW,EAAG,GAAG,GAAG,KAAKyW,EAAM,aAAa,KAAK,GAC/DC,IAAQD,EAAM,eAAezW,EAAG,GAAG,MAAM,KAAKyW,EAAM,aAAa,QAAQ;AAC/E,MAAIpqB,KAAKqqB,MAAU,UACjB/qB,IAAQsU,EAAS,SAAS5T,GAAG,EAAE,CAAC;AAAA,IAEpC;AAAA,EACF;AAGA,QAAMsqB,IAAcC,GAAiBR,CAAM,GAGrCS,IAA8B,CAAA;AACpC,SAAAC,GAAiBX,GAAQU,GAAY/K,GAAe9I,GAAO4O,GAAmB1E,GAAMC,GAAUC,CAAW,GAElG,EAAE,YAAAyJ,GAAY,SAAAxsB,GAAS,QAAAisB,GAAQ,iBAAAre,GAAiB,eAAAyC,GAAe,aAAAic,GAAa,OAAAhrB,EAAA;AACrF;AAMA,SAASirB,GAAiBR,GAA8C;AACtE,MAAI,CAACA,EAAQ;AAEb,QAAMW,IAAc1V,EAAmB+U,GAAQpW,EAAG,GAAG,WAAW;AAChE,MAAI,CAAC+W,EAAa;AAElB,QAAMC,IAAQ,CAAC,OAAO,SAAS,UAAU,MAAM,GACzCC,IAAkB,CAAA;AACxB,MAAIC,IAAe;AAEnB,aAAWC,KAAQH,GAAO;AACxB,UAAMI,IAAW/V,EAAmB0V,GAAa/W,EAAG,GAAGmX,CAAI;AAC3D,QAAIC,GAAU;AACZ,YAAM5kB,IAAM8O,EAAQ8V,CAAQ,KAAK;AACjC,MAAAH,EAAM,KAAKnW,GAAgBtO,CAAG,KAAK,CAAC,GACpC0kB,IAAe;AAAA,IACjB;AACE,MAAAD,EAAM,KAAK,EAAE;AAAA,EAEjB;AAEA,SAAOC,IAAeD,IAAQ;AAChC;AAKA,SAASH,GACPX,GACAU,GACA/K,GACA9I,GACA4O,GACA1E,GACAC,GACAC,GACM;AACN,EAAA5L,EAAa2U,GAAQ,CAAC1f,MAAU;AAC9B,QAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBuJ,EAAG;AACvD,MAAA6W,EAAW;AAAA,QACTnF,GAAejb,GAAOqV,GAAe9I,GAAO4O,GAAmB1E,GAAMC,GAAUC,CAAW;AAAA,MAAA;AAAA,aAEnF3W,EAAM,cAAc,SAASA,EAAM,iBAAiBuJ,EAAG,GAAG;AAEnE,YAAMqX,IAAcxC,GAAWpe,GAAOqV,GAAe9I,GAAO4O,GAAmB1E,GAAMC,GAAUC,CAAW;AAE1G,MAAAyJ,EAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,QAAQ,CAAC,EAAE,MAAM,eAAe,OAAOQ,GAAoB;AAAA,QAC3D,OAAO,CAAA;AAAA,MAAC,CACT;AAAA,IACH,WAAW5gB,EAAM,cAAc,SAASA,EAAM,iBAAiBuJ,EAAG,GAAG;AAEnE,YAAMsX,IAAejW,EAAmB5K,GAAOuJ,EAAG,GAAG,YAAY;AACjE,MAAIsX,KACF9V,EAAa8V,GAAc,CAACC,MAAa;AACvC,QAAIA,EAAS,cAAc,OAAOA,EAAS,iBAAiBvX,EAAG,KAC7D6W,EAAW;AAAA,UACTnF,GAAe6F,GAAUzL,GAAe9I,GAAO4O,GAAmB1E,GAAMC,GAAUC,CAAW;AAAA,QAAA;AAAA,MAGnG,CAAC;AAAA,IAEL;AAAA,EACF,CAAC;AACH;AAIA,SAASkI,GAAqBH,GAAmC;AAC/D,QAAMroB,IAAuB,CAAA,GAEvB0qB,wBAAmB,IAAA;AAEzB,WAASC,IAAS,GAAGA,IAAStC,EAAQ,QAAQsC,KAAU;AACtD,UAAMC,IAASvC,EAAQsC,CAAM,GACvB1qB,IAAyB,CAAA;AAC/B,QAAI4qB,IAAW;AAEf,eAAWC,KAAWF,EAAO,OAAO;AAClC,UAAIE,EAAQ,WAAW;AACrB,QAAAJ,EAAa,IAAIG,GAAU,EAAE,QAAQ7qB,EAAK,QAAQ,SAASC,EAAM,QAAQ,GACzEA,EAAM,KAAK8qB,GAAcD,GAAS,CAAC,CAAC;AAAA,eAC3BA,EAAQ,WAAW,YAAY;AAExC,cAAME,IAAUN,EAAa,IAAIG,CAAQ;AACzC,QAAIG,KACFhrB,EAAKgrB,EAAQ,MAAM,EAAE,MAAMA,EAAQ,OAAO,EAAE;AAAA,MAGhD;AACE,QAAAN,EAAa,OAAOG,CAAQ,GAC5B5qB,EAAM,KAAK8qB,GAAcD,GAAS,CAAC,CAAC;AAEtC,MAAAD,KAAYC,EAAQ;AAAA,IACtB;AAEA,IAAA9qB,EAAK,KAAK,EAAE,QAAQ4qB,EAAO,QAAQ,OAAA3qB,GAAO;AAAA,EAC5C;AAEA,SAAOD;AACT;AAEA,SAAS+qB,GAAcE,GAAcztB,GAAgC;AACnE,SAAO;AAAA,IACL,YAAYytB,EAAI;AAAA,IAChB,SAASA,EAAI;AAAA,IACb,SAAAztB;AAAA,IACA,iBAAiBytB,EAAI;AAAA,IACrB,eAAeA,EAAI;AAAA,IACnB,aAAaA,EAAI;AAAA,IACjB,OAAOA,EAAI;AAAA,EAAA;AAEf;ACrUO,SAASC,GAASC,GAAyB;AAChD,QAAMC,IAAQ7W,EAAmB4W,GAAOjY,EAAG,GAAG,OAAO;AACrD,MAAI,CAACkY,EAAO,QAAO;AAGnB,QAAMC,IAAa9W,EAAmB6W,GAAOlY,EAAG,GAAG,YAAY;AAC/D,MAAImY,GAAY;AACd,UAAMC,IAAU/W,EAAmB8W,GAAYnY,EAAG,GAAG,gBAAgB,GAC/DxN,IAAM8O,EAAQ8W,CAAO;AAC3B,QAAI5lB,KAAOA,EAAI,YAAA,EAAc,SAAS,mBAAmB,EAAG,QAAO;AAAA,EACrE;AAGA,QAAM6lB,IAAQhX,EAAmB6W,GAAOlY,EAAG,GAAG,OAAO,GAC/CsY,IAAWhX,EAAQ+W,CAAK;AAC9B,MAAIC,GAAU;AACZ,UAAMxU,IAAQwU,EAAS,YAAA;AACvB,QAAIxU,EAAM,SAAS,IAAI,KAAKA,EAAM,SAAS,KAAK,KAAKA,EAAM,SAAS,mBAAmB,EAAG,QAAO;AAAA,EACnG;AAGA,QAAMwI,IAAMjL,EAAmB6W,GAAOlY,EAAG,GAAG,KAAK,GAC3CuY,IAASjX,EAAQgL,CAAG;AAC1B,MAAIiM,GAAQ;AACV,UAAMzU,IAAQyU,EAAO,YAAA;AACrB,QAAIzU,EAAM,SAAS,IAAI,KAAKA,EAAM,SAAS,KAAK,EAAG,QAAO;AAAA,EAC5D;AAGA,QAAM0U,IAAanX,EAAmB4W,GAAOjY,EAAG,GAAG,YAAY;AAC/D,MAAIwY,GAAY;AACd,UAAMC,IAAaD,EAAW,uBAAuBxY,EAAG,GAAG,WAAW;AACtE,aAAStW,IAAI,GAAGA,IAAI+uB,EAAW,QAAQ/uB;AAErC,WADa+uB,EAAW/uB,CAAC,EAAE,eAAe,IACjC,KAAA,EAAO,WAAW,KAAK,EAAG,QAAO;AAAA,EAE9C;AAEA,SAAO;AACT;AAKO,SAASgvB,GACdT,GACAnM,GACA9I,GACA4O,GACA1E,GACAC,GACiB;AACjB,QAAM5lB,IAA0B,CAAA,GAE1BixB,IAAanX,EAAmB4W,GAAOjY,EAAG,GAAG,YAAY;AAC/D,SAAKwY,KAELhX,EAAagX,GAAY,CAAC/hB,MAAU;AAClC,IAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBuJ,EAAG,KACvDzY,EAAO;AAAA,MACLmqB,GAAejb,GAAOqV,GAAe9I,GAAO4O,GAAmB1E,GAAMC,CAAQ;AAAA,IAAA;AAAA,EAGnF,CAAC,GAEM5lB;AACT;AC7DO,SAASoxB,GAAuBC,GAAsC;AAC3E,QAAMrxB,IAA4B;AAAA,IAChC,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW,CAAA;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,EAAA,GAIPsxB,IAASxX,EAAmBuX,GAAU5Y,EAAG,GAAG,MAAM;AACxD,MAAI6Y,GAAQ;AACV,UAAMC,IAAUD,EAAO,eAAe7Y,EAAG,GAAG,KAAK,KAAK6Y,EAAO,aAAa,OAAO;AACjF,KAAIC,MAAY,gBAAgBA,MAAY,gBACxCA,MAAY,cAAcA,MAAY,aAAaA,MAAY,gBACjEvxB,EAAO,YAAYuxB;AAAA,EAEvB;AAEA,QAAMC,IAAS1X,EAAmBuX,GAAU5Y,EAAG,GAAG,MAAM;AACxD,MAAI,CAAC+Y,EAAQ,QAAOxxB;AAEpB,QAAMyxB,IAAUD,EAAO,eAAe/Y,EAAG,GAAG,KAAK,KAAK+Y,EAAO,aAAa,OAAO,GAC3EE,IAAYF,EAAO,eAAe/Y,EAAG,GAAG,OAAO,KAAK+Y,EAAO,aAAa,SAAS,GACjFG,IAAUH,EAAO,eAAe/Y,EAAG,GAAG,KAAK,KAAK+Y,EAAO,aAAa,OAAO;AAEjF,EAAIC,QAAgB,UAAU,KAAK,IAAI,GAAG,SAASA,GAAS,EAAE,CAAC,IAC3DC,MAAW1xB,EAAO,WAAW0Y,EAAS,SAASgZ,GAAW,EAAE,CAAC,IAEjE1xB,EAAO,YAAY2xB,MAAY,OAAOA,MAAY;AAGlD,aAAW1D,KAAStU,GAAiB6X,GAAQ/Y,EAAG,GAAG,KAAK,GAAG;AACzD,UAAM3T,IAAImpB,EAAM,eAAexV,EAAG,GAAG,GAAG,KAAKwV,EAAM,aAAa,KAAK;AACrE,IAAInpB,OAAU,UAAU,KAAK4T,EAAS,SAAS5T,GAAG,EAAE,CAAC,CAAC;AAAA,EACxD;AAEA,SAAO9E;AACT;AAMO,SAAS4xB,GACdtC,GACAuC,GACAC,GACY;AACZ,QAAM,EAAE,SAAAC,GAAS,WAAAvE,GAAW,UAAAwE,GAAU,WAAAC,MAAcJ,GAG9CK,IAAsBC,GAAsBJ,GAASvE,GAAWwE,GAAUF,CAAgB,GAG1FM,IAAeC,GAA6B/C,GAAYyC,CAAO;AAErE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAAA;AAAA,IACA,WAAWG;AAAA,IACX,UAAAF;AAAA,IACA,WAAAC;AAAA,IACA,QAAQG;AAAA,EAAA;AAEZ;AAQA,SAASD,GACPJ,GACAO,GACAN,GACAF,GACU;AACV,MAAIQ,EAAe,UAAUP;AAC3B,WAAOO,EAAe,MAAM,GAAGP,CAAO;AAIxC,QAAMQ,IAAWP,IAAW,KAAK,IAAI,GAAGD,IAAU,CAAC,GAC7CS,KAAYV,IAAmBS,KAAYR;AAEjD,SAAO,MAAM,KAAK,EAAE,QAAQA,EAAA,GAAW,MAAM,KAAK,IAAIS,GAAU,EAAE,CAAC;AACrE;AAMA,SAASH,GACP/C,GACAyC,GACmB;AACnB,QAAMU,IAA4B,CAAC,EAAE;AAErC,aAAWC,KAAQpD;AAKjB,QAJuBoD,EAAK,OAAO;AAAA,MACjC,CAACjuB,MAAMA,EAAE,SAAS,WAAWA,EAAE,cAAc;AAAA,IAAA,KAGzBguB,EAAO,SAASV,GAAS;AAE7C,YAAMY,IAAqBD,EAAK,OAAO;AAAA,QACrC,CAACjuB,MAAM,EAAEA,EAAE,SAAS,WAAWA,EAAE,cAAc;AAAA,MAAA;AAGjD,MAAIkuB,EAAmB,SAAS,IAC9BF,EAAO,KAAK,CAAC,EAAE,GAAGC,GAAM,QAAQC,EAAA,CAAoB,CAAC,IAErDF,EAAO,KAAK,EAAE;AAAA,IAElB;AACE,MAAAA,EAAOA,EAAO,SAAS,CAAC,EAAE,KAAKC,CAAI;AAIvC,SAAOD;AACT;ACzHA,MAAMG,IAAW,0DACXC,KAAOpa,EAAG;AAKT,SAASqa,GAAwBC,GAA8B;AACpE,MAAI;AACF,UAAMnyB,IAAOoyB,GAAiBD,CAAQ;AACtC,WAAI,CAACnyB,KAAQA,EAAK,OAAO,WAAW,IAC3B,OAEFqyB,GAAmBryB,CAAI;AAAA,EAChC,SAAS2J,GAAG;AACV,mBAAQ,MAAM,mCAAmCA,CAAC,GAC3C;AAAA,EACT;AACF;AAKA,SAASyoB,GAAiBD,GAAyC;AAKjE,QAAMG,IAJMzZ,EAASsZ,CAAQ,EACZ,gBAGK,uBAAuBH,GAAU,OAAO;AAC9D,MAAIM,EAAS,WAAW,EAAG,QAAO;AAClC,QAAMhL,IAAUgL,EAAS,CAAC,GAGpBC,IAAQC,GAAalL,CAAO,GAG5BmL,IAAcnL,EAAQ,uBAAuB0K,GAAU,UAAU;AACvE,MAAIS,EAAY,WAAW,EAAG,QAAO;AACrC,QAAMC,IAAWD,EAAY,CAAC,GAGxBE,IAAuC;AAAA,IAC3C,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,EAAA;AAGhB,aAAW,CAACC,GAAQC,CAAS,KAAK,OAAO,QAAQF,CAAY,GAAG;AAC9D,UAAMG,IAAeJ,EAAS,uBAAuBV,GAAUY,CAAM;AACrE,QAAIE,EAAa,SAAS,GAAG;AAC3B,YAAMC,IAAaC,GAA2BF,EAAa,CAAC,CAAC;AAC7D,UAAIC,EAAW,OAAO,SAAS;AAC7B,eAAO;AAAA,UACL,MAAMF;AAAA,UACN,OAAAN;AAAA,UACA,YAAYQ,EAAW;AAAA,UACvB,QAAQA,EAAW;AAAA,QAAA;AAAA,IAGzB;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAASP,GAAalL,GAA0B;AAC9C,QAAM2L,IAAW3L,EAAQ,uBAAuB0K,GAAU,OAAO;AACjE,MAAIiB,EAAS,WAAW,EAAG,QAAO;AAGlC,QAAMC,IAAOD,EAAS,CAAC,EAAE,uBAAuBhB,IAAM,GAAG;AACzD,MAAIiB,EAAK,SAAS;AAChB,WAAO,MAAM,KAAKA,CAAI,EAAE,IAAI,CAAA1pB,MAAKA,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE;AAI/D,QAAM2pB,IAAOF,EAAS,CAAC,EAAE,uBAAuBjB,GAAU,GAAG;AAC7D,SAAImB,EAAK,SAAS,KACTA,EAAK,CAAC,EAAE,eAAe;AAIlC;AAKA,SAASH,GAA2BI,GAA2E;AAC7G,QAAMC,IAASD,EAAY,uBAAuBpB,GAAU,KAAK,GAC3DsB,IAA4B,CAAA;AAClC,MAAIC,IAAuB,CAAA;AAE3B,WAAShyB,IAAI,GAAGA,IAAI8xB,EAAO,QAAQ9xB,KAAK;AACtC,UAAMiyB,IAAQH,EAAO9xB,CAAC,GAGhBsd,IAAO4U,GAAkBD,CAAK,KAAK,KAAKjyB,IAAI,CAAC;AAGnD,IAAIgyB,EAAW,WAAW,MACxBA,IAAaG,GAAkBF,CAAK;AAItC,UAAMG,IAASC,GAAcJ,CAAK;AAElC,IAAIG,EAAO,SAAS,KAClBL,EAAO,KAAK,EAAE,MAAAzU,GAAM,QAAA8U,EAAA,CAAQ;AAAA,EAEhC;AAGA,MAAIJ,EAAW,WAAW,KAAKD,EAAO,SAAS,GAAG;AAChD,UAAMO,IAAS,KAAK,IAAI,GAAGP,EAAO,IAAI,CAAAzrB,MAAKA,EAAE,OAAO,MAAM,CAAC;AAC3D,IAAA0rB,IAAa,MAAM,KAAK,EAAE,QAAQM,EAAA,GAAU,CAACC,GAAGvyB,MAAM,GAAGA,IAAI,CAAC,EAAE;AAAA,EAClE;AAEA,SAAO,EAAE,YAAAgyB,GAAY,QAAAD,EAAA;AACvB;AAKA,SAASG,GAAkBD,GAAwB;AACjD,QAAMO,IAAQC,GAAkBR,GAAOxB,GAAU,IAAI;AACrD,MAAI+B,EAAM,WAAW,EAAG,QAAO;AAG/B,QAAME,IAAYC,GAAmBH,EAAM,CAAC,GAAG,UAAU;AACzD,MAAIE,EAAU,SAAS,EAAG,QAAOA,EAAU,CAAC;AAG5C,QAAMd,IAAOY,EAAM,CAAC,EAAE,uBAAuB/B,GAAU,GAAG;AAC1D,SAAImB,EAAK,SAAS,KAAUA,EAAK,CAAC,EAAE,eAAe;AAGrD;AAKA,SAASO,GAAkBF,GAA0B;AACnD,QAAMW,IAASH,GAAkBR,GAAOxB,GAAU,KAAK;AACvD,MAAImC,EAAO,WAAW,EAAG,QAAO,CAAA;AAGhC,QAAMC,IAAUF,GAAmBC,EAAO,CAAC,GAAG,UAAU;AACxD,MAAIC,EAAQ,SAAS,EAAG,QAAOA;AAG/B,QAAMC,IAAUH,GAAmBC,EAAO,CAAC,GAAG,UAAU;AACxD,SAAIE,EAAQ,SAAS,IAAUA,IAExB,CAAA;AACT;AAKA,SAAST,GAAcJ,GAA0B;AAC/C,QAAMc,IAASN,GAAkBR,GAAOxB,GAAU,KAAK;AACvD,SAAIsC,EAAO,WAAW,IAAU,CAAA,IAEhBJ,GAAmBI,EAAO,CAAC,GAAG,UAAU,EACzC,IAAI,CAAAzY,MAAK,WAAWA,CAAC,KAAK,CAAC;AAC5C;AAMA,SAASqY,GAAmBK,GAAmBC,GAA4B;AACzE,QAAMC,IAAWF,EAAS,uBAAuBvC,GAAUwC,CAAQ;AACnE,MAAIC,EAAS,WAAW,EAAG,QAAO,CAAA;AAGlC,QAAMC,IADQD,EAAS,CAAC,EACJ,uBAAuBzC,GAAU,IAAI;AACzD,MAAI0C,EAAM,WAAW,EAAG,QAAO,CAAA;AAG/B,QAAMC,IAA0C,CAAA;AAChD,WAASpzB,IAAI,GAAGA,IAAImzB,EAAM,QAAQnzB,KAAK;AACrC,UAAMqzB,IAAKF,EAAMnzB,CAAC,GACZszB,IAAM,SAASD,EAAG,aAAa,KAAK,KAAK,KAAK,EAAE,GAChDzB,IAAOyB,EAAG,uBAAuB5C,GAAU,GAAG,GAC9C3nB,IAAM8oB,EAAK,SAAS,KAAKA,EAAK,CAAC,EAAE,eAAe;AACtD,IAAAwB,EAAQ,KAAK,EAAE,KAAAE,GAAK,KAAAxqB,EAAA,CAAK;AAAA,EAC3B;AAEA,EAAAsqB,EAAQ,KAAK,CAAC,GAAGttB,MAAM,EAAE,MAAMA,EAAE,GAAG;AAGpC,QAAMjI,IAAmB,CAAA;AACzB,aAAWgD,KAAQuyB,GAAS;AAC1B,WAAOv1B,EAAO,SAASgD,EAAK,MAAK,CAAAhD,EAAO,KAAK,EAAE;AAC/C,IAAAA,EAAO,KAAKgD,EAAK,GAAG;AAAA,EACtB;AAEA,SAAOhD;AACT;AAKA,SAAS40B,GAAkB5nB,GAAiB4M,GAAYC,GAA8B;AACpF,QAAM7Z,IAAoB,CAAA;AAC1B,WAASmC,IAAI,GAAGA,IAAI6K,EAAO,WAAW,QAAQ7K,KAAK;AACjD,UAAM+M,IAAQlC,EAAO,WAAW7K,CAAC;AACjC,IAAI+M,EAAM,aAAa,KAAMA,EAAkB,cAAc2K,KAAc3K,EAAkB,iBAAiB0K,KAC5G5Z,EAAO,KAAKkP,CAAgB;AAAA,EAEhC;AACA,SAAOlP;AACT;AAKA,SAASizB,GAAmBryB,GAA2B;AACrD,QAAM,EAAE,MAAAU,GAAM,OAAA6xB,GAAO,YAAAgB,GAAY,QAAAD,MAAWtzB,GAItC80B,IAAkB;AAAA,IACtB,WAAW;AAAA,IACX,OAJa,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,IAK/G,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAKvC,IAAQ,QAAQ;AAAA,MACrB,cAAc;AAAA,IAAA;AAAA,EAChB;AAgBF,MAbIA,MACFuC,EAAW,QAAQ,EAAE,MAAMvC,GAAO,MAAM,UAAU,WAAW,EAAE,UAAU,KAAG,IAG1Ee,EAAO,SAAS,MAClBwB,EAAW,SAAS;AAAA,IAClB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAMxB,EAAO,IAAI,CAAAzrB,MAAKA,EAAE,IAAI;AAAA,EAAA,IAK5BnH,MAAS,SAASA,MAAS,YAAY;AACzC,UAAMq0B,IAAUxB,EAAW,IAAI,CAACyB,GAAKzzB,MAAA;;AAAO;AAAA,QAC1C,MAAMyzB;AAAA,QACN,SAAOx0B,IAAA8yB,EAAO,CAAC,MAAR,gBAAA9yB,EAAW,OAAOe,OAAM;AAAA,MAAA;AAAA,KAC/B;AAEF,WAAO;AAAA,MACL,GAAGuzB;AAAA,MACH,SAAS,EAAE,SAAS,QAAQ,WAAW,kBAAA;AAAA,MACvC,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,QANWp0B,MAAS,aAAa,CAAC,OAAO,KAAK,IAAI;AAAA,QAOlD,MAAMq0B;AAAA,QACN,OAAO,EAAE,WAAW,YAAA;AAAA,MAAY,CACjC;AAAA,IAAA;AAAA,EAEL;AAGA,MAAIr0B,MAAS,SAAS;AACpB,UAAMu0B,IAAS,KAAK,IAAI,GAAG3B,EAAO,QAAQ,CAAAzrB,MAAKA,EAAE,MAAM,CAAC,IAAI,OAAO,KAC7DqtB,IAAY3B,EAAW,IAAI,CAAAyB,OAAQ,EAAE,MAAMA,GAAK,KAAKC,EAAA,EAAS;AACpE,WAAO;AAAA,MACL,GAAGH;AAAA,MACH,SAAS,EAAE,SAAS,OAAA;AAAA,MACpB,OAAO,EAAE,WAAAI,GAAW,OAAO,SAAA;AAAA,MAC3B,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,MAAM5B,EAAO,IAAI,CAAAzrB,OAAM;AAAA,UACrB,MAAMA,EAAE;AAAA,UACR,OAAOA,EAAE;AAAA,QAAA,EACT;AAAA,MAAA,CACH;AAAA,IAAA;AAAA,EAEL;AAGA,MAAInH,MAAS;AACX,WAAO;AAAA,MACL,GAAGo0B;AAAA,MACH,SAAS,EAAE,SAAS,OAAA;AAAA,MACpB,OAAO,EAAE,MAAM,QAAA;AAAA,MACf,OAAO,EAAE,MAAM,QAAA;AAAA,MACf,QAAQxB,EAAO,IAAI,CAAAzrB,OAAM;AAAA,QACvB,MAAMA,EAAE;AAAA,QACR,MAAM;AAAA,QACN,MAAMA,EAAE,OAAO,IAAI,CAACgU,GAAGta,MAAM,CAACgyB,EAAWhyB,CAAC,KAAI,WAAWgyB,EAAWhyB,CAAC,CAAC,KAAKA,GAAOsa,CAAC,CAAC;AAAA,MAAA,EACpF;AAAA,IAAA;AAKN,QAAMsZ,IAAcz0B,MAAS,SAAS,SAAUA,MAAS,SAASA,MAAS,SAAUA,IAAO;AAC5F,SAAO;AAAA,IACL,GAAGo0B;AAAA,IACH,SAAS,EAAE,SAAS,QAAQ,aAAa,EAAE,MAAM,WAAS;AAAA,IAC1D,OAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAMvB;AAAA,MACN,WAAW,EAAE,QAAQA,EAAW,SAAS,IAAI,KAAK,EAAA;AAAA,IAAE;AAAA,IAEtD,OAAO,EAAE,MAAM,QAAA;AAAA,IACf,QAAQD,EAAO,IAAI,CAAAzrB,OAAM;AAAA,MACvB,MAAMA,EAAE;AAAA,MACR,MAAMstB;AAAA,MACN,MAAMttB,EAAE;AAAA,MACR,GAAInH,MAAS,SAAS,EAAE,WAAW,CAAA,EAAC,IAAM,CAAA;AAAA,IAAC,EAC3C;AAAA,EAAA;AAEN;ACrVO,SAAS00B,GAAcC,GAA0D;AACtF,QAAM9R,wBAAU,IAAA;AAChB,MAAI,CAAC8R,EAAa,QAAO9R;AAMzB,QAAM+R,IAJMzc,EAASwc,CAAW,EACf,gBAGO,uBAAuBxd,EAAG,GAAG,SAAS;AAC9D,WAAStW,IAAI,GAAGA,IAAI+zB,EAAW,QAAQ/zB,KAAK;AAC1C,UAAMg0B,IAAYD,EAAW/zB,CAAC,GACxBzB,IAAKy1B,EAAU,eAAe1d,EAAG,GAAG,IAAI,KAAK0d,EAAU,aAAa,MAAM,KAAK,IAC/EC,IAASD,EAAU,eAAe1d,EAAG,GAAG,QAAQ,KAAK0d,EAAU,aAAa,UAAU,KAAK,IAC3FE,IAAOF,EAAU,eAAe1d,EAAG,GAAG,MAAM,KAAK0d,EAAU,aAAa,QAAQ,KAAK,IACrFG,IAAWH,EAAU,eAAe1d,EAAG,GAAG,UAAU,KAAK0d,EAAU,aAAa,YAAY,KAAK;AAEvG,QAAI,CAACz1B,EAAI;AAGT,UAAMsP,IAAUumB,GAAmBJ,CAAS;AAE5C,IAAAhS,EAAI,IAAIzjB,GAAI,EAAE,IAAAA,GAAI,QAAA01B,GAAQ,MAAAC,GAAM,UAAAC,GAAU,SAAAtmB,GAAS;AAAA,EACrD;AAEA,SAAOmU;AACT;AAKA,SAASoS,GAAmBJ,GAA4B;AACtD,QAAM7G,IAAuB,CAAA;AAE7B,SAAArV,EAAakc,GAAW,CAACjnB,MAAU;AACjC,QAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBuJ,EAAG,GAAG;AAC1D,YAAM+d,IAAkB,CAAA;AACxB,MAAAvc,EAAa/K,GAAO,CAAC0d,MAAW;AAC9B,QAAIA,EAAO,cAAc,OAAOA,EAAO,iBAAiBnU,EAAG,KACzDwB,EAAa2S,GAAQ,CAAC6J,MAAW;AAC/B,UAAIA,EAAO,cAAc,OAAOA,EAAO,iBAAiBhe,EAAG,KACzD+d,EAAM,KAAKC,EAAO,eAAe,EAAE;AAAA,QAEvC,CAAC;AAAA,MAEL,CAAC,GACDnH,EAAW,KAAKkH,EAAM,KAAK,EAAE,CAAC;AAAA,IAChC;AAAA,EACF,CAAC,GAEMlH,EAAW,KAAK;AAAA,CAAI;AAC7B;ACjDA,MAAMoH,IAAmB,KAEnBC,KAA0C;AAAA,EAC9C,GAAG;AAAA,EAAS,GAAG;AAAA,EAAU,GAAG;AAAA,EAC5B,GAAG;AAAA,EAAU,GAAG;AAAA,EAAS,GAAG;AAC9B,GAEMC,KAA6C;AAAA,EACjD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAIC,KAAmB;AAEvB,SAASC,KAA4B;AACnC,SAAO,QAAQ,KAAK,IAAA,CAAK,IAAI,EAAED,EAAgB;AACjD;AAOO,SAASE,GACdC,GACAj2B,GACAk2B,GACY;AACZ,QAAMC,IAAuB,CAAA,GACvBC,wBAAuB,IAAA,GACvBC,IAAcr2B,EAAQ,eAAe,IAGrCs2B,IAAiBC,GAAwBN,GAAOI,CAAW;AAEjE,MAAIG,IAAcH;AAElB,WAASj1B,IAAI,GAAGA,IAAIk1B,EAAe,QAAQl1B,KAAK;AAC9C,UAAMq1B,IAAOH,EAAel1B,CAAC,GACvBs1B,IAAUP,EAAS,WAAW;AAEpC,IAAIM,EAAK,SAAS,cAIhBD,IAHgBG;AAAA,MACdF;AAAA,MAAMN;AAAA,MAAUn2B;AAAA,MAAS02B;AAAA,MAASN;AAAA,MAAkBI;AAAA,IAAA,IAG7CC,EAAK,SAAS,WACvBG,GAAWH,GAAMN,GAAUn2B,GAASo2B,CAAgB,GACpDI,IAAcH,KACLI,EAAK,SAAS,aACvBI,GAAYJ,GAAMN,GAAUn2B,GAASo2B,CAAgB,GACrDI,IAAcH;AAAA,EAElB;AAEA,SAAIF,EAAS,WAAW,KACtBA,EAAS,KAAK,EAAE,OAAOR,EAAA,CAAkB,GAGpCQ;AACT;AAQA,SAASI,GAAwBN,GAAkBI,GAAgC;AACjF,QAAMp3B,IAAoB,CAAA;AAC1B,MAAI63B,IAAa;AAEjB,QAAMC,IAAa,MAAM;AACvB,QAAID,KAAc,EAAG;AAErB,UAAME,IAAcF;AACpB,IAAAA,IAAa,GACb73B,EAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,OAAO02B;AAAA,QACP,OAAO,EAAE,MAAMU,EAAA;AAAA,MAAY,CAC5B;AAAA,MACD,OAAO;AAAA,QACL,cAAcW,IAAc,KAAKA,IAAc,KAAKX,IAAc,MAAM;AAAA,MAAA;AAAA,IAC1E,CACgB;AAAA,EACpB;AAEA,aAAWI,KAAQR;AACjB,IAAIQ,EAAK,SAAS,eAAeQ,GAAiBR,CAAI,IACpDK,OAEAC,EAAA,GACA93B,EAAO,KAAKw3B,CAAI;AAGpB,SAAAM,EAAA,GAEO93B;AACT;AAEA,SAASg4B,GAAiBtF,GAA8B;AACtD,MAAIA,EAAK,OAAO,WAAW,EAAG,QAAO;AACrC,MAAIA,EAAK,OAAO,WAAW,GAAG;AAC5B,UAAMjJ,IAAQiJ,EAAK,OAAO,CAAC;AAC3B,WAAOjJ,EAAM,SAAS,UAAUA,EAAM,UAAUiN;AAAA,EAClD;AACA,SAAO;AACT;AAQA,SAASgB,GACPhF,GACAwE,GACAn2B,GACA02B,GACAN,GACAI,GACQ;AACR,QAAM,EAAE,OAAAznB,GAAO,QAAA4U,EAAA,IAAWgO,GACpB0E,IAAcr2B,EAAQ,eAAe,IACrCk3B,IAAkBl3B,EAAQ,wBAG1Bm3B,IAAoC,CAAA;AAG1C,MAAIpoB,EAAM,SAAS;AACjB,UAAMyT,IAASjK,GAAcxJ,EAAM,OAAO;AAC1C,IAAIyT,QAAuB,UAAUA;AAAA,EACvC;AAGA,EAAIzT,EAAM,kBAAkB,WAC1BooB,EAAe,yBAAyBpoB,EAAM,gBAE5CA,EAAM,iBAAiB,WACzBooB,EAAe,wBAAwBpoB,EAAM,eAI3CmoB,IACFC,EAAe,aAAaD,IACnBnoB,EAAM,eAAe,WAC9BooB,EAAe,aAAapoB,EAAM,aAIhCA,EAAM,eAAe,WACvBooB,EAAe,sBAAsBpoB,EAAM,aAEzCA,EAAM,oBAAoB,WAC5BooB,EAAe,2BAA2BpoB,EAAM,kBAI9CA,EAAM,mBACPooB,EAAuB,iBAAiBpoB,EAAM;AAGjD,QAAMqoB,IAAWroB,EAAM,eAAe,UAAaA,EAAM,cAAc,KAAKA,EAAM,cAAc,GAC1FsoB,IAAS,CAAC,CAACtoB,EAAM;AAIvB,MAAI,CAAC2nB,KAAWP,EAAS,SAAS,GAAG;AACnC,UAAMmB,IAAwB,EAAE,OAAO3B,GAAkB,MAAMa,EAAA;AAC/D,IAAAL,EAAS,KAAKmB,CAAW;AAAA,EAC3B;AAGA,QAAMC,IAA8B,CAAA;AACpC,aAAW7O,KAAS/E;AAClB,IAAA6T,GAAW9O,GAAO6O,GAAiBv3B,GAASo2B,CAAgB;AAQ9D,MALImB,EAAgB,WAAW,KAC7BA,EAAgB,KAAK,EAAE,OAAO5B,GAAkB,MAAMU,GAAoB,GAIxEe,GAAU;AACZ,IAAAK,GAAuBF,GAAiBJ,CAAc;AACtD,UAAMO,IAAoB;AAAA,MACxB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO9B,GAAgB7mB,EAAM,UAAW;AAAA,MACxC,WAAWwoB;AAAA,MACX,GAAGJ;AAAA,IAAA;AAEL,IAAAhB,EAAS,KAAKuB,CAAO;AAAA,EACvB,WAAWL,GAAQ;AACjB,IAAAI,GAAuBF,GAAiBJ,CAAc;AACtD,UAAMQ,IAAmB;AAAA,MACvB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU5oB,EAAM;AAAA,MAChB,WAAWA,EAAM;AAAA,MACjB,WAAWA,EAAM;AAAA,MACjB,WAAWwoB;AAAA,MACX,GAAGJ;AAAA,IAAA;AAEL,IAAAhB,EAAS,KAAKwB,CAAM;AAAA,EACtB;AAEE,aAASv2B,IAAI,GAAGA,IAAIm2B,EAAgB,QAAQn2B,KAAK;AAC/C,YAAM6X,IAAKse,EAAgBn2B,CAAC;AAC5B,MAAIA,MAAM,IACR,OAAO,OAAO6X,GAAIke,CAAc,KAG5BA,EAAe,YAASle,EAAG,UAAUke,EAAe,UACnDA,EAAuB,mBACzBle,EAAW,iBAAkBke,EAAuB,kBAGzDhB,EAAS,KAAKld,CAAE;AAAA,IAClB;AAIF,SAAO2e,GAAeL,GAAiBlB,CAAW;AACpD;AAGA,SAASoB,GAAuBz0B,GAAsBm0B,GAAyC;AAC7F,aAAWle,KAAMjW;AACf,IAAIm0B,EAAe,YAASle,EAAG,UAAUke,EAAe,UACnDA,EAAuB,mBACzBle,EAAW,iBAAkBke,EAAuB;AAG3D;AAGA,SAASS,GAAezB,GAAsBE,GAA6B;AACzE,WAASj1B,IAAI+0B,EAAS,SAAS,GAAG/0B,KAAK,GAAGA,KAAK;AAC7C,UAAMy2B,IAAQ1B,EAAS/0B,CAAC,EAAU;AAClC,QAAI,OAAOy2B,KAAS,YAAYA,IAAO,EAAG,QAAOA;AAAA,EACnD;AACA,SAAOxB;AACT;AAIA,SAASmB,GACP9O,GACAyN,GACAn2B,GACAo2B,GACM;AACN,UAAQ1N,EAAM,MAAA;AAAA,IACZ,KAAK;AACH,MAAAoP,GAAepP,GAAOyN,GAAUn2B,GAASo2B,CAAgB;AACzD;AAAA,IACF,KAAK;AACH,MAAA2B,GAAgBrP,GAAOyN,GAAUC,CAAgB;AACjD;AAAA,IACF,KAAK;AACH,MAAA4B,GAAoBtP,GAAOyN,GAAUn2B,GAASo2B,CAAgB;AAC9D;AAAA,IACF,KAAK;AACH,MAAA6B,GAAgBvP,GAAOyN,CAAQ;AAC/B;AAAA,IACF,KAAK;AACH,MAAAA,EAAS,KAAK,EAAE,OAAO,IAAI,MAAM,OAAc;AAC/C;AAAA,IACF,KAAK;AACH,MAAIzN,EAAM,aAAa,UACrB0N,EAAiB,IAAI,WAAW1N,EAAM,SAAS,EAAE,IAEjD0N,EAAiB,OAAO,WAAW1N,EAAM,SAAS,EAAE;AAEtD;AAAA,IACF,KAAK;AAEH;AAAA,IACF;AAEE,MAAKA,EAAc;AAAA,EAEnB;AAEN;AAEA,SAASoP,GACPpP,GACAyN,GACAn2B,GACAo2B,GACM;AACN,QAAM,EAAE,OAAA3nB,GAAO,OAAAM,EAAA,IAAU2Z,GACnB2N,IAAcr2B,EAAQ,eAAe;AAE3C,aAAWk4B,KAAQzpB,GAAO;AACxB,UAAMwK,IAAe,EAAE,OAAOif,EAAA;AAC9B,IAAAC,GAAclf,GAAIlK,CAAkB,GAEhCA,EAAM,cAAc,iBACtBkK,EAAG,OAAO,eACVA,EAAG,cAAelK,EAAM,QAAQsnB,KAAe,OACtCtnB,EAAM,cAAc,gBAC7BkK,EAAG,OAAO,aACVA,EAAG,cAAelK,EAAM,QAAQsnB,KAAe,MAG7CD,EAAiB,OAAO,MAC1Bnd,EAAG,WAAW,CAAC,GAAGmd,CAAgB,IAGhC1N,EAAM,aACRzP,EAAG,aAAayP,EAAM,SAAS,IAC/BzP,EAAG,eAAeyP,EAAM,SAAS,MACjCzP,EAAG,iBAAiByP,EAAM,SAAS,QACnCzP,EAAG,eAAeyP,EAAM,SAAS,MAC7BA,EAAM,SAAS,SAAS,WAC1BzP,EAAG,QAAQA,EAAG,SAAS,YACdyP,EAAM,SAAS,SAAS,aACjCzP,EAAG,QAAQA,EAAG,SAAS,aAK3Bkd,EAAS,KAAKld,CAAE;AAAA,EAClB;AACF;AAEA,SAAS8e,GACPrP,GACAyN,GACAC,GACM;AACN,QAAMnd,IAAe;AAAA,IACnB,OAAOyP,EAAM;AAAA,IACb,MAAM;AAAA,IACN,OAAOA,EAAM;AAAA,IACb,QAAQA,EAAM;AAAA,IACd,IAAIqN,GAAA;AAAA,EAAkB;AAGxB,EAAIrN,EAAM,YACRzP,EAAG,aAAamf,GAAsB1P,EAAM,OAAO,GAC/CA,EAAM,iBAAiBzP,EAAG,eAAe,YAAYA,EAAG,eAAe,YACzEA,EAAG,mBAAmByP,EAAM,iBAI5B0N,EAAiB,OAAO,MAC1Bnd,EAAG,WAAW,CAAC,GAAGmd,CAAgB,IAGpCD,EAAS,KAAKld,CAAE;AAClB;AAEA,SAASmf,GAAsB3S,GAAyB;AAStD,SAR2C;AAAA,IACzC,QAAU;AAAA,IACV,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,UAAY;AAAA;AAAA,EAAA,EAEIA,CAAO,KAAK;AAChC;AAEA,SAASuS,GACPtP,GACAyN,GACAn2B,GACAo2B,GACM;AACc,EAAAp2B,EAAQ;AAC5B,QAAMq4B,IAAwB,CAAA;AAE9B,aAAWC,KAAa5P,EAAM;AAC5B,eAAWwP,KAAQI,EAAU,OAAO;AAClC,YAAMrf,IAAe,EAAE,OAAOif,EAAA;AAC9B,MAAAC,GAAclf,GAAIqf,EAAU,KAAkB,GAC1ClC,EAAiB,OAAO,QAAM,WAAW,CAAC,GAAGA,CAAgB,IAC7DkC,EAAU,aACZrf,EAAG,aAAaqf,EAAU,SAAS,IACnCrf,EAAG,eAAeqf,EAAU,SAAS,MACrCrf,EAAG,iBAAiBqf,EAAU,SAAS,QACvCrf,EAAG,eAAeqf,EAAU,SAAS,MACjCA,EAAU,SAAS,SAAS,WAC9Brf,EAAG,QAAQA,EAAG,SAAS,YACdqf,EAAU,SAAS,SAAS,aACrCrf,EAAG,QAAQA,EAAG,SAAS,aAG3Bof,EAAU,KAAKpf,CAAE;AAAA,IACnB;AAGF,MAAIof,EAAU,WAAW,EAAG;AAE5B,QAAM/P,IAAwB;AAAA,IAC5B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAKI,EAAM;AAAA,IACX,aAAaqN,GAAA;AAAA,IACb,WAAAsC;AAAA,EAAA;AAEF,EAAIjC,EAAiB,OAAO,QAAe,WAAW,CAAC,GAAGA,CAAgB,IAC1ED,EAAS,KAAK7N,CAAW;AAC3B;AAEA,SAAS2P,GAAgBvP,GAAmByN,GAA4B;AACtE,EAAIzN,EAAM,cAAc,SACtByN,EAAS,KAAK,EAAE,OAAO;AAAA,GAAM,MAAM,aAAoB,IAC9CzN,EAAM,cAAc,UAC7ByN,EAAS,KAAK,EAAE,OAAO;AAAA,EAAA,CAAM;AAGjC;AAEA,SAASgC,GAAclf,GAAclK,GAAiBwpB,GAA4B;AAChF,EAAIxpB,EAAM,SAAMkK,EAAG,OAAO,KACtBlK,EAAM,WAAQkK,EAAG,SAAS,KAC1BlK,EAAM,cAAc,WAAWkK,EAAG,YAAYlK,EAAM,YACpDA,EAAM,cAAWkK,EAAG,YAAY,KAChClK,EAAM,SAAMkK,EAAG,OAAOlK,EAAM,OAC5BA,EAAM,SAAMkK,EAAG,OAAOlK,EAAM,OAC5BA,EAAM,UAAOkK,EAAG,QAAQlK,EAAM,QAC9BA,EAAM,cAAWkK,EAAG,YAAYlK,EAAM,YACtCA,EAAM,kBAAekK,EAAG,gBAAgBlK,EAAM;AACpD;AAIA,SAAS6nB,GACP4B,GACArC,GACAn2B,GACAo2B,GACM;AACN,QAAMrF,IAAmB/wB,EAAQ,kBAC3By4B,IAAiBz4B,EAAQ,kBAAkB,OAC3C04B,IAAmB14B,EAAQ,yBAAyB,IACpD24B,IAAmB34B,EAAQ,yBAAyB,CAAC,GAAG,GAAG,GAAG,CAAC;AAGrE,MAAIysB,IAAY,CAAC,GAAG+L,EAAM,SAAS;AACnC,MAAIzH,KAAoB0H,MAAmB,SAAShM,EAAU,SAAS,GAAG;AACxE,UAAMmM,IAAanM,EAAU,OAAO,CAACtlB,GAAGD,MAAMC,IAAID,GAAG,CAAC;AACtD,QAAI0xB,IAAa,GAAG;AAClB,YAAMC,IAAQ9H,IAAmB6H;AACjC,MAAAnM,IAAYA,EAAU,IAAI,CAAA1oB,MAAK,KAAK,MAAMA,IAAI80B,CAAK,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,QAAMC,IAAWrM,EAAU,IAAI,QAAM,EAAE,OAAO1oB,IAAI,GAE5Cg1B,IAAgB,CAAA;AACtB,aAAWpmB,KAAO6lB,EAAM,MAAM;AAC5B,UAAMQ,IAAgB,CAAA;AACtB,eAAWC,KAAQtmB,EAAI,OAAO;AAC5B,YAAMumB,IAA2B,CAAA;AAEjC,eAASC,IAAK,GAAGA,IAAKF,EAAK,WAAW,QAAQE,KAAM;AAClD,cAAMxH,IAAOsH,EAAK,WAAWE,CAAE;AAE/B,YAAIC,GAAuBzH,CAAI,GAAG;AAChC,gBAAM5C,IAAe4C,EAAK,OAAO,CAAC,EAAU;AAC5C,UAAAiF,GAAW7H,GAAamK,GAAcl5B,GAASo2B,CAAgB;AAAA,QACjE;AACE,UAAAO,GAAehF,GAAMuH,GAAcl5B,GAASm5B,MAAO,KAAKD,EAAa,WAAW,GAAG9C,GAAkBp2B,EAAQ,eAAe,EAAE;AAAA,MAElI;AAEA,MAAIk5B,EAAa,WAAW,KAC1BA,EAAa,KAAK,EAAE,OAAOvD,EAAA,CAAkB;AAG/C,YAAMr2B,IAAU;AAAA,QACd,OAAO45B;AAAA,QACP,SAASD,EAAK;AAAA,QACd,SAASA,EAAK;AAAA,MAAA;AAGhB,MAAIA,EAAK,oBAAiB35B,EAAG,kBAAkB25B,EAAK,kBAChDA,EAAK,kBACP35B,EAAG,gBAAgBu2B,GAAmBoD,EAAK,aAAa,KAAK,QAE3DA,EAAK,gBAAa35B,EAAG,cAAc25B,EAAK,cACxCA,EAAK,UAAO35B,EAAG,QAAQ25B,EAAK,QAEhCD,EAAO,KAAK15B,CAAE;AAAA,IAChB;AAEA,IAAAy5B,EAAO,KAAK;AAAA,MACV,QAAQpmB,EAAI,UAAU+lB;AAAA,MACtB,QAAAM;AAAA,IAAA,CACD;AAAA,EACH;AAEA,QAAMxM,IAAoB;AAAA,IACxB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAAsM;AAAA,IACA,QAAAC;AAAA,IACA,WAAWJ;AAAA,EAAA;AAGb,EAAIH,EAAM,eAAe,UACvBhM,EAAQ,aAAa,IACZgM,EAAM,eAAe,UAC9BhM,EAAQ,aAAa,IAEnBgM,EAAM,gBAAahM,EAAQ,cAAcgM,EAAM,cAC/CA,EAAM,gBAAahM,EAAQ,cAAcgM,EAAM,cAEnDrC,EAAS,KAAK3J,CAAO;AACvB;AAEA,SAAS4M,GAAuBzH,GAA8B;AAC5D,SAAOA,EAAK,OAAO,WAAW,KAAMA,EAAK,OAAO,CAAC,EAAU,SAAS;AACtE;AAIA,SAASkF,GACPwC,GACAlD,GACAn2B,GACAo2B,GACM;AACN,QAAMkD,IAAWvD,GAAA;AAGjB,EAAAI,EAAS,KAAK;AAAA,IACZ,OAAOR;AAAA,IACP,UAAA2D;AAAA,IACA,aAAaD,EAAO;AAAA,IACpB,WAAWA,EAAO;AAAA,IAClB,iBAAiBA,EAAO;AAAA,IACxB,cAAcA,EAAO;AAAA,EAAA,CACV;AAEb,WAASE,IAAS,GAAGA,IAASF,EAAO,OAAO,QAAQE,KAAU;AAC5D,UAAMC,IAAQH,EAAO,OAAOE,CAAM;AAGlC,IAAIA,IAAS,KACXpD,EAAS,KAAK;AAAA,MACZ,OAAO;AAAA;AAAA,MACP,MAAM;AAAA,MACN,UAAAmD;AAAA,IAAA,CACW;AAGf,QAAI9C,IAAcx2B,EAAQ,eAAe;AACzC,aAASm5B,IAAK,GAAGA,IAAKK,EAAM,QAAQL,KAAM;AACxC,YAAMzC,IAAUyC,MAAO,KAAKI,MAAW;AAEvC,MAAA/C,IADgBG,GAAe6C,EAAML,CAAE,GAAGhD,GAAUn2B,GAAS02B,GAASN,GAAkBI,CAAW;AAInG,YAAMiD,IAAStD,EAASA,EAAS,SAAS,CAAC;AAC3C,MAAIsD,KAAU,CAAEA,EAAe,aAC5BA,EAAe,WAAWH;AAAA,IAE/B;AAAA,EACF;AAGA,EAAAnD,EAAS,KAAK,EAAE,OAAOR,EAAA,CAA8B;AACvD;ACjjBO,MAAM+D,GAAW;AAAA,EAGtB,YAAY15B,GAA6B;AAFjC,IAAAP,EAAA;AAGN,SAAK,UAAU,EAAE,GAAGO,EAAA;AAAA,EACtB;AAAA,EAEA,MAAM,MAAM25B,GAAqD;AAC/D,QAAI;AACF,YAAMC,IAAM,MAAMC,GAAM,UAAUF,CAAW,GAEvC;AAAA,QACJG;AAAA,QACAje;AAAA,QACAuF;AAAA,QACA/H;AAAA,QACA2N;AAAA,QACAkO;AAAA,MAAA,IACE,MAAM,QAAQ,IAAI;AAAA,QACpB,KAAK,aAAa0E,GAAK,mBAAmB;AAAA,QAC1C,KAAK,aAAaA,GAAK,iBAAiB;AAAA,QACxC,KAAK,aAAaA,GAAK,oBAAoB;AAAA,QAC3C,KAAK,aAAaA,GAAK,uBAAuB;AAAA,QAC9C,KAAK,aAAaA,GAAK,8BAA8B;AAAA,QACrD,KAAK,aAAaA,GAAK,mBAAmB;AAAA,MAAA,CAC3C;AAED,UAAI,CAACE;AACH,eAAO,EAAE,SAAS,IAAO,UAAU,CAAA,GAAI,OAAO,4BAAA;AAGhD,YAAMjV,IAAW,MAAM,KAAK,kBAAkB+U,CAAG,GAC3C3S,IAAe,MAAM,KAAK,qBAAqB2S,CAAG,GAClDG,IAAc,MAAM,KAAK,qBAAqBH,CAAG,GAEjDI,IAAgC;AAAA,QACpC,aAAAF;AAAA,QACA,WAAAje;AAAA,QACA,cAAAuF;AAAA,QACA,UAAA/H;AAAA,QACA,cAAA2N;AAAA,QACA,aAAAkO;AAAA,QACA,cAAAjO;AAAA,QACA,aAAA8S;AAAA,QACA,UAAAlV;AAAA,QACA,SAAS,KAAK,iBAAA;AAAA,MAAiB;AAGjC,aAAO,KAAK,kBAAkBmV,CAAa;AAAA,IAC7C,SAASl6B,GAAgB;AACvB,YAAMm6B,IAAMn6B,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AACjE,aAAO,EAAE,SAAS,IAAO,UAAU,CAAA,GAAI,OAAOm6B,EAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,cAAcC,GAAuC;AACzD,UAAMP,IAAc,MAAMO,EAAK,YAAA;AAC/B,WAAO,KAAK,MAAMP,CAAW;AAAA,EAC/B;AAAA,EAEA,MAAc,kBAAkBj5B,GAAoD;AAClF,QAAI;AACF,MAAA2iB,GAAgB,QAAQ;AAExB,UAAI8W,IAAwG;AAC5G,UAAIz5B,EAAQ,QAAQ,iBAAiB,OAAO,KAAKA,EAAQ,WAAW,EAAE,SAAS,GAAG;AAChF,cAAM05B,IAA2B15B,EAAQ,QAAQ;AACjD,QAAAy5B,IAAuB,CAACE,GAAQt2B,GAAG0D,GAAG6yB,MAAOF,EAAS,gBAAgBC,GAAQt2B,GAAG0D,GAAG6yB,CAAE;AAAA,MACxF;AAEA,YAAM5f,IAAQtB,GAAW1Y,EAAQ,QAAQ,GACnC8iB,IAAgB,IAAI5H,GAAclb,EAAQ,WAAWga,CAAK,GAC1D4O,IAAoB,IAAInI,GAAkBzgB,EAAQ,YAAY,GAC9D65B,IAAkBtF,GAAcv0B,EAAQ,WAAW,GACnDsmB,IAA+CtmB,EAAQ,eACzDwiB,GAAmBxiB,EAAQ,YAAY,wBACnC,IAAA,GAGF85B,IADM9hB,EAAShY,EAAQ,WAAW,EACf,gBAAgB,uBAAuBgX,EAAG,GAAG,MAAM;AAC5E,UAAI8iB,EAAa,WAAW;AAC1B,eAAO,EAAE,SAAS,IAAO,UAAU,CAAA,GAAI,OAAO,oBAAA;AAGhD,YAAMC,IAAOD,EAAa,CAAC,GACrB1V,IAAc4V,GAAmBD,GAAM/iB,EAAG,GAAGqB,CAAkB,GAC/Dsd,IAAc31B,EAAQ,QAAQ,eAAe,IAE7Ci6B,IAAsB,CAAA;AAC5B,UAAIC,IAA4C,CAAA;AAChD,YAAMC,IAED,CAAA,GAECC,IAAyB,MAAM;AACnC,mBAAW3xB,KAAKyxB,EAA0B,CAAAD,EAAS,KAAKxxB,CAAC;AACzD,QAAAyxB,IAA2B,CAAA;AAAA,MAC7B,GAEMG,IAA8B,CAACpJ,MAAwB;AAC3D,QAAIkJ,EAA0B,SAAS,MACrClJ,EAAK,OAAO,QAAQ,GAAGkJ,CAAyB,GAChDA,EAA0B,SAAS;AAAA,MAEvC;AAEA,MAAA3hB,EAAauhB,GAAM,CAACtsB,MAAU;AAC5B,cAAM6V,IAAM7V,EAAM,WACZ4b,IAAU5b,EAAM;AAEtB,YAAI6V,MAAQ,OAAO+F,MAAYrS,EAAG,GAAG;AACnC,gBAAMia,IAAOvI;AAAA,YACXjb;AAAA,YAAOqV;AAAA,YAAe9I;AAAA,YAAO4O;AAAA,YAC7BtC;AAAA,YAActmB,EAAQ;AAAA,YAAUokB;AAAA,YAAauR;AAAA,UAAA;AAE/C,UAAA0E,EAA4BpJ,CAAI,GAEhCqJ;AAAA,YACE7sB;AAAA,YAAOwjB;AAAA,YAAM3K;AAAA,YAActmB,EAAQ;AAAA,YACnCA,EAAQ;AAAA,YAAaA,EAAQ;AAAA,YAC7By5B;AAAA,YACA,EAAE,GAAGziB,EAAG,GAAG,GAAGA,EAAG,GAAG,IAAIA,EAAG,IAAI,GAAGA,EAAG,EAAA;AAAA,YAAKqB;AAAA,UAAA;AAG5C,gBAAMwF,IAAQxF,EAAmB5K,GAAOuJ,EAAG,GAAG,KAAK,GAC7C4Y,IAAW/R,IAAQxF,EAAmBwF,GAAO7G,EAAG,GAAG,QAAQ,IAAI;AAErE,cAAI4Y,GAAU;AACZ,kBAAMQ,IAAeT,GAAuBC,CAAQ;AACpD,gBAAIQ,EAAa,UAAU,GAAG;AAC5B,cAAA8J,EAAyB,KAAKjJ,CAAI;AAClC,oBAAMsJ,IAAcv6B,EAAQ,QAAQ,oBAAoB;AACxD,cAAAi6B,EAAS,KAAK9J,GAAgB+J,GAA0B9J,GAAcmK,CAAW,CAAC,GAClFL,IAA2B,CAAA;AAAA,YAC7B;AACE,cAAAE,EAAA,GACAH,EAAS,KAAKhJ,CAAI;AAEpB,kBAAMuJ,IAAKpK,EAAa;AACxB,YAAIoK,MAAO,gBAAgBA,MAAO,gBAChCP,EAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,QAAQ,CAAC,EAAE,MAAM,SAAS,WAAW,QAAQ;AAAA,cAC7C,OAAO,CAAA;AAAA,YAAC,CACT;AAAA,UAEL;AACE,YAAAC,EAAyB,KAAKjJ,CAAI;AAAA,QAGtC,WAAW3N,MAAQ,SAAS+F,MAAYrS,EAAG;AACzC,UAAAojB,EAAA,GACAH,EAAS;AAAA,YACPpO,GAAWpe,GAAOqV,GAAe9I,GAAO4O,GAAmBtC,GAActmB,EAAQ,UAAUokB,CAAW;AAAA,UAAA;AAAA,iBAG/Fd,MAAQ,SAAS+F,MAAYrS,EAAG;AACzC,UAAAyjB;AAAA,YACEhtB;AAAA,YAAOysB;AAAA,YAA0BD;AAAA,YAAUG;AAAA,YAC3CtX;AAAA,YAAe9I;AAAA,YAAO4O;AAAA,YAAmBtC;AAAA,YACzCtmB,EAAQ;AAAA,YAAUokB;AAAA,YAAauR;AAAA,YAC/B3e,EAAG;AAAA,YAAGqB;AAAA,YAAoBG;AAAA,UAAA;AAAA,iBAGnB8K,MAAQ,eAAe+F,MAAYrS,EAAG;AAC/C,UAAAwB,EAAa/K,GAAO,CAACitB,MAAa;AAChC,YAAIA,EAAS,cAAc,OAAOA,EAAS,iBAAiB1jB,EAAG,IAC7DkjB,EAAyB;AAAA,cACvBxR,GAAegS,GAAU5X,GAAe9I,GAAO4O,GAAmBtC,GAActmB,EAAQ,UAAUokB,GAAauR,CAAW;AAAA,YAAA,IAEnH+E,EAAS,cAAc,SAASA,EAAS,iBAAiB1jB,EAAG,MACtEojB,EAAA,GACAH,EAAS;AAAA,cACPpO,GAAW6O,GAAU5X,GAAe9I,GAAO4O,GAAmBtC,GAActmB,EAAQ,UAAUokB,CAAW;AAAA,YAAA;AAAA,UAG/G,CAAC;AAAA,iBAEQd,MAAQ,YAAY+F,MAAYrS,EAAG,GAAG;AAC/C,gBAAMoZ,IAAeT,GAAuBliB,CAAK;AACjD,cAAI2iB,EAAa,UAAU,KAAK8J,EAAyB,SAAS,GAAG;AACnE,kBAAMK,IAAcv6B,EAAQ,QAAQ,oBAAoB;AACxD,YAAAi6B,EAAS,KAAK9J,GAAgB+J,GAA0B9J,GAAcmK,CAAW,CAAC,GAClFL,IAA2B,CAAA;AAAA,UAC7B;AAAA,QAEF,WAAW5W,MAAQ,uBAAuB+F,MAAYrS,EAAG,GAAG;AAC1D,gBAAM+S,IAAYtc,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK;AACpF,UAAIsc,KACFoQ,EAA0B,KAAK,EAAE,MAAM,iBAAiB,UAAU,SAAS,WAAApQ,GAAW;AAAA,QAE1F,WAAWzG,MAAQ,qBAAqB+F,MAAYrS,EAAG,GAAG;AACxD,gBAAM+S,IAAYtc,EAAM,eAAeuJ,EAAG,GAAG,IAAI,KAAKvJ,EAAM,aAAa,MAAM,KAAK;AACpF,UAAIsc,KACFoQ,EAA0B,KAAK,EAAE,MAAM,iBAAiB,UAAU,OAAO,WAAApQ,GAAW;AAAA,QAExF;AAAA,MACF,CAAC,GAEDqQ,EAAA;AAEA,YAAM3E,IAAWH,GAAc2E,GAAUj6B,EAAQ,SAAS65B,CAAe,GACnEc,IAAWd,EAAgB,OAAO,IAAI,CAAC,GAAGA,EAAgB,QAAQ,IAAI;AAE5E,aAAO,EAAE,SAAS,IAAM,UAAApE,GAAU,UAAAkF,EAAA;AAAA,IACpC,SAASv7B,GAAgB;AACvB,YAAMm6B,IAAMn6B,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AACjE,aAAO,EAAE,SAAS,IAAO,UAAU,CAAA,GAAI,OAAO,iBAAiBm6B,CAAG,GAAA;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAc,aAAaL,GAAY0B,GAAsC;AAC3E,UAAMpB,IAAON,EAAI,KAAK0B,CAAI;AAC1B,WAAOpB,IAAOA,EAAK,MAAM,QAAQ,IAAI;AAAA,EACvC;AAAA,EAEA,MAAc,kBAAkBN,GAA6C;AAC3E,UAAM/U,IAAmC,CAAA,GACnC0W,IAAmC;AAAA,MACvC,KAAK;AAAA,MAAa,KAAK;AAAA,MAAc,MAAM;AAAA,MAC3C,KAAK;AAAA,MAAa,KAAK;AAAA,MAAa,MAAM;AAAA,MAC1C,KAAK;AAAA,MAAc,KAAK;AAAA,MAAiB,KAAK;AAAA,MAAe,KAAK;AAAA,IAAA,GAG9DC,IAA4B,CAAA;AAClC,WAAA5B,EAAI,QAAQ,CAAC7R,GAAc0T,MAAa;AACtC,MAAI1T,EAAa,WAAW,aAAa,KAAK,CAAC0T,EAAS,OACtDD,EAAS;AAAA,QACPC,EAAS,MAAM,QAAQ,EAAE,KAAK,CAACx6B,MAAW;;AACxC,gBAAMy6B,MAAMr7B,IAAA0nB,EAAa,MAAM,GAAG,EAAE,IAAA,MAAxB,gBAAA1nB,EAA+B,kBAAiB,OAEtDs7B,IAAU,QADHJ,EAASG,CAAG,KAAK,WACF,WAAWz6B,CAAM;AAC7C,UAAA4jB,EAASkD,CAAY,IAAI4T,GACzB9W,EAASkD,EAAa,QAAQ,SAAS,EAAE,CAAC,IAAI4T;AAAA,QAChD,CAAC;AAAA,MAAA;AAAA,IAGP,CAAC,GAED,MAAM,QAAQ,IAAIH,CAAQ,GACnB3W;AAAA,EACT;AAAA,EAEA,MAAc,qBAAqB+U,GAA6C;AAC9E,UAAM3S,IAAuC,CAAA,GACvCuU,IAA4B,CAAA;AAElC,WAAA5B,EAAI,QAAQ,CAAC7R,GAAc0T,MAAa;AACtC,MAAI1T,EAAa,SAAS,eAAe,KAAKA,EAAa,SAAS,OAAO,KAAK,CAAC0T,EAAS,OACxFD,EAAS;AAAA,QACPC,EAAS,MAAM,QAAQ,EAAE,KAAK,CAACxsB,MAAY;AACzC,UAAAgY,EAAac,CAAY,IAAI9Y;AAAA,QAC/B,CAAC;AAAA,MAAA;AAAA,IAGP,CAAC,GAED,MAAM,QAAQ,IAAIusB,CAAQ,GACnBvU;AAAA,EACT;AAAA,EAEA,MAAc,qBAAqB2S,GAA6C;AAC9E,UAAMG,IAAsC,CAAA,GACtCyB,IAA4B,CAAA;AAElC,WAAA5B,EAAI,QAAQ,CAAC7R,GAAc0T,MAAa;AACtC,MAAI1T,EAAa,MAAM,+BAA+B,KAAK,CAAC0T,EAAS,OACnED,EAAS;AAAA,QACPC,EAAS,MAAM,QAAQ,EAAE,KAAK,CAACxsB,MAAY;AACzC,UAAA8qB,EAAYhS,CAAY,IAAI9Y;AAAA,QAC9B,CAAC;AAAA,MAAA;AAAA,IAGP,CAAC,GAED,MAAM,QAAQ,IAAIusB,CAAQ,GACnBzB;AAAA,EACT;AAAA,EAEQ,mBAAsC;AAC5C,WAAO,EAAE,GAAGtiB,IAAiB,GAAG,KAAK,QAAA;AAAA,EACvC;AACF;AAEA,SAAS0jB,GACPxL,GACAiL,GACAD,GACAG,GACAtX,GACA9I,GACA4O,GACAtC,GACAnC,GACAC,GACAuR,GACAuF,GACA7iB,GACAG,GACM;AACN,MAAIwW,GAASC,CAAK,GAAG;AACnB,UAAMkM,IAAgBzL;AAAA,MACpBT;AAAA,MAAOnM;AAAA,MAAe9I;AAAA,MAAO4O;AAAA,MAAmBtC;AAAA,MAAcnC;AAAA,IAAA;AAEhE,eAAW1b,KAAK0yB,EAAe,CAAAjB,EAAyB,KAAKzxB,CAAC;AAC9D;AAAA,EACF;AAEA,QAAM6lB,IAAejW,EAAmB4W,GAAOiM,GAAK,YAAY;AAChE,EAAK5M,KAEL9V,EAAa8V,GAAc,CAAC7gB,MAAmB;AAC7C,IAAIA,EAAM,cAAc,OAAOA,EAAM,iBAAiBytB,IACpDhB,EAAyB;AAAA,MACvBxR,GAAejb,GAAOqV,GAAe9I,GAAO4O,GAAmBtC,GAAcnC,GAAUC,GAAauR,CAAW;AAAA,IAAA,IAExGloB,EAAM,cAAc,SAASA,EAAM,iBAAiBytB,KAC7Dd,EAAA,GACAH,EAAS;AAAA,MACPpO,GAAWpe,GAAOqV,GAAe9I,GAAO4O,GAAmBtC,GAAcnC,GAAUC,CAAW;AAAA,IAAA,KAEvF3W,EAAM,cAAc,SAASA,EAAM,iBAAiBytB,KAC7DT;AAAA,MACEhtB;AAAA,MAAOysB;AAAA,MAA0BD;AAAA,MAAUG;AAAA,MAC3CtX;AAAA,MAAe9I;AAAA,MAAO4O;AAAA,MAAmBtC;AAAA,MAAcnC;AAAA,MAAUC;AAAA,MAAauR;AAAA,MAC9EuF;AAAA,MAAK7iB;AAAAA,MAAoBG;AAAAA,IAAA;AAAA,EAG/B,CAAC;AACH;AAEA,SAAS8hB,GACP3R,GACAsI,GACA3K,GACAC,GACA8S,GACAlV,GACAsV,GACAziB,GACAqB,GACM;AACN,QAAM+iB,IAAWzS,EAAY,uBAAuB3R,EAAG,GAAG,SAAS;AAEnE,WAAStW,IAAI,GAAGA,IAAI06B,EAAS,QAAQ16B,KAAK;AACxC,UAAM26B,IAAUD,EAAS16B,CAAC;AAC1B,QAAI,CAAC26B,EAAQ,uBAAuBrkB,EAAG,GAAG,OAAO,EAAE,OAAQ;AAE3D,QAAIskB,IAAajV,GAAWgV,GAAS/U,GAAcC,GAAcpC,CAAQ;AAEzE,IAAI,CAACmX,KAAc7B,MACjB6B,IAAaC;AAAA,MACXF;AAAA,MAAS/U;AAAA,MAAc+S;AAAA,MACvBI;AAAA,MAAsBziB;AAAAA,MAAIqB;AAAAA,IAAA,IAI1BijB,KAAYrK,EAAK,OAAO,KAAKqK,CAAU;AAAA,EAC7C;AACF;AAEA,SAASC,GACPtX,GACAqC,GACA+S,GACAmC,GACAxkB,GACAqB,GACmB;AACnB,QAAMoZ,IAAWxN,EAAU,uBAAuBjN,EAAG,GAAG,OAAO;AAC/D,MAAIya,EAAS,WAAW,EAAG,QAAO;AAElC,QAAM9M,IAAM8M,EAAS,CAAC,EAAE,eAAeza,EAAG,GAAG,IAAI,KAAKya,EAAS,CAAC,EAAE,aAAa,MAAM,KAAK;AAC1F,MAAI,CAAC9M,EAAK,QAAO;AAEjB,QAAMC,IAAM0B,EAAa,IAAI3B,CAAG;AAChC,MAAI,CAACC,EAAK,QAAO;AAEjB,QAAM8B,IAAY9B,EAAI,OAAO,WAAW,OAAO,IAC3CA,EAAI,SACJ,QAAQA,EAAI,OAAO,QAAQ,WAAW,EAAE,CAAC,IAEvC0M,IAAW+H,EAAY3S,CAAS;AACtC,MAAI,CAAC4K,EAAU,QAAO;AAEtB,MAAI3uB,IAAQ,KACRC,IAAS;AACb,QAAMoR,IAAYqE,EAAmB4L,GAAWjN,EAAG,IAAI,QAAQ,KAC1DqB,EAAmB4L,GAAWjN,EAAG,IAAI,QAAQ;AAClD,MAAIhD,GAAW;AACb,UAAMsQ,IAASjM,EAAmBrE,GAAWgD,EAAG,IAAI,QAAQ;AAC5D,QAAIsN,GAAQ;AACV,YAAMC,IAAKD,EAAO,aAAa,IAAI,GAC7BE,IAAKF,EAAO,aAAa,IAAI;AACnC,MAAIC,UAAY,KAAK,MAAM,SAASA,GAAI,EAAE,IAAI,IAAI,IAC9CC,UAAa,KAAK,MAAM,SAASA,GAAI,EAAE,IAAI,IAAI;AAAA,IACrD;AAAA,EACF;AAEA,QAAMmV,IAAStI,GAAwBC,CAAQ;AAC/C,MAAI,CAACqI,EAAQ,QAAO;AAEpB,MAAI;AAEF,WAAO,EAAE,MAAM,SAAS,KADZ6B,EAAS7B,GAAQh3B,GAAOC,GAAQ,CAAC,GAChB,OAAAD,GAAO,QAAAC,EAAA;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASo3B,GACPD,GACAmB,GACA7iB,GACa;AACb,QAAMojB,IAAwB,EAAE,KAAK,IAAI,QAAQ,IAAI,MAAM,IAAI,OAAO,GAAA,GAEhE7L,IAAWvX,EAAmB0hB,GAAMmB,GAAK,QAAQ;AACvD,MAAI,CAACtL,EAAU,QAAO6L;AAEtB,QAAMC,IAAUrjB,EAAmBuX,GAAUsL,GAAK,OAAO;AACzD,MAAI,CAACQ,EAAS,QAAOD;AAErB,QAAME,IAAQ,CAACC,MAAyBA,IAAO,SAASA,GAAM,EAAE,IAAI,MAC9DC,IAAO,CAAC3kB,MAAkBA,IAAO,OAAQ,IAEzC7D,IAAMsoB,EAAMD,EAAQ,eAAeR,GAAK,KAAK,KAAKQ,EAAQ,aAAa,OAAO,CAAC,GAC/EI,IAASH,EAAMD,EAAQ,eAAeR,GAAK,QAAQ,KAAKQ,EAAQ,aAAa,UAAU,CAAC,GACxFtoB,IAAOuoB,EAAMD,EAAQ,eAAeR,GAAK,MAAM,KAAKQ,EAAQ,aAAa,QAAQ,CAAC,GAClF7c,IAAQ8c,EAAMD,EAAQ,eAAeR,GAAK,OAAO,KAAKQ,EAAQ,aAAa,SAAS,CAAC;AAE3F,SAAO;AAAA,IACL,KAAKroB,MAAQ,OAAOwoB,EAAKxoB,CAAG,IAAIooB,EAAS;AAAA,IACzC,QAAQK,MAAW,OAAOD,EAAKC,CAAM,IAAIL,EAAS;AAAA,IAClD,MAAMroB,MAAS,OAAOyoB,EAAKzoB,CAAI,IAAIqoB,EAAS;AAAA,IAC5C,OAAO5c,MAAU,OAAOgd,EAAKhd,CAAK,IAAI4c,EAAS;AAAA,EAAA;AAEnD;AC/bO,SAASM,GAAiBz8B,GAAyC;AACxE,SAAO,IAAI05B,GAAW15B,CAAO;AAC/B;AAKA,eAAsB08B,GACpB78B,GACAG,GAC2B;AAC3B,QAAM28B,IAASF,GAAiBz8B,CAAO;AAEvC,SAAIH,aAAgB,OACX88B,EAAO,cAAc98B,CAAI,IAG3B88B,EAAO,MAAM98B,CAAI;AAC1B;","x_google_ignoreList":[3]}