@eternalheart/react-file-preview 1.3.7 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/FilePreviewContent.d.ts +12 -1
- package/lib/FilePreviewContent.d.ts.map +1 -1
- package/lib/FilePreviewEmbed.d.ts +9 -1
- package/lib/FilePreviewEmbed.d.ts.map +1 -1
- package/lib/FilePreviewModal.d.ts +9 -1
- package/lib/FilePreviewModal.d.ts.map +1 -1
- package/lib/RequestContext.d.ts +24 -0
- package/lib/RequestContext.d.ts.map +1 -0
- package/lib/chunks/{index-BIg3vHQf.mjs → index-B-H9HQiI.mjs} +35 -35
- package/lib/chunks/index-B-H9HQiI.mjs.map +1 -0
- package/lib/chunks/{index-DOMMMe9f.mjs → index-BGeyzo6u.mjs} +2 -2
- package/lib/chunks/{index-DOMMMe9f.mjs.map → index-BGeyzo6u.mjs.map} +1 -1
- package/lib/chunks/{index-zDEwNk3h.mjs → index-BNUiNUWa.mjs} +35 -35
- package/lib/chunks/index-BNUiNUWa.mjs.map +1 -0
- package/lib/chunks/{index-DTH1IvOG.mjs → index-BSD3w5eG.mjs} +72 -72
- package/lib/chunks/index-BSD3w5eG.mjs.map +1 -0
- package/lib/chunks/{index-D_8IHm6o.mjs → index-BcBe6KW7.mjs} +11 -10
- package/lib/chunks/index-BcBe6KW7.mjs.map +1 -0
- package/lib/chunks/index-BdYkTSTt.mjs +51 -0
- package/lib/chunks/index-BdYkTSTt.mjs.map +1 -0
- package/lib/chunks/{index-BWbuffRN.mjs → index-BqEuP_8r.mjs} +8 -8
- package/lib/chunks/index-BqEuP_8r.mjs.map +1 -0
- package/lib/chunks/{index-LNXbKjrI.mjs → index-Bv93wiEK.mjs} +812 -681
- package/lib/chunks/index-Bv93wiEK.mjs.map +1 -0
- package/lib/chunks/{index-xTq9b3vw.mjs → index-CKirCT35.mjs} +13 -13
- package/lib/chunks/index-CKirCT35.mjs.map +1 -0
- package/lib/chunks/{index-BOEtlHD3.mjs → index-CgV8T0G5.mjs} +53 -53
- package/lib/chunks/index-CgV8T0G5.mjs.map +1 -0
- package/lib/chunks/{index-DinKO2op.mjs → index-D8GtNeDn.mjs} +2 -2
- package/lib/chunks/{index-DinKO2op.mjs.map → index-D8GtNeDn.mjs.map} +1 -1
- package/lib/chunks/{index-CQABwGVP.mjs → index-DGuiWJr7.mjs} +18 -18
- package/lib/chunks/index-DGuiWJr7.mjs.map +1 -0
- package/lib/chunks/{index-Yp36heK8.mjs → index-DV5Jd7Qe.mjs} +31 -31
- package/lib/chunks/index-DV5Jd7Qe.mjs.map +1 -0
- package/lib/chunks/{index-qxvk-6P6.mjs → index-DdOEWhrk.mjs} +33 -33
- package/lib/chunks/index-DdOEWhrk.mjs.map +1 -0
- package/lib/chunks/{index-w0tt7Myw.mjs → index-DmepcY31.mjs} +2 -2
- package/lib/chunks/{index-w0tt7Myw.mjs.map → index-DmepcY31.mjs.map} +1 -1
- package/lib/chunks/index-U3w45GW8.mjs +299 -0
- package/lib/chunks/index-U3w45GW8.mjs.map +1 -0
- package/lib/chunks/{index-BsSx9pGx.mjs → index-r3q2xCCI.mjs} +37 -36
- package/lib/chunks/index-r3q2xCCI.mjs.map +1 -0
- package/lib/chunks/{index-BEolw_uv.mjs → index-zEVVgWCH.mjs} +2 -2
- package/lib/chunks/{index-BEolw_uv.mjs.map → index-zEVVgWCH.mjs.map} +1 -1
- package/lib/chunks/{useShikiHighlight-DtWg9b8y.mjs → useShikiHighlight-DzEAK0S7.mjs} +7 -7
- package/lib/chunks/{useShikiHighlight-DtWg9b8y.mjs.map → useShikiHighlight-DzEAK0S7.mjs.map} +1 -1
- package/lib/index.cjs +20 -33
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +7 -7
- package/lib/renderers/Csv/index.d.ts.map +1 -1
- package/lib/renderers/Docx/index.d.ts.map +1 -1
- package/lib/renderers/Epub/index.d.ts.map +1 -1
- package/lib/renderers/Json/index.d.ts.map +1 -1
- package/lib/renderers/Markdown/index.d.ts.map +1 -1
- package/lib/renderers/Mobi/index.d.ts.map +1 -1
- package/lib/renderers/Msg/index.d.ts.map +1 -1
- package/lib/renderers/Pptx/index.d.ts.map +1 -1
- package/lib/renderers/Subtitle/index.d.ts.map +1 -1
- package/lib/renderers/Text/index.d.ts.map +1 -1
- package/lib/renderers/Xlsx/index.d.ts.map +1 -1
- package/lib/renderers/Xml/index.d.ts.map +1 -1
- package/lib/renderers/Zip/index.d.ts.map +1 -1
- package/lib/types.d.ts +1 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/lib/chunks/index--zZy1XpK.mjs +0 -299
- package/lib/chunks/index--zZy1XpK.mjs.map +0 -1
- package/lib/chunks/index-B5tBeF0g.mjs +0 -51
- package/lib/chunks/index-B5tBeF0g.mjs.map +0 -1
- package/lib/chunks/index-BIg3vHQf.mjs.map +0 -1
- package/lib/chunks/index-BOEtlHD3.mjs.map +0 -1
- package/lib/chunks/index-BWbuffRN.mjs.map +0 -1
- package/lib/chunks/index-BsSx9pGx.mjs.map +0 -1
- package/lib/chunks/index-CQABwGVP.mjs.map +0 -1
- package/lib/chunks/index-DTH1IvOG.mjs.map +0 -1
- package/lib/chunks/index-D_8IHm6o.mjs.map +0 -1
- package/lib/chunks/index-LNXbKjrI.mjs.map +0 -1
- package/lib/chunks/index-Yp36heK8.mjs.map +0 -1
- package/lib/chunks/index-qxvk-6P6.mjs.map +0 -1
- package/lib/chunks/index-xTq9b3vw.mjs.map +0 -1
- package/lib/chunks/index-zDEwNk3h.mjs.map +0 -1
- package/lib/chunks/xspreadsheet-CyBXARuf.mjs +0 -5215
- package/lib/chunks/xspreadsheet-CyBXARuf.mjs.map +0 -1
package/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../file-preview-core/lib/index.mjs","../src/i18n/LocaleContext.tsx","../src/ThemeContext.tsx","../src/renderers/Image/toolbar.tsx","../src/renderers/Pdf/toolbar.tsx","../src/renderers/Epub/toolbar.tsx","../src/renderers/Mobi/toolbar.tsx","../src/renderers/Zip/toolbar.tsx","../src/renderers/Text/toolbar.tsx","../src/renderers/Markdown/toolbar.tsx","../src/renderers/lazy.tsx","../src/renderers/Unsupported/index.tsx","../src/renderers/RendererLoading.tsx","../src/FilePreviewContent.tsx","../src/FilePreviewModal.tsx","../src/FilePreviewEmbed.tsx","../src/utils/pdfConfig.ts","../src/index.ts","../src/renderers/Image/index.tsx","../src/renderers/Pdf/index.tsx","../src/renderers/Docx/index.tsx","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/element.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/alphabet.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/cell_range.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/selector.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/scroll.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/history.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/clipboard.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/auto_filter.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/merge.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/helper.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/row.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/col.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/locale/en.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/locale/locale.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/validator.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/validation.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/data_proxy.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/event.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/config.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/resizer.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/scrollbar.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/selector.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/suggest.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/icon.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/calendar.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/datepicker.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/editor.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/button.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/canvas/draw.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/font.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/cell.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/formula.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/core/format.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/table.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/print.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/contextmenu.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/tooltip.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/item.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/dropdown_item.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_align.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/align.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/valign.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/toggle_item.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/autofilter.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/bold.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/italic.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/strike.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/underline.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/color_palette.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_color.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_linetype.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/border_palette.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_border.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/border.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/icon_item.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/clearformat.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/paintformat.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/text_color.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/fill_color.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_fontsize.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/font_size.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_font.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/font.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_format.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/format.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/dropdown_formula.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/formula.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/freeze.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/merge.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/redo.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/undo.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/print.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/textwrap.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/more.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/toolbar/index.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/modal.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/form_input.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/form_select.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/form_field.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/modal_validation.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/sort_filter.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/message.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/sheet.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/component/bottombar.js","../../../node_modules/.pnpm/x-data-spreadsheet@1.1.9/node_modules/x-data-spreadsheet/src/index.js","../src/renderers/Xlsx/index.tsx","../src/renderers/Pptx/index.tsx","../src/renderers/Msg/index.tsx","../src/renderers/Epub/index.tsx","../src/renderers/Mobi/index.tsx","../src/renderers/Video/index.tsx","../src/hooks/useAudioPlayer.ts","../src/renderers/Audio/index.tsx","../src/hooks/useShikiHighlight.ts","../src/renderers/Markdown/index.tsx","../src/renderers/Json/index.tsx","../src/renderers/Csv/index.tsx","../src/renderers/Xml/index.tsx","../src/renderers/Subtitle/index.tsx","../src/components/ResizableSplit.tsx","../src/renderers/Zip/index.tsx","../src/renderers/Text/index.tsx"],"sourcesContent":["import A from \"jszip\";\nfunction j(e) {\n try {\n const n = new URL(e).pathname.split(\"/\").pop() || \"file\";\n return decodeURIComponent(n);\n } catch {\n const t = e.split(\"/\").pop() || \"file\";\n return decodeURIComponent(t);\n }\n}\nfunction k(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase()) || \"\";\n return {\n // 图片\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n // 视频\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n ogg: \"video/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n m4v: \"video/x-m4v\",\n \"3gp\": \"video/3gpp\",\n flv: \"video/x-flv\",\n // 音频\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n m4a: \"audio/mp4\",\n aac: \"audio/aac\",\n flac: \"audio/flac\",\n // 文档\n pdf: \"application/pdf\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ppt: \"application/vnd.ms-powerpoint\",\n msg: \"application/vnd.ms-outlook\",\n mobi: \"application/x-mobipocket-ebook\",\n azw: \"application/vnd.amazon.ebook\",\n azw3: \"application/vnd.amazon.ebook\",\n kf8: \"application/vnd.amazon.ebook\",\n // 文本\n txt: \"text/plain\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n json: \"application/json\",\n xml: \"application/xml\",\n html: \"text/html\",\n css: \"text/css\",\n js: \"text/javascript\",\n ts: \"text/typescript\",\n jsx: \"text/javascript\",\n tsx: \"text/typescript\",\n py: \"text/x-python\",\n java: \"text/x-java\",\n cpp: \"text/x-c++src\",\n c: \"text/x-csrc\",\n cs: \"text/x-csharp\",\n php: \"text/x-php\",\n rb: \"text/x-ruby\",\n go: \"text/x-go\",\n rs: \"text/x-rust\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n toml: \"text/toml\",\n ini: \"text/plain\",\n env: \"text/plain\",\n diff: \"text/x-diff\",\n patch: \"text/x-diff\",\n log: \"text/plain\",\n csv: \"text/csv\",\n tsv: \"text/tab-separated-values\",\n srt: \"application/x-subrip\",\n vtt: \"text/vtt\",\n zip: \"application/zip\"\n }[t] || \"application/octet-stream\";\n}\nfunction I(e, t = 0) {\n if (e instanceof File)\n return {\n id: `file-${Date.now()}-${t}`,\n name: e.name,\n url: URL.createObjectURL(e),\n type: e.type || k(e.name),\n size: e.size\n };\n if (typeof e == \"string\") {\n const o = j(e);\n return {\n id: `url-${Date.now()}-${t}`,\n name: o,\n url: e,\n type: k(o)\n };\n }\n return {\n id: e.id || `link-${Date.now()}-${t}`,\n name: e.name,\n url: e.url,\n type: e.type || k(e.name),\n size: e.size\n };\n}\nfunction lt(e) {\n return e.map((t, o) => I(t, o));\n}\nfunction ct(e) {\n var r;\n const t = ((r = e.name.split(\".\").pop()) == null ? void 0 : r.toLowerCase()) || \"\", o = e.type.toLowerCase();\n if (o.startsWith(\"image/\") || [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"].includes(t))\n return \"image\";\n if (o.includes(\"pdf\") || t === \"pdf\")\n return \"pdf\";\n if (o.includes(\"wordprocessingml\") || t === \"docx\")\n return \"docx\";\n if (o.includes(\"spreadsheetml\") || t === \"xlsx\")\n return \"xlsx\";\n if (o.includes(\"presentationml\") || t === \"pptx\" || t === \"ppt\")\n return \"pptx\";\n if (o.includes(\"ms-outlook\") || t === \"msg\")\n return \"msg\";\n if (o.includes(\"epub\") || t === \"epub\")\n return \"epub\";\n if ([\"mobi\", \"azw\", \"azw3\", \"kf8\"].includes(t) || o === \"application/x-mobipocket-ebook\" || o === \"application/vnd.amazon.ebook\")\n return \"mobi\";\n if ([\"csv\", \"tsv\"].includes(t) || o === \"text/csv\" || o === \"text/tab-separated-values\")\n return \"csv\";\n if (t === \"xml\" || o === \"application/xml\" || o === \"text/xml\")\n return \"xml\";\n if ([\"srt\", \"vtt\", \"lrc\", \"elrc\", \"ass\", \"ssa\", \"ttml\", \"dfxp\"].includes(t) || o === \"text/vtt\" || o === \"application/x-subrip\" || o === \"application/ttml+xml\")\n return \"subtitle\";\n if (t === \"zip\" || o === \"application/zip\" || o === \"application/x-zip-compressed\")\n return \"zip\";\n if (o.startsWith(\"video/\") || [\"mp4\", \"webm\", \"ogg\", \"ogv\", \"mov\", \"avi\", \"mkv\", \"m4v\", \"3gp\", \"flv\"].includes(t))\n return \"video\";\n if (o.startsWith(\"audio/\") || [\"mp3\", \"wav\", \"ogg\", \"m4a\", \"flac\", \"aac\"].includes(t))\n return \"audio\";\n if (t === \"md\" || t === \"markdown\")\n return \"markdown\";\n if (o === \"application/json\" || t === \"json\")\n return \"json\";\n const n = [\n \"txt\",\n \"log\",\n \"lock\",\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"py\",\n \"java\",\n \"cpp\",\n \"c\",\n \"h\",\n \"cs\",\n \"php\",\n \"rb\",\n \"go\",\n \"mod\",\n \"rs\",\n \"swift\",\n \"kt\",\n \"lua\",\n \"vim\",\n \"html\",\n \"css\",\n \"scss\",\n \"sass\",\n \"less\",\n \"yaml\",\n \"yml\",\n \"toml\",\n \"ini\",\n \"conf\",\n \"env\",\n \"diff\",\n \"patch\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"sql\"\n ];\n return o.startsWith(\"text/\") || n.includes(t) ? \"text\" : \"unsupported\";\n}\nfunction dt(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase()) || \"\";\n return {\n js: \"javascript\",\n jsx: \"jsx\",\n ts: \"typescript\",\n tsx: \"tsx\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n cs: \"csharp\",\n php: \"php\",\n rb: \"ruby\",\n go: \"go\",\n mod: \"go\",\n rs: \"rust\",\n swift: \"swift\",\n kt: \"kotlin\",\n lua: \"lua\",\n vim: \"vim\",\n scala: \"scala\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n json: \"json\",\n xml: \"xml\",\n html: \"html\",\n css: \"css\",\n scss: \"scss\",\n sass: \"sass\",\n less: \"less\",\n sql: \"sql\",\n yaml: \"yaml\",\n yml: \"yaml\",\n toml: \"toml\",\n ini: \"ini\",\n env: \"bash\",\n conf: \"nginx\",\n diff: \"diff\",\n patch: \"diff\",\n log: \"log\",\n md: \"markdown\",\n txt: \"text\"\n }[t] || \"text\";\n}\nfunction ut(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase().split(\"?\")[0]) || \"\";\n return {\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n ogg: \"video/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n m4v: \"video/mp4\",\n \"3gp\": \"video/3gpp\",\n flv: \"video/x-flv\"\n }[t] || \"video/mp4\";\n}\nfunction pt(e) {\n return e < 1024 ? `${e} B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)} KB` : `${(e / (1024 * 1024)).toFixed(1)} MB`;\n}\nfunction ft(e) {\n if (!isFinite(e) || isNaN(e) || e < 0) return \"0:00\";\n const t = Math.floor(e / 60), o = Math.floor(e % 60);\n return `${t}:${o.toString().padStart(2, \"0\")}`;\n}\nfunction mt(e) {\n var o;\n return (((o = e.split(\".\").pop()) == null ? void 0 : o.toLowerCase()) || \"\") === \"tsv\" ? \"\t\" : \",\";\n}\nfunction gt(e, t = {}) {\n const o = t.delimiter ?? \",\", n = t.firstRowAsHeader ?? !0, r = [];\n let a = [], i = \"\", c = !1, s = 0;\n const l = e.length;\n for (; s < l; ) {\n const p = e[s];\n if (c) {\n if (p === '\"') {\n if (e[s + 1] === '\"') {\n i += '\"', s += 2;\n continue;\n }\n c = !1, s += 1;\n continue;\n }\n i += p, s += 1;\n continue;\n }\n if (p === '\"') {\n c = !0, s += 1;\n continue;\n }\n if (p === o) {\n a.push(i), i = \"\", s += 1;\n continue;\n }\n if (p === \"\\r\") {\n e[s + 1] === `\n` && (s += 1), a.push(i), r.push(a), a = [], i = \"\", s += 1;\n continue;\n }\n if (p === `\n`) {\n a.push(i), r.push(a), a = [], i = \"\", s += 1;\n continue;\n }\n i += p, s += 1;\n }\n for ((i.length > 0 || a.length > 0) && (a.push(i), r.push(a)); r.length > 0; ) {\n const p = r[r.length - 1];\n if (p.length === 1 && p[0] === \"\")\n r.pop();\n else\n break;\n }\n let d = [], f = r;\n n && r.length > 0 && (d = r[0], f = r.slice(1));\n const u = Math.max(\n d.length,\n ...f.map((p) => p.length),\n 0\n );\n for (const p of f)\n for (; p.length < u; ) p.push(\"\");\n return {\n header: d,\n rows: f,\n columnCount: u,\n delimiter: o\n };\n}\nfunction $(e) {\n const t = e instanceof Uint8Array ? e : new Uint8Array(e);\n if (t.length >= 3 && t[0] === 239 && t[1] === 187 && t[2] === 191)\n return new TextDecoder(\"utf-8\").decode(t);\n if (t.length >= 2 && t[0] === 255 && t[1] === 254)\n return new TextDecoder(\"utf-16le\").decode(t);\n if (t.length >= 2 && t[0] === 254 && t[1] === 255)\n return new TextDecoder(\"utf-16be\").decode(t);\n try {\n return new TextDecoder(\"utf-8\", { fatal: !0 }).decode(t);\n } catch {\n }\n try {\n return new TextDecoder(\"gbk\").decode(t);\n } catch {\n }\n return new TextDecoder(\"utf-8\", { fatal: !1 }).decode(t);\n}\nconst U = $;\nasync function ht(e, t) {\n const o = await fetch(e, t);\n if (!o.ok) throw new Error(`请求失败: ${o.status}`);\n const n = await o.arrayBuffer();\n return $(n);\n}\nfunction z(e) {\n const t = e.trim().replace(\",\", \".\"), o = t.split(\":\").map((n) => n.trim());\n if (o.length === 3) {\n const [n, r, a] = o;\n return Number(n) * 3600 + Number(r) * 60 + Number(a);\n }\n if (o.length === 2) {\n const [n, r] = o;\n return Number(n) * 60 + Number(r);\n }\n return Number(t) || 0;\n}\nfunction xt(e) {\n if (!isFinite(e) || e < 0) return \"00:00:00.000\";\n const t = Math.floor(e * 1e3), o = t % 1e3, n = Math.floor(t / 1e3) % 60, r = Math.floor(t / 6e4) % 60, a = Math.floor(t / 36e5), i = (c, s = 2) => c.toString().padStart(s, \"0\");\n return `${i(a)}:${i(r)}:${i(n)}.${i(o, 3)}`;\n}\nconst E = /(\\d{1,2}:)?\\d{1,2}:\\d{1,2}[.,]\\d{1,3}\\s*-->\\s*(\\d{1,2}:)?\\d{1,2}:\\d{1,2}[.,]\\d{1,3}/, B = /^\\s*\\[\\d{1,2}:\\d{1,2}(?:[.:]\\d{1,3})?\\]/;\nfunction W(e) {\n const t = e.replace(/^\\uFEFF/, \"\").trimStart();\n return /^WEBVTT/.test(t) ? \"vtt\" : /^<\\?xml/i.test(t) || /<tt\\b[^>]*>/i.test(t) ? \"ttml\" : /^\\[Script Info\\]/im.test(t) || /^Dialogue:/m.test(t) ? /ScriptType:\\s*v4\\.00\\s*$/im.test(t) ? \"ssa\" : \"ass\" : B.test(t) || /^\\[(ti|ar|al|au|by|length|offset|re|ve):/im.test(t) ? /<\\d{1,2}:\\d{1,2}(?:[.:]\\d{1,3})?>/.test(t) ? \"elrc\" : \"lrc\" : \"srt\";\n}\nfunction N(e, t) {\n const n = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), r = [];\n let a, i = 0;\n if (t === \"vtt\") {\n const c = [];\n for (; i < n.length && n[i].trim() !== \"\"; )\n c.push(n[i]), i++;\n for (a = c.join(`\n`); i < n.length && n[i].trim() === \"\"; ) i++;\n }\n for (; i < n.length; ) {\n for (; i < n.length && n[i].trim() === \"\"; ) i++;\n if (i >= n.length) break;\n let c, s = null;\n if (E.test(n[i]))\n s = n[i], i++;\n else if (c = n[i].trim() || void 0, i++, i < n.length && E.test(n[i]))\n s = n[i], i++;\n else\n continue;\n if (!s) continue;\n const l = s.match(/([\\d:.,]+)\\s*-->\\s*([\\d:.,]+)/);\n if (!l) continue;\n const d = z(l[1]), f = z(l[2]), u = [];\n for (; i < n.length && n[i].trim() !== \"\"; )\n u.push(n[i]), i++;\n r.push({ id: c, start: d, end: f, text: u.join(`\n`) });\n }\n return { format: t, cues: r, header: a };\n}\nfunction M(e, t, o) {\n const n = Number(e), r = Number(t);\n let a = 0;\n if (o) {\n const i = (o + \"000\").slice(0, 3);\n a = Number(i);\n }\n return n * 60 + r + a / 1e3;\n}\nfunction R(e, t) {\n const o = /^\\[(ti|ar|al|au|by|length|offset|re|ve):(.*)\\]$/i.exec(e.trim());\n if (!o) return !1;\n const n = o[1].toLowerCase(), r = o[2].trim();\n if (t.metadata[n] = r, n === \"offset\") {\n const a = Number(r);\n isNaN(a) || (t.offsetMs = a);\n }\n return !0;\n}\nfunction Z(e) {\n const o = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), n = { metadata: {}, offsetMs: 0 }, r = /\\[(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?\\]/g, a = [];\n for (const s of o) {\n const l = s.trim();\n if (!l || R(l, n)) continue;\n const d = [];\n let f = 0;\n r.lastIndex = 0;\n let u;\n for (; (u = r.exec(l)) !== null && u.index === f; )\n d.push(M(u[1], u[2], u[3])), f = u.index + u[0].length;\n if (d.length === 0) continue;\n const p = l.slice(f).trim();\n for (const m of d)\n a.push({ start: m, text: p });\n }\n a.sort((s, l) => s.start - l.start);\n const i = n.offsetMs / 1e3;\n return { format: \"lrc\", cues: a.map((s, l) => {\n const d = Math.max(0, s.start - i), f = a[l + 1], u = f ? Math.max(d, f.start - i) : d + 5;\n return { start: d, end: u, text: s.text };\n }), metadata: n.metadata };\n}\nfunction O(e) {\n const o = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), n = { metadata: {}, offsetMs: 0 }, r = /\\[(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?\\]/g, a = /<(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?>/g, i = [];\n for (const l of o) {\n const d = l.trim();\n if (!d || R(d, n)) continue;\n const f = [];\n let u = 0;\n r.lastIndex = 0;\n let p;\n for (; (p = r.exec(d)) !== null && p.index === u; )\n f.push(M(p[1], p[2], p[3])), u = p.index + p[0].length;\n if (f.length === 0) continue;\n const m = d.slice(u);\n for (const g of f)\n i.push({ start: g, raw: m });\n }\n i.sort((l, d) => l.start - d.start);\n const c = n.offsetMs / 1e3;\n return { format: \"elrc\", cues: i.map((l, d) => {\n const f = [];\n let u = \"\", p = 0, m = null;\n a.lastIndex = 0;\n let g;\n for (; (g = a.exec(l.raw)) !== null; ) {\n const F = l.raw.slice(p, g.index);\n m !== null && F && f.push({ start: Math.max(0, m - c), text: F }), u += F, m = M(g[1], g[2], g[3]), p = g.index + g[0].length;\n }\n const b = l.raw.slice(p);\n m !== null && b && f.push({ start: Math.max(0, m - c), text: b }), u += b;\n const h = Math.max(0, l.start - c), x = i[d + 1], w = x ? Math.max(h, x.start - c) : h + 5;\n return {\n start: h,\n end: w,\n text: u.trim(),\n words: f.length ? f : void 0\n };\n }), metadata: n.metadata };\n}\nfunction D(e) {\n const t = e.trim().split(\":\");\n return t.length !== 3 ? 0 : Number(t[0]) * 3600 + Number(t[1]) * 60 + Number(t[2].replace(\",\", \".\"));\n}\nfunction L(e, t) {\n const n = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`);\n let r = \"\", a = [];\n const i = [], c = [];\n for (const s of n) {\n const l = s.replace(/\\s+$/, \"\"), d = l.trim(), f = /^\\[([^\\]]+)\\]\\s*$/.exec(d);\n if (f) {\n r = f[1].toLowerCase(), c.push(l);\n continue;\n }\n if (r !== \"events\") {\n c.push(l);\n continue;\n }\n const u = /^Format:\\s*(.+)$/i.exec(d);\n if (u) {\n a = u[1].split(\",\").map((v) => v.trim());\n continue;\n }\n const p = /^(Dialogue|Comment):\\s*(.+)$/i.exec(d);\n if (!p || p[1].toLowerCase() === \"comment\" || a.length === 0) continue;\n const m = a.length, g = p[2].split(\",\"), b = g.slice(0, m - 1), h = g.slice(m - 1).join(\",\"), x = {};\n a.forEach((v, y) => {\n x[v] = y === m - 1 ? h : b[y] ?? \"\";\n });\n const w = D(x.Start || \"\"), F = D(x.End || \"\"), _ = (x.Text || \"\").replace(/\\\\N/g, `\n`).replace(/\\\\n/g, `\n`).replace(/\\\\h/g, \" \").replace(/\\{[^}]*\\}/g, \"\");\n i.push({ start: w, end: F, text: _, style: x.Style });\n }\n return i.sort((s, l) => s.start - l.start), {\n format: t,\n cues: i,\n header: c.join(`\n`).trim() || void 0\n };\n}\nfunction S(e) {\n const t = e.trim();\n if (!t) return 0;\n const o = /^(\\d+(?:\\.\\d+)?)(h|m|s|ms|f|t)$/i.exec(t);\n if (o) {\n const r = Number(o[1]), a = o[2].toLowerCase();\n return a === \"h\" ? r * 3600 : a === \"m\" ? r * 60 : a === \"ms\" ? r / 1e3 : r;\n }\n const n = t.split(\":\");\n return n.length === 3 ? Number(n[0]) * 3600 + Number(n[1]) * 60 + Number(n[2]) : n.length === 2 ? Number(n[0]) * 60 + Number(n[1]) : Number(t) || 0;\n}\nfunction V(e) {\n if (typeof DOMParser > \"u\")\n throw new Error(\"TTML parsing requires a DOMParser environment\");\n const t = new DOMParser().parseFromString(e, \"application/xml\");\n if (t.getElementsByTagName(\"parsererror\").length > 0)\n throw new Error(\"TTML XML parse error\");\n const n = t.getElementsByTagName(\"p\"), r = [];\n for (let a = 0; a < n.length; a++) {\n const i = n[a], c = i.getAttribute(\"begin\") || \"\", s = i.getAttribute(\"end\") || \"\", l = i.getAttribute(\"dur\") || \"\", d = S(c);\n let f;\n s ? f = S(s) : l ? f = d + S(l) : f = d + 5;\n let u = \"\";\n i.childNodes.forEach((m) => {\n if (m.nodeType === 3)\n u += m.nodeValue || \"\";\n else if (m.nodeType === 1) {\n const g = m;\n g.tagName.toLowerCase() === \"br\" ? u += `\n` : u += g.textContent || \"\";\n }\n });\n const p = u.replace(/[ \\t]+/g, \" \").replace(/\\n /g, `\n`).trim();\n (p || d || f) && r.push({ start: d, end: f, text: p });\n }\n return r.sort((a, i) => a.start - i.start), { format: \"ttml\", cues: r };\n}\nfunction bt(e, t) {\n switch (t ?? W(e)) {\n case \"lrc\":\n return Z(e);\n case \"elrc\":\n return O(e);\n case \"ass\":\n return L(e, \"ass\");\n case \"ssa\":\n return L(e, \"ssa\");\n case \"ttml\":\n return V(e);\n case \"vtt\":\n return N(e, \"vtt\");\n case \"srt\":\n default:\n return N(e, \"srt\");\n }\n}\nasync function Ft(e) {\n return A.loadAsync(e);\n}\nfunction vt(e) {\n const t = [];\n return e.forEach((o, n) => {\n var f;\n const r = n.dir, a = r && !o.endsWith(\"/\") ? o + \"/\" : o, i = r ? a.replace(/\\/$/, \"\") : a, c = i.lastIndexOf(\"/\"), s = c >= 0 ? i.slice(c + 1) : i, l = c >= 0 ? i.slice(0, c) : \"\", d = r ? 0 : ((f = n._data) == null ? void 0 : f.uncompressedSize) ?? 0;\n t.push({\n path: a,\n name: s,\n dir: l,\n isDir: r,\n size: d,\n date: n.date\n });\n }), t;\n}\nfunction wt(e) {\n const t = { name: \"\", path: \"\", isDir: !0, children: [], size: 0 }, o = /* @__PURE__ */ new Map();\n o.set(\"\", t);\n const n = (a) => {\n if (o.has(a)) return o.get(a);\n const i = a.split(\"/\").filter(Boolean);\n let c = t, s = \"\";\n for (const l of i) {\n s = s ? `${s}/${l}` : l;\n let d = o.get(s);\n d || (d = { name: l, path: s + \"/\", isDir: !0, children: [], size: 0 }, c.children.push(d), o.set(s, d)), c = d;\n }\n return c;\n };\n for (const a of e) {\n if (a.isDir) {\n n(a.path.replace(/\\/$/, \"\"));\n continue;\n }\n n(a.dir).children.push({\n name: a.name,\n path: a.path,\n isDir: !1,\n size: a.size\n });\n }\n const r = (a) => {\n if (a.children) {\n a.children.sort((i, c) => i.isDir !== c.isDir ? i.isDir ? -1 : 1 : i.name.localeCompare(c.name));\n for (const i of a.children) r(i);\n }\n };\n return r(t), t;\n}\nasync function yt(e, t) {\n const o = e.file(t);\n if (!o) throw new Error(`ZIP entry not found: ${t}`);\n const n = await o.async(\"arraybuffer\");\n return U(n);\n}\nasync function _t(e, t, o) {\n const n = e.file(t);\n if (!n) throw new Error(`ZIP entry not found: ${t}`);\n const r = await n.async(\"arraybuffer\");\n return new Blob([r], o ? { type: o } : void 0);\n}\nfunction q(e) {\n return e ? e.startsWith(\"#\") ? e : e.length === 8 ? \"#\" + e.substring(2) : e.length === 6 ? \"#\" + e : \"#000000\" : \"#000000\";\n}\nconst G = [\n \"FFFFFF\",\n \"000000\",\n \"E7E6E6\",\n \"44546A\",\n \"4472C4\",\n \"ED7D31\",\n \"A5A5A5\",\n \"FFC000\",\n \"5B9BD5\",\n \"70AD47\"\n], H = [\n \"000000\",\n \"FFFFFF\",\n \"FF0000\",\n \"00FF00\",\n \"0000FF\",\n \"FFFF00\",\n \"FF00FF\",\n \"00FFFF\",\n \"000000\",\n \"FFFFFF\",\n \"FF0000\",\n \"00FF00\",\n \"0000FF\",\n \"FFFF00\",\n \"FF00FF\",\n \"00FFFF\",\n \"800000\",\n \"008000\",\n \"000080\",\n \"808000\",\n \"800080\",\n \"008080\",\n \"C0C0C0\",\n \"808080\",\n \"9999FF\",\n \"993366\",\n \"FFFFCC\",\n \"CCFFFF\",\n \"660066\",\n \"FF8080\",\n \"0066CC\",\n \"CCCCFF\",\n \"000080\",\n \"FF00FF\",\n \"FFFF00\",\n \"00FFFF\",\n \"800080\",\n \"800000\",\n \"008080\",\n \"0000FF\",\n \"00CCFF\",\n \"CCFFFF\",\n \"CCFFCC\",\n \"FFFF99\",\n \"99CCFF\",\n \"FF99CC\",\n \"CC99FF\",\n \"FFCC99\",\n \"3366FF\",\n \"33CCCC\",\n \"99CC00\",\n \"FFCC00\",\n \"FF9900\",\n \"FF6600\",\n \"666699\",\n \"969696\",\n \"003366\",\n \"339966\",\n \"003300\",\n \"333300\",\n \"993300\",\n \"993366\",\n \"333399\",\n \"333333\"\n];\nfunction J(e, t) {\n const o = parseInt(e.substring(0, 2), 16), n = parseInt(e.substring(2, 4), 16), r = parseInt(e.substring(4, 6), 16), a = (l) => t < 0 ? Math.round(l * (1 + t)) : Math.round(l + (255 - l) * t), i = Math.min(255, Math.max(0, a(o))), c = Math.min(255, Math.max(0, a(n))), s = Math.min(255, Math.max(0, a(r)));\n return i.toString(16).padStart(2, \"0\") + c.toString(16).padStart(2, \"0\") + s.toString(16).padStart(2, \"0\");\n}\nfunction X(e) {\n if (e && e.type === \"pattern\" && e.pattern === \"solid\") {\n const t = e.fgColor;\n if (t)\n return T(t);\n }\n}\nfunction T(e) {\n if (e) {\n if (\"argb\" in e && typeof e.argb == \"string\" && e.argb)\n return q(e.argb);\n if (\"theme\" in e && typeof e.theme == \"number\") {\n const t = G[e.theme] || \"000000\", o = \"tint\" in e && typeof e.tint == \"number\" ? e.tint : 0;\n return \"#\" + (o !== 0 ? J(t, o) : t);\n }\n if (\"indexed\" in e && typeof e.indexed == \"number\") {\n const t = H[e.indexed];\n if (t) return \"#\" + t;\n }\n }\n}\nfunction K(e) {\n if (!e || !e.style) return;\n const t = T(e.color) || \"#000000\";\n return [e.style, t];\n}\nfunction Q(e) {\n const t = {};\n let o = !1;\n if (e.font) {\n const r = e.font;\n if ((r.name || r.size || r.bold || r.italic) && (o = !0, t.font = {}, r.name && (t.font.name = r.name), r.size && (t.font.size = r.size), r.bold && (t.font.bold = !0), r.italic && (t.font.italic = !0)), r.color) {\n const a = T(r.color);\n a && (o = !0, t.color = a);\n }\n r.underline && (o = !0, t.underline = !0), r.strike && (o = !0, t.strike = !0);\n }\n const n = X(e.fill);\n if (n && (o = !0, t.bgcolor = n), e.alignment) {\n const r = e.alignment;\n r.horizontal && (o = !0, t.align = r.horizontal), r.vertical && (o = !0, t.valign = r.vertical), r.wrapText && (o = !0, t.textwrap = !0);\n }\n if (e.border) {\n const r = {};\n let a = !1;\n const i = [\"top\", \"bottom\", \"left\", \"right\"];\n for (const c of i) {\n const s = K(e.border[c]);\n s && (r[c] = s, a = !0);\n }\n a && (o = !0, t.border = r);\n }\n return o ? t : null;\n}\nfunction Y(e) {\n return JSON.stringify(e);\n}\nfunction tt(e, t, o) {\n const n = Q(e);\n if (!n) return -1;\n const r = Y(n), a = o.get(r);\n if (a !== void 0) return a;\n const i = t.length;\n return t.push(n), o.set(r, i), i;\n}\nfunction et(e) {\n const t = e.value;\n if (t == null) return \"\";\n if (typeof t == \"string\") return t;\n if (typeof t == \"number\") return String(t);\n if (typeof t == \"boolean\") return t ? \"TRUE\" : \"FALSE\";\n if (t instanceof Date)\n return t.toLocaleDateString();\n if (typeof t == \"object\" && \"formula\" in t) {\n const o = t.result;\n return o != null ? String(o) : \"\";\n }\n return typeof t == \"object\" && \"richText\" in t ? t.richText.map((n) => n.text).join(\"\") : typeof t == \"object\" && \"hyperlink\" in t ? t.text || \"\" : typeof t == \"object\" && \"error\" in t ? String(t.error) : String(t);\n}\nfunction ot(e) {\n const t = e.split(\":\"), o = P(t[0]), n = t[1] ? P(t[1]) : o;\n return {\n top: o.row,\n left: o.col,\n bottom: n.row,\n right: n.col\n };\n}\nfunction P(e) {\n const t = e.match(/^([A-Z]+)(\\d+)$/);\n if (!t) return { row: 1, col: 1 };\n const o = t[1], n = parseInt(t[2], 10);\n let r = 0;\n for (let a = 0; a < o.length; a++)\n r = r * 26 + (o.charCodeAt(a) - 64);\n return { row: n, col: r };\n}\nfunction Ct(e) {\n const t = [];\n return e.eachSheet((o) => {\n const n = [], r = /* @__PURE__ */ new Map(), a = [], i = {}, c = {}, s = o.columnCount;\n for (let u = 1; u <= s; u++) {\n const p = o.getColumn(u);\n p.width && (c[String(u - 1)] = { width: Math.round(p.width * 7.5) });\n }\n c.len = Math.max(s, 26);\n const l = /* @__PURE__ */ new Map(), d = o.model, f = (d == null ? void 0 : d.merges) || [];\n for (const u of f) {\n a.push(u);\n const { top: p, left: m, bottom: g, right: b } = ot(u), h = g - p, x = b - m;\n l.set(`${p - 1},${m - 1}`, [h, x]);\n }\n o.eachRow({ includeEmpty: !0 }, (u, p) => {\n const m = p - 1, g = {};\n u.eachCell({ includeEmpty: !1 }, (h, x) => {\n const w = x - 1;\n if (h.isMerged && h.master !== h) return;\n const F = et(h), _ = tt(h, n, r), v = { text: F };\n _ !== -1 && (v.style = _);\n const y = `${m},${w}`;\n l.has(y) && (v.merge = l.get(y)), g[String(w)] = v;\n });\n const b = { cells: g };\n u.height && (b.height = Math.round(u.height * 1.333)), i[String(m)] = b;\n }), t.push({\n name: o.name,\n styles: n,\n merges: a,\n rows: i,\n cols: c\n });\n }), t;\n}\nfunction kt(e, t, o = \"Sheet1\") {\n const n = e.length > 0, a = n ? [{ font: { bold: !0 } }] : [], i = {};\n if (n) {\n const s = {};\n e.forEach((l, d) => {\n s[String(d)] = { text: l, style: 0 };\n }), i[0] = { cells: s };\n }\n const c = n ? 1 : 0;\n return t.forEach((s, l) => {\n const d = {};\n s.forEach((f, u) => {\n f !== void 0 && f !== \"\" && (d[String(u)] = { text: f });\n }), i[String(l + c)] = { cells: d };\n }), [{ name: o, styles: a, rows: i }];\n}\nfunction St(e, t) {\n var i;\n if (typeof window > \"u\") return;\n const o = (e == null ? void 0 : e.version) || ((i = e == null ? void 0 : e.GlobalWorkerOptions) == null ? void 0 : i.version) || \"\", {\n workerSrc: n = `https://unpkg.com/pdfjs-dist@${o}/build/pdf.worker.min.mjs`,\n cMapUrl: r = `https://unpkg.com/pdfjs-dist@${o}/cmaps/`,\n cMapPacked: a = !0\n } = t || {};\n e.GlobalWorkerOptions && (e.GlobalWorkerOptions.workerSrc = n, e.GlobalWorkerOptions.cMapUrl = r, e.GlobalWorkerOptions.cMapPacked = a);\n}\nconst nt = {\n // ─────── common ───────\n \"common.download\": \"下载\",\n \"common.close\": \"关闭\",\n \"common.loading\": \"加载中\",\n \"common.unknown_error\": \"未知错误\",\n \"common.unsupported_preview\": \"不支持预览此文件类型 ({type})\",\n // ─────── toolbar ───────\n \"toolbar.zoom_in\": \"放大\",\n \"toolbar.zoom_out\": \"缩小\",\n \"toolbar.rotate_left\": \"向左旋转\",\n \"toolbar.rotate_right\": \"向右旋转\",\n \"toolbar.reset\": \"复原\",\n \"toolbar.fit_to_window\": \"适应窗口\",\n \"toolbar.original_size\": \"原始尺寸\",\n \"toolbar.toc\": \"目录\",\n \"toolbar.prev_page\": \"上一页\",\n \"toolbar.next_page\": \"下一页\",\n \"toolbar.full_width\": \"全屏宽度\",\n \"toolbar.normal_width\": \"正常宽度\",\n \"toolbar.wrap_on\": \"自动换行\",\n \"toolbar.wrap_off\": \"不换行\",\n \"toolbar.source\": \"源码\",\n \"toolbar.preview\": \"预览\",\n // ─────── image ───────\n \"image.load_failed\": \"图片加载失败\",\n // ─────── pdf ───────\n \"pdf.load_failed\": \"PDF 文件加载失败\",\n // ─────── docx ───────\n \"docx.parse_failed\": \"Word 文档解析失败\",\n // ─────── xlsx ───────\n \"xlsx.loading\": \"加载 Excel 中...\",\n \"xlsx.load_failed\": \"Excel 加载失败\",\n \"xlsx.parse_failed\": \"Excel 文件解析失败\",\n \"xlsx.not_found\": \"Excel 文件不存在\",\n // ─────── pptx ───────\n \"pptx.loading\": \"加载 PPT 中...\",\n \"pptx.load_failed\": \"PPT 加载失败\",\n \"pptx.parse_failed\": \"PPT 文件解析失败\",\n \"pptx.not_found\": \"PPT 文件不存在\",\n \"pptx.invalid_format\": \"PPT 文件格式错误或已损坏\",\n \"pptx.no_pages\": \"PPT 文件无有效页面\",\n \"pptx.timeout\": \"加载超时,请检查网络或稍后重试\",\n // ─────── msg ───────\n \"msg.parse_failed\": \"Outlook 邮件解析失败\",\n \"msg.parse_failed_short\": \"邮件解析失败\",\n \"msg.empty_body\": \"(无邮件正文)\",\n // ─────── epub ───────\n \"epub.load_failed\": \"EPUB 文件加载失败\",\n // ─────── mobi ───────\n \"mobi.load_failed\": \"电子书加载失败,文件可能已损坏或带有 DRM 保护\",\n // ─────── video ───────\n \"video.loading\": \"加载视频中...\",\n \"video.load_failed\": \"视频加载失败\",\n \"video.load_failed_with_error\": \"视频加载失败: {error}\",\n // ─────── audio (aria-label) ───────\n \"audio.aria.play\": \"播放\",\n \"audio.aria.pause\": \"暂停\",\n \"audio.aria.forward_10\": \"前进 10 秒\",\n \"audio.aria.backward_10\": \"后退 10 秒\",\n \"audio.aria.mute\": \"静音\",\n \"audio.aria.unmute\": \"取消静音\",\n \"audio.aria.loop_on\": \"开启循环\",\n \"audio.aria.loop_off\": \"关闭循环\",\n \"audio.aria.progress\": \"播放进度\",\n \"audio.aria.volume\": \"音量\",\n // ─────── markdown ───────\n \"markdown.load_failed\": \"Markdown 文件加载失败\",\n \"markdown.copy_code\": \"复制代码\",\n \"markdown.copied\": \"已复制\",\n // ─────── json ───────\n \"json.load_failed\": \"JSON 文件加载失败\",\n \"json.items\": \"items\",\n \"json.keys\": \"keys\",\n // ─────── csv ───────\n \"csv.loading\": \"加载 CSV 中...\",\n \"csv.load_failed\": \"CSV 文件加载失败\",\n \"csv.parse_failed\": \"CSV 解析失败\",\n // ─────── xml ───────\n \"xml.load_failed\": \"XML 文件加载失败\",\n // ─────── subtitle / lyric ───────\n \"subtitle.load_failed\": \"字幕文件加载失败\",\n \"subtitle.parse_failed\": \"字幕解析失败\",\n \"subtitle.lines\": \"lines\",\n \"subtitle.cues\": \"cues\",\n \"subtitle.meta.title\": \"标题\",\n \"subtitle.meta.artist\": \"艺术家\",\n \"subtitle.meta.album\": \"专辑\",\n \"subtitle.meta.author\": \"作者\",\n \"subtitle.meta.by\": \"制作\",\n \"subtitle.meta.length\": \"时长\",\n \"subtitle.meta.offset\": \"偏移\",\n \"subtitle.meta.editor\": \"编辑器\",\n \"subtitle.meta.version\": \"版本\",\n // ─────── zip ───────\n \"zip.load_failed\": \"ZIP 文件加载失败\",\n \"zip.parse_failed\": \"ZIP 解析失败\",\n // ─────── text ───────\n \"text.load_failed\": \"文本文件加载失败\"\n}, rt = {\n // ─────── common ───────\n \"common.download\": \"Download\",\n \"common.close\": \"Close\",\n \"common.loading\": \"Loading\",\n \"common.unknown_error\": \"Unknown error\",\n \"common.unsupported_preview\": \"Preview not supported for this file type ({type})\",\n // ─────── toolbar ───────\n \"toolbar.zoom_in\": \"Zoom in\",\n \"toolbar.zoom_out\": \"Zoom out\",\n \"toolbar.rotate_left\": \"Rotate left\",\n \"toolbar.rotate_right\": \"Rotate right\",\n \"toolbar.reset\": \"Reset\",\n \"toolbar.fit_to_window\": \"Fit to window\",\n \"toolbar.original_size\": \"Original size\",\n \"toolbar.toc\": \"Table of contents\",\n \"toolbar.prev_page\": \"Previous page\",\n \"toolbar.next_page\": \"Next page\",\n \"toolbar.full_width\": \"Full width\",\n \"toolbar.normal_width\": \"Normal width\",\n \"toolbar.wrap_on\": \"Word wrap\",\n \"toolbar.wrap_off\": \"No wrap\",\n \"toolbar.source\": \"Source\",\n \"toolbar.preview\": \"Preview\",\n // ─────── image ───────\n \"image.load_failed\": \"Failed to load image\",\n // ─────── pdf ───────\n \"pdf.load_failed\": \"Failed to load PDF\",\n // ─────── docx ───────\n \"docx.parse_failed\": \"Failed to parse Word document\",\n // ─────── xlsx ───────\n \"xlsx.loading\": \"Loading Excel...\",\n \"xlsx.load_failed\": \"Failed to load Excel\",\n \"xlsx.parse_failed\": \"Failed to parse Excel file\",\n \"xlsx.not_found\": \"Excel file not found\",\n // ─────── pptx ───────\n \"pptx.loading\": \"Loading PPT...\",\n \"pptx.load_failed\": \"Failed to load PPT\",\n \"pptx.parse_failed\": \"Failed to parse PPT file\",\n \"pptx.not_found\": \"PPT file not found\",\n \"pptx.invalid_format\": \"PPT file format is invalid or corrupted\",\n \"pptx.no_pages\": \"PPT file has no valid pages\",\n \"pptx.timeout\": \"Loading timed out, please check your network and retry\",\n // ─────── msg ───────\n \"msg.parse_failed\": \"Failed to parse Outlook message\",\n \"msg.parse_failed_short\": \"Failed to parse message\",\n \"msg.empty_body\": \"(No message body)\",\n // ─────── epub ───────\n \"epub.load_failed\": \"Failed to load EPUB\",\n // ─────── mobi ───────\n \"mobi.load_failed\": \"Failed to load ebook — file may be corrupted or DRM-protected\",\n // ─────── video ───────\n \"video.loading\": \"Loading video...\",\n \"video.load_failed\": \"Failed to load video\",\n \"video.load_failed_with_error\": \"Failed to load video: {error}\",\n // ─────── audio (aria-label) ───────\n \"audio.aria.play\": \"Play\",\n \"audio.aria.pause\": \"Pause\",\n \"audio.aria.forward_10\": \"Forward 10 seconds\",\n \"audio.aria.backward_10\": \"Back 10 seconds\",\n \"audio.aria.mute\": \"Mute\",\n \"audio.aria.unmute\": \"Unmute\",\n \"audio.aria.loop_on\": \"Enable loop\",\n \"audio.aria.loop_off\": \"Disable loop\",\n \"audio.aria.progress\": \"Playback progress\",\n \"audio.aria.volume\": \"Volume\",\n // ─────── markdown ───────\n \"markdown.load_failed\": \"Failed to load Markdown\",\n \"markdown.copy_code\": \"Copy code\",\n \"markdown.copied\": \"Copied\",\n // ─────── json ───────\n \"json.load_failed\": \"Failed to load JSON\",\n \"json.items\": \"items\",\n \"json.keys\": \"keys\",\n // ─────── csv ───────\n \"csv.loading\": \"Loading CSV...\",\n \"csv.load_failed\": \"Failed to load CSV\",\n \"csv.parse_failed\": \"Failed to parse CSV\",\n // ─────── xml ───────\n \"xml.load_failed\": \"Failed to load XML\",\n // ─────── subtitle / lyric ───────\n \"subtitle.load_failed\": \"Failed to load subtitle\",\n \"subtitle.parse_failed\": \"Failed to parse subtitle\",\n \"subtitle.lines\": \"lines\",\n \"subtitle.cues\": \"cues\",\n \"subtitle.meta.title\": \"Title\",\n \"subtitle.meta.artist\": \"Artist\",\n \"subtitle.meta.album\": \"Album\",\n \"subtitle.meta.author\": \"Author\",\n \"subtitle.meta.by\": \"By\",\n \"subtitle.meta.length\": \"Length\",\n \"subtitle.meta.offset\": \"Offset\",\n \"subtitle.meta.editor\": \"Editor\",\n \"subtitle.meta.version\": \"Version\",\n // ─────── zip ───────\n \"zip.load_failed\": \"Failed to load ZIP\",\n \"zip.parse_failed\": \"Failed to parse ZIP\",\n // ─────── text ───────\n \"text.load_failed\": \"Failed to load text file\"\n}, C = {\n \"zh-CN\": nt,\n \"en-US\": rt\n}, it = /\\{(\\w+)\\}/g;\nfunction at(e, t) {\n return t ? e.replace(it, (o, n) => {\n const r = t[n];\n return r === void 0 ? `{${n}}` : String(r);\n }) : e;\n}\nfunction Mt(e) {\n var i;\n const t = e.fallbackLocale ?? \"zh-CN\", o = C[e.locale] ?? C[t] ?? C[\"zh-CN\"], n = (i = e.messages) == null ? void 0 : i[e.locale], r = n ? { ...o, ...n } : o, a = C[\"zh-CN\"];\n return (c, s) => {\n const l = r[c] ?? a[c] ?? c;\n return at(l, s);\n };\n}\nexport {\n wt as buildZipTree,\n C as builtInMessages,\n St as configurePdfWorker,\n kt as convertCsvToSpreadsheetData,\n Ct as convertWorkbookToSpreadsheetData,\n Mt as createTranslator,\n $ as decodeText,\n U as decodeUtf8,\n ht as fetchTextUtf8,\n pt as formatFileSize,\n xt as formatSubtitleTime,\n ft as formatTime,\n j as getFileNameFromUrl,\n ct as getFileType,\n dt as getLanguageFromFileName,\n ut as getVideoMimeType,\n mt as guessCsvDelimiter,\n k as inferMimeType,\n vt as listZipEntries,\n Ft as loadZip,\n I as normalizeFile,\n lt as normalizeFiles,\n gt as parseCsv,\n bt as parseSubtitle,\n _t as readZipEntryBlob,\n yt as readZipEntryText\n};\n//# sourceMappingURL=index.mjs.map\n","import React, { createContext, useContext, useMemo } from 'react';\nimport {\n createTranslator,\n type Locale,\n type Messages,\n type Translator,\n} from '@eternalheart/file-preview-core';\n\nexport interface LocaleContextValue {\n locale: Locale;\n t: Translator;\n}\n\nconst LocaleContext = createContext<LocaleContextValue | null>(null);\n\nexport interface LocaleProviderProps {\n /** 当前语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义字典,浅合并到内置字典之上 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n children: React.ReactNode;\n}\n\nexport const LocaleProvider: React.FC<LocaleProviderProps> = ({\n locale = 'zh-CN',\n messages,\n children,\n}) => {\n const value = useMemo<LocaleContextValue>(() => {\n const t = createTranslator({ locale, messages });\n return { locale, t };\n }, [locale, messages]);\n\n return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;\n};\n\n/**\n * 兜底 translator(当组件被脱离 LocaleProvider 直接使用时)\n * 保持模块级单例,避免每次调用重建\n */\nlet fallbackTranslator: Translator | null = null;\nfunction getFallbackTranslator(): Translator {\n if (!fallbackTranslator) {\n fallbackTranslator = createTranslator({ locale: 'zh-CN' });\n }\n return fallbackTranslator;\n}\n\n/**\n * 获取翻译函数。任意位置调用都安全:\n * - 在 LocaleProvider 下 → 用 provider 提供的 translator\n * - 否则 → 回落到 zh-CN 兜底 translator\n */\nexport function useTranslator(): Translator {\n const ctx = useContext(LocaleContext);\n return ctx?.t ?? getFallbackTranslator();\n}\n\n/**\n * 获取当前 locale。在 Provider 之外返回 'zh-CN'。\n */\nexport function useLocale(): Locale {\n const ctx = useContext(LocaleContext);\n return ctx?.locale ?? 'zh-CN';\n}\n","import React, { createContext, useContext } from 'react';\n\n/** 已解析的主题(auto 在 FilePreviewContent 里被解析过) */\nexport type ResolvedTheme = 'dark' | 'light';\n\nconst ThemeContext = createContext<ResolvedTheme | null>(null);\n\nexport interface ThemeProviderProps {\n theme: ResolvedTheme;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n};\n\n/**\n * 获取已解析的主题('dark' | 'light')。\n * Provider 之外默认 'dark'(保持组件历史默认行为)。\n *\n * renderer 需要切第三方库的 theme prop(如 react-syntax-highlighter 的 style、\n * shiki 的 theme 选项)时使用;不要用它做 className 分支 —— class 由 CSS 变量\n * 通过根容器 [data-theme] 自动切换。\n */\nexport function useResolvedTheme(): ResolvedTheme {\n return useContext(ThemeContext) ?? 'dark';\n}\n","import React from 'react';\nimport { ZoomIn, ZoomOut, RotateCw, RotateCcw, Scan, RefreshCw } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nconst OriginalSizeIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <text x=\"12\" y=\"17.5\" textAnchor=\"middle\" fontSize=\"20\" fontWeight=\"bold\" fill=\"currentColor\" stroke=\"none\">\n 1:1\n </text>\n </svg>\n);\n\nexport interface ImageToolbarContext {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onFitToWidth: () => void;\n onOriginalSize: () => void;\n onRotateLeft: () => void;\n onRotateRight: () => void;\n onReset: () => void;\n t: Translator;\n}\n\nexport function getImageToolbarGroups(ctx: ImageToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_out'), action: ctx.onZoomOut, disabled: ctx.zoom <= 0.01 },\n { type: 'text', content: `${Math.round(ctx.zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_in'), action: ctx.onZoomIn, disabled: ctx.zoom >= 10 },\n ],\n },\n {\n items: [\n { type: 'button', icon: <Scan className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.fit_to_window'), action: ctx.onFitToWidth },\n { type: 'button', icon: <OriginalSizeIcon className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.original_size'), action: ctx.onOriginalSize },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RotateCcw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.rotate_left'), action: ctx.onRotateLeft },\n { type: 'button', icon: <RotateCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.rotate_right'), action: ctx.onRotateRight },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.reset'), action: ctx.onReset },\n ],\n },\n ];\n}\n","import { ZoomIn, ZoomOut, RefreshCw } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface PdfToolbarContext {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n t: Translator;\n}\n\nexport function getPdfToolbarGroups(ctx: PdfToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_out'), action: ctx.onZoomOut, disabled: ctx.zoom <= 0.01 },\n { type: 'text', content: `${Math.round(ctx.zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_in'), action: ctx.onZoomIn, disabled: ctx.zoom >= 10 },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.reset'), action: ctx.onReset },\n ],\n },\n ];\n}\n","import React from 'react';\nimport { ChevronLeft, ChevronRight, List, Maximize2, Minimize2 } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { EpubRendererHandle } from './index';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface EpubToolbarContext {\n epubRef: React.RefObject<EpubRendererHandle | null>;\n current: number;\n total: number;\n fullWidth: boolean;\n t: Translator;\n}\n\nexport function getEpubToolbarGroups(ctx: EpubToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <List className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.toc'), action: () => ctx.epubRef.current?.toggleToc() },\n ],\n },\n {\n items: [\n { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.prev_page'), action: () => ctx.epubRef.current?.prevPage() },\n { type: 'text', content: `${ctx.current} / ${ctx.total}`, minWidth: '4rem' },\n { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.next_page'), action: () => ctx.epubRef.current?.nextPage() },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: ctx.fullWidth ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" /> : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.fullWidth ? ctx.t('toolbar.normal_width') : ctx.t('toolbar.full_width'),\n action: () => ctx.epubRef.current?.toggleFullWidth(),\n },\n ],\n },\n ];\n}\n","import React from 'react';\nimport { ChevronLeft, ChevronRight, List, Maximize2, Minimize2 } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { MobiRendererHandle } from './index';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface MobiToolbarContext {\n mobiRef: React.RefObject<MobiRendererHandle | null>;\n current: number;\n total: number;\n fullWidth: boolean;\n t: Translator;\n}\n\nexport function getMobiToolbarGroups(ctx: MobiToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n {\n type: 'button',\n icon: <List className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.toc'),\n action: () => ctx.mobiRef.current?.toggleToc(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.prev_page'),\n action: () => ctx.mobiRef.current?.prevPage(),\n },\n {\n type: 'text',\n content: `${ctx.current} / ${ctx.total}`,\n minWidth: '4rem',\n },\n {\n type: 'button',\n icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.next_page'),\n action: () => ctx.mobiRef.current?.nextPage(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: ctx.fullWidth\n ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" />\n : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.fullWidth ? ctx.t('toolbar.normal_width') : ctx.t('toolbar.full_width'),\n action: () => ctx.mobiRef.current?.toggleFullWidth(),\n },\n ],\n },\n ];\n}\n","import type { ToolbarGroup } from '../toolbar.types';\nimport { formatFileSize } from '@eternalheart/file-preview-core';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface ZipToolbarStats {\n files: number;\n dirs: number;\n size: number;\n}\n\nexport interface ZipToolbarContext {\n stats: ZipToolbarStats | null;\n t: Translator;\n}\n\nexport function getZipToolbarGroups({ stats }: ZipToolbarContext): ToolbarGroup[] {\n if (!stats) return [];\n return [\n {\n items: [\n {\n type: 'text',\n content: `${stats.files} files · ${stats.dirs} dirs · ${formatFileSize(stats.size)}`,\n minWidth: '10rem',\n },\n ],\n },\n ];\n}\n","import { WrapText, Eye, Code } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface TextToolbarContext {\n wordWrap: boolean;\n onToggleWrap: () => void;\n isHtml: boolean;\n htmlPreview: boolean;\n onToggleHtmlPreview: () => void;\n t: Translator;\n}\n\nexport function getTextToolbarGroups(ctx: TextToolbarContext): ToolbarGroup[] {\n const groups: ToolbarGroup[] = [\n {\n items: [\n {\n type: 'button',\n icon: <WrapText className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.wordWrap ? ctx.t('toolbar.wrap_off') : ctx.t('toolbar.wrap_on'),\n action: ctx.onToggleWrap,\n },\n ],\n },\n ];\n\n if (ctx.isHtml) {\n groups.push({\n items: [\n {\n type: 'button',\n icon: ctx.htmlPreview\n ? <Code className=\"rfp-w-4 rfp-h-4\" />\n : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.htmlPreview ? ctx.t('toolbar.source') : ctx.t('toolbar.preview'),\n action: ctx.onToggleHtmlPreview,\n },\n ],\n });\n }\n\n return groups;\n}\n","import { Eye, Code } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface MarkdownToolbarContext {\n viewMode: 'preview' | 'source';\n onToggleViewMode: () => void;\n t: Translator;\n}\n\nexport function getMarkdownToolbarGroups(ctx: MarkdownToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n {\n type: 'button',\n icon: ctx.viewMode === 'preview'\n ? <Code className=\"rfp-w-4 rfp-h-4\" />\n : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.viewMode === 'preview' ? ctx.t('toolbar.source') : ctx.t('toolbar.preview'),\n action: ctx.onToggleViewMode,\n },\n ],\n },\n ];\n}\n","// 集中的 lazy 装饰:把每个 renderer 转为 React.lazy(import).then(default),\n// 让 rollup 自动按 chunk 分割。\n// 显式声明 LazyExoticComponent 以避免 TS4023(要求把内部 Props 类型导入到当前文件作用域)。\nimport { lazy, type LazyExoticComponent, type ComponentType } from 'react';\nimport type { ImageRenderer as ImageRendererImpl } from './Image';\nimport type { PdfRenderer as PdfRendererImpl } from './Pdf';\nimport type { DocxRenderer as DocxRendererImpl } from './Docx';\nimport type { XlsxRenderer as XlsxRendererImpl } from './Xlsx';\nimport type { PptxRenderer as PptxRendererImpl } from './Pptx';\nimport type { MsgRenderer as MsgRendererImpl } from './Msg';\nimport type { EpubRenderer as EpubRendererImpl } from './Epub';\nimport type { MobiRenderer as MobiRendererImpl } from './Mobi';\nimport type { VideoRenderer as VideoRendererImpl } from './Video';\nimport type { AudioRenderer as AudioRendererImpl } from './Audio';\nimport type { MarkdownRenderer as MarkdownRendererImpl } from './Markdown';\nimport type { JsonRenderer as JsonRendererImpl } from './Json';\nimport type { CsvRenderer as CsvRendererImpl } from './Csv';\nimport type { XmlRenderer as XmlRendererImpl } from './Xml';\nimport type { SubtitleRenderer as SubtitleRendererImpl } from './Subtitle';\nimport type { ZipRenderer as ZipRendererImpl } from './Zip';\nimport type { TextRenderer as TextRendererImpl } from './Text';\n\ntype Lazy<T> = LazyExoticComponent<T extends ComponentType<infer P> ? ComponentType<P> : never>;\n\nexport const ImageRenderer: Lazy<typeof ImageRendererImpl> = lazy(() =>\n import('./Image').then((m) => ({ default: m.ImageRenderer })),\n);\n\nexport const PdfRenderer: Lazy<typeof PdfRendererImpl> = lazy(() =>\n import('./Pdf').then((m) => ({ default: m.PdfRenderer })),\n);\n\nexport const DocxRenderer: Lazy<typeof DocxRendererImpl> = lazy(() =>\n import('./Docx').then((m) => ({ default: m.DocxRenderer })),\n);\n\nexport const XlsxRenderer: Lazy<typeof XlsxRendererImpl> = lazy(() =>\n import('./Xlsx').then((m) => ({ default: m.XlsxRenderer })),\n);\n\nexport const PptxRenderer: Lazy<typeof PptxRendererImpl> = lazy(() =>\n import('./Pptx').then((m) => ({ default: m.PptxRenderer })),\n);\n\nexport const MsgRenderer: Lazy<typeof MsgRendererImpl> = lazy(() =>\n import('./Msg').then((m) => ({ default: m.MsgRenderer })),\n);\n\nexport const EpubRenderer: Lazy<typeof EpubRendererImpl> = lazy(() =>\n import('./Epub').then((m) => ({ default: m.EpubRenderer })),\n);\n\nexport const MobiRenderer: Lazy<typeof MobiRendererImpl> = lazy(() =>\n import('./Mobi').then((m) => ({ default: m.MobiRenderer })),\n);\n\nexport const VideoRenderer: Lazy<typeof VideoRendererImpl> = lazy(() =>\n import('./Video').then((m) => ({ default: m.VideoRenderer })),\n);\n\nexport const AudioRenderer: Lazy<typeof AudioRendererImpl> = lazy(() =>\n import('./Audio').then((m) => ({ default: m.AudioRenderer })),\n);\n\nexport const MarkdownRenderer: Lazy<typeof MarkdownRendererImpl> = lazy(() =>\n import('./Markdown').then((m) => ({ default: m.MarkdownRenderer })),\n);\n\nexport const JsonRenderer: Lazy<typeof JsonRendererImpl> = lazy(() =>\n import('./Json').then((m) => ({ default: m.JsonRenderer })),\n);\n\nexport const CsvRenderer: Lazy<typeof CsvRendererImpl> = lazy(() =>\n import('./Csv').then((m) => ({ default: m.CsvRenderer })),\n);\n\nexport const XmlRenderer: Lazy<typeof XmlRendererImpl> = lazy(() =>\n import('./Xml').then((m) => ({ default: m.XmlRenderer })),\n);\n\nexport const SubtitleRenderer: Lazy<typeof SubtitleRendererImpl> = lazy(() =>\n import('./Subtitle').then((m) => ({ default: m.SubtitleRenderer })),\n);\n\nexport const ZipRenderer: Lazy<typeof ZipRendererImpl> = lazy(() =>\n import('./Zip').then((m) => ({ default: m.ZipRenderer })),\n);\n\nexport const TextRenderer: Lazy<typeof TextRendererImpl> = lazy(() =>\n import('./Text').then((m) => ({ default: m.TextRenderer })),\n);\n","import { FileQuestion, Download } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface UnsupportedRendererProps {\n fileName: string;\n fileType: string;\n onDownload: () => void;\n}\n\nexport const UnsupportedRenderer: React.FC<UnsupportedRendererProps> = ({\n fileName,\n fileType,\n onDownload,\n}) => {\n const t = useTranslator();\n return (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-p-8 rfp-gap-6\">\n <div className=\"rfp-w-32 rfp-h-32 rfp-rounded-full rfp-bg-surface-2 rfp-flex rfp-items-center rfp-justify-center\">\n <FileQuestion className=\"rfp-w-16 rfp-h-16 rfp-text-fg-secondary\" />\n </div>\n\n <div className=\"rfp-text-fg-primary rfp-text-center\">\n <p className=\"rfp-text-xl rfp-font-medium rfp-mb-2\">{fileName}</p>\n <p className=\"rfp-text-fg-secondary\">{t('common.unsupported_preview', { type: fileType })}</p>\n </div>\n\n <button\n onClick={onDownload}\n className=\"rfp-flex rfp-items-center rfp-gap-2 rfp-px-6 rfp-py-3 rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-backdrop-blur-sm rfp-rounded-lg rfp-text-fg-primary rfp-font-medium rfp-transition-all\"\n >\n <Download className=\"rfp-w-5 rfp-h-5\" />\n {t('common.download')}\n </button>\n </div>\n );\n};\n","import React from 'react';\nimport { useTranslator } from '../i18n/LocaleContext';\n\nexport const RendererLoading: React.FC = () => {\n const t = useTranslator();\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-text-fg-muted\">\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-gap-3\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-rounded-full rfp-border-2 rfp-border-fg-muted rfp-border-t-transparent rfp-animate-spin\" />\n <span className=\"rfp-text-sm\">{t('common.loading') ?? 'Loading...'}</span>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback, useMemo, useRef, Suspense } from 'react';\nimport { motion } from 'framer-motion';\nimport { X, Download, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { getFileType, createTranslator, type Locale, type Messages, type Translator, type Theme } from '@eternalheart/file-preview-core';\nimport { LocaleProvider } from './i18n/LocaleContext';\nimport { ThemeProvider } from './ThemeContext';\nimport type { ToolbarGroup } from './renderers/toolbar.types';\nimport { getImageToolbarGroups } from './renderers/Image/toolbar';\nimport { getPdfToolbarGroups } from './renderers/Pdf/toolbar';\nimport { getEpubToolbarGroups } from './renderers/Epub/toolbar';\nimport { getMobiToolbarGroups } from './renderers/Mobi/toolbar';\nimport { getZipToolbarGroups, type ZipToolbarStats } from './renderers/Zip/toolbar';\nimport { getTextToolbarGroups } from './renderers/Text/toolbar';\nimport { getMarkdownToolbarGroups } from './renderers/Markdown/toolbar';\n\nimport { PreviewFileInput, CustomRenderer, CustomRendererContext } from './types';\nimport type { CustomRendererEventPayload } from '@eternalheart/file-preview-core';\nimport { normalizeFiles } from './utils/fileNormalizer';\n// Renderer 通过 React.lazy 动态加载,运行时按需下载对应 chunk\nimport {\n ImageRenderer,\n PdfRenderer,\n DocxRenderer,\n XlsxRenderer,\n PptxRenderer,\n MsgRenderer,\n EpubRenderer,\n MobiRenderer,\n VideoRenderer,\n AudioRenderer,\n MarkdownRenderer,\n JsonRenderer,\n CsvRenderer,\n XmlRenderer,\n SubtitleRenderer,\n ZipRenderer,\n TextRenderer,\n} from './renderers/lazy';\nimport type { EpubRendererHandle } from './renderers/Epub';\nimport type { MobiRendererHandle } from './renderers/Mobi';\n// 不支持类型回退;体积极小,仍静态打包到主入口\nimport { UnsupportedRenderer } from './renderers/Unsupported';\nimport { RendererLoading } from './renderers/RendererLoading';\n\nconst MAX_ZIP_NESTING_DEPTH = 3;\n\nexport interface FilePreviewContentProps {\n files: PreviewFileInput[];\n currentIndex: number;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 运行模式:modal(弹窗) 或 embed(嵌入) */\n mode?: 'modal' | 'embed';\n /** 关闭回调,仅 modal 模式使用 */\n onClose?: () => void;\n /** ZIP 嵌套深度(内部使用),超过上限时不再递归渲染 ZIP */\n zipNestingDepth?: number;\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典,浅合并到内置字典之上 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头,仅渲染文件内容 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口,载荷为 `{ name, payload, file }` */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n}\n\nexport const FilePreviewContent: React.FC<FilePreviewContentProps> = ({\n files,\n currentIndex,\n onNavigate,\n customRenderers = [],\n mode = 'modal',\n onClose,\n zipNestingDepth = 0,\n locale = 'zh-CN',\n messages: userMessages,\n headless = false,\n theme = 'dark',\n onCustomEvent,\n}) => {\n const t: Translator = useMemo(\n () => createTranslator({ locale, messages: userMessages }),\n [locale, userMessages],\n );\n\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [, setTotalPages] = useState(1);\n const [contentNaturalWidth, setContentNaturalWidth] = useState(0);\n const [contentNaturalHeight, setContentNaturalHeight] = useState(0);\n const [imageResetKey, setImageResetKey] = useState(0);\n const contentRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const epubRef = useRef<EpubRendererHandle>(null);\n const [epubCurrent, setEpubCurrent] = useState(0);\n const [epubTotal, setEpubTotal] = useState(0);\n const [epubFullWidth, setEpubFullWidth] = useState(false);\n const mobiRef = useRef<MobiRendererHandle>(null);\n const [mobiCurrent, setMobiCurrent] = useState(0);\n const [mobiTotal, setMobiTotal] = useState(0);\n const [mobiFullWidth, setMobiFullWidth] = useState(false);\n const [zipStats, setZipStats] = useState<ZipToolbarStats | null>(null);\n const [textWordWrap, setTextWordWrap] = useState(true);\n const [textHtmlPreview, setTextHtmlPreview] = useState(false);\n const [markdownViewMode, setMarkdownViewMode] = useState<'preview' | 'source'>('preview');\n\n // 导航箭头自动隐藏\n const [navVisible, setNavVisible] = useState(true);\n const navHideTimerRef = useRef<number | null>(null);\n const NAV_HIDE_DELAY = 2000;\n\n const resetNavTimer = useCallback(() => {\n setNavVisible(true);\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n navHideTimerRef.current = window.setTimeout(() => {\n setNavVisible(false);\n }, NAV_HIDE_DELAY);\n }, []);\n\n const handleMouseMove = useCallback(() => {\n resetNavTimer();\n }, [resetNavTimer]);\n\n // 标准化文件输入\n const normalizedFiles = useMemo(() => normalizeFiles(files), [files]);\n\n const currentFile = normalizedFiles[currentIndex];\n\n // 检查是否有自定义渲染器匹配当前文件\n const customRenderer = useMemo(() => {\n if (!currentFile) return null;\n return customRenderers.find(renderer => renderer.test(currentFile));\n }, [currentFile, customRenderers]);\n\n const fileType = currentFile ? getFileType(currentFile) : 'unsupported';\n\n // 自定义渲染器事件派发器:未绑定 onCustomEvent 时静默忽略\n const emitCustom = useCallback(\n (name: string, payload?: unknown) => {\n if (!currentFile) return;\n onCustomEvent?.({ name, payload, file: currentFile });\n },\n [currentFile, onCustomEvent],\n );\n\n // 自定义渲染器上下文:注入给 render / getToolbarGroups\n const customCtx = useMemo<CustomRendererContext>(\n () => ({\n emit: emitCustom,\n t,\n theme: resolvedTheme,\n locale,\n }),\n [emitCustom, t, resolvedTheme, locale],\n );\n\n // 重置状态当文件改变时\n useEffect(() => {\n setZoom(1);\n setRotation(0);\n setCurrentPage(1);\n setTotalPages(1);\n setContentNaturalWidth(0);\n setContentNaturalHeight(0);\n setNavVisible(true);\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n }, [currentIndex]);\n\n // 图片加载后默认适应窗口\n useEffect(() => {\n if (fileType === 'image' && contentNaturalWidth > 0 && contentNaturalHeight > 0 && contentRef.current) {\n const containerWidth = contentRef.current.clientWidth;\n const containerHeight = contentRef.current.clientHeight;\n const scaleX = containerWidth / contentNaturalWidth;\n const scaleY = containerHeight / contentNaturalHeight;\n const newZoom = Math.min(scaleX, scaleY);\n setZoom(Math.max(0.01, Math.min(10, newZoom)));\n }\n }, [fileType, contentNaturalWidth, contentNaturalHeight]);\n\n // 导航箭头自动隐藏计时器启动 & 清理\n useEffect(() => {\n if (normalizedFiles.length > 1) {\n resetNavTimer();\n }\n return () => {\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n };\n }, [normalizedFiles.length, resetNavTimer]);\n\n // 键盘导航\n // - modal 模式:全局监听(window)\n // - embed 模式:只在根容器 focus 时监听,避免影响外部页面交互\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && mode === 'modal') {\n onClose?.();\n } else if (e.key === 'ArrowLeft' && currentIndex > 0) {\n onNavigate?.(currentIndex - 1);\n } else if (e.key === 'ArrowRight' && currentIndex < normalizedFiles.length - 1) {\n onNavigate?.(currentIndex + 1);\n }\n };\n\n if (mode === 'modal') {\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n } else {\n const el = rootRef.current;\n if (!el) return;\n el.addEventListener('keydown', handleKeyDown as EventListener);\n return () => el.removeEventListener('keydown', handleKeyDown as EventListener);\n }\n }, [mode, currentIndex, normalizedFiles.length, onClose, onNavigate]);\n\n const handleZoomIn = useCallback(() => {\n setZoom((prev) => Math.min(prev + 0.1, 10));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom((prev) => Math.max(prev - 0.1, 0.01));\n }, []);\n\n const handleRotate = useCallback(() => {\n setRotation((prev) => prev + 90);\n }, []);\n\n const handleRotateLeft = useCallback(() => {\n setRotation((prev) => prev - 90);\n }, []);\n\n const handleFitToWidth = useCallback(() => {\n if (contentRef.current && contentNaturalWidth > 0 && contentNaturalHeight > 0) {\n const containerWidth = contentRef.current.clientWidth;\n const containerHeight = contentRef.current.clientHeight;\n const scaleX = containerWidth / contentNaturalWidth;\n const scaleY = containerHeight / contentNaturalHeight;\n const newZoom = Math.min(scaleX, scaleY);\n setZoom(Math.max(0.01, Math.min(10, newZoom)));\n } else {\n setZoom(1);\n }\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, [contentNaturalWidth, contentNaturalHeight]);\n\n const handleOriginalSize = useCallback(() => {\n setZoom(1);\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, []);\n\n const handleZoomChange = useCallback((newZoom: number) => {\n setZoom(newZoom);\n }, []);\n\n const handleReset = useCallback(() => {\n setZoom(1);\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, []);\n\n const handleDownload = useCallback(() => {\n if (!currentFile) return;\n const link = document.createElement('a');\n link.href = currentFile.url;\n link.download = currentFile.name;\n link.click();\n }, [currentFile]);\n\n const handleEpubChapterChange = useCallback((current: number, total: number) => {\n setEpubCurrent(current);\n setEpubTotal(total);\n }, []);\n\n const handleMobiChapterChange = useCallback((current: number, total: number) => {\n setMobiCurrent(current);\n setMobiTotal(total);\n }, []);\n\n const handleZipStatsChange = useCallback((stats: ZipToolbarStats | null) => {\n setZipStats(stats);\n }, []);\n\n if (!currentFile) return null;\n\n const showCloseButton = mode === 'modal' && !!onClose;\n\n // 工具栏配置 — 各 Renderer 自行声明。命中自定义渲染器时优先使用其 getToolbarGroups\n const toolGroups: ToolbarGroup[] = (() => {\n if (customRenderer) {\n return customRenderer.getToolbarGroups?.(currentFile, customCtx) ?? [];\n }\n if (fileType === 'image') {\n return getImageToolbarGroups({\n zoom,\n onZoomIn: handleZoomIn,\n onZoomOut: handleZoomOut,\n onFitToWidth: handleFitToWidth,\n onOriginalSize: handleOriginalSize,\n onRotateLeft: handleRotateLeft,\n onRotateRight: handleRotate,\n onReset: handleReset,\n t,\n });\n }\n if (fileType === 'pdf') {\n return getPdfToolbarGroups({\n zoom,\n onZoomIn: handleZoomIn,\n onZoomOut: handleZoomOut,\n onReset: handleReset,\n t,\n });\n }\n if (fileType === 'epub') {\n return getEpubToolbarGroups({\n epubRef,\n current: epubCurrent,\n total: epubTotal,\n fullWidth: epubFullWidth,\n t,\n });\n }\n if (fileType === 'mobi') {\n return getMobiToolbarGroups({\n mobiRef,\n current: mobiCurrent,\n total: mobiTotal,\n fullWidth: mobiFullWidth,\n t,\n });\n }\n if (fileType === 'zip') {\n return getZipToolbarGroups({ stats: zipStats, t });\n }\n if (fileType === 'text') {\n const ext = currentFile.name.split('.').pop()?.toLowerCase() || '';\n return getTextToolbarGroups({\n wordWrap: textWordWrap,\n onToggleWrap: () => setTextWordWrap(prev => !prev),\n isHtml: ext === 'html' || ext === 'htm',\n htmlPreview: textHtmlPreview,\n onToggleHtmlPreview: () => setTextHtmlPreview(prev => !prev),\n t,\n });\n }\n if (fileType === 'markdown') {\n return getMarkdownToolbarGroups({\n viewMode: markdownViewMode,\n onToggleViewMode: () => setMarkdownViewMode(prev => prev === 'preview' ? 'source' : 'preview'),\n t,\n });\n }\n return [];\n })();\n\n // 操作组:下载、关闭(通用,不属于任何 Renderer)\n const actionGroups: ToolbarGroup[] = [\n {\n items: [\n { type: 'button', icon: <Download className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('common.download'), action: handleDownload },\n ],\n },\n ...(showCloseButton ? [{\n items: [\n { type: 'button' as const, icon: <X className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('common.close'), action: onClose! },\n ],\n }] : []),\n ];\n\n const renderToolbarItems = (groups: ToolbarGroup[], dividerClass: string) =>\n groups.map((group, gi, arr) => (\n <React.Fragment key={gi}>\n {group.items.map((item, ii) =>\n item.type === 'button' ? (\n <ToolbarButton\n key={`${gi}-${ii}`}\n icon={item.icon}\n label={item.tooltip}\n onClick={item.action}\n disabled={item.disabled}\n />\n ) : (\n <span\n key={`${gi}-${ii}`}\n className=\"rfp-text-xs rfp-text-center rfp-font-medium rfp-tabular-nums rfp-text-fg-tertiary\"\n style={{ minWidth: item.minWidth || 'auto' }}\n >\n {item.content}\n </span>\n )\n )}\n {gi < arr.length - 1 && <div className={`rfp-w-px rfp-h-4 rfp-bg-divide ${dividerClass}`} />}\n </React.Fragment>\n ));\n\n return (\n <LocaleProvider locale={locale} messages={userMessages}>\n <ThemeProvider theme={resolvedTheme}>\n <div\n ref={rootRef}\n tabIndex={mode === 'embed' ? 0 : -1}\n data-theme={resolvedTheme}\n className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-flex-col rfp-overflow-hidden rfp-outline-none\"\n >\n {/* 顶部工具栏 - 全屏融合式 */}\n {!headless && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"rfp-flex-shrink-0 rfp-z-10 rfp-backdrop-blur-md rfp-border-b rfp-bg-surface-toolbar rfp-border-line\"\n style={{ paddingTop: 'env(safe-area-inset-top, 0px)' }}\n >\n {/* 第一行:文件名 + 分页 + 关闭/下载(移动端右侧)/ 全部按钮(桌面端) */}\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-3 md:rfp-px-5 rfp-py-1.5 md:rfp-py-2.5\">\n {/* 左侧:文件名 + 分页 */}\n <div className=\"rfp-flex rfp-items-center rfp-flex-1 rfp-min-w-0 rfp-mr-2 md:rfp-mr-3\">\n <h2 className=\"rfp-font-medium rfp-text-xs md:rfp-text-sm rfp-truncate rfp-text-fg-primary\">\n {currentFile.name}\n </h2>\n <span className=\"rfp-text-xs rfp-ml-2 rfp-flex-shrink-0 rfp-text-fg-muted\">\n {currentIndex + 1}/{normalizedFiles.length}\n </span>\n </div>\n\n {/* 移动端:仅显示下载+关闭 */}\n <div className=\"rfp-flex rfp-items-center rfp-gap-1 md:rfp-hidden rfp-flex-shrink-0\">\n {renderToolbarItems(actionGroups, 'rfp-mx-0.5')}\n </div>\n\n {/* 桌面端:所有工具按钮 */}\n <div className=\"rfp-hidden md:rfp-flex rfp-items-center rfp-gap-1 rfp-flex-shrink-0\">\n {renderToolbarItems(toolGroups, 'rfp-mx-1')}\n {toolGroups.length > 0 && <div className=\"rfp-w-px rfp-h-4 rfp-mx-1 rfp-bg-divide\" />}\n {renderToolbarItems(actionGroups, 'rfp-mx-1')}\n </div>\n </div>\n\n {/* 第二行:移动端工具按钮(image/pdf/epub) */}\n {toolGroups.length > 0 && (\n <div className=\"rfp-flex rfp-items-center rfp-gap-1 rfp-px-3 rfp-pb-1.5 rfp-overflow-x-auto scrollbar-hide md:rfp-hidden\">\n {renderToolbarItems(toolGroups, 'rfp-mx-0.5')}\n </div>\n )}\n </motion.div>\n )}\n\n {/* 内容区域 */}\n <div\n ref={contentRef}\n className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-overflow-auto\"\n onMouseMove={handleMouseMove}\n >\n {customRenderer ? (\n customRenderer.render(currentFile, customCtx)\n ) : (\n <Suspense fallback={<RendererLoading />}>\n {fileType === 'image' && (\n <ImageRenderer\n url={currentFile.url}\n zoom={zoom}\n rotation={rotation}\n resetKey={imageResetKey}\n fileSize={currentFile.size}\n onZoomChange={handleZoomChange}\n onNaturalWidthChange={setContentNaturalWidth}\n onNaturalHeightChange={setContentNaturalHeight}\n />\n )}\n {fileType === 'pdf' && (\n <PdfRenderer\n url={currentFile.url}\n zoom={zoom}\n currentPage={currentPage}\n onPageChange={setCurrentPage}\n onTotalPagesChange={setTotalPages}\n onPageWidthChange={setContentNaturalWidth}\n />\n )}\n {fileType === 'docx' && <DocxRenderer url={currentFile.url} />}\n {fileType === 'xlsx' && <XlsxRenderer url={currentFile.url} />}\n {fileType === 'pptx' && <PptxRenderer url={currentFile.url} />}\n {fileType === 'msg' && <MsgRenderer url={currentFile.url} />}\n {fileType === 'epub' && (\n <EpubRenderer\n ref={epubRef}\n url={currentFile.url}\n onChapterChange={handleEpubChapterChange}\n onFullWidthChange={setEpubFullWidth}\n />\n )}\n {fileType === 'mobi' && (\n <MobiRenderer\n ref={mobiRef}\n url={currentFile.url}\n onChapterChange={handleMobiChapterChange}\n onFullWidthChange={setMobiFullWidth}\n />\n )}\n {fileType === 'video' && <VideoRenderer url={currentFile.url} />}\n {fileType === 'audio' && (\n <AudioRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'markdown' && <MarkdownRenderer url={currentFile.url} viewMode={markdownViewMode} />}\n {fileType === 'json' && (\n <JsonRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'csv' && (\n <CsvRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'xml' && (\n <XmlRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'subtitle' && (\n <SubtitleRenderer url={currentFile.url} fileName={currentFile.name} />\n )}\n {fileType === 'zip' && (\n zipNestingDepth >= MAX_ZIP_NESTING_DEPTH ? (\n <UnsupportedRenderer\n fileName={currentFile.name}\n fileType={currentFile.type}\n onDownload={handleDownload}\n />\n ) : (\n <ZipRenderer url={currentFile.url} onStatsChange={handleZipStatsChange} nestingDepth={zipNestingDepth} />\n )\n )}\n {fileType === 'text' && (\n <TextRenderer\n url={currentFile.url}\n fileName={currentFile.name}\n wordWrap={textWordWrap}\n htmlPreview={textHtmlPreview}\n />\n )}\n {fileType === 'unsupported' && (\n <UnsupportedRenderer\n fileName={currentFile.name}\n fileType={currentFile.type}\n onDownload={handleDownload}\n />\n )}\n </Suspense>\n )}\n </div>\n\n {/* 左右导航箭头 - 自动隐藏 */}\n {!headless && normalizedFiles.length > 1 && (\n <>\n {currentIndex > 0 && (\n <motion.button\n initial={{ opacity: 0 }}\n animate={{ opacity: navVisible ? 1 : 0, x: navVisible ? 0 : -20 }}\n transition={{ duration: 0.2 }}\n onClick={() => onNavigate?.(currentIndex - 1)}\n onMouseEnter={() => setNavVisible(true)}\n style={{ pointerEvents: navVisible ? 'auto' : 'none' }}\n className=\"rfp-absolute rfp-z-20 rfp-left-2 md:rfp-left-4 rfp-top-1/2 -rfp-translate-y-1/2 rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-rounded-full rfp-backdrop-blur-xl rfp-border rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-shadow-2xl rfp-bg-surface-nav rfp-border-line hover:rfp-bg-surface-nav-hover rfp-text-fg-primary\"\n >\n <ChevronLeft className=\"rfp-w-5 rfp-h-5 md:rfp-w-6 md:rfp-h-6\" />\n </motion.button>\n )}\n\n {currentIndex < normalizedFiles.length - 1 && (\n <motion.button\n initial={{ opacity: 0 }}\n animate={{ opacity: navVisible ? 1 : 0, x: navVisible ? 0 : 20 }}\n transition={{ duration: 0.2 }}\n onClick={() => onNavigate?.(currentIndex + 1)}\n onMouseEnter={() => setNavVisible(true)}\n style={{ pointerEvents: navVisible ? 'auto' : 'none' }}\n className=\"rfp-absolute rfp-z-20 rfp-right-2 md:rfp-right-4 rfp-top-1/2 -rfp-translate-y-1/2 rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-rounded-full rfp-backdrop-blur-xl rfp-border rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-shadow-2xl rfp-bg-surface-nav rfp-border-line hover:rfp-bg-surface-nav-hover rfp-text-fg-primary\"\n >\n <ChevronRight className=\"rfp-w-5 rfp-h-5 md:rfp-w-6 md:rfp-h-6\" />\n </motion.button>\n )}\n </>\n )}\n </div>\n </ThemeProvider>\n </LocaleProvider>\n );\n};\n\n// 工具栏按钮组件\ninterface ToolbarButtonProps {\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({ icon, label, onClick, disabled }) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`rfp-relative rfp-group rfp-p-2 md:rfp-p-1.5 rfp-rounded-md rfp-transition-all rfp-select-none ${\n disabled\n ? 'rfp-text-fg-disabled rfp-cursor-not-allowed'\n : 'rfp-text-fg-primary hover:rfp-bg-surface-2 active:rfp-bg-surface-3'\n }`}\n >\n {icon}\n <span className=\"rfp-absolute rfp-left-1/2 -rfp-translate-x-1/2 rfp-top-full rfp-mt-1.5 rfp-px-2 rfp-py-1 rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-pointer-events-none rfp-opacity-0 rfp-invisible group-hover:rfp-opacity-100 group-hover:rfp-visible rfp-transition-opacity rfp-duration-200 rfp-z-50 rfp-bg-fg-primary rfp-text-fg-inverse\">\n <span className=\"rfp-absolute rfp-left-1/2 -rfp-translate-x-1/2 -rfp-top-1 rfp-w-2 rfp-h-2 rfp-rotate-45 rfp-bg-fg-primary\" />\n <span className=\"rfp-relative\">{label}</span>\n </span>\n </button>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { PreviewFileInput, CustomRenderer } from './types';\nimport { FilePreviewContent } from './FilePreviewContent';\nimport type { Locale, Messages, Theme, CustomRendererEventPayload } from '@eternalheart/file-preview-core';\n\ninterface FilePreviewModalProps {\n files: PreviewFileInput[];\n currentIndex: number;\n isOpen: boolean;\n onClose: () => void;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口 */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n}\n\nexport const FilePreviewModal: React.FC<FilePreviewModalProps> = ({\n files,\n currentIndex,\n isOpen,\n onClose,\n onNavigate,\n customRenderers = [],\n locale,\n messages,\n headless,\n theme = 'dark',\n onCustomEvent,\n}) => {\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n // 锁定 body 滚动\n useEffect(() => {\n if (isOpen) {\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n document.body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const modalContent = (\n <div className=\"rfp-root\" data-theme={resolvedTheme}>\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"rfp-fixed rfp-inset-0 rfp-z-[9999] rfp-flex rfp-items-center rfp-justify-center rfp-backdrop-blur-md rfp-overflow-hidden rfp-bg-surface-overlay\"\n onClick={onClose}\n onWheel={(e) => e.stopPropagation()}\n >\n <div\n className=\"rfp-relative rfp-w-full rfp-h-full\"\n onClick={(e) => e.stopPropagation()}\n >\n <FilePreviewContent\n mode=\"modal\"\n files={files}\n currentIndex={currentIndex}\n onClose={onClose}\n onNavigate={onNavigate}\n customRenderers={customRenderers}\n locale={locale}\n messages={messages}\n headless={headless}\n theme={theme}\n onCustomEvent={onCustomEvent}\n />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n return createPortal(modalContent, document.body);\n};\n","import { useEffect, useState } from 'react';\nimport { PreviewFileInput, CustomRenderer } from './types';\nimport { FilePreviewContent } from './FilePreviewContent';\nimport type { Locale, Messages, Theme, CustomRendererEventPayload } from '@eternalheart/file-preview-core';\n\ninterface FilePreviewEmbedProps {\n files: PreviewFileInput[];\n currentIndex?: number;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 宽度,默认 100% 填充父容器 */\n width?: number | string;\n /** 高度,默认 100% 填充父容器 */\n height?: number | string;\n className?: string;\n style?: React.CSSProperties;\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口 */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n}\n\nexport const FilePreviewEmbed: React.FC<FilePreviewEmbedProps> = ({\n files,\n currentIndex = 0,\n onNavigate,\n customRenderers = [],\n width = '100%',\n height = '100%',\n className,\n style,\n locale,\n messages,\n headless,\n theme = 'dark',\n onCustomEvent,\n}) => {\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n return (\n <div\n className={`rfp-root ${className ?? ''}`}\n style={{ width, height, ...style }}\n data-theme={resolvedTheme}\n >\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-overflow-hidden rfp-bg-surface-overlay\">\n <FilePreviewContent\n mode=\"embed\"\n files={files}\n currentIndex={currentIndex}\n onNavigate={onNavigate}\n customRenderers={customRenderers}\n locale={locale}\n messages={messages}\n headless={headless}\n theme={theme}\n onCustomEvent={onCustomEvent}\n />\n </div>\n </div>\n );\n};\n","import { pdfjs } from 'react-pdf';\n\n/**\n * PDF.js Worker 配置选项\n */\nexport interface PdfConfigOptions {\n /**\n * PDF.js worker 文件路径\n * 默认使用 CDN: `https://unpkg.com/pdfjs-dist@${version}/build/pdf.worker.min.mjs`\n */\n workerSrc?: string;\n \n /**\n * CMap 文件目录路径\n * 默认使用 CDN: `https://unpkg.com/pdfjs-dist@${version}/cmaps/`\n */\n cMapUrl?: string;\n \n /**\n * 是否使用压缩的 CMap 文件\n * 默认: true\n */\n cMapPacked?: boolean;\n}\n\n/**\n * 配置 PDF.js\n *\n * @example\n * ```ts\n * // 使用本地静态文件(推荐用于生产环境)\n * configurePdfjs({\n * workerSrc: '/pdfjs/pdf.worker.min.mjs',\n * cMapUrl: '/pdfjs/cmaps/',\n * cMapPacked: true\n * });\n * ```\n *\n * @example\n * ```ts\n * // 使用 CDN(默认配置)\n * configurePdfjs(); // 自动使用 unpkg CDN\n * ```\n */\nexport function configurePdfjs(options?: PdfConfigOptions) {\n if (typeof window === 'undefined') return;\n\n const {\n workerSrc = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`,\n cMapUrl = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`,\n cMapPacked = true\n } = options || {};\n\n pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n // @ts-ignore - cMapUrl 和 cMapPacked 在 react-pdf 的类型定义中不存在,但在运行时可用\n pdfjs.GlobalWorkerOptions.cMapUrl = cMapUrl;\n // @ts-ignore\n pdfjs.GlobalWorkerOptions.cMapPacked = cMapPacked;\n}\n\n// 默认使用 CDN 配置\nconfigurePdfjs();\n\nexport { pdfjs };\n\n","// 导入样式\nimport './index.css';\n\n// 导入版本号\nimport packageJson from '../package.json';\n\n// 导出版本号\nexport const VERSION = packageJson.version;\n\n// 导出主组件\nexport { FilePreviewModal } from './FilePreviewModal';\nexport { FilePreviewEmbed } from './FilePreviewEmbed';\nexport { FilePreviewContent } from './FilePreviewContent';\n\n// 导出类型定义\nexport type {\n PreviewFile,\n PreviewFileLink,\n PreviewFileInput,\n FileType,\n ToolbarAction,\n PreviewState,\n CustomRenderer,\n CustomRendererContext,\n CustomRendererEventPayload,\n} from './types';\n\n// 导出工具函数\nexport { normalizeFile, normalizeFiles } from './utils/fileNormalizer';\n\n// 导出 PDF.js 配置函数和类型\nexport { configurePdfjs, pdfjs } from './utils/pdfConfig';\nexport type { PdfConfigOptions } from './utils/pdfConfig';\n\n// 导出 i18n 国际化\nexport { LocaleProvider, useTranslator, useLocale } from './i18n/LocaleContext';\nexport type { LocaleProviderProps, LocaleContextValue } from './i18n/LocaleContext';\nexport type {\n Locale,\n Messages,\n MessageKey,\n Translator,\n TranslateParams,\n CreateTranslatorOptions,\n Theme,\n} from '@eternalheart/file-preview-core';\n\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { motion } from 'framer-motion';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface ImageRendererProps {\n url: string;\n zoom: number;\n rotation: number;\n resetKey?: number;\n fileSize?: number;\n onZoomChange?: (zoom: number) => void;\n onNaturalWidthChange?: (width: number) => void;\n onNaturalHeightChange?: (height: number) => void;\n}\n\nexport const ImageRenderer: React.FC<ImageRendererProps> = ({\n url,\n zoom,\n rotation,\n resetKey,\n fileSize,\n onZoomChange,\n onNaturalWidthChange,\n onNaturalHeightChange\n}) => {\n const t = useTranslator();\n const [loaded, setLoaded] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [internalZoom, setInternalZoom] = useState(1);\n const [naturalSize, setNaturalSize] = useState({ width: 0, height: 0 });\n const imgRef = useRef<HTMLImageElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLoaded(false);\n setError(null);\n setPosition({ x: 0, y: 0 });\n setInternalZoom(1);\n }, [url]);\n\n // 当外部 zoom 改变时,同步内部 zoom\n useEffect(() => {\n setInternalZoom(zoom);\n }, [zoom]);\n\n // 适应窗口/原始尺寸等操作时重置位置居中\n useEffect(() => {\n if (resetKey !== undefined) {\n setPosition({ x: 0, y: 0 });\n }\n }, [resetKey]);\n\n const handleLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(true);\n const img = e.currentTarget;\n setNaturalSize({ width: img.naturalWidth, height: img.naturalHeight });\n onNaturalWidthChange?.(img.naturalWidth);\n onNaturalHeightChange?.(img.naturalHeight);\n };\n\n // 边界限制:确保图片至少有一部分可见\n const clampPosition = useCallback((pos: { x: number; y: number }, currentZoom: number) => {\n const container = containerRef.current;\n if (!container || naturalSize.width === 0) return pos;\n\n const containerW = container.clientWidth;\n const containerH = container.clientHeight;\n const imgW = naturalSize.width * currentZoom;\n const imgH = naturalSize.height * currentZoom;\n\n // 至少保留 margin px 的图片在视口内\n const margin = Math.min(80, containerW * 0.15, containerH * 0.15);\n const rangeX = (containerW + imgW) / 2 - margin;\n const rangeY = (containerH + imgH) / 2 - margin;\n\n return {\n x: rangeX > 0 ? Math.max(-rangeX, Math.min(rangeX, pos.x)) : 0,\n y: rangeY > 0 ? Math.max(-rangeY, Math.min(rangeY, pos.y)) : 0,\n };\n }, [naturalSize]);\n\n const handleError = () => {\n setError(t('image.load_failed'));\n setLoaded(true);\n };\n\n // 双击复原:居中 + 缩放100%\n const handleDoubleClick = () => {\n setPosition({ x: 0, y: 0 });\n setInternalZoom(1);\n onZoomChange?.(1);\n };\n\n // 鼠标滚轮缩放 —— 以鼠标位置为缩放原点\n // 使用原生事件 + passive: false,确保 preventDefault 生效,\n // 避免滚轮事件冒泡触发外层(如嵌入模式下的页面滚动)\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheelNative = (e: WheelEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const rect = container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left - rect.width / 2;\n const mouseY = e.clientY - rect.top - rect.height / 2;\n\n const delta = e.deltaY > 0 ? -0.05 : 0.05;\n\n setInternalZoom(prev => {\n const newZoom = Math.max(0.01, Math.min(10, prev + delta));\n const scale = newZoom / prev;\n\n setPosition(pos => clampPosition({\n x: mouseX - scale * (mouseX - pos.x),\n y: mouseY - scale * (mouseY - pos.y),\n }, newZoom));\n\n onZoomChange?.(newZoom);\n return newZoom;\n });\n };\n\n container.addEventListener('wheel', handleWheelNative, { passive: false });\n return () => container.removeEventListener('wheel', handleWheelNative);\n }, [onZoomChange, clampPosition]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (e.button !== 0) return;\n setIsDragging(true);\n setDragStart({\n x: e.clientX - position.x,\n y: e.clientY - position.y,\n });\n }, [position]);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n setPosition(clampPosition({\n x: e.clientX - dragStart.x,\n y: e.clientY - dragStart.y,\n }, internalZoom));\n }, [isDragging, dragStart, internalZoom, clampPosition]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n return (\n <div\n ref={containerRef}\n className=\"rfp-relative rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-overflow-hidden\"\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n {!loaded && !error && (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {error && (\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n <motion.img\n ref={imgRef}\n src={url}\n alt=\"Preview\"\n className={`rfp-max-w-none rfp-select-none ${!loaded ? 'rfp-hidden' : ''}`}\n style={{\n transform: `translate(${position.x}px, ${position.y}px) scale(${internalZoom}) rotate(${rotation}deg)`,\n transformOrigin: 'center',\n transition: isDragging ? 'none' : 'transform 0.3s ease-out',\n }}\n onLoad={handleLoad}\n onError={handleError}\n onDoubleClick={handleDoubleClick}\n initial={{ opacity: 0 }}\n animate={{ opacity: loaded ? 1 : 0 }}\n transition={{ duration: 0.3 }}\n draggable={false}\n />\n\n {/* 右下角分辨率 */}\n {loaded && !error && naturalSize.width > 0 && (\n <div className=\"rfp-absolute rfp-bottom-2 rfp-right-3 rfp-text-[10px] rfp-text-fg-disabled hover:rfp-text-fg-secondary rfp-transition-colors rfp-pointer-events-auto rfp-select-none rfp-cursor-default\">\n {naturalSize.width} × {naturalSize.height}{fileSize != null && ` · ${fileSize < 1024 ? `${fileSize} B` : fileSize < 1024 * 1024 ? `${(fileSize / 1024).toFixed(1)} KB` : `${(fileSize / (1024 * 1024)).toFixed(1)} MB`}`}\n </div>\n )}\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Document, Page } from 'react-pdf';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\n// 导入 PDF.js 配置\nimport '../../utils/pdfConfig';\n\ninterface PdfRendererProps {\n url: string;\n zoom: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n onTotalPagesChange: (total: number) => void;\n onPageWidthChange?: (width: number) => void;\n}\n\nexport const PdfRenderer: React.FC<PdfRendererProps> = ({\n url,\n zoom,\n currentPage,\n onPageChange,\n onTotalPagesChange,\n onPageWidthChange,\n}) => {\n const t = useTranslator();\n const [numPages, setNumPages] = useState<number>(0);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const pageRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n useEffect(() => {\n setError(null);\n }, [url]);\n\n const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => {\n setNumPages(numPages);\n onTotalPagesChange(numPages);\n onPageChange(1);\n };\n\n const onDocumentLoadError = (error: Error) => {\n console.error('PDF 加载错误:', error);\n setError(t('pdf.load_failed'));\n };\n\n // 滚动时更新当前页码\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const scrollTop = container.scrollTop;\n const containerHeight = container.clientHeight;\n const scrollCenter = scrollTop + containerHeight / 2;\n\n // 找到当前可见的页面\n let currentVisiblePage = 1;\n let minDistance = Infinity;\n\n pageRefs.current.forEach((pageElement, pageNumber) => {\n const rect = pageElement.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const pageCenter = rect.top - containerRect.top + rect.height / 2 + scrollTop;\n const distance = Math.abs(pageCenter - scrollCenter);\n\n if (distance < minDistance) {\n minDistance = distance;\n currentVisiblePage = pageNumber;\n }\n });\n\n if (currentVisiblePage !== currentPage) {\n onPageChange(currentVisiblePage);\n }\n }, [currentPage, onPageChange]);\n\n // 监听滚动事件\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [handleScroll]);\n\n // 设置页面引用\n const setPageRef = useCallback((pageNumber: number, element: HTMLDivElement | null) => {\n if (element) {\n pageRefs.current.set(pageNumber, element);\n } else {\n pageRefs.current.delete(pageNumber);\n }\n }, []);\n\n return (\n <div\n ref={containerRef}\n className=\"rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-4 md:rfp-py-8 rfp-px-2 md:rfp-px-4\"\n >\n {error && (\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n {!error && (\n <Document\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-min-h-screen\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n >\n <div className=\"rfp-flex rfp-flex-col rfp-gap-4\">\n {Array.from(new Array(numPages), (_, index) => {\n const pageNumber = index + 1;\n return (\n <div\n key={`page_${pageNumber}`}\n ref={(el) => setPageRef(pageNumber, el)}\n className=\"rfp-relative\"\n >\n <Page\n pageNumber={pageNumber}\n scale={zoom}\n loading={\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-p-8 rfp-bg-surface-1 rfp-rounded-lg rfp-min-h-[600px]\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n renderTextLayer={false}\n renderAnnotationLayer={false}\n className=\"rfp-shadow-2xl\"\n onRenderSuccess={(page) => {\n if (pageNumber === 1 && onPageWidthChange) {\n // 上报 scale=1 时的原始页面宽度\n onPageWidthChange(page.originalWidth || page.width / zoom);\n }\n }}\n />\n {/* 页码标签 */}\n <div className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-bg-surface-nav-hover rfp-backdrop-blur-sm rfp-text-fg-primary rfp-text-xs rfp-px-3 rfp-py-1 rfp-rounded-full\">\n {pageNumber}\n </div>\n </div>\n );\n })}\n </div>\n </Document>\n )}\n\n {/* 底部页码指示器 */}\n {numPages > 0 && (\n <div className=\"rfp-sticky rfp-bottom-2 md:rfp-bottom-4 rfp-mt-4 md:rfp-mt-8 rfp-bg-surface-nav-hover rfp-backdrop-blur-xl rfp-text-fg-primary rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-rounded-full rfp-text-xs md:rfp-text-sm rfp-font-medium rfp-shadow-2xl rfp-border rfp-border-line-weak\">\n 第 {currentPage} 页 / 共 {numPages} 页\n </div>\n )}\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport mammoth from 'mammoth';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface DocxRendererProps {\n url: string;\n}\n\n// A4 page dimensions (96dpi)\nconst PAGE_HEIGHT = 1123;\nconst PAGE_PADDING_Y = 60;\nconst PAGE_PADDING_X = 50;\nconst PAGE_CONTENT_HEIGHT = PAGE_HEIGHT - PAGE_PADDING_Y * 2;\nconst PAGE_GAP = 24;\n\nconst contentStyle: React.CSSProperties = {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n lineHeight: '1.8',\n color: '#333',\n};\n\nexport const DocxRenderer: React.FC<DocxRendererProps> = ({ url }) => {\n const t = useTranslator();\n const [html, setHtml] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [pages, setPages] = useState<string[]>([]);\n const measureRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const loadDocx = async () => {\n setLoading(true);\n setError(null);\n setHtml('');\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('文件加载失败');\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const result = await mammoth.convertToHtml({ arrayBuffer });\n setHtml(result.value);\n } catch (err) {\n console.error('Docx 解析错误:', err);\n setError(t('docx.parse_failed'));\n } finally {\n setLoading(false);\n }\n };\n\n loadDocx();\n }, [url]);\n\n const paginate = useCallback(() => {\n const container = measureRef.current;\n if (!container || !html) return;\n\n const children = Array.from(container.children) as HTMLElement[];\n if (children.length === 0) {\n setPages([html]);\n return;\n }\n\n const result: string[][] = [[]];\n let currentPageUsed = 0;\n\n for (const child of children) {\n const h = child.offsetHeight;\n\n // If adding this block would exceed page content area and page isn't empty,\n // start a new page\n if (currentPageUsed > 0 && currentPageUsed + h > PAGE_CONTENT_HEIGHT) {\n result.push([]);\n currentPageUsed = 0;\n }\n\n result[result.length - 1].push(child.outerHTML);\n currentPageUsed += h;\n }\n\n // At least one page\n if (result.length === 0) result.push([]);\n\n setPages(result.map(blocks => blocks.join('')));\n }, [html]);\n\n useEffect(() => {\n if (!html || !measureRef.current) return;\n requestAnimationFrame(() => {\n paginate();\n });\n }, [html, paginate]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"rfp-w-full rfp-h-full rfp-overflow-auto\"\n style={{ background: 'rgba(0, 0, 0, 0.15)' }}\n >\n {/* Hidden measurement div — same width as page content area */}\n <div\n ref={measureRef}\n dangerouslySetInnerHTML={{ __html: html }}\n style={{\n ...contentStyle,\n position: 'absolute',\n visibility: 'hidden',\n width: `${794 - PAGE_PADDING_X * 2}px`,\n pointerEvents: 'none',\n }}\n />\n\n {/* Visible pages */}\n <div\n className=\"rfp-py-6 md:rfp-py-10 rfp-flex rfp-flex-col rfp-items-center\"\n style={{ gap: `${PAGE_GAP}px` }}\n >\n {(pages.length > 0 ? pages : ['']).map((pageHtml, i) => (\n <div\n key={i}\n style={{\n width: '100%',\n maxWidth: '794px',\n minHeight: `${PAGE_HEIGHT}px`,\n background: 'white',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.15)',\n flexShrink: 0,\n padding: `${PAGE_PADDING_Y}px ${PAGE_PADDING_X}px`,\n }}\n >\n <div\n dangerouslySetInnerHTML={{ __html: pageHtml }}\n style={contentStyle}\n />\n </div>\n ))}\n </div>\n </div>\n );\n};\n","/* global document */\n/* global window */\nclass Element {\n constructor(tag, className = '') {\n if (typeof tag === 'string') {\n this.el = document.createElement(tag);\n this.el.className = className;\n } else {\n this.el = tag;\n }\n this.data = {};\n }\n\n data(key, value) {\n if (value !== undefined) {\n this.data[key] = value;\n return this;\n }\n return this.data[key];\n }\n\n on(eventNames, handler) {\n const [fen, ...oen] = eventNames.split('.');\n let eventName = fen;\n if (eventName === 'mousewheel' && /Firefox/i.test(window.navigator.userAgent)) {\n eventName = 'DOMMouseScroll';\n }\n this.el.addEventListener(eventName, (evt) => {\n handler(evt);\n for (let i = 0; i < oen.length; i += 1) {\n const k = oen[i];\n if (k === 'left' && evt.button !== 0) {\n return;\n }\n if (k === 'right' && evt.button !== 2) {\n return;\n }\n if (k === 'stop') {\n evt.stopPropagation();\n }\n }\n });\n return this;\n }\n\n offset(value) {\n if (value !== undefined) {\n Object.keys(value).forEach((k) => {\n this.css(k, `${value[k]}px`);\n });\n return this;\n }\n const {\n offsetTop, offsetLeft, offsetHeight, offsetWidth,\n } = this.el;\n return {\n top: offsetTop,\n left: offsetLeft,\n height: offsetHeight,\n width: offsetWidth,\n };\n }\n\n scroll(v) {\n const { el } = this;\n if (v !== undefined) {\n if (v.left !== undefined) {\n el.scrollLeft = v.left;\n }\n if (v.top !== undefined) {\n el.scrollTop = v.top;\n }\n }\n return { left: el.scrollLeft, top: el.scrollTop };\n }\n\n box() {\n return this.el.getBoundingClientRect();\n }\n\n parent() {\n return new Element(this.el.parentNode);\n }\n\n children(...eles) {\n if (arguments.length === 0) {\n return this.el.childNodes;\n }\n eles.forEach(ele => this.child(ele));\n return this;\n }\n\n removeChild(el) {\n this.el.removeChild(el);\n }\n\n /*\n first() {\n return this.el.firstChild;\n }\n\n last() {\n return this.el.lastChild;\n }\n\n remove(ele) {\n return this.el.removeChild(ele);\n }\n\n prepend(ele) {\n const { el } = this;\n if (el.children.length > 0) {\n el.insertBefore(ele, el.firstChild);\n } else {\n el.appendChild(ele);\n }\n return this;\n }\n\n prev() {\n return this.el.previousSibling;\n }\n\n next() {\n return this.el.nextSibling;\n }\n */\n\n child(arg) {\n let ele = arg;\n if (typeof arg === 'string') {\n ele = document.createTextNode(arg);\n } else if (arg instanceof Element) {\n ele = arg.el;\n }\n this.el.appendChild(ele);\n return this;\n }\n\n contains(ele) {\n return this.el.contains(ele);\n }\n\n className(v) {\n if (v !== undefined) {\n this.el.className = v;\n return this;\n }\n return this.el.className;\n }\n\n addClass(name) {\n this.el.classList.add(name);\n return this;\n }\n\n hasClass(name) {\n return this.el.classList.contains(name);\n }\n\n removeClass(name) {\n this.el.classList.remove(name);\n return this;\n }\n\n toggle(cls = 'active') {\n return this.toggleClass(cls);\n }\n\n toggleClass(name) {\n return this.el.classList.toggle(name);\n }\n\n active(flag = true, cls = 'active') {\n if (flag) this.addClass(cls);\n else this.removeClass(cls);\n return this;\n }\n\n checked(flag = true) {\n this.active(flag, 'checked');\n return this;\n }\n\n disabled(flag = true) {\n if (flag) this.addClass('disabled');\n else this.removeClass('disabled');\n return this;\n }\n\n // key, value\n // key\n // {k, v}...\n attr(key, value) {\n if (value !== undefined) {\n this.el.setAttribute(key, value);\n } else {\n if (typeof key === 'string') {\n return this.el.getAttribute(key);\n }\n Object.keys(key).forEach((k) => {\n this.el.setAttribute(k, key[k]);\n });\n }\n return this;\n }\n\n removeAttr(key) {\n this.el.removeAttribute(key);\n return this;\n }\n\n html(content) {\n if (content !== undefined) {\n this.el.innerHTML = content;\n return this;\n }\n return this.el.innerHTML;\n }\n\n val(v) {\n if (v !== undefined) {\n this.el.value = v;\n return this;\n }\n return this.el.value;\n }\n\n focus() {\n this.el.focus();\n }\n\n cssRemoveKeys(...keys) {\n keys.forEach(k => this.el.style.removeProperty(k));\n return this;\n }\n\n // css( propertyName )\n // css( propertyName, value )\n // css( properties )\n css(name, value) {\n if (value === undefined && typeof name !== 'string') {\n Object.keys(name).forEach((k) => {\n this.el.style[k] = name[k];\n });\n return this;\n }\n if (value !== undefined) {\n this.el.style[name] = value;\n return this;\n }\n return this.el.style[name];\n }\n\n computedStyle() {\n return window.getComputedStyle(this.el, null);\n }\n\n show() {\n this.css('display', 'block');\n return this;\n }\n\n hide() {\n this.css('display', 'none');\n return this;\n }\n}\n\nconst h = (tag, className = '') => new Element(tag, className);\n\nexport {\n Element,\n h,\n};\n","import './_.prototypes';\n\nconst alphabets = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];\n\n/** index number 2 letters\n * @example stringAt(26) ==> 'AA'\n * @date 2019-10-10\n * @export\n * @param {number} index\n * @returns {string}\n */\nexport function stringAt(index) {\n let str = '';\n let cindex = index;\n while (cindex >= alphabets.length) {\n cindex /= alphabets.length;\n cindex -= 1;\n str += alphabets[parseInt(cindex, 10) % alphabets.length];\n }\n const last = index % alphabets.length;\n str += alphabets[last];\n return str;\n}\n\n/** translate letter in A1-tag to number\n * @date 2019-10-10\n * @export\n * @param {string} str \"AA\" in A1-tag \"AA1\"\n * @returns {number}\n */\nexport function indexAt(str) {\n let ret = 0;\n for (let i = 0; i < str.length - 1; i += 1) {\n const cindex = str.charCodeAt(i) - 65;\n const exponet = str.length - 1 - i;\n ret += (alphabets.length ** exponet) + (alphabets.length * cindex);\n }\n ret += str.charCodeAt(str.length - 1) - 65;\n return ret;\n}\n\n// B10 => x,y\n/** translate A1-tag to XY-tag\n * @date 2019-10-10\n * @export\n * @param {tagA1} src\n * @returns {tagXY}\n */\nexport function expr2xy(src) {\n let x = '';\n let y = '';\n for (let i = 0; i < src.length; i += 1) {\n if (src.charAt(i) >= '0' && src.charAt(i) <= '9') {\n y += src.charAt(i);\n } else {\n x += src.charAt(i);\n }\n }\n return [indexAt(x), parseInt(y, 10) - 1];\n}\n\n/** translate XY-tag to A1-tag\n * @example x,y => B10\n * @date 2019-10-10\n * @export\n * @param {number} x\n * @param {number} y\n * @returns {tagA1}\n */\nexport function xy2expr(x, y) {\n return `${stringAt(x)}${y + 1}`;\n}\n\n/** translate A1-tag src by (xn, yn)\n * @date 2019-10-10\n * @export\n * @param {tagA1} src\n * @param {number} xn\n * @param {number} yn\n * @returns {tagA1}\n */\nexport function expr2expr(src, xn, yn, condition = () => true) {\n if (xn === 0 && yn === 0) return src;\n const [x, y] = expr2xy(src);\n if (!condition(x, y)) return src;\n return xy2expr(x + xn, y + yn);\n}\n\nexport default {\n stringAt,\n indexAt,\n expr2xy,\n xy2expr,\n expr2expr,\n};\n","import { xy2expr, expr2xy } from './alphabet';\n\nclass CellRange {\n constructor(sri, sci, eri, eci, w = 0, h = 0) {\n this.sri = sri;\n this.sci = sci;\n this.eri = eri;\n this.eci = eci;\n this.w = w;\n this.h = h;\n }\n\n set(sri, sci, eri, eci) {\n this.sri = sri;\n this.sci = sci;\n this.eri = eri;\n this.eci = eci;\n }\n\n multiple() {\n return this.eri - this.sri > 0 || this.eci - this.sci > 0;\n }\n\n // cell-index: ri, ci\n // cell-ref: A10\n includes(...args) {\n let [ri, ci] = [0, 0];\n if (args.length === 1) {\n [ci, ri] = expr2xy(args[0]);\n } else if (args.length === 2) {\n [ri, ci] = args;\n }\n const {\n sri, sci, eri, eci,\n } = this;\n return sri <= ri && ri <= eri && sci <= ci && ci <= eci;\n }\n\n each(cb, rowFilter = () => true) {\n const {\n sri, sci, eri, eci,\n } = this;\n for (let i = sri; i <= eri; i += 1) {\n if (rowFilter(i)) {\n for (let j = sci; j <= eci; j += 1) {\n cb(i, j);\n }\n }\n }\n }\n\n contains(other) {\n return this.sri <= other.sri\n && this.sci <= other.sci\n && this.eri >= other.eri\n && this.eci >= other.eci;\n }\n\n // within\n within(other) {\n return this.sri >= other.sri\n && this.sci >= other.sci\n && this.eri <= other.eri\n && this.eci <= other.eci;\n }\n\n // disjoint\n disjoint(other) {\n return this.sri > other.eri\n || this.sci > other.eci\n || other.sri > this.eri\n || other.sci > this.eci;\n }\n\n // intersects\n intersects(other) {\n return this.sri <= other.eri\n && this.sci <= other.eci\n && other.sri <= this.eri\n && other.sci <= this.eci;\n }\n\n // union\n union(other) {\n const {\n sri, sci, eri, eci,\n } = this;\n return new CellRange(\n other.sri < sri ? other.sri : sri,\n other.sci < sci ? other.sci : sci,\n other.eri > eri ? other.eri : eri,\n other.eci > eci ? other.eci : eci,\n );\n }\n\n // intersection\n // intersection(other) {}\n\n // Returns Array<CellRange> that represents that part of this that does not intersect with other\n // difference\n difference(other) {\n const ret = [];\n const addRet = (sri, sci, eri, eci) => {\n ret.push(new CellRange(sri, sci, eri, eci));\n };\n const {\n sri, sci, eri, eci,\n } = this;\n const dsr = other.sri - sri;\n const dsc = other.sci - sci;\n const der = eri - other.eri;\n const dec = eci - other.eci;\n if (dsr > 0) {\n addRet(sri, sci, other.sri - 1, eci);\n if (der > 0) {\n addRet(other.eri + 1, sci, eri, eci);\n if (dsc > 0) {\n addRet(other.sri, sci, other.eri, other.sci - 1);\n }\n if (dec > 0) {\n addRet(other.sri, other.eci + 1, other.eri, eci);\n }\n } else {\n if (dsc > 0) {\n addRet(other.sri, sci, eri, other.sci - 1);\n }\n if (dec > 0) {\n addRet(other.sri, other.eci + 1, eri, eci);\n }\n }\n } else if (der > 0) {\n addRet(other.eri + 1, sci, eri, eci);\n if (dsc > 0) {\n addRet(sri, sci, other.eri, other.sci - 1);\n }\n if (dec > 0) {\n addRet(sri, other.eci + 1, other.eri, eci);\n }\n }\n if (dsc > 0) {\n addRet(sri, sci, eri, other.sci - 1);\n if (dec > 0) {\n addRet(sri, other.eri + 1, eri, eci);\n if (dsr > 0) {\n addRet(sri, other.sci, other.sri - 1, other.eci);\n }\n if (der > 0) {\n addRet(other.sri + 1, other.sci, eri, other.eci);\n }\n } else {\n if (dsr > 0) {\n addRet(sri, other.sci, other.sri - 1, eci);\n }\n if (der > 0) {\n addRet(other.sri + 1, other.sci, eri, eci);\n }\n }\n } else if (dec > 0) {\n addRet(eri, other.eci + 1, eri, eci);\n if (dsr > 0) {\n addRet(sri, sci, other.sri - 1, other.eci);\n }\n if (der > 0) {\n addRet(other.eri + 1, sci, eri, other.eci);\n }\n }\n return ret;\n }\n\n size() {\n return [\n this.eri - this.sri + 1,\n this.eci - this.sci + 1,\n ];\n }\n\n toString() {\n const {\n sri, sci, eri, eci,\n } = this;\n let ref = xy2expr(sci, sri);\n if (this.multiple()) {\n ref = `${ref}:${xy2expr(eci, eri)}`;\n }\n return ref;\n }\n\n clone() {\n const {\n sri, sci, eri, eci, w, h,\n } = this;\n return new CellRange(sri, sci, eri, eci, w, h);\n }\n\n /*\n toJSON() {\n return this.toString();\n }\n */\n\n equals(other) {\n return this.eri === other.eri\n && this.eci === other.eci\n && this.sri === other.sri\n && this.sci === other.sci;\n }\n\n static valueOf(ref) {\n // B1:B8, B1 => 1 x 1 cell range\n const refs = ref.split(':');\n const [sci, sri] = expr2xy(refs[0]);\n let [eri, eci] = [sri, sci];\n if (refs.length > 1) {\n [eci, eri] = expr2xy(refs[1]);\n }\n return new CellRange(sri, sci, eri, eci);\n }\n}\n\nexport default CellRange;\n\nexport {\n CellRange,\n};\n","import { CellRange } from './cell_range';\n\nexport default class Selector {\n constructor() {\n this.range = new CellRange(0, 0, 0, 0);\n this.ri = 0;\n this.ci = 0;\n }\n\n multiple() {\n return this.range.multiple();\n }\n\n setIndexes(ri, ci) {\n this.ri = ri;\n this.ci = ci;\n }\n\n size() {\n return this.range.size();\n }\n}\n","export default class Scroll {\n constructor() {\n this.x = 0; // left\n this.y = 0; // top\n this.ri = 0; // cell row-index\n this.ci = 0; // cell col-index\n }\n}\n","// import helper from '../helper';\n\nexport default class History {\n constructor() {\n this.undoItems = [];\n this.redoItems = [];\n }\n\n add(data) {\n this.undoItems.push(JSON.stringify(data));\n this.redoItems = [];\n }\n\n canUndo() {\n return this.undoItems.length > 0;\n }\n\n canRedo() {\n return this.redoItems.length > 0;\n }\n\n undo(currentd, cb) {\n const { undoItems, redoItems } = this;\n if (this.canUndo()) {\n redoItems.push(JSON.stringify(currentd));\n cb(JSON.parse(undoItems.pop()));\n }\n }\n\n redo(currentd, cb) {\n const { undoItems, redoItems } = this;\n if (this.canRedo()) {\n undoItems.push(JSON.stringify(currentd));\n cb(JSON.parse(redoItems.pop()));\n }\n }\n}\n","export default class Clipboard {\n constructor() {\n this.range = null; // CellRange\n this.state = 'clear';\n }\n\n copy(cellRange) {\n this.range = cellRange;\n this.state = 'copy';\n return this;\n }\n\n cut(cellRange) {\n this.range = cellRange;\n this.state = 'cut';\n return this;\n }\n\n isCopy() {\n return this.state === 'copy';\n }\n\n isCut() {\n return this.state === 'cut';\n }\n\n isClear() {\n return this.state === 'clear';\n }\n\n clear() {\n this.range = null;\n this.state = 'clear';\n }\n}\n","import { CellRange } from './cell_range';\n// operator: all|eq|neq|gt|gte|lt|lte|in|be\n// value:\n// in => []\n// be => [min, max]\nclass Filter {\n constructor(ci, operator, value) {\n this.ci = ci;\n this.operator = operator;\n this.value = value;\n }\n\n set(operator, value) {\n this.operator = operator;\n this.value = value;\n }\n\n includes(v) {\n const { operator, value } = this;\n if (operator === 'all') {\n return true;\n }\n if (operator === 'in') {\n return value.includes(v);\n }\n return false;\n }\n\n vlength() {\n const { operator, value } = this;\n if (operator === 'in') {\n return value.length;\n }\n return 0;\n }\n\n getData() {\n const { ci, operator, value } = this;\n return { ci, operator, value };\n }\n}\n\nclass Sort {\n constructor(ci, order) {\n this.ci = ci;\n this.order = order;\n }\n\n asc() {\n return this.order === 'asc';\n }\n\n desc() {\n return this.order === 'desc';\n }\n}\n\nexport default class AutoFilter {\n constructor() {\n this.ref = null;\n this.filters = [];\n this.sort = null;\n }\n\n setData({ ref, filters, sort }) {\n if (ref != null) {\n this.ref = ref;\n this.filters = filters.map(it => new Filter(it.ci, it.operator, it.value));\n if (sort) {\n this.sort = new Sort(sort.ci, sort.order);\n }\n }\n }\n\n getData() {\n if (this.active()) {\n const { ref, filters, sort } = this;\n return { ref, filters: filters.map(it => it.getData()), sort };\n }\n return {};\n }\n\n addFilter(ci, operator, value) {\n const filter = this.getFilter(ci);\n if (filter == null) {\n this.filters.push(new Filter(ci, operator, value));\n } else {\n filter.set(operator, value);\n }\n }\n\n setSort(ci, order) {\n this.sort = order ? new Sort(ci, order) : null;\n }\n\n includes(ri, ci) {\n if (this.active()) {\n return this.hrange().includes(ri, ci);\n }\n return false;\n }\n\n getSort(ci) {\n const { sort } = this;\n if (sort && sort.ci === ci) {\n return sort;\n }\n return null;\n }\n\n getFilter(ci) {\n const { filters } = this;\n for (let i = 0; i < filters.length; i += 1) {\n if (filters[i].ci === ci) {\n return filters[i];\n }\n }\n return null;\n }\n\n filteredRows(getCell) {\n // const ary = [];\n // let lastri = 0;\n const rset = new Set();\n const fset = new Set();\n if (this.active()) {\n const { sri, eri } = this.range();\n const { filters } = this;\n for (let ri = sri + 1; ri <= eri; ri += 1) {\n for (let i = 0; i < filters.length; i += 1) {\n const filter = filters[i];\n const cell = getCell(ri, filter.ci);\n const ctext = cell ? cell.text : '';\n if (!filter.includes(ctext)) {\n rset.add(ri);\n break;\n } else {\n fset.add(ri);\n }\n }\n }\n }\n return { rset, fset };\n }\n\n items(ci, getCell) {\n const m = {};\n if (this.active()) {\n const { sri, eri } = this.range();\n for (let ri = sri + 1; ri <= eri; ri += 1) {\n const cell = getCell(ri, ci);\n if (cell !== null && !/^\\s*$/.test(cell.text)) {\n const key = cell.text;\n const cnt = (m[key] || 0) + 1;\n m[key] = cnt;\n } else {\n m[''] = (m[''] || 0) + 1;\n }\n }\n }\n return m;\n }\n\n range() {\n return CellRange.valueOf(this.ref);\n }\n\n hrange() {\n const r = this.range();\n r.eri = r.sri;\n return r;\n }\n\n clear() {\n this.ref = null;\n this.filters = [];\n this.sort = null;\n }\n\n active() {\n return this.ref !== null;\n }\n}\n","import { CellRange } from './cell_range';\n\nclass Merges {\n constructor(d = []) {\n this._ = d;\n }\n\n forEach(cb) {\n this._.forEach(cb);\n }\n\n deleteWithin(cr) {\n this._ = this._.filter(it => !it.within(cr));\n }\n\n getFirstIncludes(ri, ci) {\n for (let i = 0; i < this._.length; i += 1) {\n const it = this._[i];\n if (it.includes(ri, ci)) {\n return it;\n }\n }\n return null;\n }\n\n filterIntersects(cellRange) {\n return new Merges(this._.filter(it => it.intersects(cellRange)));\n }\n\n intersects(cellRange) {\n for (let i = 0; i < this._.length; i += 1) {\n const it = this._[i];\n if (it.intersects(cellRange)) {\n // console.log('intersects');\n return true;\n }\n }\n return false;\n }\n\n union(cellRange) {\n let cr = cellRange;\n this._.forEach((it) => {\n if (it.intersects(cr)) {\n cr = it.union(cr);\n }\n });\n return cr;\n }\n\n add(cr) {\n this.deleteWithin(cr);\n this._.push(cr);\n }\n\n // type: row | column\n shift(type, index, n, cbWithin) {\n this._.forEach((cellRange) => {\n const {\n sri, sci, eri, eci,\n } = cellRange;\n const range = cellRange;\n if (type === 'row') {\n if (sri >= index) {\n range.sri += n;\n range.eri += n;\n } else if (sri < index && index <= eri) {\n range.eri += n;\n cbWithin(sri, sci, n, 0);\n }\n } else if (type === 'column') {\n if (sci >= index) {\n range.sci += n;\n range.eci += n;\n } else if (sci < index && index <= eci) {\n range.eci += n;\n cbWithin(sri, sci, 0, n);\n }\n }\n });\n }\n\n move(cellRange, rn, cn) {\n this._.forEach((it1) => {\n const it = it1;\n if (it.within(cellRange)) {\n it.eri += rn;\n it.sri += rn;\n it.sci += cn;\n it.eci += cn;\n }\n });\n }\n\n setData(merges) {\n this._ = merges.map(merge => CellRange.valueOf(merge));\n return this;\n }\n\n getData() {\n return this._.map(merge => merge.toString());\n }\n}\n\nexport default {};\nexport {\n Merges,\n};\n","/* eslint-disable no-param-reassign */\nfunction cloneDeep(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nconst mergeDeep = (object = {}, ...sources) => {\n sources.forEach((source) => {\n Object.keys(source).forEach((key) => {\n const v = source[key];\n // console.log('k:', key, ', v:', source[key], typeof v, v instanceof Object);\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n object[key] = v;\n } else if (typeof v !== 'function' && !Array.isArray(v) && v instanceof Object) {\n object[key] = object[key] || {};\n mergeDeep(object[key], v);\n } else {\n object[key] = v;\n }\n });\n });\n // console.log('::', object);\n return object;\n};\n\nfunction equals(obj1, obj2) {\n const keys = Object.keys(obj1);\n if (keys.length !== Object.keys(obj2).length) return false;\n for (let i = 0; i < keys.length; i += 1) {\n const k = keys[i];\n const v1 = obj1[k];\n const v2 = obj2[k];\n if (v2 === undefined) return false;\n if (typeof v1 === 'string' || typeof v1 === 'number' || typeof v1 === 'boolean') {\n if (v1 !== v2) return false;\n } else if (Array.isArray(v1)) {\n if (v1.length !== v2.length) return false;\n for (let ai = 0; ai < v1.length; ai += 1) {\n if (!equals(v1[ai], v2[ai])) return false;\n }\n } else if (typeof v1 !== 'function' && !Array.isArray(v1) && v1 instanceof Object) {\n if (!equals(v1, v2)) return false;\n }\n }\n return true;\n}\n\n/*\n objOrAry: obejct or Array\n cb: (value, index | key) => { return value }\n*/\nconst sum = (objOrAry, cb = value => value) => {\n let total = 0;\n let size = 0;\n Object.keys(objOrAry).forEach((key) => {\n total += cb(objOrAry[key], key);\n size += 1;\n });\n return [total, size];\n};\n\nfunction deleteProperty(obj, property) {\n const oldv = obj[`${property}`];\n delete obj[`${property}`];\n return oldv;\n}\n\nfunction rangeReduceIf(min, max, inits, initv, ifv, getv) {\n let s = inits;\n let v = initv;\n let i = min;\n for (; i < max; i += 1) {\n if (s > ifv) break;\n v = getv(i);\n s += v;\n }\n return [i, s - v, v];\n}\n\nfunction rangeSum(min, max, getv) {\n let s = 0;\n for (let i = min; i < max; i += 1) {\n s += getv(i);\n }\n return s;\n}\n\nfunction rangeEach(min, max, cb) {\n for (let i = min; i < max; i += 1) {\n cb(i);\n }\n}\n\nfunction arrayEquals(a1, a2) {\n if (a1.length === a2.length) {\n for (let i = 0; i < a1.length; i += 1) {\n if (a1[i] !== a2[i]) return false;\n }\n } else return false;\n return true;\n}\n\nfunction digits(a) {\n const v = `${a}`;\n let ret = 0;\n let flag = false;\n for (let i = 0; i < v.length; i += 1) {\n if (flag === true) ret += 1;\n if (v.charAt(i) === '.') flag = true;\n }\n return ret;\n}\n\nexport function numberCalc(type, a1, a2) {\n if (Number.isNaN(a1) || Number.isNaN(a2)) {\n return a1 + type + a2;\n }\n const al1 = digits(a1);\n const al2 = digits(a2);\n const num1 = Number(a1);\n const num2 = Number(a2);\n let ret = 0;\n if (type === '-') {\n ret = num1 - num2;\n } else if (type === '+') {\n ret = num1 + num2;\n } else if (type === '*') {\n ret = num1 * num2;\n } else if (type === '/') {\n ret = num1 / num2;\n if (digits(ret) > 5) return ret.toFixed(2);\n return ret;\n }\n return ret.toFixed(Math.max(al1, al2));\n}\n\nexport default {\n cloneDeep,\n merge: (...sources) => mergeDeep({}, ...sources),\n equals,\n arrayEquals,\n sum,\n rangeEach,\n rangeSum,\n rangeReduceIf,\n deleteProperty,\n numberCalc,\n};\n","import helper from './helper';\nimport { expr2expr } from './alphabet';\n\nclass Rows {\n constructor({ len, height }) {\n this._ = {};\n this.len = len;\n // default row height\n this.height = height;\n }\n\n getHeight(ri) {\n if (this.isHide(ri)) return 0;\n const row = this.get(ri);\n if (row && row.height) {\n return row.height;\n }\n return this.height;\n }\n\n setHeight(ri, v) {\n const row = this.getOrNew(ri);\n row.height = v;\n }\n\n unhide(idx) {\n let index = idx;\n while (index > 0) {\n index -= 1;\n if (this.isHide(index)) {\n this.setHide(index, false);\n } else break;\n }\n }\n\n isHide(ri) {\n const row = this.get(ri);\n return row && row.hide;\n }\n\n setHide(ri, v) {\n const row = this.getOrNew(ri);\n if (v === true) row.hide = true;\n else delete row.hide;\n }\n\n setStyle(ri, style) {\n const row = this.getOrNew(ri);\n row.style = style;\n }\n\n sumHeight(min, max, exceptSet) {\n return helper.rangeSum(min, max, (i) => {\n if (exceptSet && exceptSet.has(i)) return 0;\n return this.getHeight(i);\n });\n }\n\n totalHeight() {\n return this.sumHeight(0, this.len);\n }\n\n get(ri) {\n return this._[ri];\n }\n\n getOrNew(ri) {\n this._[ri] = this._[ri] || { cells: {} };\n return this._[ri];\n }\n\n getCell(ri, ci) {\n const row = this.get(ri);\n if (row !== undefined && row.cells !== undefined && row.cells[ci] !== undefined) {\n return row.cells[ci];\n }\n return null;\n }\n\n getCellMerge(ri, ci) {\n const cell = this.getCell(ri, ci);\n if (cell && cell.merge) return cell.merge;\n return [0, 0];\n }\n\n getCellOrNew(ri, ci) {\n const row = this.getOrNew(ri);\n row.cells[ci] = row.cells[ci] || {};\n return row.cells[ci];\n }\n\n // what: all | text | format\n setCell(ri, ci, cell, what = 'all') {\n const row = this.getOrNew(ri);\n if (what === 'all') {\n row.cells[ci] = cell;\n } else if (what === 'text') {\n row.cells[ci] = row.cells[ci] || {};\n row.cells[ci].text = cell.text;\n } else if (what === 'format') {\n row.cells[ci] = row.cells[ci] || {};\n row.cells[ci].style = cell.style;\n if (cell.merge) row.cells[ci].merge = cell.merge;\n }\n }\n\n setCellText(ri, ci, text) {\n const cell = this.getCellOrNew(ri, ci);\n if (cell.editable !== false) cell.text = text;\n }\n\n // what: all | format | text\n copyPaste(srcCellRange, dstCellRange, what, autofill = false, cb = () => {}) {\n const {\n sri, sci, eri, eci,\n } = srcCellRange;\n const dsri = dstCellRange.sri;\n const dsci = dstCellRange.sci;\n const deri = dstCellRange.eri;\n const deci = dstCellRange.eci;\n const [rn, cn] = srcCellRange.size();\n const [drn, dcn] = dstCellRange.size();\n // console.log(srcIndexes, dstIndexes);\n let isAdd = true;\n let dn = 0;\n if (deri < sri || deci < sci) {\n isAdd = false;\n if (deri < sri) dn = drn;\n else dn = dcn;\n }\n for (let i = sri; i <= eri; i += 1) {\n if (this._[i]) {\n for (let j = sci; j <= eci; j += 1) {\n if (this._[i].cells && this._[i].cells[j]) {\n for (let ii = dsri; ii <= deri; ii += rn) {\n for (let jj = dsci; jj <= deci; jj += cn) {\n const nri = ii + (i - sri);\n const nci = jj + (j - sci);\n const ncell = helper.cloneDeep(this._[i].cells[j]);\n // ncell.text\n if (autofill && ncell && ncell.text && ncell.text.length > 0) {\n const { text } = ncell;\n let n = (jj - dsci) + (ii - dsri) + 2;\n if (!isAdd) {\n n -= dn + 1;\n }\n if (text[0] === '=') {\n ncell.text = text.replace(/[a-zA-Z]{1,3}\\d+/g, (word) => {\n let [xn, yn] = [0, 0];\n if (sri === dsri) {\n xn = n - 1;\n // if (isAdd) xn -= 1;\n } else {\n yn = n - 1;\n }\n if (/^\\d+$/.test(word)) return word;\n return expr2expr(word, xn, yn);\n });\n } else if ((rn <= 1 && cn > 1 && (dsri > eri || deri < sri))\n || (cn <= 1 && rn > 1 && (dsci > eci || deci < sci))\n || (rn <= 1 && cn <= 1)) {\n const result = /[\\\\.\\d]+$/.exec(text);\n // console.log('result:', result);\n if (result !== null) {\n const index = Number(result[0]) + n - 1;\n ncell.text = text.substring(0, result.index) + index;\n }\n }\n }\n this.setCell(nri, nci, ncell, what);\n cb(nri, nci, ncell);\n }\n }\n }\n }\n }\n }\n }\n\n cutPaste(srcCellRange, dstCellRange) {\n const ncellmm = {};\n this.each((ri) => {\n this.eachCells(ri, (ci) => {\n let nri = parseInt(ri, 10);\n let nci = parseInt(ci, 10);\n if (srcCellRange.includes(ri, ci)) {\n nri = dstCellRange.sri + (nri - srcCellRange.sri);\n nci = dstCellRange.sci + (nci - srcCellRange.sci);\n }\n ncellmm[nri] = ncellmm[nri] || { cells: {} };\n ncellmm[nri].cells[nci] = this._[ri].cells[ci];\n });\n });\n this._ = ncellmm;\n }\n\n // src: Array<Array<String>>\n paste(src, dstCellRange) {\n if (src.length <= 0) return;\n const { sri, sci } = dstCellRange;\n src.forEach((row, i) => {\n const ri = sri + i;\n row.forEach((cell, j) => {\n const ci = sci + j;\n this.setCellText(ri, ci, cell);\n });\n });\n }\n\n insert(sri, n = 1) {\n const ndata = {};\n this.each((ri, row) => {\n let nri = parseInt(ri, 10);\n if (nri >= sri) {\n nri += n;\n this.eachCells(ri, (ci, cell) => {\n if (cell.text && cell.text[0] === '=') {\n cell.text = cell.text.replace(/[a-zA-Z]{1,3}\\d+/g, word => expr2expr(word, 0, n, (x, y) => y >= sri));\n }\n });\n }\n ndata[nri] = row;\n });\n this._ = ndata;\n this.len += n;\n }\n\n delete(sri, eri) {\n const n = eri - sri + 1;\n const ndata = {};\n this.each((ri, row) => {\n const nri = parseInt(ri, 10);\n if (nri < sri) {\n ndata[nri] = row;\n } else if (ri > eri) {\n ndata[nri - n] = row;\n this.eachCells(ri, (ci, cell) => {\n if (cell.text && cell.text[0] === '=') {\n cell.text = cell.text.replace(/[a-zA-Z]{1,3}\\d+/g, word => expr2expr(word, 0, -n, (x, y) => y > eri));\n }\n });\n }\n });\n this._ = ndata;\n this.len -= n;\n }\n\n insertColumn(sci, n = 1) {\n this.each((ri, row) => {\n const rndata = {};\n this.eachCells(ri, (ci, cell) => {\n let nci = parseInt(ci, 10);\n if (nci >= sci) {\n nci += n;\n if (cell.text && cell.text[0] === '=') {\n cell.text = cell.text.replace(/[a-zA-Z]{1,3}\\d+/g, word => expr2expr(word, n, 0, x => x >= sci));\n }\n }\n rndata[nci] = cell;\n });\n row.cells = rndata;\n });\n }\n\n deleteColumn(sci, eci) {\n const n = eci - sci + 1;\n this.each((ri, row) => {\n const rndata = {};\n this.eachCells(ri, (ci, cell) => {\n const nci = parseInt(ci, 10);\n if (nci < sci) {\n rndata[nci] = cell;\n } else if (nci > eci) {\n rndata[nci - n] = cell;\n if (cell.text && cell.text[0] === '=') {\n cell.text = cell.text.replace(/[a-zA-Z]{1,3}\\d+/g, word => expr2expr(word, -n, 0, x => x > eci));\n }\n }\n });\n row.cells = rndata;\n });\n }\n\n // what: all | text | format | merge\n deleteCells(cellRange, what = 'all') {\n cellRange.each((i, j) => {\n this.deleteCell(i, j, what);\n });\n }\n\n // what: all | text | format | merge\n deleteCell(ri, ci, what = 'all') {\n const row = this.get(ri);\n if (row !== null) {\n const cell = this.getCell(ri, ci);\n if (cell !== null && cell.editable !== false) {\n if (what === 'all') {\n delete row.cells[ci];\n } else if (what === 'text') {\n if (cell.text) delete cell.text;\n if (cell.value) delete cell.value;\n } else if (what === 'format') {\n if (cell.style !== undefined) delete cell.style;\n if (cell.merge) delete cell.merge;\n } else if (what === 'merge') {\n if (cell.merge) delete cell.merge;\n }\n }\n }\n }\n\n maxCell() {\n const keys = Object.keys(this._);\n const ri = keys[keys.length - 1];\n const col = this._[ri];\n if (col) {\n const { cells } = col;\n const ks = Object.keys(cells);\n const ci = ks[ks.length - 1];\n return [parseInt(ri, 10), parseInt(ci, 10)];\n }\n return [0, 0];\n }\n\n each(cb) {\n Object.entries(this._).forEach(([ri, row]) => {\n cb(ri, row);\n });\n }\n\n eachCells(ri, cb) {\n if (this._[ri] && this._[ri].cells) {\n Object.entries(this._[ri].cells).forEach(([ci, cell]) => {\n cb(ci, cell);\n });\n }\n }\n\n setData(d) {\n if (d.len) {\n this.len = d.len;\n delete d.len;\n }\n this._ = d;\n }\n\n getData() {\n const { len } = this;\n return Object.assign({ len }, this._);\n }\n}\n\nexport default {};\nexport {\n Rows,\n};\n","import helper from './helper';\n\nclass Cols {\n constructor({\n len, width, indexWidth, minWidth,\n }) {\n this._ = {};\n this.len = len;\n this.width = width;\n this.indexWidth = indexWidth;\n this.minWidth = minWidth;\n }\n\n setData(d) {\n if (d.len) {\n this.len = d.len;\n delete d.len;\n }\n this._ = d;\n }\n\n getData() {\n const { len } = this;\n return Object.assign({ len }, this._);\n }\n\n getWidth(i) {\n if (this.isHide(i)) return 0;\n const col = this._[i];\n if (col && col.width) {\n return col.width;\n }\n return this.width;\n }\n\n getOrNew(ci) {\n this._[ci] = this._[ci] || {};\n return this._[ci];\n }\n\n setWidth(ci, width) {\n const col = this.getOrNew(ci);\n col.width = width;\n }\n\n unhide(idx) {\n let index = idx;\n while (index > 0) {\n index -= 1;\n if (this.isHide(index)) {\n this.setHide(index, false);\n } else break;\n }\n }\n\n isHide(ci) {\n const col = this._[ci];\n return col && col.hide;\n }\n\n setHide(ci, v) {\n const col = this.getOrNew(ci);\n if (v === true) col.hide = true;\n else delete col.hide;\n }\n\n setStyle(ci, style) {\n const col = this.getOrNew(ci);\n col.style = style;\n }\n\n sumWidth(min, max) {\n return helper.rangeSum(min, max, i => this.getWidth(i));\n }\n\n totalWidth() {\n return this.sumWidth(0, this.len);\n }\n}\n\nexport default {};\nexport {\n Cols,\n};\n","export default {\n toolbar: {\n undo: 'Undo',\n redo: 'Redo',\n print: 'Print',\n paintformat: 'Paint format',\n clearformat: 'Clear format',\n format: 'Format',\n fontName: 'Font',\n fontSize: 'Font size',\n fontBold: 'Font bold',\n fontItalic: 'Font italic',\n underline: 'Underline',\n strike: 'Strike',\n color: 'Text color',\n bgcolor: 'Fill color',\n border: 'Borders',\n merge: 'Merge cells',\n align: 'Horizontal align',\n valign: 'Vertical align',\n textwrap: 'Text wrapping',\n freeze: 'Freeze cell',\n autofilter: 'Filter',\n formula: 'Functions',\n more: 'More',\n },\n contextmenu: {\n copy: 'Copy',\n cut: 'Cut',\n paste: 'Paste',\n pasteValue: 'Paste values only',\n pasteFormat: 'Paste format only',\n hide: 'Hide',\n insertRow: 'Insert row',\n insertColumn: 'Insert column',\n deleteSheet: 'Delete',\n deleteRow: 'Delete row',\n deleteColumn: 'Delete column',\n deleteCell: 'Delete cell',\n deleteCellText: 'Delete cell text',\n validation: 'Data validations',\n cellprintable: 'Enable export',\n cellnonprintable: 'Disable export',\n celleditable: 'Enable editing',\n cellnoneditable: 'Disable editing',\n },\n print: {\n size: 'Paper size',\n orientation: 'Page orientation',\n orientations: ['Landscape', 'Portrait'],\n },\n format: {\n normal: 'Normal',\n text: 'Plain Text',\n number: 'Number',\n percent: 'Percent',\n rmb: 'RMB',\n usd: 'USD',\n eur: 'EUR',\n date: 'Date',\n time: 'Time',\n datetime: 'Date time',\n duration: 'Duration',\n },\n formula: {\n sum: 'Sum',\n average: 'Average',\n max: 'Max',\n min: 'Min',\n _if: 'IF',\n and: 'AND',\n or: 'OR',\n concat: 'Concat',\n },\n validation: {\n required: 'it must be required',\n notMatch: 'it not match its validation rule',\n between: 'it is between {} and {}',\n notBetween: 'it is not between {} and {}',\n notIn: 'it is not in list',\n equal: 'it equal to {}',\n notEqual: 'it not equal to {}',\n lessThan: 'it less than {}',\n lessThanEqual: 'it less than or equal to {}',\n greaterThan: 'it greater than {}',\n greaterThanEqual: 'it greater than or equal to {}',\n },\n error: {\n pasteForMergedCell: 'Unable to do this for merged cells',\n },\n calendar: {\n weeks: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n },\n button: {\n next: 'Next',\n cancel: 'Cancel',\n remove: 'Remove',\n save: 'Save',\n ok: 'OK',\n },\n sort: {\n desc: 'Sort Z -> A',\n asc: 'Sort A -> Z',\n },\n filter: {\n empty: 'empty',\n },\n dataValidation: {\n mode: 'Mode',\n range: 'Cell Range',\n criteria: 'Criteria',\n modeType: {\n cell: 'Cell',\n column: 'Colun',\n row: 'Row',\n },\n type: {\n list: 'List',\n number: 'Number',\n date: 'Date',\n phone: 'Phone',\n email: 'Email',\n },\n operator: {\n be: 'between',\n nbe: 'not betwwen',\n lt: 'less than',\n lte: 'less than or equal to',\n gt: 'greater than',\n gte: 'greater than or equal to',\n eq: 'equal to',\n neq: 'not equal to',\n },\n },\n};\n","/* global window */\nimport en from './en';\n\n// Defines the fallback language as English\nlet $languages = ['en'];\nconst $messages = {\n en,\n};\n\nfunction translate(key, messages) {\n if (messages) {\n // Return the translation from the first language in the languages array\n // that has a value for the provided key.\n for (const lang of $languages) {\n if (!messages[lang]) break;\n\n let message = messages[lang];\n\n // Splits the key at '.' except where escaped as '\\.'\n const keys = key.match(/(?:\\\\.|[^.])+/g);\n\n for (let i = 0; i < keys.length; i += 1) {\n const property = keys[i];\n const value = message[property];\n\n // If value doesn't exist, try next language\n if (!value) break;\n\n if (i === keys.length - 1) return value;\n\n // Move down to the next level of the messages object\n message = value;\n }\n }\n }\n\n return undefined;\n}\n\nfunction t(key) {\n let v = translate(key, $messages);\n if (!v && window && window.x_spreadsheet && window.x_spreadsheet.$messages) {\n v = translate(key, window.x_spreadsheet.$messages);\n }\n return v || '';\n}\n\nfunction tf(key) {\n return () => t(key);\n}\n\n// If clearLangList is set to false, lang will be added to the front of the\n// languages array. The languages in the language array are searched in order\n// to find a translation. This allows the use of other languages as a fallback\n// if lang is missing some keys. The language array is preloaded with English.\n// To set the languages array to only include lang, set clearLangList to true.\nfunction locale(lang, message, clearLangList = false) {\n if (clearLangList) {\n $languages = [lang];\n } else {\n // Append to front of array.\n // Translation method will use the first language in the list that has a\n // matching key.\n $languages.unshift(lang);\n }\n\n if (message) {\n $messages[lang] = message;\n }\n}\n\nexport default {\n t,\n};\n\nexport {\n locale,\n t,\n tf,\n};\n","import { t } from '../locale/locale';\nimport helper from './helper';\n\nconst rules = {\n phone: /^[1-9]\\d{10}$/,\n email: /w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/,\n};\n\nfunction returnMessage(flag, key, ...arg) {\n let message = '';\n if (!flag) {\n message = t(`validation.${key}`, ...arg);\n }\n return [flag, message];\n}\n\nexport default class Validator {\n // operator: b|nb|eq|neq|lt|lte|gt|gte\n // type: date|number|list|phone|email\n constructor(type, required, value, operator) {\n this.required = required;\n this.value = value;\n this.type = type;\n this.operator = operator;\n this.message = '';\n }\n\n parseValue(v) {\n const { type } = this;\n if (type === 'date') {\n return new Date(v);\n }\n if (type === 'number') {\n return Number(v);\n }\n return v;\n }\n\n equals(other) {\n let flag = this.type === other.type\n && this.required === other.required\n && this.operator === other.operator;\n if (flag) {\n if (Array.isArray(this.value)) {\n flag = helper.arrayEquals(this.value, other.value);\n } else {\n flag = this.value === other.value;\n }\n }\n return flag;\n }\n\n values() {\n return this.value.split(',');\n }\n\n validate(v) {\n const {\n required, operator, value, type,\n } = this;\n if (required && /^\\s*$/.test(v)) {\n return returnMessage(false, 'required');\n }\n if (/^\\s*$/.test(v)) return [true];\n if (rules[type] && !rules[type].test(v)) {\n return returnMessage(false, 'notMatch');\n }\n if (type === 'list') {\n return returnMessage(this.values().includes(v), 'notIn');\n }\n if (operator) {\n const v1 = this.parseValue(v);\n if (operator === 'be') {\n const [min, max] = value;\n return returnMessage(\n v1 >= this.parseValue(min) && v1 <= this.parseValue(max),\n 'between',\n min,\n max,\n );\n }\n if (operator === 'nbe') {\n const [min, max] = value;\n return returnMessage(\n v1 < this.parseValue(min) || v1 > this.parseValue(max),\n 'notBetween',\n min,\n max,\n );\n }\n if (operator === 'eq') {\n return returnMessage(\n v1 === this.parseValue(value),\n 'equal',\n value,\n );\n }\n if (operator === 'neq') {\n return returnMessage(\n v1 !== this.parseValue(value),\n 'notEqual',\n value,\n );\n }\n if (operator === 'lt') {\n return returnMessage(\n v1 < this.parseValue(value),\n 'lessThan',\n value,\n );\n }\n if (operator === 'lte') {\n return returnMessage(\n v1 <= this.parseValue(value),\n 'lessThanEqual',\n value,\n );\n }\n if (operator === 'gt') {\n return returnMessage(\n v1 > this.parseValue(value),\n 'greaterThan',\n value,\n );\n }\n if (operator === 'gte') {\n return returnMessage(\n v1 >= this.parseValue(value),\n 'greaterThanEqual',\n value,\n );\n }\n }\n return [true];\n }\n}\n","import Validator from './validator';\nimport { CellRange } from './cell_range';\n\nclass Validation {\n constructor(mode, refs, validator) {\n this.refs = refs;\n this.mode = mode; // cell\n this.validator = validator;\n }\n\n includes(ri, ci) {\n const { refs } = this;\n for (let i = 0; i < refs.length; i += 1) {\n const cr = CellRange.valueOf(refs[i]);\n if (cr.includes(ri, ci)) return true;\n }\n return false;\n }\n\n addRef(ref) {\n this.remove(CellRange.valueOf(ref));\n this.refs.push(ref);\n }\n\n remove(cellRange) {\n const nrefs = [];\n this.refs.forEach((it) => {\n const cr = CellRange.valueOf(it);\n if (cr.intersects(cellRange)) {\n const crs = cr.difference(cellRange);\n crs.forEach(it1 => nrefs.push(it1.toString()));\n } else {\n nrefs.push(it);\n }\n });\n this.refs = nrefs;\n }\n\n getData() {\n const { refs, mode, validator } = this;\n const {\n type, required, operator, value,\n } = validator;\n return {\n refs, mode, type, required, operator, value,\n };\n }\n\n static valueOf({\n refs, mode, type, required, operator, value,\n }) {\n return new Validation(mode, refs, new Validator(type, required, value, operator));\n }\n}\nclass Validations {\n constructor() {\n this._ = [];\n // ri_ci: errMessage\n this.errors = new Map();\n }\n\n getError(ri, ci) {\n return this.errors.get(`${ri}_${ci}`);\n }\n\n validate(ri, ci, text) {\n const v = this.get(ri, ci);\n const key = `${ri}_${ci}`;\n const { errors } = this;\n if (v !== null) {\n const [flag, message] = v.validator.validate(text);\n if (!flag) {\n errors.set(key, message);\n } else {\n errors.delete(key);\n }\n } else {\n errors.delete(key);\n }\n return true;\n }\n\n // type: date|number|phone|email|list\n // validator: { required, value, operator }\n add(mode, ref, {\n type, required, value, operator,\n }) {\n const validator = new Validator(\n type, required, value, operator,\n );\n const v = this.getByValidator(validator);\n if (v !== null) {\n v.addRef(ref);\n } else {\n this._.push(new Validation(mode, [ref], validator));\n }\n }\n\n getByValidator(validator) {\n for (let i = 0; i < this._.length; i += 1) {\n const v = this._[i];\n if (v.validator.equals(validator)) {\n return v;\n }\n }\n return null;\n }\n\n get(ri, ci) {\n for (let i = 0; i < this._.length; i += 1) {\n const v = this._[i];\n if (v.includes(ri, ci)) return v;\n }\n return null;\n }\n\n remove(cellRange) {\n this.each((it) => {\n it.remove(cellRange);\n });\n }\n\n each(cb) {\n this._.forEach(it => cb(it));\n }\n\n getData() {\n return this._.filter(it => it.refs.length > 0).map(it => it.getData());\n }\n\n setData(d) {\n this._ = d.map(it => Validation.valueOf(it));\n }\n}\n\nexport default {};\nexport {\n Validations,\n};\n","/* global document */\n\nimport Selector from './selector';\nimport Scroll from './scroll';\nimport History from './history';\nimport Clipboard from './clipboard';\nimport AutoFilter from './auto_filter';\nimport { Merges } from './merge';\nimport helper from './helper';\nimport { Rows } from './row';\nimport { Cols } from './col';\nimport { Validations } from './validation';\nimport { CellRange } from './cell_range';\nimport { expr2xy, xy2expr } from './alphabet';\nimport { t } from '../locale/locale';\n\n// private methods\n/*\n * {\n * name: ''\n * freeze: [0, 0],\n * formats: [],\n * styles: [\n * {\n * bgcolor: '',\n * align: '',\n * valign: '',\n * textwrap: false,\n * strike: false,\n * underline: false,\n * color: '',\n * format: 1,\n * border: {\n * left: [style, color],\n * right: [style, color],\n * top: [style, color],\n * bottom: [style, color],\n * },\n * font: {\n * name: 'Helvetica',\n * size: 10,\n * bold: false,\n * italic: false,\n * }\n * }\n * ],\n * merges: [\n * 'A1:F11',\n * ...\n * ],\n * rows: {\n * 1: {\n * height: 50,\n * style: 1,\n * cells: {\n * 1: {\n * style: 2,\n * type: 'string',\n * text: '',\n * value: '', // cal result\n * }\n * }\n * },\n * ...\n * },\n * cols: {\n * 2: { width: 100, style: 1 }\n * }\n * }\n */\nconst defaultSettings = {\n mode: 'edit', // edit | read\n view: {\n height: () => document.documentElement.clientHeight,\n width: () => document.documentElement.clientWidth,\n },\n showGrid: true,\n showToolbar: true,\n showContextmenu: true,\n showBottomBar: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: 100,\n indexWidth: 60,\n minWidth: 60,\n },\n style: {\n bgcolor: '#ffffff',\n align: 'left',\n valign: 'middle',\n textwrap: false,\n strike: false,\n underline: false,\n color: '#0a0a0a',\n font: {\n name: 'Arial',\n size: 10,\n bold: false,\n italic: false,\n },\n format: 'normal',\n },\n};\n\nconst toolbarHeight = 41;\nconst bottombarHeight = 41;\n\n\n// Utility functions\nconst hasOwnProperty = (obj, name) => Object.prototype.hasOwnProperty.call(obj, name);\n\n\n// src: cellRange\n// dst: cellRange\nfunction canPaste(src, dst, error = () => {}) {\n const { merges } = this;\n const cellRange = dst.clone();\n const [srn, scn] = src.size();\n const [drn, dcn] = dst.size();\n if (srn > drn) {\n cellRange.eri = dst.sri + srn - 1;\n }\n if (scn > dcn) {\n cellRange.eci = dst.sci + scn - 1;\n }\n if (merges.intersects(cellRange)) {\n error(t('error.pasteForMergedCell'));\n return false;\n }\n return true;\n}\nfunction copyPaste(srcCellRange, dstCellRange, what, autofill = false) {\n const { rows, merges } = this;\n // delete dest merge\n if (what === 'all' || what === 'format') {\n rows.deleteCells(dstCellRange, what);\n merges.deleteWithin(dstCellRange);\n }\n rows.copyPaste(srcCellRange, dstCellRange, what, autofill, (ri, ci, cell) => {\n if (cell && cell.merge) {\n // console.log('cell:', ri, ci, cell);\n const [rn, cn] = cell.merge;\n if (rn <= 0 && cn <= 0) return;\n merges.add(new CellRange(ri, ci, ri + rn, ci + cn));\n }\n });\n}\n\nfunction cutPaste(srcCellRange, dstCellRange) {\n const { clipboard, rows, merges } = this;\n rows.cutPaste(srcCellRange, dstCellRange);\n merges.move(srcCellRange,\n dstCellRange.sri - srcCellRange.sri,\n dstCellRange.sci - srcCellRange.sci);\n clipboard.clear();\n}\n\n// bss: { top, bottom, left, right }\nfunction setStyleBorder(ri, ci, bss) {\n const { styles, rows } = this;\n const cell = rows.getCellOrNew(ri, ci);\n let cstyle = {};\n if (cell.style !== undefined) {\n cstyle = helper.cloneDeep(styles[cell.style]);\n }\n cstyle = helper.merge(cstyle, { border: bss });\n cell.style = this.addStyle(cstyle);\n}\n\nfunction setStyleBorders({ mode, style, color }) {\n const { styles, selector, rows } = this;\n const {\n sri, sci, eri, eci,\n } = selector.range;\n const multiple = !this.isSignleSelected();\n if (!multiple) {\n if (mode === 'inside' || mode === 'horizontal' || mode === 'vertical') {\n return;\n }\n }\n if (mode === 'outside' && !multiple) {\n setStyleBorder.call(this, sri, sci, {\n top: [style, color], bottom: [style, color], left: [style, color], right: [style, color],\n });\n } else if (mode === 'none') {\n selector.range.each((ri, ci) => {\n const cell = rows.getCell(ri, ci);\n if (cell && cell.style !== undefined) {\n const ns = helper.cloneDeep(styles[cell.style]);\n delete ns.border;\n // ['bottom', 'top', 'left', 'right'].forEach((prop) => {\n // if (ns[prop]) delete ns[prop];\n // });\n cell.style = this.addStyle(ns);\n }\n });\n } else if (mode === 'all' || mode === 'inside' || mode === 'outside'\n || mode === 'horizontal' || mode === 'vertical') {\n const merges = [];\n for (let ri = sri; ri <= eri; ri += 1) {\n for (let ci = sci; ci <= eci; ci += 1) {\n // jump merges -- start\n const mergeIndexes = [];\n for (let ii = 0; ii < merges.length; ii += 1) {\n const [mri, mci, rn, cn] = merges[ii];\n if (ri === mri + rn + 1) mergeIndexes.push(ii);\n if (mri <= ri && ri <= mri + rn) {\n if (ci === mci) {\n ci += cn + 1;\n break;\n }\n }\n }\n mergeIndexes.forEach(it => merges.splice(it, 1));\n if (ci > eci) break;\n // jump merges -- end\n const cell = rows.getCell(ri, ci);\n let [rn, cn] = [0, 0];\n if (cell && cell.merge) {\n [rn, cn] = cell.merge;\n merges.push([ri, ci, rn, cn]);\n }\n const mrl = rn > 0 && ri + rn === eri;\n const mcl = cn > 0 && ci + cn === eci;\n let bss = {};\n if (mode === 'all') {\n bss = {\n bottom: [style, color],\n top: [style, color],\n left: [style, color],\n right: [style, color],\n };\n } else if (mode === 'inside') {\n if (!mcl && ci < eci) bss.right = [style, color];\n if (!mrl && ri < eri) bss.bottom = [style, color];\n } else if (mode === 'horizontal') {\n if (!mrl && ri < eri) bss.bottom = [style, color];\n } else if (mode === 'vertical') {\n if (!mcl && ci < eci) bss.right = [style, color];\n } else if (mode === 'outside' && multiple) {\n if (sri === ri) bss.top = [style, color];\n if (mrl || eri === ri) bss.bottom = [style, color];\n if (sci === ci) bss.left = [style, color];\n if (mcl || eci === ci) bss.right = [style, color];\n }\n if (Object.keys(bss).length > 0) {\n setStyleBorder.call(this, ri, ci, bss);\n }\n ci += cn;\n }\n }\n } else if (mode === 'top' || mode === 'bottom') {\n for (let ci = sci; ci <= eci; ci += 1) {\n if (mode === 'top') {\n setStyleBorder.call(this, sri, ci, { top: [style, color] });\n ci += rows.getCellMerge(sri, ci)[1];\n }\n if (mode === 'bottom') {\n setStyleBorder.call(this, eri, ci, { bottom: [style, color] });\n ci += rows.getCellMerge(eri, ci)[1];\n }\n }\n } else if (mode === 'left' || mode === 'right') {\n for (let ri = sri; ri <= eri; ri += 1) {\n if (mode === 'left') {\n setStyleBorder.call(this, ri, sci, { left: [style, color] });\n ri += rows.getCellMerge(ri, sci)[0];\n }\n if (mode === 'right') {\n setStyleBorder.call(this, ri, eci, { right: [style, color] });\n ri += rows.getCellMerge(ri, eci)[0];\n }\n }\n }\n}\n\nfunction getCellRowByY(y, scrollOffsety) {\n const { rows } = this;\n const fsh = this.freezeTotalHeight();\n // console.log('y:', y, ', fsh:', fsh);\n let inits = rows.height;\n if (fsh + rows.height < y) inits -= scrollOffsety;\n\n // handle ri in autofilter\n const frset = this.exceptRowSet;\n\n let ri = 0;\n let top = inits;\n let { height } = rows;\n for (; ri < rows.len; ri += 1) {\n if (top > y) break;\n if (!frset.has(ri)) {\n height = rows.getHeight(ri);\n top += height;\n }\n }\n top -= height;\n // console.log('ri:', ri, ', top:', top, ', height:', height);\n\n if (top <= 0) {\n return { ri: -1, top: 0, height };\n }\n\n return { ri: ri - 1, top, height };\n}\n\nfunction getCellColByX(x, scrollOffsetx) {\n const { cols } = this;\n const fsw = this.freezeTotalWidth();\n let inits = cols.indexWidth;\n if (fsw + cols.indexWidth < x) inits -= scrollOffsetx;\n const [ci, left, width] = helper.rangeReduceIf(\n 0,\n cols.len,\n inits,\n cols.indexWidth,\n x,\n i => cols.getWidth(i),\n );\n if (left <= 0) {\n return { ci: -1, left: 0, width: cols.indexWidth };\n }\n return { ci: ci - 1, left, width };\n}\n\nexport default class DataProxy {\n constructor(name, settings) {\n this.settings = helper.merge(defaultSettings, settings || {});\n // save data begin\n this.name = name || 'sheet';\n this.freeze = [0, 0];\n this.styles = []; // Array<Style>\n this.merges = new Merges(); // [CellRange, ...]\n this.rows = new Rows(this.settings.row);\n this.cols = new Cols(this.settings.col);\n this.validations = new Validations();\n this.hyperlinks = {};\n this.comments = {};\n // save data end\n\n // don't save object\n this.selector = new Selector();\n this.scroll = new Scroll();\n this.history = new History();\n this.clipboard = new Clipboard();\n this.autoFilter = new AutoFilter();\n this.change = () => {};\n this.exceptRowSet = new Set();\n this.sortedRowMap = new Map();\n this.unsortedRowMap = new Map();\n }\n\n addValidation(mode, ref, validator) {\n // console.log('mode:', mode, ', ref:', ref, ', validator:', validator);\n this.changeData(() => {\n this.validations.add(mode, ref, validator);\n });\n }\n\n removeValidation() {\n const { range } = this.selector;\n this.changeData(() => {\n this.validations.remove(range);\n });\n }\n\n getSelectedValidator() {\n const { ri, ci } = this.selector;\n const v = this.validations.get(ri, ci);\n return v ? v.validator : null;\n }\n\n getSelectedValidation() {\n const { ri, ci, range } = this.selector;\n const v = this.validations.get(ri, ci);\n const ret = { ref: range.toString() };\n if (v !== null) {\n ret.mode = v.mode;\n ret.validator = v.validator;\n }\n return ret;\n }\n\n canUndo() {\n return this.history.canUndo();\n }\n\n canRedo() {\n return this.history.canRedo();\n }\n\n undo() {\n this.history.undo(this.getData(), (d) => {\n this.setData(d);\n });\n }\n\n redo() {\n this.history.redo(this.getData(), (d) => {\n this.setData(d);\n });\n }\n\n copy() {\n this.clipboard.copy(this.selector.range);\n }\n\n copyToSystemClipboard() {\n /* global navigator */\n if (navigator.clipboard === undefined) {\n return;\n }\n let copyText = '';\n const rowData = this.rows.getData();\n for (let ri = this.selector.range.sri; ri <= this.selector.range.eri; ri += 1) {\n if (hasOwnProperty(rowData, ri)) {\n for (let ci = this.selector.range.sci; ci <= this.selector.range.eci; ci += 1) {\n if (ci > this.selector.range.sci) {\n copyText += '\\t';\n }\n if (hasOwnProperty(rowData[ri].cells, ci)) {\n const cellText = String(rowData[ri].cells[ci].text);\n if ((cellText.indexOf(`\\n`) === -1) && (cellText.indexOf(`\\t`) === -1) && (cellText.indexOf(`\"`) === -1)) {\n copyText += cellText;\n } else {\n copyText += `\"${cellText}\"`;\n }\n }\n }\n } else {\n for (let ci = this.selector.range.sci; ci <= this.selector.range.eci; ci += 1) {\n copyText += '\\t';\n }\n }\n copyText += '\\n';\n }\n navigator.clipboard.writeText(copyText).then(() => {}, (err) => {\n console.log('text copy to the system clipboard error ', copyText, err);\n });\n }\n\n cut() {\n this.clipboard.cut(this.selector.range);\n }\n\n // what: all | text | format\n paste(what = 'all', error = () => {}) {\n // console.log('sIndexes:', sIndexes);\n const { clipboard, selector } = this;\n if (clipboard.isClear()) return false;\n if (!canPaste.call(this, clipboard.range, selector.range, error)) return false;\n\n this.changeData(() => {\n if (clipboard.isCopy()) {\n copyPaste.call(this, clipboard.range, selector.range, what);\n } else if (clipboard.isCut()) {\n cutPaste.call(this, clipboard.range, selector.range);\n }\n });\n return true;\n }\n\n pasteFromText(txt) {\n const lines = txt.split('\\r\\n').map(it => it.replace(/\"/g, '').split('\\t'));\n if (lines.length > 0) lines.length -= 1;\n const { rows, selector } = this;\n this.changeData(() => {\n rows.paste(lines, selector.range);\n });\n }\n\n autofill(cellRange, what, error = () => {}) {\n const srcRange = this.selector.range;\n if (!canPaste.call(this, srcRange, cellRange, error)) return false;\n this.changeData(() => {\n copyPaste.call(this, srcRange, cellRange, what, true);\n });\n return true;\n }\n\n clearClipboard() {\n this.clipboard.clear();\n }\n\n calSelectedRangeByEnd(ri, ci) {\n const {\n selector, rows, cols, merges,\n } = this;\n let {\n sri, sci, eri, eci,\n } = selector.range;\n const cri = selector.ri;\n const cci = selector.ci;\n let [nri, nci] = [ri, ci];\n if (ri < 0) nri = rows.len - 1;\n if (ci < 0) nci = cols.len - 1;\n if (nri > cri) [sri, eri] = [cri, nri];\n else [sri, eri] = [nri, cri];\n if (nci > cci) [sci, eci] = [cci, nci];\n else [sci, eci] = [nci, cci];\n selector.range = merges.union(new CellRange(\n sri, sci, eri, eci,\n ));\n selector.range = merges.union(selector.range);\n // console.log('selector.range:', selector.range);\n return selector.range;\n }\n\n calSelectedRangeByStart(ri, ci) {\n const {\n selector, rows, cols, merges,\n } = this;\n let cellRange = merges.getFirstIncludes(ri, ci);\n // console.log('cellRange:', cellRange, ri, ci, merges);\n if (cellRange === null) {\n cellRange = new CellRange(ri, ci, ri, ci);\n if (ri === -1) {\n cellRange.sri = 0;\n cellRange.eri = rows.len - 1;\n }\n if (ci === -1) {\n cellRange.sci = 0;\n cellRange.eci = cols.len - 1;\n }\n }\n selector.range = cellRange;\n return cellRange;\n }\n\n setSelectedCellAttr(property, value) {\n this.changeData(() => {\n const { selector, styles, rows } = this;\n if (property === 'merge') {\n if (value) this.merge();\n else this.unmerge();\n } else if (property === 'border') {\n setStyleBorders.call(this, value);\n } else if (property === 'formula') {\n // console.log('>>>', selector.multiple());\n const { ri, ci, range } = selector;\n if (selector.multiple()) {\n const [rn, cn] = selector.size();\n const {\n sri, sci, eri, eci,\n } = range;\n if (rn > 1) {\n for (let i = sci; i <= eci; i += 1) {\n const cell = rows.getCellOrNew(eri + 1, i);\n cell.text = `=${value}(${xy2expr(i, sri)}:${xy2expr(i, eri)})`;\n }\n } else if (cn > 1) {\n const cell = rows.getCellOrNew(ri, eci + 1);\n cell.text = `=${value}(${xy2expr(sci, ri)}:${xy2expr(eci, ri)})`;\n }\n } else {\n const cell = rows.getCellOrNew(ri, ci);\n cell.text = `=${value}()`;\n }\n } else {\n selector.range.each((ri, ci) => {\n const cell = rows.getCellOrNew(ri, ci);\n let cstyle = {};\n if (cell.style !== undefined) {\n cstyle = helper.cloneDeep(styles[cell.style]);\n }\n if (property === 'format') {\n cstyle.format = value;\n cell.style = this.addStyle(cstyle);\n } else if (property === 'font-bold' || property === 'font-italic'\n || property === 'font-name' || property === 'font-size') {\n const nfont = {};\n nfont[property.split('-')[1]] = value;\n cstyle.font = Object.assign(cstyle.font || {}, nfont);\n cell.style = this.addStyle(cstyle);\n } else if (property === 'strike' || property === 'textwrap'\n || property === 'underline'\n || property === 'align' || property === 'valign'\n || property === 'color' || property === 'bgcolor') {\n cstyle[property] = value;\n cell.style = this.addStyle(cstyle);\n } else {\n cell[property] = value;\n }\n });\n }\n });\n }\n\n // state: input | finished\n setSelectedCellText(text, state = 'input') {\n const { autoFilter, selector, rows } = this;\n const { ri, ci } = selector;\n let nri = ri;\n if (this.unsortedRowMap.has(ri)) {\n nri = this.unsortedRowMap.get(ri);\n }\n const oldCell = rows.getCell(nri, ci);\n const oldText = oldCell ? oldCell.text : '';\n this.setCellText(nri, ci, text, state);\n // replace filter.value\n if (autoFilter.active()) {\n const filter = autoFilter.getFilter(ci);\n if (filter) {\n const vIndex = filter.value.findIndex(v => v === oldText);\n if (vIndex >= 0) {\n filter.value.splice(vIndex, 1, text);\n }\n // console.log('filter:', filter, oldCell);\n }\n }\n // this.resetAutoFilter();\n }\n\n getSelectedCell() {\n const { ri, ci } = this.selector;\n let nri = ri;\n if (this.unsortedRowMap.has(ri)) {\n nri = this.unsortedRowMap.get(ri);\n }\n return this.rows.getCell(nri, ci);\n }\n\n xyInSelectedRect(x, y) {\n const {\n left, top, width, height,\n } = this.getSelectedRect();\n const x1 = x - this.cols.indexWidth;\n const y1 = y - this.rows.height;\n // console.log('x:', x, ',y:', y, 'left:', left, 'top:', top);\n return x1 > left && x1 < (left + width)\n && y1 > top && y1 < (top + height);\n }\n\n getSelectedRect() {\n return this.getRect(this.selector.range);\n }\n\n getClipboardRect() {\n const { clipboard } = this;\n if (!clipboard.isClear()) {\n return this.getRect(clipboard.range);\n }\n return { left: -100, top: -100 };\n }\n\n getRect(cellRange) {\n const {\n scroll, rows, cols, exceptRowSet,\n } = this;\n const {\n sri, sci, eri, eci,\n } = cellRange;\n // console.log('sri:', sri, ',sci:', sci, ', eri:', eri, ', eci:', eci);\n // no selector\n if (sri < 0 && sci < 0) {\n return {\n left: 0, l: 0, top: 0, t: 0, scroll,\n };\n }\n const left = cols.sumWidth(0, sci);\n const top = rows.sumHeight(0, sri, exceptRowSet);\n const height = rows.sumHeight(sri, eri + 1, exceptRowSet);\n const width = cols.sumWidth(sci, eci + 1);\n // console.log('sri:', sri, ', sci:', sci, ', eri:', eri, ', eci:', eci);\n let left0 = left - scroll.x;\n let top0 = top - scroll.y;\n const fsh = this.freezeTotalHeight();\n const fsw = this.freezeTotalWidth();\n if (fsw > 0 && fsw > left) {\n left0 = left;\n }\n if (fsh > 0 && fsh > top) {\n top0 = top;\n }\n return {\n l: left,\n t: top,\n left: left0,\n top: top0,\n height,\n width,\n scroll,\n };\n }\n\n getCellRectByXY(x, y) {\n const {\n scroll, merges, rows, cols,\n } = this;\n let { ri, top, height } = getCellRowByY.call(this, y, scroll.y);\n let { ci, left, width } = getCellColByX.call(this, x, scroll.x);\n if (ci === -1) {\n width = cols.totalWidth();\n }\n if (ri === -1) {\n height = rows.totalHeight();\n }\n if (ri >= 0 || ci >= 0) {\n const merge = merges.getFirstIncludes(ri, ci);\n if (merge) {\n ri = merge.sri;\n ci = merge.sci;\n ({\n left, top, width, height,\n } = this.cellRect(ri, ci));\n }\n }\n return {\n ri, ci, left, top, width, height,\n };\n }\n\n isSignleSelected() {\n const {\n sri, sci, eri, eci,\n } = this.selector.range;\n const cell = this.getCell(sri, sci);\n if (cell && cell.merge) {\n const [rn, cn] = cell.merge;\n if (sri + rn === eri && sci + cn === eci) return true;\n }\n return !this.selector.multiple();\n }\n\n canUnmerge() {\n const {\n sri, sci, eri, eci,\n } = this.selector.range;\n const cell = this.getCell(sri, sci);\n if (cell && cell.merge) {\n const [rn, cn] = cell.merge;\n if (sri + rn === eri && sci + cn === eci) return true;\n }\n return false;\n }\n\n merge() {\n const { selector, rows } = this;\n if (this.isSignleSelected()) return;\n const [rn, cn] = selector.size();\n // console.log('merge:', rn, cn);\n if (rn > 1 || cn > 1) {\n const { sri, sci } = selector.range;\n this.changeData(() => {\n const cell = rows.getCellOrNew(sri, sci);\n cell.merge = [rn - 1, cn - 1];\n this.merges.add(selector.range);\n // delete merge cells\n this.rows.deleteCells(selector.range);\n // console.log('cell:', cell, this.d);\n this.rows.setCell(sri, sci, cell);\n });\n }\n }\n\n unmerge() {\n const { selector } = this;\n if (!this.isSignleSelected()) return;\n const { sri, sci } = selector.range;\n this.changeData(() => {\n this.rows.deleteCell(sri, sci, 'merge');\n this.merges.deleteWithin(selector.range);\n });\n }\n\n canAutofilter() {\n return !this.autoFilter.active();\n }\n\n autofilter() {\n const { autoFilter, selector } = this;\n this.changeData(() => {\n if (autoFilter.active()) {\n autoFilter.clear();\n this.exceptRowSet = new Set();\n this.sortedRowMap = new Map();\n this.unsortedRowMap = new Map();\n } else {\n autoFilter.ref = selector.range.toString();\n }\n });\n }\n\n setAutoFilter(ci, order, operator, value) {\n const { autoFilter } = this;\n autoFilter.addFilter(ci, operator, value);\n autoFilter.setSort(ci, order);\n this.resetAutoFilter();\n }\n\n resetAutoFilter() {\n const { autoFilter, rows } = this;\n if (!autoFilter.active()) return;\n const { sort } = autoFilter;\n const { rset, fset } = autoFilter.filteredRows((r, c) => rows.getCell(r, c));\n const fary = Array.from(fset);\n const oldAry = Array.from(fset);\n if (sort) {\n fary.sort((a, b) => {\n if (sort.order === 'asc') return a - b;\n if (sort.order === 'desc') return b - a;\n return 0;\n });\n }\n this.exceptRowSet = rset;\n this.sortedRowMap = new Map();\n this.unsortedRowMap = new Map();\n fary.forEach((it, index) => {\n this.sortedRowMap.set(oldAry[index], it);\n this.unsortedRowMap.set(it, oldAry[index]);\n });\n }\n\n deleteCell(what = 'all') {\n const { selector } = this;\n this.changeData(() => {\n this.rows.deleteCells(selector.range, what);\n if (what === 'all' || what === 'format') {\n this.merges.deleteWithin(selector.range);\n }\n });\n }\n\n // type: row | column\n insert(type, n = 1) {\n this.changeData(() => {\n const { sri, sci } = this.selector.range;\n const { rows, merges, cols } = this;\n let si = sri;\n if (type === 'row') {\n rows.insert(sri, n);\n } else if (type === 'column') {\n rows.insertColumn(sci, n);\n si = sci;\n cols.len += 1;\n }\n merges.shift(type, si, n, (ri, ci, rn, cn) => {\n const cell = rows.getCell(ri, ci);\n cell.merge[0] += rn;\n cell.merge[1] += cn;\n });\n });\n }\n\n // type: row | column\n delete(type) {\n this.changeData(() => {\n const {\n rows, merges, selector, cols,\n } = this;\n const { range } = selector;\n const {\n sri, sci, eri, eci,\n } = selector.range;\n const [rsize, csize] = selector.range.size();\n let si = sri;\n let size = rsize;\n if (type === 'row') {\n rows.delete(sri, eri);\n } else if (type === 'column') {\n rows.deleteColumn(sci, eci);\n si = range.sci;\n size = csize;\n cols.len -= 1;\n }\n // console.log('type:', type, ', si:', si, ', size:', size);\n merges.shift(type, si, -size, (ri, ci, rn, cn) => {\n // console.log('ri:', ri, ', ci:', ci, ', rn:', rn, ', cn:', cn);\n const cell = rows.getCell(ri, ci);\n cell.merge[0] += rn;\n cell.merge[1] += cn;\n if (cell.merge[0] === 0 && cell.merge[1] === 0) {\n delete cell.merge;\n }\n });\n });\n }\n\n scrollx(x, cb) {\n const { scroll, freeze, cols } = this;\n const [, fci] = freeze;\n const [\n ci, left, width,\n ] = helper.rangeReduceIf(fci, cols.len, 0, 0, x, i => cols.getWidth(i));\n // console.log('fci:', fci, ', ci:', ci);\n let x1 = left;\n if (x > 0) x1 += width;\n if (scroll.x !== x1) {\n scroll.ci = x > 0 ? ci : 0;\n scroll.x = x1;\n cb();\n }\n }\n\n scrolly(y, cb) {\n const { scroll, freeze, rows } = this;\n const [fri] = freeze;\n const [\n ri, top, height,\n ] = helper.rangeReduceIf(fri, rows.len, 0, 0, y, i => rows.getHeight(i));\n let y1 = top;\n if (y > 0) y1 += height;\n // console.log('ri:', ri, ' ,y:', y1);\n if (scroll.y !== y1) {\n scroll.ri = y > 0 ? ri : 0;\n scroll.y = y1;\n cb();\n }\n }\n\n cellRect(ri, ci) {\n const { rows, cols } = this;\n const left = cols.sumWidth(0, ci);\n const top = rows.sumHeight(0, ri);\n const cell = rows.getCell(ri, ci);\n let width = cols.getWidth(ci);\n let height = rows.getHeight(ri);\n if (cell !== null) {\n if (cell.merge) {\n const [rn, cn] = cell.merge;\n // console.log('cell.merge:', cell.merge);\n if (rn > 0) {\n for (let i = 1; i <= rn; i += 1) {\n height += rows.getHeight(ri + i);\n }\n }\n if (cn > 0) {\n for (let i = 1; i <= cn; i += 1) {\n width += cols.getWidth(ci + i);\n }\n }\n }\n }\n // console.log('data:', this.d);\n return {\n left, top, width, height, cell,\n };\n }\n\n getCell(ri, ci) {\n return this.rows.getCell(ri, ci);\n }\n\n getCellTextOrDefault(ri, ci) {\n const cell = this.getCell(ri, ci);\n return (cell && cell.text) ? cell.text : '';\n }\n\n getCellStyle(ri, ci) {\n const cell = this.getCell(ri, ci);\n if (cell && cell.style !== undefined) {\n return this.styles[cell.style];\n }\n return null;\n }\n\n getCellStyleOrDefault(ri, ci) {\n const { styles, rows } = this;\n const cell = rows.getCell(ri, ci);\n const cellStyle = (cell && cell.style !== undefined) ? styles[cell.style] : {};\n return helper.merge(this.defaultStyle(), cellStyle);\n }\n\n getSelectedCellStyle() {\n const { ri, ci } = this.selector;\n return this.getCellStyleOrDefault(ri, ci);\n }\n\n // state: input | finished\n setCellText(ri, ci, text, state) {\n const { rows, history, validations } = this;\n if (state === 'finished') {\n rows.setCellText(ri, ci, '');\n history.add(this.getData());\n rows.setCellText(ri, ci, text);\n } else {\n rows.setCellText(ri, ci, text);\n this.change(this.getData());\n }\n // validator\n validations.validate(ri, ci, text);\n }\n\n freezeIsActive() {\n const [ri, ci] = this.freeze;\n return ri > 0 || ci > 0;\n }\n\n setFreeze(ri, ci) {\n this.changeData(() => {\n this.freeze = [ri, ci];\n });\n }\n\n freezeTotalWidth() {\n return this.cols.sumWidth(0, this.freeze[1]);\n }\n\n freezeTotalHeight() {\n return this.rows.sumHeight(0, this.freeze[0]);\n }\n\n setRowHeight(ri, height) {\n this.changeData(() => {\n this.rows.setHeight(ri, height);\n });\n }\n\n setColWidth(ci, width) {\n this.changeData(() => {\n this.cols.setWidth(ci, width);\n });\n }\n\n viewHeight() {\n const { view, showToolbar, showBottomBar } = this.settings;\n let h = view.height();\n if (showBottomBar) {\n h -= bottombarHeight;\n }\n if (showToolbar) {\n h -= toolbarHeight;\n }\n return h;\n }\n\n viewWidth() {\n return this.settings.view.width();\n }\n\n freezeViewRange() {\n const [ri, ci] = this.freeze;\n return new CellRange(0, 0, ri - 1, ci - 1, this.freezeTotalWidth(), this.freezeTotalHeight());\n }\n\n contentRange() {\n const { rows, cols } = this;\n const [ri, ci] = rows.maxCell();\n const h = rows.sumHeight(0, ri + 1);\n const w = cols.sumWidth(0, ci + 1);\n return new CellRange(0, 0, ri, ci, w, h);\n }\n\n exceptRowTotalHeight(sri, eri) {\n const { exceptRowSet, rows } = this;\n const exceptRows = Array.from(exceptRowSet);\n let exceptRowTH = 0;\n exceptRows.forEach((ri) => {\n if (ri < sri || ri > eri) {\n const height = rows.getHeight(ri);\n exceptRowTH += height;\n }\n });\n return exceptRowTH;\n }\n\n viewRange() {\n const {\n scroll, rows, cols, freeze, exceptRowSet,\n } = this;\n // console.log('scroll:', scroll, ', freeze:', freeze)\n let { ri, ci } = scroll;\n if (ri <= 0) [ri] = freeze;\n if (ci <= 0) [, ci] = freeze;\n\n let [x, y] = [0, 0];\n let [eri, eci] = [rows.len, cols.len];\n for (let i = ri; i < rows.len; i += 1) {\n if (!exceptRowSet.has(i)) {\n y += rows.getHeight(i);\n eri = i;\n }\n if (y > this.viewHeight()) break;\n }\n for (let j = ci; j < cols.len; j += 1) {\n x += cols.getWidth(j);\n eci = j;\n if (x > this.viewWidth()) break;\n }\n // console.log(ri, ci, eri, eci, x, y);\n return new CellRange(ri, ci, eri, eci, x, y);\n }\n\n eachMergesInView(viewRange, cb) {\n this.merges.filterIntersects(viewRange)\n .forEach(it => cb(it));\n }\n\n hideRowsOrCols() {\n const { rows, cols, selector } = this;\n const [rlen, clen] = selector.size();\n const {\n sri, sci, eri, eci,\n } = selector.range;\n if (rlen === rows.len) {\n for (let ci = sci; ci <= eci; ci += 1) {\n cols.setHide(ci, true);\n }\n } else if (clen === cols.len) {\n for (let ri = sri; ri <= eri; ri += 1) {\n rows.setHide(ri, true);\n }\n }\n }\n\n // type: row | col\n // index row-index | col-index\n unhideRowsOrCols(type, index) {\n this[`${type}s`].unhide(index);\n }\n\n rowEach(min, max, cb) {\n let y = 0;\n const { rows } = this;\n const frset = this.exceptRowSet;\n const frary = [...frset];\n let offset = 0;\n for (let i = 0; i < frary.length; i += 1) {\n if (frary[i] < min) {\n offset += 1;\n }\n }\n // console.log('min:', min, ', max:', max, ', scroll:', scroll);\n for (let i = min + offset; i <= max + offset; i += 1) {\n if (frset.has(i)) {\n offset += 1;\n } else {\n const rowHeight = rows.getHeight(i);\n if (rowHeight > 0) {\n cb(i, y, rowHeight);\n y += rowHeight;\n if (y > this.viewHeight()) break;\n }\n }\n }\n }\n\n colEach(min, max, cb) {\n let x = 0;\n const { cols } = this;\n for (let i = min; i <= max; i += 1) {\n const colWidth = cols.getWidth(i);\n if (colWidth > 0) {\n cb(i, x, colWidth);\n x += colWidth;\n if (x > this.viewWidth()) break;\n }\n }\n }\n\n defaultStyle() {\n return this.settings.style;\n }\n\n addStyle(nstyle) {\n const { styles } = this;\n // console.log('old.styles:', styles, nstyle);\n for (let i = 0; i < styles.length; i += 1) {\n const style = styles[i];\n if (helper.equals(style, nstyle)) return i;\n }\n styles.push(nstyle);\n return styles.length - 1;\n }\n\n changeData(cb) {\n this.history.add(this.getData());\n cb();\n this.change(this.getData());\n }\n\n setData(d) {\n Object.keys(d).forEach((property) => {\n if (property === 'merges' || property === 'rows'\n || property === 'cols' || property === 'validations') {\n this[property].setData(d[property]);\n } else if (property === 'freeze') {\n const [x, y] = expr2xy(d[property]);\n this.freeze = [y, x];\n } else if (property === 'autofilter') {\n this.autoFilter.setData(d[property]);\n } else if (d[property] !== undefined) {\n this[property] = d[property];\n }\n });\n return this;\n }\n\n getData() {\n const {\n name, freeze, styles, merges, rows, cols, validations, autoFilter,\n } = this;\n return {\n name,\n freeze: xy2expr(freeze[1], freeze[0]),\n styles,\n merges: merges.getData(),\n rows: rows.getData(),\n cols: cols.getData(),\n validations: validations.getData(),\n autofilter: autoFilter.getData(),\n };\n }\n}\n","/* global window */\nexport function bind(target, name, fn) {\n target.addEventListener(name, fn);\n}\nexport function unbind(target, name, fn) {\n target.removeEventListener(name, fn);\n}\nexport function unbindClickoutside(el) {\n if (el.xclickoutside) {\n unbind(window.document.body, 'click', el.xclickoutside);\n delete el.xclickoutside;\n }\n}\n\n// the left mouse button: mousedown → mouseup → click\n// the right mouse button: mousedown → contenxtmenu → mouseup\n// the right mouse button in firefox(>65.0): mousedown → contenxtmenu → mouseup → click on window\nexport function bindClickoutside(el, cb) {\n el.xclickoutside = (evt) => {\n // ignore double click\n // console.log('evt:', evt);\n if (evt.detail === 2 || el.contains(evt.target)) return;\n if (cb) cb(el);\n else {\n el.hide();\n unbindClickoutside(el);\n }\n };\n bind(window.document.body, 'click', el.xclickoutside);\n}\nexport function mouseMoveUp(target, movefunc, upfunc) {\n bind(target, 'mousemove', movefunc);\n const t = target;\n t.xEvtUp = (evt) => {\n // console.log('mouseup>>>');\n unbind(target, 'mousemove', movefunc);\n unbind(target, 'mouseup', target.xEvtUp);\n upfunc(evt);\n };\n bind(target, 'mouseup', target.xEvtUp);\n}\n\nfunction calTouchDirection(spanx, spany, evt, cb) {\n let direction = '';\n // console.log('spanx:', spanx, ', spany:', spany);\n if (Math.abs(spanx) > Math.abs(spany)) {\n // horizontal\n direction = spanx > 0 ? 'right' : 'left';\n cb(direction, spanx, evt);\n } else {\n // vertical\n direction = spany > 0 ? 'down' : 'up';\n cb(direction, spany, evt);\n }\n}\n// cb = (direction, distance) => {}\nexport function bindTouch(target, { move, end }) {\n let startx = 0;\n let starty = 0;\n bind(target, 'touchstart', (evt) => {\n const { pageX, pageY } = evt.touches[0];\n startx = pageX;\n starty = pageY;\n });\n bind(target, 'touchmove', (evt) => {\n if (!move) return;\n const { pageX, pageY } = evt.changedTouches[0];\n const spanx = pageX - startx;\n const spany = pageY - starty;\n if (Math.abs(spanx) > 10 || Math.abs(spany) > 10) {\n // console.log('spanx:', spanx, ', spany:', spany);\n calTouchDirection(spanx, spany, evt, move);\n startx = pageX;\n starty = pageY;\n }\n evt.preventDefault();\n });\n bind(target, 'touchend', (evt) => {\n if (!end) return;\n const { pageX, pageY } = evt.changedTouches[0];\n const spanx = pageX - startx;\n const spany = pageY - starty;\n calTouchDirection(spanx, spany, evt, end);\n });\n}\n\n// eventemiter\nexport function createEventEmitter() {\n const listeners = new Map();\n\n function on(eventName, callback) {\n const push = () => {\n const currentListener = listeners.get(eventName);\n return (Array.isArray(currentListener)\n && currentListener.push(callback))\n || false;\n };\n\n const create = () => listeners.set(eventName, [].concat(callback));\n\n return (listeners.has(eventName)\n && push())\n || create();\n }\n\n function fire(eventName, args) {\n const exec = () => {\n const currentListener = listeners.get(eventName);\n for (const callback of currentListener) callback.call(null, ...args);\n };\n\n return listeners.has(eventName)\n && exec();\n }\n\n function removeListener(eventName, callback) {\n const remove = () => {\n const currentListener = listeners.get(eventName);\n const idx = currentListener.indexOf(callback);\n return (idx >= 0)\n && currentListener.splice(idx, 1)\n && listeners.get(eventName).length === 0\n && listeners.delete(eventName);\n };\n\n return listeners.has(eventName)\n && remove();\n }\n\n function once(eventName, callback) {\n const execCalllback = (...args) => {\n callback.call(null, ...args);\n removeListener(eventName, execCalllback);\n };\n\n return on(eventName, execCalllback);\n }\n\n function removeAllListeners() {\n listeners.clear();\n }\n\n return {\n get current() {\n return listeners;\n },\n on,\n once,\n fire,\n removeListener,\n removeAllListeners,\n };\n}\n","/* global window */\nexport const cssPrefix = 'x-spreadsheet';\nexport const dpr = window.devicePixelRatio || 1;\nexport default {\n cssPrefix,\n dpr,\n};\n","/* global window */\nimport { h } from './element';\nimport { mouseMoveUp } from './event';\nimport { cssPrefix } from '../config';\n\nexport default class Resizer {\n constructor(vertical = false, minDistance) {\n this.moving = false;\n this.vertical = vertical;\n this.el = h('div', `${cssPrefix}-resizer ${vertical ? 'vertical' : 'horizontal'}`).children(\n this.unhideHoverEl = h('div', `${cssPrefix}-resizer-hover`)\n .on('dblclick.stop', evt => this.mousedblclickHandler(evt))\n .css('position', 'absolute').hide(),\n this.hoverEl = h('div', `${cssPrefix}-resizer-hover`)\n .on('mousedown.stop', evt => this.mousedownHandler(evt)),\n this.lineEl = h('div', `${cssPrefix}-resizer-line`).hide(),\n ).hide();\n // cell rect\n this.cRect = null;\n this.finishedFn = null;\n this.minDistance = minDistance;\n this.unhideFn = () => {};\n }\n\n showUnhide(index) {\n this.unhideIndex = index;\n this.unhideHoverEl.show();\n }\n\n hideUnhide() {\n this.unhideHoverEl.hide();\n }\n\n // rect : {top, left, width, height}\n // line : {width, height}\n show(rect, line) {\n const {\n moving, vertical, hoverEl, lineEl, el,\n unhideHoverEl,\n } = this;\n if (moving) return;\n this.cRect = rect;\n const {\n left, top, width, height,\n } = rect;\n el.offset({\n left: vertical ? left + width - 5 : left,\n top: vertical ? top : top + height - 5,\n }).show();\n hoverEl.offset({\n width: vertical ? 5 : width,\n height: vertical ? height : 5,\n });\n lineEl.offset({\n width: vertical ? 0 : line.width,\n height: vertical ? line.height : 0,\n });\n unhideHoverEl.offset({\n left: vertical ? 5 - width : left,\n top: vertical ? top : 5 - height,\n width: vertical ? 5 : width,\n height: vertical ? height : 5,\n });\n }\n\n hide() {\n this.el.offset({\n left: 0,\n top: 0,\n }).hide();\n this.hideUnhide();\n }\n\n mousedblclickHandler() {\n if (this.unhideIndex) this.unhideFn(this.unhideIndex);\n }\n\n mousedownHandler(evt) {\n let startEvt = evt;\n const {\n el, lineEl, cRect, vertical, minDistance,\n } = this;\n let distance = vertical ? cRect.width : cRect.height;\n // console.log('distance:', distance);\n lineEl.show();\n mouseMoveUp(window, (e) => {\n this.moving = true;\n if (startEvt !== null && e.buttons === 1) {\n // console.log('top:', top, ', left:', top, ', cRect:', cRect);\n if (vertical) {\n distance += e.movementX;\n if (distance > minDistance) {\n el.css('left', `${cRect.left + distance}px`);\n }\n } else {\n distance += e.movementY;\n if (distance > minDistance) {\n el.css('top', `${cRect.top + distance}px`);\n }\n }\n startEvt = e;\n }\n }, () => {\n startEvt = null;\n lineEl.hide();\n this.moving = false;\n this.hide();\n if (this.finishedFn) {\n if (distance < minDistance) distance = minDistance;\n this.finishedFn(cRect, distance);\n }\n });\n }\n}\n","import { h } from './element';\nimport { cssPrefix } from '../config';\n\nexport default class Scrollbar {\n constructor(vertical) {\n this.vertical = vertical;\n this.moveFn = null;\n this.el = h('div', `${cssPrefix}-scrollbar ${vertical ? 'vertical' : 'horizontal'}`)\n .child(this.contentEl = h('div', ''))\n .on('mousemove.stop', () => {})\n .on('scroll.stop', (evt) => {\n const { scrollTop, scrollLeft } = evt.target;\n // console.log('scrollTop:', scrollTop);\n if (this.moveFn) {\n this.moveFn(this.vertical ? scrollTop : scrollLeft, evt);\n }\n // console.log('evt:::', evt);\n });\n }\n\n move(v) {\n this.el.scroll(v);\n return this;\n }\n\n scroll() {\n return this.el.scroll();\n }\n\n set(distance, contentDistance) {\n const d = distance - 1;\n // console.log('distance:', distance, ', contentDistance:', contentDistance);\n if (contentDistance > d) {\n const cssKey = this.vertical ? 'height' : 'width';\n // console.log('d:', d);\n this.el.css(cssKey, `${d - 15}px`).show();\n this.contentEl\n .css(this.vertical ? 'width' : 'height', '1px')\n .css(cssKey, `${contentDistance}px`);\n } else {\n this.el.hide();\n }\n return this;\n }\n}\n","import { h } from './element';\nimport { cssPrefix } from '../config';\nimport { CellRange } from '../core/cell_range';\n\nconst selectorHeightBorderWidth = 2 * 2 - 1;\nlet startZIndex = 10;\n\nclass SelectorElement {\n constructor(useHideInput = false) {\n this.useHideInput = useHideInput;\n this.inputChange = () => {};\n this.cornerEl = h('div', `${cssPrefix}-selector-corner`);\n this.areaEl = h('div', `${cssPrefix}-selector-area`)\n .child(this.cornerEl).hide();\n this.clipboardEl = h('div', `${cssPrefix}-selector-clipboard`).hide();\n this.autofillEl = h('div', `${cssPrefix}-selector-autofill`).hide();\n this.el = h('div', `${cssPrefix}-selector`)\n .css('z-index', `${startZIndex}`)\n .children(this.areaEl, this.clipboardEl, this.autofillEl)\n .hide();\n if (useHideInput) {\n this.hideInput = h('input', '')\n .on('compositionend', (evt) => {\n this.inputChange(evt.target.value);\n });\n this.el.child(this.hideInputDiv = h('div', 'hide-input').child(this.hideInput));\n this.el.child(this.hideInputDiv = h('div', 'hide-input').child(this.hideInput));\n }\n startZIndex += 1;\n }\n\n setOffset(v) {\n this.el.offset(v).show();\n return this;\n }\n\n hide() {\n this.el.hide();\n return this;\n }\n\n setAreaOffset(v) {\n const {\n left, top, width, height,\n } = v;\n const of = {\n width: width - selectorHeightBorderWidth + 0.8,\n height: height - selectorHeightBorderWidth + 0.8,\n left: left - 0.8,\n top: top - 0.8,\n };\n this.areaEl.offset(of).show();\n if (this.useHideInput) {\n this.hideInputDiv.offset(of);\n this.hideInput.val('').focus();\n }\n }\n\n setClipboardOffset(v) {\n const {\n left, top, width, height,\n } = v;\n this.clipboardEl.offset({\n left,\n top,\n width: width - 5,\n height: height - 5,\n });\n }\n\n showAutofill(v) {\n const {\n left, top, width, height,\n } = v;\n this.autofillEl.offset({\n width: width - selectorHeightBorderWidth,\n height: height - selectorHeightBorderWidth,\n left,\n top,\n }).show();\n }\n\n hideAutofill() {\n this.autofillEl.hide();\n }\n\n showClipboard() {\n this.clipboardEl.show();\n }\n\n hideClipboard() {\n this.clipboardEl.hide();\n }\n}\n\nfunction calBRAreaOffset(offset) {\n const { data } = this;\n const {\n left, top, width, height, scroll, l, t,\n } = offset;\n const ftwidth = data.freezeTotalWidth();\n const ftheight = data.freezeTotalHeight();\n let left0 = left - ftwidth;\n if (ftwidth > l) left0 -= scroll.x;\n let top0 = top - ftheight;\n if (ftheight > t) top0 -= scroll.y;\n return {\n left: left0,\n top: top0,\n width,\n height,\n };\n}\n\nfunction calTAreaOffset(offset) {\n const { data } = this;\n const {\n left, width, height, l, t, scroll,\n } = offset;\n const ftwidth = data.freezeTotalWidth();\n let left0 = left - ftwidth;\n if (ftwidth > l) left0 -= scroll.x;\n return {\n left: left0, top: t, width, height,\n };\n}\n\nfunction calLAreaOffset(offset) {\n const { data } = this;\n const {\n top, width, height, l, t, scroll,\n } = offset;\n const ftheight = data.freezeTotalHeight();\n let top0 = top - ftheight;\n // console.log('ftheight:', ftheight, ', t:', t);\n if (ftheight > t) top0 -= scroll.y;\n return {\n left: l, top: top0, width, height,\n };\n}\n\nfunction setBRAreaOffset(offset) {\n const { br } = this;\n br.setAreaOffset(calBRAreaOffset.call(this, offset));\n}\n\nfunction setTLAreaOffset(offset) {\n const { tl } = this;\n tl.setAreaOffset(offset);\n}\n\nfunction setTAreaOffset(offset) {\n const { t } = this;\n t.setAreaOffset(calTAreaOffset.call(this, offset));\n}\n\nfunction setLAreaOffset(offset) {\n const { l } = this;\n l.setAreaOffset(calLAreaOffset.call(this, offset));\n}\n\nfunction setLClipboardOffset(offset) {\n const { l } = this;\n l.setClipboardOffset(calLAreaOffset.call(this, offset));\n}\n\nfunction setBRClipboardOffset(offset) {\n const { br } = this;\n br.setClipboardOffset(calBRAreaOffset.call(this, offset));\n}\n\nfunction setTLClipboardOffset(offset) {\n const { tl } = this;\n tl.setClipboardOffset(offset);\n}\n\nfunction setTClipboardOffset(offset) {\n const { t } = this;\n t.setClipboardOffset(calTAreaOffset.call(this, offset));\n}\n\nfunction setAllAreaOffset(offset) {\n setBRAreaOffset.call(this, offset);\n setTLAreaOffset.call(this, offset);\n setTAreaOffset.call(this, offset);\n setLAreaOffset.call(this, offset);\n}\n\nfunction setAllClipboardOffset(offset) {\n setBRClipboardOffset.call(this, offset);\n setTLClipboardOffset.call(this, offset);\n setTClipboardOffset.call(this, offset);\n setLClipboardOffset.call(this, offset);\n}\n\nexport default class Selector {\n constructor(data) {\n this.inputChange = () => {};\n this.data = data;\n this.br = new SelectorElement(true);\n this.t = new SelectorElement();\n this.l = new SelectorElement();\n this.tl = new SelectorElement();\n this.br.inputChange = (v) => {\n this.inputChange(v);\n };\n this.br.el.show();\n this.offset = null;\n this.areaOffset = null;\n this.indexes = null;\n this.range = null;\n this.arange = null;\n this.el = h('div', `${cssPrefix}-selectors`)\n .children(\n this.tl.el,\n this.t.el,\n this.l.el,\n this.br.el,\n ).hide();\n\n // for performance\n this.lastri = -1;\n this.lastci = -1;\n\n startZIndex += 1;\n }\n\n resetData(data) {\n this.data = data;\n this.range = data.selector.range;\n this.resetAreaOffset();\n }\n\n hide() {\n this.el.hide();\n }\n\n resetOffset() {\n const {\n data, tl, t, l, br,\n } = this;\n const freezeHeight = data.freezeTotalHeight();\n const freezeWidth = data.freezeTotalWidth();\n if (freezeHeight > 0 || freezeWidth > 0) {\n tl.setOffset({ width: freezeWidth, height: freezeHeight });\n t.setOffset({ left: freezeWidth, height: freezeHeight });\n l.setOffset({ top: freezeHeight, width: freezeWidth });\n br.setOffset({ left: freezeWidth, top: freezeHeight });\n } else {\n tl.hide();\n t.hide();\n l.hide();\n br.setOffset({ left: 0, top: 0 });\n }\n }\n\n resetAreaOffset() {\n // console.log('offset:', offset);\n const offset = this.data.getSelectedRect();\n const coffset = this.data.getClipboardRect();\n setAllAreaOffset.call(this, offset);\n setAllClipboardOffset.call(this, coffset);\n this.resetOffset();\n }\n\n resetBRTAreaOffset() {\n const offset = this.data.getSelectedRect();\n const coffset = this.data.getClipboardRect();\n setBRAreaOffset.call(this, offset);\n setTAreaOffset.call(this, offset);\n setBRClipboardOffset.call(this, coffset);\n setTClipboardOffset.call(this, coffset);\n this.resetOffset();\n }\n\n resetBRLAreaOffset() {\n const offset = this.data.getSelectedRect();\n const coffset = this.data.getClipboardRect();\n setBRAreaOffset.call(this, offset);\n setLAreaOffset.call(this, offset);\n setBRClipboardOffset.call(this, coffset);\n setLClipboardOffset.call(this, coffset);\n this.resetOffset();\n }\n\n set(ri, ci, indexesUpdated = true) {\n const { data } = this;\n const cellRange = data.calSelectedRangeByStart(ri, ci);\n const { sri, sci } = cellRange;\n if (indexesUpdated) {\n let [cri, cci] = [ri, ci];\n if (ri < 0) cri = 0;\n if (ci < 0) cci = 0;\n data.selector.setIndexes(cri, cci);\n this.indexes = [cri, cci];\n }\n\n this.moveIndexes = [sri, sci];\n // this.sIndexes = sIndexes;\n // this.eIndexes = eIndexes;\n this.range = cellRange;\n this.resetAreaOffset();\n this.el.show();\n }\n\n setEnd(ri, ci, moving = true) {\n const { data, lastri, lastci } = this;\n if (moving) {\n if (ri === lastri && ci === lastci) return;\n this.lastri = ri;\n this.lastci = ci;\n }\n this.range = data.calSelectedRangeByEnd(ri, ci);\n setAllAreaOffset.call(this, this.data.getSelectedRect());\n }\n\n reset() {\n // console.log('::::', this.data);\n const { eri, eci } = this.data.selector.range;\n this.setEnd(eri, eci);\n }\n\n showAutofill(ri, ci) {\n if (ri === -1 && ci === -1) return;\n // console.log('ri:', ri, ', ci:', ci);\n // const [sri, sci] = this.sIndexes;\n // const [eri, eci] = this.eIndexes;\n const {\n sri, sci, eri, eci,\n } = this.range;\n const [nri, nci] = [ri, ci];\n // const rn = eri - sri;\n // const cn = eci - sci;\n const srn = sri - ri;\n const scn = sci - ci;\n const ern = eri - ri;\n const ecn = eci - ci;\n if (scn > 0) {\n // left\n // console.log('left');\n this.arange = new CellRange(sri, nci, eri, sci - 1);\n // this.saIndexes = [sri, nci];\n // this.eaIndexes = [eri, sci - 1];\n // data.calRangeIndexes2(\n } else if (srn > 0) {\n // top\n // console.log('top');\n // nri = sri;\n this.arange = new CellRange(nri, sci, sri - 1, eci);\n // this.saIndexes = [nri, sci];\n // this.eaIndexes = [sri - 1, eci];\n } else if (ecn < 0) {\n // right\n // console.log('right');\n // nci = eci;\n this.arange = new CellRange(sri, eci + 1, eri, nci);\n // this.saIndexes = [sri, eci + 1];\n // this.eaIndexes = [eri, nci];\n } else if (ern < 0) {\n // bottom\n // console.log('bottom');\n // nri = eri;\n this.arange = new CellRange(eri + 1, sci, nri, eci);\n // this.saIndexes = [eri + 1, sci];\n // this.eaIndexes = [nri, eci];\n } else {\n // console.log('else:');\n this.arange = null;\n // this.saIndexes = null;\n // this.eaIndexes = null;\n return;\n }\n if (this.arange !== null) {\n // console.log(this.saIndexes, ':', this.eaIndexes);\n const offset = this.data.getRect(this.arange);\n offset.width += 2;\n offset.height += 2;\n const {\n br, l, t, tl,\n } = this;\n br.showAutofill(calBRAreaOffset.call(this, offset));\n l.showAutofill(calLAreaOffset.call(this, offset));\n t.showAutofill(calTAreaOffset.call(this, offset));\n tl.showAutofill(offset);\n }\n }\n\n hideAutofill() {\n ['br', 'l', 't', 'tl'].forEach((property) => {\n this[property].hideAutofill();\n });\n }\n\n showClipboard() {\n const coffset = this.data.getClipboardRect();\n setAllClipboardOffset.call(this, coffset);\n ['br', 'l', 't', 'tl'].forEach((property) => {\n this[property].showClipboard();\n });\n }\n\n hideClipboard() {\n ['br', 'l', 't', 'tl'].forEach((property) => {\n this[property].hideClipboard();\n });\n }\n}\n","import { h } from './element';\nimport { bindClickoutside, unbindClickoutside } from './event';\nimport { cssPrefix } from '../config';\n\nfunction inputMovePrev(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n const { filterItems } = this;\n if (filterItems.length <= 0) return;\n if (this.itemIndex >= 0) filterItems[this.itemIndex].toggle();\n this.itemIndex -= 1;\n if (this.itemIndex < 0) {\n this.itemIndex = filterItems.length - 1;\n }\n filterItems[this.itemIndex].toggle();\n}\n\nfunction inputMoveNext(evt) {\n evt.stopPropagation();\n const { filterItems } = this;\n if (filterItems.length <= 0) return;\n if (this.itemIndex >= 0) filterItems[this.itemIndex].toggle();\n this.itemIndex += 1;\n if (this.itemIndex > filterItems.length - 1) {\n this.itemIndex = 0;\n }\n filterItems[this.itemIndex].toggle();\n}\n\nfunction inputEnter(evt) {\n evt.preventDefault();\n const { filterItems } = this;\n if (filterItems.length <= 0) return;\n evt.stopPropagation();\n if (this.itemIndex < 0) this.itemIndex = 0;\n filterItems[this.itemIndex].el.click();\n this.hide();\n}\n\nfunction inputKeydownHandler(evt) {\n const { keyCode } = evt;\n if (evt.ctrlKey) {\n evt.stopPropagation();\n }\n switch (keyCode) {\n case 37: // left\n evt.stopPropagation();\n break;\n case 38: // up\n inputMovePrev.call(this, evt);\n break;\n case 39: // right\n evt.stopPropagation();\n break;\n case 40: // down\n inputMoveNext.call(this, evt);\n break;\n case 13: // enter\n inputEnter.call(this, evt);\n break;\n case 9:\n inputEnter.call(this, evt);\n break;\n default:\n evt.stopPropagation();\n break;\n }\n}\n\nexport default class Suggest {\n constructor(items, itemClick, width = '200px') {\n this.filterItems = [];\n this.items = items;\n this.el = h('div', `${cssPrefix}-suggest`).css('width', width).hide();\n this.itemClick = itemClick;\n this.itemIndex = -1;\n }\n\n setOffset(v) {\n this.el.cssRemoveKeys('top', 'bottom')\n .offset(v);\n }\n\n hide() {\n const { el } = this;\n this.filterItems = [];\n this.itemIndex = -1;\n el.hide();\n unbindClickoutside(this.el.parent());\n }\n\n setItems(items) {\n this.items = items;\n // this.search('');\n }\n\n search(word) {\n let { items } = this;\n if (!/^\\s*$/.test(word)) {\n items = items.filter(it => (it.key || it).startsWith(word.toUpperCase()));\n }\n items = items.map((it) => {\n let { title } = it;\n if (title) {\n if (typeof title === 'function') {\n title = title();\n }\n } else {\n title = it;\n }\n const item = h('div', `${cssPrefix}-item`)\n .child(title)\n .on('click.stop', () => {\n this.itemClick(it);\n this.hide();\n });\n if (it.label) {\n item.child(h('div', 'label').html(it.label));\n }\n return item;\n });\n this.filterItems = items;\n if (items.length <= 0) {\n return;\n }\n const { el } = this;\n // items[0].toggle();\n el.html('').children(...items).show();\n bindClickoutside(el.parent(), () => { this.hide(); });\n }\n\n bindInputEvents(input) {\n input.on('keydown', evt => inputKeydownHandler.call(this, evt));\n }\n}\n","import { Element, h } from './element';\nimport { cssPrefix } from '../config';\n\nexport default class Icon extends Element {\n constructor(name) {\n super('div', `${cssPrefix}-icon`);\n this.iconNameEl = h('div', `${cssPrefix}-icon-img ${name}`);\n this.child(this.iconNameEl);\n }\n\n setName(name) {\n this.iconNameEl.className(`${cssPrefix}-icon-img ${name}`);\n }\n}\n","import { h } from './element';\nimport Icon from './icon';\nimport { t } from '../locale/locale';\n\nfunction addMonth(date, step) {\n date.setMonth(date.getMonth() + step);\n}\n\nfunction weekday(date, index) {\n const d = new Date(date);\n d.setDate(index - date.getDay() + 1);\n return d;\n}\n\nfunction monthDays(year, month, cdate) {\n // the first day of month\n const startDate = new Date(year, month, 1, 23, 59, 59);\n const datess = [[], [], [], [], [], []];\n for (let i = 0; i < 6; i += 1) {\n for (let j = 0; j < 7; j += 1) {\n const index = i * 7 + j;\n const d = weekday(startDate, index);\n const disabled = d.getMonth() !== month;\n // console.log('d:', d, ', cdate:', cdate);\n const active = d.getMonth() === cdate.getMonth() && d.getDate() === cdate.getDate();\n datess[i][j] = { d, disabled, active };\n }\n }\n return datess;\n}\n\nexport default class Calendar {\n constructor(value) {\n this.value = value;\n this.cvalue = new Date(value);\n\n this.headerLeftEl = h('div', 'calendar-header-left');\n this.bodyEl = h('tbody', '');\n this.buildAll();\n this.el = h('div', 'x-spreadsheet-calendar')\n .children(\n h('div', 'calendar-header').children(\n this.headerLeftEl,\n h('div', 'calendar-header-right').children(\n h('a', 'calendar-prev')\n .on('click.stop', () => this.prev())\n .child(new Icon('chevron-left')),\n h('a', 'calendar-next')\n .on('click.stop', () => this.next())\n .child(new Icon('chevron-right')),\n ),\n ),\n h('table', 'calendar-body').children(\n h('thead', '').child(\n h('tr', '').children(\n ...t('calendar.weeks').map(week => h('th', 'cell').child(week)),\n ),\n ),\n this.bodyEl,\n ),\n );\n this.selectChange = () => {};\n }\n\n setValue(value) {\n this.value = value;\n this.cvalue = new Date(value);\n this.buildAll();\n }\n\n prev() {\n const { value } = this;\n addMonth(value, -1);\n this.buildAll();\n }\n\n next() {\n const { value } = this;\n addMonth(value, 1);\n this.buildAll();\n }\n\n buildAll() {\n this.buildHeaderLeft();\n this.buildBody();\n }\n\n buildHeaderLeft() {\n const { value } = this;\n this.headerLeftEl.html(`${t('calendar.months')[value.getMonth()]} ${value.getFullYear()}`);\n }\n\n buildBody() {\n const { value, cvalue, bodyEl } = this;\n const mDays = monthDays(value.getFullYear(), value.getMonth(), cvalue);\n const trs = mDays.map((it) => {\n const tds = it.map((it1) => {\n let cls = 'cell';\n if (it1.disabled) cls += ' disabled';\n if (it1.active) cls += ' active';\n return h('td', '').child(\n h('div', cls)\n .on('click.stop', () => {\n this.selectChange(it1.d);\n })\n .child(it1.d.getDate().toString()),\n );\n });\n return h('tr', '').children(...tds);\n });\n bodyEl.html('').children(...trs);\n }\n}\n","import Calendar from './calendar';\nimport { h } from './element';\nimport { cssPrefix } from '../config';\n\nexport default class Datepicker {\n constructor() {\n this.calendar = new Calendar(new Date());\n this.el = h('div', `${cssPrefix}-datepicker`).child(\n this.calendar.el,\n ).hide();\n }\n\n setValue(date) {\n // console.log(':::::::', date, typeof date, date instanceof string);\n const { calendar } = this;\n if (typeof date === 'string') {\n // console.log(/^\\d{4}-\\d{1,2}-\\d{1,2}$/.test(date));\n if (/^\\d{4}-\\d{1,2}-\\d{1,2}$/.test(date)) {\n calendar.setValue(new Date(date.replace(new RegExp('-', 'g'), '/')));\n }\n } else if (date instanceof Date) {\n calendar.setValue(date);\n }\n return this;\n }\n\n change(cb) {\n this.calendar.selectChange = (d) => {\n cb(d);\n this.hide();\n };\n }\n\n show() {\n this.el.show();\n }\n\n hide() {\n this.el.hide();\n }\n}\n","//* global window */\nimport { h } from './element';\nimport Suggest from './suggest';\nimport Datepicker from './datepicker';\nimport { cssPrefix } from '../config';\n// import { mouseMoveUp } from '../event';\n\nfunction resetTextareaSize() {\n const { inputText } = this;\n if (!/^\\s*$/.test(inputText)) {\n const {\n textlineEl, textEl, areaOffset,\n } = this;\n const txts = inputText.split('\\n');\n const maxTxtSize = Math.max(...txts.map(it => it.length));\n const tlOffset = textlineEl.offset();\n const fontWidth = tlOffset.width / inputText.length;\n const tlineWidth = (maxTxtSize + 1) * fontWidth + 5;\n const maxWidth = this.viewFn().width - areaOffset.left - fontWidth;\n let h1 = txts.length;\n if (tlineWidth > areaOffset.width) {\n let twidth = tlineWidth;\n if (tlineWidth > maxWidth) {\n twidth = maxWidth;\n h1 += parseInt(tlineWidth / maxWidth, 10);\n h1 += (tlineWidth % maxWidth) > 0 ? 1 : 0;\n }\n textEl.css('width', `${twidth}px`);\n }\n h1 *= this.rowHeight;\n if (h1 > areaOffset.height) {\n textEl.css('height', `${h1}px`);\n }\n }\n}\n\nfunction insertText({ target }, itxt) {\n const { value, selectionEnd } = target;\n const ntxt = `${value.slice(0, selectionEnd)}${itxt}${value.slice(selectionEnd)}`;\n target.value = ntxt;\n target.setSelectionRange(selectionEnd + 1, selectionEnd + 1);\n\n this.inputText = ntxt;\n this.textlineEl.html(ntxt);\n resetTextareaSize.call(this);\n}\n\nfunction keydownEventHandler(evt) {\n const { keyCode, altKey } = evt;\n if (keyCode !== 13 && keyCode !== 9) evt.stopPropagation();\n if (keyCode === 13 && altKey) {\n insertText.call(this, evt, '\\n');\n evt.stopPropagation();\n }\n if (keyCode === 13 && !altKey) evt.preventDefault();\n}\n\nfunction inputEventHandler(evt) {\n const v = evt.target.value;\n // console.log(evt, 'v:', v);\n const { suggest, textlineEl, validator } = this;\n const { cell } = this;\n if (cell !== null) {\n if (('editable' in cell && cell.editable === true) || (cell.editable === undefined)) {\n this.inputText = v;\n if (validator) {\n if (validator.type === 'list') {\n suggest.search(v);\n } else {\n suggest.hide();\n }\n } else {\n const start = v.lastIndexOf('=');\n if (start !== -1) {\n suggest.search(v.substring(start + 1));\n } else {\n suggest.hide();\n }\n }\n textlineEl.html(v);\n resetTextareaSize.call(this);\n this.change('input', v);\n } else {\n evt.target.value = cell.text;\n }\n } else {\n this.inputText = v;\n if (validator) {\n if (validator.type === 'list') {\n suggest.search(v);\n } else {\n suggest.hide();\n }\n } else {\n const start = v.lastIndexOf('=');\n if (start !== -1) {\n suggest.search(v.substring(start + 1));\n } else {\n suggest.hide();\n }\n }\n textlineEl.html(v);\n resetTextareaSize.call(this);\n this.change('input', v);\n }\n}\n\nfunction setTextareaRange(position) {\n const { el } = this.textEl;\n setTimeout(() => {\n el.focus();\n el.setSelectionRange(position, position);\n }, 0);\n}\n\nfunction setText(text, position) {\n const { textEl, textlineEl } = this;\n // firefox bug\n textEl.el.blur();\n\n textEl.val(text);\n textlineEl.html(text);\n setTextareaRange.call(this, position);\n}\n\nfunction suggestItemClick(it) {\n const { inputText, validator } = this;\n let position = 0;\n if (validator && validator.type === 'list') {\n this.inputText = it;\n position = this.inputText.length;\n } else {\n const start = inputText.lastIndexOf('=');\n const sit = inputText.substring(0, start + 1);\n let eit = inputText.substring(start + 1);\n if (eit.indexOf(')') !== -1) {\n eit = eit.substring(eit.indexOf(')'));\n } else {\n eit = '';\n }\n this.inputText = `${sit + it.key}(`;\n // console.log('inputText:', this.inputText);\n position = this.inputText.length;\n this.inputText += `)${eit}`;\n }\n setText.call(this, this.inputText, position);\n}\n\nfunction resetSuggestItems() {\n this.suggest.setItems(this.formulas);\n}\n\nfunction dateFormat(d) {\n let month = d.getMonth() + 1;\n let date = d.getDate();\n if (month < 10) month = `0${month}`;\n if (date < 10) date = `0${date}`;\n return `${d.getFullYear()}-${month}-${date}`;\n}\n\nexport default class Editor {\n constructor(formulas, viewFn, rowHeight) {\n this.viewFn = viewFn;\n this.rowHeight = rowHeight;\n this.formulas = formulas;\n this.suggest = new Suggest(formulas, (it) => {\n suggestItemClick.call(this, it);\n });\n this.datepicker = new Datepicker();\n this.datepicker.change((d) => {\n // console.log('d:', d);\n this.setText(dateFormat(d));\n this.clear();\n });\n this.areaEl = h('div', `${cssPrefix}-editor-area`)\n .children(\n this.textEl = h('textarea', '')\n .on('input', evt => inputEventHandler.call(this, evt))\n .on('paste.stop', () => {})\n .on('keydown', evt => keydownEventHandler.call(this, evt)),\n this.textlineEl = h('div', 'textline'),\n this.suggest.el,\n this.datepicker.el,\n )\n .on('mousemove.stop', () => {})\n .on('mousedown.stop', () => {});\n this.el = h('div', `${cssPrefix}-editor`)\n .child(this.areaEl).hide();\n this.suggest.bindInputEvents(this.textEl);\n\n this.areaOffset = null;\n this.freeze = { w: 0, h: 0 };\n this.cell = null;\n this.inputText = '';\n this.change = () => {};\n }\n\n setFreezeLengths(width, height) {\n this.freeze.w = width;\n this.freeze.h = height;\n }\n\n clear() {\n // const { cell } = this;\n // const cellText = (cell && cell.text) || '';\n if (this.inputText !== '') {\n this.change('finished', this.inputText);\n }\n this.cell = null;\n this.areaOffset = null;\n this.inputText = '';\n this.el.hide();\n this.textEl.val('');\n this.textlineEl.html('');\n resetSuggestItems.call(this);\n this.datepicker.hide();\n }\n\n setOffset(offset, suggestPosition = 'top') {\n const {\n textEl, areaEl, suggest, freeze, el,\n } = this;\n if (offset) {\n this.areaOffset = offset;\n const {\n left, top, width, height, l, t,\n } = offset;\n // console.log('left:', left, ',top:', top, ', freeze:', freeze);\n const elOffset = { left: 0, top: 0 };\n // top left\n if (freeze.w > l && freeze.h > t) {\n //\n } else if (freeze.w < l && freeze.h < t) {\n elOffset.left = freeze.w;\n elOffset.top = freeze.h;\n } else if (freeze.w > l) {\n elOffset.top = freeze.h;\n } else if (freeze.h > t) {\n elOffset.left = freeze.w;\n }\n el.offset(elOffset);\n areaEl.offset({ left: left - elOffset.left - 0.8, top: top - elOffset.top - 0.8 });\n textEl.offset({ width: width - 9 + 0.8, height: height - 3 + 0.8 });\n const sOffset = { left: 0 };\n sOffset[suggestPosition] = height;\n suggest.setOffset(sOffset);\n suggest.hide();\n }\n }\n\n setCell(cell, validator) {\n // console.log('::', validator);\n const { el, datepicker, suggest } = this;\n el.show();\n this.cell = cell;\n const text = (cell && cell.text) || '';\n this.setText(text);\n\n this.validator = validator;\n if (validator) {\n const { type } = validator;\n if (type === 'date') {\n datepicker.show();\n if (!/^\\s*$/.test(text)) {\n datepicker.setValue(text);\n }\n }\n if (type === 'list') {\n suggest.setItems(validator.values());\n suggest.search('');\n }\n }\n }\n\n setText(text) {\n this.inputText = text;\n // console.log('text>>:', text);\n setText.call(this, text, text.length);\n resetTextareaSize.call(this);\n }\n}\n","import { Element } from './element';\nimport { cssPrefix } from '../config';\nimport { t } from '../locale/locale';\n\nexport default class Button extends Element {\n // type: primary\n constructor(title, type = '') {\n super('div', `${cssPrefix}-button ${type}`);\n this.child(t(`button.${title}`));\n }\n}\n","/* global window */\nfunction dpr() {\n return window.devicePixelRatio || 1;\n}\n\nfunction thinLineWidth() {\n return dpr() - 0.5;\n}\n\nfunction npx(px) {\n return parseInt(px * dpr(), 10);\n}\n\nfunction npxLine(px) {\n const n = npx(px);\n return n > 0 ? n - 0.5 : 0.5;\n}\n\nclass DrawBox {\n constructor(x, y, w, h, padding = 0) {\n this.x = x;\n this.y = y;\n this.width = w;\n this.height = h;\n this.padding = padding;\n this.bgcolor = '#ffffff';\n // border: [width, style, color]\n this.borderTop = null;\n this.borderRight = null;\n this.borderBottom = null;\n this.borderLeft = null;\n }\n\n setBorders({\n top, bottom, left, right,\n }) {\n if (top) this.borderTop = top;\n if (right) this.borderRight = right;\n if (bottom) this.borderBottom = bottom;\n if (left) this.borderLeft = left;\n }\n\n innerWidth() {\n return this.width - (this.padding * 2) - 2;\n }\n\n innerHeight() {\n return this.height - (this.padding * 2) - 2;\n }\n\n textx(align) {\n const { width, padding } = this;\n let { x } = this;\n if (align === 'left') {\n x += padding;\n } else if (align === 'center') {\n x += width / 2;\n } else if (align === 'right') {\n x += width - padding;\n }\n return x;\n }\n\n texty(align, h) {\n const { height, padding } = this;\n let { y } = this;\n if (align === 'top') {\n y += padding;\n } else if (align === 'middle') {\n y += height / 2 - h / 2;\n } else if (align === 'bottom') {\n y += height - padding - h;\n }\n return y;\n }\n\n topxys() {\n const { x, y, width } = this;\n return [[x, y], [x + width, y]];\n }\n\n rightxys() {\n const {\n x, y, width, height,\n } = this;\n return [[x + width, y], [x + width, y + height]];\n }\n\n bottomxys() {\n const {\n x, y, width, height,\n } = this;\n return [[x, y + height], [x + width, y + height]];\n }\n\n leftxys() {\n const {\n x, y, height,\n } = this;\n return [[x, y], [x, y + height]];\n }\n}\n\nfunction drawFontLine(type, tx, ty, align, valign, blheight, blwidth) {\n const floffset = { x: 0, y: 0 };\n if (type === 'underline') {\n if (valign === 'bottom') {\n floffset.y = 0;\n } else if (valign === 'top') {\n floffset.y = -(blheight + 2);\n } else {\n floffset.y = -blheight / 2;\n }\n } else if (type === 'strike') {\n if (valign === 'bottom') {\n floffset.y = blheight / 2;\n } else if (valign === 'top') {\n floffset.y = -((blheight / 2) + 2);\n }\n }\n\n if (align === 'center') {\n floffset.x = blwidth / 2;\n } else if (align === 'right') {\n floffset.x = blwidth;\n }\n this.line(\n [tx - floffset.x, ty - floffset.y],\n [tx - floffset.x + blwidth, ty - floffset.y],\n );\n}\n\nclass Draw {\n constructor(el, width, height) {\n this.el = el;\n this.ctx = el.getContext('2d');\n this.resize(width, height);\n this.ctx.scale(dpr(), dpr());\n }\n\n resize(width, height) {\n // console.log('dpr:', dpr);\n this.el.style.width = `${width}px`;\n this.el.style.height = `${height}px`;\n this.el.width = npx(width);\n this.el.height = npx(height);\n }\n\n clear() {\n const { width, height } = this.el;\n this.ctx.clearRect(0, 0, width, height);\n return this;\n }\n\n attr(options) {\n Object.assign(this.ctx, options);\n return this;\n }\n\n save() {\n this.ctx.save();\n this.ctx.beginPath();\n return this;\n }\n\n restore() {\n this.ctx.restore();\n return this;\n }\n\n beginPath() {\n this.ctx.beginPath();\n return this;\n }\n\n translate(x, y) {\n this.ctx.translate(npx(x), npx(y));\n return this;\n }\n\n scale(x, y) {\n this.ctx.scale(x, y);\n return this;\n }\n\n clearRect(x, y, w, h) {\n this.ctx.clearRect(x, y, w, h);\n return this;\n }\n\n fillRect(x, y, w, h) {\n this.ctx.fillRect(npx(x) - 0.5, npx(y) - 0.5, npx(w), npx(h));\n return this;\n }\n\n fillText(text, x, y) {\n this.ctx.fillText(text, npx(x), npx(y));\n return this;\n }\n\n /*\n txt: render text\n box: DrawBox\n attr: {\n align: left | center | right\n valign: top | middle | bottom\n color: '#333333',\n strike: false,\n font: {\n name: 'Arial',\n size: 14,\n bold: false,\n italic: false,\n }\n }\n textWrap: text wrapping\n */\n text(mtxt, box, attr = {}, textWrap = true) {\n const { ctx } = this;\n const {\n align, valign, font, color, strike, underline,\n } = attr;\n const tx = box.textx(align);\n ctx.save();\n ctx.beginPath();\n this.attr({\n textAlign: align,\n textBaseline: valign,\n font: `${font.italic ? 'italic' : ''} ${font.bold ? 'bold' : ''} ${npx(font.size)}px ${font.name}`,\n fillStyle: color,\n strokeStyle: color,\n });\n const txts = `${mtxt}`.split('\\n');\n const biw = box.innerWidth();\n const ntxts = [];\n txts.forEach((it) => {\n const txtWidth = ctx.measureText(it).width;\n if (textWrap && txtWidth > npx(biw)) {\n let textLine = { w: 0, len: 0, start: 0 };\n for (let i = 0; i < it.length; i += 1) {\n if (textLine.w >= npx(biw)) {\n ntxts.push(it.substr(textLine.start, textLine.len));\n textLine = { w: 0, len: 0, start: i };\n }\n textLine.len += 1;\n textLine.w += ctx.measureText(it[i]).width + 1;\n }\n if (textLine.len > 0) {\n ntxts.push(it.substr(textLine.start, textLine.len));\n }\n } else {\n ntxts.push(it);\n }\n });\n const txtHeight = (ntxts.length - 1) * (font.size + 2);\n let ty = box.texty(valign, txtHeight);\n ntxts.forEach((txt) => {\n const txtWidth = ctx.measureText(txt).width;\n this.fillText(txt, tx, ty);\n if (strike) {\n drawFontLine.call(this, 'strike', tx, ty, align, valign, font.size, txtWidth);\n }\n if (underline) {\n drawFontLine.call(this, 'underline', tx, ty, align, valign, font.size, txtWidth);\n }\n ty += font.size + 2;\n });\n ctx.restore();\n return this;\n }\n\n border(style, color) {\n const { ctx } = this;\n ctx.lineWidth = thinLineWidth;\n ctx.strokeStyle = color;\n // console.log('style:', style);\n if (style === 'medium') {\n ctx.lineWidth = npx(2) - 0.5;\n } else if (style === 'thick') {\n ctx.lineWidth = npx(3);\n } else if (style === 'dashed') {\n ctx.setLineDash([npx(3), npx(2)]);\n } else if (style === 'dotted') {\n ctx.setLineDash([npx(1), npx(1)]);\n } else if (style === 'double') {\n ctx.setLineDash([npx(2), 0]);\n }\n return this;\n }\n\n line(...xys) {\n const { ctx } = this;\n if (xys.length > 1) {\n ctx.beginPath();\n const [x, y] = xys[0];\n ctx.moveTo(npxLine(x), npxLine(y));\n for (let i = 1; i < xys.length; i += 1) {\n const [x1, y1] = xys[i];\n ctx.lineTo(npxLine(x1), npxLine(y1));\n }\n ctx.stroke();\n }\n return this;\n }\n\n strokeBorders(box) {\n const { ctx } = this;\n ctx.save();\n // border\n const {\n borderTop, borderRight, borderBottom, borderLeft,\n } = box;\n if (borderTop) {\n this.border(...borderTop);\n // console.log('box.topxys:', box.topxys());\n this.line(...box.topxys());\n }\n if (borderRight) {\n this.border(...borderRight);\n this.line(...box.rightxys());\n }\n if (borderBottom) {\n this.border(...borderBottom);\n this.line(...box.bottomxys());\n }\n if (borderLeft) {\n this.border(...borderLeft);\n this.line(...box.leftxys());\n }\n ctx.restore();\n }\n\n dropdown(box) {\n const { ctx } = this;\n const {\n x, y, width, height,\n } = box;\n const sx = x + width - 15;\n const sy = y + height - 15;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(npx(sx), npx(sy));\n ctx.lineTo(npx(sx + 8), npx(sy));\n ctx.lineTo(npx(sx + 4), npx(sy + 6));\n ctx.closePath();\n ctx.fillStyle = 'rgba(0, 0, 0, .45)';\n ctx.fill();\n ctx.restore();\n }\n\n error(box) {\n const { ctx } = this;\n const { x, y, width } = box;\n const sx = x + width - 1;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(npx(sx - 8), npx(y - 1));\n ctx.lineTo(npx(sx), npx(y - 1));\n ctx.lineTo(npx(sx), npx(y + 8));\n ctx.closePath();\n ctx.fillStyle = 'rgba(255, 0, 0, .65)';\n ctx.fill();\n ctx.restore();\n }\n\n frozen(box) {\n const { ctx } = this;\n const { x, y, width } = box;\n const sx = x + width - 1;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(npx(sx - 8), npx(y - 1));\n ctx.lineTo(npx(sx), npx(y - 1));\n ctx.lineTo(npx(sx), npx(y + 8));\n ctx.closePath();\n ctx.fillStyle = 'rgba(0, 255, 0, .85)';\n ctx.fill();\n ctx.restore();\n }\n\n rect(box, dtextcb) {\n const { ctx } = this;\n const {\n x, y, width, height, bgcolor,\n } = box;\n ctx.save();\n ctx.beginPath();\n ctx.fillStyle = bgcolor || '#fff';\n ctx.rect(npxLine(x + 1), npxLine(y + 1), npx(width - 2), npx(height - 2));\n ctx.clip();\n ctx.fill();\n dtextcb();\n ctx.restore();\n }\n}\n\nexport default {};\nexport {\n Draw,\n DrawBox,\n thinLineWidth,\n npx,\n};\n","// docs\nimport './_.prototypes';\n\n/** default font list\n * @type {BaseFont[]}\n */\nconst baseFonts = [\n { key: 'Arial', title: 'Arial' },\n { key: 'Helvetica', title: 'Helvetica' },\n { key: 'Source Sans Pro', title: 'Source Sans Pro' },\n { key: 'Comic Sans MS', title: 'Comic Sans MS' },\n { key: 'Courier New', title: 'Courier New' },\n { key: 'Verdana', title: 'Verdana' },\n { key: 'Lato', title: 'Lato' },\n];\n\n/** default fontSize list\n * @type {FontSize[]}\n */\nconst fontSizes = [\n { pt: 7.5, px: 10 },\n { pt: 8, px: 11 },\n { pt: 9, px: 12 },\n { pt: 10, px: 13 },\n { pt: 10.5, px: 14 },\n { pt: 11, px: 15 },\n { pt: 12, px: 16 },\n { pt: 14, px: 18.7 },\n { pt: 15, px: 20 },\n { pt: 16, px: 21.3 },\n { pt: 18, px: 24 },\n { pt: 22, px: 29.3 },\n { pt: 24, px: 32 },\n { pt: 26, px: 34.7 },\n { pt: 36, px: 48 },\n { pt: 42, px: 56 },\n // { pt: 54, px: 71.7 },\n // { pt: 63, px: 83.7 },\n // { pt: 72, px: 95.6 },\n];\n\n/** map pt to px\n * @date 2019-10-10\n * @param {fontsizePT} pt\n * @returns {fontsizePX}\n */\nfunction getFontSizePxByPt(pt) {\n for (let i = 0; i < fontSizes.length; i += 1) {\n const fontSize = fontSizes[i];\n if (fontSize.pt === pt) {\n return fontSize.px;\n }\n }\n return pt;\n}\n\n/** transform baseFonts to map\n * @date 2019-10-10\n * @param {BaseFont[]} [ary=[]]\n * @returns {object}\n */\nfunction fonts(ary = []) {\n const map = {};\n baseFonts.concat(ary).forEach((f) => {\n map[f.key] = f;\n });\n return map;\n}\n\nexport default {};\nexport {\n fontSizes,\n fonts,\n baseFonts,\n getFontSizePxByPt,\n};\n","import { expr2xy, xy2expr } from './alphabet';\nimport { numberCalc } from './helper';\n\n// Converting infix expression to a suffix expression\n// src: AVERAGE(SUM(A1,A2), B1) + 50 + B20\n// return: [A1, A2], SUM[, B1],AVERAGE,50,+,B20,+\nconst infixExprToSuffixExpr = (src) => {\n const operatorStack = [];\n const stack = [];\n let subStrs = []; // SUM, A1, B2, 50 ...\n let fnArgType = 0; // 1 => , 2 => :\n let fnArgOperator = '';\n let fnArgsLen = 1; // A1,A2,A3...\n let oldc = '';\n for (let i = 0; i < src.length; i += 1) {\n const c = src.charAt(i);\n if (c !== ' ') {\n if (c >= 'a' && c <= 'z') {\n subStrs.push(c.toUpperCase());\n } else if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c === '.') {\n subStrs.push(c);\n } else if (c === '\"') {\n i += 1;\n while (src.charAt(i) !== '\"') {\n subStrs.push(src.charAt(i));\n i += 1;\n }\n stack.push(`\"${subStrs.join('')}`);\n subStrs = [];\n } else if (c === '-' && /[+\\-*/,(]/.test(oldc)) {\n subStrs.push(c);\n } else {\n // console.log('subStrs:', subStrs.join(''), stack);\n if (c !== '(' && subStrs.length > 0) {\n stack.push(subStrs.join(''));\n }\n if (c === ')') {\n let c1 = operatorStack.pop();\n if (fnArgType === 2) {\n // fn argument range => A1:B5\n try {\n const [ex, ey] = expr2xy(stack.pop());\n const [sx, sy] = expr2xy(stack.pop());\n // console.log('::', sx, sy, ex, ey);\n let rangelen = 0;\n for (let x = sx; x <= ex; x += 1) {\n for (let y = sy; y <= ey; y += 1) {\n stack.push(xy2expr(x, y));\n rangelen += 1;\n }\n }\n stack.push([c1, rangelen]);\n } catch (e) {\n // console.log(e);\n }\n } else if (fnArgType === 1 || fnArgType === 3) {\n if (fnArgType === 3) stack.push(fnArgOperator);\n // fn argument => A1,A2,B5\n stack.push([c1, fnArgsLen]);\n fnArgsLen = 1;\n } else {\n // console.log('c1:', c1, fnArgType, stack, operatorStack);\n while (c1 !== '(') {\n stack.push(c1);\n if (operatorStack.length <= 0) break;\n c1 = operatorStack.pop();\n }\n }\n fnArgType = 0;\n } else if (c === '=' || c === '>' || c === '<') {\n const nc = src.charAt(i + 1);\n fnArgOperator = c;\n if (nc === '=' || nc === '-') {\n fnArgOperator += nc;\n i += 1;\n }\n fnArgType = 3;\n } else if (c === ':') {\n fnArgType = 2;\n } else if (c === ',') {\n if (fnArgType === 3) {\n stack.push(fnArgOperator);\n }\n fnArgType = 1;\n fnArgsLen += 1;\n } else if (c === '(' && subStrs.length > 0) {\n // function\n operatorStack.push(subStrs.join(''));\n } else {\n // priority: */ > +-\n // console.log('xxxx:', operatorStack, c, stack);\n if (operatorStack.length > 0 && (c === '+' || c === '-')) {\n let top = operatorStack[operatorStack.length - 1];\n if (top !== '(') stack.push(operatorStack.pop());\n if (top === '*' || top === '/') {\n while (operatorStack.length > 0) {\n top = operatorStack[operatorStack.length - 1];\n if (top !== '(') stack.push(operatorStack.pop());\n else break;\n }\n }\n } else if (operatorStack.length > 0) {\n const top = operatorStack[operatorStack.length - 1];\n if (top === '*' || top === '/') stack.push(operatorStack.pop());\n }\n operatorStack.push(c);\n }\n subStrs = [];\n }\n oldc = c;\n }\n }\n if (subStrs.length > 0) {\n stack.push(subStrs.join(''));\n }\n while (operatorStack.length > 0) {\n stack.push(operatorStack.pop());\n }\n return stack;\n};\n\nconst evalSubExpr = (subExpr, cellRender) => {\n const [fl] = subExpr;\n let expr = subExpr;\n if (fl === '\"') {\n return subExpr.substring(1);\n }\n let ret = 1;\n if (fl === '-') {\n expr = subExpr.substring(1);\n ret = -1;\n }\n if (expr[0] >= '0' && expr[0] <= '9') {\n return ret * Number(expr);\n }\n const [x, y] = expr2xy(expr);\n return ret * cellRender(x, y);\n};\n\n// evaluate the suffix expression\n// srcStack: <= infixExprToSufixExpr\n// formulaMap: {'SUM': {}, ...}\n// cellRender: (x, y) => {}\nconst evalSuffixExpr = (srcStack, formulaMap, cellRender, cellList) => {\n const stack = [];\n // console.log(':::::formulaMap:', formulaMap);\n for (let i = 0; i < srcStack.length; i += 1) {\n // console.log(':::>>>', srcStack[i]);\n const expr = srcStack[i];\n const fc = expr[0];\n if (expr === '+') {\n const top = stack.pop();\n stack.push(numberCalc('+', stack.pop(), top));\n } else if (expr === '-') {\n if (stack.length === 1) {\n const top = stack.pop();\n stack.push(numberCalc('*', top, -1));\n } else {\n const top = stack.pop();\n stack.push(numberCalc('-', stack.pop(), top));\n }\n } else if (expr === '*') {\n stack.push(numberCalc('*', stack.pop(), stack.pop()));\n } else if (expr === '/') {\n const top = stack.pop();\n stack.push(numberCalc('/', stack.pop(), top));\n } else if (fc === '=' || fc === '>' || fc === '<') {\n let top = stack.pop();\n if (!Number.isNaN(top)) top = Number(top);\n let left = stack.pop();\n if (!Number.isNaN(left)) left = Number(left);\n let ret = false;\n if (fc === '=') {\n ret = (left === top);\n } else if (expr === '>') {\n ret = (left > top);\n } else if (expr === '>=') {\n ret = (left >= top);\n } else if (expr === '<') {\n ret = (left < top);\n } else if (expr === '<=') {\n ret = (left <= top);\n }\n stack.push(ret);\n } else if (Array.isArray(expr)) {\n const [formula, len] = expr;\n const params = [];\n for (let j = 0; j < len; j += 1) {\n params.push(stack.pop());\n }\n stack.push(formulaMap[formula].render(params.reverse()));\n } else {\n if (cellList.includes(expr)) {\n return 0;\n }\n if ((fc >= 'a' && fc <= 'z') || (fc >= 'A' && fc <= 'Z')) {\n cellList.push(expr);\n }\n stack.push(evalSubExpr(expr, cellRender));\n cellList.pop();\n }\n // console.log('stack:', stack);\n }\n return stack[0];\n};\n\nconst cellRender = (src, formulaMap, getCellText, cellList = []) => {\n if (src[0] === '=') {\n const stack = infixExprToSuffixExpr(src.substring(1));\n if (stack.length <= 0) return src;\n return evalSuffixExpr(\n stack,\n formulaMap,\n (x, y) => cellRender(getCellText(x, y), formulaMap, getCellText, cellList),\n cellList,\n );\n }\n return src;\n};\n\nexport default {\n render: cellRender,\n};\nexport {\n infixExprToSuffixExpr,\n};\n","/**\n formula:\n key\n title\n render\n*/\n/**\n * @typedef {object} Formula\n * @property {string} key\n * @property {function} title\n * @property {function} render\n */\nimport { tf } from '../locale/locale';\nimport { numberCalc } from './helper';\n\n/** @type {Formula[]} */\nconst baseFormulas = [\n {\n key: 'SUM',\n title: tf('formula.sum'),\n render: ary => ary.reduce((a, b) => numberCalc('+', a, b), 0),\n },\n {\n key: 'AVERAGE',\n title: tf('formula.average'),\n render: ary => ary.reduce((a, b) => Number(a) + Number(b), 0) / ary.length,\n },\n {\n key: 'MAX',\n title: tf('formula.max'),\n render: ary => Math.max(...ary.map(v => Number(v))),\n },\n {\n key: 'MIN',\n title: tf('formula.min'),\n render: ary => Math.min(...ary.map(v => Number(v))),\n },\n {\n key: 'IF',\n title: tf('formula._if'),\n render: ([b, t, f]) => (b ? t : f),\n },\n {\n key: 'AND',\n title: tf('formula.and'),\n render: ary => ary.every(it => it),\n },\n {\n key: 'OR',\n title: tf('formula.or'),\n render: ary => ary.some(it => it),\n },\n {\n key: 'CONCAT',\n title: tf('formula.concat'),\n render: ary => ary.join(''),\n },\n /* support: 1 + A1 + B2 * 3\n {\n key: 'DIVIDE',\n title: tf('formula.divide'),\n render: ary => ary.reduce((a, b) => Number(a) / Number(b)),\n },\n {\n key: 'PRODUCT',\n title: tf('formula.product'),\n render: ary => ary.reduce((a, b) => Number(a) * Number(b),1),\n },\n {\n key: 'SUBTRACT',\n title: tf('formula.subtract'),\n render: ary => ary.reduce((a, b) => Number(a) - Number(b)),\n },\n */\n];\n\nconst formulas = baseFormulas;\n\n// const formulas = (formulaAry = []) => {\n// const formulaMap = {};\n// baseFormulas.concat(formulaAry).forEach((f) => {\n// formulaMap[f.key] = f;\n// });\n// return formulaMap;\n// };\nconst formulam = {};\nbaseFormulas.forEach((f) => {\n formulam[f.key] = f;\n});\n\nexport default {\n};\n\nexport {\n formulam,\n formulas,\n baseFormulas,\n};\n","import { tf } from '../locale/locale';\n\nconst formatStringRender = v => v;\n\nconst formatNumberRender = (v) => {\n // match \"-12.1\" or \"12\" or \"12.1\"\n if (/^(-?\\d*.?\\d*)$/.test(v)) {\n const v1 = Number(v).toFixed(2).toString();\n const [first, ...parts] = v1.split('\\\\.');\n return [first.replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,'), ...parts];\n }\n return v;\n};\n\nconst baseFormats = [\n {\n key: 'normal',\n title: tf('format.normal'),\n type: 'string',\n render: formatStringRender,\n },\n {\n key: 'text',\n title: tf('format.text'),\n type: 'string',\n render: formatStringRender,\n },\n {\n key: 'number',\n title: tf('format.number'),\n type: 'number',\n label: '1,000.12',\n render: formatNumberRender,\n },\n {\n key: 'percent',\n title: tf('format.percent'),\n type: 'number',\n label: '10.12%',\n render: v => `${v}%`,\n },\n {\n key: 'rmb',\n title: tf('format.rmb'),\n type: 'number',\n label: '¥10.00',\n render: v => `¥${formatNumberRender(v)}`,\n },\n {\n key: 'usd',\n title: tf('format.usd'),\n type: 'number',\n label: '$10.00',\n render: v => `$${formatNumberRender(v)}`,\n },\n {\n key: 'eur',\n title: tf('format.eur'),\n type: 'number',\n label: '€10.00',\n render: v => `€${formatNumberRender(v)}`,\n },\n {\n key: 'date',\n title: tf('format.date'),\n type: 'date',\n label: '26/09/2008',\n render: formatStringRender,\n },\n {\n key: 'time',\n title: tf('format.time'),\n type: 'date',\n label: '15:59:00',\n render: formatStringRender,\n },\n {\n key: 'datetime',\n title: tf('format.datetime'),\n type: 'date',\n label: '26/09/2008 15:59:00',\n render: formatStringRender,\n },\n {\n key: 'duration',\n title: tf('format.duration'),\n type: 'date',\n label: '24:01:00',\n render: formatStringRender,\n },\n];\n\n// const formats = (ary = []) => {\n// const map = {};\n// baseFormats.concat(ary).forEach((f) => {\n// map[f.key] = f;\n// });\n// return map;\n// };\nconst formatm = {};\nbaseFormats.forEach((f) => {\n formatm[f.key] = f;\n});\n\nexport default {\n};\nexport {\n formatm,\n baseFormats,\n};\n","import { stringAt } from '../core/alphabet';\nimport { getFontSizePxByPt } from '../core/font';\nimport _cell from '../core/cell';\nimport { formulam } from '../core/formula';\nimport { formatm } from '../core/format';\n\nimport {\n Draw, DrawBox, thinLineWidth, npx,\n} from '../canvas/draw';\n// gobal var\nconst cellPaddingWidth = 5;\nconst tableFixedHeaderCleanStyle = { fillStyle: '#f4f5f8' };\nconst tableGridStyle = {\n fillStyle: '#fff',\n lineWidth: thinLineWidth,\n strokeStyle: '#e6e6e6',\n};\nfunction tableFixedHeaderStyle() {\n return {\n textAlign: 'center',\n textBaseline: 'middle',\n font: `500 ${npx(12)}px Source Sans Pro`,\n fillStyle: '#585757',\n lineWidth: thinLineWidth(),\n strokeStyle: '#e6e6e6',\n };\n}\n\nfunction getDrawBox(data, rindex, cindex, yoffset = 0) {\n const {\n left, top, width, height,\n } = data.cellRect(rindex, cindex);\n return new DrawBox(left, top + yoffset, width, height, cellPaddingWidth);\n}\n/*\nfunction renderCellBorders(bboxes, translateFunc) {\n const { draw } = this;\n if (bboxes) {\n const rset = new Set();\n // console.log('bboxes:', bboxes);\n bboxes.forEach(({ ri, ci, box }) => {\n if (!rset.has(ri)) {\n rset.add(ri);\n translateFunc(ri);\n }\n draw.strokeBorders(box);\n });\n }\n}\n*/\n\nexport function renderCell(draw, data, rindex, cindex, yoffset = 0) {\n const { sortedRowMap, rows, cols } = data;\n if (rows.isHide(rindex) || cols.isHide(cindex)) return;\n let nrindex = rindex;\n if (sortedRowMap.has(rindex)) {\n nrindex = sortedRowMap.get(rindex);\n }\n\n const cell = data.getCell(nrindex, cindex);\n if (cell === null) return;\n let frozen = false;\n if ('editable' in cell && cell.editable === false) {\n frozen = true;\n }\n\n const style = data.getCellStyleOrDefault(nrindex, cindex);\n const dbox = getDrawBox(data, rindex, cindex, yoffset);\n dbox.bgcolor = style.bgcolor;\n if (style.border !== undefined) {\n dbox.setBorders(style.border);\n // bboxes.push({ ri: rindex, ci: cindex, box: dbox });\n draw.strokeBorders(dbox);\n }\n draw.rect(dbox, () => {\n // render text\n let cellText = '';\n if (!data.settings.evalPaused) {\n cellText = _cell.render(cell.text || '', formulam, (y, x) => (data.getCellTextOrDefault(x, y)));\n } else {\n cellText = cell.text || '';\n }\n if (style.format) {\n // console.log(data.formatm, '>>', cell.format);\n cellText = formatm[style.format].render(cellText);\n }\n const font = Object.assign({}, style.font);\n font.size = getFontSizePxByPt(font.size);\n // console.log('style:', style);\n draw.text(cellText, dbox, {\n align: style.align,\n valign: style.valign,\n font,\n color: style.color,\n strike: style.strike,\n underline: style.underline,\n }, style.textwrap);\n // error\n const error = data.validations.getError(rindex, cindex);\n if (error) {\n // console.log('error:', rindex, cindex, error);\n draw.error(dbox);\n }\n if (frozen) {\n draw.frozen(dbox);\n }\n });\n}\n\nfunction renderAutofilter(viewRange) {\n const { data, draw } = this;\n if (viewRange) {\n const { autoFilter } = data;\n if (!autoFilter.active()) return;\n const afRange = autoFilter.hrange();\n if (viewRange.intersects(afRange)) {\n afRange.each((ri, ci) => {\n const dbox = getDrawBox(data, ri, ci);\n draw.dropdown(dbox);\n });\n }\n }\n}\n\nfunction renderContent(viewRange, fw, fh, tx, ty) {\n const { draw, data } = this;\n draw.save();\n draw.translate(fw, fh)\n .translate(tx, ty);\n\n const { exceptRowSet } = data;\n // const exceptRows = Array.from(exceptRowSet);\n const filteredTranslateFunc = (ri) => {\n const ret = exceptRowSet.has(ri);\n if (ret) {\n const height = data.rows.getHeight(ri);\n draw.translate(0, -height);\n }\n return !ret;\n };\n\n const exceptRowTotalHeight = data.exceptRowTotalHeight(viewRange.sri, viewRange.eri);\n // 1 render cell\n draw.save();\n draw.translate(0, -exceptRowTotalHeight);\n viewRange.each((ri, ci) => {\n renderCell(draw, data, ri, ci);\n }, ri => filteredTranslateFunc(ri));\n draw.restore();\n\n\n // 2 render mergeCell\n const rset = new Set();\n draw.save();\n draw.translate(0, -exceptRowTotalHeight);\n data.eachMergesInView(viewRange, ({ sri, sci, eri }) => {\n if (!exceptRowSet.has(sri)) {\n renderCell(draw, data, sri, sci);\n } else if (!rset.has(sri)) {\n rset.add(sri);\n const height = data.rows.sumHeight(sri, eri + 1);\n draw.translate(0, -height);\n }\n });\n draw.restore();\n\n // 3 render autofilter\n renderAutofilter.call(this, viewRange);\n\n draw.restore();\n}\n\nfunction renderSelectedHeaderCell(x, y, w, h) {\n const { draw } = this;\n draw.save();\n draw.attr({ fillStyle: 'rgba(75, 137, 255, 0.08)' })\n .fillRect(x, y, w, h);\n draw.restore();\n}\n\n// viewRange\n// type: all | left | top\n// w: the fixed width of header\n// h: the fixed height of header\n// tx: moving distance on x-axis\n// ty: moving distance on y-axis\nfunction renderFixedHeaders(type, viewRange, w, h, tx, ty) {\n const { draw, data } = this;\n const sumHeight = viewRange.h; // rows.sumHeight(viewRange.sri, viewRange.eri + 1);\n const sumWidth = viewRange.w; // cols.sumWidth(viewRange.sci, viewRange.eci + 1);\n const nty = ty + h;\n const ntx = tx + w;\n\n draw.save();\n // draw rect background\n draw.attr(tableFixedHeaderCleanStyle);\n if (type === 'all' || type === 'left') draw.fillRect(0, nty, w, sumHeight);\n if (type === 'all' || type === 'top') draw.fillRect(ntx, 0, sumWidth, h);\n\n const {\n sri, sci, eri, eci,\n } = data.selector.range;\n // console.log(data.selectIndexes);\n // draw text\n // text font, align...\n draw.attr(tableFixedHeaderStyle());\n // y-header-text\n if (type === 'all' || type === 'left') {\n data.rowEach(viewRange.sri, viewRange.eri, (i, y1, rowHeight) => {\n const y = nty + y1;\n const ii = i;\n draw.line([0, y], [w, y]);\n if (sri <= ii && ii < eri + 1) {\n renderSelectedHeaderCell.call(this, 0, y, w, rowHeight);\n }\n draw.fillText(ii + 1, w / 2, y + (rowHeight / 2));\n if (i > 0 && data.rows.isHide(i - 1)) {\n draw.save();\n draw.attr({ strokeStyle: '#c6c6c6' });\n draw.line([5, y + 5], [w - 5, y + 5]);\n draw.restore();\n }\n });\n draw.line([0, sumHeight + nty], [w, sumHeight + nty]);\n draw.line([w, nty], [w, sumHeight + nty]);\n }\n // x-header-text\n if (type === 'all' || type === 'top') {\n data.colEach(viewRange.sci, viewRange.eci, (i, x1, colWidth) => {\n const x = ntx + x1;\n const ii = i;\n draw.line([x, 0], [x, h]);\n if (sci <= ii && ii < eci + 1) {\n renderSelectedHeaderCell.call(this, x, 0, colWidth, h);\n }\n draw.fillText(stringAt(ii), x + (colWidth / 2), h / 2);\n if (i > 0 && data.cols.isHide(i - 1)) {\n draw.save();\n draw.attr({ strokeStyle: '#c6c6c6' });\n draw.line([x + 5, 5], [x + 5, h - 5]);\n draw.restore();\n }\n });\n draw.line([sumWidth + ntx, 0], [sumWidth + ntx, h]);\n draw.line([0, h], [sumWidth + ntx, h]);\n }\n draw.restore();\n}\n\nfunction renderFixedLeftTopCell(fw, fh) {\n const { draw } = this;\n draw.save();\n // left-top-cell\n draw.attr({ fillStyle: '#f4f5f8' })\n .fillRect(0, 0, fw, fh);\n draw.restore();\n}\n\nfunction renderContentGrid({\n sri, sci, eri, eci, w, h,\n}, fw, fh, tx, ty) {\n const { draw, data } = this;\n const { settings } = data;\n\n draw.save();\n draw.attr(tableGridStyle)\n .translate(fw + tx, fh + ty);\n // const sumWidth = cols.sumWidth(sci, eci + 1);\n // const sumHeight = rows.sumHeight(sri, eri + 1);\n // console.log('sumWidth:', sumWidth);\n // draw.clearRect(0, 0, w, h);\n if (!settings.showGrid) {\n draw.restore();\n return;\n }\n // console.log('rowStart:', rowStart, ', rowLen:', rowLen);\n data.rowEach(sri, eri, (i, y, ch) => {\n // console.log('y:', y);\n if (i !== sri) draw.line([0, y], [w, y]);\n if (i === eri) draw.line([0, y + ch], [w, y + ch]);\n });\n data.colEach(sci, eci, (i, x, cw) => {\n if (i !== sci) draw.line([x, 0], [x, h]);\n if (i === eci) draw.line([x + cw, 0], [x + cw, h]);\n });\n draw.restore();\n}\n\nfunction renderFreezeHighlightLine(fw, fh, ftw, fth) {\n const { draw, data } = this;\n const twidth = data.viewWidth() - fw;\n const theight = data.viewHeight() - fh;\n draw.save()\n .translate(fw, fh)\n .attr({ strokeStyle: 'rgba(75, 137, 255, .6)' });\n draw.line([0, fth], [twidth, fth]);\n draw.line([ftw, 0], [ftw, theight]);\n draw.restore();\n}\n\n/** end */\nclass Table {\n constructor(el, data) {\n this.el = el;\n this.draw = new Draw(el, data.viewWidth(), data.viewHeight());\n this.data = data;\n }\n\n resetData(data) {\n this.data = data;\n this.render();\n }\n\n render() {\n // resize canvas\n const { data } = this;\n const { rows, cols } = data;\n // fixed width of header\n const fw = cols.indexWidth;\n // fixed height of header\n const fh = rows.height;\n\n this.draw.resize(data.viewWidth(), data.viewHeight());\n this.clear();\n\n const viewRange = data.viewRange();\n // renderAll.call(this, viewRange, data.scroll);\n const tx = data.freezeTotalWidth();\n const ty = data.freezeTotalHeight();\n const { x, y } = data.scroll;\n // 1\n renderContentGrid.call(this, viewRange, fw, fh, tx, ty);\n renderContent.call(this, viewRange, fw, fh, -x, -y);\n renderFixedHeaders.call(this, 'all', viewRange, fw, fh, tx, ty);\n renderFixedLeftTopCell.call(this, fw, fh);\n const [fri, fci] = data.freeze;\n if (fri > 0 || fci > 0) {\n // 2\n if (fri > 0) {\n const vr = viewRange.clone();\n vr.sri = 0;\n vr.eri = fri - 1;\n vr.h = ty;\n renderContentGrid.call(this, vr, fw, fh, tx, 0);\n renderContent.call(this, vr, fw, fh, -x, 0);\n renderFixedHeaders.call(this, 'top', vr, fw, fh, tx, 0);\n }\n // 3\n if (fci > 0) {\n const vr = viewRange.clone();\n vr.sci = 0;\n vr.eci = fci - 1;\n vr.w = tx;\n renderContentGrid.call(this, vr, fw, fh, 0, ty);\n renderFixedHeaders.call(this, 'left', vr, fw, fh, 0, ty);\n renderContent.call(this, vr, fw, fh, 0, -y);\n }\n // 4\n const freezeViewRange = data.freezeViewRange();\n renderContentGrid.call(this, freezeViewRange, fw, fh, 0, 0);\n renderFixedHeaders.call(this, 'all', freezeViewRange, fw, fh, 0, 0);\n renderContent.call(this, freezeViewRange, fw, fh, 0, 0);\n // 5\n renderFreezeHighlightLine.call(this, fw, fh, tx, ty);\n }\n }\n\n clear() {\n this.draw.clear();\n }\n}\n\nexport default Table;\n","/* global window document */\nimport { h } from './element';\nimport { cssPrefix } from '../config';\nimport Button from './button';\nimport { Draw } from '../canvas/draw';\nimport { renderCell } from './table';\nimport { t } from '../locale/locale';\n\n// resolution: 72 => 595 x 842\n// 150 => 1240 x 1754\n// 200 => 1654 x 2339\n// 300 => 2479 x 3508\n// 96 * cm / 2.54 , 96 * cm / 2.54\n\nconst PAGER_SIZES = [\n ['A3', 11.69, 16.54],\n ['A4', 8.27, 11.69],\n ['A5', 5.83, 8.27],\n ['B4', 9.84, 13.90],\n ['B5', 6.93, 9.84],\n];\n\nconst PAGER_ORIENTATIONS = ['landscape', 'portrait'];\n\nfunction inches2px(inc) {\n return parseInt(96 * inc, 10);\n}\n\nfunction btnClick(type) {\n if (type === 'cancel') {\n this.el.hide();\n } else {\n this.toPrint();\n }\n}\n\nfunction pagerSizeChange(evt) {\n const { paper } = this;\n const { value } = evt.target;\n const ps = PAGER_SIZES[value];\n paper.w = inches2px(ps[1]);\n paper.h = inches2px(ps[2]);\n // console.log('paper:', ps, paper);\n this.preview();\n}\nfunction pagerOrientationChange(evt) {\n const { paper } = this;\n const { value } = evt.target;\n const v = PAGER_ORIENTATIONS[value];\n paper.orientation = v;\n this.preview();\n}\n\nexport default class Print {\n constructor(data) {\n this.paper = {\n w: inches2px(PAGER_SIZES[0][1]),\n h: inches2px(PAGER_SIZES[0][2]),\n padding: 50,\n orientation: PAGER_ORIENTATIONS[0],\n get width() {\n return this.orientation === 'landscape' ? this.h : this.w;\n },\n get height() {\n return this.orientation === 'landscape' ? this.w : this.h;\n },\n };\n this.data = data;\n this.el = h('div', `${cssPrefix}-print`)\n .children(\n h('div', `${cssPrefix}-print-bar`)\n .children(\n h('div', '-title').child('Print settings'),\n h('div', '-right').children(\n h('div', `${cssPrefix}-buttons`).children(\n new Button('cancel').on('click', btnClick.bind(this, 'cancel')),\n new Button('next', 'primary').on('click', btnClick.bind(this, 'next')),\n ),\n ),\n ),\n h('div', `${cssPrefix}-print-content`)\n .children(\n this.contentEl = h('div', '-content'),\n h('div', '-sider').child(\n h('form', '').children(\n h('fieldset', '').children(\n h('label', '').child(`${t('print.size')}`),\n h('select', '').children(\n ...PAGER_SIZES.map((it, index) => h('option', '').attr('value', index).child(`${it[0]} ( ${it[1]}''x${it[2]}'' )`)),\n ).on('change', pagerSizeChange.bind(this)),\n ),\n h('fieldset', '').children(\n h('label', '').child(`${t('print.orientation')}`),\n h('select', '').children(\n ...PAGER_ORIENTATIONS.map((it, index) => h('option', '').attr('value', index).child(`${t('print.orientations')[index]}`)),\n ).on('change', pagerOrientationChange.bind(this)),\n ),\n ),\n ),\n ),\n ).hide();\n }\n\n resetData(data) {\n this.data = data;\n }\n\n preview() {\n const { data, paper } = this;\n const { width, height, padding } = paper;\n const iwidth = width - padding * 2;\n const iheight = height - padding * 2;\n const cr = data.contentRange();\n const pages = parseInt(cr.h / iheight, 10) + 1;\n const scale = iwidth / cr.w;\n let left = padding;\n const top = padding;\n if (scale > 1) {\n left += (iwidth - cr.w) / 2;\n }\n let ri = 0;\n let yoffset = 0;\n this.contentEl.html('');\n this.canvases = [];\n const mViewRange = {\n sri: 0,\n sci: 0,\n eri: 0,\n eci: 0,\n };\n for (let i = 0; i < pages; i += 1) {\n let th = 0;\n let yo = 0;\n const wrap = h('div', `${cssPrefix}-canvas-card`);\n const canvas = h('canvas', `${cssPrefix}-canvas`);\n this.canvases.push(canvas.el);\n const draw = new Draw(canvas.el, width, height);\n // cell-content\n draw.save();\n draw.translate(left, top);\n if (scale < 1) draw.scale(scale, scale);\n // console.log('ri:', ri, cr.eri, yoffset);\n for (; ri <= cr.eri; ri += 1) {\n const rh = data.rows.getHeight(ri);\n th += rh;\n if (th < iheight) {\n for (let ci = 0; ci <= cr.eci; ci += 1) {\n renderCell(draw, data, ri, ci, yoffset);\n mViewRange.eci = ci;\n }\n } else {\n yo = -(th - rh);\n break;\n }\n }\n mViewRange.eri = ri;\n draw.restore();\n // merge-cell\n draw.save();\n draw.translate(left, top);\n if (scale < 1) draw.scale(scale, scale);\n const yof = yoffset;\n data.eachMergesInView(mViewRange, ({ sri, sci }) => {\n renderCell(draw, data, sri, sci, yof);\n });\n draw.restore();\n\n mViewRange.sri = mViewRange.eri;\n mViewRange.sci = mViewRange.eci;\n yoffset += yo;\n this.contentEl.child(h('div', `${cssPrefix}-canvas-card-wraper`).child(wrap.child(canvas)));\n }\n this.el.show();\n }\n\n toPrint() {\n this.el.hide();\n const { paper } = this;\n const iframe = h('iframe', '').hide();\n const { el } = iframe;\n window.document.body.appendChild(el);\n const { contentWindow } = el;\n const idoc = contentWindow.document;\n const style = document.createElement('style');\n style.innerHTML = `\n @page { size: ${paper.width}px ${paper.height}px; };\n canvas {\n page-break-before: auto; \n page-break-after: always;\n image-rendering: pixelated;\n };\n `;\n idoc.head.appendChild(style);\n this.canvases.forEach((it) => {\n const cn = it.cloneNode(false);\n const ctx = cn.getContext('2d');\n // ctx.imageSmoothingEnabled = true;\n ctx.drawImage(it, 0, 0);\n idoc.body.appendChild(cn);\n });\n contentWindow.print();\n }\n}\n","import { h } from './element';\nimport { bindClickoutside, unbindClickoutside } from './event';\nimport { cssPrefix } from '../config';\nimport { tf } from '../locale/locale';\n\nconst menuItems = [\n { key: 'copy', title: tf('contextmenu.copy'), label: 'Ctrl+C' },\n { key: 'cut', title: tf('contextmenu.cut'), label: 'Ctrl+X' },\n { key: 'paste', title: tf('contextmenu.paste'), label: 'Ctrl+V' },\n { key: 'paste-value', title: tf('contextmenu.pasteValue'), label: 'Ctrl+Shift+V' },\n { key: 'paste-format', title: tf('contextmenu.pasteFormat'), label: 'Ctrl+Alt+V' },\n { key: 'divider' },\n { key: 'insert-row', title: tf('contextmenu.insertRow') },\n { key: 'insert-column', title: tf('contextmenu.insertColumn') },\n { key: 'divider' },\n { key: 'delete-row', title: tf('contextmenu.deleteRow') },\n { key: 'delete-column', title: tf('contextmenu.deleteColumn') },\n { key: 'delete-cell-text', title: tf('contextmenu.deleteCellText') },\n { key: 'hide', title: tf('contextmenu.hide') },\n { key: 'divider' },\n { key: 'validation', title: tf('contextmenu.validation') },\n { key: 'divider' },\n { key: 'cell-printable', title: tf('contextmenu.cellprintable') },\n { key: 'cell-non-printable', title: tf('contextmenu.cellnonprintable') },\n { key: 'divider' },\n { key: 'cell-editable', title: tf('contextmenu.celleditable') },\n { key: 'cell-non-editable', title: tf('contextmenu.cellnoneditable') },\n];\n\nfunction buildMenuItem(item) {\n if (item.key === 'divider') {\n return h('div', `${cssPrefix}-item divider`);\n }\n return h('div', `${cssPrefix}-item`)\n .on('click', () => {\n this.itemClick(item.key);\n this.hide();\n })\n .children(\n item.title(),\n h('div', 'label').child(item.label || ''),\n );\n}\n\nfunction buildMenu() {\n return menuItems.map(it => buildMenuItem.call(this, it));\n}\n\nexport default class ContextMenu {\n constructor(viewFn, isHide = false) {\n this.menuItems = buildMenu.call(this);\n this.el = h('div', `${cssPrefix}-contextmenu`)\n .children(...this.menuItems)\n .hide();\n this.viewFn = viewFn;\n this.itemClick = () => {};\n this.isHide = isHide;\n this.setMode('range');\n }\n\n // row-col: the whole rows or the whole cols\n // range: select range\n setMode(mode) {\n const hideEl = this.menuItems[12];\n if (mode === 'row-col') {\n hideEl.show();\n } else {\n hideEl.hide();\n }\n }\n\n hide() {\n const { el } = this;\n el.hide();\n unbindClickoutside(el);\n }\n\n setPosition(x, y) {\n if (this.isHide) return;\n const { el } = this;\n const { width } = el.show().offset();\n const view = this.viewFn();\n const vhf = view.height / 2;\n let left = x;\n if (view.width - x <= width) {\n left -= width;\n }\n el.css('left', `${left}px`);\n if (y > vhf) {\n el.css('bottom', `${view.height - y}px`)\n .css('max-height', `${y}px`)\n .css('top', 'auto');\n } else {\n el.css('top', `${y}px`)\n .css('max-height', `${view.height - y}px`)\n .css('bottom', 'auto');\n }\n bindClickoutside(el);\n }\n}\n","/* global document */\nimport { h } from './element';\nimport { bind } from './event';\nimport { cssPrefix } from '../config';\n\nexport default function tooltip(html, target) {\n if (target.classList.contains('active')) {\n return;\n }\n const {\n left, top, width, height,\n } = target.getBoundingClientRect();\n const el = h('div', `${cssPrefix}-tooltip`).html(html).show();\n document.body.appendChild(el.el);\n const elBox = el.box();\n // console.log('elBox:', elBox);\n el.css('left', `${left + (width / 2) - (elBox.width / 2)}px`)\n .css('top', `${top + height + 2}px`);\n\n bind(target, 'mouseleave', () => {\n if (document.body.contains(el.el)) {\n document.body.removeChild(el.el);\n }\n });\n\n bind(target, 'click', () => {\n if (document.body.contains(el.el)) {\n document.body.removeChild(el.el);\n }\n });\n}\n","import { cssPrefix } from '../../config';\nimport tooltip from '../tooltip';\nimport { h } from '../element';\nimport { t } from '../../locale/locale';\n\nexport default class Item {\n // tooltip\n // tag: the subclass type\n // shortcut: shortcut key\n constructor(tag, shortcut, value) {\n this.tip = t(`toolbar.${tag.replace(/-[a-z]/g, c => c[1].toUpperCase())}`);\n if (shortcut) this.tip += ` (${shortcut})`;\n this.tag = tag;\n this.shortcut = shortcut;\n this.value = value;\n this.el = this.element();\n this.change = () => {};\n }\n\n element() {\n const { tip } = this;\n return h('div', `${cssPrefix}-toolbar-btn`)\n .on('mouseenter', (evt) => {\n tooltip(tip, evt.target);\n })\n .attr('data-tooltip', tip);\n }\n\n setState() {}\n}\n","import Item from './item';\n\nexport default class DropdownItem extends Item {\n dropdown() {}\n\n getValue(v) {\n return v;\n }\n\n element() {\n const { tag } = this;\n this.dd = this.dropdown();\n this.dd.change = it => this.change(tag, this.getValue(it));\n return super.element().child(\n this.dd,\n );\n }\n\n setState(v) {\n if (v) {\n this.value = v;\n this.dd.setTitle(v);\n }\n }\n}\n","import { Element, h } from './element';\nimport { bindClickoutside, unbindClickoutside } from './event';\nimport { cssPrefix } from '../config';\n\nexport default class Dropdown extends Element {\n constructor(title, width, showArrow, placement, ...children) {\n super('div', `${cssPrefix}-dropdown ${placement}`);\n this.title = title;\n this.change = () => {};\n this.headerClick = () => {};\n if (typeof title === 'string') {\n this.title = h('div', `${cssPrefix}-dropdown-title`).child(title);\n } else if (showArrow) {\n this.title.addClass('arrow-left');\n }\n this.contentEl = h('div', `${cssPrefix}-dropdown-content`)\n .css('width', width)\n .hide();\n\n this.setContentChildren(...children);\n\n this.headerEl = h('div', `${cssPrefix}-dropdown-header`);\n this.headerEl.on('click', () => {\n if (this.contentEl.css('display') !== 'block') {\n this.show();\n } else {\n this.hide();\n }\n }).children(\n this.title,\n showArrow ? h('div', `${cssPrefix}-icon arrow-right`).child(\n h('div', `${cssPrefix}-icon-img arrow-down`),\n ) : '',\n );\n this.children(this.headerEl, this.contentEl);\n }\n\n setContentChildren(...children) {\n this.contentEl.html('');\n if (children.length > 0) {\n this.contentEl.children(...children);\n }\n }\n\n setTitle(title) {\n this.title.html(title);\n this.hide();\n }\n\n show() {\n const { contentEl } = this;\n contentEl.show();\n this.parent().active();\n bindClickoutside(this.parent(), () => {\n this.hide();\n });\n }\n\n hide() {\n this.parent().active(false);\n this.contentEl.hide();\n unbindClickoutside(this.parent());\n }\n}\n","import Dropdown from './dropdown';\nimport { h } from './element';\nimport Icon from './icon';\nimport { cssPrefix } from '../config';\n\nfunction buildItemWithIcon(iconName) {\n return h('div', `${cssPrefix}-item`).child(new Icon(iconName));\n}\n\nexport default class DropdownAlign extends Dropdown {\n constructor(aligns, align) {\n const icon = new Icon(`align-${align}`);\n const naligns = aligns.map(it => buildItemWithIcon(`align-${it}`)\n .on('click', () => {\n this.setTitle(it);\n this.change(it);\n }));\n super(icon, 'auto', true, 'bottom-left', ...naligns);\n }\n\n setTitle(align) {\n this.title.setName(`align-${align}`);\n this.hide();\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownAlign from '../dropdown_align';\n\nexport default class Align extends DropdownItem {\n constructor(value) {\n super('align', '', value);\n }\n\n dropdown() {\n const { value } = this;\n return new DropdownAlign(['left', 'center', 'right'], value);\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownAlign from '../dropdown_align';\n\nexport default class Valign extends DropdownItem {\n constructor(value) {\n super('valign', '', value);\n }\n\n dropdown() {\n const { value } = this;\n return new DropdownAlign(['top', 'middle', 'bottom'], value);\n }\n}\n","import Item from './item';\nimport Icon from '../icon';\n\nexport default class ToggleItem extends Item {\n element() {\n const { tag } = this;\n return super.element()\n .child(new Icon(tag))\n .on('click', () => this.click());\n }\n\n click() {\n this.change(this.tag, this.toggle());\n }\n\n setState(active) {\n this.el.active(active);\n }\n\n toggle() {\n return this.el.toggle();\n }\n\n active() {\n return this.el.hasClass('active');\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Autofilter extends ToggleItem {\n constructor() {\n super('autofilter');\n }\n\n setState() {}\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Bold extends ToggleItem {\n constructor() {\n super('font-bold', 'Ctrl+B');\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Italic extends ToggleItem {\n constructor() {\n super('font-italic', 'Ctrl+I');\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Strike extends ToggleItem {\n constructor() {\n super('strike', 'Ctrl+U');\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Underline extends ToggleItem {\n constructor() {\n super('underline', 'Ctrl+U');\n }\n}\n","import { h } from './element';\nimport { cssPrefix } from '../config';\n\nconst themeColorPlaceHolders = ['#ffffff', '#000100', '#e7e5e6', '#445569', '#5b9cd6', '#ed7d31', '#a5a5a5', '#ffc001', '#4371c6', '#71ae47'];\n\nconst themeColors = [\n ['#f2f2f2', '#7f7f7f', '#d0cecf', '#d5dce4', '#deeaf6', '#fce5d5', '#ededed', '#fff2cd', '#d9e2f3', '#e3efd9'],\n ['#d8d8d8', '#595959', '#afabac', '#adb8ca', '#bdd7ee', '#f7ccac', '#dbdbdb', '#ffe59a', '#b3c6e7', '#c5e0b3'],\n ['#bfbfbf', '#3f3f3f', '#756f6f', '#8596b0', '#9cc2e6', '#f4b184', '#c9c9c9', '#fed964', '#8eaada', '#a7d08c'],\n ['#a5a5a5', '#262626', '#3a3839', '#333f4f', '#2e75b5', '#c45a10', '#7b7b7b', '#bf8e01', '#2f5596', '#538136'],\n ['#7f7f7f', '#0c0c0c', '#171516', '#222a35', '#1f4e7a', '#843c0a', '#525252', '#7e6000', '#203864', '#365624'],\n];\n\nconst standardColors = ['#c00000', '#fe0000', '#fdc101', '#ffff01', '#93d051', '#00b04e', '#01b0f1', '#0170c1', '#012060', '#7030a0'];\n\nfunction buildTd(bgcolor) {\n return h('td', '').child(\n h('div', `${cssPrefix}-color-palette-cell`)\n .on('click.stop', () => this.change(bgcolor))\n .css('background-color', bgcolor),\n );\n}\n\nexport default class ColorPalette {\n constructor() {\n this.el = h('div', `${cssPrefix}-color-palette`);\n this.change = () => {};\n const table = h('table', '').children(\n h('tbody', '').children(\n h('tr', `${cssPrefix}-theme-color-placeholders`).children(\n ...themeColorPlaceHolders.map(color => buildTd.call(this, color)),\n ),\n ...themeColors.map(it => h('tr', `${cssPrefix}-theme-colors`).children(\n ...it.map(color => buildTd.call(this, color)),\n )),\n h('tr', `${cssPrefix}-standard-colors`).children(\n ...standardColors.map(color => buildTd.call(this, color)),\n ),\n ),\n );\n this.el.child(table);\n }\n}\n","import Dropdown from './dropdown';\nimport Icon from './icon';\nimport ColorPalette from './color_palette';\n\nexport default class DropdownColor extends Dropdown {\n constructor(iconName, color) {\n const icon = new Icon(iconName)\n .css('height', '16px')\n .css('border-bottom', `3px solid ${color}`);\n const colorPalette = new ColorPalette();\n colorPalette.change = (v) => {\n this.setTitle(v);\n this.change(v);\n };\n super(icon, 'auto', false, 'bottom-left', colorPalette.el);\n }\n\n setTitle(color) {\n this.title.css('border-color', color);\n this.hide();\n }\n}\n","import Dropdown from './dropdown';\nimport { h } from './element';\nimport Icon from './icon';\nimport { cssPrefix } from '../config';\n\nconst lineTypes = [\n ['thin', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"1\" style=\"user-select: none;\"><line x1=\"0\" y1=\"0.5\" x2=\"50\" y2=\"0.5\" stroke-width=\"1\" stroke=\"black\" style=\"user-select: none;\"></line></svg>'],\n ['medium', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"2\" style=\"user-select: none;\"><line x1=\"0\" y1=\"1.0\" x2=\"50\" y2=\"1.0\" stroke-width=\"2\" stroke=\"black\" style=\"user-select: none;\"></line></svg>'],\n ['thick', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"3\" style=\"user-select: none;\"><line x1=\"0\" y1=\"1.5\" x2=\"50\" y2=\"1.5\" stroke-width=\"3\" stroke=\"black\" style=\"user-select: none;\"></line></svg>'],\n ['dashed', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"1\" style=\"user-select: none;\"><line x1=\"0\" y1=\"0.5\" x2=\"50\" y2=\"0.5\" stroke-width=\"1\" stroke=\"black\" stroke-dasharray=\"2\" style=\"user-select: none;\"></line></svg>'],\n ['dotted', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"1\" style=\"user-select: none;\"><line x1=\"0\" y1=\"0.5\" x2=\"50\" y2=\"0.5\" stroke-width=\"1\" stroke=\"black\" stroke-dasharray=\"1\" style=\"user-select: none;\"></line></svg>'],\n // ['double', '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"3\" style=\"user-select: none;\"><line x1=\"0\" y1=\"0.5\" x2=\"50\" y2=\"0.5\" stroke-width=\"1\" stroke=\"black\" style=\"user-select: none;\"></line><line x1=\"0\" y1=\"2.5\" x2=\"50\" y2=\"2.5\" stroke-width=\"1\" stroke=\"black\" style=\"user-select: none;\"></line></svg>'],\n];\n\nexport default class DropdownLineType extends Dropdown {\n constructor(type) {\n const icon = new Icon('line-type');\n let beforei = 0;\n const lineTypeEls = lineTypes.map((it, iti) => h('div', `${cssPrefix}-item state ${type === it[0] ? 'checked' : ''}`)\n .on('click', () => {\n lineTypeEls[beforei].toggle('checked');\n lineTypeEls[iti].toggle('checked');\n beforei = iti;\n this.hide();\n this.change(it);\n })\n .child(\n h('div', `${cssPrefix}-line-type`).html(it[1]),\n ));\n\n super(icon, 'auto', false, 'bottom-left', ...lineTypeEls);\n }\n}\n","import { h } from './element';\nimport Icon from './icon';\nimport DropdownColor from './dropdown_color';\nimport DropdownLineType from './dropdown_linetype';\nimport { cssPrefix } from '../config';\n\nfunction buildTable(...trs) {\n return h('table', '').child(\n h('tbody', '').children(...trs),\n );\n}\n\nfunction buildTd(iconName) {\n return h('td', '').child(\n h('div', `${cssPrefix}-border-palette-cell`).child(\n new Icon(`border-${iconName}`),\n ).on('click', () => {\n this.mode = iconName;\n const { mode, style, color } = this;\n this.change({ mode, style, color });\n }),\n );\n}\n\nexport default class BorderPalette {\n constructor() {\n this.color = '#000';\n this.style = 'thin';\n this.mode = 'all';\n this.change = () => {};\n this.ddColor = new DropdownColor('line-color', this.color);\n this.ddColor.change = (color) => {\n this.color = color;\n };\n this.ddType = new DropdownLineType(this.style);\n this.ddType.change = ([s]) => {\n this.style = s;\n };\n this.el = h('div', `${cssPrefix}-border-palette`);\n const table = buildTable(\n h('tr', '').children(\n h('td', `${cssPrefix}-border-palette-left`).child(\n buildTable(\n h('tr', '').children(\n ...['all', 'inside', 'horizontal', 'vertical', 'outside'].map(it => buildTd.call(this, it)),\n ),\n h('tr', '').children(\n ...['left', 'top', 'right', 'bottom', 'none'].map(it => buildTd.call(this, it)),\n ),\n ),\n ),\n h('td', `${cssPrefix}-border-palette-right`).children(\n h('div', `${cssPrefix}-toolbar-btn`).child(this.ddColor.el),\n h('div', `${cssPrefix}-toolbar-btn`).child(this.ddType.el),\n ),\n ),\n );\n this.el.child(table);\n }\n}\n","import Dropdown from './dropdown';\nimport Icon from './icon';\nimport BorderPalette from './border_palette';\n\nexport default class DropdownBorder extends Dropdown {\n constructor() {\n const icon = new Icon('border-all');\n const borderPalette = new BorderPalette();\n borderPalette.change = (v) => {\n this.change(v);\n this.hide();\n };\n super(icon, 'auto', false, 'bottom-left', borderPalette.el);\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownBorder from '../dropdown_border';\n\nexport default class Border extends DropdownItem {\n constructor() {\n super('border');\n }\n\n dropdown() {\n return new DropdownBorder();\n }\n}\n","import Item from './item';\nimport Icon from '../icon';\n\nexport default class IconItem extends Item {\n element() {\n return super.element()\n .child(new Icon(this.tag))\n .on('click', () => this.change(this.tag));\n }\n\n setState(disabled) {\n this.el.disabled(disabled);\n }\n}\n","import IconItem from './icon_item';\n\nexport default class Clearformat extends IconItem {\n constructor() {\n super('clearformat');\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Paintformat extends ToggleItem {\n constructor() {\n super('paintformat');\n }\n\n setState() {}\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownColor from '../dropdown_color';\n\nexport default class TextColor extends DropdownItem {\n constructor(color) {\n super('color', undefined, color);\n }\n\n dropdown() {\n const { tag, value } = this;\n return new DropdownColor(tag, value);\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownColor from '../dropdown_color';\n\nexport default class FillColor extends DropdownItem {\n constructor(color) {\n super('bgcolor', undefined, color);\n }\n\n dropdown() {\n const { tag, value } = this;\n return new DropdownColor(tag, value);\n }\n}\n","import Dropdown from './dropdown';\nimport { h } from './element';\nimport { fontSizes } from '../core/font';\nimport { cssPrefix } from '../config';\n\nexport default class DropdownFontSize extends Dropdown {\n constructor() {\n const nfontSizes = fontSizes.map(it => h('div', `${cssPrefix}-item`)\n .on('click', () => {\n this.setTitle(`${it.pt}`);\n this.change(it);\n })\n .child(`${it.pt}`));\n super('10', '60px', true, 'bottom-left', ...nfontSizes);\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownFontsize from '../dropdown_fontsize';\n\nexport default class Format extends DropdownItem {\n constructor() {\n super('font-size');\n }\n\n getValue(it) {\n return it.pt;\n }\n\n dropdown() {\n return new DropdownFontsize();\n }\n}\n","import Dropdown from './dropdown';\nimport { h } from './element';\nimport { baseFonts } from '../core/font';\nimport { cssPrefix } from '../config';\n\nexport default class DropdownFont extends Dropdown {\n constructor() {\n const nfonts = baseFonts.map(it => h('div', `${cssPrefix}-item`)\n .on('click', () => {\n this.setTitle(it.title);\n this.change(it);\n })\n .child(it.title));\n super(baseFonts[0].title, '160px', true, 'bottom-left', ...nfonts);\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownFont from '../dropdown_font';\n\nexport default class Font extends DropdownItem {\n constructor() {\n super('font-name');\n }\n\n getValue(it) {\n return it.key;\n }\n\n dropdown() {\n return new DropdownFont();\n }\n}\n","import Dropdown from './dropdown';\nimport { h } from './element';\nimport { baseFormats } from '../core/format';\nimport { cssPrefix } from '../config';\n\nexport default class DropdownFormat extends Dropdown {\n constructor() {\n let nformats = baseFormats.slice(0);\n nformats.splice(2, 0, { key: 'divider' });\n nformats.splice(8, 0, { key: 'divider' });\n nformats = nformats.map((it) => {\n const item = h('div', `${cssPrefix}-item`);\n if (it.key === 'divider') {\n item.addClass('divider');\n } else {\n item.child(it.title())\n .on('click', () => {\n this.setTitle(it.title());\n this.change(it);\n });\n if (it.label) item.child(h('div', 'label').html(it.label));\n }\n return item;\n });\n super('Normal', '220px', true, 'bottom-left', ...nformats);\n }\n\n setTitle(key) {\n for (let i = 0; i < baseFormats.length; i += 1) {\n if (baseFormats[i].key === key) {\n this.title.html(baseFormats[i].title());\n }\n }\n this.hide();\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownFormat from '../dropdown_format';\n\nexport default class Format extends DropdownItem {\n constructor() {\n super('format');\n }\n\n getValue(it) {\n return it.key;\n }\n\n dropdown() {\n return new DropdownFormat();\n }\n}\n","import Dropdown from './dropdown';\nimport Icon from './icon';\nimport { h } from './element';\nimport { baseFormulas } from '../core/formula';\nimport { cssPrefix } from '../config';\n\nexport default class DropdownFormula extends Dropdown {\n constructor() {\n const nformulas = baseFormulas.map(it => h('div', `${cssPrefix}-item`)\n .on('click', () => {\n this.hide();\n this.change(it);\n })\n .child(it.key));\n super(new Icon('formula'), '180px', true, 'bottom-left', ...nformulas);\n }\n}\n","import DropdownItem from './dropdown_item';\nimport DropdownFormula from '../dropdown_formula';\n\nexport default class Format extends DropdownItem {\n constructor() {\n super('formula');\n }\n\n getValue(it) {\n return it.key;\n }\n\n dropdown() {\n return new DropdownFormula();\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Freeze extends ToggleItem {\n constructor() {\n super('freeze');\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Merge extends ToggleItem {\n constructor() {\n super('merge');\n }\n\n setState(active, disabled) {\n this.el.active(active).disabled(disabled);\n }\n}\n","import IconItem from './icon_item';\n\nexport default class Redo extends IconItem {\n constructor() {\n super('redo', 'Ctrl+Y');\n }\n}\n","import IconItem from './icon_item';\n\nexport default class Undo extends IconItem {\n constructor() {\n super('undo', 'Ctrl+Z');\n }\n}\n","import IconItem from './icon_item';\n\nexport default class Print extends IconItem {\n constructor() {\n super('print', 'Ctrl+P');\n }\n}\n","import ToggleItem from './toggle_item';\n\nexport default class Textwrap extends ToggleItem {\n constructor() {\n super('textwrap');\n }\n}\n","import Dropdown from '../dropdown';\nimport DropdownItem from './dropdown_item';\n\nimport { cssPrefix } from '../../config';\nimport { h } from '../element';\nimport Icon from '../icon';\n\nclass DropdownMore extends Dropdown {\n constructor() {\n const icon = new Icon('ellipsis');\n const moreBtns = h('div', `${cssPrefix}-toolbar-more`);\n super(icon, 'auto', false, 'bottom-right', moreBtns);\n this.moreBtns = moreBtns;\n this.contentEl.css('max-width', '420px');\n }\n}\n\nexport default class More extends DropdownItem {\n constructor() {\n super('more');\n this.el.hide();\n }\n\n dropdown() {\n return new DropdownMore();\n }\n\n show() {\n this.el.show();\n }\n\n hide() {\n this.el.hide();\n }\n}\n","/* global window */\n\nimport Align from './align';\nimport Valign from './valign';\nimport Autofilter from './autofilter';\nimport Bold from './bold';\nimport Italic from './italic';\nimport Strike from './strike';\nimport Underline from './underline';\nimport Border from './border';\nimport Clearformat from './clearformat';\nimport Paintformat from './paintformat';\nimport TextColor from './text_color';\nimport FillColor from './fill_color';\nimport FontSize from './font_size';\nimport Font from './font';\nimport Format from './format';\nimport Formula from './formula';\nimport Freeze from './freeze';\nimport Merge from './merge';\nimport Redo from './redo';\nimport Undo from './undo';\nimport Print from './print';\nimport Textwrap from './textwrap';\nimport More from './more';\n\nimport { h } from '../element';\nimport { cssPrefix } from '../../config';\nimport { bind } from '../event';\n\nfunction buildDivider() {\n return h('div', `${cssPrefix}-toolbar-divider`);\n}\n\nfunction initBtns2() {\n this.btns2 = [];\n this.items.forEach((it) => {\n if (Array.isArray(it)) {\n it.forEach(({ el }) => {\n const rect = el.box();\n const { marginLeft, marginRight } = el.computedStyle();\n this.btns2.push([el, rect.width + parseInt(marginLeft, 10) + parseInt(marginRight, 10)]);\n });\n } else {\n const rect = it.box();\n const { marginLeft, marginRight } = it.computedStyle();\n this.btns2.push([it, rect.width + parseInt(marginLeft, 10) + parseInt(marginRight, 10)]);\n }\n });\n}\n\nfunction moreResize() {\n const {\n el, btns, moreEl, btns2,\n } = this;\n const { moreBtns, contentEl } = moreEl.dd;\n el.css('width', `${this.widthFn() - 60}px`);\n const elBox = el.box();\n\n let sumWidth = 160;\n let sumWidth2 = 12;\n const list1 = [];\n const list2 = [];\n btns2.forEach(([it, w], index) => {\n sumWidth += w;\n if (index === btns2.length - 1 || sumWidth < elBox.width) {\n list1.push(it);\n } else {\n sumWidth2 += w;\n list2.push(it);\n }\n });\n btns.html('').children(...list1);\n moreBtns.html('').children(...list2);\n contentEl.css('width', `${sumWidth2}px`);\n if (list2.length > 0) {\n moreEl.show();\n } else {\n moreEl.hide();\n }\n}\n\nexport default class Toolbar {\n constructor(data, widthFn, isHide = false) {\n this.data = data;\n this.change = () => {};\n this.widthFn = widthFn;\n this.isHide = isHide;\n const style = data.defaultStyle();\n this.items = [\n [\n this.undoEl = new Undo(),\n this.redoEl = new Redo(),\n new Print(),\n this.paintformatEl = new Paintformat(),\n this.clearformatEl = new Clearformat(),\n ],\n buildDivider(),\n [\n this.formatEl = new Format(),\n ],\n buildDivider(),\n [\n this.fontEl = new Font(),\n this.fontSizeEl = new FontSize(),\n ],\n buildDivider(),\n [\n this.boldEl = new Bold(),\n this.italicEl = new Italic(),\n this.underlineEl = new Underline(),\n this.strikeEl = new Strike(),\n this.textColorEl = new TextColor(style.color),\n ],\n buildDivider(),\n [\n this.fillColorEl = new FillColor(style.bgcolor),\n this.borderEl = new Border(),\n this.mergeEl = new Merge(),\n ],\n buildDivider(),\n [\n this.alignEl = new Align(style.align),\n this.valignEl = new Valign(style.valign),\n this.textwrapEl = new Textwrap(),\n ],\n buildDivider(),\n [\n this.freezeEl = new Freeze(),\n this.autofilterEl = new Autofilter(),\n this.formulaEl = new Formula(),\n this.moreEl = new More(),\n ],\n ];\n\n this.el = h('div', `${cssPrefix}-toolbar`);\n this.btns = h('div', `${cssPrefix}-toolbar-btns`);\n\n this.items.forEach((it) => {\n if (Array.isArray(it)) {\n it.forEach((i) => {\n this.btns.child(i.el);\n i.change = (...args) => {\n this.change(...args);\n };\n });\n } else {\n this.btns.child(it.el);\n }\n });\n\n this.el.child(this.btns);\n if (isHide) {\n this.el.hide();\n } else {\n this.reset();\n setTimeout(() => {\n initBtns2.call(this);\n moreResize.call(this);\n }, 0);\n bind(window, 'resize', () => {\n moreResize.call(this);\n });\n }\n }\n\n paintformatActive() {\n return this.paintformatEl.active();\n }\n\n paintformatToggle() {\n this.paintformatEl.toggle();\n }\n\n trigger(type) {\n this[`${type}El`].click();\n }\n\n resetData(data) {\n this.data = data;\n this.reset();\n }\n\n reset() {\n if (this.isHide) return;\n const { data } = this;\n const style = data.getSelectedCellStyle();\n // console.log('canUndo:', data.canUndo());\n this.undoEl.setState(!data.canUndo());\n this.redoEl.setState(!data.canRedo());\n this.mergeEl.setState(data.canUnmerge(), !data.selector.multiple());\n this.autofilterEl.setState(!data.canAutofilter());\n // this.mergeEl.disabled();\n // console.log('selectedCell:', style, cell);\n const { font, format } = style;\n this.formatEl.setState(format);\n this.fontEl.setState(font.name);\n this.fontSizeEl.setState(font.size);\n this.boldEl.setState(font.bold);\n this.italicEl.setState(font.italic);\n this.underlineEl.setState(style.underline);\n this.strikeEl.setState(style.strike);\n this.textColorEl.setState(style.color);\n this.fillColorEl.setState(style.bgcolor);\n this.alignEl.setState(style.align);\n this.valignEl.setState(style.valign);\n this.textwrapEl.setState(style.textwrap);\n // console.log('freeze is Active:', data.freezeIsActive());\n this.freezeEl.setState(data.freezeIsActive());\n }\n}\n","/* global document */\n/* global window */\nimport { h } from './element';\nimport Icon from './icon';\nimport { cssPrefix } from '../config';\nimport { bind, unbind } from './event';\n\nexport default class Modal {\n constructor(title, content, width = '600px') {\n this.title = title;\n this.el = h('div', `${cssPrefix}-modal`).css('width', width).children(\n h('div', `${cssPrefix}-modal-header`).children(\n new Icon('close').on('click.stop', () => this.hide()),\n this.title,\n ),\n h('div', `${cssPrefix}-modal-content`).children(...content),\n ).hide();\n }\n\n show() {\n // dimmer\n this.dimmer = h('div', `${cssPrefix}-dimmer active`);\n document.body.appendChild(this.dimmer.el);\n const { width, height } = this.el.show().box();\n const { clientHeight, clientWidth } = document.documentElement;\n this.el.offset({\n left: (clientWidth - width) / 2,\n top: (clientHeight - height) / 3,\n });\n window.xkeydownEsc = (evt) => {\n if (evt.keyCode === 27) {\n this.hide();\n }\n };\n bind(window, 'keydown', window.xkeydownEsc);\n }\n\n hide() {\n this.el.hide();\n document.body.removeChild(this.dimmer.el);\n unbind(window, 'keydown', window.xkeydownEsc);\n delete window.xkeydownEsc;\n }\n}\n","import { h } from './element';\nimport { cssPrefix } from '../config';\n\nexport default class FormInput {\n constructor(width, hint) {\n this.vchange = () => {};\n this.el = h('div', `${cssPrefix}-form-input`);\n this.input = h('input', '').css('width', width)\n .on('input', evt => this.vchange(evt))\n .attr('placeholder', hint);\n this.el.child(this.input);\n }\n\n focus() {\n setTimeout(() => {\n this.input.el.focus();\n }, 10);\n }\n\n hint(v) {\n this.input.attr('placeholder', v);\n }\n\n val(v) {\n return this.input.val(v);\n }\n}\n","import { h } from './element';\nimport Suggest from './suggest';\nimport { cssPrefix } from '../config';\n\nexport default class FormSelect {\n constructor(key, items, width, getTitle = it => it, change = () => {}) {\n this.key = key;\n this.getTitle = getTitle;\n this.vchange = () => {};\n this.el = h('div', `${cssPrefix}-form-select`);\n this.suggest = new Suggest(items.map(it => ({ key: it, title: this.getTitle(it) })), (it) => {\n this.itemClick(it.key);\n change(it.key);\n this.vchange(it.key);\n }, width, this.el);\n this.el.children(\n this.itemEl = h('div', 'input-text').html(this.getTitle(key)),\n this.suggest.el,\n ).on('click', () => this.show());\n }\n\n show() {\n this.suggest.search('');\n }\n\n itemClick(it) {\n this.key = it;\n this.itemEl.html(this.getTitle(it));\n }\n\n val(v) {\n if (v !== undefined) {\n this.key = v;\n this.itemEl.html(this.getTitle(v));\n return this;\n }\n return this.key;\n }\n}\n","import { h } from './element';\nimport { cssPrefix } from '../config';\nimport { t } from '../locale/locale';\n\nconst patterns = {\n number: /(^\\d+$)|(^\\d+(\\.\\d{0,4})?$)/,\n date: /^\\d{4}-\\d{1,2}-\\d{1,2}$/,\n};\n\n// rule: { required: false, type, pattern: // }\nexport default class FormField {\n constructor(input, rule, label, labelWidth) {\n this.label = '';\n this.rule = rule;\n if (label) {\n this.label = h('label', 'label').css('width', `${labelWidth}px`).html(label);\n }\n this.tip = h('div', 'tip').child('tip').hide();\n this.input = input;\n this.input.vchange = () => this.validate();\n this.el = h('div', `${cssPrefix}-form-field`)\n .children(this.label, input.el, this.tip);\n }\n\n isShow() {\n return this.el.css('display') !== 'none';\n }\n\n show() {\n this.el.show();\n }\n\n hide() {\n this.el.hide();\n return this;\n }\n\n val(v) {\n return this.input.val(v);\n }\n\n hint(hint) {\n this.input.hint(hint);\n }\n\n validate() {\n const {\n input, rule, tip, el,\n } = this;\n const v = input.val();\n if (rule.required) {\n if (/^\\s*$/.test(v)) {\n tip.html(t('validation.required'));\n el.addClass('error');\n return false;\n }\n }\n if (rule.type || rule.pattern) {\n const pattern = rule.pattern || patterns[rule.type];\n if (!pattern.test(v)) {\n tip.html(t('validation.notMatch'));\n el.addClass('error');\n return false;\n }\n }\n el.removeClass('error');\n return true;\n }\n}\n","import Modal from './modal';\nimport FormInput from './form_input';\nimport FormSelect from './form_select';\nimport FormField from './form_field';\nimport Button from './button';\nimport { t } from '../locale/locale';\nimport { h } from './element';\nimport { cssPrefix } from '../config';\n\nconst fieldLabelWidth = 100;\n\nexport default class ModalValidation extends Modal {\n constructor() {\n const mf = new FormField(\n new FormSelect('cell',\n ['cell'], // cell|row|column\n '100%',\n it => t(`dataValidation.modeType.${it}`)),\n { required: true },\n `${t('dataValidation.range')}:`,\n fieldLabelWidth,\n );\n const rf = new FormField(\n new FormInput('120px', 'E3 or E3:F12'),\n { required: true, pattern: /^([A-Z]{1,2}[1-9]\\d*)(:[A-Z]{1,2}[1-9]\\d*)?$/ },\n );\n const cf = new FormField(\n new FormSelect('list',\n ['list', 'number', 'date', 'phone', 'email'],\n '100%',\n it => t(`dataValidation.type.${it}`),\n it => this.criteriaSelected(it)),\n { required: true },\n `${t('dataValidation.criteria')}:`,\n fieldLabelWidth,\n );\n\n // operator\n const of = new FormField(\n new FormSelect('be',\n ['be', 'nbe', 'eq', 'neq', 'lt', 'lte', 'gt', 'gte'],\n '160px',\n it => t(`dataValidation.operator.${it}`),\n it => this.criteriaOperatorSelected(it)),\n { required: true },\n ).hide();\n // min, max\n const minvf = new FormField(\n new FormInput('70px', '10'),\n { required: true },\n ).hide();\n const maxvf = new FormField(\n new FormInput('70px', '100'),\n { required: true, type: 'number' },\n ).hide();\n // value\n const svf = new FormField(\n new FormInput('120px', 'a,b,c'),\n { required: true },\n );\n const vf = new FormField(\n new FormInput('70px', '10'),\n { required: true, type: 'number' },\n ).hide();\n\n super(t('contextmenu.validation'), [\n h('div', `${cssPrefix}-form-fields`).children(\n mf.el,\n rf.el,\n ),\n h('div', `${cssPrefix}-form-fields`).children(\n cf.el,\n of.el,\n minvf.el,\n maxvf.el,\n vf.el,\n svf.el,\n ),\n h('div', `${cssPrefix}-buttons`).children(\n new Button('cancel').on('click', () => this.btnClick('cancel')),\n new Button('remove').on('click', () => this.btnClick('remove')),\n new Button('save', 'primary').on('click', () => this.btnClick('save')),\n ),\n ]);\n this.mf = mf;\n this.rf = rf;\n this.cf = cf;\n this.of = of;\n this.minvf = minvf;\n this.maxvf = maxvf;\n this.vf = vf;\n this.svf = svf;\n this.change = () => {};\n }\n\n showVf(it) {\n const hint = it === 'date' ? '2018-11-12' : '10';\n const { vf } = this;\n vf.input.hint(hint);\n vf.show();\n }\n\n criteriaSelected(it) {\n const {\n of, minvf, maxvf, vf, svf,\n } = this;\n if (it === 'date' || it === 'number') {\n of.show();\n minvf.rule.type = it;\n maxvf.rule.type = it;\n if (it === 'date') {\n minvf.hint('2018-11-12');\n maxvf.hint('2019-11-12');\n } else {\n minvf.hint('10');\n maxvf.hint('100');\n }\n minvf.show();\n maxvf.show();\n vf.hide();\n svf.hide();\n } else {\n if (it === 'list') {\n svf.show();\n } else {\n svf.hide();\n }\n vf.hide();\n of.hide();\n minvf.hide();\n maxvf.hide();\n }\n }\n\n criteriaOperatorSelected(it) {\n if (!it) return;\n const {\n minvf, maxvf, vf,\n } = this;\n if (it === 'be' || it === 'nbe') {\n minvf.show();\n maxvf.show();\n vf.hide();\n } else {\n const type = this.cf.val();\n vf.rule.type = type;\n if (type === 'date') {\n vf.hint('2018-11-12');\n } else {\n vf.hint('10');\n }\n vf.show();\n minvf.hide();\n maxvf.hide();\n }\n }\n\n btnClick(action) {\n if (action === 'cancel') {\n this.hide();\n } else if (action === 'remove') {\n this.change('remove');\n this.hide();\n } else if (action === 'save') {\n // validate\n const attrs = ['mf', 'rf', 'cf', 'of', 'svf', 'vf', 'minvf', 'maxvf'];\n for (let i = 0; i < attrs.length; i += 1) {\n const field = this[attrs[i]];\n // console.log('field:', field);\n if (field.isShow()) {\n // console.log('it:', it);\n if (!field.validate()) return;\n }\n }\n\n const mode = this.mf.val();\n const ref = this.rf.val();\n const type = this.cf.val();\n const operator = this.of.val();\n let value = this.svf.val();\n if (type === 'number' || type === 'date') {\n if (operator === 'be' || operator === 'nbe') {\n value = [this.minvf.val(), this.maxvf.val()];\n } else {\n value = this.vf.val();\n }\n }\n // console.log(mode, ref, type, operator, value);\n this.change('save',\n mode,\n ref,\n {\n type, operator, required: false, value,\n });\n this.hide();\n }\n }\n\n // validation: { mode, ref, validator }\n setValue(v) {\n if (v) {\n const {\n mf, rf, cf, of, svf, vf, minvf, maxvf,\n } = this;\n const {\n mode, ref, validator,\n } = v;\n const {\n type, operator, value,\n } = validator || { type: 'list' };\n mf.val(mode || 'cell');\n rf.val(ref);\n cf.val(type);\n of.val(operator);\n if (Array.isArray(value)) {\n minvf.val(value[0]);\n maxvf.val(value[1]);\n } else {\n svf.val(value || '');\n vf.val(value || '');\n }\n this.criteriaSelected(type);\n this.criteriaOperatorSelected(operator);\n }\n this.show();\n }\n}\n","import { h } from './element';\nimport Button from './button';\nimport { bindClickoutside, unbindClickoutside } from './event';\nimport { cssPrefix } from '../config';\nimport { t } from '../locale/locale';\n\nfunction buildMenu(clsName) {\n return h('div', `${cssPrefix}-item ${clsName}`);\n}\n\nfunction buildSortItem(it) {\n return buildMenu('state').child(t(`sort.${it}`))\n .on('click.stop', () => this.itemClick(it));\n}\n\nfunction buildFilterBody(items) {\n const { filterbEl, filterValues } = this;\n filterbEl.html('');\n const itemKeys = Object.keys(items);\n itemKeys.forEach((it, index) => {\n const cnt = items[it];\n const active = filterValues.includes(it) ? 'checked' : '';\n filterbEl.child(h('div', `${cssPrefix}-item state ${active}`)\n .on('click.stop', () => this.filterClick(index, it))\n .children(it === '' ? t('filter.empty') : it, h('div', 'label').html(`(${cnt})`)));\n });\n}\n\nfunction resetFilterHeader() {\n const { filterhEl, filterValues, values } = this;\n filterhEl.html(`${filterValues.length} / ${values.length}`);\n filterhEl.checked(filterValues.length === values.length);\n}\n\nexport default class SortFilter {\n constructor() {\n this.filterbEl = h('div', `${cssPrefix}-body`);\n this.filterhEl = h('div', `${cssPrefix}-header state`).on('click.stop', () => this.filterClick(0, 'all'));\n this.el = h('div', `${cssPrefix}-sort-filter`).children(\n this.sortAscEl = buildSortItem.call(this, 'asc'),\n this.sortDescEl = buildSortItem.call(this, 'desc'),\n buildMenu('divider'),\n h('div', `${cssPrefix}-filter`).children(\n this.filterhEl,\n this.filterbEl,\n ),\n h('div', `${cssPrefix}-buttons`).children(\n new Button('cancel').on('click', () => this.btnClick('cancel')),\n new Button('ok', 'primary').on('click', () => this.btnClick('ok')),\n ),\n ).hide();\n // this.setFilters(['test1', 'test2', 'text3']);\n this.ci = null;\n this.sortDesc = null;\n this.values = null;\n this.filterValues = [];\n }\n\n btnClick(it) {\n if (it === 'ok') {\n const { ci, sort, filterValues } = this;\n if (this.ok) {\n this.ok(ci, sort, 'in', filterValues);\n }\n }\n this.hide();\n }\n\n itemClick(it) {\n // console.log('it:', it);\n this.sort = it;\n const { sortAscEl, sortDescEl } = this;\n sortAscEl.checked(it === 'asc');\n sortDescEl.checked(it === 'desc');\n }\n\n filterClick(index, it) {\n // console.log('index:', index, it);\n const { filterbEl, filterValues, values } = this;\n const children = filterbEl.children();\n if (it === 'all') {\n if (children.length === filterValues.length) {\n this.filterValues = [];\n children.forEach(i => h(i).checked(false));\n } else {\n this.filterValues = Array.from(values);\n children.forEach(i => h(i).checked(true));\n }\n } else {\n const checked = h(children[index]).toggle('checked');\n if (checked) {\n filterValues.push(it);\n } else {\n filterValues.splice(filterValues.findIndex(i => i === it), 1);\n }\n }\n resetFilterHeader.call(this);\n }\n\n // v: autoFilter\n // items: {value: cnt}\n // sort { ci, order }\n set(ci, items, filter, sort) {\n this.ci = ci;\n const { sortAscEl, sortDescEl } = this;\n if (sort !== null) {\n this.sort = sort.order;\n sortAscEl.checked(sort.asc());\n sortDescEl.checked(sort.desc());\n } else {\n this.sortDesc = null;\n sortAscEl.checked(false);\n sortDescEl.checked(false);\n }\n // this.setFilters(items, filter);\n this.values = Object.keys(items);\n this.filterValues = filter ? Array.from(filter.value) : Object.keys(items);\n buildFilterBody.call(this, items, filter);\n resetFilterHeader.call(this);\n }\n\n setOffset(v) {\n this.el.offset(v).show();\n let tindex = 1;\n bindClickoutside(this.el, () => {\n if (tindex <= 0) {\n this.hide();\n }\n tindex -= 1;\n });\n }\n\n show() {\n this.el.show();\n }\n\n hide() {\n this.el.hide();\n unbindClickoutside(this.el);\n }\n}\n","/* global document */\nimport { h } from './element';\nimport Icon from './icon';\nimport { cssPrefix } from '../config';\n\nexport function xtoast(title, content) {\n const el = h('div', `${cssPrefix}-toast`);\n const dimmer = h('div', `${cssPrefix}-dimmer active`);\n const remove = () => {\n document.body.removeChild(el.el);\n document.body.removeChild(dimmer.el);\n };\n\n el.children(\n h('div', `${cssPrefix}-toast-header`).children(\n new Icon('close').on('click.stop', () => remove()),\n title,\n ),\n h('div', `${cssPrefix}-toast-content`).html(content),\n );\n document.body.appendChild(el.el);\n document.body.appendChild(dimmer.el);\n // set offset\n const { width, height } = el.box();\n const { clientHeight, clientWidth } = document.documentElement;\n el.offset({\n left: (clientWidth - width) / 2,\n top: (clientHeight - height) / 3,\n });\n}\n\nexport default {};\n","/* global window */\nimport { h } from './element';\nimport {\n bind,\n mouseMoveUp,\n bindTouch,\n createEventEmitter,\n} from './event';\nimport Resizer from './resizer';\nimport Scrollbar from './scrollbar';\nimport Selector from './selector';\nimport Editor from './editor';\nimport Print from './print';\nimport ContextMenu from './contextmenu';\nimport Table from './table';\nimport Toolbar from './toolbar/index';\nimport ModalValidation from './modal_validation';\nimport SortFilter from './sort_filter';\nimport { xtoast } from './message';\nimport { cssPrefix } from '../config';\nimport { formulas } from '../core/formula';\n\n/**\n * @desc throttle fn\n * @param func function\n * @param wait Delay in milliseconds\n */\nfunction throttle(func, wait) {\n let timeout;\n return (...arg) => {\n const that = this;\n const args = arg;\n if (!timeout) {\n timeout = setTimeout(() => {\n timeout = null;\n func.apply(that, args);\n }, wait);\n }\n };\n}\n\nfunction scrollbarMove() {\n const {\n data, verticalScrollbar, horizontalScrollbar,\n } = this;\n const {\n l, t, left, top, width, height,\n } = data.getSelectedRect();\n const tableOffset = this.getTableOffset();\n // console.log(',l:', l, ', left:', left, ', tOffset.left:', tableOffset.width);\n if (Math.abs(left) + width > tableOffset.width) {\n horizontalScrollbar.move({ left: l + width - tableOffset.width });\n } else {\n const fsw = data.freezeTotalWidth();\n if (left < fsw) {\n horizontalScrollbar.move({ left: l - 1 - fsw });\n }\n }\n // console.log('top:', top, ', height:', height, ', tof.height:', tableOffset.height);\n if (Math.abs(top) + height > tableOffset.height) {\n verticalScrollbar.move({ top: t + height - tableOffset.height - 1 });\n } else {\n const fsh = data.freezeTotalHeight();\n if (top < fsh) {\n verticalScrollbar.move({ top: t - 1 - fsh });\n }\n }\n}\n\nfunction selectorSet(multiple, ri, ci, indexesUpdated = true, moving = false) {\n if (ri === -1 && ci === -1) return;\n const {\n table, selector, toolbar, data,\n contextMenu,\n } = this;\n contextMenu.setMode((ri === -1 || ci === -1) ? 'row-col' : 'range');\n const cell = data.getCell(ri, ci);\n if (multiple) {\n selector.setEnd(ri, ci, moving);\n this.trigger('cells-selected', cell, selector.range);\n } else {\n // trigger click event\n selector.set(ri, ci, indexesUpdated);\n this.trigger('cell-selected', cell, ri, ci);\n }\n toolbar.reset();\n table.render();\n}\n\n// multiple: boolean\n// direction: left | right | up | down | row-first | row-last | col-first | col-last\nfunction selectorMove(multiple, direction) {\n const {\n selector, data,\n } = this;\n const { rows, cols } = data;\n let [ri, ci] = selector.indexes;\n const { eri, eci } = selector.range;\n if (multiple) {\n [ri, ci] = selector.moveIndexes;\n }\n // console.log('selector.move:', ri, ci);\n if (direction === 'left') {\n if (ci > 0) ci -= 1;\n } else if (direction === 'right') {\n if (eci !== ci) ci = eci;\n if (ci < cols.len - 1) ci += 1;\n } else if (direction === 'up') {\n if (ri > 0) ri -= 1;\n } else if (direction === 'down') {\n if (eri !== ri) ri = eri;\n if (ri < rows.len - 1) ri += 1;\n } else if (direction === 'row-first') {\n ci = 0;\n } else if (direction === 'row-last') {\n ci = cols.len - 1;\n } else if (direction === 'col-first') {\n ri = 0;\n } else if (direction === 'col-last') {\n ri = rows.len - 1;\n }\n if (multiple) {\n selector.moveIndexes = [ri, ci];\n }\n selectorSet.call(this, multiple, ri, ci);\n scrollbarMove.call(this);\n}\n\n// private methods\nfunction overlayerMousemove(evt) {\n // console.log('x:', evt.offsetX, ', y:', evt.offsetY);\n if (evt.buttons !== 0) return;\n if (evt.target.className === `${cssPrefix}-resizer-hover`) return;\n const { offsetX, offsetY } = evt;\n const {\n rowResizer, colResizer, tableEl, data,\n } = this;\n const { rows, cols } = data;\n if (offsetX > cols.indexWidth && offsetY > rows.height) {\n rowResizer.hide();\n colResizer.hide();\n return;\n }\n const tRect = tableEl.box();\n const cRect = data.getCellRectByXY(evt.offsetX, evt.offsetY);\n if (cRect.ri >= 0 && cRect.ci === -1) {\n cRect.width = cols.indexWidth;\n rowResizer.show(cRect, {\n width: tRect.width,\n });\n if (rows.isHide(cRect.ri - 1)) {\n rowResizer.showUnhide(cRect.ri);\n } else {\n rowResizer.hideUnhide();\n }\n } else {\n rowResizer.hide();\n }\n if (cRect.ri === -1 && cRect.ci >= 0) {\n cRect.height = rows.height;\n colResizer.show(cRect, {\n height: tRect.height,\n });\n if (cols.isHide(cRect.ci - 1)) {\n colResizer.showUnhide(cRect.ci);\n } else {\n colResizer.hideUnhide();\n }\n } else {\n colResizer.hide();\n }\n}\n\n// let scrollThreshold = 15;\nfunction overlayerMousescroll(evt) {\n // scrollThreshold -= 1;\n // if (scrollThreshold > 0) return;\n // scrollThreshold = 15;\n\n const { verticalScrollbar, horizontalScrollbar, data } = this;\n const { top } = verticalScrollbar.scroll();\n const { left } = horizontalScrollbar.scroll();\n // console.log('evt:::', evt.wheelDelta, evt.detail * 40);\n\n const { rows, cols } = data;\n\n // deltaY for vertical delta\n const { deltaY, deltaX } = evt;\n const loopValue = (ii, vFunc) => {\n let i = ii;\n let v = 0;\n do {\n v = vFunc(i);\n i += 1;\n } while (v <= 0);\n return v;\n };\n // console.log('deltaX', deltaX, 'evt.detail', evt.detail);\n // if (evt.detail) deltaY = evt.detail * 40;\n const moveY = (vertical) => {\n if (vertical > 0) {\n // up\n const ri = data.scroll.ri + 1;\n if (ri < rows.len) {\n const rh = loopValue(ri, i => rows.getHeight(i));\n verticalScrollbar.move({ top: top + rh - 1 });\n }\n } else {\n // down\n const ri = data.scroll.ri - 1;\n if (ri >= 0) {\n const rh = loopValue(ri, i => rows.getHeight(i));\n verticalScrollbar.move({ top: ri === 0 ? 0 : top - rh });\n }\n }\n };\n\n // deltaX for Mac horizontal scroll\n const moveX = (horizontal) => {\n if (horizontal > 0) {\n // left\n const ci = data.scroll.ci + 1;\n if (ci < cols.len) {\n const cw = loopValue(ci, i => cols.getWidth(i));\n horizontalScrollbar.move({ left: left + cw - 1 });\n }\n } else {\n // right\n const ci = data.scroll.ci - 1;\n if (ci >= 0) {\n const cw = loopValue(ci, i => cols.getWidth(i));\n horizontalScrollbar.move({ left: ci === 0 ? 0 : left - cw });\n }\n }\n };\n const tempY = Math.abs(deltaY);\n const tempX = Math.abs(deltaX);\n const temp = Math.max(tempY, tempX);\n // console.log('event:', evt);\n // detail for windows/mac firefox vertical scroll\n if (/Firefox/i.test(window.navigator.userAgent)) throttle(moveY(evt.detail), 50);\n if (temp === tempX) throttle(moveX(deltaX), 50);\n if (temp === tempY) throttle(moveY(deltaY), 50);\n}\n\nfunction overlayerTouch(direction, distance) {\n const { verticalScrollbar, horizontalScrollbar } = this;\n const { top } = verticalScrollbar.scroll();\n const { left } = horizontalScrollbar.scroll();\n\n if (direction === 'left' || direction === 'right') {\n horizontalScrollbar.move({ left: left - distance });\n } else if (direction === 'up' || direction === 'down') {\n verticalScrollbar.move({ top: top - distance });\n }\n}\n\nfunction verticalScrollbarSet() {\n const { data, verticalScrollbar } = this;\n const { height } = this.getTableOffset();\n const erth = data.exceptRowTotalHeight(0, -1);\n // console.log('erth:', erth);\n verticalScrollbar.set(height, data.rows.totalHeight() - erth);\n}\n\nfunction horizontalScrollbarSet() {\n const { data, horizontalScrollbar } = this;\n const { width } = this.getTableOffset();\n if (data) {\n horizontalScrollbar.set(width, data.cols.totalWidth());\n }\n}\n\nfunction sheetFreeze() {\n const {\n selector, data, editor,\n } = this;\n const [ri, ci] = data.freeze;\n if (ri > 0 || ci > 0) {\n const fwidth = data.freezeTotalWidth();\n const fheight = data.freezeTotalHeight();\n editor.setFreezeLengths(fwidth, fheight);\n }\n selector.resetAreaOffset();\n}\n\nfunction sheetReset() {\n const {\n tableEl,\n overlayerEl,\n overlayerCEl,\n table,\n toolbar,\n selector,\n el,\n } = this;\n const tOffset = this.getTableOffset();\n const vRect = this.getRect();\n tableEl.attr(vRect);\n overlayerEl.offset(vRect);\n overlayerCEl.offset(tOffset);\n el.css('width', `${vRect.width}px`);\n verticalScrollbarSet.call(this);\n horizontalScrollbarSet.call(this);\n sheetFreeze.call(this);\n table.render();\n toolbar.reset();\n selector.reset();\n}\n\nfunction clearClipboard() {\n const { data, selector } = this;\n data.clearClipboard();\n selector.hideClipboard();\n}\n\nfunction copy() {\n const { data, selector } = this;\n data.copy();\n data.copyToSystemClipboard();\n selector.showClipboard();\n}\n\nfunction cut() {\n const { data, selector } = this;\n data.cut();\n selector.showClipboard();\n}\n\nfunction paste(what, evt) {\n const { data } = this;\n if (data.settings.mode === 'read') return;\n if (data.paste(what, msg => xtoast('Tip', msg))) {\n sheetReset.call(this);\n } else if (evt) {\n const cdata = evt.clipboardData.getData('text/plain');\n this.data.pasteFromText(cdata);\n sheetReset.call(this);\n }\n}\n\nfunction hideRowsOrCols() {\n this.data.hideRowsOrCols();\n sheetReset.call(this);\n}\n\nfunction unhideRowsOrCols(type, index) {\n this.data.unhideRowsOrCols(type, index);\n sheetReset.call(this);\n}\n\nfunction autofilter() {\n const { data } = this;\n data.autofilter();\n sheetReset.call(this);\n}\n\nfunction toolbarChangePaintformatPaste() {\n const { toolbar } = this;\n if (toolbar.paintformatActive()) {\n paste.call(this, 'format');\n clearClipboard.call(this);\n toolbar.paintformatToggle();\n }\n}\n\nfunction overlayerMousedown(evt) {\n // console.log(':::::overlayer.mousedown:', evt.detail, evt.button, evt.buttons, evt.shiftKey);\n // console.log('evt.target.className:', evt.target.className);\n const {\n selector, data, table, sortFilter,\n } = this;\n const { offsetX, offsetY } = evt;\n const isAutofillEl = evt.target.className === `${cssPrefix}-selector-corner`;\n const cellRect = data.getCellRectByXY(offsetX, offsetY);\n const {\n left, top, width, height,\n } = cellRect;\n let { ri, ci } = cellRect;\n // sort or filter\n const { autoFilter } = data;\n if (autoFilter.includes(ri, ci)) {\n if (left + width - 20 < offsetX && top + height - 20 < offsetY) {\n const items = autoFilter.items(ci, (r, c) => data.rows.getCell(r, c));\n sortFilter.hide();\n sortFilter.set(ci, items, autoFilter.getFilter(ci), autoFilter.getSort(ci));\n sortFilter.setOffset({ left, top: top + height + 2 });\n return;\n }\n }\n\n // console.log('ri:', ri, ', ci:', ci);\n if (!evt.shiftKey) {\n // console.log('selectorSetStart:::');\n if (isAutofillEl) {\n selector.showAutofill(ri, ci);\n } else {\n selectorSet.call(this, false, ri, ci);\n }\n\n // mouse move up\n mouseMoveUp(window, (e) => {\n // console.log('mouseMoveUp::::');\n ({ ri, ci } = data.getCellRectByXY(e.offsetX, e.offsetY));\n if (isAutofillEl) {\n selector.showAutofill(ri, ci);\n } else if (e.buttons === 1 && !e.shiftKey) {\n selectorSet.call(this, true, ri, ci, true, true);\n }\n }, () => {\n if (isAutofillEl && selector.arange && data.settings.mode !== 'read') {\n if (data.autofill(selector.arange, 'all', msg => xtoast('Tip', msg))) {\n table.render();\n }\n }\n selector.hideAutofill();\n toolbarChangePaintformatPaste.call(this);\n });\n }\n\n if (!isAutofillEl && evt.buttons === 1) {\n if (evt.shiftKey) {\n // console.log('shiftKey::::');\n selectorSet.call(this, true, ri, ci);\n }\n }\n}\n\nfunction editorSetOffset() {\n const { editor, data } = this;\n const sOffset = data.getSelectedRect();\n const tOffset = this.getTableOffset();\n let sPosition = 'top';\n // console.log('sOffset:', sOffset, ':', tOffset);\n if (sOffset.top > tOffset.height / 2) {\n sPosition = 'bottom';\n }\n editor.setOffset(sOffset, sPosition);\n}\n\nfunction editorSet() {\n const { editor, data } = this;\n if (data.settings.mode === 'read') return;\n editorSetOffset.call(this);\n editor.setCell(data.getSelectedCell(), data.getSelectedValidator());\n clearClipboard.call(this);\n}\n\nfunction verticalScrollbarMove(distance) {\n const { data, table, selector } = this;\n data.scrolly(distance, () => {\n selector.resetBRLAreaOffset();\n editorSetOffset.call(this);\n table.render();\n });\n}\n\nfunction horizontalScrollbarMove(distance) {\n const { data, table, selector } = this;\n data.scrollx(distance, () => {\n selector.resetBRTAreaOffset();\n editorSetOffset.call(this);\n table.render();\n });\n}\n\nfunction rowResizerFinished(cRect, distance) {\n const { ri } = cRect;\n const { table, selector, data } = this;\n data.rows.setHeight(ri, distance);\n table.render();\n selector.resetAreaOffset();\n verticalScrollbarSet.call(this);\n editorSetOffset.call(this);\n}\n\nfunction colResizerFinished(cRect, distance) {\n const { ci } = cRect;\n const { table, selector, data } = this;\n data.cols.setWidth(ci, distance);\n // console.log('data:', data);\n table.render();\n selector.resetAreaOffset();\n horizontalScrollbarSet.call(this);\n editorSetOffset.call(this);\n}\n\nfunction dataSetCellText(text, state = 'finished') {\n const { data, table } = this;\n // const [ri, ci] = selector.indexes;\n if (data.settings.mode === 'read') return;\n data.setSelectedCellText(text, state);\n const { ri, ci } = data.selector;\n if (state === 'finished') {\n table.render();\n } else {\n this.trigger('cell-edited', text, ri, ci);\n }\n}\n\nfunction insertDeleteRowColumn(type) {\n const { data } = this;\n if (data.settings.mode === 'read') return;\n if (type === 'insert-row') {\n data.insert('row');\n } else if (type === 'delete-row') {\n data.delete('row');\n } else if (type === 'insert-column') {\n data.insert('column');\n } else if (type === 'delete-column') {\n data.delete('column');\n } else if (type === 'delete-cell') {\n data.deleteCell();\n } else if (type === 'delete-cell-format') {\n data.deleteCell('format');\n } else if (type === 'delete-cell-text') {\n data.deleteCell('text');\n } else if (type === 'cell-printable') {\n data.setSelectedCellAttr('printable', true);\n } else if (type === 'cell-non-printable') {\n data.setSelectedCellAttr('printable', false);\n } else if (type === 'cell-editable') {\n data.setSelectedCellAttr('editable', true);\n } else if (type === 'cell-non-editable') {\n data.setSelectedCellAttr('editable', false);\n }\n clearClipboard.call(this);\n sheetReset.call(this);\n}\n\nfunction toolbarChange(type, value) {\n const { data } = this;\n if (type === 'undo') {\n this.undo();\n } else if (type === 'redo') {\n this.redo();\n } else if (type === 'print') {\n this.print.preview();\n } else if (type === 'paintformat') {\n if (value === true) copy.call(this);\n else clearClipboard.call(this);\n } else if (type === 'clearformat') {\n insertDeleteRowColumn.call(this, 'delete-cell-format');\n } else if (type === 'link') {\n // link\n } else if (type === 'chart') {\n // chart\n } else if (type === 'autofilter') {\n // filter\n autofilter.call(this);\n } else if (type === 'freeze') {\n if (value) {\n const { ri, ci } = data.selector;\n this.freeze(ri, ci);\n } else {\n this.freeze(0, 0);\n }\n } else {\n data.setSelectedCellAttr(type, value);\n if (type === 'formula' && !data.selector.multiple()) {\n editorSet.call(this);\n }\n sheetReset.call(this);\n }\n}\n\nfunction sortFilterChange(ci, order, operator, value) {\n // console.log('sort:', sortDesc, operator, value);\n this.data.setAutoFilter(ci, order, operator, value);\n sheetReset.call(this);\n}\n\nfunction sheetInitEvents() {\n const {\n selector,\n overlayerEl,\n rowResizer,\n colResizer,\n verticalScrollbar,\n horizontalScrollbar,\n editor,\n contextMenu,\n toolbar,\n modalValidation,\n sortFilter,\n } = this;\n // overlayer\n overlayerEl\n .on('mousemove', (evt) => {\n overlayerMousemove.call(this, evt);\n })\n .on('mousedown', (evt) => {\n editor.clear();\n contextMenu.hide();\n // the left mouse button: mousedown → mouseup → click\n // the right mouse button: mousedown → contenxtmenu → mouseup\n if (evt.buttons === 2) {\n if (this.data.xyInSelectedRect(evt.offsetX, evt.offsetY)) {\n contextMenu.setPosition(evt.offsetX, evt.offsetY);\n } else {\n overlayerMousedown.call(this, evt);\n contextMenu.setPosition(evt.offsetX, evt.offsetY);\n }\n evt.stopPropagation();\n } else if (evt.detail === 2) {\n editorSet.call(this);\n } else {\n overlayerMousedown.call(this, evt);\n }\n })\n .on('mousewheel.stop', (evt) => {\n overlayerMousescroll.call(this, evt);\n })\n .on('mouseout', (evt) => {\n const { offsetX, offsetY } = evt;\n if (offsetY <= 0) colResizer.hide();\n if (offsetX <= 0) rowResizer.hide();\n });\n\n selector.inputChange = (v) => {\n dataSetCellText.call(this, v, 'input');\n editorSet.call(this);\n };\n\n // slide on mobile\n bindTouch(overlayerEl.el, {\n move: (direction, d) => {\n overlayerTouch.call(this, direction, d);\n },\n });\n\n // toolbar change\n toolbar.change = (type, value) => toolbarChange.call(this, type, value);\n\n // sort filter ok\n sortFilter.ok = (ci, order, o, v) => sortFilterChange.call(this, ci, order, o, v);\n\n // resizer finished callback\n rowResizer.finishedFn = (cRect, distance) => {\n rowResizerFinished.call(this, cRect, distance);\n };\n colResizer.finishedFn = (cRect, distance) => {\n colResizerFinished.call(this, cRect, distance);\n };\n // resizer unhide callback\n rowResizer.unhideFn = (index) => {\n unhideRowsOrCols.call(this, 'row', index);\n };\n colResizer.unhideFn = (index) => {\n unhideRowsOrCols.call(this, 'col', index);\n };\n // scrollbar move callback\n verticalScrollbar.moveFn = (distance, evt) => {\n verticalScrollbarMove.call(this, distance, evt);\n };\n horizontalScrollbar.moveFn = (distance, evt) => {\n horizontalScrollbarMove.call(this, distance, evt);\n };\n // editor\n editor.change = (state, itext) => {\n dataSetCellText.call(this, itext, state);\n };\n // modal validation\n modalValidation.change = (action, ...args) => {\n if (action === 'save') {\n this.data.addValidation(...args);\n } else {\n this.data.removeValidation();\n }\n };\n // contextmenu\n contextMenu.itemClick = (type) => {\n // console.log('type:', type);\n if (type === 'validation') {\n modalValidation.setValue(this.data.getSelectedValidation());\n } else if (type === 'copy') {\n copy.call(this);\n } else if (type === 'cut') {\n cut.call(this);\n } else if (type === 'paste') {\n paste.call(this, 'all');\n } else if (type === 'paste-value') {\n paste.call(this, 'text');\n } else if (type === 'paste-format') {\n paste.call(this, 'format');\n } else if (type === 'hide') {\n hideRowsOrCols.call(this);\n } else {\n insertDeleteRowColumn.call(this, type);\n }\n };\n\n bind(window, 'resize', () => {\n this.reload();\n });\n\n bind(window, 'click', (evt) => {\n this.focusing = overlayerEl.contains(evt.target);\n });\n\n bind(window, 'paste', (evt) => {\n if (!this.focusing) return;\n paste.call(this, 'all', evt);\n evt.preventDefault();\n });\n\n // for selector\n bind(window, 'keydown', (evt) => {\n if (!this.focusing) return;\n const keyCode = evt.keyCode || evt.which;\n const {\n key, ctrlKey, shiftKey, metaKey,\n } = evt;\n // console.log('keydown.evt: ', keyCode);\n if (ctrlKey || metaKey) {\n // const { sIndexes, eIndexes } = selector;\n // let what = 'all';\n // if (shiftKey) what = 'text';\n // if (altKey) what = 'format';\n switch (keyCode) {\n case 90:\n // undo: ctrl + z\n this.undo();\n evt.preventDefault();\n break;\n case 89:\n // redo: ctrl + y\n this.redo();\n evt.preventDefault();\n break;\n case 67:\n // ctrl + c\n copy.call(this);\n evt.preventDefault();\n break;\n case 88:\n // ctrl + x\n cut.call(this);\n evt.preventDefault();\n break;\n case 85:\n // ctrl + u\n toolbar.trigger('underline');\n evt.preventDefault();\n break;\n case 86:\n // ctrl + v\n // => paste\n // evt.preventDefault();\n break;\n case 37:\n // ctrl + left\n selectorMove.call(this, shiftKey, 'row-first');\n evt.preventDefault();\n break;\n case 38:\n // ctrl + up\n selectorMove.call(this, shiftKey, 'col-first');\n evt.preventDefault();\n break;\n case 39:\n // ctrl + right\n selectorMove.call(this, shiftKey, 'row-last');\n evt.preventDefault();\n break;\n case 40:\n // ctrl + down\n selectorMove.call(this, shiftKey, 'col-last');\n evt.preventDefault();\n break;\n case 32:\n // ctrl + space, all cells in col\n selectorSet.call(this, false, -1, this.data.selector.ci, false);\n evt.preventDefault();\n break;\n case 66:\n // ctrl + B\n toolbar.trigger('bold');\n break;\n case 73:\n // ctrl + I\n toolbar.trigger('italic');\n break;\n default:\n break;\n }\n } else {\n // console.log('evt.keyCode:', evt.keyCode);\n switch (keyCode) {\n case 32:\n if (shiftKey) {\n // shift + space, all cells in row\n selectorSet.call(this, false, this.data.selector.ri, -1, false);\n }\n break;\n case 27: // esc\n contextMenu.hide();\n clearClipboard.call(this);\n break;\n case 37: // left\n selectorMove.call(this, shiftKey, 'left');\n evt.preventDefault();\n break;\n case 38: // up\n selectorMove.call(this, shiftKey, 'up');\n evt.preventDefault();\n break;\n case 39: // right\n selectorMove.call(this, shiftKey, 'right');\n evt.preventDefault();\n break;\n case 40: // down\n selectorMove.call(this, shiftKey, 'down');\n evt.preventDefault();\n break;\n case 9: // tab\n editor.clear();\n // shift + tab => move left\n // tab => move right\n selectorMove.call(this, false, shiftKey ? 'left' : 'right');\n evt.preventDefault();\n break;\n case 13: // enter\n editor.clear();\n // shift + enter => move up\n // enter => move down\n selectorMove.call(this, false, shiftKey ? 'up' : 'down');\n evt.preventDefault();\n break;\n case 8: // backspace\n insertDeleteRowColumn.call(this, 'delete-cell-text');\n evt.preventDefault();\n break;\n default:\n break;\n }\n\n if (key === 'Delete') {\n insertDeleteRowColumn.call(this, 'delete-cell-text');\n evt.preventDefault();\n } else if ((keyCode >= 65 && keyCode <= 90)\n || (keyCode >= 48 && keyCode <= 57)\n || (keyCode >= 96 && keyCode <= 105)\n || evt.key === '='\n ) {\n dataSetCellText.call(this, evt.key, 'input');\n editorSet.call(this);\n } else if (keyCode === 113) {\n // F2\n editorSet.call(this);\n }\n }\n });\n}\n\nexport default class Sheet {\n constructor(targetEl, data) {\n this.eventMap = createEventEmitter();\n const { view, showToolbar, showContextmenu } = data.settings;\n this.el = h('div', `${cssPrefix}-sheet`);\n this.toolbar = new Toolbar(data, view.width, !showToolbar);\n this.print = new Print(data);\n targetEl.children(this.toolbar.el, this.el, this.print.el);\n this.data = data;\n // table\n this.tableEl = h('canvas', `${cssPrefix}-table`);\n // resizer\n this.rowResizer = new Resizer(false, data.rows.height);\n this.colResizer = new Resizer(true, data.cols.minWidth);\n // scrollbar\n this.verticalScrollbar = new Scrollbar(true);\n this.horizontalScrollbar = new Scrollbar(false);\n // editor\n this.editor = new Editor(\n formulas,\n () => this.getTableOffset(),\n data.rows.height,\n );\n // data validation\n this.modalValidation = new ModalValidation();\n // contextMenu\n this.contextMenu = new ContextMenu(() => this.getRect(), !showContextmenu);\n // selector\n this.selector = new Selector(data);\n this.overlayerCEl = h('div', `${cssPrefix}-overlayer-content`)\n .children(\n this.editor.el,\n this.selector.el,\n );\n this.overlayerEl = h('div', `${cssPrefix}-overlayer`)\n .child(this.overlayerCEl);\n // sortFilter\n this.sortFilter = new SortFilter();\n // root element\n this.el.children(\n this.tableEl,\n this.overlayerEl.el,\n this.rowResizer.el,\n this.colResizer.el,\n this.verticalScrollbar.el,\n this.horizontalScrollbar.el,\n this.contextMenu.el,\n this.modalValidation.el,\n this.sortFilter.el,\n );\n // table\n this.table = new Table(this.tableEl.el, data);\n sheetInitEvents.call(this);\n sheetReset.call(this);\n // init selector [0, 0]\n selectorSet.call(this, false, 0, 0);\n }\n\n on(eventName, func) {\n this.eventMap.on(eventName, func);\n return this;\n }\n\n trigger(eventName, ...args) {\n const { eventMap } = this;\n eventMap.fire(eventName, args);\n }\n\n resetData(data) {\n // before\n this.editor.clear();\n // after\n this.data = data;\n verticalScrollbarSet.call(this);\n horizontalScrollbarSet.call(this);\n this.toolbar.resetData(data);\n this.print.resetData(data);\n this.selector.resetData(data);\n this.table.resetData(data);\n }\n\n loadData(data) {\n this.data.setData(data);\n sheetReset.call(this);\n return this;\n }\n\n // freeze rows or cols\n freeze(ri, ci) {\n const { data } = this;\n data.setFreeze(ri, ci);\n sheetReset.call(this);\n return this;\n }\n\n undo() {\n this.data.undo();\n sheetReset.call(this);\n }\n\n redo() {\n this.data.redo();\n sheetReset.call(this);\n }\n\n reload() {\n sheetReset.call(this);\n return this;\n }\n\n getRect() {\n const { data } = this;\n return { width: data.viewWidth(), height: data.viewHeight() };\n }\n\n getTableOffset() {\n const { rows, cols } = this.data;\n const { width, height } = this.getRect();\n return {\n width: width - cols.indexWidth,\n height: height - rows.height,\n left: cols.indexWidth,\n top: rows.height,\n };\n }\n}\n","import { h } from './element';\nimport { bindClickoutside, unbindClickoutside } from './event';\nimport { cssPrefix } from '../config';\nimport Icon from './icon';\nimport FormInput from './form_input';\nimport Dropdown from './dropdown';\n// Record: temp not used\n// import { xtoast } from './message';\nimport { tf } from '../locale/locale';\n\nclass DropdownMore extends Dropdown {\n constructor(click) {\n const icon = new Icon('ellipsis');\n super(icon, 'auto', false, 'top-left');\n this.contentClick = click;\n }\n\n reset(items) {\n const eles = items.map((it, i) => h('div', `${cssPrefix}-item`)\n .css('width', '150px')\n .css('font-weight', 'normal')\n .on('click', () => {\n this.contentClick(i);\n this.hide();\n })\n .child(it));\n this.setContentChildren(...eles);\n }\n\n setTitle() {}\n}\n\nconst menuItems = [\n { key: 'delete', title: tf('contextmenu.deleteSheet') },\n];\n\nfunction buildMenuItem(item) {\n return h('div', `${cssPrefix}-item`)\n .child(item.title())\n .on('click', () => {\n this.itemClick(item.key);\n this.hide();\n });\n}\n\nfunction buildMenu() {\n return menuItems.map(it => buildMenuItem.call(this, it));\n}\n\nclass ContextMenu {\n constructor() {\n this.el = h('div', `${cssPrefix}-contextmenu`)\n .css('width', '160px')\n .children(...buildMenu.call(this))\n .hide();\n this.itemClick = () => {};\n }\n\n hide() {\n const { el } = this;\n el.hide();\n unbindClickoutside(el);\n }\n\n setOffset(offset) {\n const { el } = this;\n el.offset(offset);\n el.show();\n bindClickoutside(el);\n }\n}\n\nexport default class Bottombar {\n constructor(addFunc = () => {},\n swapFunc = () => {},\n deleteFunc = () => {},\n updateFunc = () => {}) {\n this.swapFunc = swapFunc;\n this.updateFunc = updateFunc;\n this.dataNames = [];\n this.activeEl = null;\n this.deleteEl = null;\n this.items = [];\n this.moreEl = new DropdownMore((i) => {\n this.clickSwap2(this.items[i]);\n });\n this.contextMenu = new ContextMenu();\n this.contextMenu.itemClick = deleteFunc;\n this.el = h('div', `${cssPrefix}-bottombar`).children(\n this.contextMenu.el,\n this.menuEl = h('ul', `${cssPrefix}-menu`).child(\n h('li', '').children(\n new Icon('add').on('click', () => {\n addFunc();\n }),\n h('span', '').child(this.moreEl),\n ),\n ),\n );\n }\n\n addItem(name, active) {\n this.dataNames.push(name);\n const item = h('li', active ? 'active' : '').child(name);\n item.on('click', () => {\n this.clickSwap2(item);\n }).on('contextmenu', (evt) => {\n const { offsetLeft, offsetHeight } = evt.target;\n this.contextMenu.setOffset({ left: offsetLeft, bottom: offsetHeight + 1 });\n this.deleteEl = item;\n }).on('dblclick', () => {\n const v = item.html();\n const input = new FormInput('auto', '');\n input.val(v);\n input.input.on('blur', ({ target }) => {\n const { value } = target;\n const nindex = this.dataNames.findIndex(it => it === v);\n this.renameItem(nindex, value);\n /*\n this.dataNames.splice(nindex, 1, value);\n this.moreEl.reset(this.dataNames);\n item.html('').child(value);\n this.updateFunc(nindex, value);\n */\n });\n item.html('').child(input.el);\n input.focus();\n });\n if (active) {\n this.clickSwap(item);\n }\n this.items.push(item);\n this.menuEl.child(item);\n this.moreEl.reset(this.dataNames);\n }\n\n renameItem(index, value) {\n this.dataNames.splice(index, 1, value);\n this.moreEl.reset(this.dataNames);\n this.items[index].html('').child(value);\n this.updateFunc(index, value);\n }\n\n clear() {\n this.items.forEach((it) => {\n this.menuEl.removeChild(it.el);\n });\n this.items = [];\n this.dataNames = [];\n this.moreEl.reset(this.dataNames);\n }\n\n deleteItem() {\n const { activeEl, deleteEl } = this;\n if (this.items.length > 1) {\n const index = this.items.findIndex(it => it === deleteEl);\n this.items.splice(index, 1);\n this.dataNames.splice(index, 1);\n this.menuEl.removeChild(deleteEl.el);\n this.moreEl.reset(this.dataNames);\n if (activeEl === deleteEl) {\n const [f] = this.items;\n this.activeEl = f;\n this.activeEl.toggle();\n return [index, 0];\n }\n return [index, -1];\n }\n return [-1];\n }\n\n clickSwap2(item) {\n const index = this.items.findIndex(it => it === item);\n this.clickSwap(item);\n this.activeEl.toggle();\n this.swapFunc(index);\n }\n\n clickSwap(item) {\n if (this.activeEl !== null) {\n this.activeEl.toggle();\n }\n this.activeEl = item;\n }\n}\n","/* global window, document */\nimport { h } from './component/element';\nimport DataProxy from './core/data_proxy';\nimport Sheet from './component/sheet';\nimport Bottombar from './component/bottombar';\nimport { cssPrefix } from './config';\nimport { locale } from './locale/locale';\nimport './index.less';\n\n\nclass Spreadsheet {\n constructor(selectors, options = {}) {\n let targetEl = selectors;\n this.options = { showBottomBar: true, ...options };\n this.sheetIndex = 1;\n this.datas = [];\n if (typeof selectors === 'string') {\n targetEl = document.querySelector(selectors);\n }\n this.bottombar = this.options.showBottomBar ? new Bottombar(() => {\n const d = this.addSheet();\n this.sheet.resetData(d);\n }, (index) => {\n const d = this.datas[index];\n this.sheet.resetData(d);\n }, () => {\n this.deleteSheet();\n }, (index, value) => {\n this.datas[index].name = value;\n }) : null;\n this.data = this.addSheet();\n const rootEl = h('div', `${cssPrefix}`)\n .on('contextmenu', evt => evt.preventDefault());\n // create canvas element\n targetEl.appendChild(rootEl.el);\n this.sheet = new Sheet(rootEl, this.data);\n if (this.bottombar !== null) {\n rootEl.child(this.bottombar.el);\n }\n }\n\n addSheet(name, active = true) {\n const n = name || `sheet${this.sheetIndex}`;\n const d = new DataProxy(n, this.options);\n d.change = (...args) => {\n this.sheet.trigger('change', ...args);\n };\n this.datas.push(d);\n // console.log('d:', n, d, this.datas);\n if (this.bottombar !== null) {\n this.bottombar.addItem(n, active);\n }\n this.sheetIndex += 1;\n return d;\n }\n\n deleteSheet() {\n if (this.bottombar === null) return;\n\n const [oldIndex, nindex] = this.bottombar.deleteItem();\n if (oldIndex >= 0) {\n this.datas.splice(oldIndex, 1);\n if (nindex >= 0) this.sheet.resetData(this.datas[nindex]);\n }\n }\n\n loadData(data) {\n const ds = Array.isArray(data) ? data : [data];\n if (this.bottombar !== null) {\n this.bottombar.clear();\n }\n this.datas = [];\n if (ds.length > 0) {\n for (let i = 0; i < ds.length; i += 1) {\n const it = ds[i];\n const nd = this.addSheet(it.name, i === 0);\n nd.setData(it);\n if (i === 0) {\n this.sheet.resetData(nd);\n }\n }\n }\n return this;\n }\n\n getData() {\n return this.datas.map(it => it.getData());\n }\n\n cellText(ri, ci, text, sheetIndex = 0) {\n this.datas[sheetIndex].setCellText(ri, ci, text, 'finished');\n return this;\n }\n\n cell(ri, ci, sheetIndex = 0) {\n return this.datas[sheetIndex].getCell(ri, ci);\n }\n\n cellStyle(ri, ci, sheetIndex = 0) {\n return this.datas[sheetIndex].getCellStyle(ri, ci);\n }\n\n reRender() {\n this.sheet.table.render();\n return this;\n }\n\n on(eventName, func) {\n this.sheet.on(eventName, func);\n return this;\n }\n\n validate() {\n const { validations } = this.data;\n return validations.errors.size <= 0;\n }\n\n change(cb) {\n this.sheet.on('change', cb);\n return this;\n }\n\n static locale(lang, message) {\n locale(lang, message);\n }\n}\n\nconst spreadsheet = (el, options = {}) => new Spreadsheet(el, options);\n\nif (window) {\n window.x_spreadsheet = spreadsheet;\n window.x_spreadsheet.locale = (lang, message) => locale(lang, message);\n}\n\nexport default Spreadsheet;\nexport {\n spreadsheet,\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { FileSpreadsheet } from 'lucide-react';\nimport ExcelJS from 'exceljs';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport { convertWorkbookToSpreadsheetData } from '../../utils/excelDataConverter';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface XlsxRendererProps {\n url: string;\n}\n\nexport const XlsxRenderer: React.FC<XlsxRendererProps> = ({ url }) => {\n const t = useTranslator();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n // 清空容器\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n // 监听容器尺寸变化\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadExcel = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(t('xlsx.not_found'));\n } else if (response.status === 403) {\n throw new Error('无权限访问此文件');\n } else {\n throw new Error(`文件加载失败 (${response.status})`);\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n // 使用 exceljs 解析\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer);\n\n // 转换为 x-data-spreadsheet 数据格式\n const sheetData = convertWorkbookToSpreadsheetData(workbook);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n\n // 挂载 x-data-spreadsheet\n mountSpreadsheet();\n\n setLoading(false);\n } catch (err) {\n if (isMounted) {\n console.error('Excel 解析错误:', err);\n let errorMsg = t('xlsx.parse_failed');\n if (err instanceof Error) {\n errorMsg = err.message;\n }\n setError(errorMsg);\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadExcel();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {/* 加载状态 */}\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('xlsx.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 错误状态 */}\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <div className=\"rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-green-500 rfp-via-emerald-500 rfp-to-teal-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl\">\n <FileSpreadsheet className=\"rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary\" />\n </div>\n <p className=\"rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium\">{t('xlsx.load_failed')}</p>\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6\">\n {error}\n </p>\n <a\n href={url}\n download\n className=\"rfp-inline-flex rfp-items-center rfp-gap-2 rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-bg-gradient-to-r rfp-from-purple-500 rfp-to-pink-500 rfp-text-fg-primary rfp-text-sm md:rfp-text-base rfp-rounded-lg md:rfp-rounded-xl hover:rfp-scale-105 rfp-transition-all rfp-shadow-lg\"\n >\n <svg className=\"rfp-w-4 rfp-h-4 md:rfp-w-5 md:rfp-h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n {t('common.download')}\n </a>\n <p className=\"rfp-text-xs rfp-text-fg-muted rfp-mt-3 md:rfp-mt-4\">\n 提示:可以使用 Microsoft Excel 或 WPS 打开\n </p>\n </div>\n </div>\n )}\n\n {/* Spreadsheet 容器 */}\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Presentation } from 'lucide-react';\nimport { init } from 'pptx-preview';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface PptxRendererProps {\n url: string;\n /** 是否平铺展示所有页面,默认 true */\n tiled?: boolean;\n}\n\nexport const PptxRenderer: React.FC<PptxRendererProps> = ({ url, tiled = true }) => {\n const t = useTranslator();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [slideCount, setSlideCount] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const previewerRef = useRef<ReturnType<typeof init> | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const arrayBufferRef = useRef<ArrayBuffer | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n // 计算容器尺寸,带回退逻辑\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 960, height: 540 };\n const rawWidth = containerRef.current.clientWidth;\n const parentWidth = containerRef.current.parentElement?.clientWidth || 0;\n // 如果容器宽度太小,回退到父容器宽度或默认最小值\n const containerWidth = rawWidth > 100 ? rawWidth : (parentWidth > 100 ? parentWidth : 300);\n // 16:9 比例\n const height = Math.floor(containerWidth * 9 / 16);\n return { width: containerWidth, height };\n }, []);\n\n // 重新初始化预览器\n const reinitializePreviewer = useCallback(async () => {\n if (!containerRef.current || !arrayBufferRef.current || slideCount === 0) return;\n\n try {\n // 销毁旧的预览器\n if (previewerRef.current) {\n try {\n previewerRef.current.destroy();\n } catch {\n // 忽略销毁错误\n }\n }\n\n // 清空容器\n containerRef.current.innerHTML = '';\n\n // 获取当前容器尺寸\n const currentDimensions = calculateDimensions();\n\n // 初始化新的预览器,平铺模式下高度按页数计算\n const previewer = init(containerRef.current, {\n width: currentDimensions.width,\n height: tiled ? currentDimensions.height * slideCount : currentDimensions.height,\n mode: tiled ? 'list' : 'slide',\n });\n previewerRef.current = previewer;\n\n // 重新预览\n await previewer.preview(arrayBufferRef.current);\n } catch {\n // 重新初始化失败,静默处理\n }\n }, [calculateDimensions, tiled, slideCount]);\n\n // 监听容器尺寸变化\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n // 跳过初始渲染时的尺寸检查\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n\n // 检查尺寸是否真正变化(至少变化10px才触发)\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) {\n return;\n }\n\n // 更新最后的尺寸\n lastDimensionsRef.current = newDimensions;\n\n // 清除之前的定时器\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n // 防抖:800ms 后重新初始化预览器\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (previewerRef.current && arrayBufferRef.current) {\n reinitializePreviewer();\n }\n }, 800);\n };\n\n // 创建 ResizeObserver\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n // 开始观察容器\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, reinitializePreviewer]);\n\n useEffect(() => {\n let isMounted = true;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const loadPptx = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n // 设置30秒超时\n timeoutId = setTimeout(() => {\n if (isMounted) {\n setError(t('pptx.timeout'));\n setLoading(false);\n }\n }, 30000);\n\n try {\n // 获取文件,处理 CORS 和重定向\n const response = await fetch(url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(t('pptx.not_found'));\n } else if (response.status === 403) {\n throw new Error('无权限访问此文件');\n } else if (response.status >= 500) {\n throw new Error('服务器错误,请稍后重试');\n } else {\n throw new Error(`文件加载失败 (${response.status})`);\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n // 验证文件大小\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n arrayBufferRef.current = arrayBuffer;\n\n if (!isMounted) return;\n\n // 步骤 1: 创建隐藏容器,预处理获取 slideCount\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.cssText = 'position:absolute;left:-9999px;top:-9999px;visibility:hidden';\n document.body.appendChild(hiddenContainer);\n\n try {\n // 在隐藏容器中初始化临时预览器获取页数\n const tempPreviewer = init(hiddenContainer, {\n width: 100,\n height: 100,\n mode: 'slide',\n });\n\n try {\n await tempPreviewer.preview(arrayBuffer);\n } catch {\n throw new Error(t('pptx.invalid_format'));\n }\n\n const count = tempPreviewer.slideCount;\n\n if (!count || count === 0) {\n throw new Error(t('pptx.no_pages'));\n }\n\n // 销毁临时预览器\n tempPreviewer.destroy();\n\n if (!isMounted) return;\n\n // 保存 slideCount\n setSlideCount(count);\n\n // 步骤 2: 清空真实容器并初始化\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n\n const currentDimensions = calculateDimensions();\n\n // 步骤 3: 初始化真实预览器,平铺模式下使用正确的总高度\n const previewer = init(containerRef.current, {\n width: currentDimensions.width,\n height: tiled ? currentDimensions.height * count : currentDimensions.height,\n mode: tiled ? 'list' : 'slide',\n });\n previewerRef.current = previewer;\n\n // 步骤 4: 预览 PPTX\n await previewer.preview(arrayBuffer);\n\n // 清除超时定时器\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (isMounted) {\n setLoading(false);\n }\n } finally {\n // 移除隐藏容器\n if (document.body.contains(hiddenContainer)) {\n document.body.removeChild(hiddenContainer);\n }\n }\n } catch (err) {\n // 清除超时定时器\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (isMounted) {\n let errorMsg = t('pptx.parse_failed');\n if (err instanceof Error) {\n errorMsg = err.message;\n } else if (typeof err === 'string') {\n errorMsg = err;\n }\n setError(errorMsg);\n setLoading(false);\n }\n }\n };\n\n // 延迟执行,使用 requestAnimationFrame 确保 DOM 已准备好\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n loadPptx();\n });\n });\n }, 150);\n\n // 清理函数\n return () => {\n isMounted = false;\n clearTimeout(timer);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n arrayBufferRef.current = null;\n setSlideCount(0);\n if (previewerRef.current) {\n try {\n previewerRef.current.destroy();\n } catch {\n // 忽略销毁错误\n }\n }\n previewerRef.current = null;\n };\n }, [url, calculateDimensions, tiled]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {/* 加载状态 - 绝对定位覆盖 */}\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('pptx.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 错误状态 - 绝对定位覆盖 */}\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <div className=\"rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-orange-500 rfp-via-red-500 rfp-to-pink-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl\">\n <Presentation className=\"rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary\" />\n </div>\n <p className=\"rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium\">{t('pptx.load_failed')}</p>\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6\">\n {error}\n </p>\n <a\n href={url}\n download\n className=\"rfp-inline-flex rfp-items-center rfp-gap-2 rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-bg-gradient-to-r rfp-from-purple-500 rfp-to-pink-500 rfp-text-fg-primary rfp-text-sm md:rfp-text-base rfp-rounded-lg md:rfp-rounded-xl hover:rfp-scale-105 rfp-transition-all rfp-shadow-lg\"\n >\n <svg className=\"rfp-w-4 rfp-h-4 md:rfp-w-5 md:rfp-h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n {t('common.download')}\n </a>\n <p className=\"rfp-text-xs rfp-text-fg-muted rfp-mt-3 md:rfp-mt-4\">\n 提示:可以使用 Microsoft PowerPoint 或 WPS 打开\n </p>\n </div>\n </div>\n )}\n\n {/* PPT 容器 - 仅在非错误状态下渲染 */}\n {!error && (\n <div\n ref={containerRef}\n className=\"pptx-wrapper rfp-w-full rfp-max-w-full md:rfp-max-w-6xl\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport MsgReader from '@kenjiuno/msgreader';\nimport type { FieldsData } from '@kenjiuno/msgreader';\nimport { User, Users, Paperclip, Calendar, Mail, Tag, Clock, Hash } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface MsgRendererProps {\n url: string;\n}\n\nfunction formatRecipients(recipients: FieldsData[] | undefined, type: 'to' | 'cc' | 'bcc'): string {\n if (!recipients) return '';\n return recipients\n .filter((r) => r.recipType === type)\n .map((r) => {\n const name = r.name || '';\n const email = r.smtpAddress || r.email || '';\n if (name && email && name !== email) {\n return `${name} <${email}>`;\n }\n return name || email;\n })\n .filter(Boolean)\n .join('; ');\n}\n\nfunction formatDate(dateStr: string | undefined): string {\n if (!dateStr) return '';\n try {\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n return date.toLocaleString();\n } catch {\n return dateStr;\n }\n}\n\nfunction decodeHtmlBody(fields: FieldsData, emptyBodyText: string): string {\n // 优先使用 bodyHtml (string 类型)\n if (fields.bodyHtml) {\n return fields.bodyHtml;\n }\n // 其次尝试 html (Uint8Array 类型)\n if (fields.html) {\n try {\n const decoder = new TextDecoder('utf-8');\n return decoder.decode(fields.html);\n } catch {\n // fallback\n }\n }\n // 最后使用纯文本,转换为简单 HTML\n if (fields.body) {\n return `<pre style=\"white-space: pre-wrap; word-wrap: break-word; font-family: system-ui, sans-serif;\">${fields.body.replace(/&/g, '&').replace(/\\x3c/g, '<').replace(/>/g, '>')\n }</pre>`;\n }\n return `<p style=\"color: #999;\">${emptyBodyText}</p>`;\n}\n\nfunction formatMessageClass(messageClass: string | undefined): string {\n if (!messageClass) return '';\n const classMap: Record<string, string> = {\n 'IPM.Note': 'Email',\n 'IPM.Note.SMIME': 'Encrypted Email',\n 'IPM.Note.SMIME.MultipartSigned': 'Signed Email',\n 'IPM.Appointment': 'Appointment',\n 'IPM.Schedule.Meeting.Request': 'Meeting Request',\n 'IPM.Schedule.Meeting.Canceled': 'Meeting Cancellation',\n 'IPM.Contact': 'Contact',\n 'IPM.Task': 'Task',\n 'IPM.StickyNote': 'Sticky Note',\n };\n return classMap[messageClass] || messageClass;\n}\n\nconst labelStyle: React.CSSProperties = {\n flexShrink: 0,\n color: '#6b7280',\n fontWeight: 500,\n marginRight: '8px',\n whiteSpace: 'nowrap',\n};\n\nconst rowStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n padding: '6px 0',\n};\n\nconst iconWrapStyle: React.CSSProperties = {\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n height: '1.4em',\n};\n\nconst iconStyle: React.CSSProperties = {\n flexShrink: 0,\n color: '#9ca3af',\n};\n\nconst valueStyle: React.CSSProperties = {\n color: '#111827',\n wordBreak: 'break-word' as const,\n flex: 1,\n};\n\nexport const MsgRenderer: React.FC<MsgRendererProps> = ({ url }) => {\n const t = useTranslator();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [fields, setFields] = useState<FieldsData | null>(null);\n\n useEffect(() => {\n const loadMsg = async () => {\n setLoading(true);\n setError(null);\n setFields(null);\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('文件加载失败');\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const msgReader = new MsgReader(arrayBuffer);\n const fileData = msgReader.getFileData();\n setFields(fileData);\n } catch (err) {\n console.error('MSG 解析错误:', err);\n setError(t('msg.parse_failed'));\n } finally {\n setLoading(false);\n }\n };\n\n loadMsg();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error || !fields) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error || t('msg.parse_failed_short')}</p>\n </div>\n </div>\n );\n }\n\n const toStr = formatRecipients(fields.recipients, 'to');\n const ccStr = formatRecipients(fields.recipients, 'cc');\n const bccStr = formatRecipients(fields.recipients, 'bcc');\n const senderName = fields.senderName || '';\n const senderEmail = fields.senderSmtpAddress || fields.senderEmail || '';\n const sender = senderName && senderEmail && senderName !== senderEmail\n ? `${senderName} <${senderEmail}>`\n : senderName || senderEmail;\n const sentDate = formatDate(fields.clientSubmitTime);\n const receivedDate = formatDate(fields.messageDeliveryTime);\n const createdDate = formatDate(fields.creationTime);\n const lastModified = formatDate(fields.lastModificationTime);\n const subject = fields.subject || '(无主题)';\n const attachments = (fields.attachments || []).filter((a) => !a.attachmentHidden);\n const bodyHtml = decodeHtmlBody(fields, t('msg.empty_body'));\n const messageClass = formatMessageClass(fields.messageClass);\n const messageId = fields.messageId || '';\n const fieldsAny = fields as FieldsData & Record<string, unknown>;\n const importance = typeof fieldsAny.importance === 'number' ? fieldsAny.importance : undefined;\n const importanceLabel = importance === 2 ? 'High' : importance === 0 ? 'Low' : '';\n const sensitivity = typeof fieldsAny.sensitivity === 'number' ? fieldsAny.sensitivity : undefined;\n const sensitivityLabels: Record<number, string> = {\n 0: 'Normal',\n 1: 'Personal',\n 2: 'Private',\n 3: 'Confidential',\n };\n const sensitivityLabel = sensitivity !== undefined && sensitivity !== 0 ? sensitivityLabels[sensitivity] || '' : '';\n\n return (\n <div\n className=\"rfp-w-full rfp-h-full rfp-overflow-auto\"\n style={{ background: 'white' }}\n >\n <div\n style={{\n width: '100%',\n background: 'white',\n minHeight: '100%',\n }}\n >\n {/* 邮件头部 */}\n <div style={{ borderBottom: '1px solid #e5e7eb', padding: 'clamp(12px, 3vw, 24px) clamp(16px, 3vw, 28px)', background: '#f9fafb' }}>\n {/* 主题 */}\n <h2 style={{ margin: '0 0 16px 0', fontSize: 'clamp(16px, 2.5vw, 20px)', fontWeight: 600, color: '#111827', lineHeight: 1.4 }}>\n {subject}\n </h2>\n\n {/* 元信息 */}\n <div style={{ display: 'flex', flexDirection: 'column', fontSize: 'clamp(12px, 1.8vw, 14px)', color: '#4b5563' }}>\n {sender && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><User size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>From</span>\n <span style={valueStyle}>{sender}</span>\n </div>\n </div>\n )}\n\n {toStr && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Users size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>To</span>\n <span style={valueStyle}>{toStr}</span>\n </div>\n </div>\n )}\n\n {ccStr && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Users size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Cc</span>\n <span style={valueStyle}>{ccStr}</span>\n </div>\n </div>\n )}\n\n {bccStr && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Users size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Bcc</span>\n <span style={valueStyle}>{bccStr}</span>\n </div>\n </div>\n )}\n\n {sentDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Calendar size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Sent</span>\n <span style={valueStyle}>{sentDate}</span>\n </div>\n </div>\n )}\n\n {receivedDate && receivedDate !== sentDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Clock size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Received</span>\n <span style={valueStyle}>{receivedDate}</span>\n </div>\n </div>\n )}\n\n {!sentDate && !receivedDate && createdDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Calendar size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Date</span>\n <span style={valueStyle}>{createdDate}</span>\n </div>\n </div>\n )}\n\n {importanceLabel && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Tag size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Importance</span>\n <span style={{\n ...valueStyle,\n color: importance === 2 ? '#dc2626' : '#2563eb',\n fontWeight: 500,\n }}>\n {importanceLabel}\n </span>\n </div>\n </div>\n )}\n\n {sensitivityLabel && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Tag size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Sensitivity</span>\n <span style={valueStyle}>{sensitivityLabel}</span>\n </div>\n </div>\n )}\n\n {messageClass && messageClass !== 'Email' && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Mail size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Type</span>\n <span style={valueStyle}>{messageClass}</span>\n </div>\n </div>\n )}\n\n {attachments.length > 0 && (\n <div style={{ ...rowStyle, borderTop: '1px solid #e5e7eb', marginTop: '4px', paddingTop: '10px' }}>\n <span style={iconWrapStyle}><Paperclip size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Attachments</span>\n <div style={{ ...valueStyle, display: 'flex', flexWrap: 'wrap', gap: '6px' }}>\n {attachments.map((a, i) => {\n const name = a.fileName || a.name || '未知文件';\n const size = a.contentLength;\n const sizeStr = size\n ? size > 1048576\n ? `${(size / 1048576).toFixed(1)} MB`\n : size > 1024\n ? `${(size / 1024).toFixed(0)} KB`\n : `${size} B`\n : '';\n return (\n <span\n key={i}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n background: '#f3f4f6',\n borderRadius: '4px',\n fontSize: '13px',\n color: '#374151',\n border: '1px solid #e5e7eb',\n }}\n >\n {name}\n {sizeStr && (\n <span style={{ color: '#9ca3af', fontSize: '12px' }}>({sizeStr})</span>\n )}\n </span>\n );\n })}\n </div>\n </div>\n </div>\n )}\n\n {messageId && (\n <div style={{ ...rowStyle, borderTop: attachments.length > 0 ? 'none' : '1px solid #e5e7eb', marginTop: '4px', paddingTop: '10px' }}>\n <span style={iconWrapStyle}><Hash size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Message-ID</span>\n <span style={{ ...valueStyle, fontSize: '12px', color: '#9ca3af', fontFamily: 'monospace' }}>{messageId}</span>\n </div>\n </div>\n )}\n\n {lastModified && lastModified !== sentDate && lastModified !== receivedDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Clock size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Modified</span>\n <span style={{ ...valueStyle, fontSize: '12px', color: '#9ca3af' }}>{lastModified}</span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* 邮件正文 */}\n <div\n style={{\n padding: 'clamp(12px, 3vw, 24px) clamp(16px, 3vw, 28px)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n lineHeight: '1.6',\n color: '#333',\n overflowX: 'auto',\n }}\n dangerouslySetInnerHTML={{ __html: bodyHtml }}\n />\n </div>\n </div>\n );\n};\n","import { useEffect, useRef, useState, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport ePub from '@likecoin/epub-ts';\nimport { X } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\n// 全局注入 epubjs 容器样式(只注入一次)\nif (typeof document !== 'undefined' && !document.getElementById('rfp-epub-styles')) {\n const styleEl = document.createElement('style');\n styleEl.id = 'rfp-epub-styles';\n styleEl.textContent = `\n .epub-container { overflow-y: auto !important; scrollbar-width: thin; }\n .epub-container::-webkit-scrollbar { width: 8px; }\n .epub-container::-webkit-scrollbar-track { background: transparent; }\n .epub-container::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.15); border-radius: 4px; }\n .epub-container::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.3); }\n .epub-view > iframe { background: white; }\n `;\n document.head.appendChild(styleEl);\n}\n\nexport interface TocItem {\n label: string;\n href: string;\n subitems?: TocItem[];\n}\n\nexport interface EpubRendererHandle {\n prevPage: () => void;\n nextPage: () => void;\n toggleFullWidth: () => void;\n toggleToc: () => void;\n}\n\ninterface EpubRendererProps {\n url: string;\n onChapterChange?: (current: number, total: number) => void;\n onFullWidthChange?: (isFullWidth: boolean) => void;\n}\n\ninterface RenditionLike {\n display: (target?: string) => Promise<unknown>;\n next: () => Promise<unknown>;\n prev: () => Promise<unknown>;\n on: (event: string, cb: (...args: unknown[]) => void) => void;\n resize: (width: number, height: number) => void;\n currentLocation: () => unknown;\n destroy?: () => void;\n themes: {\n register: (name: string, styles: Record<string, unknown>) => void;\n select: (name: string) => void;\n };\n}\n\ninterface BookLike {\n ready: Promise<unknown>;\n loaded: { navigation: Promise<unknown> };\n locations: {\n generate: (chars: number) => Promise<string[]>;\n length: () => number;\n locationFromCfi: (cfi: string) => number;\n };\n renderTo: (el: HTMLElement, opts: Record<string, unknown>) => RenditionLike;\n destroy: () => void;\n}\n\nconst A4_WIDTH = 794;\n\nexport const EpubRenderer = forwardRef<EpubRendererHandle, EpubRendererProps>(\n ({ url, onChapterChange, onFullWidthChange }, ref) => {\n const t = useTranslator();\n const viewerRef = useRef<HTMLDivElement>(null);\n const bookRef = useRef<BookLike | null>(null);\n const renditionRef = useRef<RenditionLike | null>(null);\n const onChapterChangeRef = useRef(onChapterChange);\n const onFullWidthChangeRef = useRef(onFullWidthChange);\n onChapterChangeRef.current = onChapterChange;\n onFullWidthChangeRef.current = onFullWidthChange;\n\n const totalLocationsRef = useRef(0);\n const lastCfiRef = useRef<string | null>(null);\n const isFullWidthRef = useRef(false);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isFullWidth, setIsFullWidth] = useState(false);\n const [toc, setToc] = useState<TocItem[]>([]);\n const [showToc, setShowToc] = useState(false);\n const [activeTocHref, setActiveTocHref] = useState<string>('');\n const tocRef = useRef<TocItem[]>([]);\n tocRef.current = toc;\n\n isFullWidthRef.current = isFullWidth;\n\n const handlePrev = useCallback(() => {\n renditionRef.current?.prev();\n }, []);\n\n const handleNext = useCallback(() => {\n renditionRef.current?.next();\n }, []);\n\n // 滚动监听:接近底部时强制触发 check 加载后续 section\n const scrollContainerRef = useRef<Element | null>(null);\n const scrollRafRef = useRef(0);\n\n const onScrollRef = useRef((_e?: Event) => {\n const container = scrollContainerRef.current;\n if (!container) return;\n const el = container as HTMLElement;\n const nearBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 200;\n if (nearBottom) {\n try {\n const mgr = (renditionRef.current as unknown as { manager?: { check?: (t?: number, e?: number) => Promise<unknown> } })?.manager;\n mgr?.check?.(500, 500);\n } catch { /* ignore */ }\n }\n });\n\n const reattachScrollListener = useCallback(() => {\n // 清理旧监听\n if (scrollContainerRef.current) {\n scrollContainerRef.current.removeEventListener('scroll', onScrollRef.current);\n scrollContainerRef.current = null;\n }\n cancelAnimationFrame(scrollRafRef.current);\n\n const tryAttach = () => {\n const container = viewerRef.current?.querySelector('.epub-container') ?? null;\n if (!container) {\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n return;\n }\n scrollContainerRef.current = container;\n container.addEventListener('scroll', onScrollRef.current, { passive: true });\n };\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n }, []);\n\n const toggleFullWidth = useCallback(() => {\n const newVal = !isFullWidthRef.current;\n setIsFullWidth(newVal);\n onFullWidthChangeRef.current?.(newVal);\n // 等 CSS transition 完成后再 resize 并恢复位置\n setTimeout(() => {\n const viewer = viewerRef.current;\n const rendition = renditionRef.current;\n if (!viewer || !rendition) return;\n rendition.resize(viewer.offsetWidth, viewer.offsetHeight);\n // 重排后恢复阅读位置\n if (lastCfiRef.current) {\n rendition.display(lastCfiRef.current);\n }\n // resize/display 可能重建 .epub-container,需要重新绑定滚动监听\n reattachScrollListener();\n }, 350);\n }, [reattachScrollListener]);\n\n const toggleToc = useCallback(() => {\n setShowToc(prev => !prev);\n }, []);\n\n const handleTocClick = useCallback((href: string) => {\n setActiveTocHref(href);\n renditionRef.current?.display(href);\n setShowToc(false);\n }, []);\n\n useImperativeHandle(ref, () => ({\n prevPage: handlePrev,\n nextPage: handleNext,\n toggleFullWidth,\n toggleToc,\n }), [handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n setLoading(true);\n setError(null);\n setToc([]);\n setShowToc(false);\n viewer.innerHTML = '';\n lastCfiRef.current = null;\n totalLocationsRef.current = 0;\n\n let cancelled = false;\n // StrictMode 下 effect 会立即 mount→unmount→mount\n // 用 microtask 延迟初始化,让第一次的 cleanup 先执行,避免 epubjs 内部状态被污染\n const loadTimer = window.setTimeout(() => {\n if (cancelled) return;\n load();\n }, 0);\n\n const load = async () => {\n try {\n let bookInput: string | ArrayBuffer = url;\n if (url.startsWith('blob:')) {\n const resp = await fetch(url);\n bookInput = await resp.arrayBuffer();\n }\n\n const book = ePub(bookInput) as unknown as BookLike;\n bookRef.current = book;\n\n const rendition = book.renderTo(viewer, {\n manager: 'continuous',\n flow: 'scrolled',\n width: '100%',\n height: '100%',\n });\n renditionRef.current = rendition;\n\n rendition.themes.register('default', {\n body: {\n background: '#ffffff !important',\n color: '#1a1a1a !important',\n 'font-family': '\"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important',\n 'font-size': '16px !important',\n 'line-height': '2 !important',\n padding: '40px 60px !important',\n 'max-width': '100% !important',\n 'box-sizing': 'border-box !important',\n 'word-break': 'break-word !important',\n 'overflow-wrap': 'break-word !important',\n },\n p: { 'text-indent': '2em !important', margin: '0.8em 0 !important' },\n h1: { 'text-align': 'center !important', margin: '1.5em 0 1em !important' },\n h2: { margin: '1.2em 0 0.8em !important' },\n h3: { margin: '1em 0 0.6em !important' },\n img: { 'max-width': '100% !important', height: 'auto !important' },\n a: { color: '#2563eb !important', 'text-decoration': 'none !important' },\n });\n rendition.themes.select('default');\n\n await book.ready;\n\n // 异步生成 locations 索引(用于实时页数)\n book.locations.generate(1024).then(() => {\n if (cancelled) return;\n totalLocationsRef.current = book.locations.length();\n // 触发一次更新让父组件拿到 total\n const loc = renditionRef.current?.currentLocation() as { start?: { location?: number; cfi?: string } } | undefined;\n const cur = loc?.start?.location ?? 0;\n onChapterChangeRef.current?.(cur + 1, totalLocationsRef.current);\n }).catch(() => { /* ignore */ });\n\n // 获取目录\n const nav = await book.loaded.navigation as { toc?: TocItem[] };\n if (!cancelled && Array.isArray(nav?.toc)) {\n setToc(nav.toc);\n }\n\n await rendition.display();\n\n if (cancelled) return;\n\n setLoading(false);\n onChapterChangeRef.current?.(1, totalLocationsRef.current || 1);\n\n rendition.on('relocated', (location: unknown) => {\n const loc = location as { start?: { cfi?: string; location?: number; href?: string } };\n if (loc?.start?.cfi) {\n lastCfiRef.current = loc.start.cfi;\n }\n if (loc?.start?.href) {\n // 根据 spine href 查找匹配的 TOC 项\n const spineHref = loc.start.href;\n const matches: string[] = [];\n const collect = (items: TocItem[]) => {\n for (const item of items) {\n const base = item.href.split('#')[0];\n if (base && (spineHref === base || spineHref.endsWith('/' + base) || spineHref.endsWith(base))) {\n matches.push(item.href);\n }\n if (item.subitems) collect(item.subitems);\n }\n };\n collect(tocRef.current);\n if (matches.length === 1) {\n // 唯一匹配,直接设置\n setActiveTocHref(matches[0]);\n }\n // 多个匹配(同一文件不同 anchor)时保持当前选中(由点击设置)\n }\n const cur = loc?.start?.location;\n const total = totalLocationsRef.current;\n if (typeof cur === 'number' && total > 0) {\n onChapterChangeRef.current?.(cur + 1, total);\n }\n });\n\n } catch (err) {\n console.error('EPUB 加载错误:', err);\n if (!cancelled) {\n setError(t('epub.load_failed'));\n setLoading(false);\n }\n }\n };\n\n return () => {\n cancelled = true;\n window.clearTimeout(loadTimer);\n try { renditionRef.current?.destroy?.(); } catch { /* ignore */ }\n try { bookRef.current?.destroy(); } catch { /* ignore */ }\n renditionRef.current = null;\n bookRef.current = null;\n };\n }, [url]);\n\n useEffect(() => {\n const onResize = () => {\n const viewer = viewerRef.current;\n if (!viewer || !renditionRef.current) return;\n renditionRef.current.resize(viewer.offsetWidth, viewer.offsetHeight);\n };\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n useEffect(() => {\n reattachScrollListener();\n return () => {\n cancelAnimationFrame(scrollRafRef.current);\n scrollContainerRef.current?.removeEventListener('scroll', onScrollRef.current);\n };\n }, [url, reattachScrollListener]);\n\n const isActive = useCallback((href: string) => {\n return href === activeTocHref;\n }, [activeTocHref]);\n\n const renderTocItems = (items: TocItem[], depth = 0) => (\n <ul style={{ marginLeft: depth > 0 ? 16 : 0 }}>\n {items.map((item, i) => {\n const active = isActive(item.href);\n return (\n <li key={`${item.href}-${i}`}>\n <button\n onClick={() => handleTocClick(item.href)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${active\n ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.label}\n >\n {item.label.trim()}\n </button>\n {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n </li>\n );\n })}\n </ul>\n );\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-[#f5f5f0] rfp-overflow-hidden\">\n {error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n {loading && !error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {/* 目录侧栏 - 滑入动画 */}\n {toc.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{\n opacity: showToc ? 1 : 0,\n pointerEvents: showToc ? 'auto' : 'none',\n }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.toc')}</span>\n <button\n onClick={() => setShowToc(false)}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderTocItems(toc)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowToc(false)}\n />\n </div>\n )}\n\n {!error && (\n <div\n ref={viewerRef}\n className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n style={{\n width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n maxWidth: '100%',\n transition: 'width 0.3s ease',\n overflow: 'hidden',\n }}\n />\n )}\n </div>\n );\n }\n);\n","import {\n useEffect,\n useRef,\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from 'react';\nimport { X } from 'lucide-react';\nimport 'foliate-js/view.js';\nimport type { FoliateView, TocItem } from 'foliate-js/view.js';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\nconst READER_CSS = `\n @namespace epub \"http://www.idpf.org/2007/ops\";\n html { color-scheme: light; }\n body {\n background: #ffffff !important;\n color: #1a1a1a !important;\n font-family: \"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important;\n font-size: 16px !important;\n line-height: 2 !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n }\n p, li, blockquote, dd { line-height: 2; text-align: justify; }\n p { text-indent: 2em; margin: 0.8em 0; }\n h1 { text-align: center; margin: 1.5em 0 1em; }\n h2 { margin: 1.2em 0 0.8em; }\n h3 { margin: 1em 0 0.6em; }\n img { max-width: 100% !important; height: auto !important; }\n a { color: #2563eb; text-decoration: none; }\n pre { white-space: pre-wrap !important; }\n`;\n\nconst A4_WIDTH = 794;\n\nexport interface MobiRendererHandle {\n prevPage: () => void;\n nextPage: () => void;\n toggleFullWidth: () => void;\n toggleToc: () => void;\n}\n\ninterface MobiRendererProps {\n url: string;\n onChapterChange?: (current: number, total: number) => void;\n onFullWidthChange?: (isFullWidth: boolean) => void;\n}\n\nexport const MobiRenderer = forwardRef<MobiRendererHandle, MobiRendererProps>(\n ({ url, onChapterChange, onFullWidthChange }, ref) => {\n const t = useTranslator();\n const hostRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<FoliateView | null>(null);\n const onChapterChangeRef = useRef(onChapterChange);\n const onFullWidthChangeRef = useRef(onFullWidthChange);\n onChapterChangeRef.current = onChapterChange;\n onFullWidthChangeRef.current = onFullWidthChange;\n\n // 模拟 epub.js 的 locations 显示\n const totalLocationsRef = useRef(1);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [toc, setToc] = useState<TocItem[]>([]);\n const [showToc, setShowToc] = useState(false);\n const [activeTocHref, setActiveTocHref] = useState<string>('');\n const [isFullWidth, setIsFullWidth] = useState(false);\n const isFullWidthRef = useRef(false);\n isFullWidthRef.current = isFullWidth;\n\n const reportProgress = useCallback((current: number, total: number) => {\n if (total > 0) totalLocationsRef.current = total;\n onChapterChangeRef.current?.(Math.max(1, current + 1), totalLocationsRef.current);\n }, []);\n\n const handlePrev = useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n view.prev().catch(() => {});\n }, []);\n\n const handleNext = useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n view.next().catch(() => {});\n }, []);\n\n const toggleToc = useCallback(() => setShowToc((prev) => !prev), []);\n\n const toggleFullWidth = useCallback(() => {\n const newVal = !isFullWidthRef.current;\n setIsFullWidth(newVal);\n onFullWidthChangeRef.current?.(newVal);\n // 宽度改变后 paginator 需要重新分页\n const view = viewRef.current;\n if (!view) return;\n const renderer = (view as unknown as { renderer?: HTMLElement }).renderer;\n if (renderer) {\n renderer.setAttribute('max-inline-size', newVal ? '9999' : '720');\n }\n }, []);\n\n const handleTocClick = useCallback((href: string) => {\n setActiveTocHref(href);\n setShowToc(false);\n viewRef.current?.goTo(href).catch(() => {});\n }, []);\n\n useImperativeHandle(ref, () => ({\n prevPage: handlePrev,\n nextPage: handleNext,\n toggleFullWidth,\n toggleToc,\n }), [handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n setLoading(true);\n setError(null);\n setToc([]);\n setShowToc(false);\n setActiveTocHref('');\n host.replaceChildren();\n\n let cancelled = false;\n let view: FoliateView | null = null;\n\n const load = async () => {\n try {\n if (cancelled) return;\n\n view = document.createElement('foliate-view') as FoliateView;\n host.appendChild(view);\n viewRef.current = view;\n\n // 先注册事件\n view.addEventListener('relocate', (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n // SectionProgress 返回的 location 对象: { current, next, total }\n const loc = detail.location as { current?: number; total?: number } | undefined;\n if (loc && typeof loc.current === 'number' && typeof loc.total === 'number') {\n reportProgress(loc.current, loc.total);\n } else {\n // fallback:用 section 级别估算\n const sections = viewRef.current?.book?.sections ?? [];\n const idx = detail.index ?? 0;\n const frac = detail.fraction ?? 0;\n const total = Math.max(sections.length, 1);\n const current = Math.round((idx + frac) / total * total);\n reportProgress(current, total);\n }\n const tocItem = detail.tocItem as { href?: string } | undefined;\n if (tocItem?.href) {\n setActiveTocHref(tocItem.href);\n }\n });\n\n const res = await fetch(url);\n if (!res.ok) throw new Error(`请求失败: ${res.status}`);\n const blob = await res.blob();\n let name = 'book.mobi';\n try {\n const u = new URL(url, window.location.href);\n const base = u.pathname.split('/').pop();\n if (base) name = decodeURIComponent(base);\n } catch { /* blob: URL */ }\n const file = new File([blob], name);\n\n await view.open(file);\n if (cancelled) { view.book?.destroy?.(); return; }\n\n // 配置 paginator:paginated 模式(默认),带动画\n const renderer = (view as unknown as { renderer: HTMLElement & {\n setStyles?: (css: string) => void;\n next?: () => Promise<void>;\n } }).renderer;\n\n if (renderer) {\n // flow=\"paginated\" 是默认值,不需要显式设置\n renderer.setAttribute('animated', '');\n renderer.setAttribute('max-inline-size', '720');\n renderer.setAttribute('margin', '48');\n renderer.setAttribute('gap', '5%');\n renderer.setStyles?.(READER_CSS);\n // 必须调 next() 渲染首页\n await renderer.next?.();\n }\n\n setToc(view.book?.toc ?? []);\n setLoading(false);\n reportProgress(0, view.book?.sections.length ?? 1);\n } catch (err) {\n console.error('MOBI/AZW3 加载错误:', err);\n if (!cancelled) {\n setError(t('mobi.load_failed'));\n setLoading(false);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n try { viewRef.current?.book?.destroy?.(); } catch { /* ignore */ }\n viewRef.current = null;\n host.replaceChildren();\n };\n }, [url, reportProgress]);\n\n const isActive = useCallback(\n (href: string | undefined) => !!href && href === activeTocHref,\n [activeTocHref]\n );\n\n const renderTocItems = (items: TocItem[], depth = 0) => (\n <ul style={{ listStyle: 'none', padding: 0, margin: depth > 0 ? '0 0 0 16px' : 0 }}>\n {items.map((item, i) => (\n <li key={`${item.href ?? item.label}-${i}`}>\n {item.href ? (\n <button\n onClick={() => handleTocClick(item.href!)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${\n isActive(item.href)\n ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.label}\n >\n {item.label?.trim()}\n </button>\n ) : (\n <div className=\"rfp-w-full rfp-py-2 rfp-px-3 rfp-text-sm rfp-text-fg-tertiary rfp-truncate\">\n {item.label?.trim()}\n </div>\n )}\n {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n </li>\n ))}\n </ul>\n );\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-[#f5f5f0] rfp-overflow-hidden\">\n {error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary rfp-text-center rfp-p-6\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n {loading && !error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {/* 目录侧栏 */}\n {toc.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{ opacity: showToc ? 1 : 0, pointerEvents: showToc ? 'auto' : 'none' }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.toc')}</span>\n <button\n onClick={() => setShowToc(false)}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderTocItems(toc)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowToc(false)}\n />\n </div>\n )}\n\n {!error && (\n <div\n ref={hostRef}\n className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n style={{\n width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n maxWidth: '100%',\n transition: 'width 0.3s ease',\n }}\n />\n )}\n </div>\n );\n }\n);\n\nMobiRenderer.displayName = 'MobiRenderer';\n","import { useRef, useEffect, useState } from 'react';\nimport videojs from 'video.js';\nimport 'video.js/dist/video-js.css';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ntype VideoJsPlayer = ReturnType<typeof videojs>;\n\ninterface VideoRendererProps {\n url: string;\n}\n\n// 根据 URL 获取视频 MIME 类型\nconst getVideoType = (url: string): string => {\n const ext = url.split('.').pop()?.toLowerCase().split('?')[0] || '';\n const typeMap: Record<string, string> = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n ogg: 'video/ogg',\n ogv: 'video/ogg',\n mov: 'video/quicktime', // MOV 使用 QuickTime MIME 类型\n avi: 'video/x-msvideo',\n mkv: 'video/x-matroska',\n m4v: 'video/mp4',\n '3gp': 'video/3gpp',\n flv: 'video/x-flv',\n };\n return typeMap[ext] || 'video/mp4';\n};\n\nexport const VideoRenderer: React.FC<VideoRendererProps> = ({ url }) => {\n const t = useTranslator();\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const videoRef = useRef<HTMLDivElement>(null);\n const playerRef = useRef<VideoJsPlayer | null>(null);\n\n useEffect(() => {\n // 确保 Video.js 播放器只初始化一次\n if (!playerRef.current && videoRef.current) {\n const videoElement = document.createElement('video-js');\n videoElement.classList.add('vjs-big-play-centered', 'vjs-theme-apple');\n videoRef.current.appendChild(videoElement);\n\n const videoType = getVideoType(url);\n\n // 为 MOV 格式提供多个 MIME 类型作为备用\n const sources = videoType === 'video/quicktime'\n ? [\n { src: url, type: 'video/quicktime' },\n { src: url, type: 'video/mp4' } // 备用方案\n ]\n : [{ src: url, type: videoType }];\n\n const player = videojs(videoElement, {\n controls: true,\n fill: true,\n preload: 'auto',\n controlBar: {\n children: [\n 'playToggle',\n 'volumePanel',\n 'currentTimeDisplay',\n 'timeDivider',\n 'durationDisplay',\n 'progressControl',\n 'remainingTimeDisplay',\n 'fullscreenToggle'\n ],\n volumePanel: {\n inline: false\n }\n },\n html5: {\n vhs: {\n overrideNative: true\n },\n nativeVideoTracks: false,\n nativeAudioTracks: false,\n nativeTextTracks: false\n },\n sources\n });\n\n // 确保视频保持比例\n const videoEl = player.el().querySelector('video');\n if (videoEl) {\n (videoEl as HTMLVideoElement).style.objectFit = 'contain';\n }\n\n // 监听加载完成\n player.on('loadeddata', () => {\n setIsLoading(false);\n });\n\n player.on('error', () => {\n const error = player.error();\n console.error('Video.js error:', error);\n setError(t('video.load_failed_with_error', { error: error?.message || t('common.unknown_error') }));\n setIsLoading(false);\n });\n\n playerRef.current = player;\n }\n }, [url]);\n\n // 清理函数\n useEffect(() => {\n const player = playerRef.current;\n\n return () => {\n if (player && !player.isDisposed()) {\n player.dispose();\n playerRef.current = null;\n }\n };\n }, []);\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-16 rfp-h-16 rfp-mx-auto rfp-mb-4 rfp-rounded-full rfp-bg-red-500/10 rfp-flex rfp-items-center rfp-justify-center\">\n <svg className=\"rfp-w-8 rfp-h-8 rfp-text-red-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n </div>\n <p className=\"rfp-text-lg rfp-font-medium rfp-text-fg-primary rfp-mb-2\">{t('video.load_failed')}</p>\n <p className=\"rfp-text-sm rfp-text-fg-tertiary\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-full rfp-h-full rfp-relative\">\n {/* 加载状态 */}\n {isLoading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-3 rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-3 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('video.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 视频播放器容器 */}\n <div\n ref={videoRef}\n className=\"rfp-overflow-hidden rfp-w-full rfp-h-full [&_video]:rfp-object-contain\"\n style={{\n boxShadow: '0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05)'\n }}\n />\n </div>\n </div>\n );\n};\n","import { useState, useRef, useEffect, useCallback } from 'react';\n\ninterface UseAudioPlayerOptions {\n url: string;\n skipSeconds?: number;\n}\n\ninterface UseAudioPlayerReturn {\n audioRef: React.RefObject<HTMLAudioElement>;\n isPlaying: boolean;\n isLoading: boolean;\n isLoop: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isMuted: boolean;\n error: string | null;\n togglePlay: () => void;\n seek: (time: number) => void;\n skip: (seconds: number) => void;\n setVolume: (vol: number) => void;\n toggleMute: () => void;\n toggleLoop: () => void;\n formatTime: (time: number) => string;\n}\n\nexport function useAudioPlayer({\n url,\n}: UseAudioPlayerOptions): UseAudioPlayerReturn {\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolumeState] = useState(1);\n const [isMuted, setIsMuted] = useState(false);\n const [isLoop, setIsLoop] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n // 重置加载状态\n setIsLoading(true);\n setError(null);\n\n const onTimeUpdate = () => {\n if (!isNaN(audio.currentTime)) {\n setCurrentTime(audio.currentTime);\n }\n };\n\n const onDurationChange = () => {\n if (!isNaN(audio.duration) && isFinite(audio.duration)) {\n setDuration(audio.duration);\n }\n };\n\n const onCanPlay = () => {\n setIsLoading(false);\n onDurationChange();\n };\n\n const onWaiting = () => setIsLoading(true);\n const onPlaying = () => {\n setIsLoading(false);\n setIsPlaying(true);\n };\n\n // 由 audio 事件驱动播放状态,而非手动设置\n const onPlay = () => setIsPlaying(true);\n const onPause = () => setIsPlaying(false);\n const onEnded = () => setIsPlaying(false);\n\n const onError = () => {\n setError('音频加载失败');\n setIsLoading(false);\n };\n\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onDurationChange);\n audio.addEventListener('durationchange', onDurationChange);\n audio.addEventListener('canplay', onCanPlay);\n audio.addEventListener('waiting', onWaiting);\n audio.addEventListener('playing', onPlaying);\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('error', onError);\n\n // 如果 audio 已经就绪\n if (audio.readyState >= 3) {\n setIsLoading(false);\n onDurationChange();\n } else if (audio.readyState >= 1) {\n onDurationChange();\n }\n\n return () => {\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onDurationChange);\n audio.removeEventListener('durationchange', onDurationChange);\n audio.removeEventListener('canplay', onCanPlay);\n audio.removeEventListener('waiting', onWaiting);\n audio.removeEventListener('playing', onPlaying);\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('error', onError);\n };\n }, [url]);\n\n const togglePlay = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (audio.paused) {\n audio.play().catch(() => {\n // 浏览器自动播放策略拒绝\n });\n } else {\n audio.pause();\n }\n }, []);\n\n const seek = useCallback((time: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = time;\n setCurrentTime(time);\n }, []);\n\n const skip = useCallback(\n (seconds: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = Math.max(\n 0,\n Math.min(audio.currentTime + seconds, audio.duration || Infinity)\n );\n },\n []\n );\n\n const setVolume = useCallback((vol: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n const clamped = Math.max(0, Math.min(1, vol));\n audio.volume = clamped;\n setVolumeState(clamped);\n if (clamped > 0) {\n audio.muted = false;\n setIsMuted(false);\n }\n }, []);\n\n const toggleMute = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.muted = !audio.muted;\n setIsMuted(audio.muted);\n }, []);\n\n const toggleLoop = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n const next = !audio.loop;\n audio.loop = next;\n setIsLoop(next);\n }, []);\n\n const formatTime = useCallback((time: number) => {\n if (!isFinite(time) || isNaN(time) || time < 0) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n }, []);\n\n return {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n };\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Play, Pause, Volume2, VolumeX, Volume1, SkipBack, SkipForward, Repeat } from 'lucide-react';\nimport { useAudioPlayer } from '../../hooks/useAudioPlayer';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\n/** 文本溢出时自动横向滚动 */\nconst MarqueeText: React.FC<{\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}> = ({ text, className = '', style }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [overflow, setOverflow] = useState(false);\n const [scrollDist, setScrollDist] = useState(0);\n\n useEffect(() => {\n const check = () => {\n const container = containerRef.current;\n const inner = innerRef.current;\n if (!container || !inner) return;\n const cw = container.clientWidth;\n const tw = inner.scrollWidth;\n setOverflow(tw > cw);\n setScrollDist(tw);\n };\n check();\n const observer = new ResizeObserver(check);\n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, [text]);\n\n const gap = 60;\n const totalScroll = scrollDist + gap;\n const dur = totalScroll / 40;\n\n return (\n <div\n ref={containerRef}\n className={`rfp-overflow-hidden rfp-whitespace-nowrap ${className}`}\n style={style}\n >\n {overflow ? (\n <motion.div\n className=\"rfp-inline-flex rfp-whitespace-nowrap\"\n animate={{ x: [0, -totalScroll] }}\n transition={{ duration: dur, repeat: Infinity, ease: 'linear', repeatDelay: 1.5 }}\n >\n <span>{text}</span>\n <span style={{ width: gap }} className=\"rfp-inline-block\" />\n <span>{text}</span>\n </motion.div>\n ) : null}\n {/* 始终渲染用于测量的隐藏层 */}\n <div\n ref={innerRef}\n className=\"rfp-whitespace-nowrap\"\n style={overflow ? { position: 'absolute', visibility: 'hidden', pointerEvents: 'none' } : undefined}\n >\n {text}\n </div>\n </div>\n );\n};\n\n/** SVG 唱臂组件 */\nconst Tonearm: React.FC<{ isPlaying: boolean }> = ({ isPlaying }) => (\n <motion.div\n className=\"rfp-absolute\"\n style={{\n top: '-6px',\n right: '2px',\n width: '100px',\n height: '120px',\n transformOrigin: '76px 16px',\n zIndex: 5,\n }}\n animate={{ rotate: isPlaying ? 16 : 0 }}\n transition={{ duration: 0.8, ease: [0.4, 0, 0.2, 1] }}\n >\n <svg\n width=\"100\"\n height=\"120\"\n viewBox=\"0 0 100 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* 底座阴影 */}\n <circle cx=\"76\" cy=\"16\" r=\"13\" fill=\"rgba(0,0,0,0.3)\" />\n {/* 底座外圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"11\" fill=\"url(#baseGrad)\" />\n {/* 底座内圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"6\" fill=\"url(#baseInnerGrad)\" />\n {/* 底座中心轴 */}\n <circle cx=\"76\" cy=\"16\" r=\"2.5\" fill=\"#222\" stroke=\"#555\" strokeWidth=\"0.5\" />\n\n {/* 臂杆 */}\n <path\n d=\"M74 22 L56 88\"\n stroke=\"url(#armGrad)\"\n strokeWidth=\"3.5\"\n strokeLinecap=\"round\"\n />\n {/* 臂杆高光 */}\n <path\n d=\"M74.8 22 L56.8 88\"\n stroke=\"rgba(255,255,255,0.06)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n\n {/* 唱头座 (Headshell) */}\n <rect x=\"50\" y=\"86\" width=\"12\" height=\"7\" rx=\"1.5\" fill=\"url(#headGrad)\" />\n {/* 唱头 (Cartridge) */}\n <rect x=\"52.5\" y=\"92\" width=\"7\" height=\"9\" rx=\"1\" fill=\"url(#cartridgeGrad)\" />\n {/* 唱针 (Stylus) */}\n <line x1=\"56\" y1=\"101\" x2=\"56\" y2=\"105\" stroke=\"#bbb\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"56\" cy=\"105.5\" r=\"0.8\" fill=\"#ddd\" />\n\n {/* 渐变定义 */}\n <defs>\n <radialGradient id=\"baseGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#1a1a1a\" />\n </radialGradient>\n <radialGradient id=\"baseInnerGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#666\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </radialGradient>\n <linearGradient id=\"armGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"50%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"headGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"cartridgeGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#222\" />\n </linearGradient>\n </defs>\n </svg>\n </motion.div>\n);\n\ninterface AudioRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const AudioRenderer: React.FC<AudioRendererProps> = ({ url, fileName }) => {\n const t = useTranslator();\n const {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n } = useAudioPlayer({ url });\n\n const [showVolume, setShowVolume] = useState(false);\n const volumeRef = useRef<HTMLDivElement>(null);\n const volumeTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const progress = duration > 0 ? currentTime / duration : 0;\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setShowVolume(false);\n }\n };\n if (showVolume) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showVolume]);\n\n const handleVolumeEnter = () => {\n clearTimeout(volumeTimerRef.current);\n setShowVolume(true);\n };\n\n const handleVolumeLeave = () => {\n volumeTimerRef.current = setTimeout(() => setShowVolume(false), 300);\n };\n\n const VolumeIcon = isMuted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-p-4 md:rfp-p-8 rfp-gap-5 md:rfp-gap-8 rfp-select-none\">\n {/* 唱片机整体 */}\n <div className=\"rfp-relative\" style={{ width: '260px', height: '240px' }}>\n {/* 外圈光晕 */}\n <motion.div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '220px',\n height: '220px',\n top: '18px',\n left: '8px',\n background: 'radial-gradient(circle, rgba(129,140,248,0.12) 0%, transparent 70%)',\n }}\n animate={isPlaying ? { scale: [1, 1.08, 1], opacity: [0.5, 1, 0.5] } : { scale: 1, opacity: 0.2 }}\n transition={isPlaying ? { duration: 3, repeat: Infinity, ease: 'easeInOut' } : { duration: 0.5 }}\n />\n\n {/* 唱片主体 */}\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-overflow-hidden\"\n style={{\n width: '200px',\n height: '200px',\n top: '28px',\n left: '18px',\n background: `\n radial-gradient(circle at center, transparent 95%, rgba(30,30,30,0.8) 95.5%, #111 97%),\n radial-gradient(circle at center, transparent 38%, rgba(50,50,50,0.5) 38.15%, transparent 38.4%),\n radial-gradient(circle at center, transparent 45%, rgba(50,50,50,0.3) 45.15%, transparent 45.4%),\n radial-gradient(circle at center, transparent 52%, rgba(50,50,50,0.5) 52.15%, transparent 52.4%),\n radial-gradient(circle at center, transparent 59%, rgba(50,50,50,0.3) 59.15%, transparent 59.4%),\n radial-gradient(circle at center, transparent 66%, rgba(50,50,50,0.5) 66.15%, transparent 66.4%),\n radial-gradient(circle at center, transparent 73%, rgba(50,50,50,0.3) 73.15%, transparent 73.4%),\n radial-gradient(circle at center, transparent 80%, rgba(50,50,50,0.4) 80.15%, transparent 80.4%),\n radial-gradient(circle at center, transparent 87%, rgba(50,50,50,0.3) 87.15%, transparent 87.4%),\n conic-gradient(from 0deg, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c, #212121, #1a1a1a, #252525, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c)\n `,\n boxShadow: isPlaying\n ? '0 0 36px rgba(129,140,248,0.1), 0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)'\n : '0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)',\n animation: 'rfp-vinyl-spin 8s linear infinite',\n animationPlayState: isPlaying ? 'running' : 'paused',\n }}\n >\n {/* 中心标签 */}\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '34%',\n height: '34%',\n top: '33%',\n left: '33%',\n background: 'radial-gradient(circle at 40% 38%, #818cf8, #6366f1, #4f46e5, #4338ca)',\n boxShadow: 'inset 0 1px 3px rgba(255,255,255,0.25), inset 0 -1px 3px rgba(0,0,0,0.3), 0 0 8px rgba(0,0,0,0.3)',\n }}\n >\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full rfp-opacity-20\"\n style={{\n background: `\n radial-gradient(circle at center, transparent 30%, rgba(0,0,0,0.3) 31%, transparent 32%),\n radial-gradient(circle at center, transparent 50%, rgba(0,0,0,0.2) 51%, transparent 52%),\n radial-gradient(circle at center, transparent 70%, rgba(0,0,0,0.3) 71%, transparent 72%),\n radial-gradient(circle at center, transparent 88%, rgba(0,0,0,0.2) 89%, transparent 90%)\n `,\n }}\n />\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '14%',\n height: '14%',\n top: '43%',\n left: '43%',\n background: 'radial-gradient(circle at 40% 40%, #333, #0d0d0d)',\n boxShadow: 'inset 0 1px 3px rgba(0,0,0,0.9), 0 0 2px rgba(0,0,0,0.5)',\n }}\n />\n </div>\n\n {isLoading && (\n <motion.div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full\"\n style={{ border: '2px solid rgba(129,140,248,0.3)' }}\n animate={{ scale: [1, 1.02, 1], opacity: [0.3, 0.6, 0.3] }}\n transition={{ duration: 1.5, repeat: Infinity }}\n />\n )}\n </div>\n\n {/* 唱臂 */}\n <Tonearm isPlaying={isPlaying} />\n </div>\n\n {/* 文件名 */}\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <MarqueeText\n text={fileName}\n className=\"rfp-text-lg md:rfp-text-xl rfp-font-medium rfp-mb-1 rfp-text-fg-primary\"\n />\n <p className=\"rfp-text-xs rfp-tracking-widest rfp-uppercase rfp-text-accent\">\n Audio\n </p>\n </div>\n\n {/* 控制面板 */}\n <div\n className=\"rfp-w-full rfp-max-w-sm md:rfp-max-w-md rfp-rounded-2xl rfp-p-4 md:rfp-p-6 rfp-border rfp-bg-surface-1 rfp-border-line-weak\"\n style={{ backdropFilter: 'blur(16px)' }}\n >\n {/* 进度条 */}\n <div className=\"rfp-mb-5\">\n <div className=\"rfp-relative rfp-h-4 rfp-flex rfp-items-center\">\n <div className=\"rfp-absolute rfp-w-full rfp-h-[5px] rfp-rounded-full rfp-bg-surface-2\" />\n <div\n className=\"rfp-absolute rfp-h-[5px] rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: `${progress * 100}%`,\n background: 'linear-gradient(90deg, var(--fp-accent), var(--fp-accent-hover))',\n boxShadow: isPlaying ? '0 0 8px rgba(129,140,248,0.4)' : 'none',\n transition: 'width 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max={duration > 0 ? duration : currentTime || 100}\n step=\"any\"\n value={currentTime}\n onChange={(e) => seek(parseFloat(e.target.value))}\n disabled={duration <= 0}\n aria-label={t('audio.aria.progress')}\n className=\"audio-slider rfp-absolute rfp-w-full\"\n />\n </div>\n <div className=\"rfp-flex rfp-justify-between rfp-text-xs rfp-mt-2.5 rfp-text-fg-tertiary\">\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{formatTime(currentTime)}</span>\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{duration > 0 ? formatTime(duration) : '--:--'}</span>\n </div>\n </div>\n\n {/* 控制按钮 */}\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-gap-3\">\n {/* 循环 */}\n <motion.button\n onClick={toggleLoop}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isLoop ? t('audio.aria.loop_off') : t('audio.aria.loop_on')}\n className={`rfp-w-9 rfp-h-9 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors ${\n isLoop\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-tertiary'\n }`}\n >\n <Repeat className=\"rfp-w-4 rfp-h-4\" />\n </motion.button>\n\n {/* 后退 */}\n <motion.button\n onClick={() => skip(-10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.backward_10')}\n className=\"rfp-w-10 rfp-h-10 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary\"\n >\n <SkipBack className=\"rfp-w-[18px] rfp-h-[18px]\" />\n </motion.button>\n\n {/* 播放/暂停 */}\n <motion.button\n onClick={togglePlay}\n whileHover={{ scale: 1.06 }}\n whileTap={{ scale: 0.94 }}\n aria-label={isPlaying ? t('audio.aria.pause') : t('audio.aria.play')}\n className=\"rfp-w-14 rfp-h-14 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center\"\n style={{\n background: 'linear-gradient(135deg, var(--fp-accent-hover), var(--fp-accent))',\n color: '#fff',\n boxShadow: '0 4px 20px rgba(99,102,241,0.35)',\n }}\n >\n {isPlaying ? (\n <Pause className=\"rfp-w-6 rfp-h-6\" />\n ) : (\n <Play className=\"rfp-w-6 rfp-h-6 rfp-ml-0.5\" />\n )}\n </motion.button>\n\n {/* 前进 */}\n <motion.button\n onClick={() => skip(10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.forward_10')}\n className=\"rfp-w-10 rfp-h-10 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary\"\n >\n <SkipForward className=\"rfp-w-[18px] rfp-h-[18px]\" />\n </motion.button>\n\n {/* 音量 */}\n <div\n ref={volumeRef}\n className=\"rfp-relative\"\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <motion.button\n onClick={toggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isMuted ? t('audio.aria.unmute') : t('audio.aria.mute')}\n className={`rfp-w-9 rfp-h-9 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors ${\n showVolume\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-secondary'\n }`}\n >\n <VolumeIcon className=\"rfp-w-4 rfp-h-4\" />\n </motion.button>\n\n <AnimatePresence>\n {showVolume && (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.12 }}\n className=\"rfp-absolute rfp-bottom-full rfp-mb-2 rfp-rounded-xl rfp-p-3 rfp-border rfp-bg-surface-3 rfp-border-line\"\n style={{\n left: '50%',\n marginLeft: '-27px',\n backdropFilter: 'blur(16px)',\n }}\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-gap-2\" style={{ height: '100px' }}>\n <div className=\"rfp-relative rfp-flex rfp-items-center rfp-justify-center\" style={{ width: '24px', height: '80px' }}>\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-bg-surface-2\"\n style={{ width: '3px', height: '100%' }}\n />\n <div\n className=\"rfp-absolute rfp-bottom-0 rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: '3px',\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: 'var(--fp-accent-hover)',\n transition: 'height 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={isMuted ? 0 : volume}\n onChange={(e) => setVolume(parseFloat(e.target.value))}\n aria-label={t('audio.aria.volume')}\n className=\"volume-slider-vertical rfp-absolute\"\n style={{\n width: '80px',\n height: '24px',\n transform: 'rotate(-90deg)',\n transformOrigin: 'center center',\n }}\n />\n </div>\n <span className=\"rfp-text-[10px] rfp-tabular-nums rfp-text-fg-tertiary\">\n {Math.round((isMuted ? 0 : volume) * 100)}\n </span>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </div>\n\n <audio ref={audioRef} src={url} className=\"rfp-hidden\" />\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { codeToHtml } from 'shiki';\nimport { useResolvedTheme } from '../ThemeContext';\n\n/**\n * 用 shiki 把代码高亮成 HTML(与 vue-file-preview 同引擎、同主题,保证两端视觉一致)。\n *\n * - dark 主题用 `dark-plus`(VSCode Dark Plus)\n * - light 主题用 `github-light`(GitHub Light)\n *\n * shiki 输出的 <pre> 自带 inline 背景/前景色,主题切换时必须重新高亮,\n * 因此 resolvedTheme 进入依赖数组。\n *\n * @returns\n * - `html`: 高亮后的 HTML 字符串(失败或加载中为 '')\n * - `loading`: 是否正在高亮\n */\nexport function useShikiHighlight(code: string, lang: string): { html: string; loading: boolean } {\n const resolvedTheme = useResolvedTheme();\n const [html, setHtml] = useState('');\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n codeToHtml(code, {\n lang,\n theme: resolvedTheme === 'light' ? 'github-light' : 'dark-plus',\n })\n .then((out) => {\n if (!cancelled) {\n setHtml(out);\n setLoading(false);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setHtml('');\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [code, lang, resolvedTheme]);\n\n return { html, loading };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport { Copy, Check } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n url: string;\n viewMode?: 'preview' | 'source';\n}\n\nconst useCopy = (text: string) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [text]);\n return { copied, handleCopy };\n};\n\n/** 内联版复制按钮:放在代码块 header 行内,始终可见 */\nconst InlineCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-p-1 rfp-rounded rfp-text-fg-muted hover:rfp-text-fg-secondary rfp-transition-colors rfp-flex rfp-items-center rfp-gap-1\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n );\n};\n\n/** 浮动版复制按钮:无 header 时绝对定位于代码块右上角(hover 显示) */\nconst FloatingCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-p-1.5 rfp-rounded-md rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-text-fg-tertiary hover:rfp-text-fg-secondary rfp-transition-colors rfp-opacity-0 group-hover:rfp-opacity-100 rfp-border rfp-border-line\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n );\n};\n\n/** 带语言标注的代码块:shiki 高亮 + header + 复制按钮 */\nconst ShikiCodeBlock = ({ code, lang }: { code: string; lang: string }) => {\n const { html } = useShikiHighlight(code, lang);\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-1.5 rfp-bg-surface-1 rfp-border rfp-border-line-weak rfp-rounded-t-md rfp-border-b-0\">\n <span className=\"rfp-text-xs rfp-text-fg-secondary rfp-font-mono rfp-select-none\">{lang}</span>\n <InlineCopyButton text={code} />\n </div>\n {html ? (\n <div\n className=\"rfp-shiki-wrapper rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre\n className=\"rfp-m-0 rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{code}</code>\n </pre>\n )}\n </div>\n );\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ url, viewMode = 'preview' }) => {\n const t = useTranslator();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const { html: sourceHtml } = useShikiHighlight(\n viewMode === 'source' ? content : '',\n 'markdown',\n );\n\n useEffect(() => {\n const loadMarkdown = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url);\n setContent(text);\n } catch (err) {\n setError(t('markdown.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadMarkdown();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n // 源码视图\n if (viewMode === 'source') {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {sourceHtml ? (\n <div\n className=\"rfp-shiki-wrapper with-line-numbers\"\n dangerouslySetInnerHTML={{ __html: sourceHtml }}\n />\n ) : (\n <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n {content}\n </pre>\n )}\n </div>\n );\n }\n\n // 预览视图\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-p-6 md:rfp-p-10\">\n <div className=\"rfp-max-w-full md:rfp-max-w-4xl rfp-mx-auto\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeRaw, rehypeKatex]}\n components={{\n code({ node, inline, className, children, ...props }: any) {\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n if (!inline && match) {\n // 有语言标注的代码块 - shiki 高亮\n return <ShikiCodeBlock code={codeString} lang={match[1]} />;\n }\n if (!inline) {\n // 无语言标注的代码块 - 纯文本暗色显示\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <FloatingCopyButton text={codeString} />\n <pre\n className=\"rfp-m-0 rfp-rounded-md rfp-border rfp-border-line-weak rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{children}</code>\n </pre>\n </div>\n );\n }\n // 行内代码\n return (\n <code\n className=\"rfp-bg-surface-2 rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-text-sm rfp-font-mono rfp-text-fg-primary rfp-border rfp-border-line-weak\"\n {...props}\n >\n {children}\n </code>\n );\n },\n h1: ({ children }) => (\n <h1 className=\"rfp-text-3xl rfp-font-semibold rfp-mb-4 rfp-mt-6 rfp-text-fg-primary first:rfp-mt-0\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"rfp-text-2xl rfp-font-semibold rfp-mb-3 rfp-mt-8 rfp-text-fg-primary\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"rfp-text-xl rfp-font-semibold rfp-mb-2 rfp-mt-6 rfp-text-fg-primary\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"rfp-text-lg rfp-font-semibold rfp-mb-2 rfp-mt-4 rfp-text-fg-primary\">{children}</h4>\n ),\n p: ({ children }) => (\n <p className=\"rfp-text-fg-secondary rfp-mb-4 rfp-leading-7 rfp-text-base\">{children}</p>\n ),\n a: ({ href, children }) => (\n <a\n href={href}\n className=\"rfp-text-indigo-400 hover:rfp-text-indigo-300 rfp-underline rfp-decoration-indigo-600 hover:rfp-decoration-indigo-400\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n ul: ({ children }) => (\n <ul className=\"rfp-list-disc rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"rfp-list-decimal rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"rfp-leading-7\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"rfp-border-l-4 rfp-border-line-strong rfp-pl-4 rfp-text-fg-tertiary rfp-my-4 rfp-italic\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <div className=\"rfp-overflow-x-auto rfp-my-4 rfp-rounded-md rfp-border rfp-border-line\">\n <table className=\"rfp-min-w-full rfp-divide-y rfp-divide-divide\">{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"rfp-bg-surface-1\">{children}</thead>,\n tbody: ({ children }) => (\n <tbody className=\"rfp-divide-y rfp-divide-divide rfp-bg-transparent\">{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"hover:rfp-bg-surface-1 rfp-transition-colors\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"rfp-px-4 rfp-py-3 rfp-text-left rfp-text-xs rfp-font-semibold rfp-text-fg-tertiary rfp-uppercase rfp-tracking-wider\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"rfp-px-4 rfp-py-3 rfp-text-sm rfp-text-fg-secondary\">{children}</td>\n ),\n hr: () => <hr className=\"rfp-border-line rfp-my-6\" />,\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt}\n className=\"rfp-rounded-md rfp-max-w-full rfp-h-auto rfp-my-4 rfp-mx-auto rfp-block rfp-shadow-sm\"\n />\n ),\n input: ({ type, checked, ...props }) => {\n if (type === 'checkbox') {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n readOnly\n className=\"rfp-mr-2 rfp-rounded rfp-border-line\"\n {...props}\n />\n );\n }\n return <input type={type} {...props} />;\n },\n strong: ({ children }) => (\n <strong className=\"rfp-font-semibold rfp-text-fg-primary\">{children}</strong>\n ),\n em: ({ children }) => <em className=\"rfp-italic\">{children}</em>,\n del: ({ children }) => (\n <del className=\"rfp-text-fg-muted rfp-line-through\">{children}</del>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n </div>\n );\n};\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { ChevronRight, ChevronDown } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useResolvedTheme, type ResolvedTheme } from '../../ThemeContext';\n\ninterface JsonRendererProps {\n url: string;\n fileName: string;\n}\n\ninterface JsonColors {\n key: string;\n string: string;\n number: string;\n keyword: string;\n bracket: string; // { } [ ]\n colon: string; // :\n collapsed: string; // \"N items / N keys\" 折叠提示\n arrow: string; // 折叠箭头\n}\n\n// VSCode Dark Plus / GitHub Light 两套配色,与 react-syntax-highlighter 的 vscDarkPlus / vs 主题保持一致\nconst DARK_COLORS: JsonColors = {\n key: '#9cdcfe',\n string: '#ce9178',\n number: '#b5cea8',\n keyword: '#569cd6',\n bracket: '#d4d4d4',\n colon: 'rgb(255 255 255 / 0.6)',\n collapsed: 'rgb(255 255 255 / 0.4)',\n arrow: 'rgb(255 255 255 / 0.5)',\n};\n\nconst LIGHT_COLORS: JsonColors = {\n key: '#005cc5',\n string: '#032f62',\n number: '#005cc5',\n keyword: '#d73a49',\n bracket: '#24292e',\n colon: 'rgb(23 23 23 / 0.6)',\n collapsed: 'rgb(23 23 23 / 0.45)',\n arrow: 'rgb(23 23 23 / 0.55)',\n};\n\n// ---------- JSON 树节点 ----------\n\ninterface JsonNodeProps {\n keyName?: string;\n value: unknown;\n depth: number;\n defaultExpanded: boolean;\n colors: JsonColors;\n}\n\nconst JsonNode: React.FC<JsonNodeProps> = ({ keyName, value, depth, defaultExpanded, colors }) => {\n const t = useTranslator();\n const [expanded, setExpanded] = useState(defaultExpanded);\n const indent = depth * 20;\n\n const toggle = useCallback(() => setExpanded(prev => !prev), []);\n\n // 基本类型\n if (value === null || value === undefined || typeof value !== 'object') {\n return (\n <div className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm\" style={{ paddingLeft: `${indent}px` }}>\n <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0\" />\n {keyName !== undefined && (\n <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n </span>\n )}\n {renderPrimitive(value, colors)}\n </div>\n );\n }\n\n const isArray = Array.isArray(value);\n const entries = isArray ? (value as unknown[]) : Object.entries(value as Record<string, unknown>);\n const count = entries.length;\n const openBracket = isArray ? '[' : '{';\n const closeBracket = isArray ? ']' : '}';\n\n // 空对象/数组\n if (count === 0) {\n return (\n <div className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm\" style={{ paddingLeft: `${indent}px` }}>\n <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0\" />\n {keyName !== undefined && (\n <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n </span>\n )}\n <span style={{ color: colors.bracket }}>{openBracket}{closeBracket}</span>\n </div>\n );\n }\n\n return (\n <div>\n {/* 折叠行 */}\n <div\n className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm rfp-cursor-pointer hover:rfp-bg-surface-1 rfp-select-none\"\n style={{ paddingLeft: `${indent}px` }}\n onClick={toggle}\n >\n <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0 rfp-flex rfp-items-center rfp-justify-center\" style={{ color: colors.arrow }}>\n {expanded\n ? <ChevronDown className=\"rfp-w-3.5 rfp-h-3.5\" />\n : <ChevronRight className=\"rfp-w-3.5 rfp-h-3.5\" />\n }\n </span>\n {keyName !== undefined && (\n <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n </span>\n )}\n <span style={{ color: colors.bracket }}>{openBracket}</span>\n {!expanded && (\n <span className=\"rfp-ml-1\" style={{ color: colors.collapsed }}>\n {isArray ? `${count} ${t('json.items')}` : `${count} ${t('json.keys')}`}\n <span style={{ color: colors.bracket }}> {closeBracket}</span>\n </span>\n )}\n </div>\n\n {/* 子节点 */}\n {expanded && (\n <>\n {isArray\n ? (value as unknown[]).map((item, i) => (\n <JsonNode key={i} value={item} depth={depth + 1} defaultExpanded={depth < 1} colors={colors} />\n ))\n : Object.entries(value as Record<string, unknown>).map(([k, v]) => (\n <JsonNode key={k} keyName={k} value={v} depth={depth + 1} defaultExpanded={depth < 1} colors={colors} />\n ))\n }\n <div className=\"rfp-font-mono rfp-text-sm rfp-py-px\" style={{ paddingLeft: `${indent + 20}px`, color: colors.bracket }}>\n {closeBracket}\n </div>\n </>\n )}\n </div>\n );\n};\n\nfunction renderPrimitive(value: unknown, colors: JsonColors) {\n if (value === null) return <span style={{ color: colors.keyword, fontStyle: 'italic' }}>null</span>;\n if (value === undefined) return <span style={{ color: colors.keyword, fontStyle: 'italic' }}>undefined</span>;\n if (typeof value === 'boolean') return <span style={{ color: colors.keyword }}>{String(value)}</span>;\n if (typeof value === 'number') return <span style={{ color: colors.number }}>{String(value)}</span>;\n if (typeof value === 'string') return <span style={{ color: colors.string }}>\"{value}\"</span>;\n return <span style={{ color: colors.bracket }}>{String(value)}</span>;\n}\n\nfunction pickColors(theme: ResolvedTheme): JsonColors {\n return theme === 'light' ? LIGHT_COLORS : DARK_COLORS;\n}\n\n// ---------- Main ----------\n\nexport const JsonRenderer: React.FC<JsonRendererProps> = ({ url }) => {\n const t = useTranslator();\n const resolvedTheme = useResolvedTheme();\n const colors = useMemo(() => pickColors(resolvedTheme), [resolvedTheme]);\n const [data, setData] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadJson = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url);\n setData(JSON.parse(text));\n } catch (err) {\n setError(t('json.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n loadJson();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg rfp-py-3 rfp-pr-4\">\n <JsonNode value={data} depth={0} defaultExpanded colors={colors} />\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { FileSpreadsheet } from 'lucide-react';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport {\n parseCsv,\n guessCsvDelimiter,\n fetchTextUtf8,\n convertCsvToSpreadsheetData,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface CsvRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const CsvRenderer: React.FC<CsvRendererProps> = ({ url, fileName }) => {\n const t = useTranslator();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadCsv = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const text = await fetchTextUtf8(url);\n const parsed = parseCsv(text, { delimiter: guessCsvDelimiter(fileName) });\n const sheetData = convertCsvToSpreadsheetData(parsed.header, parsed.rows, fileName);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n setLoading(false);\n } catch (err) {\n if (isMounted) {\n console.error('CSV 解析错误:', err);\n setError(t('csv.load_failed'));\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadCsv();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, fileName, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('csv.loading')}</p>\n </div>\n </div>\n )}\n\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <div className=\"rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-green-500 rfp-via-emerald-500 rfp-to-teal-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl\">\n <FileSpreadsheet className=\"rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary\" />\n </div>\n <p className=\"rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium\">{t('csv.load_failed')}</p>\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6\">{error}</p>\n </div>\n </div>\n )}\n\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\n\ninterface XmlRendererProps {\n url: string;\n fileName: string;\n}\n\n/**\n * 用 DOMParser 美化 XML:失败则原样返回\n */\nconst prettyPrintXml = (xml: string): string => {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xml, 'application/xml');\n // 检测解析错误\n const errNode = doc.querySelector('parsererror');\n if (errNode) return xml;\n // 使用 XSLT 或手动缩进:这里手动缩进更稳\n const serializer = new XMLSerializer();\n const serialized = serializer.serializeToString(doc);\n return indentXml(serialized);\n } catch {\n return xml;\n }\n};\n\nconst indentXml = (xml: string): string => {\n const PADDING = ' ';\n const reg = /(>)(<)(\\/*)/g;\n let formatted = xml.replace(reg, '$1\\n$2$3');\n // 自闭合和 CDATA 等不处理\n let pad = 0;\n return formatted\n .split('\\n')\n .map((line) => {\n let indent = 0;\n if (/^<\\/\\w/.test(line)) {\n pad = Math.max(pad - 1, 0);\n } else if (/^<\\w[^>]*[^/]>.*$/.test(line) && !/<.+<\\/.+>$/.test(line)) {\n indent = 1;\n }\n const padded = PADDING.repeat(pad) + line;\n pad += indent;\n return padded;\n })\n .join('\\n');\n};\n\nexport const XmlRenderer: React.FC<XmlRendererProps> = ({ url }) => {\n const t = useTranslator();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const { html: highlighted } = useShikiHighlight(content, 'xml');\n\n useEffect(() => {\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const raw = await fetchTextUtf8(url);\n setContent(prettyPrintXml(raw));\n } catch (err) {\n console.error(err);\n setError(t('xml.load_failed'));\n } finally {\n setLoading(false);\n }\n };\n load();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {highlighted ? (\n <div\n className=\"rfp-shiki-wrapper with-line-numbers\"\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n ) : (\n <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n {content}\n </pre>\n )}\n </div>\n );\n};\n","import { useState, useEffect, useMemo } from 'react';\nimport {\n parseSubtitle,\n formatSubtitleTime,\n fetchTextUtf8,\n type SubtitleParseResult,\n type SubtitleFormat,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface SubtitleRendererProps {\n url: string;\n fileName: string;\n}\n\nconst FORMAT_BY_EXT: Record<string, SubtitleFormat> = {\n srt: 'srt',\n vtt: 'vtt',\n lrc: 'lrc',\n elrc: 'elrc',\n ass: 'ass',\n ssa: 'ssa',\n ttml: 'ttml',\n dfxp: 'ttml',\n};\n\nconst getFormat = (fileName: string): SubtitleFormat | undefined => {\n const ext = fileName.split('.').pop()?.toLowerCase() || '';\n return FORMAT_BY_EXT[ext];\n};\n\nexport const SubtitleRenderer: React.FC<SubtitleRendererProps> = ({ url, fileName }) => {\n const t = useTranslator();\n const [text, setText] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n setText(await fetchTextUtf8(url));\n } catch (err) {\n console.error(err);\n setError(t('subtitle.load_failed'));\n } finally {\n setLoading(false);\n }\n };\n load();\n }, [url]);\n\n const parsed: SubtitleParseResult | null = useMemo(() => {\n if (!text) return null;\n try {\n return parseSubtitle(text, getFormat(fileName));\n } catch (err) {\n console.error(err);\n return null;\n }\n }, [text, fileName]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-bg-[#0f0f12]\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error || !parsed) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-bg-[#0f0f12]\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error || t('subtitle.parse_failed')}</p>\n </div>\n </div>\n );\n }\n\n const isLyric = parsed.format === 'lrc' || parsed.format === 'elrc';\n const meta = parsed.metadata ?? {};\n const dotHover = isLyric ? 'group-hover:rfp-bg-violet-400' : 'group-hover:rfp-bg-sky-400';\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-bg-[#0f0f12]\">\n {/* 内容滚动区 */}\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-px-6 md:rfp-px-10 rfp-pt-6 rfp-pb-16 md:rfp-pb-20\">\n <div className=\"rfp-relative rfp-max-w-5xl rfp-mx-auto\">\n {/* vertical line */}\n <div className=\"rfp-absolute rfp-left-[5px] md:rfp-left-[7px] rfp-top-2 rfp-bottom-2 rfp-w-px rfp-bg-surface-1\" />\n\n <ol className=\"rfp-space-y-5 md:rfp-space-y-6\">\n {parsed.cues.map((cue, i) => (\n <li key={`cue-${i}`} className=\"rfp-relative rfp-pl-6 md:rfp-pl-8 rfp-group\">\n {/* dot */}\n <div\n className={`rfp-absolute rfp-left-0 rfp-top-2 rfp-w-3 rfp-h-3 rfp-rounded-full rfp-bg-surface-3 rfp-border-2 rfp-border-[#0f0f12] rfp-transition-colors ${dotHover}`}\n />\n\n <div className=\"rfp-flex rfp-flex-wrap rfp-items-baseline rfp-gap-x-3 rfp-gap-y-1 rfp-mb-1.5\">\n <span className=\"rfp-text-[11px] rfp-font-mono rfp-text-fg-muted rfp-tabular-nums\">\n {formatSubtitleTime(cue.start)}\n </span>\n <span className=\"rfp-text-[11px] rfp-text-fg-disabled\">→</span>\n <span className=\"rfp-text-[11px] rfp-font-mono rfp-text-fg-muted rfp-tabular-nums\">\n {formatSubtitleTime(cue.end)}\n </span>\n <span className=\"rfp-text-[10px] rfp-font-mono rfp-text-fg-disabled rfp-tabular-nums\">\n #{cue.id ?? i + 1}\n </span>\n {cue.style && (\n <span className=\"rfp-text-[9px] rfp-uppercase rfp-tracking-widest rfp-text-fg-tertiary rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-bg-surface-1 rfp-border rfp-border-line-weak\">\n {cue.style}\n </span>\n )}\n </div>\n\n {cue.words && cue.words.length > 0 ? (\n <div className=\"rfp-flex rfp-flex-wrap rfp-gap-x-1.5 rfp-gap-y-1 rfp-text-base md:rfp-text-lg rfp-text-fg-primary rfp-leading-relaxed group-hover:rfp-text-fg-primary rfp-transition-colors\">\n {cue.words.map((word, wi) => (\n <span\n key={`w-${wi}`}\n className=\"rfp-inline-flex rfp-flex-col rfp-items-start\"\n title={formatSubtitleTime(word.start)}\n >\n <span className=\"rfp-text-[9px] rfp-text-fg-disabled rfp-font-mono rfp-leading-none rfp-tabular-nums\">\n {formatSubtitleTime(word.start).slice(3, 8)}\n </span>\n <span className=\"rfp-leading-snug\">{word.text}</span>\n </span>\n ))}\n </div>\n ) : (\n <p\n className={`rfp-whitespace-pre-wrap rfp-break-words rfp-leading-relaxed group-hover:rfp-text-fg-primary rfp-transition-colors rfp-text-fg-primary ${\n isLyric ? 'rfp-text-base md:rfp-text-xl rfp-font-medium' : 'rfp-text-sm md:rfp-text-base'\n }`}\n >\n {cue.text}\n </p>\n )}\n </li>\n ))}\n </ol>\n </div>\n </div>\n\n {/* 底部状态栏 */}\n <div className=\"rfp-pointer-events-none rfp-absolute rfp-bottom-3 rfp-right-3 md:rfp-bottom-4 md:rfp-right-4 rfp-flex rfp-items-center rfp-gap-2 rfp-px-2.5 rfp-py-1 rfp-rounded-full rfp-bg-surface-nav rfp-backdrop-blur rfp-border rfp-border-line-weak rfp-text-[10px] rfp-text-fg-tertiary rfp-font-mono rfp-tabular-nums\">\n <span>{parsed.cues.length} {isLyric ? t('subtitle.lines') : t('subtitle.cues')}</span>\n {meta.length && (\n <>\n <span className=\"rfp-text-fg-disabled\">·</span>\n <span>{meta.length}</span>\n </>\n )}\n </div>\n </div>\n );\n};\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\n\nexport interface ResizableSplitProps {\n /** 左侧内容 */\n left: React.ReactNode;\n /** 右侧内容 */\n right: React.ReactNode;\n /** 左侧初始宽度(px);传入 storageKey 时会从 localStorage 读取 */\n initialLeftWidth?: number;\n /** 左侧最小宽度(px) */\n minLeftWidth?: number;\n /** 左侧最大宽度(px),同时不超过 `容器宽 - minRightWidth - 分隔线宽` */\n maxLeftWidth?: number;\n /** 右侧至少保留的宽度(px) */\n minRightWidth?: number;\n /** localStorage 持久化 key;不传则不持久化 */\n storageKey?: string;\n /** 启用横向拖动的媒体查询,默认 `(min-width: 768px)` */\n desktopMedia?: string;\n /** 容器额外类名 */\n className?: string;\n}\n\n/**\n * 通用可拖动分隔布局:\n * - 桌面端(由 `desktopMedia` 判定)横向分两栏,中间分隔线可左右拖动调整左栏宽度\n * - 移动端退化为上下堆叠,不显示分隔线\n * - 可选 `storageKey` 将宽度持久化到 localStorage\n */\nexport const ResizableSplit: React.FC<ResizableSplitProps> = ({\n left,\n right,\n initialLeftWidth = 280,\n minLeftWidth = 160,\n maxLeftWidth = 640,\n minRightWidth = 200,\n storageKey,\n desktopMedia = '(min-width: 768px)',\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [leftWidth, setLeftWidth] = useState<number>(() => {\n if (storageKey && typeof window !== 'undefined') {\n const saved = Number(window.localStorage.getItem(storageKey));\n if (!isNaN(saved) && saved > 0) return saved;\n }\n return initialLeftWidth;\n });\n const [dragging, setDragging] = useState(false);\n const [isDesktop, setIsDesktop] = useState(false);\n\n // 响应式:监听媒体查询\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia(desktopMedia);\n const handler = () => setIsDesktop(mq.matches);\n handler();\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [desktopMedia]);\n\n // 拖动\n useEffect(() => {\n if (!dragging) return;\n const handleMove = (e: MouseEvent) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cap = rect.width - minRightWidth - 6;\n const effectiveMax = Math.min(maxLeftWidth, cap);\n const newW = Math.max(minLeftWidth, Math.min(effectiveMax, x));\n setLeftWidth(newW);\n };\n const handleUp = () => setDragging(false);\n window.addEventListener('mousemove', handleMove);\n window.addEventListener('mouseup', handleUp);\n const prevCursor = document.body.style.cursor;\n const prevSelect = document.body.style.userSelect;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n return () => {\n window.removeEventListener('mousemove', handleMove);\n window.removeEventListener('mouseup', handleUp);\n document.body.style.cursor = prevCursor;\n document.body.style.userSelect = prevSelect;\n };\n }, [dragging, minLeftWidth, maxLeftWidth, minRightWidth]);\n\n // 持久化\n useEffect(() => {\n if (!storageKey || dragging) return;\n try {\n window.localStorage.setItem(storageKey, String(leftWidth));\n } catch {\n // ignore\n }\n }, [leftWidth, storageKey, dragging]);\n\n const handleDividerDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setDragging(true);\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={`rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${className}`}\n >\n <div\n className=\"rfp-min-h-0 rfp-min-w-0 rfp-flex-shrink-0 rfp-w-full rfp-max-h-60 md:rfp-h-full md:rfp-max-h-none\"\n style={isDesktop ? { width: `${leftWidth}px` } : undefined}\n >\n {left}\n </div>\n {/* 分隔线:仅桌面显示 */}\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n onMouseDown={handleDividerDown}\n className={`rfp-hidden md:rfp-block rfp-relative rfp-w-1.5 rfp-flex-shrink-0 rfp-cursor-col-resize rfp-transition-colors ${\n dragging ? 'rfp-bg-surface-toolbar' : 'rfp-bg-surface-2 hover:rfp-bg-surface-3'\n }`}\n >\n {/* 加宽命中区,改善拖动体验 */}\n <span className=\"rfp-absolute rfp-inset-y-0 -rfp-left-1 -rfp-right-1\" />\n </div>\n <div className=\"rfp-flex-1 rfp-min-w-0 rfp-min-h-0 rfp-overflow-hidden\">{right}</div>\n </div>\n );\n};\n","import { useState, useEffect, useMemo, useCallback, useRef, lazy, Suspense } from 'react';\nimport React from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n Folder,\n FolderOpen,\n FileText,\n FileImage,\n FileCode,\n File as FileIcon,\n ChevronRight,\n} from 'lucide-react';\nimport type JSZip from 'jszip';\nimport {\n loadZip,\n listZipEntries,\n buildZipTree,\n readZipEntryBlob,\n formatFileSize,\n getFileType,\n inferMimeType,\n type ZipTreeNode,\n} from '@eternalheart/file-preview-core';\nimport { ResizableSplit } from '../../components/ResizableSplit';\nimport type { ZipToolbarStats } from './toolbar';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\n// 懒加载 FilePreviewContent 以打破循环依赖\nconst LazyFilePreviewContent = lazy(() =>\n import('../../FilePreviewContent').then(m => ({ default: m.FilePreviewContent }))\n);\n\ninterface ZipRendererProps {\n url: string;\n /** ZIP 嵌套深度(由 FilePreviewContent 传入) */\n nestingDepth?: number;\n /** 解析完成后向外回报统计信息(files / dirs / size),供工具栏展示 */\n onStatsChange?: (stats: ZipToolbarStats | null) => void;\n}\n\ninterface SelectedPreview {\n path: string;\n name: string;\n size: number;\n blobUrl: string;\n}\n\n/** 根据文件类型返回树节点图标 */\nconst resolveIcon = (name: string) => {\n const ft = getFileType({ id: '', name, url: '', type: '' });\n if (ft === 'image') return FileImage;\n if (ft === 'text' || ft === 'markdown' || ft === 'json' || ft === 'csv' || ft === 'xml' || ft === 'subtitle') {\n return name.endsWith('.md') || name.endsWith('.markdown') ? FileText : FileCode;\n }\n return FileIcon;\n};\n\n// ---------- Tooltip via portal ----------\n\ninterface HoverTipState {\n text: string;\n x: number;\n y: number;\n}\n\n// ---------- Tree item ----------\n\ninterface TreeItemProps {\n node: ZipTreeNode;\n depth: number;\n selectedPath: string | null;\n expanded: Set<string>;\n onToggle: (path: string) => void;\n onSelect: (node: ZipTreeNode) => void;\n onHover: (text: string, rect: DOMRect) => void;\n onLeave: () => void;\n}\n\nconst TreeItem: React.FC<TreeItemProps> = ({\n node,\n depth,\n selectedPath,\n expanded,\n onToggle,\n onSelect,\n onHover,\n onLeave,\n}) => {\n const isOpen = expanded.has(node.path);\n const isSelected = selectedPath === node.path;\n const pad = { paddingLeft: `${depth * 14 + 10}px` };\n const handleEnter = (e: React.MouseEvent<HTMLElement>) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n onHover(node.name || '/', rect);\n };\n\n if (node.isDir) {\n return (\n <>\n <button\n type=\"button\"\n onClick={() => onToggle(node.path)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className=\"rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-fg-secondary hover:rfp-bg-surface-1 rfp-text-sm\"\n style={pad}\n >\n <ChevronRight\n className={`rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${\n isOpen ? 'rfp-rotate-90' : ''\n }`}\n />\n {isOpen ? (\n <FolderOpen className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n ) : (\n <Folder className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n )}\n <span className=\"rfp-truncate rfp-flex-1 rfp-min-w-0\">{node.name || '/'}</span>\n </button>\n {isOpen &&\n node.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={depth + 1}\n selectedPath={selectedPath}\n expanded={expanded}\n onToggle={onToggle}\n onSelect={onSelect}\n onHover={onHover}\n onLeave={onLeave}\n />\n ))}\n </>\n );\n }\n\n const Icon = resolveIcon(node.name);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(node)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className={`rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-sm ${\n isSelected ? 'rfp-bg-surface-2 rfp-text-fg-primary' : 'rfp-text-fg-secondary hover:rfp-bg-surface-1'\n }`}\n style={pad}\n >\n <span className=\"rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0\" />\n <Icon className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-fg-tertiary\" />\n <span className=\"rfp-flex-1 rfp-truncate rfp-min-w-0\">{node.name}</span>\n <span className=\"rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2\">\n {formatFileSize(node.size)}\n </span>\n </button>\n );\n};\n\n// ---------- Main Zip Renderer ----------\n\nexport const ZipRenderer: React.FC<ZipRendererProps> = ({ url, nestingDepth = 0, onStatsChange }) => {\n const t = useTranslator();\n const [zip, setZip] = useState<JSZip | null>(null);\n const [tree, setTree] = useState<ZipTreeNode | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [expanded, setExpanded] = useState<Set<string>>(new Set(['']));\n const [selected, setSelected] = useState<SelectedPreview | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [hoverTip, setHoverTip] = useState<HoverTipState | null>(null);\n const onStatsChangeRef = useRef(onStatsChange);\n\n useEffect(() => {\n onStatsChangeRef.current = onStatsChange;\n }, [onStatsChange]);\n\n useEffect(() => {\n let cancelled = false;\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(url);\n if (!res.ok) throw new Error('加载失败');\n const buf = await res.arrayBuffer();\n const z = await loadZip(buf);\n if (cancelled) return;\n const entries = listZipEntries(z);\n const root = buildZipTree(entries);\n setZip(z);\n setTree(root);\n const init = new Set<string>(['']);\n if (root.children) {\n for (const c of root.children) if (c.isDir) init.add(c.path);\n }\n setExpanded(init);\n } catch (err) {\n console.error(err);\n if (!cancelled) setError(t('zip.load_failed'));\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n load();\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n // 切换文件时回收 blob URL\n useEffect(() => {\n return () => {\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n };\n }, [selected]);\n\n const totalStats = useMemo<ZipToolbarStats | null>(() => {\n if (!tree) return null;\n let files = 0;\n let dirs = 0;\n let size = 0;\n const walk = (n: ZipTreeNode) => {\n if (n.isDir) {\n if (n.path) dirs++;\n n.children?.forEach(walk);\n } else {\n files++;\n size += n.size;\n }\n };\n walk(tree);\n return { files, dirs, size };\n }, [tree]);\n\n // 向外回报 stats\n useEffect(() => {\n onStatsChangeRef.current?.(totalStats);\n return () => {\n onStatsChangeRef.current?.(null);\n };\n }, [totalStats]);\n\n const handleToggle = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n }, []);\n\n const handleHover = useCallback((text: string, rect: DOMRect) => {\n setHoverTip({\n text,\n x: rect.right + 8,\n y: rect.top + rect.height / 2,\n });\n }, []);\n\n const handleLeave = useCallback(() => {\n setHoverTip(null);\n }, []);\n\n const handleSelect = useCallback(\n async (node: ZipTreeNode) => {\n if (!zip || node.isDir) return;\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n setPreviewLoading(true);\n setPreviewError(null);\n\n try {\n const mime = inferMimeType(node.name);\n const blob = await readZipEntryBlob(zip, node.path, mime !== 'application/octet-stream' ? mime : undefined);\n const blobUrl = URL.createObjectURL(blob);\n setSelected({ path: node.path, name: node.name, size: node.size, blobUrl });\n } catch (err) {\n console.error(err);\n setPreviewError('条目读取失败');\n } finally {\n setPreviewLoading(false);\n }\n },\n [zip, selected]\n );\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error || !tree) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error || t('zip.parse_failed')}</p>\n </div>\n </div>\n );\n }\n\n // 左侧:文件树\n const leftPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto\">\n {tree.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={0}\n selectedPath={selected?.path ?? null}\n expanded={expanded}\n onToggle={handleToggle}\n onSelect={handleSelect}\n onHover={handleHover}\n onLeave={handleLeave}\n />\n ))}\n </div>\n );\n\n // 右侧:预览区\n const rightPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-flex rfp-flex-col\">\n {!selected && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-muted rfp-text-sm rfp-p-6\">\n 从左侧选择一个文件以预览\n </div>\n )}\n {selected && previewLoading && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n {selected && !previewLoading && previewError && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary\">\n {previewError}\n </div>\n )}\n {selected && !previewLoading && !previewError && (\n <>\n <div className=\"rfp-flex-1 rfp-min-h-0 rfp-overflow-hidden rfp-flex rfp-relative rfp-z-0\">\n <Suspense\n fallback={\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n >\n <LazyFilePreviewContent\n mode=\"embed\"\n files={[{ name: selected.name, url: selected.blobUrl, type: inferMimeType(selected.name) }]}\n currentIndex={0}\n zipNestingDepth={nestingDepth + 1}\n />\n </Suspense>\n </div>\n </>\n )}\n </div>\n );\n\n return (\n <>\n <ResizableSplit\n left={leftPane}\n right={rightPane}\n initialLeftWidth={280}\n minLeftWidth={180}\n maxLeftWidth={560}\n storageKey=\"rfp-zip-split-left\"\n />\n {/* 文件名 hover tooltip(portal 到 body,避免被滚动区裁剪) */}\n {hoverTip &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n className=\"rfp-fixed rfp-z-[9999] rfp-pointer-events-none rfp-px-2 rfp-py-1 rfp-bg-[rgba(0,0,0,0.85)] rfp-text-fg-primary rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-shadow-lg\"\n style={{\n left: `${hoverTip.x}px`,\n top: `${hoverTip.y}px`,\n transform: 'translateY(-50%)',\n }}\n >\n {hoverTip.text}\n </div>,\n document.body\n )}\n </>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { fetchTextUtf8, getLanguageFromFileName } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\n\ninterface TextRendererProps {\n url: string;\n fileName: string;\n wordWrap?: boolean;\n htmlPreview?: boolean;\n}\n\nexport const TextRenderer: React.FC<TextRendererProps> = ({\n url,\n fileName,\n wordWrap = true,\n htmlPreview = false,\n}) => {\n const t = useTranslator();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const language = getLanguageFromFileName(fileName);\n const { html: highlighted } = useShikiHighlight(\n language !== 'text' ? content : '',\n language,\n );\n\n useEffect(() => {\n const loadText = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url);\n setContent(text);\n } catch (err) {\n setError(t('text.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadText();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n // HTML 预览模式\n if (htmlPreview && (language === 'html')) {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-bg-surface-toolbar\">\n <iframe\n srcDoc={content}\n sandbox=\"allow-same-origin\"\n className=\"rfp-w-full rfp-h-full rfp-border-0\"\n title={fileName}\n />\n </div>\n );\n }\n\n // 源码模式\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {language === 'text' || !highlighted ? (\n <pre\n className={`rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm ${\n wordWrap ? 'rfp-whitespace-pre-wrap rfp-break-words' : 'rfp-whitespace-pre'\n }`}\n >\n {content}\n </pre>\n ) : (\n <div\n className={`rfp-shiki-wrapper with-line-numbers ${wordWrap ? '' : 'no-wrap'}`}\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n )}\n </div>\n );\n};\n"],"names":["j","e","n","t","k","I","o","lt","ct","r","dt","pt","mt","gt","a","i","c","s","l","p","f","$","ht","z","xt","E","B","W","N","d","u","M","R","Z","m","O","g","F","b","h","x","w","D","L","v","y","_","S","V","bt","Ft","A","vt","wt","_t","q","G","H","J","X","T","K","Q","Y","tt","et","ot","P","Ct","kt","nt","rt","C","it","at","Mt","LocaleContext","createContext","LocaleProvider","locale","messages","children","value","useMemo","createTranslator","jsx","fallbackTranslator","getFallbackTranslator","useTranslator","ctx","useContext","useLocale","ThemeContext","ThemeProvider","theme","useResolvedTheme","OriginalSizeIcon","className","getImageToolbarGroups","ZoomOut","ZoomIn","Scan","RotateCcw","RotateCw","RefreshCw","getPdfToolbarGroups","getEpubToolbarGroups","List","_a","ChevronLeft","ChevronRight","Minimize2","Maximize2","getMobiToolbarGroups","getZipToolbarGroups","stats","formatFileSize","getTextToolbarGroups","groups","WrapText","Code","Eye","getMarkdownToolbarGroups","ImageRenderer","lazy","index$g","PdfRenderer","index$f","DocxRenderer","index$e","XlsxRenderer","index$d","PptxRenderer","index$c","MsgRenderer","index$b","EpubRenderer","index$a","MobiRenderer","index$9","VideoRenderer","index$8","AudioRenderer","index$7","MarkdownRenderer","index$6","JsonRenderer","index$5","CsvRenderer","index$4","XmlRenderer","index$3","SubtitleRenderer","index$2","ZipRenderer","index$1","TextRenderer","index","UnsupportedRenderer","fileName","fileType","onDownload","jsxs","FileQuestion","Download","RendererLoading","MAX_ZIP_NESTING_DEPTH","FilePreviewContent","files","currentIndex","onNavigate","customRenderers","mode","onClose","zipNestingDepth","userMessages","headless","onCustomEvent","systemDark","setSystemDark","useState","useEffect","mql","handler","resolvedTheme","zoom","setZoom","rotation","setRotation","currentPage","setCurrentPage","setTotalPages","contentNaturalWidth","setContentNaturalWidth","contentNaturalHeight","setContentNaturalHeight","imageResetKey","setImageResetKey","contentRef","useRef","rootRef","epubRef","epubCurrent","setEpubCurrent","epubTotal","setEpubTotal","epubFullWidth","setEpubFullWidth","mobiRef","mobiCurrent","setMobiCurrent","mobiTotal","setMobiTotal","mobiFullWidth","setMobiFullWidth","zipStats","setZipStats","textWordWrap","setTextWordWrap","textHtmlPreview","setTextHtmlPreview","markdownViewMode","setMarkdownViewMode","navVisible","setNavVisible","navHideTimerRef","NAV_HIDE_DELAY","resetNavTimer","useCallback","handleMouseMove","normalizedFiles","normalizeFiles","currentFile","customRenderer","renderer","getFileType","emitCustom","name","payload","customCtx","containerWidth","containerHeight","scaleX","scaleY","newZoom","handleKeyDown","el","handleZoomIn","prev","handleZoomOut","handleRotate","handleRotateLeft","handleFitToWidth","handleOriginalSize","handleZoomChange","handleReset","handleDownload","link","handleEpubChapterChange","current","total","handleMobiChapterChange","handleZipStatsChange","showCloseButton","toolGroups","ext","_b","actionGroups","renderToolbarItems","dividerClass","group","gi","arr","React","item","ii","ToolbarButton","motion","Suspense","Fragment","icon","label","onClick","disabled","FilePreviewModal","isOpen","originalOverflow","originalPaddingRight","scrollbarWidth","modalContent","AnimatePresence","createPortal","FilePreviewEmbed","width","height","style","configurePdfjs","options","workerSrc","pdfjs","cMapUrl","cMapPacked","VERSION","packageJson","url","resetKey","fileSize","onZoomChange","onNaturalWidthChange","onNaturalHeightChange","loaded","setLoaded","error","setError","position","setPosition","isDragging","setIsDragging","dragStart","setDragStart","internalZoom","setInternalZoom","naturalSize","setNaturalSize","imgRef","containerRef","handleLoad","img","clampPosition","pos","currentZoom","container","containerW","containerH","imgW","imgH","margin","rangeX","rangeY","handleError","handleDoubleClick","handleWheelNative","rect","mouseX","mouseY","delta","scale","handleMouseDown","handleMouseUp","onPageChange","onTotalPagesChange","onPageWidthChange","numPages","setNumPages","pageRefs","onDocumentLoadSuccess","onDocumentLoadError","handleScroll","scrollTop","scrollCenter","currentVisiblePage","minDistance","pageElement","pageNumber","containerRect","pageCenter","distance","setPageRef","element","Document","Page","page","PAGE_HEIGHT","PAGE_PADDING_Y","PAGE_PADDING_X","PAGE_CONTENT_HEIGHT","PAGE_GAP","contentStyle","html","setHtml","loading","setLoading","pages","setPages","measureRef","response","arrayBuffer","result","mammoth","err","paginate","currentPageUsed","child","blocks","pageHtml","Element","tag","key","eventNames","fen","oen","eventName","evt","offsetTop","offsetLeft","offsetHeight","offsetWidth","eles","ele","arg","cls","flag","content","keys","alphabets","stringAt","str","cindex","last","indexAt","ret","exponet","expr2xy","src","xy2expr","expr2expr","xn","yn","condition","CellRange","sri","sci","eri","eci","args","ri","ci","cb","rowFilter","other","addRet","dsr","dsc","der","dec","ref","refs","Selector$1","Scroll","History","data","currentd","undoItems","redoItems","Clipboard","cellRange","Filter","operator","Sort","order","AutoFilter","filters","sort","filter","getCell","rset","fset","cell","ctext","cnt","Merges","cr","type","cbWithin","range","rn","cn","it1","merges","merge","cloneDeep","obj","mergeDeep","object","sources","source","equals","obj1","obj2","v1","v2","ai","sum","objOrAry","size","deleteProperty","property","oldv","rangeReduceIf","min","max","inits","initv","ifv","getv","rangeSum","rangeEach","arrayEquals","a1","a2","digits","numberCalc","al1","al2","num1","num2","helper","Rows","len","row","idx","exceptSet","what","text","srcCellRange","dstCellRange","autofill","dsri","dsci","deri","deci","drn","dcn","isAdd","dn","jj","nri","nci","ncell","word","ncellmm","ndata","rndata","col","cells","ks","Cols","indexWidth","minWidth","en","$languages","$messages","translate","lang","message","tf","clearLangList","rules","returnMessage","Validator","required","Validation","validator","nrefs","Validations","errors","defaultSettings","toolbarHeight","bottombarHeight","hasOwnProperty","canPaste","dst","srn","scn","copyPaste","rows","cutPaste","clipboard","setStyleBorder","bss","styles","cstyle","setStyleBorders","color","selector","multiple","ns","mergeIndexes","mri","mci","mrl","mcl","getCellRowByY","scrollOffsety","fsh","frset","top","getCellColByX","scrollOffsetx","cols","fsw","left","DataProxy","settings","Selector","copyText","rowData","cellText","txt","lines","srcRange","cri","cci","nfont","state","autoFilter","oldCell","oldText","vIndex","x1","y1","scroll","exceptRowSet","left0","top0","fary","oldAry","si","rsize","csize","freeze","fci","fri","cellStyle","history","validations","view","showToolbar","showBottomBar","exceptRows","exceptRowTH","viewRange","rlen","clen","frary","offset","rowHeight","colWidth","nstyle","bind","target","fn","unbind","unbindClickoutside","bindClickoutside","mouseMoveUp","movefunc","upfunc","calTouchDirection","spanx","spany","direction","bindTouch","move","end","startx","starty","pageX","pageY","createEventEmitter","listeners","on","callback","push","currentListener","create","fire","exec","removeListener","remove","once","execCalllback","removeAllListeners","cssPrefix","Resizer","vertical","line","moving","hoverEl","lineEl","unhideHoverEl","startEvt","cRect","Scrollbar","scrollLeft","contentDistance","cssKey","selectorHeightBorderWidth","startZIndex","SelectorElement","useHideInput","of","calBRAreaOffset","ftwidth","ftheight","calTAreaOffset","calLAreaOffset","setBRAreaOffset","br","setTLAreaOffset","tl","setTAreaOffset","setLAreaOffset","setLClipboardOffset","setBRClipboardOffset","setTLClipboardOffset","setTClipboardOffset","setAllAreaOffset","setAllClipboardOffset","freezeHeight","freezeWidth","coffset","indexesUpdated","lastri","lastci","ern","ecn","inputMovePrev","filterItems","inputMoveNext","inputEnter","inputKeydownHandler","keyCode","Suggest","items","itemClick","title","input","Icon","addMonth","date","step","weekday","monthDays","year","month","cdate","startDate","datess","active","Calendar","week","cvalue","bodyEl","trs","tds","Datepicker","calendar","resetTextareaSize","inputText","textlineEl","textEl","areaOffset","txts","maxTxtSize","fontWidth","tlineWidth","maxWidth","h1","twidth","insertText","itxt","selectionEnd","ntxt","keydownEventHandler","altKey","inputEventHandler","suggest","start","setTextareaRange","setText","suggestItemClick","sit","eit","resetSuggestItems","dateFormat","Editor","formulas","viewFn","suggestPosition","areaEl","elOffset","sOffset","datepicker","Button","dpr","thinLineWidth","npx","px","npxLine","DrawBox","padding","bottom","right","align","drawFontLine","tx","ty","valign","blheight","blwidth","floffset","Draw","mtxt","box","attr","textWrap","font","strike","underline","biw","ntxts","txtWidth","textLine","txtHeight","xys","borderTop","borderRight","borderBottom","borderLeft","sx","sy","dtextcb","bgcolor","baseFonts","fontSizes","getFontSizePxByPt","fontSize","infixExprToSuffixExpr","operatorStack","stack","subStrs","fnArgType","fnArgOperator","fnArgsLen","oldc","c1","ex","ey","rangelen","nc","evalSubExpr","subExpr","cellRender","fl","expr","evalSuffixExpr","srcStack","formulaMap","cellList","fc","formula","params","getCellText","_cell","baseFormulas","ary","formulam","formatStringRender","formatNumberRender","first","parts","baseFormats","formatm","cellPaddingWidth","tableFixedHeaderCleanStyle","tableGridStyle","tableFixedHeaderStyle","getDrawBox","rindex","yoffset","renderCell","draw","sortedRowMap","nrindex","frozen","dbox","renderAutofilter","afRange","renderContent","fw","fh","filteredTranslateFunc","exceptRowTotalHeight","renderSelectedHeaderCell","renderFixedHeaders","sumHeight","sumWidth","nty","ntx","renderFixedLeftTopCell","renderContentGrid","ch","cw","renderFreezeHighlightLine","ftw","fth","theight","Table","vr","freezeViewRange","PAGER_SIZES","PAGER_ORIENTATIONS","inches2px","inc","btnClick","pagerSizeChange","paper","ps","pagerOrientationChange","Print$1","iwidth","iheight","mViewRange","th","yo","wrap","canvas","rh","yof","iframe","contentWindow","idoc","menuItems","buildMenuItem","buildMenu","ContextMenu$1","isHide","hideEl","vhf","tooltip","elBox","Item","shortcut","tip","DropdownItem","Dropdown","showArrow","placement","contentEl","buildItemWithIcon","iconName","DropdownAlign","aligns","naligns","Align","Valign","ToggleItem","Autofilter","Bold","Italic","Strike","Underline","themeColorPlaceHolders","themeColors","standardColors","buildTd","ColorPalette","table","DropdownColor","colorPalette","lineTypes","DropdownLineType","beforei","lineTypeEls","iti","buildTable","BorderPalette","DropdownBorder","borderPalette","Border","IconItem","Clearformat","Paintformat","TextColor","FillColor","DropdownFontSize","nfontSizes","DropdownFontsize","DropdownFont","nfonts","Font","DropdownFormat","nformats","DropdownFormula","nformulas","Format","Freeze","Merge","Redo","Undo","Print","Textwrap","moreBtns","More","DropdownMore","buildDivider","initBtns2","marginLeft","marginRight","moreResize","btns","moreEl","btns2","sumWidth2","list1","list2","Toolbar","widthFn","FontSize","Formula","format","Modal","clientHeight","clientWidth","FormInput","hint","FormSelect","getTitle","change","patterns","FormField","rule","labelWidth","fieldLabelWidth","ModalValidation","mf","rf","cf","minvf","maxvf","svf","vf","action","attrs","field","clsName","buildSortItem","buildFilterBody","filterbEl","filterValues","resetFilterHeader","filterhEl","values","SortFilter","sortAscEl","sortDescEl","tindex","xtoast","dimmer","throttle","func","wait","timeout","that","scrollbarMove","verticalScrollbar","horizontalScrollbar","tableOffset","selectorSet","toolbar","contextMenu","selectorMove","overlayerMousemove","offsetX","offsetY","rowResizer","colResizer","tableEl","tRect","overlayerMousescroll","deltaY","deltaX","loopValue","vFunc","moveY","moveX","horizontal","tempY","tempX","temp","overlayerTouch","verticalScrollbarSet","erth","horizontalScrollbarSet","sheetFreeze","editor","fwidth","fheight","sheetReset","overlayerEl","overlayerCEl","tOffset","vRect","clearClipboard","copy","cut","paste","msg","cdata","hideRowsOrCols","unhideRowsOrCols","autofilter","toolbarChangePaintformatPaste","overlayerMousedown","sortFilter","isAutofillEl","cellRect","editorSetOffset","sPosition","editorSet","verticalScrollbarMove","horizontalScrollbarMove","rowResizerFinished","colResizerFinished","dataSetCellText","insertDeleteRowColumn","toolbarChange","sortFilterChange","sheetInitEvents","modalValidation","itext","ctrlKey","shiftKey","metaKey","Sheet","targetEl","showContextmenu","ContextMenu","eventMap","click","Bottombar","addFunc","swapFunc","deleteFunc","updateFunc","nindex","activeEl","deleteEl","Spreadsheet","selectors","rootEl","oldIndex","ds","nd","sheetIndex","spreadsheet","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","rawWidth","rawHeight","mountSpreadsheet","isMobile","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","loadExcel","workbook","ExcelJS","sheetData","convertWorkbookToSpreadsheetData","errorMsg","timer","FileSpreadsheet","tiled","slideCount","setSlideCount","previewerRef","arrayBufferRef","parentWidth","reinitializePreviewer","currentDimensions","previewer","init","timeoutId","loadPptx","hiddenContainer","tempPreviewer","count","Presentation","formatRecipients","recipients","email","formatDate","dateStr","decodeHtmlBody","fields","emptyBodyText","formatMessageClass","messageClass","labelStyle","rowStyle","iconWrapStyle","iconStyle","valueStyle","setFields","fileData","MsgReader","toStr","ccStr","bccStr","senderName","senderEmail","sender","sentDate","receivedDate","createdDate","lastModified","subject","attachments","bodyHtml","messageId","fieldsAny","importance","importanceLabel","sensitivity","sensitivityLabel","User","Users","Clock","Tag","Mail","Paperclip","sizeStr","Hash","styleEl","A4_WIDTH","forwardRef","onChapterChange","onFullWidthChange","viewerRef","bookRef","renditionRef","onChapterChangeRef","onFullWidthChangeRef","totalLocationsRef","lastCfiRef","isFullWidthRef","isFullWidth","setIsFullWidth","toc","setToc","showToc","setShowToc","activeTocHref","setActiveTocHref","tocRef","handlePrev","handleNext","scrollContainerRef","scrollRafRef","onScrollRef","_e","mgr","reattachScrollListener","tryAttach","toggleFullWidth","newVal","viewer","rendition","toggleToc","handleTocClick","href","useImperativeHandle","cancelled","loadTimer","load","bookInput","book","ePub","loc","cur","_c","nav","location","spineHref","matches","collect","base","_d","onResize","isActive","renderTocItems","depth","READER_CSS","hostRef","viewRef","reportProgress","host","detail","sections","frac","tocItem","res","blob","file","_f","getVideoType","isLoading","setIsLoading","videoRef","playerRef","videoElement","videoType","player","videojs","videoEl","useAudioPlayer","audioRef","isPlaying","setIsPlaying","currentTime","setCurrentTime","duration","setDuration","volume","setVolumeState","isMuted","setIsMuted","isLoop","setIsLoop","audio","onTimeUpdate","onDurationChange","onCanPlay","onWaiting","onPlaying","onPlay","onPause","onEnded","onError","togglePlay","seek","time","skip","seconds","setVolume","vol","clamped","toggleMute","toggleLoop","next","formatTime","minutes","MarqueeText","innerRef","overflow","setOverflow","scrollDist","setScrollDist","check","inner","tw","observer","gap","totalScroll","dur","Tonearm","showVolume","setShowVolume","volumeRef","volumeTimerRef","progress","handleClickOutside","handleVolumeEnter","handleVolumeLeave","VolumeIcon","VolumeX","Volume1","Volume2","Repeat","SkipBack","Pause","Play","SkipForward","useShikiHighlight","code","codeToHtml","out","useCopy","copied","setCopied","handleCopy","textarea","InlineCopyButton","Check","Copy","FloatingCopyButton","ShikiCodeBlock","viewMode","setContent","sourceHtml","fetchTextUtf8","ReactMarkdown","remarkGfm","remarkMath","rehypeRaw","rehypeKatex","node","inline","props","match","codeString","alt","checked","DARK_COLORS","LIGHT_COLORS","JsonNode","keyName","defaultExpanded","colors","expanded","setExpanded","indent","toggle","renderPrimitive","isArray","openBracket","closeBracket","ChevronDown","pickColors","setData","loadCsv","parsed","parseCsv","guessCsvDelimiter","convertCsvToSpreadsheetData","prettyPrintXml","xml","doc","serialized","indentXml","PADDING","reg","formatted","pad","padded","highlighted","raw","FORMAT_BY_EXT","getFormat","parseSubtitle","isLyric","meta","dotHover","cue","formatSubtitleTime","wi","ResizableSplit","initialLeftWidth","minLeftWidth","maxLeftWidth","minRightWidth","storageKey","desktopMedia","leftWidth","setLeftWidth","saved","dragging","setDragging","isDesktop","setIsDesktop","mq","handleMove","cap","effectiveMax","newW","handleUp","prevCursor","prevSelect","handleDividerDown","LazyFilePreviewContent","FilePreviewContent$1","resolveIcon","ft","FileImage","FileText","FileCode","FileIcon","TreeItem","selectedPath","onToggle","onSelect","onHover","onLeave","isSelected","handleEnter","FolderOpen","Folder","nestingDepth","onStatsChange","zip","setZip","tree","setTree","selected","setSelected","previewLoading","setPreviewLoading","previewError","setPreviewError","hoverTip","setHoverTip","onStatsChangeRef","buf","loadZip","entries","listZipEntries","root","buildZipTree","totalStats","dirs","walk","handleToggle","path","handleHover","handleLeave","handleSelect","mime","inferMimeType","readZipEntryBlob","blobUrl","leftPane","rightPane","wordWrap","htmlPreview","language","getLanguageFromFileName"],"mappings":"mqBACA,SAASA,GAAEC,EAAG,CACZ,GAAI,CACF,MAAMC,EAAI,IAAI,IAAID,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,IAAG,GAAM,OAClD,OAAO,mBAAmBC,CAAC,CAC7B,MAAQ,CACN,MAAMC,EAAIF,EAAE,MAAM,GAAG,EAAE,IAAG,GAAM,OAChC,OAAO,mBAAmBE,CAAC,CAC7B,CACF,CACA,SAASC,GAAEH,EAAG,CACZ,IAAIC,EACJ,MAAM,IAAMA,EAAID,EAAE,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASC,EAAE,YAAW,IAAO,GAC3E,MAAO,CAEL,IAAK,aACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,KAAM,aACN,IAAK,gBACL,IAAK,YACL,IAAK,eAEL,IAAK,YACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,IAAK,kBACL,IAAK,kBACL,IAAK,mBACL,IAAK,cACL,MAAO,aACP,IAAK,cAEL,IAAK,aACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,KAAM,aAEN,IAAK,kBACL,KAAM,0EACN,KAAM,oEACN,KAAM,4EACN,IAAK,gCACL,IAAK,6BACL,KAAM,iCACN,IAAK,+BACL,KAAM,+BACN,IAAK,+BAEL,IAAK,aACL,GAAI,gBACJ,SAAU,gBACV,KAAM,mBACN,IAAK,kBACL,KAAM,YACN,IAAK,WACL,GAAI,kBACJ,GAAI,kBACJ,IAAK,kBACL,IAAK,kBACL,GAAI,gBACJ,KAAM,cACN,IAAK,gBACL,EAAG,cACH,GAAI,gBACJ,IAAK,aACL,GAAI,cACJ,GAAI,YACJ,GAAI,cACJ,KAAM,YACN,IAAK,YACL,KAAM,YACN,IAAK,aACL,IAAK,aACL,KAAM,cACN,MAAO,cACP,IAAK,aACL,IAAK,WACL,IAAK,4BACL,IAAK,uBACL,IAAK,WACL,IAAK,iBACT,EAAI,CAAC,GAAK,0BACV,CACA,SAASG,GAAEJ,EAAGE,EAAI,EAAG,CACnB,GAAIF,aAAa,KACf,MAAO,CACL,GAAI,QAAQ,KAAK,IAAG,CAAE,IAAIE,CAAC,GAC3B,KAAMF,EAAE,KACR,IAAK,IAAI,gBAAgBA,CAAC,EAC1B,KAAMA,EAAE,MAAQG,GAAEH,EAAE,IAAI,EACxB,KAAMA,EAAE,IACd,EACE,GAAI,OAAOA,GAAK,SAAU,CACxB,MAAMK,EAAIN,GAAEC,CAAC,EACb,MAAO,CACL,GAAI,OAAO,KAAK,IAAG,CAAE,IAAIE,CAAC,GAC1B,KAAMG,EACN,IAAKL,EACL,KAAMG,GAAEE,CAAC,CACf,CACE,CACA,MAAO,CACL,GAAIL,EAAE,IAAM,QAAQ,KAAK,IAAG,CAAE,IAAIE,CAAC,GACnC,KAAMF,EAAE,KACR,IAAKA,EAAE,IACP,KAAMA,EAAE,MAAQG,GAAEH,EAAE,IAAI,EACxB,KAAMA,EAAE,IACZ,CACA,CACA,SAASM,GAAGN,EAAG,CACb,OAAOA,EAAE,IAAI,CAACE,EAAGG,IAAMD,GAAEF,EAAGG,CAAC,CAAC,CAChC,CACA,SAASE,GAAGP,EAAG,CACb,IAAIQ,EACJ,MAAM,IAAMA,EAAIR,EAAE,KAAK,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASQ,EAAE,YAAW,IAAO,GAAIH,EAAIL,EAAE,KAAK,YAAW,EAC1G,GAAIK,EAAE,WAAW,QAAQ,GAAK,CAAC,MAAO,OAAQ,MAAO,MAAO,OAAQ,KAAK,EAAE,SAAS,CAAC,EACnF,MAAO,QACT,GAAIA,EAAE,SAAS,KAAK,GAAK,IAAM,MAC7B,MAAO,MACT,GAAIA,EAAE,SAAS,kBAAkB,GAAK,IAAM,OAC1C,MAAO,OACT,GAAIA,EAAE,SAAS,eAAe,GAAK,IAAM,OACvC,MAAO,OACT,GAAIA,EAAE,SAAS,gBAAgB,GAAK,IAAM,QAAU,IAAM,MACxD,MAAO,OACT,GAAIA,EAAE,SAAS,YAAY,GAAK,IAAM,MACpC,MAAO,MACT,GAAIA,EAAE,SAAS,MAAM,GAAK,IAAM,OAC9B,MAAO,OACT,GAAI,CAAC,OAAQ,MAAO,OAAQ,KAAK,EAAE,SAAS,CAAC,GAAKA,IAAM,kCAAoCA,IAAM,+BAChG,MAAO,OACT,GAAI,CAAC,MAAO,KAAK,EAAE,SAAS,CAAC,GAAKA,IAAM,YAAcA,IAAM,4BAC1D,MAAO,MACT,GAAI,IAAM,OAASA,IAAM,mBAAqBA,IAAM,WAClD,MAAO,MACT,GAAI,CAAC,MAAO,MAAO,MAAO,OAAQ,MAAO,MAAO,OAAQ,MAAM,EAAE,SAAS,CAAC,GAAKA,IAAM,YAAcA,IAAM,wBAA0BA,IAAM,uBACvI,MAAO,WACT,GAAI,IAAM,OAASA,IAAM,mBAAqBA,IAAM,+BAClD,MAAO,MACT,GAAIA,EAAE,WAAW,QAAQ,GAAK,CAAC,MAAO,OAAQ,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAAE,SAAS,CAAC,EAC9G,MAAO,QACT,GAAIA,EAAE,WAAW,QAAQ,GAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,KAAK,EAAE,SAAS,CAAC,EAClF,MAAO,QACT,GAAI,IAAM,MAAQ,IAAM,WACtB,MAAO,WACT,GAAIA,IAAM,oBAAsB,IAAM,OACpC,MAAO,OACT,MAAMJ,EAAI,CACR,MACA,MACA,OACA,KACA,MACA,KACA,MACA,KACA,OACA,MACA,IACA,IACA,KACA,MACA,KACA,KACA,MACA,KACA,QACA,KACA,MACA,MACA,OACA,MACA,OACA,OACA,OACA,OACA,MACA,OACA,MACA,OACA,MACA,OACA,QACA,KACA,OACA,MACA,KACJ,EACE,OAAOI,EAAE,WAAW,OAAO,GAAKJ,EAAE,SAAS,CAAC,EAAI,OAAS,aAC3D,CACA,SAASQ,GAAGT,EAAG,CACb,IAAIC,EACJ,MAAM,IAAMA,EAAID,EAAE,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASC,EAAE,YAAW,IAAO,GAC3E,MAAO,CACL,GAAI,aACJ,IAAK,MACL,GAAI,aACJ,IAAK,MACL,GAAI,SACJ,KAAM,OACN,IAAK,MACL,EAAG,IACH,GAAI,SACJ,IAAK,MACL,GAAI,OACJ,GAAI,KACJ,IAAK,KACL,GAAI,OACJ,MAAO,QACP,GAAI,SACJ,IAAK,MACL,IAAK,MACL,MAAO,QACP,GAAI,OACJ,KAAM,OACN,IAAK,OACL,KAAM,OACN,IAAK,MACL,KAAM,OACN,IAAK,MACL,KAAM,OACN,KAAM,OACN,KAAM,OACN,IAAK,MACL,KAAM,OACN,IAAK,OACL,KAAM,OACN,IAAK,MACL,IAAK,OACL,KAAM,QACN,KAAM,OACN,MAAO,OACP,IAAK,MACL,GAAI,WACJ,IAAK,MACT,EAAI,CAAC,GAAK,MACV,CAiBA,SAASS,GAAGV,EAAG,CACb,OAAOA,EAAI,KAAO,GAAGA,CAAC,KAAOA,EAAI,KAAO,KAAO,IAAIA,EAAI,MAAM,QAAQ,CAAC,CAAC,MAAQ,IAAIA,GAAK,KAAO,OAAO,QAAQ,CAAC,CAAC,KAClH,CAMA,SAASW,GAAGX,EAAG,CACb,IAAIK,EACJ,SAAUA,EAAIL,EAAE,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASK,EAAE,YAAW,IAAO,MAAQ,MAAQ,IAAM,GACjG,CACA,SAASO,GAAGZ,EAAGE,EAAI,GAAI,CACrB,MAAMG,EAAIH,EAAE,WAAa,IAAKD,EAAIC,EAAE,kBAAoB,GAAIM,EAAI,CAAA,EAChE,IAAIK,EAAI,CAAA,EAAIC,EAAI,GAAIC,EAAI,GAAIC,EAAI,EAChC,MAAMC,EAAIjB,EAAE,OACZ,KAAOgB,EAAIC,GAAK,CACd,MAAMC,EAAIlB,EAAEgB,CAAC,EACb,GAAID,EAAG,CACL,GAAIG,IAAM,IAAK,CACb,GAAIlB,EAAEgB,EAAI,CAAC,IAAM,IAAK,CACpBF,GAAK,IAAKE,GAAK,EACf,QACF,CACAD,EAAI,GAAIC,GAAK,EACb,QACF,CACAF,GAAKI,EAAGF,GAAK,EACb,QACF,CACA,GAAIE,IAAM,IAAK,CACbH,EAAI,GAAIC,GAAK,EACb,QACF,CACA,GAAIE,IAAMb,EAAG,CACXQ,EAAE,KAAKC,CAAC,EAAGA,EAAI,GAAIE,GAAK,EACxB,QACF,CACA,GAAIE,IAAM,KAAM,CACdlB,EAAEgB,EAAI,CAAC,IAAM;AAAA,IACbA,GAAK,GAAIH,EAAE,KAAKC,CAAC,EAAGN,EAAE,KAAKK,CAAC,EAAGA,EAAI,CAAA,EAAIC,EAAI,GAAIE,GAAK,EACpD,QACF,CACA,GAAIE,IAAM;AAAA,EACX,CACGL,EAAE,KAAKC,CAAC,EAAGN,EAAE,KAAKK,CAAC,EAAGA,EAAI,CAAA,EAAIC,EAAI,GAAIE,GAAK,EAC3C,QACF,CACAF,GAAKI,EAAGF,GAAK,CACf,CACA,KAAMF,EAAE,OAAS,GAAKD,EAAE,OAAS,KAAOA,EAAE,KAAKC,CAAC,EAAGN,EAAE,KAAKK,CAAC,GAAIL,EAAE,OAAS,GAAK,CAC7E,MAAMU,EAAIV,EAAEA,EAAE,OAAS,CAAC,EACxB,GAAIU,EAAE,SAAW,GAAKA,EAAE,CAAC,IAAM,GAC7BV,EAAE,IAAG,MAEL,MACJ,CACA,IAAI,EAAI,GAAIW,EAAIX,EAChBP,GAAKO,EAAE,OAAS,IAAM,EAAIA,EAAE,CAAC,EAAGW,EAAIX,EAAE,MAAM,CAAC,GAC7C,MAAM,EAAI,KAAK,IACb,EAAE,OACF,GAAGW,EAAE,IAAKD,GAAMA,EAAE,MAAM,EACxB,CACJ,EACE,UAAWA,KAAKC,EACd,KAAOD,EAAE,OAAS,GAAKA,EAAE,KAAK,EAAE,EAClC,MAAO,CACL,OAAQ,EACR,KAAMC,EACN,YAAa,EACb,UAAWd,CACf,CACA,CACA,SAASe,GAAEpB,EAAG,CACZ,MAAME,EAAIF,aAAa,WAAaA,EAAI,IAAI,WAAWA,CAAC,EACxD,GAAIE,EAAE,QAAU,GAAKA,EAAE,CAAC,IAAM,KAAOA,EAAE,CAAC,IAAM,KAAOA,EAAE,CAAC,IAAM,IAC5D,OAAO,IAAI,YAAY,OAAO,EAAE,OAAOA,CAAC,EAC1C,GAAIA,EAAE,QAAU,GAAKA,EAAE,CAAC,IAAM,KAAOA,EAAE,CAAC,IAAM,IAC5C,OAAO,IAAI,YAAY,UAAU,EAAE,OAAOA,CAAC,EAC7C,GAAIA,EAAE,QAAU,GAAKA,EAAE,CAAC,IAAM,KAAOA,EAAE,CAAC,IAAM,IAC5C,OAAO,IAAI,YAAY,UAAU,EAAE,OAAOA,CAAC,EAC7C,GAAI,CACF,OAAO,IAAI,YAAY,QAAS,CAAE,MAAO,EAAE,CAAE,EAAE,OAAOA,CAAC,CACzD,MAAQ,CACR,CACA,GAAI,CACF,OAAO,IAAI,YAAY,KAAK,EAAE,OAAOA,CAAC,CACxC,MAAQ,CACR,CACA,OAAO,IAAI,YAAY,QAAS,CAAE,MAAO,GAAI,EAAE,OAAOA,CAAC,CACzD,CAEA,eAAemB,GAAGrB,EAAGE,EAAG,CACtB,MAAMG,EAAI,MAAM,MAAML,EAAGE,CAAC,EAC1B,GAAI,CAACG,EAAE,GAAI,MAAM,IAAI,MAAM,SAASA,EAAE,MAAM,EAAE,EAC9C,MAAMJ,EAAI,MAAMI,EAAE,YAAW,EAC7B,OAAOe,GAAEnB,CAAC,CACZ,CACA,SAASqB,GAAEtB,EAAG,CACZ,MAAME,EAAIF,EAAE,KAAI,EAAG,QAAQ,IAAK,GAAG,EAAGK,EAAIH,EAAE,MAAM,GAAG,EAAE,IAAKD,GAAMA,EAAE,MAAM,EAC1E,GAAII,EAAE,SAAW,EAAG,CAClB,KAAM,CAACJ,EAAGO,EAAGK,CAAC,EAAIR,EAClB,OAAO,OAAOJ,CAAC,EAAI,KAAO,OAAOO,CAAC,EAAI,GAAK,OAAOK,CAAC,CACrD,CACA,GAAIR,EAAE,SAAW,EAAG,CAClB,KAAM,CAACJ,EAAGO,CAAC,EAAIH,EACf,OAAO,OAAOJ,CAAC,EAAI,GAAK,OAAOO,CAAC,CAClC,CACA,OAAO,OAAON,CAAC,GAAK,CACtB,CACA,SAASqB,GAAGvB,EAAG,CACb,GAAI,CAAC,SAASA,CAAC,GAAKA,EAAI,EAAG,MAAO,eAClC,MAAME,EAAI,KAAK,MAAMF,EAAI,GAAG,EAAGK,EAAIH,EAAI,IAAKD,EAAI,KAAK,MAAMC,EAAI,GAAG,EAAI,GAAIM,EAAI,KAAK,MAAMN,EAAI,GAAG,EAAI,GAAIW,EAAI,KAAK,MAAMX,EAAI,IAAI,EAAGY,EAAI,CAACC,EAAGC,EAAI,IAAMD,EAAE,SAAQ,EAAG,SAASC,EAAG,GAAG,EAChL,MAAO,GAAGF,EAAED,CAAC,CAAC,IAAIC,EAAEN,CAAC,CAAC,IAAIM,EAAEb,CAAC,CAAC,IAAIa,EAAET,EAAG,CAAC,CAAC,EAC3C,CACA,MAAMmB,GAAI,sFAAuFC,GAAI,0CACrG,SAASC,GAAE1B,EAAG,CACZ,MAAME,EAAIF,EAAE,QAAQ,UAAW,EAAE,EAAE,UAAS,EAC5C,MAAO,UAAU,KAAKE,CAAC,EAAI,MAAQ,WAAW,KAAKA,CAAC,GAAK,eAAe,KAAKA,CAAC,EAAI,OAAS,qBAAqB,KAAKA,CAAC,GAAK,cAAc,KAAKA,CAAC,EAAI,6BAA6B,KAAKA,CAAC,EAAI,MAAQ,MAAQuB,GAAE,KAAKvB,CAAC,GAAK,6CAA6C,KAAKA,CAAC,EAAI,oCAAoC,KAAKA,CAAC,EAAI,OAAS,MAAQ,KAC/U,CACA,SAASyB,GAAE3B,EAAGE,EAAG,CACf,MAAMD,EAAID,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EAAGQ,EAAI,CAAA,EACN,IAAIK,EAAGC,EAAI,EACX,GAAIZ,IAAM,MAAO,CACf,MAAMa,EAAI,CAAA,EACV,KAAOD,EAAIb,EAAE,QAAUA,EAAEa,CAAC,EAAE,KAAI,IAAO,IACrCC,EAAE,KAAKd,EAAEa,CAAC,CAAC,EAAGA,IAChB,IAAKD,EAAIE,EAAE,KAAK;AAAA,CACnB,EAAGD,EAAIb,EAAE,QAAUA,EAAEa,CAAC,EAAE,KAAI,IAAO,IAAMA,GACxC,CACA,KAAOA,EAAIb,EAAE,QAAU,CACrB,KAAOa,EAAIb,EAAE,QAAUA,EAAEa,CAAC,EAAE,KAAI,IAAO,IAAMA,IAC7C,GAAIA,GAAKb,EAAE,OAAQ,MACnB,IAAIc,EAAGC,EAAI,KACX,GAAIQ,GAAE,KAAKvB,EAAEa,CAAC,CAAC,EACbE,EAAIf,EAAEa,CAAC,EAAGA,YACHC,EAAId,EAAEa,CAAC,EAAE,KAAI,GAAM,OAAQA,IAAKA,EAAIb,EAAE,QAAUuB,GAAE,KAAKvB,EAAEa,CAAC,CAAC,EAClEE,EAAIf,EAAEa,CAAC,EAAGA,QAEV,UACF,GAAI,CAACE,EAAG,SACR,MAAMC,EAAID,EAAE,MAAM,+BAA+B,EACjD,GAAI,CAACC,EAAG,SACR,MAAMW,EAAIN,GAAEL,EAAE,CAAC,CAAC,EAAGE,EAAIG,GAAEL,EAAE,CAAC,CAAC,EAAGY,EAAI,CAAA,EACpC,KAAOf,EAAIb,EAAE,QAAUA,EAAEa,CAAC,EAAE,KAAI,IAAO,IACrCe,EAAE,KAAK5B,EAAEa,CAAC,CAAC,EAAGA,IAChBN,EAAE,KAAK,CAAE,GAAIO,EAAG,MAAOa,EAAG,IAAKT,EAAG,KAAMU,EAAE,KAAK;AAAA,CAClD,EAAG,CACF,CACA,MAAO,CAAE,OAAQ3B,EAAG,KAAMM,EAAG,OAAQK,CAAC,CACxC,CACA,SAASiB,GAAE9B,EAAGE,EAAGG,EAAG,CAClB,MAAMJ,EAAI,OAAOD,CAAC,EAAGQ,EAAI,OAAON,CAAC,EACjC,IAAIW,EAAI,EACR,GAAIR,EAAG,CACL,MAAMS,GAAKT,EAAI,OAAO,MAAM,EAAG,CAAC,EAChCQ,EAAI,OAAOC,CAAC,CACd,CACA,OAAOb,EAAI,GAAKO,EAAIK,EAAI,GAC1B,CACA,SAASkB,GAAE/B,EAAGE,EAAG,CACf,MAAMG,EAAI,mDAAmD,KAAKL,EAAE,KAAI,CAAE,EAC1E,GAAI,CAACK,EAAG,MAAO,GACf,MAAMJ,EAAII,EAAE,CAAC,EAAE,cAAeG,EAAIH,EAAE,CAAC,EAAE,KAAI,EAC3C,GAAIH,EAAE,SAASD,CAAC,EAAIO,EAAGP,IAAM,SAAU,CACrC,MAAMY,EAAI,OAAOL,CAAC,EAClB,MAAMK,CAAC,IAAMX,EAAE,SAAWW,EAC5B,CACA,MAAO,EACT,CACA,SAASmB,GAAEhC,EAAG,CACZ,MAAMK,EAAIL,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EAAGC,EAAI,CAAE,SAAU,GAAI,SAAU,CAAC,EAAIO,EAAI,6CAA8CK,EAAI,CAAA,EAC3F,UAAWG,KAAKX,EAAG,CACjB,MAAMY,EAAID,EAAE,KAAI,EAChB,GAAI,CAACC,GAAKc,GAAEd,EAAGhB,CAAC,EAAG,SACnB,MAAM2B,EAAI,CAAA,EACV,IAAI,EAAI,EACRpB,EAAE,UAAY,EACd,IAAIqB,EACJ,MAAQA,EAAIrB,EAAE,KAAKS,CAAC,KAAO,MAAQY,EAAE,QAAU,GAC7CD,EAAE,KAAKE,GAAED,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAG,EAAIA,EAAE,MAAQA,EAAE,CAAC,EAAE,OAClD,GAAID,EAAE,SAAW,EAAG,SACpB,MAAMV,EAAID,EAAE,MAAM,CAAC,EAAE,KAAI,EACzB,UAAWgB,KAAKL,EACdf,EAAE,KAAK,CAAE,MAAOoB,EAAG,KAAMf,EAAG,CAChC,CACAL,EAAE,KAAK,CAACG,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EAClC,MAAMH,EAAIb,EAAE,SAAW,IACvB,MAAO,CAAE,OAAQ,MAAO,KAAMY,EAAE,IAAI,CAACG,EAAGC,IAAM,CAC5C,MAAMW,EAAI,KAAK,IAAI,EAAGZ,EAAE,MAAQF,CAAC,EAAG,EAAID,EAAEI,EAAI,CAAC,EAAGY,EAAI,EAAI,KAAK,IAAID,EAAG,EAAE,MAAQd,CAAC,EAAIc,EAAI,EACzF,MAAO,CAAE,MAAOA,EAAG,IAAKC,EAAG,KAAMb,EAAE,IAAI,CACzC,CAAC,EAAG,SAAUf,EAAE,QAAQ,CAC1B,CACA,SAASiC,GAAElC,EAAG,CACZ,MAAMK,EAAIL,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EAAGC,EAAI,CAAE,SAAU,CAAA,EAAI,SAAU,GAAKO,EAAI,6CAA8CK,EAAI,2CAA4CC,EAAI,CAAA,EAC3I,UAAWG,KAAKZ,EAAG,CACjB,MAAMuB,EAAIX,EAAE,KAAI,EAChB,GAAI,CAACW,GAAKG,GAAEH,EAAG3B,CAAC,EAAG,SACnB,MAAM,EAAI,CAAA,EACV,IAAI4B,EAAI,EACRrB,EAAE,UAAY,EACd,IAAIU,EACJ,MAAQA,EAAIV,EAAE,KAAKoB,CAAC,KAAO,MAAQV,EAAE,QAAUW,GAC7C,EAAE,KAAKC,GAAEZ,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAGW,EAAIX,EAAE,MAAQA,EAAE,CAAC,EAAE,OAClD,GAAI,EAAE,SAAW,EAAG,SACpB,MAAMe,EAAIL,EAAE,MAAMC,CAAC,EACnB,UAAWM,KAAK,EACdrB,EAAE,KAAK,CAAE,MAAOqB,EAAG,IAAKF,EAAG,CAC/B,CACAnB,EAAE,KAAK,CAACG,EAAGW,IAAMX,EAAE,MAAQW,EAAE,KAAK,EAClC,MAAMb,EAAId,EAAE,SAAW,IACvB,MAAO,CAAE,OAAQ,OAAQ,KAAMa,EAAE,IAAI,CAACG,EAAGW,IAAM,CAC7C,MAAM,EAAI,CAAA,EACV,IAAIC,EAAI,GAAIX,EAAI,EAAGe,EAAI,KACvBpB,EAAE,UAAY,EACd,IAAIsB,EACJ,MAAQA,EAAItB,EAAE,KAAKI,EAAE,GAAG,KAAO,MAAQ,CACrC,MAAMmB,EAAInB,EAAE,IAAI,MAAMC,EAAGiB,EAAE,KAAK,EAChCF,IAAM,MAAQG,GAAK,EAAE,KAAK,CAAE,MAAO,KAAK,IAAI,EAAGH,EAAIlB,CAAC,EAAG,KAAMqB,CAAC,CAAE,EAAGP,GAAKO,EAAGH,EAAIH,GAAEK,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAGjB,EAAIiB,EAAE,MAAQA,EAAE,CAAC,EAAE,MACzH,CACA,MAAME,EAAIpB,EAAE,IAAI,MAAMC,CAAC,EACvBe,IAAM,MAAQI,GAAK,EAAE,KAAK,CAAE,MAAO,KAAK,IAAI,EAAGJ,EAAIlB,CAAC,EAAG,KAAMsB,CAAC,CAAE,EAAGR,GAAKQ,EACxE,MAAMC,EAAI,KAAK,IAAI,EAAGrB,EAAE,MAAQF,CAAC,EAAGwB,EAAIzB,EAAEc,EAAI,CAAC,EAAGY,EAAID,EAAI,KAAK,IAAID,EAAGC,EAAE,MAAQxB,CAAC,EAAIuB,EAAI,EACzF,MAAO,CACL,MAAOA,EACP,IAAKE,EACL,KAAMX,EAAE,KAAI,EACZ,MAAO,EAAE,OAAS,EAAI,MAC5B,CACE,CAAC,EAAG,SAAU5B,EAAE,QAAQ,CAC1B,CACA,SAASwC,GAAEzC,EAAG,CACZ,MAAME,EAAIF,EAAE,KAAI,EAAG,MAAM,GAAG,EAC5B,OAAOE,EAAE,SAAW,EAAI,EAAI,OAAOA,EAAE,CAAC,CAAC,EAAI,KAAO,OAAOA,EAAE,CAAC,CAAC,EAAI,GAAK,OAAOA,EAAE,CAAC,EAAE,QAAQ,IAAK,GAAG,CAAC,CACrG,CACA,SAASwC,GAAE1C,EAAGE,EAAG,CACf,MAAMD,EAAID,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EACC,IAAIQ,EAAI,GAAIK,EAAI,CAAA,EAChB,MAAMC,EAAI,GAAIC,EAAI,CAAA,EAClB,UAAWC,KAAKf,EAAG,CACjB,MAAMgB,EAAID,EAAE,QAAQ,OAAQ,EAAE,EAAGY,EAAIX,EAAE,KAAI,EAAIE,EAAI,oBAAoB,KAAKS,CAAC,EAC7E,GAAIT,EAAG,CACLX,EAAIW,EAAE,CAAC,EAAE,YAAW,EAAIJ,EAAE,KAAKE,CAAC,EAChC,QACF,CACA,GAAIT,IAAM,SAAU,CAClBO,EAAE,KAAKE,CAAC,EACR,QACF,CACA,MAAMY,EAAI,oBAAoB,KAAKD,CAAC,EACpC,GAAIC,EAAG,CACLhB,EAAIgB,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAKc,GAAMA,EAAE,KAAI,CAAE,EACvC,QACF,CACA,MAAMzB,EAAI,gCAAgC,KAAKU,CAAC,EAChD,GAAI,CAACV,GAAKA,EAAE,CAAC,EAAE,YAAW,IAAO,WAAaL,EAAE,SAAW,EAAG,SAC9D,MAAM,EAAIA,EAAE,OAAQ,EAAIK,EAAE,CAAC,EAAE,MAAM,GAAG,EAAGmB,EAAI,EAAE,MAAM,EAAG,EAAI,CAAC,EAAGC,EAAI,EAAE,MAAM,EAAI,CAAC,EAAE,KAAK,GAAG,EAAGC,EAAI,CAAA,EAClG1B,EAAE,QAAQ,CAAC8B,EAAGC,IAAM,CAClBL,EAAEI,CAAC,EAAIC,IAAM,EAAI,EAAIN,EAAID,EAAEO,CAAC,GAAK,EACnC,CAAC,EACD,MAAMJ,EAAIC,GAAEF,EAAE,OAAS,EAAE,EAAGH,EAAIK,GAAEF,EAAE,KAAO,EAAE,EAAGM,GAAKN,EAAE,MAAQ,IAAI,QAAQ,OAAQ;AAAA,CACtF,EAAE,QAAQ,OAAQ;AAAA,CAClB,EAAE,QAAQ,OAAQ,GAAG,EAAE,QAAQ,aAAc,EAAE,EAC5CzB,EAAE,KAAK,CAAE,MAAO0B,EAAG,IAAKJ,EAAG,KAAMS,EAAG,MAAON,EAAE,KAAK,CAAE,CACtD,CACA,OAAOzB,EAAE,KAAK,CAACE,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EAAG,CAC1C,OAAQf,EACR,KAAMY,EACN,OAAQC,EAAE,KAAK;AAAA,CAClB,EAAE,KAAI,GAAM,MACb,CACA,CACA,SAAS+B,GAAE9C,EAAG,CACZ,MAAME,EAAIF,EAAE,KAAI,EAChB,GAAI,CAACE,EAAG,MAAO,GACf,MAAMG,EAAI,mCAAmC,KAAKH,CAAC,EACnD,GAAIG,EAAG,CACL,MAAMG,EAAI,OAAOH,EAAE,CAAC,CAAC,EAAGQ,EAAIR,EAAE,CAAC,EAAE,YAAW,EAC5C,OAAOQ,IAAM,IAAML,EAAI,KAAOK,IAAM,IAAML,EAAI,GAAKK,IAAM,KAAOL,EAAI,IAAMA,CAC5E,CACA,MAAMP,EAAIC,EAAE,MAAM,GAAG,EACrB,OAAOD,EAAE,SAAW,EAAI,OAAOA,EAAE,CAAC,CAAC,EAAI,KAAO,OAAOA,EAAE,CAAC,CAAC,EAAI,GAAK,OAAOA,EAAE,CAAC,CAAC,EAAIA,EAAE,SAAW,EAAI,OAAOA,EAAE,CAAC,CAAC,EAAI,GAAK,OAAOA,EAAE,CAAC,CAAC,EAAI,OAAOC,CAAC,GAAK,CACpJ,CACA,SAAS6C,GAAE/C,EAAG,CACZ,GAAI,OAAO,UAAY,IACrB,MAAM,IAAI,MAAM,+CAA+C,EACjE,MAAME,EAAI,IAAI,UAAS,EAAG,gBAAgBF,EAAG,iBAAiB,EAC9D,GAAIE,EAAE,qBAAqB,aAAa,EAAE,OAAS,EACjD,MAAM,IAAI,MAAM,sBAAsB,EACxC,MAAMD,EAAIC,EAAE,qBAAqB,GAAG,EAAGM,EAAI,CAAA,EAC3C,QAASK,EAAI,EAAGA,EAAIZ,EAAE,OAAQY,IAAK,CACjC,MAAMC,EAAIb,EAAEY,CAAC,EAAGE,EAAID,EAAE,aAAa,OAAO,GAAK,GAAIE,EAAIF,EAAE,aAAa,KAAK,GAAK,GAAIG,EAAIH,EAAE,aAAa,KAAK,GAAK,GAAIc,EAAIkB,GAAE/B,CAAC,EAC5H,IAAII,EACJH,EAAIG,EAAI2B,GAAE9B,CAAC,EAAIC,EAAIE,EAAIS,EAAIkB,GAAE7B,CAAC,EAAIE,EAAIS,EAAI,EAC1C,IAAIC,EAAI,GACRf,EAAE,WAAW,QAAS,GAAM,CAC1B,GAAI,EAAE,WAAa,EACjBe,GAAK,EAAE,WAAa,WACb,EAAE,WAAa,EAAG,CACzB,MAAM,EAAI,EACV,EAAE,QAAQ,gBAAkB,KAAOA,GAAK;AAAA,EAC5CA,GAAK,EAAE,aAAe,EACpB,CACF,CAAC,EACD,MAAMX,EAAIW,EAAE,QAAQ,UAAW,GAAG,EAAE,QAAQ,OAAQ;AAAA,CACvD,EAAE,KAAI,GACFX,GAAKU,GAAKT,IAAMX,EAAE,KAAK,CAAE,MAAOoB,EAAG,IAAKT,EAAG,KAAMD,CAAC,CAAE,CACvD,CACA,OAAOV,EAAE,KAAK,CAACK,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EAAG,CAAE,OAAQ,OAAQ,KAAMN,CAAC,CACvE,CACA,SAASwC,GAAGhD,EAAGE,EAAG,CAChB,OAAQA,GAAKwB,GAAE1B,CAAC,EAAC,CACf,IAAK,MACH,OAAOgC,GAAEhC,CAAC,EACZ,IAAK,OACH,OAAOkC,GAAElC,CAAC,EACZ,IAAK,MACH,OAAO0C,GAAE1C,EAAG,KAAK,EACnB,IAAK,MACH,OAAO0C,GAAE1C,EAAG,KAAK,EACnB,IAAK,OACH,OAAO+C,GAAE/C,CAAC,EACZ,IAAK,MACH,OAAO2B,GAAE3B,EAAG,KAAK,EACnB,IAAK,MACL,QACE,OAAO2B,GAAE3B,EAAG,KAAK,CACvB,CACA,CACA,eAAeiD,GAAGjD,EAAG,CACnB,OAAOkD,GAAE,UAAUlD,CAAC,CACtB,CACA,SAASmD,GAAGnD,EAAG,CACb,MAAME,EAAI,CAAA,EACV,OAAOF,EAAE,QAAQ,CAACK,EAAGJ,IAAM,CACzB,IAAIkB,EACJ,MAAMX,EAAIP,EAAE,IAAKY,EAAIL,GAAK,CAACH,EAAE,SAAS,GAAG,EAAIA,EAAI,IAAMA,EAAGS,EAAIN,EAAIK,EAAE,QAAQ,MAAO,EAAE,EAAIA,EAAG,EAAIC,EAAE,YAAY,GAAG,EAAGE,EAAI,GAAK,EAAIF,EAAE,MAAM,EAAI,CAAC,EAAIA,EAAGG,EAAI,GAAK,EAAIH,EAAE,MAAM,EAAG,CAAC,EAAI,GAAIc,EAAIpB,EAAI,IAAMW,EAAIlB,EAAE,QAAU,KAAO,OAASkB,EAAE,mBAAqB,EAC3PjB,EAAE,KAAK,CACL,KAAMW,EACN,KAAMG,EACN,IAAKC,EACL,MAAOT,EACP,KAAMoB,EACN,KAAM3B,EAAE,IACd,CAAK,CACH,CAAC,EAAGC,CACN,CACA,SAASkD,GAAGpD,EAAG,CACb,MAAME,EAAI,CAAE,KAAM,GAAI,KAAM,GAAI,MAAO,GAAI,SAAU,CAAA,EAAI,KAAM,CAAC,EAAIG,EAAoB,IAAI,IAC5FA,EAAE,IAAI,GAAIH,CAAC,EACX,MAAMD,EAAKY,GAAM,CACf,GAAIR,EAAE,IAAIQ,CAAC,EAAG,OAAOR,EAAE,IAAIQ,CAAC,EAC5B,MAAMC,EAAID,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EACrC,IAAIE,EAAIb,EAAGc,EAAI,GACf,UAAWC,KAAKH,EAAG,CACjBE,EAAIA,EAAI,GAAGA,CAAC,IAAIC,CAAC,GAAKA,EACtB,IAAI,EAAIZ,EAAE,IAAIW,CAAC,EACf,IAAM,EAAI,CAAE,KAAMC,EAAG,KAAMD,EAAI,IAAK,MAAO,GAAI,SAAU,CAAA,EAAI,KAAM,CAAC,EAAID,EAAE,SAAS,KAAK,CAAC,EAAGV,EAAE,IAAIW,EAAG,CAAC,GAAID,EAAI,CAChH,CACA,OAAOA,CACT,EACA,UAAWF,KAAKb,EAAG,CACjB,GAAIa,EAAE,MAAO,CACXZ,EAAEY,EAAE,KAAK,QAAQ,MAAO,EAAE,CAAC,EAC3B,QACF,CACAZ,EAAEY,EAAE,GAAG,EAAE,SAAS,KAAK,CACrB,KAAMA,EAAE,KACR,KAAMA,EAAE,KACR,MAAO,GACP,KAAMA,EAAE,IACd,CAAK,CACH,CACA,MAAML,EAAKK,GAAM,CACf,GAAIA,EAAE,SAAU,CACdA,EAAE,SAAS,KAAK,CAACC,EAAGC,IAAMD,EAAE,QAAUC,EAAE,MAAQD,EAAE,MAAQ,GAAK,EAAIA,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,EAC/F,UAAWD,KAAKD,EAAE,SAAUL,EAAEM,CAAC,CACjC,CACF,EACA,OAAON,EAAEN,CAAC,EAAGA,CACf,CAOA,eAAemD,GAAGrD,EAAGE,EAAGG,EAAG,CACzB,MAAMJ,EAAID,EAAE,KAAKE,CAAC,EAClB,GAAI,CAACD,EAAG,MAAM,IAAI,MAAM,wBAAwBC,CAAC,EAAE,EACnD,MAAMM,EAAI,MAAMP,EAAE,MAAM,aAAa,EACrC,OAAO,IAAI,KAAK,CAACO,CAAC,EAAGH,EAAI,CAAE,KAAMA,CAAC,EAAK,MAAM,CAC/C,CACA,SAASiD,GAAEtD,EAAG,CACZ,OAAOA,EAAIA,EAAE,WAAW,GAAG,EAAIA,EAAIA,EAAE,SAAW,EAAI,IAAMA,EAAE,UAAU,CAAC,EAAIA,EAAE,SAAW,EAAI,IAAMA,EAAI,UAAY,SACpH,CACA,MAAMuD,GAAI,CACR,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,QACF,EAAGC,GAAI,CACL,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,QACF,EACA,SAASC,GAAEzD,EAAGE,EAAG,CACf,MAAMG,EAAI,SAASL,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAAGC,EAAI,SAASD,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAAGQ,EAAI,SAASR,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAAGa,EAAKI,GAAMf,EAAI,EAAI,KAAK,MAAMe,GAAK,EAAIf,EAAE,EAAI,KAAK,MAAMe,GAAK,IAAMA,GAAKf,CAAC,EAAGY,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGD,EAAER,CAAC,CAAC,CAAC,EAAGU,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGF,EAAEZ,CAAC,CAAC,CAAC,EAAGe,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGH,EAAEL,CAAC,CAAC,CAAC,EAChT,OAAOM,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAAIC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAAIC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAC3G,CACA,SAAS0C,GAAE1D,EAAG,CACZ,GAAIA,GAAKA,EAAE,OAAS,WAAaA,EAAE,UAAY,QAAS,CACtD,MAAME,EAAIF,EAAE,QACZ,GAAIE,EACF,OAAOyD,GAAEzD,CAAC,CACd,CACF,CACA,SAASyD,GAAE3D,EAAG,CACZ,GAAIA,EAAG,CACL,GAAI,SAAUA,GAAK,OAAOA,EAAE,MAAQ,UAAYA,EAAE,KAChD,OAAOsD,GAAEtD,EAAE,IAAI,EACjB,GAAI,UAAWA,GAAK,OAAOA,EAAE,OAAS,SAAU,CAC9C,MAAME,EAAIqD,GAAEvD,EAAE,KAAK,GAAK,SAAUK,EAAI,SAAUL,GAAK,OAAOA,EAAE,MAAQ,SAAWA,EAAE,KAAO,EAC1F,MAAO,KAAOK,IAAM,EAAIoD,GAAEvD,EAAGG,CAAC,EAAIH,EACpC,CACA,GAAI,YAAaF,GAAK,OAAOA,EAAE,SAAW,SAAU,CAClD,MAAME,EAAIsD,GAAExD,EAAE,OAAO,EACrB,GAAIE,EAAG,MAAO,IAAMA,CACtB,CACF,CACF,CACA,SAAS0D,GAAE5D,EAAG,CACZ,GAAI,CAACA,GAAK,CAACA,EAAE,MAAO,OACpB,MAAME,EAAIyD,GAAE3D,EAAE,KAAK,GAAK,UACxB,MAAO,CAACA,EAAE,MAAOE,CAAC,CACpB,CACA,SAAS2D,GAAE7D,EAAG,CACZ,MAAME,EAAI,CAAA,EACV,IAAIG,EAAI,GACR,GAAIL,EAAE,KAAM,CACV,MAAMQ,EAAIR,EAAE,KACZ,IAAKQ,EAAE,MAAQA,EAAE,MAAQA,EAAE,MAAQA,EAAE,UAAYH,EAAI,GAAIH,EAAE,KAAO,GAAIM,EAAE,OAASN,EAAE,KAAK,KAAOM,EAAE,MAAOA,EAAE,OAASN,EAAE,KAAK,KAAOM,EAAE,MAAOA,EAAE,OAASN,EAAE,KAAK,KAAO,IAAKM,EAAE,SAAWN,EAAE,KAAK,OAAS,KAAMM,EAAE,MAAO,CAClN,MAAMK,EAAI8C,GAAEnD,EAAE,KAAK,EACnBK,IAAMR,EAAI,GAAIH,EAAE,MAAQW,EAC1B,CACAL,EAAE,YAAcH,EAAI,GAAIH,EAAE,UAAY,IAAKM,EAAE,SAAWH,EAAI,GAAIH,EAAE,OAAS,GAC7E,CACA,MAAMD,EAAIyD,GAAE1D,EAAE,IAAI,EAClB,GAAIC,IAAMI,EAAI,GAAIH,EAAE,QAAUD,GAAID,EAAE,UAAW,CAC7C,MAAMQ,EAAIR,EAAE,UACZQ,EAAE,aAAeH,EAAI,GAAIH,EAAE,MAAQM,EAAE,YAAaA,EAAE,WAAaH,EAAI,GAAIH,EAAE,OAASM,EAAE,UAAWA,EAAE,WAAaH,EAAI,GAAIH,EAAE,SAAW,GACvI,CACA,GAAIF,EAAE,OAAQ,CACZ,MAAMQ,EAAI,CAAA,EACV,IAAIK,EAAI,GACR,MAAMC,EAAI,CAAC,MAAO,SAAU,OAAQ,OAAO,EAC3C,UAAWC,KAAKD,EAAG,CACjB,MAAME,EAAI4C,GAAE5D,EAAE,OAAOe,CAAC,CAAC,EACvBC,IAAMR,EAAEO,CAAC,EAAIC,EAAGH,EAAI,GACtB,CACAA,IAAMR,EAAI,GAAIH,EAAE,OAASM,EAC3B,CACA,OAAOH,EAAIH,EAAI,IACjB,CACA,SAAS4D,GAAE9D,EAAG,CACZ,OAAO,KAAK,UAAUA,CAAC,CACzB,CACA,SAAS+D,GAAG/D,EAAGE,EAAGG,EAAG,CACnB,MAAMJ,EAAI4D,GAAE7D,CAAC,EACb,GAAI,CAACC,EAAG,MAAO,GACf,MAAMO,EAAIsD,GAAE7D,CAAC,EAAGY,EAAIR,EAAE,IAAIG,CAAC,EAC3B,GAAIK,IAAM,OAAQ,OAAOA,EACzB,MAAMC,EAAIZ,EAAE,OACZ,OAAOA,EAAE,KAAKD,CAAC,EAAGI,EAAE,IAAIG,EAAGM,CAAC,EAAGA,CACjC,CACA,SAASkD,GAAGhE,EAAG,CACb,MAAME,EAAIF,EAAE,MACZ,GAAIE,GAAK,KAAM,MAAO,GACtB,GAAI,OAAOA,GAAK,SAAU,OAAOA,EACjC,GAAI,OAAOA,GAAK,SAAU,OAAO,OAAOA,CAAC,EACzC,GAAI,OAAOA,GAAK,UAAW,OAAOA,EAAI,OAAS,QAC/C,GAAIA,aAAa,KACf,OAAOA,EAAE,mBAAkB,EAC7B,GAAI,OAAOA,GAAK,UAAY,YAAaA,EAAG,CAC1C,MAAMG,EAAIH,EAAE,OACZ,OAAOG,GAAK,KAAO,OAAOA,CAAC,EAAI,EACjC,CACA,OAAO,OAAOH,GAAK,UAAY,aAAcA,EAAIA,EAAE,SAAS,IAAKD,GAAMA,EAAE,IAAI,EAAE,KAAK,EAAE,EAAI,OAAOC,GAAK,UAAY,cAAeA,EAAIA,EAAE,MAAQ,GAAK,OAAOA,GAAK,UAAY,UAAWA,EAAI,OAAOA,EAAE,KAAK,EAAI,OAAOA,CAAC,CACvN,CACA,SAAS+D,GAAGjE,EAAG,CACb,MAAME,EAAIF,EAAE,MAAM,GAAG,EAAGK,EAAI6D,GAAEhE,EAAE,CAAC,CAAC,EAAGD,EAAIC,EAAE,CAAC,EAAIgE,GAAEhE,EAAE,CAAC,CAAC,EAAIG,EAC1D,MAAO,CACL,IAAKA,EAAE,IACP,KAAMA,EAAE,IACR,OAAQJ,EAAE,IACV,MAAOA,EAAE,GACb,CACA,CACA,SAASiE,GAAElE,EAAG,CACZ,MAAME,EAAIF,EAAE,MAAM,iBAAiB,EACnC,GAAI,CAACE,EAAG,MAAO,CAAE,IAAK,EAAG,IAAK,CAAC,EAC/B,MAAMG,EAAIH,EAAE,CAAC,EAAGD,EAAI,SAASC,EAAE,CAAC,EAAG,EAAE,EACrC,IAAIM,EAAI,EACR,QAASK,EAAI,EAAGA,EAAIR,EAAE,OAAQQ,IAC5BL,EAAIA,EAAI,IAAMH,EAAE,WAAWQ,CAAC,EAAI,IAClC,MAAO,CAAE,IAAKZ,EAAG,IAAKO,CAAC,CACzB,CACA,SAAS2D,GAAGnE,EAAG,CACb,MAAME,EAAI,CAAA,EACV,OAAOF,EAAE,UAAWK,GAAM,CACxB,MAAMJ,EAAI,CAAA,EAAIO,EAAoB,IAAI,IAAOK,EAAI,CAAA,EAAIC,EAAI,CAAA,EAAIC,EAAI,CAAA,EAAIC,EAAIX,EAAE,YAC3E,QAAS,EAAI,EAAG,GAAKW,EAAG,IAAK,CAC3B,MAAME,EAAIb,EAAE,UAAU,CAAC,EACvBa,EAAE,QAAUH,EAAE,OAAO,EAAI,CAAC,CAAC,EAAI,CAAE,MAAO,KAAK,MAAMG,EAAE,MAAQ,GAAG,CAAC,EACnE,CACAH,EAAE,IAAM,KAAK,IAAIC,EAAG,EAAE,EACtB,MAAMC,EAAoB,IAAI,IAAO,EAAIZ,EAAE,MAAOc,GAAK,GAAK,KAAO,OAAS,EAAE,SAAW,CAAA,EACzF,UAAW,KAAKA,EAAG,CACjBN,EAAE,KAAK,CAAC,EACR,KAAM,CAAE,IAAKK,EAAG,KAAMe,EAAG,OAAQE,EAAG,MAAOE,CAAC,EAAK4B,GAAG,CAAC,EAAG3B,EAAIH,EAAIjB,EAAGqB,EAAIF,EAAIJ,EAC3EhB,EAAE,IAAI,GAAGC,EAAI,CAAC,IAAIe,EAAI,CAAC,GAAI,CAACK,EAAGC,CAAC,CAAC,CACnC,CACAlC,EAAE,QAAQ,CAAE,aAAc,EAAE,EAAI,CAAC,EAAGa,IAAM,CACxC,MAAMe,EAAIf,EAAI,EAAGiB,EAAI,CAAA,EACrB,EAAE,SAAS,CAAE,aAAc,EAAE,EAAI,CAACG,EAAGC,IAAM,CACzC,MAAMC,EAAID,EAAI,EACd,GAAID,EAAE,UAAYA,EAAE,SAAWA,EAAG,OAClC,MAAMF,EAAI4B,GAAG1B,CAAC,EAAGO,EAAIkB,GAAGzB,EAAGrC,EAAGO,CAAC,EAAGmC,EAAI,CAAE,KAAMP,CAAC,EAC/CS,IAAM,KAAOF,EAAE,MAAQE,GACvB,MAAMD,EAAI,GAAGX,CAAC,IAAIO,CAAC,GACnBvB,EAAE,IAAI2B,CAAC,IAAMD,EAAE,MAAQ1B,EAAE,IAAI2B,CAAC,GAAIT,EAAE,OAAOK,CAAC,CAAC,EAAIG,CACnD,CAAC,EACD,MAAMN,EAAI,CAAE,MAAOF,CAAC,EACpB,EAAE,SAAWE,EAAE,OAAS,KAAK,MAAM,EAAE,OAAS,KAAK,GAAIvB,EAAE,OAAOmB,CAAC,CAAC,EAAII,CACxE,CAAC,EAAGnC,EAAE,KAAK,CACT,KAAMG,EAAE,KACR,OAAQJ,EACR,OAAQY,EACR,KAAMC,EACN,KAAMC,CACZ,CAAK,CACH,CAAC,EAAGb,CACN,CACA,SAASkE,GAAGpE,EAAGE,EAAGG,EAAI,SAAU,CAC9B,MAAMJ,EAAID,EAAE,OAAS,EAAGa,EAAIZ,EAAI,CAAC,CAAE,KAAM,CAAE,KAAM,EAAE,CAAE,CAAE,EAAI,CAAA,EAAIa,EAAI,CAAA,EACnE,GAAIb,EAAG,CACL,MAAMe,EAAI,CAAA,EACVhB,EAAE,QAAQ,CAACiB,EAAGW,IAAM,CAClBZ,EAAE,OAAOY,CAAC,CAAC,EAAI,CAAE,KAAMX,EAAG,MAAO,CAAC,CACpC,CAAC,EAAGH,EAAE,CAAC,EAAI,CAAE,MAAOE,CAAC,CACvB,CACA,MAAMD,EAAId,EAAI,EAAI,EAClB,OAAOC,EAAE,QAAQ,CAACc,EAAGC,IAAM,CACzB,MAAMW,EAAI,CAAA,EACVZ,EAAE,QAAQ,CAACG,EAAGU,IAAM,CAClBV,IAAM,QAAUA,IAAM,KAAOS,EAAE,OAAOC,CAAC,CAAC,EAAI,CAAE,KAAMV,CAAC,EACvD,CAAC,EAAGL,EAAE,OAAOG,EAAIF,CAAC,CAAC,EAAI,CAAE,MAAOa,CAAC,CACnC,CAAC,EAAG,CAAC,CAAE,KAAMvB,EAAG,OAAQQ,EAAG,KAAMC,EAAG,CACtC,CAWA,MAAMuD,GAAK,CAET,kBAAmB,KACnB,eAAgB,KAChB,iBAAkB,MAClB,uBAAwB,OACxB,6BAA8B,sBAE9B,kBAAmB,KACnB,mBAAoB,KACpB,sBAAuB,OACvB,uBAAwB,OACxB,gBAAiB,KACjB,wBAAyB,OACzB,wBAAyB,OACzB,cAAe,KACf,oBAAqB,MACrB,oBAAqB,MACrB,qBAAsB,OACtB,uBAAwB,OACxB,kBAAmB,OACnB,mBAAoB,MACpB,iBAAkB,KAClB,kBAAmB,KAEnB,oBAAqB,SAErB,kBAAmB,aAEnB,oBAAqB,cAErB,eAAgB,gBAChB,mBAAoB,aACpB,oBAAqB,eACrB,iBAAkB,cAElB,eAAgB,cAChB,mBAAoB,WACpB,oBAAqB,aACrB,iBAAkB,YAClB,sBAAuB,iBACvB,gBAAiB,cACjB,eAAgB,kBAEhB,mBAAoB,iBACpB,yBAA0B,SAC1B,iBAAkB,UAElB,mBAAoB,cAEpB,mBAAoB,4BAEpB,gBAAiB,WACjB,oBAAqB,SACrB,+BAAgC,kBAEhC,kBAAmB,KACnB,mBAAoB,KACpB,wBAAyB,UACzB,yBAA0B,UAC1B,kBAAmB,KACnB,oBAAqB,OACrB,qBAAsB,OACtB,sBAAuB,OACvB,sBAAuB,OACvB,oBAAqB,KAErB,uBAAwB,kBACxB,qBAAsB,OACtB,kBAAmB,MAEnB,mBAAoB,cACpB,aAAc,QACd,YAAa,OAEb,cAAe,cACf,kBAAmB,aACnB,mBAAoB,WAEpB,kBAAmB,aAEnB,uBAAwB,WACxB,wBAAyB,SACzB,iBAAkB,QAClB,gBAAiB,OACjB,sBAAuB,KACvB,uBAAwB,MACxB,sBAAuB,KACvB,uBAAwB,KACxB,mBAAoB,KACpB,uBAAwB,KACxB,uBAAwB,KACxB,uBAAwB,MACxB,wBAAyB,KAEzB,kBAAmB,aACnB,mBAAoB,WAEpB,mBAAoB,UACtB,EAAGC,GAAK,CAEN,kBAAmB,WACnB,eAAgB,QAChB,iBAAkB,UAClB,uBAAwB,gBACxB,6BAA8B,oDAE9B,kBAAmB,UACnB,mBAAoB,WACpB,sBAAuB,cACvB,uBAAwB,eACxB,gBAAiB,QACjB,wBAAyB,gBACzB,wBAAyB,gBACzB,cAAe,oBACf,oBAAqB,gBACrB,oBAAqB,YACrB,qBAAsB,aACtB,uBAAwB,eACxB,kBAAmB,YACnB,mBAAoB,UACpB,iBAAkB,SAClB,kBAAmB,UAEnB,oBAAqB,uBAErB,kBAAmB,qBAEnB,oBAAqB,gCAErB,eAAgB,mBAChB,mBAAoB,uBACpB,oBAAqB,6BACrB,iBAAkB,uBAElB,eAAgB,iBAChB,mBAAoB,qBACpB,oBAAqB,2BACrB,iBAAkB,qBAClB,sBAAuB,0CACvB,gBAAiB,8BACjB,eAAgB,yDAEhB,mBAAoB,kCACpB,yBAA0B,0BAC1B,iBAAkB,oBAElB,mBAAoB,sBAEpB,mBAAoB,gEAEpB,gBAAiB,mBACjB,oBAAqB,uBACrB,+BAAgC,gCAEhC,kBAAmB,OACnB,mBAAoB,QACpB,wBAAyB,qBACzB,yBAA0B,kBAC1B,kBAAmB,OACnB,oBAAqB,SACrB,qBAAsB,cACtB,sBAAuB,eACvB,sBAAuB,oBACvB,oBAAqB,SAErB,uBAAwB,0BACxB,qBAAsB,YACtB,kBAAmB,SAEnB,mBAAoB,sBACpB,aAAc,QACd,YAAa,OAEb,cAAe,iBACf,kBAAmB,qBACnB,mBAAoB,sBAEpB,kBAAmB,qBAEnB,uBAAwB,0BACxB,wBAAyB,2BACzB,iBAAkB,QAClB,gBAAiB,OACjB,sBAAuB,QACvB,uBAAwB,SACxB,sBAAuB,QACvB,uBAAwB,SACxB,mBAAoB,KACpB,uBAAwB,SACxB,uBAAwB,SACxB,uBAAwB,SACxB,wBAAyB,UAEzB,kBAAmB,qBACnB,mBAAoB,sBAEpB,mBAAoB,0BACtB,EAAGC,GAAI,CACL,QAASF,GACT,QAASC,EACX,EAAGE,GAAK,aACR,SAASC,GAAGzE,EAAGE,EAAG,CAChB,OAAOA,EAAIF,EAAE,QAAQwE,GAAI,CAACnE,EAAGJ,IAAM,CACjC,MAAMO,EAAIN,EAAED,CAAC,EACb,OAAOO,IAAM,OAAS,IAAIP,CAAC,IAAM,OAAOO,CAAC,CAC3C,CAAC,EAAIR,CACP,CACA,SAAS0E,GAAG1E,EAAG,CACb,IAAIc,EACJ,MAAM,EAAId,EAAE,gBAAkB,QAASK,EAAIkE,GAAEvE,EAAE,MAAM,GAAKuE,GAAE,CAAC,GAAKA,GAAE,OAAO,EAAGtE,GAAKa,EAAId,EAAE,WAAa,KAAO,OAASc,EAAEd,EAAE,MAAM,EAAGQ,EAAIP,EAAI,CAAE,GAAGI,EAAG,GAAGJ,CAAC,EAAKI,EAAGQ,EAAI0D,GAAE,OAAO,EAC5K,MAAO,CAACxD,EAAGC,IAAM,CACf,MAAMC,EAAIT,EAAEO,CAAC,GAAKF,EAAEE,CAAC,GAAKA,EAC1B,OAAO0D,GAAGxD,EAAGD,CAAC,CAChB,CACF,CC/kCA,MAAM2D,GAAgBC,EAAAA,cAAyC,IAAI,EAUtDC,GAAgD,CAAC,CAC5D,OAAAC,EAAS,QACT,SAAAC,EACA,SAAAC,CACF,IAAM,CACJ,MAAMC,EAAQC,EAAAA,QAA4B,IAAM,CAC9C,MAAMhF,EAAIiF,GAAiB,CAAE,OAAAL,EAAQ,SAAAC,EAAU,EAC/C,MAAO,CAAE,OAAAD,EAAQ,EAAA5E,CAAA,CACnB,EAAG,CAAC4E,EAAQC,CAAQ,CAAC,EAErB,OAAOK,EAAAA,IAACT,GAAc,SAAd,CAAuB,MAAAM,EAAe,SAAAD,CAAA,CAAS,CACzD,EAMA,IAAIK,GAAwC,KAC5C,SAASC,IAAoC,CAC3C,OAAKD,KACHA,GAAqBF,GAAiB,CAAE,OAAQ,OAAA,CAAS,GAEpDE,EACT,CAOO,SAASE,GAA4B,CAC1C,MAAMC,EAAMC,EAAAA,WAAWd,EAAa,EACpC,OAAOa,GAAA,YAAAA,EAAK,IAAKF,GAAA,CACnB,CAKO,SAASI,IAAoB,CAClC,MAAMF,EAAMC,EAAAA,WAAWd,EAAa,EACpC,OAAOa,GAAA,YAAAA,EAAK,SAAU,OACxB,CC3DA,MAAMG,GAAef,EAAAA,cAAoC,IAAI,EAOhDgB,GAA8C,CAAC,CAAE,MAAAC,EAAO,SAAAb,WAC3DW,GAAa,SAAb,CAAsB,MAAOE,EAAQ,SAAAb,EAAS,EAWjD,SAASc,IAAkC,CAChD,OAAOL,EAAAA,WAAWE,EAAY,GAAK,MACrC,CCrBA,MAAMI,GAAqD,CAAC,CAAE,UAAAC,CAAA,IAC5DZ,EAAAA,IAAC,MAAA,CACC,MAAM,6BACN,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,UAAAY,EAEA,eAAC,OAAA,CAAK,EAAE,KAAK,EAAE,OAAO,WAAW,SAAS,SAAS,KAAK,WAAW,OAAO,KAAK,eAAe,OAAO,OAAO,SAAA,KAAA,CAE5G,CAAA,CACF,EAeK,SAASC,GAAsBT,EAA0C,CAC9E,MAAO,CACL,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOU,EAAAA,QAAA,CAAQ,UAAU,kBAAkB,EAAI,QAASV,EAAI,EAAE,kBAAkB,EAAG,OAAQA,EAAI,UAAW,SAAUA,EAAI,MAAQ,GAAA,EAClJ,CAAE,KAAM,OAAQ,QAAS,GAAG,KAAK,MAAMA,EAAI,KAAO,GAAG,CAAC,IAAK,SAAU,MAAA,EACrE,CAAE,KAAM,SAAU,WAAOW,EAAAA,OAAA,CAAO,UAAU,kBAAkB,EAAI,QAASX,EAAI,EAAE,iBAAiB,EAAG,OAAQA,EAAI,SAAU,SAAUA,EAAI,MAAQ,EAAA,CAAG,CACpJ,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACgB,EAAAA,MAAK,UAAU,iBAAA,CAAkB,EAAI,QAASZ,EAAI,EAAE,uBAAuB,EAAG,OAAQA,EAAI,YAAA,EACnH,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACW,IAAiB,UAAU,iBAAA,CAAkB,EAAI,QAASP,EAAI,EAAE,uBAAuB,EAAG,OAAQA,EAAI,cAAA,CAAe,CAChJ,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACiB,EAAAA,WAAU,UAAU,iBAAA,CAAkB,EAAI,QAASb,EAAI,EAAE,qBAAqB,EAAG,OAAQA,EAAI,YAAA,EACtH,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACkB,EAAAA,UAAS,UAAU,iBAAA,CAAkB,EAAI,QAASd,EAAI,EAAE,sBAAsB,EAAG,OAAQA,EAAI,aAAA,CAAc,CACtI,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACmB,EAAAA,WAAU,UAAU,iBAAA,CAAkB,EAAI,QAASf,EAAI,EAAE,eAAe,EAAG,OAAQA,EAAI,OAAA,CAAQ,CAC1H,CACF,CAEJ,CCjDO,SAASgB,GAAoBhB,EAAwC,CAC1E,MAAO,CACL,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOU,EAAAA,QAAA,CAAQ,UAAU,kBAAkB,EAAI,QAASV,EAAI,EAAE,kBAAkB,EAAG,OAAQA,EAAI,UAAW,SAAUA,EAAI,MAAQ,GAAA,EAClJ,CAAE,KAAM,OAAQ,QAAS,GAAG,KAAK,MAAMA,EAAI,KAAO,GAAG,CAAC,IAAK,SAAU,MAAA,EACrE,CAAE,KAAM,SAAU,WAAOW,EAAAA,OAAA,CAAO,UAAU,kBAAkB,EAAI,QAASX,EAAI,EAAE,iBAAiB,EAAG,OAAQA,EAAI,SAAU,SAAUA,EAAI,MAAQ,EAAA,CAAG,CACpJ,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACmB,EAAAA,WAAU,UAAU,iBAAA,CAAkB,EAAI,QAASf,EAAI,EAAE,eAAe,EAAG,OAAQA,EAAI,OAAA,CAAQ,CAC1H,CACF,CAEJ,CCbO,SAASiB,GAAqBjB,EAAyC,CAC5E,MAAO,CACL,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOkB,EAAAA,KAAA,CAAK,UAAU,kBAAkB,EAAI,QAASlB,EAAI,EAAE,aAAa,EAAG,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,YAAU,CAAE,CAC9I,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOC,EAAAA,YAAA,CAAY,UAAU,kBAAkB,EAAI,QAASpB,EAAI,EAAE,mBAAmB,EAAG,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,EACtJ,CAAE,KAAM,OAAQ,QAAS,GAAGnB,EAAI,OAAO,MAAMA,EAAI,KAAK,GAAI,SAAU,MAAA,EACpE,CAAE,KAAM,SAAU,WAAOqB,EAAAA,aAAA,CAAa,UAAU,kBAAkB,EAAI,QAASrB,EAAI,EAAE,mBAAmB,EAAG,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,CAAE,CAC3J,EAEF,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMnB,EAAI,UAAYJ,EAAAA,IAAC0B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EAAK1B,EAAAA,IAAC2B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EACzG,QAASvB,EAAI,UAAYA,EAAI,EAAE,sBAAsB,EAAIA,EAAI,EAAE,oBAAoB,EACnF,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,kBAAgB,CACrD,CACF,CACF,CAEJ,CCzBO,SAASK,GAAqBxB,EAAyC,CAC5E,MAAO,CACL,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMJ,EAAAA,IAACsB,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,EACxC,QAASlB,EAAI,EAAE,aAAa,EAC5B,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,YAAU,CAC/C,CACF,EAEF,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMvB,EAAAA,IAACwB,EAAAA,YAAA,CAAY,UAAU,iBAAA,CAAkB,EAC/C,QAASpB,EAAI,EAAE,mBAAmB,EAClC,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,EAE9C,CACE,KAAM,OACN,QAAS,GAAGnB,EAAI,OAAO,MAAMA,EAAI,KAAK,GACtC,SAAU,MAAA,EAEZ,CACE,KAAM,SACN,KAAMJ,EAAAA,IAACyB,EAAAA,aAAA,CAAa,UAAU,iBAAA,CAAkB,EAChD,QAASrB,EAAI,EAAE,mBAAmB,EAClC,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,CAC9C,CACF,EAEF,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMnB,EAAI,UACNJ,EAAAA,IAAC0B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EACvC1B,EAAAA,IAAC2B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EAC3C,QAASvB,EAAI,UAAYA,EAAI,EAAE,sBAAsB,EAAIA,EAAI,EAAE,oBAAoB,EACnF,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,kBAAgB,CACrD,CACF,CACF,CAEJ,CC7CO,SAASM,GAAoB,CAAE,MAAAC,GAA4C,CAChF,OAAKA,EACE,CACL,CACE,MAAO,CACL,CACE,KAAM,OACN,QAAS,GAAGA,EAAM,KAAK,YAAYA,EAAM,IAAI,WAAWC,GAAeD,EAAM,IAAI,CAAC,GAClF,SAAU,OAAA,CACZ,CACF,CACF,EAViB,CAAA,CAYrB,CCfO,SAASE,GAAqB5B,EAAyC,CAC5E,MAAM6B,EAAyB,CAC7B,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMjC,EAAAA,IAACkC,EAAAA,SAAA,CAAS,UAAU,iBAAA,CAAkB,EAC5C,QAAS9B,EAAI,SAAWA,EAAI,EAAE,kBAAkB,EAAIA,EAAI,EAAE,iBAAiB,EAC3E,OAAQA,EAAI,YAAA,CACd,CACF,CACF,EAGF,OAAIA,EAAI,QACN6B,EAAO,KAAK,CACV,MAAO,CACL,CACE,KAAM,SACN,KAAM7B,EAAI,YACNJ,EAAAA,IAACmC,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,EAClCnC,EAAAA,IAACoC,EAAAA,IAAA,CAAI,UAAU,iBAAA,CAAkB,EACrC,QAAShC,EAAI,YAAcA,EAAI,EAAE,gBAAgB,EAAIA,EAAI,EAAE,iBAAiB,EAC5E,OAAQA,EAAI,mBAAA,CACd,CACF,CACD,EAGI6B,CACT,CCjCO,SAASI,GAAyBjC,EAA6C,CACpF,MAAO,CACL,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMA,EAAI,WAAa,UACnBJ,EAAAA,IAACmC,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,EAClCnC,EAAAA,IAACoC,EAAAA,IAAA,CAAI,UAAU,iBAAA,CAAkB,EACrC,QAAShC,EAAI,WAAa,UAAYA,EAAI,EAAE,gBAAgB,EAAIA,EAAI,EAAE,iBAAiB,EACvF,OAAQA,EAAI,gBAAA,CACd,CACF,CACF,CAEJ,CCDO,MAAMkC,GAAgDC,EAAAA,KAAK,IAChE,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAAkB,KAAM3F,IAAO,CAAE,QAASA,EAAE,eAAgB,CAC9D,EAEa4F,GAA4CF,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAAG,EAAA,EAAgB,KAAM7F,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEa8F,GAA8CJ,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAK,EAAA,EAAiB,KAAM/F,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEagG,GAA8CN,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAO,EAAA,EAAiB,KAAMjG,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEakG,GAA8CR,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAS,EAAA,EAAiB,KAAMnG,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEaoG,GAA4CV,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAAW,EAAA,EAAgB,KAAMrG,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEasG,GAA8CZ,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAa,EAAA,EAAiB,KAAMvG,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEawG,GAA8Cd,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAe,EAAA,EAAiB,KAAMzG,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEa0G,GAAgDhB,EAAAA,KAAK,IAChE,QAAA,QAAA,EAAA,KAAA,IAAAiB,EAAA,EAAkB,KAAM3G,IAAO,CAAE,QAASA,EAAE,eAAgB,CAC9D,EAEa4G,GAAgDlB,EAAAA,KAAK,IAChE,QAAA,QAAA,EAAA,KAAA,IAAAmB,EAAA,EAAkB,KAAM7G,IAAO,CAAE,QAASA,EAAE,eAAgB,CAC9D,EAEa8G,GAAsDpB,EAAAA,KAAK,IACtE,QAAA,QAAA,EAAA,KAAA,IAAAqB,EAAA,EAAqB,KAAM/G,IAAO,CAAE,QAASA,EAAE,kBAAmB,CACpE,EAEagH,GAA8CtB,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAuB,EAAA,EAAiB,KAAMjH,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEakH,GAA4CxB,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAAyB,EAAA,EAAgB,KAAMnH,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEaoH,GAA4C1B,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAA2B,EAAA,EAAgB,KAAMrH,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEasH,GAAsD5B,EAAAA,KAAK,IACtE,QAAA,QAAA,EAAA,KAAA,IAAA6B,EAAA,EAAqB,KAAMvH,IAAO,CAAE,QAASA,EAAE,kBAAmB,CACpE,EAEawH,GAA4C9B,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAA+B,EAAA,EAAgB,KAAMzH,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEa0H,GAA8ChC,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAiC,EAAA,EAAiB,KAAM3H,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,ECjFa4H,GAA0D,CAAC,CACtE,SAAAC,EACA,SAAAC,EACA,WAAAC,CACF,IAAM,CACJ,MAAM9J,EAAIqF,EAAA,EACV,OACE0E,EAAAA,KAAC,MAAA,CAAI,UAAU,oGACb,SAAA,CAAA7E,EAAAA,IAAC,OAAI,UAAU,mGACb,eAAC8E,EAAAA,aAAA,CAAa,UAAU,0CAA0C,CAAA,CACpE,EAEAD,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAA7E,EAAAA,IAAC,IAAA,CAAE,UAAU,uCAAwC,SAAA0E,EAAS,EAC9D1E,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAlF,EAAE,6BAA8B,CAAE,KAAM6J,CAAA,CAAU,CAAA,CAAE,CAAA,EAC5F,EAEAE,EAAAA,KAAC,SAAA,CACC,QAASD,EACT,UAAU,2LAEV,SAAA,CAAA5E,EAAAA,IAAC+E,EAAAA,SAAA,CAAS,UAAU,iBAAA,CAAkB,EACrCjK,EAAE,iBAAiB,CAAA,CAAA,CAAA,CACtB,EACF,CAEJ,EChCakK,GAA4B,IAAM,CAC7C,MAAMlK,EAAIqF,EAAA,EACV,aACG,MAAA,CAAI,UAAU,uFACb,SAAA0E,EAAAA,KAAC,MAAA,CAAI,UAAU,mDACb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,6GAAA,CAA8G,QAC5H,OAAA,CAAK,UAAU,cAAe,SAAAlF,EAAE,gBAAgB,GAAK,YAAA,CAAa,CAAA,CAAA,CACrE,CAAA,CACF,CAEJ,EC+BMmK,GAAwB,EAyBjBC,GAAwD,CAAC,CACpE,MAAAC,EACA,aAAAC,EACA,WAAAC,EACA,gBAAAC,EAAkB,CAAA,EAClB,KAAAC,EAAO,QACP,QAAAC,EACA,gBAAAC,EAAkB,EAClB,OAAA/F,EAAS,QACT,SAAUgG,EACV,SAAAC,EAAW,GACX,MAAAlF,EAAQ,OACR,cAAAmF,CACF,IAAM,CACJ,MAAM9K,EAAgBgF,EAAAA,QACpB,IAAMC,GAAiB,CAAE,OAAAL,EAAQ,SAAUgG,EAAc,EACzD,CAAChG,EAAQgG,CAAY,CAAA,EAGjB,CAACG,EAAYC,CAAa,EAAIC,EAAAA,SAAS,IAC3C,OAAO,OAAW,IACd,OAAO,WAAW,8BAA8B,EAAE,QAClD,EAAA,EAGNC,EAAAA,UAAU,IAAM,CACd,GAAIvF,IAAU,OAAQ,OACtB,MAAMwF,EAAM,OAAO,WAAW,8BAA8B,EACtDC,EAAWtL,IAA2BkL,EAAclL,GAAE,OAAO,EACnE,OAAAqL,EAAI,iBAAiB,SAAUC,CAAO,EAC/B,IAAMD,EAAI,oBAAoB,SAAUC,CAAO,CACxD,EAAG,CAACzF,CAAK,CAAC,EAEV,MAAM0F,EAAgB1F,IAAU,OAAUoF,EAAa,OAAS,QAAWpF,EAErE,CAAC2F,EAAMC,CAAO,EAAIN,EAAAA,SAAS,CAAC,EAC5B,CAACO,EAAUC,CAAW,EAAIR,EAAAA,SAAS,CAAC,EACpC,CAACS,EAAaC,CAAc,EAAIV,EAAAA,SAAS,CAAC,EAC1C,EAAGW,CAAa,EAAIX,EAAAA,SAAS,CAAC,EAC9B,CAACY,EAAqBC,CAAsB,EAAIb,EAAAA,SAAS,CAAC,EAC1D,CAACc,EAAsBC,CAAuB,EAAIf,EAAAA,SAAS,CAAC,EAC5D,CAACgB,EAAeC,CAAgB,EAAIjB,EAAAA,SAAS,CAAC,EAC9CkB,EAAaC,EAAAA,OAAuB,IAAI,EACxCC,EAAUD,EAAAA,OAAuB,IAAI,EACrCE,EAAUF,EAAAA,OAA2B,IAAI,EACzC,CAACG,EAAaC,CAAc,EAAIvB,EAAAA,SAAS,CAAC,EAC1C,CAACwB,EAAWC,CAAY,EAAIzB,EAAAA,SAAS,CAAC,EACtC,CAAC0B,EAAeC,CAAgB,EAAI3B,EAAAA,SAAS,EAAK,EAClD4B,EAAUT,EAAAA,OAA2B,IAAI,EACzC,CAACU,EAAaC,EAAc,EAAI9B,EAAAA,SAAS,CAAC,EAC1C,CAAC+B,EAAWC,EAAY,EAAIhC,EAAAA,SAAS,CAAC,EACtC,CAACiC,GAAeC,EAAgB,EAAIlC,EAAAA,SAAS,EAAK,EAClD,CAACmC,GAAUC,EAAW,EAAIpC,EAAAA,SAAiC,IAAI,EAC/D,CAACqC,EAAcC,EAAe,EAAItC,EAAAA,SAAS,EAAI,EAC/C,CAACuC,GAAiBC,EAAkB,EAAIxC,EAAAA,SAAS,EAAK,EACtD,CAACyC,GAAkBC,EAAmB,EAAI1C,EAAAA,SAA+B,SAAS,EAGlF,CAAC2C,GAAYC,EAAa,EAAI5C,EAAAA,SAAS,EAAI,EAC3C6C,GAAkB1B,EAAAA,OAAsB,IAAI,EAC5C2B,GAAiB,IAEjBC,GAAgBC,EAAAA,YAAY,IAAM,CACtCJ,GAAc,EAAI,EACdC,GAAgB,SAClB,aAAaA,GAAgB,OAAO,EAEtCA,GAAgB,QAAU,OAAO,WAAW,IAAM,CAChDD,GAAc,EAAK,CACrB,EAAGE,EAAc,CACnB,EAAG,CAAA,CAAE,EAECG,GAAkBD,EAAAA,YAAY,IAAM,CACxCD,GAAA,CACF,EAAG,CAACA,EAAa,CAAC,EAGZG,GAAkBnJ,EAAAA,QAAQ,IAAMoJ,GAAe/D,CAAK,EAAG,CAACA,CAAK,CAAC,EAE9DgE,EAAcF,GAAgB7D,CAAY,EAG1CgE,GAAiBtJ,EAAAA,QAAQ,IACxBqJ,EACE7D,EAAgB,KAAK+D,GAAYA,EAAS,KAAKF,CAAW,CAAC,EADzC,KAExB,CAACA,EAAa7D,CAAe,CAAC,EAE3BX,EAAWwE,EAAcG,GAAYH,CAAW,EAAI,cAGpDI,GAAaR,EAAAA,YACjB,CAACS,EAAcC,IAAsB,CAC9BN,IACLvD,GAAA,MAAAA,EAAgB,CAAE,KAAA4D,EAAM,QAAAC,EAAS,KAAMN,IACzC,EACA,CAACA,EAAavD,CAAa,CAAA,EAIvB8D,GAAY5J,EAAAA,QAChB,KAAO,CACL,KAAMyJ,GACN,EAAAzO,EACA,MAAOqL,EACP,OAAAzG,CAAA,GAEF,CAAC6J,GAAYzO,EAAGqL,EAAezG,CAAM,CAAA,EAIvCsG,EAAAA,UAAU,IAAM,CACdK,EAAQ,CAAC,EACTE,EAAY,CAAC,EACbE,EAAe,CAAC,EAChBC,EAAc,CAAC,EACfE,EAAuB,CAAC,EACxBE,EAAwB,CAAC,EACzB6B,GAAc,EAAI,EACdC,GAAgB,SAClB,aAAaA,GAAgB,OAAO,CAExC,EAAG,CAACxD,CAAY,CAAC,EAGjBY,EAAAA,UAAU,IAAM,CACd,GAAIrB,IAAa,SAAWgC,EAAsB,GAAKE,EAAuB,GAAKI,EAAW,QAAS,CACrG,MAAM0C,EAAiB1C,EAAW,QAAQ,YACpC2C,EAAkB3C,EAAW,QAAQ,aACrC4C,GAASF,EAAiBhD,EAC1BmD,GAASF,EAAkB/C,EAC3BkD,GAAU,KAAK,IAAIF,GAAQC,EAAM,EACvCzD,EAAQ,KAAK,IAAI,IAAM,KAAK,IAAI,GAAI0D,EAAO,CAAC,CAAC,CAC/C,CACF,EAAG,CAACpF,EAAUgC,EAAqBE,CAAoB,CAAC,EAGxDb,EAAAA,UAAU,KACJiD,GAAgB,OAAS,GAC3BH,GAAA,EAEK,IAAM,CACPF,GAAgB,SAClB,aAAaA,GAAgB,OAAO,CAExC,GACC,CAACK,GAAgB,OAAQH,EAAa,CAAC,EAK1C9C,EAAAA,UAAU,IAAM,CACd,MAAMgE,EAAiBpP,GAAqB,CACtCA,EAAE,MAAQ,UAAY2K,IAAS,QACjCC,GAAA,MAAAA,IACS5K,EAAE,MAAQ,aAAewK,EAAe,EACjDC,GAAA,MAAAA,EAAaD,EAAe,GACnBxK,EAAE,MAAQ,cAAgBwK,EAAe6D,GAAgB,OAAS,IAC3E5D,GAAA,MAAAA,EAAaD,EAAe,GAEhC,EAEA,GAAIG,IAAS,QACX,cAAO,iBAAiB,UAAWyE,CAAa,EACzC,IAAM,OAAO,oBAAoB,UAAWA,CAAa,EAC3D,CACL,MAAMC,EAAK9C,EAAQ,QACnB,OAAK8C,GACLA,EAAG,iBAAiB,UAAWD,CAA8B,EACtD,IAAMC,EAAG,oBAAoB,UAAWD,CAA8B,GAFpE,MAGX,CACF,EAAG,CAACzE,EAAMH,EAAc6D,GAAgB,OAAQzD,EAASH,CAAU,CAAC,EAEpE,MAAM6E,GAAenB,EAAAA,YAAY,IAAM,CACrC1C,EAAS8D,GAAS,KAAK,IAAIA,EAAO,GAAK,EAAE,CAAC,CAC5C,EAAG,CAAA,CAAE,EAECC,GAAgBrB,EAAAA,YAAY,IAAM,CACtC1C,EAAS8D,GAAS,KAAK,IAAIA,EAAO,GAAK,GAAI,CAAC,CAC9C,EAAG,CAAA,CAAE,EAECE,GAAetB,EAAAA,YAAY,IAAM,CACrCxC,EAAa4D,GAASA,EAAO,EAAE,CACjC,EAAG,CAAA,CAAE,EAECG,GAAmBvB,EAAAA,YAAY,IAAM,CACzCxC,EAAa4D,GAASA,EAAO,EAAE,CACjC,EAAG,CAAA,CAAE,EAECI,GAAmBxB,EAAAA,YAAY,IAAM,CACzC,GAAI9B,EAAW,SAAWN,EAAsB,GAAKE,EAAuB,EAAG,CAC7E,MAAM8C,EAAiB1C,EAAW,QAAQ,YACpC2C,EAAkB3C,EAAW,QAAQ,aACrC4C,GAASF,EAAiBhD,EAC1BmD,GAASF,EAAkB/C,EAC3BkD,GAAU,KAAK,IAAIF,GAAQC,EAAM,EACvCzD,EAAQ,KAAK,IAAI,IAAM,KAAK,IAAI,GAAI0D,EAAO,CAAC,CAAC,CAC/C,MACE1D,EAAQ,CAAC,EAEXE,EAAY,CAAC,EACbS,EAAiBjM,GAAKA,EAAI,CAAC,CAC7B,EAAG,CAAC4L,EAAqBE,CAAoB,CAAC,EAExC2D,GAAqBzB,EAAAA,YAAY,IAAM,CAC3C1C,EAAQ,CAAC,EACTE,EAAY,CAAC,EACbS,EAAiBjM,GAAKA,EAAI,CAAC,CAC7B,EAAG,CAAA,CAAE,EAEC0P,GAAmB1B,cAAagB,GAAoB,CACxD1D,EAAQ0D,CAAO,CACjB,EAAG,CAAA,CAAE,EAECW,GAAc3B,EAAAA,YAAY,IAAM,CACpC1C,EAAQ,CAAC,EACTE,EAAY,CAAC,EACbS,EAAiBjM,GAAKA,EAAI,CAAC,CAC7B,EAAG,CAAA,CAAE,EAEC4P,GAAiB5B,EAAAA,YAAY,IAAM,CACvC,GAAI,CAACI,EAAa,OAClB,MAAMyB,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOzB,EAAY,IACxByB,EAAK,SAAWzB,EAAY,KAC5ByB,EAAK,MAAA,CACP,EAAG,CAACzB,CAAW,CAAC,EAEV0B,GAA0B9B,EAAAA,YAAY,CAAC+B,EAAiBC,IAAkB,CAC9EzD,EAAewD,CAAO,EACtBtD,EAAauD,CAAK,CACpB,EAAG,CAAA,CAAE,EAECC,GAA0BjC,EAAAA,YAAY,CAAC+B,EAAiBC,IAAkB,CAC9ElD,GAAeiD,CAAO,EACtB/C,GAAagD,CAAK,CACpB,EAAG,CAAA,CAAE,EAECE,GAAuBlC,cAAajH,GAAkC,CAC1EqG,GAAYrG,CAAK,CACnB,EAAG,CAAA,CAAE,EAEL,GAAI,CAACqH,EAAa,OAAO,KAEzB,MAAM+B,GAAkB3F,IAAS,SAAW,CAAC,CAACC,EAGxC2F,IAA8B,IAAM,SACxC,GAAI/B,GACF,QAAO7H,EAAA6H,GAAe,mBAAf,YAAA7H,EAAA,KAAA6H,GAAkCD,EAAaO,MAAc,CAAA,EAEtE,GAAI/E,IAAa,QACf,OAAO9D,GAAsB,CAC3B,KAAAuF,EACA,SAAU8D,GACV,UAAWE,GACX,aAAcG,GACd,eAAgBC,GAChB,aAAcF,GACd,cAAeD,GACf,QAASK,GACT,EAAA5P,CAAA,CACD,EAEH,GAAI6J,IAAa,MACf,OAAOvD,GAAoB,CACzB,KAAAgF,EACA,SAAU8D,GACV,UAAWE,GACX,QAASM,GACT,EAAA5P,CAAA,CACD,EAEH,GAAI6J,IAAa,OACf,OAAOtD,GAAqB,CAC1B,QAAA+F,EACA,QAASC,EACT,MAAOE,EACP,UAAWE,EACX,EAAA3M,CAAA,CACD,EAEH,GAAI6J,IAAa,OACf,OAAO/C,GAAqB,CAC1B,QAAA+F,EACA,QAASC,EACT,MAAOE,EACP,UAAWE,GACX,EAAAlN,CAAA,CACD,EAEH,GAAI6J,IAAa,MACf,OAAO9C,GAAoB,CAAE,MAAOqG,EAAY,CAAC,EAEnD,GAAIvD,IAAa,OAAQ,CACvB,MAAMyG,KAAMC,EAAAlC,EAAY,KAAK,MAAM,GAAG,EAAE,IAAA,IAA5B,YAAAkC,EAAmC,gBAAiB,GAChE,OAAOrJ,GAAqB,CAC1B,SAAUoG,EACV,aAAc,IAAMC,GAAgB8B,IAAQ,CAACA,EAAI,EACjD,OAAQiB,KAAQ,QAAUA,KAAQ,MAClC,YAAa9C,GACb,oBAAqB,IAAMC,GAAmB4B,IAAQ,CAACA,EAAI,EAC3D,EAAArP,CAAA,CACD,CACH,CACA,OAAI6J,IAAa,WACRtC,GAAyB,CAC9B,SAAUmG,GACV,iBAAkB,IAAMC,OAA4B0B,KAAS,UAAY,SAAW,SAAS,EAC7F,EAAArP,CAAA,CACD,EAEI,CAAA,CACT,GAAA,EAGMwQ,GAA+B,CACnC,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOvG,EAAAA,SAAA,CAAS,UAAU,iBAAA,CAAkB,EAAI,QAASjK,EAAE,iBAAiB,EAAG,OAAQ6P,EAAA,CAAe,CAC1H,EAEF,GAAIO,GAAkB,CAAC,CACrB,MAAO,CACL,CAAE,KAAM,SAAmB,WAAO5M,EAAAA,EAAA,CAAE,UAAU,iBAAA,CAAkB,EAAI,QAASxD,EAAE,cAAc,EAAG,OAAQ0K,CAAA,CAAS,CACnH,CACD,EAAI,CAAA,CAAC,EAGF+F,GAAqB,CAACtJ,EAAwBuJ,IAClDvJ,EAAO,IAAI,CAACwJ,GAAOC,GAAIC,KACrB9G,EAAAA,KAAC+G,EAAM,SAAN,CACE,SAAA,CAAAH,GAAM,MAAM,IAAI,CAACI,GAAMC,KACtBD,GAAK,OAAS,SACZ7L,EAAAA,IAAC+L,GAAA,CAEC,KAAMF,GAAK,KACX,MAAOA,GAAK,QACZ,QAASA,GAAK,OACd,SAAUA,GAAK,QAAA,EAJV,GAAGH,EAAE,IAAII,EAAE,EAAA,EAOlB9L,EAAAA,IAAC,OAAA,CAEC,UAAU,oFACV,MAAO,CAAE,SAAU6L,GAAK,UAAY,MAAA,EAEnC,SAAAA,GAAK,OAAA,EAJD,GAAGH,EAAE,IAAII,EAAE,EAAA,CAKlB,EAGHJ,GAAKC,GAAI,OAAS,SAAM,MAAA,CAAI,UAAW,kCAAkCH,CAAY,EAAA,CAAI,CAAA,CAAA,EApBvEE,EAqBrB,CACD,EAEH,OACE1L,EAAAA,IAACP,IAAe,OAAAC,EAAgB,SAAUgG,EAC1C,SAAA1F,EAAAA,IAACQ,GAAA,CAAc,MAAO2F,EACtB,SAAAtB,EAAAA,KAAC,MAAA,CACC,IAAKsC,EACL,SAAU5B,IAAS,QAAU,EAAI,GACjC,aAAYY,EACZ,UAAU,gGAGT,SAAA,CAAA,CAACR,GACFd,EAAAA,KAACmH,GAAAA,OAAO,IAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,EACpB,KAAM,CAAE,QAAS,CAAA,EACjB,UAAU,sGACV,MAAO,CAAE,WAAY,+BAAA,EAGrB,SAAA,CAAAnH,EAAAA,KAAC,MAAA,CAAI,UAAU,8FAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,wEACb,SAAA,CAAA7E,EAAAA,IAAC,KAAA,CAAG,UAAU,8EACX,SAAAmJ,EAAY,KACf,EACAtE,EAAAA,KAAC,OAAA,CAAK,UAAU,2DACb,SAAA,CAAAO,EAAe,EAAE,IAAE6D,GAAgB,MAAA,CAAA,CACtC,CAAA,EACF,QAGC,MAAA,CAAI,UAAU,sEACZ,SAAAsC,GAAmBD,GAAc,YAAY,EAChD,EAGAzG,EAAAA,KAAC,MAAA,CAAI,UAAU,sEACZ,SAAA,CAAA0G,GAAmBJ,GAAY,UAAU,EACzCA,GAAW,OAAS,GAAKnL,EAAAA,IAAC,MAAA,CAAI,UAAU,0CAA0C,EAClFuL,GAAmBD,GAAc,UAAU,CAAA,CAAA,CAC9C,CAAA,EACF,EAGCH,GAAW,OAAS,GACnBnL,EAAAA,IAAC,MAAA,CAAI,UAAU,2GACZ,SAAAuL,GAAmBJ,GAAY,YAAY,CAAA,CAC9C,CAAA,CAAA,CAAA,EAMJnL,EAAAA,IAAC,MAAA,CACC,IAAKiH,EACL,UAAU,4EACV,YAAa+B,GAEZ,SAAAI,GACCA,GAAe,OAAOD,EAAaO,EAAS,EAE5C7E,EAAAA,KAACoH,EAAAA,SAAA,CAAS,SAAUjM,EAAAA,IAACgF,GAAA,CAAA,CAAgB,EAClC,SAAA,CAAAL,IAAa,SACZ3E,EAAAA,IAACsC,GAAA,CACC,IAAK6G,EAAY,IACjB,KAAA/C,EACA,SAAAE,EACA,SAAUS,EACV,SAAUoC,EAAY,KACtB,aAAcsB,GACd,qBAAsB7D,EACtB,sBAAuBE,CAAA,CAAA,EAG1BnC,IAAa,OACZ3E,EAAAA,IAACyC,GAAA,CACC,IAAK0G,EAAY,IACjB,KAAA/C,EACA,YAAAI,EACA,aAAcC,EACd,mBAAoBC,EACpB,kBAAmBE,CAAA,CAAA,EAGtBjC,IAAa,QAAU3E,MAAC2C,GAAA,CAAa,IAAKwG,EAAY,IAAK,EAC3DxE,IAAa,QAAU3E,MAAC6C,GAAA,CAAa,IAAKsG,EAAY,IAAK,EAC3DxE,IAAa,QAAU3E,MAAC+C,GAAA,CAAa,IAAKoG,EAAY,IAAK,EAC3DxE,IAAa,OAAS3E,MAACiD,GAAA,CAAY,IAAKkG,EAAY,IAAK,EACzDxE,IAAa,QACZ3E,EAAAA,IAACmD,GAAA,CACC,IAAKiE,EACL,IAAK+B,EAAY,IACjB,gBAAiB0B,GACjB,kBAAmBnD,CAAA,CAAA,EAGtB/C,IAAa,QACZ3E,EAAAA,IAACqD,GAAA,CACC,IAAKsE,EACL,IAAKwB,EAAY,IACjB,gBAAiB6B,GACjB,kBAAmB/C,EAAA,CAAA,EAGtBtD,IAAa,SAAW3E,MAACuD,GAAA,CAAc,IAAK4F,EAAY,IAAK,EAC7DxE,IAAa,SACZ3E,MAACyD,GAAA,CAAc,IAAK0F,EAAY,IAAK,SAAUA,EAAY,IAAA,CAAM,EAElExE,IAAa,YAAc3E,EAAAA,IAAC2D,GAAA,CAAiB,IAAKwF,EAAY,IAAK,SAAUX,GAAkB,EAC/F7D,IAAa,QACZ3E,MAAC6D,GAAA,CAAa,IAAKsF,EAAY,IAAK,SAAUA,EAAY,IAAA,CAAM,EAEjExE,IAAa,OACZ3E,MAAC+D,GAAA,CAAY,IAAKoF,EAAY,IAAK,SAAUA,EAAY,IAAA,CAAM,EAEhExE,IAAa,OACZ3E,MAACiE,GAAA,CAAY,IAAKkF,EAAY,IAAK,SAAUA,EAAY,IAAA,CAAM,EAEhExE,IAAa,YACZ3E,MAACmE,GAAA,CAAiB,IAAKgF,EAAY,IAAK,SAAUA,EAAY,IAAA,CAAM,EAErExE,IAAa,QACZc,GAAmBR,GACjBjF,EAAAA,IAACyE,GAAA,CACC,SAAU0E,EAAY,KACtB,SAAUA,EAAY,KACtB,WAAYwB,EAAA,CAAA,QAGbtG,GAAA,CAAY,IAAK8E,EAAY,IAAK,cAAe8B,GAAsB,aAAcxF,CAAA,CAAiB,GAG1Gd,IAAa,QACZ3E,EAAAA,IAACuE,GAAA,CACC,IAAK4E,EAAY,IACjB,SAAUA,EAAY,KACtB,SAAUf,EACV,YAAaE,EAAA,CAAA,EAGhB3D,IAAa,eACZ3E,EAAAA,IAACyE,GAAA,CACC,SAAU0E,EAAY,KACtB,SAAUA,EAAY,KACtB,WAAYwB,EAAA,CAAA,CACd,CAAA,CAEJ,CAAA,CAAA,EAKH,CAAChF,GAAYsD,GAAgB,OAAS,GACrCpE,OAAAqH,EAAAA,SAAA,CACG,SAAA,CAAA9G,EAAe,GACdpF,EAAAA,IAACgM,GAAAA,OAAO,OAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAStD,GAAa,EAAI,EAAG,EAAGA,GAAa,EAAI,GAAA,EAC5D,WAAY,CAAE,SAAU,EAAA,EACxB,QAAS,IAAMrD,GAAA,YAAAA,EAAaD,EAAe,GAC3C,aAAc,IAAMuD,GAAc,EAAI,EACtC,MAAO,CAAE,cAAeD,GAAa,OAAS,MAAA,EAC9C,UAAU,qVAEV,SAAA1I,EAAAA,IAACwB,EAAAA,YAAA,CAAY,UAAU,uCAAA,CAAwC,CAAA,CAAA,EAIlE4D,EAAe6D,GAAgB,OAAS,GACvCjJ,EAAAA,IAACgM,GAAAA,OAAO,OAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAStD,GAAa,EAAI,EAAG,EAAGA,GAAa,EAAI,EAAA,EAC5D,WAAY,CAAE,SAAU,EAAA,EACxB,QAAS,IAAMrD,GAAA,YAAAA,EAAaD,EAAe,GAC3C,aAAc,IAAMuD,GAAc,EAAI,EACtC,MAAO,CAAE,cAAeD,GAAa,OAAS,MAAA,EAC9C,UAAU,uVAEV,SAAA1I,EAAAA,IAACyB,EAAAA,aAAA,CAAa,UAAU,uCAAA,CAAwC,CAAA,CAAA,CAClE,CAAA,CAEJ,CAAA,CAAA,CAAA,EAGJ,CAAA,CACA,CAEJ,EAUMsK,GAA8C,CAAC,CAAE,KAAAI,EAAM,MAAAC,EAAO,QAAAC,EAAS,SAAAC,KAEzEzH,EAAAA,KAAC,SAAA,CACC,QAAAwH,EACA,SAAAC,EACA,UAAW,iGACTA,EACI,8CACA,oEACN,GAEC,SAAA,CAAAH,EACDtH,EAAAA,KAAC,OAAA,CAAK,UAAU,wUACd,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,UAAU,2GAAA,CAA4G,EAC5HA,EAAAA,IAAC,OAAA,CAAK,UAAU,eAAgB,SAAAoM,CAAA,CAAM,CAAA,CAAA,CACxC,CAAA,CAAA,CAAA,sHCjmBOG,GAAoD,CAAC,CAChE,MAAApH,EACA,aAAAC,EACA,OAAAoH,EACA,QAAAhH,EACA,WAAAH,EACA,gBAAAC,EAAkB,CAAA,EAClB,OAAA5F,EACA,SAAAC,EACA,SAAAgG,EACA,MAAAlF,EAAQ,OACR,cAAAmF,CACF,IAAM,CACJ,KAAM,CAACC,EAAYC,CAAa,EAAIC,EAAAA,SAAS,IAC3C,OAAO,OAAW,IACd,OAAO,WAAW,8BAA8B,EAAE,QAClD,EAAA,EAGNC,EAAAA,UAAU,IAAM,CACd,GAAIvF,IAAU,OAAQ,OACtB,MAAMwF,EAAM,OAAO,WAAW,8BAA8B,EACtDC,EAAWtL,GAA2BkL,EAAclL,EAAE,OAAO,EACnE,OAAAqL,EAAI,iBAAiB,SAAUC,CAAO,EAC/B,IAAMD,EAAI,oBAAoB,SAAUC,CAAO,CACxD,EAAG,CAACzF,CAAK,CAAC,EAEV,MAAM0F,EAAgB1F,IAAU,OAAUoF,EAAa,OAAS,QAAWpF,EAsB3E,GAnBAuF,EAAAA,UAAU,IAAM,CACd,GAAIwG,EAAQ,CACV,MAAMC,EAAmB,SAAS,KAAK,MAAM,SACvCC,EAAuB,SAAS,KAAK,MAAM,aAE3CC,EAAiB,OAAO,WAAa,SAAS,gBAAgB,YAEpE,gBAAS,KAAK,MAAM,SAAW,SAC3BA,EAAiB,IACnB,SAAS,KAAK,MAAM,aAAe,GAAGA,CAAc,MAG/C,IAAM,CACX,SAAS,KAAK,MAAM,SAAWF,EAC/B,SAAS,KAAK,MAAM,aAAeC,CACrC,CACF,CACF,EAAG,CAACF,CAAM,CAAC,EAEP,CAACA,EAAQ,OAAO,KAEpB,MAAMI,QACH,MAAA,CAAI,UAAU,WAAW,aAAYzG,EACpC,SAAAnG,EAAAA,IAAC6M,GAAAA,gBAAA,CACE,SAAAL,GACCxM,EAAAA,IAACgM,GAAAA,OAAO,IAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,EACpB,KAAM,CAAE,QAAS,CAAA,EACjB,UAAU,kJACV,QAASxG,EACT,QAAU5K,GAAMA,EAAE,gBAAA,EAElB,SAAAoF,EAAAA,IAAC,MAAA,CACC,UAAU,qCACV,QAAUpF,GAAMA,EAAE,gBAAA,EAElB,SAAAoF,EAAAA,IAACkF,GAAA,CACC,KAAK,QACL,MAAAC,EACA,aAAAC,EACA,QAAAI,EACA,WAAAH,EACA,gBAAAC,EACA,OAAA5F,EACA,SAAAC,EACA,SAAAgG,EACA,MAAAlF,EACA,cAAAmF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EAGN,CAAA,CACF,EAGF,OAAOkH,gBAAaF,EAAc,SAAS,IAAI,CACjD,ECtFaG,GAAoD,CAAC,CAChE,MAAA5H,EACA,aAAAC,EAAe,EACf,WAAAC,EACA,gBAAAC,EAAkB,CAAA,EAClB,MAAA0H,EAAQ,OACR,OAAAC,EAAS,OACT,UAAArM,EACA,MAAAsM,EACA,OAAAxN,EACA,SAAAC,EACA,SAAAgG,EACA,MAAAlF,EAAQ,OACR,cAAAmF,CACF,IAAM,CACJ,KAAM,CAACC,EAAYC,CAAa,EAAIC,EAAAA,SAAS,IAC3C,OAAO,OAAW,IACd,OAAO,WAAW,8BAA8B,EAAE,QAClD,EAAA,EAGNC,EAAAA,UAAU,IAAM,CACd,GAAIvF,IAAU,OAAQ,OACtB,MAAMwF,EAAM,OAAO,WAAW,8BAA8B,EACtDC,EAAWtL,GAA2BkL,EAAclL,EAAE,OAAO,EACnE,OAAAqL,EAAI,iBAAiB,SAAUC,CAAO,EAC/B,IAAMD,EAAI,oBAAoB,SAAUC,CAAO,CACxD,EAAG,CAACzF,CAAK,CAAC,EAEV,MAAM0F,EAAgB1F,IAAU,OAAUoF,EAAa,OAAS,QAAWpF,EAE3E,OACET,EAAAA,IAAC,MAAA,CACC,UAAW,YAAYY,GAAa,EAAE,GACtC,MAAO,CAAE,MAAAoM,EAAO,OAAAC,EAAQ,GAAGC,CAAA,EAC3B,aAAY/G,EAEZ,SAAAnG,EAAAA,IAAC,MAAA,CAAI,UAAU,gFACb,SAAAA,EAAAA,IAACkF,GAAA,CACC,KAAK,QACL,MAAAC,EACA,aAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,OAAA5F,EACA,SAAAC,EACA,SAAAgG,EACA,MAAAlF,EACA,cAAAmF,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAGN,ECrCO,SAASuH,GAAeC,EAA4B,CACzD,GAAI,OAAO,OAAW,IAAa,OAEnC,KAAM,CACJ,UAAAC,EAAY,gCAAgCC,SAAM,OAAO,4BACzD,QAAAC,EAAU,gCAAgCD,SAAM,OAAO,UACvD,WAAAE,EAAa,EAAA,EACXJ,GAAW,CAAA,EAEfE,SAAM,oBAAoB,UAAYD,EAEtCC,SAAM,oBAAoB,QAAUC,EAEpCD,SAAM,oBAAoB,WAAaE,CACzC,CAGAL,GAAA,ECtDO,MAAMM,GAAUC,GAAY,QCQtBpL,GAA8C,CAAC,CAC1D,IAAAqL,EACA,KAAAvH,EACA,SAAAE,EACA,SAAAsH,EACA,SAAAC,EACA,aAAAC,EACA,qBAAAC,EACA,sBAAAC,CACF,IAAM,CACJ,MAAMlT,EAAIqF,EAAA,EACJ,CAAC8N,EAAQC,CAAS,EAAInI,EAAAA,SAAS,EAAK,EACpC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAACsI,EAAUC,CAAW,EAAIvI,EAAAA,SAAS,CAAE,EAAG,EAAG,EAAG,EAAG,EACjD,CAACwI,EAAYC,CAAa,EAAIzI,EAAAA,SAAS,EAAK,EAC5C,CAAC0I,EAAWC,CAAY,EAAI3I,EAAAA,SAAS,CAAE,EAAG,EAAG,EAAG,EAAG,EACnD,CAAC4I,EAAcC,CAAe,EAAI7I,EAAAA,SAAS,CAAC,EAC5C,CAAC8I,EAAaC,CAAc,EAAI/I,EAAAA,SAAS,CAAE,MAAO,EAAG,OAAQ,EAAG,EAChEgJ,EAAS7H,EAAAA,OAAyB,IAAI,EACtC8H,EAAe9H,EAAAA,OAAuB,IAAI,EAEhDlB,EAAAA,UAAU,IAAM,CACdkI,EAAU,EAAK,EACfE,EAAS,IAAI,EACbE,EAAY,CAAE,EAAG,EAAG,EAAG,EAAG,EAC1BM,EAAgB,CAAC,CACnB,EAAG,CAACjB,CAAG,CAAC,EAGR3H,EAAAA,UAAU,IAAM,CACd4I,EAAgBxI,CAAI,CACtB,EAAG,CAACA,CAAI,CAAC,EAGTJ,EAAAA,UAAU,IAAM,CACV4H,IAAa,QACfU,EAAY,CAAE,EAAG,EAAG,EAAG,EAAG,CAE9B,EAAG,CAACV,CAAQ,CAAC,EAEb,MAAMqB,EAAcrU,GAA8C,CAChEsT,EAAU,EAAI,EACd,MAAMgB,EAAMtU,EAAE,cACdkU,EAAe,CAAE,MAAOI,EAAI,aAAc,OAAQA,EAAI,cAAe,EACrEnB,GAAA,MAAAA,EAAuBmB,EAAI,cAC3BlB,GAAA,MAAAA,EAAwBkB,EAAI,cAC9B,EAGMC,EAAgBpG,EAAAA,YAAY,CAACqG,EAA+BC,IAAwB,CACxF,MAAMC,EAAYN,EAAa,QAC/B,GAAI,CAACM,GAAaT,EAAY,QAAU,EAAG,OAAOO,EAElD,MAAMG,EAAaD,EAAU,YACvBE,EAAaF,EAAU,aACvBG,EAAOZ,EAAY,MAAQQ,EAC3BK,EAAOb,EAAY,OAASQ,EAG5BM,EAAS,KAAK,IAAI,GAAIJ,EAAa,IAAMC,EAAa,GAAI,EAC1DI,IAAUL,EAAaE,GAAQ,EAAIE,EACnCE,GAAUL,EAAaE,GAAQ,EAAIC,EAEzC,MAAO,CACL,EAAGC,GAAS,EAAI,KAAK,IAAI,CAACA,GAAQ,KAAK,IAAIA,GAAQR,EAAI,CAAC,CAAC,EAAI,EAC7D,EAAGS,EAAS,EAAI,KAAK,IAAI,CAACA,EAAQ,KAAK,IAAIA,EAAQT,EAAI,CAAC,CAAC,EAAI,CAAA,CAEjE,EAAG,CAACP,CAAW,CAAC,EAEViB,EAAc,IAAM,CACxB1B,EAAStT,EAAE,mBAAmB,CAAC,EAC/BoT,EAAU,EAAI,CAChB,EAGM6B,EAAoB,IAAM,CAC9BzB,EAAY,CAAE,EAAG,EAAG,EAAG,EAAG,EAC1BM,EAAgB,CAAC,EACjBd,GAAA,MAAAA,EAAe,EACjB,EAKA9H,EAAAA,UAAU,IAAM,CACd,MAAMsJ,EAAYN,EAAa,QAC/B,GAAI,CAACM,EAAW,OAEhB,MAAMU,EAAqBpV,GAAkB,CAC3CA,EAAE,eAAA,EACFA,EAAE,gBAAA,EAEF,MAAMqV,EAAOX,EAAU,sBAAA,EACjBY,EAAStV,EAAE,QAAUqV,EAAK,KAAOA,EAAK,MAAQ,EAC9CE,EAASvV,EAAE,QAAUqV,EAAK,IAAMA,EAAK,OAAS,EAE9CG,EAAQxV,EAAE,OAAS,EAAI,KAAQ,IAErCgU,EAAgBzE,GAAQ,CACtB,MAAMJ,GAAU,KAAK,IAAI,IAAM,KAAK,IAAI,GAAII,EAAOiG,CAAK,CAAC,EACnDC,EAAQtG,GAAUI,EAExB,OAAAmE,MAAmBa,EAAc,CAC/B,EAAGe,EAASG,GAASH,EAASd,GAAI,GAClC,EAAGe,EAASE,GAASF,EAASf,GAAI,EAAA,EACjCrF,EAAO,CAAC,EAEX+D,GAAA,MAAAA,EAAe/D,IACRA,EACT,CAAC,CACH,EAEA,OAAAuF,EAAU,iBAAiB,QAASU,EAAmB,CAAE,QAAS,GAAO,EAClE,IAAMV,EAAU,oBAAoB,QAASU,CAAiB,CACvE,EAAG,CAAClC,EAAcqB,CAAa,CAAC,EAEhC,MAAMmB,EAAkBvH,cAAanO,GAAwB,CACvDA,EAAE,SAAW,IACjB4T,EAAc,EAAI,EAClBE,EAAa,CACX,EAAG9T,EAAE,QAAUyT,EAAS,EACxB,EAAGzT,EAAE,QAAUyT,EAAS,CAAA,CACzB,EACH,EAAG,CAACA,CAAQ,CAAC,EAEPrF,EAAkBD,cAAanO,GAAwB,CACtD2T,GACLD,EAAYa,EAAc,CACxB,EAAGvU,EAAE,QAAU6T,EAAU,EACzB,EAAG7T,EAAE,QAAU6T,EAAU,CAAA,EACxBE,CAAY,CAAC,CAClB,EAAG,CAACJ,EAAYE,EAAWE,EAAcQ,CAAa,CAAC,EAEjDoB,EAAgBxH,EAAAA,YAAY,IAAM,CACtCyF,EAAc,EAAK,CACrB,EAAG,CAAA,CAAE,EAEL,OACE3J,EAAAA,KAAC,MAAA,CACC,IAAKmK,EACL,UAAU,sGACV,YAAasB,EACb,YAAatH,EACb,UAAWuH,EACX,aAAcA,EACd,MAAO,CAAE,OAAQhC,EAAa,WAAa,MAAA,EAE1C,SAAA,CAAA,CAACN,GAAU,CAACE,GACXnO,EAAAA,IAAC,MAAA,CAAI,UAAU,+CACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAGDmO,GACCnO,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,CAAA,CACpC,EAGFnO,EAAAA,IAACgM,GAAAA,OAAO,IAAP,CACC,IAAK+C,EACL,IAAKpB,EACL,IAAI,UACJ,UAAW,kCAAmCM,EAAwB,GAAf,YAAiB,GACxE,MAAO,CACL,UAAW,aAAaI,EAAS,CAAC,OAAOA,EAAS,CAAC,aAAaM,CAAY,YAAYrI,CAAQ,OAChG,gBAAiB,SACjB,WAAYiI,EAAa,OAAS,yBAAA,EAEpC,OAAQU,EACR,QAASa,EACT,cAAeC,EACf,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS9B,EAAS,EAAI,CAAA,EACjC,WAAY,CAAE,SAAU,EAAA,EACxB,UAAW,EAAA,CAAA,EAIZA,GAAU,CAACE,GAASU,EAAY,MAAQ,GACvChK,EAAAA,KAAC,MAAA,CAAI,UAAU,0LACZ,SAAA,CAAAgK,EAAY,MAAM,MAAIA,EAAY,OAAQhB,GAAY,MAAQ,MAAMA,EAAW,KAAO,GAAGA,CAAQ,KAAOA,EAAW,KAAO,KAAO,IAAIA,EAAW,MAAM,QAAQ,CAAC,CAAC,MAAQ,IAAIA,GAAY,KAAO,OAAO,QAAQ,CAAC,CAAC,KAAK,EAAA,CAAA,CACxN,CAAA,CAAA,CAAA,CAIR,iHCzLapL,GAA0C,CAAC,CACtD,IAAAkL,EACA,KAAAvH,EACA,YAAAI,EACA,aAAAgK,EACA,mBAAAC,EACA,kBAAAC,CACF,IAAM,CACJ,MAAM5V,EAAIqF,EAAA,EACJ,CAACwQ,EAAUC,CAAW,EAAI7K,EAAAA,SAAiB,CAAC,EAC5C,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChDiJ,EAAe9H,EAAAA,OAAuB,IAAI,EAC1C2J,EAAW3J,EAAAA,OAAoC,IAAI,GAAK,EAE9DlB,EAAAA,UAAU,IAAM,CACdoI,EAAS,IAAI,CACf,EAAG,CAACT,CAAG,CAAC,EAER,MAAMmD,EAAwB,CAAC,CAAE,SAAAH,KAAqC,CACpEC,EAAYD,CAAQ,EACpBF,EAAmBE,CAAQ,EAC3BH,EAAa,CAAC,CAChB,EAEMO,EAAuB5C,GAAiB,CAC5C,QAAQ,MAAM,YAAaA,CAAK,EAChCC,EAAStT,EAAE,iBAAiB,CAAC,CAC/B,EAGMkW,EAAejI,EAAAA,YAAY,IAAM,CACrC,GAAI,CAACiG,EAAa,QAAS,OAE3B,MAAMM,EAAYN,EAAa,QACzBiC,EAAY3B,EAAU,UACtB1F,EAAkB0F,EAAU,aAC5B4B,EAAeD,EAAYrH,EAAkB,EAGnD,IAAIuH,EAAqB,EACrBC,EAAc,IAElBP,EAAS,QAAQ,QAAQ,CAACQ,EAAaC,IAAe,CACpD,MAAMrB,EAAOoB,EAAY,sBAAA,EACnBE,EAAgBjC,EAAU,sBAAA,EAC1BkC,EAAavB,EAAK,IAAMsB,EAAc,IAAMtB,EAAK,OAAS,EAAIgB,EAC9DQ,EAAW,KAAK,IAAID,EAAaN,CAAY,EAE/CO,EAAWL,IACbA,EAAcK,EACdN,EAAqBG,EAEzB,CAAC,EAEGH,IAAuB3K,GACzBgK,EAAaW,CAAkB,CAEnC,EAAG,CAAC3K,EAAagK,CAAY,CAAC,EAG9BxK,EAAAA,UAAU,IAAM,CACd,MAAMsJ,EAAYN,EAAa,QAC/B,GAAKM,EAEL,OAAAA,EAAU,iBAAiB,SAAU0B,CAAY,EAC1C,IAAM1B,EAAU,oBAAoB,SAAU0B,CAAY,CACnE,EAAG,CAACA,CAAY,CAAC,EAGjB,MAAMU,EAAa3I,EAAAA,YAAY,CAACuI,EAAoBK,IAAmC,CACjFA,EACFd,EAAS,QAAQ,IAAIS,EAAYK,CAAO,EAExCd,EAAS,QAAQ,OAAOS,CAAU,CAEtC,EAAG,CAAA,CAAE,EAEL,OACEzM,EAAAA,KAAC,MAAA,CACC,IAAKmK,EACL,UAAU,2HAET,SAAA,CAAAb,GACCnO,EAAAA,IAAC,OAAI,UAAU,wCACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,CAAA,CACpC,EAGD,CAACA,GACAnO,EAAAA,IAAC4R,GAAAA,SAAA,CACC,KAAMjE,EACN,cAAemD,EACf,YAAaC,EACb,cACG,MAAA,CAAI,UAAU,gEACb,SAAA/Q,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAGF,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACZ,SAAA,MAAM,KAAK,IAAI,MAAM2Q,CAAQ,EAAG,CAAClT,EAAG+G,IAAU,CAC7C,MAAM8M,EAAa9M,EAAQ,EAC3B,OACEK,EAAAA,KAAC,MAAA,CAEC,IAAMoF,GAAOyH,EAAWJ,EAAYrH,CAAE,EACtC,UAAU,eAEV,SAAA,CAAAjK,EAAAA,IAAC6R,GAAAA,KAAA,CACC,WAAAP,EACA,MAAOlL,EACP,cACG,MAAA,CAAI,UAAU,yGACb,SAAApG,EAAAA,IAAC,MAAA,CAAI,UAAU,iHAAA,CAAkH,CAAA,CACnI,EAEF,gBAAiB,GACjB,sBAAuB,GACvB,UAAU,iBACV,gBAAkB8R,GAAS,CACrBR,IAAe,GAAKZ,GAEtBA,EAAkBoB,EAAK,eAAiBA,EAAK,MAAQ1L,CAAI,CAE7D,CAAA,CAAA,EAGFpG,EAAAA,IAAC,MAAA,CAAI,UAAU,sJACZ,SAAAsR,CAAA,CACH,CAAA,CAAA,EAzBK,QAAQA,CAAU,EAAA,CA4B7B,CAAC,CAAA,CACH,CAAA,CAAA,EAKHX,EAAW,GACV9L,OAAC,MAAA,CAAI,UAAU,sRAAsR,SAAA,CAAA,KAChS2B,EAAY,UAAQmK,EAAS,IAAA,CAAA,CAClC,CAAA,CAAA,CAAA,CAIR,+GCxJMoB,GAAc,KACdC,GAAiB,GACjBC,GAAiB,GACjBC,GAAsBH,GAAcC,GAAiB,EACrDG,GAAW,GAEXC,GAAoC,CACxC,WAAY,uCACZ,WAAY,MACZ,MAAO,MACT,EAEazP,GAA4C,CAAC,CAAE,IAAAgL,KAAU,CACpE,MAAM7S,EAAIqF,EAAA,EACJ,CAACkS,EAAMC,CAAO,EAAIvM,EAAAA,SAAiB,EAAE,EACrC,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAAC0M,EAAOC,CAAQ,EAAI3M,EAAAA,SAAmB,CAAA,CAAE,EACzC4M,EAAazL,EAAAA,OAAuB,IAAI,EAE9ClB,EAAAA,UAAU,IAAM,EACG,SAAY,CAC3BwM,EAAW,EAAI,EACfpE,EAAS,IAAI,EACbkE,EAAQ,EAAE,EAEV,GAAI,CACF,MAAMM,EAAW,MAAM,MAAMjF,CAAG,EAChC,GAAI,CAACiF,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQ,EAG1B,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAC7BE,EAAS,MAAMC,GAAQ,cAAc,CAAE,YAAAF,EAAa,EAC1DP,EAAQQ,EAAO,KAAK,CACtB,OAASE,EAAK,CACZ,QAAQ,MAAM,aAAcA,CAAG,EAC/B5E,EAAStT,EAAE,mBAAmB,CAAC,CACjC,QAAA,CACE0X,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC7E,CAAG,CAAC,EAER,MAAMsF,EAAWlK,EAAAA,YAAY,IAAM,CACjC,MAAMuG,EAAYqD,EAAW,QAC7B,GAAI,CAACrD,GAAa,CAAC+C,EAAM,OAEzB,MAAMzS,EAAW,MAAM,KAAK0P,EAAU,QAAQ,EAC9C,GAAI1P,EAAS,SAAW,EAAG,CACzB8S,EAAS,CAACL,CAAI,CAAC,EACf,MACF,CAEA,MAAMS,EAAqB,CAAC,EAAE,EAC9B,IAAII,EAAkB,EAEtB,UAAWC,KAASvT,EAAU,CAC5B,MAAM1C,EAAIiW,EAAM,aAIZD,EAAkB,GAAKA,EAAkBhW,EAAIgV,KAC/CY,EAAO,KAAK,EAAE,EACdI,EAAkB,GAGpBJ,EAAOA,EAAO,OAAS,CAAC,EAAE,KAAKK,EAAM,SAAS,EAC9CD,GAAmBhW,CACrB,CAGI4V,EAAO,SAAW,GAAGA,EAAO,KAAK,CAAA,CAAE,EAEvCJ,EAASI,EAAO,IAAIM,GAAUA,EAAO,KAAK,EAAE,CAAC,CAAC,CAChD,EAAG,CAACf,CAAI,CAAC,EAST,OAPArM,EAAAA,UAAU,IAAM,CACV,CAACqM,GAAQ,CAACM,EAAW,SACzB,sBAAsB,IAAM,CAC1BM,EAAA,CACF,CAAC,CACH,EAAG,CAACZ,EAAMY,CAAQ,CAAC,EAEfV,EAEAvS,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIAmO,EAEAnO,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,EACpC,EACF,EAKFtJ,EAAAA,KAAC,MAAA,CACC,UAAU,0CACV,MAAO,CAAE,WAAY,qBAAA,EAGrB,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CACC,IAAK2S,EACL,wBAAyB,CAAE,OAAQN,CAAA,EACnC,MAAO,CACL,GAAGD,GACH,SAAU,WACV,WAAY,SACZ,MAAO,GAAG,IAAMH,GAAiB,CAAC,KAClC,cAAe,MAAA,CACjB,CAAA,EAIFjS,EAAAA,IAAC,MAAA,CACC,UAAU,+DACV,MAAO,CAAE,IAAK,GAAGmS,EAAQ,IAAA,EAEvB,UAAAM,EAAM,OAAS,EAAIA,EAAQ,CAAC,EAAE,GAAG,IAAI,CAACY,EAAU3X,IAChDsE,EAAAA,IAAC,MAAA,CAEC,MAAO,CACL,MAAO,OACP,SAAU,QACV,UAAW,GAAG+R,EAAW,KACzB,WAAY,QACZ,UAAW,iCACX,WAAY,EACZ,QAAS,GAAGC,EAAc,MAAMC,EAAc,IAAA,EAGhD,SAAAjS,EAAAA,IAAC,MAAA,CACC,wBAAyB,CAAE,OAAQqT,CAAA,EACnC,MAAOjB,EAAA,CAAA,CACT,EAdK1W,CAAA,CAgBR,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,gHC5JA,MAAM4X,EAAQ,CACZ,YAAYC,EAAK3S,EAAY,GAAI,CAC3B,OAAO2S,GAAQ,UACjB,KAAK,GAAK,SAAS,cAAcA,CAAG,EACpC,KAAK,GAAG,UAAY3S,GAEpB,KAAK,GAAK2S,EAEZ,KAAK,KAAO,CAAA,CACd,CAEA,KAAKC,EAAK3T,EAAO,CACf,OAAIA,IAAU,QACZ,KAAK,KAAK2T,CAAG,EAAI3T,EACV,MAEF,KAAK,KAAK2T,CAAG,CACtB,CAEA,GAAGC,EAAYvN,EAAS,CACtB,KAAM,CAACwN,EAAK,GAAGC,CAAG,EAAIF,EAAW,MAAM,GAAG,EAC1C,IAAIG,EAAYF,EAChB,OAAIE,IAAc,cAAgB,WAAW,KAAK,OAAO,UAAU,SAAS,IAC1EA,EAAY,kBAEd,KAAK,GAAG,iBAAiBA,EAAYC,GAAQ,CAC3C3N,EAAQ2N,CAAG,EACX,QAASnY,EAAI,EAAGA,EAAIiY,EAAI,OAAQjY,GAAK,EAAG,CACtC,MAAMX,EAAI4Y,EAAIjY,CAAC,EAIf,GAHIX,IAAM,QAAU8Y,EAAI,SAAW,GAG/B9Y,IAAM,SAAW8Y,EAAI,SAAW,EAClC,OAEE9Y,IAAM,QACR8Y,EAAI,gBAAe,CAEvB,CACF,CAAC,EACM,IACT,CAEA,OAAOhU,EAAO,CACZ,GAAIA,IAAU,OACZ,cAAO,KAAKA,CAAK,EAAE,QAAS9E,GAAM,CAChC,KAAK,IAAIA,EAAG,GAAG8E,EAAM9E,CAAC,CAAC,IAAI,CAC7B,CAAC,EACM,KAET,KAAM,CACJ,UAAA+Y,EAAW,WAAAC,EAAY,aAAAC,EAAc,YAAAC,CAC3C,EAAQ,KAAK,GACT,MAAO,CACL,IAAKH,EACL,KAAMC,EACN,OAAQC,EACR,MAAOC,CACb,CACE,CAEA,OAAO1W,EAAG,CACR,KAAM,CAAE,GAAA0M,CAAE,EAAK,KACf,OAAI1M,IAAM,SACJA,EAAE,OAAS,SACb0M,EAAG,WAAa1M,EAAE,MAEhBA,EAAE,MAAQ,SACZ0M,EAAG,UAAY1M,EAAE,MAGd,CAAE,KAAM0M,EAAG,WAAY,IAAKA,EAAG,SAAS,CACjD,CAEA,KAAM,CACJ,OAAO,KAAK,GAAG,sBAAqB,CACtC,CAEA,QAAS,CACP,OAAO,IAAIqJ,GAAQ,KAAK,GAAG,UAAU,CACvC,CAEA,YAAYY,EAAM,CAChB,OAAI,UAAU,SAAW,EAChB,KAAK,GAAG,YAEjBA,EAAK,QAAQC,GAAO,KAAK,MAAMA,CAAG,CAAC,EAC5B,KACT,CAEA,YAAYlK,EAAI,CACd,KAAK,GAAG,YAAYA,CAAE,CACxB,CAkCA,MAAMmK,EAAK,CACT,IAAID,EAAMC,EACV,OAAI,OAAOA,GAAQ,SACjBD,EAAM,SAAS,eAAeC,CAAG,EACxBA,aAAed,KACxBa,EAAMC,EAAI,IAEZ,KAAK,GAAG,YAAYD,CAAG,EAChB,IACT,CAEA,SAASA,EAAK,CACZ,OAAO,KAAK,GAAG,SAASA,CAAG,CAC7B,CAEA,UAAU5W,EAAG,CACX,OAAIA,IAAM,QACR,KAAK,GAAG,UAAYA,EACb,MAEF,KAAK,GAAG,SACjB,CAEA,SAASiM,EAAM,CACb,YAAK,GAAG,UAAU,IAAIA,CAAI,EACnB,IACT,CAEA,SAASA,EAAM,CACb,OAAO,KAAK,GAAG,UAAU,SAASA,CAAI,CACxC,CAEA,YAAYA,EAAM,CAChB,YAAK,GAAG,UAAU,OAAOA,CAAI,EACtB,IACT,CAEA,OAAO6K,EAAM,SAAU,CACrB,OAAO,KAAK,YAAYA,CAAG,CAC7B,CAEA,YAAY7K,EAAM,CAChB,OAAO,KAAK,GAAG,UAAU,OAAOA,CAAI,CACtC,CAEA,OAAO8K,EAAO,GAAMD,EAAM,SAAU,CAClC,OAAIC,EAAM,KAAK,SAASD,CAAG,EACtB,KAAK,YAAYA,CAAG,EAClB,IACT,CAEA,QAAQC,EAAO,GAAM,CACnB,YAAK,OAAOA,EAAM,SAAS,EACpB,IACT,CAEA,SAASA,EAAO,GAAM,CACpB,OAAIA,EAAM,KAAK,SAAS,UAAU,EAC7B,KAAK,YAAY,UAAU,EACzB,IACT,CAKA,KAAKd,EAAK3T,EAAO,CACf,GAAIA,IAAU,OACZ,KAAK,GAAG,aAAa2T,EAAK3T,CAAK,MAC1B,CACL,GAAI,OAAO2T,GAAQ,SACjB,OAAO,KAAK,GAAG,aAAaA,CAAG,EAEjC,OAAO,KAAKA,CAAG,EAAE,QAASzY,GAAM,CAC9B,KAAK,GAAG,aAAaA,EAAGyY,EAAIzY,CAAC,CAAC,CAChC,CAAC,CACH,CACA,OAAO,IACT,CAEA,WAAWyY,EAAK,CACd,YAAK,GAAG,gBAAgBA,CAAG,EACpB,IACT,CAEA,KAAKe,EAAS,CACZ,OAAIA,IAAY,QACd,KAAK,GAAG,UAAYA,EACb,MAEF,KAAK,GAAG,SACjB,CAEA,IAAIhX,EAAG,CACL,OAAIA,IAAM,QACR,KAAK,GAAG,MAAQA,EACT,MAEF,KAAK,GAAG,KACjB,CAEA,OAAQ,CACN,KAAK,GAAG,MAAK,CACf,CAEA,iBAAiBiX,EAAM,CACrB,OAAAA,EAAK,QAAQzZ,GAAK,KAAK,GAAG,MAAM,eAAeA,CAAC,CAAC,EAC1C,IACT,CAKA,IAAIyO,EAAM3J,EAAO,CACf,OAAIA,IAAU,QAAa,OAAO2J,GAAS,UACzC,OAAO,KAAKA,CAAI,EAAE,QAASzO,GAAM,CAC/B,KAAK,GAAG,MAAMA,CAAC,EAAIyO,EAAKzO,CAAC,CAC3B,CAAC,EACM,MAEL8E,IAAU,QACZ,KAAK,GAAG,MAAM2J,CAAI,EAAI3J,EACf,MAEF,KAAK,GAAG,MAAM2J,CAAI,CAC3B,CAEA,eAAgB,CACd,OAAO,OAAO,iBAAiB,KAAK,GAAI,IAAI,CAC9C,CAEA,MAAO,CACL,YAAK,IAAI,UAAW,OAAO,EACpB,IACT,CAEA,MAAO,CACL,YAAK,IAAI,UAAW,MAAM,EACnB,IACT,CACF,CAEA,MAAMtM,EAAI,CAACqW,EAAK3S,EAAY,KAAO,IAAI0S,GAAQC,EAAK3S,CAAS,EC3QvD6T,GAAY,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAS5I,SAASC,GAASlQ,EAAO,CAC9B,IAAImQ,EAAM,GACNC,EAASpQ,EACb,KAAOoQ,GAAUH,GAAU,QACzBG,GAAUH,GAAU,OACpBG,GAAU,EACVD,GAAOF,GAAU,SAASG,EAAQ,EAAE,EAAIH,GAAU,MAAM,EAE1D,MAAMI,EAAOrQ,EAAQiQ,GAAU,OAC/B,OAAAE,GAAOF,GAAUI,CAAI,EACdF,CACT,CAQO,SAASG,GAAQH,EAAK,CAC3B,IAAII,EAAM,EACV,QAASrZ,EAAI,EAAGA,EAAIiZ,EAAI,OAAS,EAAGjZ,GAAK,EAAG,CAC1C,MAAMkZ,EAASD,EAAI,WAAWjZ,CAAC,EAAI,GAC7BsZ,EAAUL,EAAI,OAAS,EAAIjZ,EACjCqZ,GAAQN,GAAU,QAAUO,EAAYP,GAAU,OAASG,CAC7D,CACA,OAAAG,GAAOJ,EAAI,WAAWA,EAAI,OAAS,CAAC,EAAI,GACjCI,CACT,CASO,SAASE,GAAQC,EAAK,CAC3B,IAAI/X,EAAI,GACJK,EAAI,GACR,QAAS9B,EAAI,EAAGA,EAAIwZ,EAAI,OAAQxZ,GAAK,EAC/BwZ,EAAI,OAAOxZ,CAAC,GAAK,KAAOwZ,EAAI,OAAOxZ,CAAC,GAAK,IAC3C8B,GAAK0X,EAAI,OAAOxZ,CAAC,EAEjByB,GAAK+X,EAAI,OAAOxZ,CAAC,EAGrB,MAAO,CAACoZ,GAAQ3X,CAAC,EAAG,SAASK,EAAG,EAAE,EAAI,CAAC,CACzC,CAUO,SAAS2X,GAAQhY,EAAGK,EAAG,CAC5B,MAAO,GAAGkX,GAASvX,CAAC,CAAC,GAAGK,EAAI,CAAC,EAC/B,CAUO,SAAS4X,GAAUF,EAAKG,EAAIC,EAAIC,EAAY,IAAM,GAAM,CAC7D,GAAIF,IAAO,GAAKC,IAAO,EAAG,OAAOJ,EACjC,KAAM,CAAC/X,EAAGK,CAAC,EAAIyX,GAAQC,CAAG,EAC1B,OAAKK,EAAUpY,EAAGK,CAAC,EACZ2X,GAAQhY,EAAIkY,EAAI7X,EAAI8X,CAAE,EADAJ,CAE/B,CCpFA,MAAMM,EAAU,CACd,YAAYC,EAAKC,EAAKC,EAAKC,EAAKxY,EAAI,EAAGF,EAAI,EAAG,CAC5C,KAAK,IAAMuY,EACX,KAAK,IAAMC,EACX,KAAK,IAAMC,EACX,KAAK,IAAMC,EACX,KAAK,EAAIxY,EACT,KAAK,EAAIF,CACX,CAEA,IAAIuY,EAAKC,EAAKC,EAAKC,EAAK,CACtB,KAAK,IAAMH,EACX,KAAK,IAAMC,EACX,KAAK,IAAMC,EACX,KAAK,IAAMC,CACb,CAEA,UAAW,CACT,OAAO,KAAK,IAAM,KAAK,IAAM,GAAK,KAAK,IAAM,KAAK,IAAM,CAC1D,CAIA,YAAYC,EAAM,CAChB,GAAI,CAACC,EAAIC,CAAE,EAAI,CAAC,EAAG,CAAC,EAChBF,EAAK,SAAW,EAClB,CAACE,EAAID,CAAE,EAAIb,GAAQY,EAAK,CAAC,CAAC,EACjBA,EAAK,SAAW,IACzB,CAACC,EAAIC,CAAE,EAAIF,GAEb,KAAM,CACJ,IAAAJ,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KACJ,OAAOH,GAAOK,GAAMA,GAAMH,GAAOD,GAAOK,GAAMA,GAAMH,CACtD,CAEA,KAAKI,EAAIC,EAAY,IAAM,GAAM,CAC/B,KAAM,CACJ,IAAAR,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KACJ,QAASla,EAAI+Z,EAAK/Z,GAAKia,EAAKja,GAAK,EAC/B,GAAIua,EAAUva,CAAC,EACb,QAASf,EAAI+a,EAAK/a,GAAKib,EAAKjb,GAAK,EAC/Bqb,EAAGta,EAAGf,CAAC,CAIf,CAEA,SAASub,EAAO,CACd,OAAO,KAAK,KAAOA,EAAM,KACpB,KAAK,KAAOA,EAAM,KAClB,KAAK,KAAOA,EAAM,KAClB,KAAK,KAAOA,EAAM,GACzB,CAGA,OAAOA,EAAO,CACZ,OAAO,KAAK,KAAOA,EAAM,KACpB,KAAK,KAAOA,EAAM,KAClB,KAAK,KAAOA,EAAM,KAClB,KAAK,KAAOA,EAAM,GACzB,CAGA,SAASA,EAAO,CACd,OAAO,KAAK,IAAMA,EAAM,KACnB,KAAK,IAAMA,EAAM,KACjBA,EAAM,IAAM,KAAK,KACjBA,EAAM,IAAM,KAAK,GACxB,CAGA,WAAWA,EAAO,CAChB,OAAO,KAAK,KAAOA,EAAM,KACpB,KAAK,KAAOA,EAAM,KAClBA,EAAM,KAAO,KAAK,KAClBA,EAAM,KAAO,KAAK,GACzB,CAGA,MAAMA,EAAO,CACX,KAAM,CACJ,IAAAT,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KACJ,OAAO,IAAIJ,GACTU,EAAM,IAAMT,EAAMS,EAAM,IAAMT,EAC9BS,EAAM,IAAMR,EAAMQ,EAAM,IAAMR,EAC9BQ,EAAM,IAAMP,EAAMO,EAAM,IAAMP,EAC9BO,EAAM,IAAMN,EAAMM,EAAM,IAAMN,CACpC,CACE,CAOA,WAAWM,EAAO,CAChB,MAAMnB,EAAM,CAAA,EACNoB,EAAS,CAACV,EAAKC,EAAKC,EAAKC,IAAQ,CACrCb,EAAI,KAAK,IAAIS,GAAUC,EAAKC,EAAKC,EAAKC,CAAG,CAAC,CAC5C,EACM,CACJ,IAAAH,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KACEQ,EAAMF,EAAM,IAAMT,EAClBY,EAAMH,EAAM,IAAMR,EAClBY,EAAMX,EAAMO,EAAM,IAClBK,EAAMX,EAAMM,EAAM,IACxB,OAAIE,EAAM,GACRD,EAAOV,EAAKC,EAAKQ,EAAM,IAAM,EAAGN,CAAG,EAC/BU,EAAM,GACRH,EAAOD,EAAM,IAAM,EAAGR,EAAKC,EAAKC,CAAG,EAC/BS,EAAM,GACRF,EAAOD,EAAM,IAAKR,EAAKQ,EAAM,IAAKA,EAAM,IAAM,CAAC,EAE7CK,EAAM,GACRJ,EAAOD,EAAM,IAAKA,EAAM,IAAM,EAAGA,EAAM,IAAKN,CAAG,IAG7CS,EAAM,GACRF,EAAOD,EAAM,IAAKR,EAAKC,EAAKO,EAAM,IAAM,CAAC,EAEvCK,EAAM,GACRJ,EAAOD,EAAM,IAAKA,EAAM,IAAM,EAAGP,EAAKC,CAAG,IAGpCU,EAAM,IACfH,EAAOD,EAAM,IAAM,EAAGR,EAAKC,EAAKC,CAAG,EAC/BS,EAAM,GACRF,EAAOV,EAAKC,EAAKQ,EAAM,IAAKA,EAAM,IAAM,CAAC,EAEvCK,EAAM,GACRJ,EAAOV,EAAKS,EAAM,IAAM,EAAGA,EAAM,IAAKN,CAAG,GAGzCS,EAAM,GACRF,EAAOV,EAAKC,EAAKC,EAAKO,EAAM,IAAM,CAAC,EAC/BK,EAAM,GACRJ,EAAOV,EAAKS,EAAM,IAAM,EAAGP,EAAKC,CAAG,EAC/BQ,EAAM,GACRD,EAAOV,EAAKS,EAAM,IAAKA,EAAM,IAAM,EAAGA,EAAM,GAAG,EAE7CI,EAAM,GACRH,EAAOD,EAAM,IAAM,EAAGA,EAAM,IAAKP,EAAKO,EAAM,GAAG,IAG7CE,EAAM,GACRD,EAAOV,EAAKS,EAAM,IAAKA,EAAM,IAAM,EAAGN,CAAG,EAEvCU,EAAM,GACRH,EAAOD,EAAM,IAAM,EAAGA,EAAM,IAAKP,EAAKC,CAAG,IAGpCW,EAAM,IACfJ,EAAOR,EAAKO,EAAM,IAAM,EAAGP,EAAKC,CAAG,EAC/BQ,EAAM,GACRD,EAAOV,EAAKC,EAAKQ,EAAM,IAAM,EAAGA,EAAM,GAAG,EAEvCI,EAAM,GACRH,EAAOD,EAAM,IAAM,EAAGR,EAAKC,EAAKO,EAAM,GAAG,GAGtCnB,CACT,CAEA,MAAO,CACL,MAAO,CACL,KAAK,IAAM,KAAK,IAAM,EACtB,KAAK,IAAM,KAAK,IAAM,CAC5B,CACE,CAEA,UAAW,CACT,KAAM,CACJ,IAAAU,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KACJ,IAAIY,EAAMrB,GAAQO,EAAKD,CAAG,EAC1B,OAAI,KAAK,aACPe,EAAM,GAAGA,CAAG,IAAIrB,GAAQS,EAAKD,CAAG,CAAC,IAE5Ba,CACT,CAEA,OAAQ,CACN,KAAM,CACJ,IAAAf,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,EAAK,EAAAxY,EAAG,EAAAF,CAC7B,EAAQ,KACJ,OAAO,IAAIsY,GAAUC,EAAKC,EAAKC,EAAKC,EAAKxY,EAAGF,CAAC,CAC/C,CAQA,OAAOgZ,EAAO,CACZ,OAAO,KAAK,MAAQA,EAAM,KACrB,KAAK,MAAQA,EAAM,KACnB,KAAK,MAAQA,EAAM,KACnB,KAAK,MAAQA,EAAM,GAC1B,CAEA,OAAO,QAAQM,EAAK,CAElB,MAAMC,EAAOD,EAAI,MAAM,GAAG,EACpB,CAACd,EAAKD,CAAG,EAAIR,GAAQwB,EAAK,CAAC,CAAC,EAClC,GAAI,CAACd,EAAKC,CAAG,EAAI,CAACH,EAAKC,CAAG,EAC1B,OAAIe,EAAK,OAAS,IAChB,CAACb,EAAKD,CAAG,EAAIV,GAAQwB,EAAK,CAAC,CAAC,GAEvB,IAAIjB,GAAUC,EAAKC,EAAKC,EAAKC,CAAG,CACzC,CACF,CCvNe,IAAAc,GAAA,KAAe,CAC5B,aAAc,CACZ,KAAK,MAAQ,IAAIlB,GAAU,EAAG,EAAG,EAAG,CAAC,EACrC,KAAK,GAAK,EACV,KAAK,GAAK,CACZ,CAEA,UAAW,CACT,OAAO,KAAK,MAAM,SAAQ,CAC5B,CAEA,WAAWM,EAAIC,EAAI,CACjB,KAAK,GAAKD,EACV,KAAK,GAAKC,CACZ,CAEA,MAAO,CACL,OAAO,KAAK,MAAM,KAAI,CACxB,CACF,ECrBe,MAAMY,EAAO,CAC1B,aAAc,CACZ,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,GAAK,EACV,KAAK,GAAK,CACZ,CACF,CCLe,MAAMC,EAAQ,CAC3B,aAAc,CACZ,KAAK,UAAY,CAAA,EACjB,KAAK,UAAY,CAAA,CACnB,CAEA,IAAIC,EAAM,CACR,KAAK,UAAU,KAAK,KAAK,UAAUA,CAAI,CAAC,EACxC,KAAK,UAAY,CAAA,CACnB,CAEA,SAAU,CACR,OAAO,KAAK,UAAU,OAAS,CACjC,CAEA,SAAU,CACR,OAAO,KAAK,UAAU,OAAS,CACjC,CAEA,KAAKC,EAAUd,EAAI,CACjB,KAAM,CAAE,UAAAe,EAAW,UAAAC,CAAS,EAAK,KAC7B,KAAK,YACPA,EAAU,KAAK,KAAK,UAAUF,CAAQ,CAAC,EACvCd,EAAG,KAAK,MAAMe,EAAU,IAAG,CAAE,CAAC,EAElC,CAEA,KAAKD,EAAUd,EAAI,CACjB,KAAM,CAAE,UAAAe,EAAW,UAAAC,CAAS,EAAK,KAC7B,KAAK,YACPD,EAAU,KAAK,KAAK,UAAUD,CAAQ,CAAC,EACvCd,EAAG,KAAK,MAAMgB,EAAU,IAAG,CAAE,CAAC,EAElC,CACF,CCpCe,MAAMC,EAAU,CAC7B,aAAc,CACZ,KAAK,MAAQ,KACb,KAAK,MAAQ,OACf,CAEA,KAAKC,EAAW,CACd,YAAK,MAAQA,EACb,KAAK,MAAQ,OACN,IACT,CAEA,IAAIA,EAAW,CACb,YAAK,MAAQA,EACb,KAAK,MAAQ,MACN,IACT,CAEA,QAAS,CACP,OAAO,KAAK,QAAU,MACxB,CAEA,OAAQ,CACN,OAAO,KAAK,QAAU,KACxB,CAEA,SAAU,CACR,OAAO,KAAK,QAAU,OACxB,CAEA,OAAQ,CACN,KAAK,MAAQ,KACb,KAAK,MAAQ,OACf,CACF,CC7BA,MAAMC,EAAO,CACX,YAAYpB,EAAIqB,EAAUvX,EAAO,CAC/B,KAAK,GAAKkW,EACV,KAAK,SAAWqB,EAChB,KAAK,MAAQvX,CACf,CAEA,IAAIuX,EAAUvX,EAAO,CACnB,KAAK,SAAWuX,EAChB,KAAK,MAAQvX,CACf,CAEA,SAAStC,EAAG,CACV,KAAM,CAAE,SAAA6Z,EAAU,MAAAvX,CAAK,EAAK,KAC5B,OAAIuX,IAAa,MACR,GAELA,IAAa,KACRvX,EAAM,SAAStC,CAAC,EAElB,EACT,CAEA,SAAU,CACR,KAAM,CAAE,SAAA6Z,EAAU,MAAAvX,CAAK,EAAK,KAC5B,OAAIuX,IAAa,KACRvX,EAAM,OAER,CACT,CAEA,SAAU,CACR,KAAM,CAAE,GAAAkW,EAAI,SAAAqB,EAAU,MAAAvX,CAAK,EAAK,KAChC,MAAO,CAAE,GAAAkW,EAAI,SAAAqB,EAAU,MAAAvX,CAAK,CAC9B,CACF,CAEA,MAAMwX,EAAK,CACT,YAAYtB,EAAIuB,EAAO,CACrB,KAAK,GAAKvB,EACV,KAAK,MAAQuB,CACf,CAEA,KAAM,CACJ,OAAO,KAAK,QAAU,KACxB,CAEA,MAAO,CACL,OAAO,KAAK,QAAU,MACxB,CACF,CAEe,MAAMC,EAAW,CAC9B,aAAc,CACZ,KAAK,IAAM,KACX,KAAK,QAAU,CAAA,EACf,KAAK,KAAO,IACd,CAEA,QAAQ,CAAE,IAAAf,EAAK,QAAAgB,EAAS,KAAAC,CAAI,EAAI,CAC1BjB,GAAO,OACT,KAAK,IAAMA,EACX,KAAK,QAAUgB,EAAQ,IAAIpY,GAAM,IAAI+X,GAAO/X,EAAG,GAAIA,EAAG,SAAUA,EAAG,KAAK,CAAC,EACrEqY,IACF,KAAK,KAAO,IAAIJ,GAAKI,EAAK,GAAIA,EAAK,KAAK,GAG9C,CAEA,SAAU,CACR,GAAI,KAAK,SAAU,CACjB,KAAM,CAAE,IAAAjB,EAAK,QAAAgB,EAAS,KAAAC,CAAI,EAAK,KAC/B,MAAO,CAAE,IAAAjB,EAAK,QAASgB,EAAQ,IAAIpY,GAAMA,EAAG,SAAS,EAAG,KAAAqY,CAAI,CAC9D,CACA,MAAO,CAAA,CACT,CAEA,UAAU1B,EAAIqB,EAAUvX,EAAO,CAC7B,MAAM6X,EAAS,KAAK,UAAU3B,CAAE,EAC5B2B,GAAU,KACZ,KAAK,QAAQ,KAAK,IAAIP,GAAOpB,EAAIqB,EAAUvX,CAAK,CAAC,EAEjD6X,EAAO,IAAIN,EAAUvX,CAAK,CAE9B,CAEA,QAAQkW,EAAIuB,EAAO,CACjB,KAAK,KAAOA,EAAQ,IAAID,GAAKtB,EAAIuB,CAAK,EAAI,IAC5C,CAEA,SAASxB,EAAIC,EAAI,CACf,OAAI,KAAK,SACA,KAAK,OAAM,EAAG,SAASD,EAAIC,CAAE,EAE/B,EACT,CAEA,QAAQA,EAAI,CACV,KAAM,CAAE,KAAA0B,CAAI,EAAK,KACjB,OAAIA,GAAQA,EAAK,KAAO1B,EACf0B,EAEF,IACT,CAEA,UAAU1B,EAAI,CACZ,KAAM,CAAE,QAAAyB,CAAO,EAAK,KACpB,QAAS9b,EAAI,EAAGA,EAAI8b,EAAQ,OAAQ9b,GAAK,EACvC,GAAI8b,EAAQ9b,CAAC,EAAE,KAAOqa,EACpB,OAAOyB,EAAQ9b,CAAC,EAGpB,OAAO,IACT,CAEA,aAAaic,EAAS,CAGpB,MAAMC,EAAO,IAAI,IACXC,EAAO,IAAI,IACjB,GAAI,KAAK,SAAU,CACjB,KAAM,CAAE,IAAApC,EAAK,IAAAE,GAAQ,KAAK,MAAK,EACzB,CAAE,QAAA6B,CAAO,EAAK,KACpB,QAAS1B,EAAKL,EAAM,EAAGK,GAAMH,EAAKG,GAAM,EACtC,QAASpa,EAAI,EAAGA,EAAI8b,EAAQ,OAAQ9b,GAAK,EAAG,CAC1C,MAAMgc,EAASF,EAAQ9b,CAAC,EAClBoc,EAAOH,EAAQ7B,EAAI4B,EAAO,EAAE,EAC5BK,EAAQD,EAAOA,EAAK,KAAO,GACjC,GAAKJ,EAAO,SAASK,CAAK,EAIxBF,EAAK,IAAI/B,CAAE,MAJgB,CAC3B8B,EAAK,IAAI9B,CAAE,EACX,KACF,CAGF,CAEJ,CACA,MAAO,CAAE,KAAA8B,EAAM,KAAAC,CAAI,CACrB,CAEA,MAAM9B,EAAI4B,EAAS,CACjB,MAAM9a,EAAI,CAAA,EACV,GAAI,KAAK,SAAU,CACjB,KAAM,CAAE,IAAA4Y,EAAK,IAAAE,GAAQ,KAAK,MAAK,EAC/B,QAASG,EAAKL,EAAM,EAAGK,GAAMH,EAAKG,GAAM,EAAG,CACzC,MAAMgC,EAAOH,EAAQ7B,EAAIC,CAAE,EAC3B,GAAI+B,IAAS,MAAQ,CAAC,QAAQ,KAAKA,EAAK,IAAI,EAAG,CAC7C,MAAMtE,EAAMsE,EAAK,KACXE,GAAOnb,EAAE2W,CAAG,GAAK,GAAK,EAC5B3W,EAAE2W,CAAG,EAAIwE,CACX,MACEnb,EAAE,EAAE,GAAKA,EAAE,EAAE,GAAK,GAAK,CAE3B,CACF,CACA,OAAOA,CACT,CAEA,OAAQ,CACN,OAAO2Y,GAAU,QAAQ,KAAK,GAAG,CACnC,CAEA,QAAS,CACP,MAAMpa,EAAI,KAAK,MAAK,EACpB,OAAAA,EAAE,IAAMA,EAAE,IACHA,CACT,CAEA,OAAQ,CACN,KAAK,IAAM,KACX,KAAK,QAAU,CAAA,EACf,KAAK,KAAO,IACd,CAEA,QAAS,CACP,OAAO,KAAK,MAAQ,IACtB,CACF,CCpLA,MAAM6c,EAAO,CACX,YAAYzb,EAAI,GAAI,CAClB,KAAK,EAAIA,CACX,CAEA,QAAQwZ,EAAI,CACV,KAAK,EAAE,QAAQA,CAAE,CACnB,CAEA,aAAakC,EAAI,CACf,KAAK,EAAI,KAAK,EAAE,OAAO9Y,GAAM,CAACA,EAAG,OAAO8Y,CAAE,CAAC,CAC7C,CAEA,iBAAiBpC,EAAIC,EAAI,CACvB,QAASra,EAAI,EAAGA,EAAI,KAAK,EAAE,OAAQA,GAAK,EAAG,CACzC,MAAM0D,EAAK,KAAK,EAAE1D,CAAC,EACnB,GAAI0D,EAAG,SAAS0W,EAAIC,CAAE,EACpB,OAAO3W,CAEX,CACA,OAAO,IACT,CAEA,iBAAiB8X,EAAW,CAC1B,OAAO,IAAIe,GAAO,KAAK,EAAE,OAAO7Y,GAAMA,EAAG,WAAW8X,CAAS,CAAC,CAAC,CACjE,CAEA,WAAWA,EAAW,CACpB,QAASxb,EAAI,EAAGA,EAAI,KAAK,EAAE,OAAQA,GAAK,EAEtC,GADW,KAAK,EAAEA,CAAC,EACZ,WAAWwb,CAAS,EAEzB,MAAO,GAGX,MAAO,EACT,CAEA,MAAMA,EAAW,CACf,IAAIgB,EAAKhB,EACT,YAAK,EAAE,QAAS9X,GAAO,CACjBA,EAAG,WAAW8Y,CAAE,IAClBA,EAAK9Y,EAAG,MAAM8Y,CAAE,EAEpB,CAAC,EACMA,CACT,CAEA,IAAIA,EAAI,CACN,KAAK,aAAaA,CAAE,EACpB,KAAK,EAAE,KAAKA,CAAE,CAChB,CAGA,MAAMC,EAAM3T,EAAO3J,EAAGud,EAAU,CAC9B,KAAK,EAAE,QAASlB,GAAc,CAC5B,KAAM,CACJ,IAAAzB,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACvB,EAAUsB,EACEmB,EAAQnB,EACViB,IAAS,MACP1C,GAAOjR,GACT6T,EAAM,KAAOxd,EACbwd,EAAM,KAAOxd,GACJ4a,EAAMjR,GAASA,GAASmR,IACjC0C,EAAM,KAAOxd,EACbud,EAAS3C,EAAKC,EAAK7a,EAAG,CAAC,GAEhBsd,IAAS,WACdzC,GAAOlR,GACT6T,EAAM,KAAOxd,EACbwd,EAAM,KAAOxd,GACJ6a,EAAMlR,GAASA,GAASoR,IACjCyC,EAAM,KAAOxd,EACbud,EAAS3C,EAAKC,EAAK,EAAG7a,CAAC,GAG7B,CAAC,CACH,CAEA,KAAKqc,EAAWoB,EAAIC,EAAI,CACtB,KAAK,EAAE,QAASC,GAAQ,CACtB,MAAMpZ,EAAKoZ,EACPpZ,EAAG,OAAO8X,CAAS,IACrB9X,EAAG,KAAOkZ,EACVlZ,EAAG,KAAOkZ,EACVlZ,EAAG,KAAOmZ,EACVnZ,EAAG,KAAOmZ,EAEd,CAAC,CACH,CAEA,QAAQE,EAAQ,CACd,YAAK,EAAIA,EAAO,IAAIC,GAASlD,GAAU,QAAQkD,CAAK,CAAC,EAC9C,IACT,CAEA,SAAU,CACR,OAAO,KAAK,EAAE,IAAIA,GAASA,EAAM,UAAU,CAC7C,CACF,CCrGA,SAASC,GAAUC,EAAK,CACtB,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAG,CAAC,CACvC,CAEA,MAAMC,GAAY,CAACC,EAAS,CAAA,KAAOC,KACjCA,EAAQ,QAASC,GAAW,CAC1B,OAAO,KAAKA,CAAM,EAAE,QAASxF,GAAQ,CACnC,MAAMjW,EAAIyb,EAAOxF,CAAG,EAEhB,OAAOjW,GAAM,UAAY,OAAOA,GAAM,UAAY,OAAOA,GAAM,UACjEub,EAAOtF,CAAG,EAAIjW,EACL,OAAOA,GAAM,YAAc,CAAC,MAAM,QAAQA,CAAC,GAAKA,aAAa,QACtEub,EAAOtF,CAAG,EAAIsF,EAAOtF,CAAG,GAAK,CAAA,EAC7BqF,GAAUC,EAAOtF,CAAG,EAAGjW,CAAC,GAExBub,EAAOtF,CAAG,EAAIjW,CAElB,CAAC,CACH,CAAC,EAEMub,GAGT,SAASG,GAAOC,EAAMC,EAAM,CAC1B,MAAM3E,EAAO,OAAO,KAAK0E,CAAI,EAC7B,GAAI1E,EAAK,SAAW,OAAO,KAAK2E,CAAI,EAAE,OAAQ,MAAO,GACrD,QAASzd,EAAI,EAAGA,EAAI8Y,EAAK,OAAQ9Y,GAAK,EAAG,CACvC,MAAMX,EAAIyZ,EAAK9Y,CAAC,EACV0d,EAAKF,EAAKne,CAAC,EACXse,EAAKF,EAAKpe,CAAC,EACjB,GAAIse,IAAO,OAAW,MAAO,GAC7B,GAAI,OAAOD,GAAO,UAAY,OAAOA,GAAO,UAAY,OAAOA,GAAO,WACpE,GAAIA,IAAOC,EAAI,MAAO,WACb,MAAM,QAAQD,CAAE,EAAG,CAC5B,GAAIA,EAAG,SAAWC,EAAG,OAAQ,MAAO,GACpC,QAASC,EAAK,EAAGA,EAAKF,EAAG,OAAQE,GAAM,EACrC,GAAI,CAACL,GAAOG,EAAGE,CAAE,EAAGD,EAAGC,CAAE,CAAC,EAAG,MAAO,EAExC,SAAW,OAAOF,GAAO,YAAc,CAAC,MAAM,QAAQA,CAAE,GAAKA,aAAc,QACrE,CAACH,GAAOG,EAAIC,CAAE,EAAG,MAAO,EAEhC,CACA,MAAO,EACT,CAMA,MAAME,GAAM,CAACC,EAAUxD,EAAKnW,GAASA,IAAU,CAC7C,IAAIkL,EAAQ,EACR0O,EAAO,EACX,cAAO,KAAKD,CAAQ,EAAE,QAAShG,GAAQ,CACrCzI,GAASiL,EAAGwD,EAAShG,CAAG,EAAGA,CAAG,EAC9BiG,GAAQ,CACV,CAAC,EACM,CAAC1O,EAAO0O,CAAI,CACrB,EAEA,SAASC,GAAed,EAAKe,EAAU,CACrC,MAAMC,EAAOhB,EAAI,GAAGe,CAAQ,EAAE,EAC9B,cAAOf,EAAI,GAAGe,CAAQ,EAAE,EACjBC,CACT,CAEA,SAASC,GAAcC,EAAKC,EAAKC,EAAOC,EAAOC,EAAKC,EAAM,CACxD,IAAIve,EAAIoe,EACJzc,EAAI0c,EACJve,EAAIoe,EACR,KAAOpe,EAAIqe,GACL,EAAAne,EAAIse,GADMxe,GAAK,EAEnB6B,EAAI4c,EAAKze,CAAC,EACVE,GAAK2B,EAEP,MAAO,CAAC7B,EAAGE,EAAI2B,EAAGA,CAAC,CACrB,CAEA,SAAS6c,GAASN,EAAKC,EAAKI,EAAM,CAChC,IAAI,EAAI,EACR,QAAS,EAAIL,EAAK,EAAIC,EAAK,GAAK,EAC9B,GAAKI,EAAK,CAAC,EAEb,OAAO,CACT,CAEA,SAASE,GAAUP,EAAKC,EAAK/D,EAAI,CAC/B,QAASta,EAAIoe,EAAKpe,EAAIqe,EAAKre,GAAK,EAC9Bsa,EAAGta,CAAC,CAER,CAEA,SAAS4e,GAAYC,EAAIC,EAAI,CAC3B,GAAID,EAAG,SAAWC,EAAG,QACnB,QAAS9e,EAAI,EAAGA,EAAI6e,EAAG,OAAQ7e,GAAK,EAClC,GAAI6e,EAAG7e,CAAC,IAAM8e,EAAG9e,CAAC,EAAG,MAAO,OAEzB,OAAO,GACd,MAAO,EACT,CAEA,SAAS+e,GAAOhf,EAAG,CACjB,MAAM8B,EAAI,GAAG9B,CAAC,GACd,IAAIsZ,EAAM,EACNT,EAAO,GACX,QAAS,EAAI,EAAG,EAAI/W,EAAE,OAAQ,GAAK,EAC7B+W,IAAS,KAAMS,GAAO,GACtBxX,EAAE,OAAO,CAAC,IAAM,MAAK+W,EAAO,IAElC,OAAOS,CACT,CAEO,SAAS2F,GAAWvC,EAAMoC,EAAIC,EAAI,CACvC,GAAI,OAAO,MAAMD,CAAE,GAAK,OAAO,MAAMC,CAAE,EACrC,OAAOD,EAAKpC,EAAOqC,EAErB,MAAMG,EAAMF,GAAOF,CAAE,EACfK,EAAMH,GAAOD,CAAE,EACfK,EAAO,OAAON,CAAE,EAChBO,EAAO,OAAON,CAAE,EACtB,IAAIzF,EAAM,EACV,GAAIoD,IAAS,IACXpD,EAAM8F,EAAOC,UACJ3C,IAAS,IAClBpD,EAAM8F,EAAOC,UACJ3C,IAAS,IAClBpD,EAAM8F,EAAOC,UACJ3C,IAAS,IAElB,OADApD,EAAM8F,EAAOC,EACTL,GAAO1F,CAAG,EAAI,EAAUA,EAAI,QAAQ,CAAC,EAClCA,EAET,OAAOA,EAAI,QAAQ,KAAK,IAAI4F,EAAKC,CAAG,CAAC,CACvC,CAEA,MAAAG,GAAe,CACb,UAAApC,GACA,MAAO,IAAII,IAAYF,GAAU,CAAA,EAAI,GAAGE,CAAO,EAC/C,OAAAE,GACA,YAAAqB,GACA,IAAAf,GACA,UAAAc,GACA,SAAAD,GACA,cAAAP,GACA,eAAAH,GACA,WAAAgB,EACF,EC/IA,MAAMM,EAAK,CACT,YAAY,CAAE,IAAAC,EAAK,OAAAhO,GAAU,CAC3B,KAAK,EAAI,CAAA,EACT,KAAK,IAAMgO,EAEX,KAAK,OAAShO,CAChB,CAEA,UAAU6I,EAAI,CACZ,GAAI,KAAK,OAAOA,CAAE,EAAG,MAAO,GAC5B,MAAMoF,EAAM,KAAK,IAAIpF,CAAE,EACvB,OAAIoF,GAAOA,EAAI,OACNA,EAAI,OAEN,KAAK,MACd,CAEA,UAAUpF,EAAIvY,EAAG,CACf,MAAM2d,EAAM,KAAK,SAASpF,CAAE,EAC5BoF,EAAI,OAAS3d,CACf,CAEA,OAAO4d,EAAK,CACV,IAAI3W,EAAQ2W,EACZ,KAAO3W,EAAQ,IACbA,GAAS,EACL,KAAK,OAAOA,CAAK,IACnB,KAAK,QAAQA,EAAO,EAAK,CAG/B,CAEA,OAAOsR,EAAI,CACT,MAAMoF,EAAM,KAAK,IAAIpF,CAAE,EACvB,OAAOoF,GAAOA,EAAI,IACpB,CAEA,QAAQpF,EAAIvY,EAAG,CACb,MAAM2d,EAAM,KAAK,SAASpF,CAAE,EACxBvY,IAAM,GAAM2d,EAAI,KAAO,GACtB,OAAOA,EAAI,IAClB,CAEA,SAASpF,EAAI5I,EAAO,CAClB,MAAMgO,EAAM,KAAK,SAASpF,CAAE,EAC5BoF,EAAI,MAAQhO,CACd,CAEA,UAAU4M,EAAKC,EAAKqB,EAAW,CAC7B,OAAOL,GAAO,SAASjB,EAAKC,EAAM,GAC5BqB,GAAaA,EAAU,IAAI,CAAC,EAAU,EACnC,KAAK,UAAU,CAAC,CACxB,CACH,CAEA,aAAc,CACZ,OAAO,KAAK,UAAU,EAAG,KAAK,GAAG,CACnC,CAEA,IAAItF,EAAI,CACN,OAAO,KAAK,EAAEA,CAAE,CAClB,CAEA,SAASA,EAAI,CACX,YAAK,EAAEA,CAAE,EAAI,KAAK,EAAEA,CAAE,GAAK,CAAE,MAAO,EAAE,EAC/B,KAAK,EAAEA,CAAE,CAClB,CAEA,QAAQA,EAAIC,EAAI,CACd,MAAMmF,EAAM,KAAK,IAAIpF,CAAE,EACvB,OAAIoF,IAAQ,QAAaA,EAAI,QAAU,QAAaA,EAAI,MAAMnF,CAAE,IAAM,OAC7DmF,EAAI,MAAMnF,CAAE,EAEd,IACT,CAEA,aAAaD,EAAIC,EAAI,CACnB,MAAM+B,EAAO,KAAK,QAAQhC,EAAIC,CAAE,EAChC,OAAI+B,GAAQA,EAAK,MAAcA,EAAK,MAC7B,CAAC,EAAG,CAAC,CACd,CAEA,aAAahC,EAAIC,EAAI,CACnB,MAAMmF,EAAM,KAAK,SAASpF,CAAE,EAC5B,OAAAoF,EAAI,MAAMnF,CAAE,EAAImF,EAAI,MAAMnF,CAAE,GAAK,CAAA,EAC1BmF,EAAI,MAAMnF,CAAE,CACrB,CAGA,QAAQD,EAAIC,EAAI+B,EAAMuD,EAAO,MAAO,CAClC,MAAMH,EAAM,KAAK,SAASpF,CAAE,EACxBuF,IAAS,MACXH,EAAI,MAAMnF,CAAE,EAAI+B,EACPuD,IAAS,QAClBH,EAAI,MAAMnF,CAAE,EAAImF,EAAI,MAAMnF,CAAE,GAAK,CAAA,EACjCmF,EAAI,MAAMnF,CAAE,EAAE,KAAO+B,EAAK,MACjBuD,IAAS,WAClBH,EAAI,MAAMnF,CAAE,EAAImF,EAAI,MAAMnF,CAAE,GAAK,CAAA,EACjCmF,EAAI,MAAMnF,CAAE,EAAE,MAAQ+B,EAAK,MACvBA,EAAK,QAAOoD,EAAI,MAAMnF,CAAE,EAAE,MAAQ+B,EAAK,OAE/C,CAEA,YAAYhC,EAAIC,EAAIuF,EAAM,CACxB,MAAMxD,EAAO,KAAK,aAAahC,EAAIC,CAAE,EACjC+B,EAAK,WAAa,KAAOA,EAAK,KAAOwD,EAC3C,CAGA,UAAUC,EAAcC,EAAcH,EAAMI,EAAW,GAAOzF,EAAK,IAAM,CAAC,EAAG,CAC3E,KAAM,CACJ,IAAAP,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ2F,EACEG,EAAOF,EAAa,IACpBG,EAAOH,EAAa,IACpBI,EAAOJ,EAAa,IACpBK,EAAOL,EAAa,IACpB,CAAClD,EAAIC,CAAE,EAAIgD,EAAa,KAAI,EAC5B,CAACO,EAAKC,CAAG,EAAIP,EAAa,KAAI,EAEpC,IAAIQ,EAAQ,GACRC,EAAK,GACLL,EAAOnG,GAAOoG,EAAOnG,KACvBsG,EAAQ,GACJJ,EAAOnG,EAAKwG,EAAKH,EAChBG,EAAKF,GAEZ,QAASrgB,EAAI+Z,EAAK/Z,GAAKia,EAAKja,GAAK,EAC/B,GAAI,KAAK,EAAEA,CAAC,GACV,QAASf,EAAI+a,EAAK/a,GAAKib,EAAKjb,GAAK,EAC/B,GAAI,KAAK,EAAEe,CAAC,EAAE,OAAS,KAAK,EAAEA,CAAC,EAAE,MAAMf,CAAC,EACtC,QAASmR,EAAK4P,EAAM5P,GAAM8P,EAAM9P,GAAMwM,EACpC,QAAS4D,EAAKP,EAAMO,GAAML,EAAMK,GAAM3D,EAAI,CACxC,MAAM4D,EAAMrQ,GAAMpQ,EAAI+Z,GAChB2G,EAAMF,GAAMvhB,EAAI+a,GAChB2G,EAAQtB,GAAO,UAAU,KAAK,EAAErf,CAAC,EAAE,MAAMf,CAAC,CAAC,EAEjD,GAAI8gB,GAAYY,GAASA,EAAM,MAAQA,EAAM,KAAK,OAAS,EAAG,CAC5D,KAAM,CAAE,KAAAf,CAAI,EAAKe,EACjB,IAAIxhB,EAAKqhB,EAAKP,GAAS7P,EAAK4P,GAAQ,EAIpC,GAHKM,IACHnhB,GAAKohB,EAAK,GAERX,EAAK,CAAC,IAAM,IACde,EAAM,KAAOf,EAAK,QAAQ,oBAAsBgB,GAAS,CACvD,GAAI,CAACjH,EAAIC,CAAE,EAAI,CAAC,EAAG,CAAC,EAOpB,OANIG,IAAQiG,EACVrG,EAAKxa,EAAI,EAGTya,EAAKza,EAAI,EAEP,QAAQ,KAAKyhB,CAAI,EAAUA,EACxBlH,GAAUkH,EAAMjH,EAAIC,CAAE,CAC/B,CAAC,UACSgD,GAAM,GAAKC,EAAK,IAAMmD,EAAO/F,GAAOiG,EAAOnG,IACjD8C,GAAM,GAAKD,EAAK,IAAMqD,EAAO/F,GAAOiG,EAAOnG,IAC3C4C,GAAM,GAAKC,GAAM,EAAI,CACzB,MAAMzF,EAAS,YAAY,KAAKwI,CAAI,EAEpC,GAAIxI,IAAW,KAAM,CACnB,MAAMtO,EAAQ,OAAOsO,EAAO,CAAC,CAAC,EAAIjY,EAAI,EACtCwhB,EAAM,KAAOf,EAAK,UAAU,EAAGxI,EAAO,KAAK,EAAItO,CACjD,CACF,CACF,CACA,KAAK,QAAQ2X,EAAKC,EAAKC,EAAOhB,CAAI,EAClCrF,EAAGmG,EAAKC,EAAKC,CAAK,CACpB,EAMZ,CAEA,SAASd,EAAcC,EAAc,CACnC,MAAMe,EAAU,CAAA,EAChB,KAAK,KAAMzG,GAAO,CAChB,KAAK,UAAUA,EAAKC,GAAO,CACzB,IAAIoG,EAAM,SAASrG,EAAI,EAAE,EACrBsG,EAAM,SAASrG,EAAI,EAAE,EACrBwF,EAAa,SAASzF,EAAIC,CAAE,IAC9BoG,EAAMX,EAAa,KAAOW,EAAMZ,EAAa,KAC7Ca,EAAMZ,EAAa,KAAOY,EAAMb,EAAa,MAE/CgB,EAAQJ,CAAG,EAAII,EAAQJ,CAAG,GAAK,CAAE,MAAO,EAAE,EAC1CI,EAAQJ,CAAG,EAAE,MAAMC,CAAG,EAAI,KAAK,EAAEtG,CAAE,EAAE,MAAMC,CAAE,CAC/C,CAAC,CACH,CAAC,EACD,KAAK,EAAIwG,CACX,CAGA,MAAMrH,EAAKsG,EAAc,CACvB,GAAItG,EAAI,QAAU,EAAG,OACrB,KAAM,CAAE,IAAAO,EAAK,IAAAC,CAAG,EAAK8F,EACrBtG,EAAI,QAAQ,CAACgG,EAAKxf,IAAM,CACtB,MAAMoa,EAAKL,EAAM/Z,EACjBwf,EAAI,QAAQ,CAACpD,EAAMnd,IAAM,CACvB,MAAMob,EAAKL,EAAM/a,EACjB,KAAK,YAAYmb,EAAIC,EAAI+B,CAAI,CAC/B,CAAC,CACH,CAAC,CACH,CAEA,OAAOrC,EAAK5a,EAAI,EAAG,CACjB,MAAM2hB,EAAQ,CAAA,EACd,KAAK,KAAK,CAAC1G,EAAIoF,IAAQ,CACrB,IAAIiB,EAAM,SAASrG,EAAI,EAAE,EACrBqG,GAAO1G,IACT0G,GAAOthB,EACP,KAAK,UAAUib,EAAI,CAACC,EAAI+B,IAAS,CAC3BA,EAAK,MAAQA,EAAK,KAAK,CAAC,IAAM,MAChCA,EAAK,KAAOA,EAAK,KAAK,QAAQ,oBAAqBwE,GAAQlH,GAAUkH,EAAM,EAAGzhB,EAAG,CAACsC,EAAGK,IAAMA,GAAKiY,CAAG,CAAC,EAExG,CAAC,GAEH+G,EAAML,CAAG,EAAIjB,CACf,CAAC,EACD,KAAK,EAAIsB,EACT,KAAK,KAAO3hB,CACd,CAEA,OAAO4a,EAAKE,EAAK,CACf,MAAM9a,EAAI8a,EAAMF,EAAM,EAChB+G,EAAQ,CAAA,EACd,KAAK,KAAK,CAAC1G,EAAIoF,IAAQ,CACrB,MAAMiB,EAAM,SAASrG,EAAI,EAAE,EACvBqG,EAAM1G,EACR+G,EAAML,CAAG,EAAIjB,EACJpF,EAAKH,IACd6G,EAAML,EAAMthB,CAAC,EAAIqgB,EACjB,KAAK,UAAUpF,EAAI,CAACC,EAAI+B,IAAS,CAC3BA,EAAK,MAAQA,EAAK,KAAK,CAAC,IAAM,MAChCA,EAAK,KAAOA,EAAK,KAAK,QAAQ,oBAAqBwE,GAAQlH,GAAUkH,EAAM,EAAG,CAACzhB,EAAG,CAACsC,EAAGK,IAAMA,EAAImY,CAAG,CAAC,EAExG,CAAC,EAEL,CAAC,EACD,KAAK,EAAI6G,EACT,KAAK,KAAO3hB,CACd,CAEA,aAAa6a,EAAK7a,EAAI,EAAG,CACvB,KAAK,KAAK,CAACib,EAAIoF,IAAQ,CACrB,MAAMuB,EAAS,CAAA,EACf,KAAK,UAAU3G,EAAI,CAACC,EAAI+B,IAAS,CAC/B,IAAIsE,EAAM,SAASrG,EAAI,EAAE,EACrBqG,GAAO1G,IACT0G,GAAOvhB,EACHid,EAAK,MAAQA,EAAK,KAAK,CAAC,IAAM,MAChCA,EAAK,KAAOA,EAAK,KAAK,QAAQ,oBAAqBwE,GAAQlH,GAAUkH,EAAMzhB,EAAG,EAAGsC,GAAKA,GAAKuY,CAAG,CAAC,IAGnG+G,EAAOL,CAAG,EAAItE,CAChB,CAAC,EACDoD,EAAI,MAAQuB,CACd,CAAC,CACH,CAEA,aAAa/G,EAAKE,EAAK,CACrB,MAAM/a,EAAI+a,EAAMF,EAAM,EACtB,KAAK,KAAK,CAACI,EAAIoF,IAAQ,CACrB,MAAMuB,EAAS,CAAA,EACf,KAAK,UAAU3G,EAAI,CAACC,EAAI+B,IAAS,CAC/B,MAAMsE,EAAM,SAASrG,EAAI,EAAE,EACvBqG,EAAM1G,EACR+G,EAAOL,CAAG,EAAItE,EACLsE,EAAMxG,IACf6G,EAAOL,EAAMvhB,CAAC,EAAIid,EACdA,EAAK,MAAQA,EAAK,KAAK,CAAC,IAAM,MAChCA,EAAK,KAAOA,EAAK,KAAK,QAAQ,oBAAqBwE,GAAQlH,GAAUkH,EAAM,CAACzhB,EAAG,EAAGsC,GAAKA,EAAIyY,CAAG,CAAC,GAGrG,CAAC,EACDsF,EAAI,MAAQuB,CACd,CAAC,CACH,CAGA,YAAYvF,EAAWmE,EAAO,MAAO,CACnCnE,EAAU,KAAK,CAACxb,EAAGf,IAAM,CACvB,KAAK,WAAWe,EAAGf,EAAG0gB,CAAI,CAC5B,CAAC,CACH,CAGA,WAAWvF,EAAIC,EAAIsF,EAAO,MAAO,CAC/B,MAAMH,EAAM,KAAK,IAAIpF,CAAE,EACvB,GAAIoF,IAAQ,KAAM,CAChB,MAAMpD,EAAO,KAAK,QAAQhC,EAAIC,CAAE,EAC5B+B,IAAS,MAAQA,EAAK,WAAa,KACjCuD,IAAS,MACX,OAAOH,EAAI,MAAMnF,CAAE,EACVsF,IAAS,QACdvD,EAAK,MAAM,OAAOA,EAAK,KACvBA,EAAK,OAAO,OAAOA,EAAK,OACnBuD,IAAS,UACdvD,EAAK,QAAU,QAAW,OAAOA,EAAK,MACtCA,EAAK,OAAO,OAAOA,EAAK,OACnBuD,IAAS,SACdvD,EAAK,OAAO,OAAOA,EAAK,MAGlC,CACF,CAEA,SAAU,CACR,MAAMtD,EAAO,OAAO,KAAK,KAAK,CAAC,EACzBsB,EAAKtB,EAAKA,EAAK,OAAS,CAAC,EACzBkI,EAAM,KAAK,EAAE5G,CAAE,EACrB,GAAI4G,EAAK,CACP,KAAM,CAAE,MAAAC,CAAK,EAAKD,EACZE,EAAK,OAAO,KAAKD,CAAK,EACtB5G,EAAK6G,EAAGA,EAAG,OAAS,CAAC,EAC3B,MAAO,CAAC,SAAS9G,EAAI,EAAE,EAAG,SAASC,EAAI,EAAE,CAAC,CAC5C,CACA,MAAO,CAAC,EAAG,CAAC,CACd,CAEA,KAAKC,EAAI,CACP,OAAO,QAAQ,KAAK,CAAC,EAAE,QAAQ,CAAC,CAACF,EAAIoF,CAAG,IAAM,CAC5ClF,EAAGF,EAAIoF,CAAG,CACZ,CAAC,CACH,CAEA,UAAUpF,EAAIE,EAAI,CACZ,KAAK,EAAEF,CAAE,GAAK,KAAK,EAAEA,CAAE,EAAE,OAC3B,OAAO,QAAQ,KAAK,EAAEA,CAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAACC,EAAI+B,CAAI,IAAM,CACvD9B,EAAGD,EAAI+B,CAAI,CACb,CAAC,CAEL,CAEA,QAAQtb,EAAG,CACLA,EAAE,MACJ,KAAK,IAAMA,EAAE,IACb,OAAOA,EAAE,KAEX,KAAK,EAAIA,CACX,CAEA,SAAU,CACR,KAAM,CAAE,IAAAye,CAAG,EAAK,KAChB,OAAO,OAAO,OAAO,CAAE,IAAAA,CAAG,EAAI,KAAK,CAAC,CACtC,CACF,CC5VA,MAAM4B,EAAK,CACT,YAAY,CACV,IAAA5B,EAAK,MAAAjO,EAAO,WAAA8P,EAAY,SAAAC,CAC5B,EAAK,CACD,KAAK,EAAI,CAAA,EACT,KAAK,IAAM9B,EACX,KAAK,MAAQjO,EACb,KAAK,WAAa8P,EAClB,KAAK,SAAWC,CAClB,CAEA,QAAQvgB,EAAG,CACLA,EAAE,MACJ,KAAK,IAAMA,EAAE,IACb,OAAOA,EAAE,KAEX,KAAK,EAAIA,CACX,CAEA,SAAU,CACR,KAAM,CAAE,IAAAye,CAAG,EAAK,KAChB,OAAO,OAAO,OAAO,CAAE,IAAAA,CAAG,EAAI,KAAK,CAAC,CACtC,CAEA,SAASvf,EAAG,CACV,GAAI,KAAK,OAAOA,CAAC,EAAG,MAAO,GAC3B,MAAMghB,EAAM,KAAK,EAAEhhB,CAAC,EACpB,OAAIghB,GAAOA,EAAI,MACNA,EAAI,MAEN,KAAK,KACd,CAEA,SAAS3G,EAAI,CACX,YAAK,EAAEA,CAAE,EAAI,KAAK,EAAEA,CAAE,GAAK,CAAA,EACpB,KAAK,EAAEA,CAAE,CAClB,CAEA,SAASA,EAAI/I,EAAO,CAClB,MAAM0P,EAAM,KAAK,SAAS3G,CAAE,EAC5B2G,EAAI,MAAQ1P,CACd,CAEA,OAAOmO,EAAK,CACV,IAAI3W,EAAQ2W,EACZ,KAAO3W,EAAQ,IACbA,GAAS,EACL,KAAK,OAAOA,CAAK,IACnB,KAAK,QAAQA,EAAO,EAAK,CAG/B,CAEA,OAAOuR,EAAI,CACT,MAAM2G,EAAM,KAAK,EAAE3G,CAAE,EACrB,OAAO2G,GAAOA,EAAI,IACpB,CAEA,QAAQ3G,EAAIxY,EAAG,CACb,MAAMmf,EAAM,KAAK,SAAS3G,CAAE,EACxBxY,IAAM,GAAMmf,EAAI,KAAO,GACtB,OAAOA,EAAI,IAClB,CAEA,SAAS3G,EAAI7I,EAAO,CAClB,MAAMwP,EAAM,KAAK,SAAS3G,CAAE,EAC5B2G,EAAI,MAAQxP,CACd,CAEA,SAAS4M,EAAKC,EAAK,CACjB,OAAOgB,GAAO,SAASjB,EAAKC,EAAKre,GAAK,KAAK,SAASA,CAAC,CAAC,CACxD,CAEA,YAAa,CACX,OAAO,KAAK,SAAS,EAAG,KAAK,GAAG,CAClC,CACF,CC9EA,MAAAshB,GAAe,CACb,QAAS,CACP,KAAM,OACN,KAAM,OACN,MAAO,QACP,YAAa,eACb,YAAa,eACb,OAAQ,SACR,SAAU,OACV,SAAU,YACV,SAAU,YACV,WAAY,cACZ,UAAW,YACX,OAAQ,SACR,MAAO,aACP,QAAS,aACT,OAAQ,UACR,MAAO,cACP,MAAO,mBACP,OAAQ,iBACR,SAAU,gBACV,OAAQ,cACR,WAAY,SACZ,QAAS,YACT,KAAM,MACV,EACE,YAAa,CACX,KAAM,OACN,IAAK,MACL,MAAO,QACP,WAAY,oBACZ,YAAa,oBACb,KAAM,OACN,UAAW,aACX,aAAc,gBACd,YAAa,SACb,UAAW,aACX,aAAc,gBACd,WAAY,cACZ,eAAgB,mBAChB,WAAY,mBACZ,cAAe,gBACf,iBAAkB,iBAClB,aAAc,iBACd,gBAAiB,iBACrB,EACE,MAAO,CACL,KAAM,aACN,YAAa,mBACb,aAAc,CAAC,YAAa,UAAU,CAC1C,EACE,OAAQ,CACN,OAAQ,SACR,KAAM,aACN,OAAQ,SACR,QAAS,UACT,IAAK,MACL,IAAK,MACL,IAAK,MACL,KAAM,OACN,KAAM,OACN,SAAU,YACV,SAAU,UACd,EACE,QAAS,CACP,IAAK,MACL,QAAS,UACT,IAAK,MACL,IAAK,MACL,IAAK,KACL,IAAK,MACL,GAAI,KACJ,OAAQ,QACZ,EACE,WAAY,CACV,SAAU,sBACV,SAAU,mCACV,QAAS,0BACT,WAAY,8BACZ,MAAO,oBACP,MAAO,iBACP,SAAU,qBACV,SAAU,kBACV,cAAe,8BACf,YAAa,qBACb,iBAAkB,gCACtB,EACE,MAAO,CACL,mBAAoB,oCACxB,EACE,SAAU,CACR,MAAO,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACvD,OAAQ,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,UAAU,CACrI,EACE,OAAQ,CACN,KAAM,OACN,OAAQ,SACR,OAAQ,SACR,KAAM,OACN,GAAI,IACR,EACE,KAAM,CACJ,KAAM,cACN,IAAK,aACT,EACE,OAAQ,CACN,MAAO,OACX,EACE,eAAgB,CACd,KAAM,OACN,MAAO,aACP,SAAU,WACV,SAAU,CACR,KAAM,OACN,OAAQ,QACR,IAAK,KACX,EACI,KAAM,CACJ,KAAM,OACN,OAAQ,SACR,KAAM,OACN,MAAO,QACP,MAAO,OACb,EACI,SAAU,CACR,GAAI,UACJ,IAAK,cACL,GAAI,YACJ,IAAK,wBACL,GAAI,eACJ,IAAK,2BACL,GAAI,WACJ,IAAK,cACX,CACA,CACA,ECnIA,IAAIC,GAAa,CAAC,IAAI,EACtB,MAAMC,GAAY,CAChB,GAAAF,EACF,EAEA,SAASG,GAAU3J,EAAK7T,EAAU,CAChC,GAAIA,EAGF,UAAWyd,KAAQH,GAAY,CAC7B,GAAI,CAACtd,EAASyd,CAAI,EAAG,MAErB,IAAIC,EAAU1d,EAASyd,CAAI,EAG3B,MAAM5I,EAAOhB,EAAI,MAAM,gBAAgB,EAEvC,QAAS9X,EAAI,EAAGA,EAAI8Y,EAAK,OAAQ9Y,GAAK,EAAG,CACvC,MAAMie,EAAWnF,EAAK9Y,CAAC,EACjBmE,EAAQwd,EAAQ1D,CAAQ,EAG9B,GAAI,CAAC9Z,EAAO,MAEZ,GAAInE,IAAM8Y,EAAK,OAAS,EAAG,OAAO3U,EAGlCwd,EAAUxd,CACZ,CACF,CAIJ,CAEA,SAAS/E,GAAE0Y,EAAK,CACd,IAAIjW,EAAI4f,GAAU3J,EAAK0J,EAAS,EAChC,MAAI,CAAC3f,GAAK,QAAU,OAAO,eAAiB,OAAO,cAAc,YAC/DA,EAAI4f,GAAU3J,EAAK,OAAO,cAAc,SAAS,GAE5CjW,GAAK,EACd,CAEA,SAAS+f,EAAG9J,EAAK,CACf,MAAO,IAAM1Y,GAAE0Y,CAAG,CACpB,CAOA,SAAS9T,GAAO0d,EAAMC,EAASE,EAAgB,GAAO,CAChDA,EACFN,GAAa,CAACG,CAAI,EAKlBH,GAAW,QAAQG,CAAI,EAGrBC,IACFH,GAAUE,CAAI,EAAIC,EAEtB,CClEA,MAAMG,GAAQ,CACZ,MAAO,gBACP,MAAO,sCACT,EAEA,SAASC,GAAcnJ,EAAMd,KAAQY,EAAK,CACxC,IAAIiJ,EAAU,GACd,OAAK/I,IACH+I,EAAUviB,GAAE,cAAc0Y,CAAG,GAAI,GAAGY,CAAG,GAElC,CAACE,EAAM+I,CAAO,CACvB,CAEe,MAAMK,EAAU,CAG7B,YAAYvF,EAAMwF,EAAU9d,EAAOuX,EAAU,CAC3C,KAAK,SAAWuG,EAChB,KAAK,MAAQ9d,EACb,KAAK,KAAOsY,EACZ,KAAK,SAAWf,EAChB,KAAK,QAAU,EACjB,CAEA,WAAW7Z,EAAG,CACZ,KAAM,CAAE,KAAA4a,CAAI,EAAK,KACjB,OAAIA,IAAS,OACJ,IAAI,KAAK5a,CAAC,EAEf4a,IAAS,SACJ,OAAO5a,CAAC,EAEVA,CACT,CAEA,OAAO2Y,EAAO,CACZ,IAAI5B,EAAO,KAAK,OAAS4B,EAAM,MAC1B,KAAK,WAAaA,EAAM,UACxB,KAAK,WAAaA,EAAM,SAC7B,OAAI5B,IACE,MAAM,QAAQ,KAAK,KAAK,EAC1BA,EAAOyG,GAAO,YAAY,KAAK,MAAO7E,EAAM,KAAK,EAEjD5B,EAAO,KAAK,QAAU4B,EAAM,OAGzB5B,CACT,CAEA,QAAS,CACP,OAAO,KAAK,MAAM,MAAM,GAAG,CAC7B,CAEA,SAAS/W,EAAG,CACV,KAAM,CACJ,SAAAogB,EAAU,SAAAvG,EAAU,MAAAvX,EAAO,KAAAsY,CACjC,EAAQ,KACJ,GAAIwF,GAAY,QAAQ,KAAKpgB,CAAC,EAC5B,OAAOkgB,GAAc,GAAO,UAAU,EAExC,GAAI,QAAQ,KAAKlgB,CAAC,EAAG,MAAO,CAAC,EAAI,EACjC,GAAIigB,GAAMrF,CAAI,GAAK,CAACqF,GAAMrF,CAAI,EAAE,KAAK5a,CAAC,EACpC,OAAOkgB,GAAc,GAAO,UAAU,EAExC,GAAItF,IAAS,OACX,OAAOsF,GAAc,KAAK,OAAM,EAAG,SAASlgB,CAAC,EAAG,OAAO,EAEzD,GAAI6Z,EAAU,CACZ,MAAMgC,EAAK,KAAK,WAAW7b,CAAC,EAC5B,GAAI6Z,IAAa,KAAM,CACrB,KAAM,CAAC0C,EAAKC,CAAG,EAAIla,EACnB,OAAO4d,GACLrE,GAAM,KAAK,WAAWU,CAAG,GAAKV,GAAM,KAAK,WAAWW,CAAG,EACvD,UACAD,EACAC,CACV,CACM,CACA,GAAI3C,IAAa,MAAO,CACtB,KAAM,CAAC0C,EAAKC,CAAG,EAAIla,EACnB,OAAO4d,GACLrE,EAAK,KAAK,WAAWU,CAAG,GAAKV,EAAK,KAAK,WAAWW,CAAG,EACrD,aACAD,EACAC,CACV,CACM,CACA,GAAI3C,IAAa,KACf,OAAOqG,GACLrE,IAAO,KAAK,WAAWvZ,CAAK,EAC5B,QACAA,CACV,EAEM,GAAIuX,IAAa,MACf,OAAOqG,GACLrE,IAAO,KAAK,WAAWvZ,CAAK,EAC5B,WACAA,CACV,EAEM,GAAIuX,IAAa,KACf,OAAOqG,GACLrE,EAAK,KAAK,WAAWvZ,CAAK,EAC1B,WACAA,CACV,EAEM,GAAIuX,IAAa,MACf,OAAOqG,GACLrE,GAAM,KAAK,WAAWvZ,CAAK,EAC3B,gBACAA,CACV,EAEM,GAAIuX,IAAa,KACf,OAAOqG,GACLrE,EAAK,KAAK,WAAWvZ,CAAK,EAC1B,cACAA,CACV,EAEM,GAAIuX,IAAa,MACf,OAAOqG,GACLrE,GAAM,KAAK,WAAWvZ,CAAK,EAC3B,mBACAA,CACV,CAEI,CACA,MAAO,CAAC,EAAI,CACd,CACF,CCpIA,MAAM+d,EAAW,CACf,YAAYrY,EAAMkR,EAAMoH,EAAW,CACjC,KAAK,KAAOpH,EACZ,KAAK,KAAOlR,EACZ,KAAK,UAAYsY,CACnB,CAEA,SAAS/H,EAAIC,EAAI,CACf,KAAM,CAAE,KAAAU,CAAI,EAAK,KACjB,QAAS,EAAI,EAAG,EAAIA,EAAK,OAAQ,GAAK,EAEpC,GADWjB,GAAU,QAAQiB,EAAK,CAAC,CAAC,EAC7B,SAASX,EAAIC,CAAE,EAAG,MAAO,GAElC,MAAO,EACT,CAEA,OAAOS,EAAK,CACV,KAAK,OAAOhB,GAAU,QAAQgB,CAAG,CAAC,EAClC,KAAK,KAAK,KAAKA,CAAG,CACpB,CAEA,OAAOU,EAAW,CAChB,MAAM4G,EAAQ,CAAA,EACd,KAAK,KAAK,QAAS1e,GAAO,CACxB,MAAM8Y,EAAK1C,GAAU,QAAQpW,CAAE,EAC3B8Y,EAAG,WAAWhB,CAAS,EACbgB,EAAG,WAAWhB,CAAS,EAC/B,QAAQsB,GAAOsF,EAAM,KAAKtF,EAAI,SAAQ,CAAE,CAAC,EAE7CsF,EAAM,KAAK1e,CAAE,CAEjB,CAAC,EACD,KAAK,KAAO0e,CACd,CAEA,SAAU,CACR,KAAM,CAAE,KAAArH,EAAM,KAAAlR,EAAM,UAAAsY,CAAS,EAAK,KAC5B,CACJ,KAAA1F,EAAM,SAAAwF,EAAU,SAAAvG,EAAU,MAAAvX,CAChC,EAAQge,EACJ,MAAO,CACL,KAAApH,EAAM,KAAAlR,EAAM,KAAA4S,EAAM,SAAAwF,EAAU,SAAAvG,EAAU,MAAAvX,CAC5C,CACE,CAEA,OAAO,QAAQ,CACb,KAAA4W,EAAM,KAAAlR,EAAM,KAAA4S,EAAM,SAAAwF,EAAU,SAAAvG,EAAU,MAAAvX,CAC1C,EAAK,CACD,OAAO,IAAI+d,GAAWrY,EAAMkR,EAAM,IAAIiH,GAAUvF,EAAMwF,EAAU9d,EAAOuX,CAAQ,CAAC,CAClF,CACF,CACA,MAAM2G,EAAY,CAChB,aAAc,CACZ,KAAK,EAAI,CAAA,EAET,KAAK,OAAS,IAAI,GACpB,CAEA,SAASjI,EAAIC,EAAI,CACf,OAAO,KAAK,OAAO,IAAI,GAAGD,CAAE,IAAIC,CAAE,EAAE,CACtC,CAEA,SAASD,EAAIC,EAAIuF,EAAM,CACrB,MAAM/d,EAAI,KAAK,IAAIuY,EAAIC,CAAE,EACnBvC,EAAM,GAAGsC,CAAE,IAAIC,CAAE,GACjB,CAAE,OAAAiI,CAAM,EAAK,KACnB,GAAIzgB,IAAM,KAAM,CACd,KAAM,CAAC+W,EAAM+I,CAAO,EAAI9f,EAAE,UAAU,SAAS+d,CAAI,EAC5ChH,EAGH0J,EAAO,OAAOxK,CAAG,EAFjBwK,EAAO,IAAIxK,EAAK6J,CAAO,CAI3B,MACEW,EAAO,OAAOxK,CAAG,EAEnB,MAAO,EACT,CAIA,IAAIjO,EAAMiR,EAAK,CACb,KAAA2B,EAAM,SAAAwF,EAAU,MAAA9d,EAAO,SAAAuX,CAC3B,EAAK,CACD,MAAMyG,EAAY,IAAIH,GACpBvF,EAAMwF,EAAU9d,EAAOuX,CAC7B,EACU7Z,EAAI,KAAK,eAAesgB,CAAS,EACnCtgB,IAAM,KACRA,EAAE,OAAOiZ,CAAG,EAEZ,KAAK,EAAE,KAAK,IAAIoH,GAAWrY,EAAM,CAACiR,CAAG,EAAGqH,CAAS,CAAC,CAEtD,CAEA,eAAeA,EAAW,CACxB,QAASniB,EAAI,EAAGA,EAAI,KAAK,EAAE,OAAQA,GAAK,EAAG,CACzC,MAAM6B,EAAI,KAAK,EAAE7B,CAAC,EAClB,GAAI6B,EAAE,UAAU,OAAOsgB,CAAS,EAC9B,OAAOtgB,CAEX,CACA,OAAO,IACT,CAEA,IAAIuY,EAAIC,EAAI,CACV,QAASra,EAAI,EAAGA,EAAI,KAAK,EAAE,OAAQA,GAAK,EAAG,CACzC,MAAM6B,EAAI,KAAK,EAAE7B,CAAC,EAClB,GAAI6B,EAAE,SAASuY,EAAIC,CAAE,EAAG,OAAOxY,CACjC,CACA,OAAO,IACT,CAEA,OAAO2Z,EAAW,CAChB,KAAK,KAAM9X,GAAO,CAChBA,EAAG,OAAO8X,CAAS,CACrB,CAAC,CACH,CAEA,KAAKlB,EAAI,CACP,KAAK,EAAE,QAAQ5W,GAAM4W,EAAG5W,CAAE,CAAC,CAC7B,CAEA,SAAU,CACR,OAAO,KAAK,EAAE,OAAOA,GAAMA,EAAG,KAAK,OAAS,CAAC,EAAE,IAAIA,GAAMA,EAAG,QAAO,CAAE,CACvE,CAEA,QAAQ5C,EAAG,CACT,KAAK,EAAIA,EAAE,IAAI4C,GAAMwe,GAAW,QAAQxe,CAAE,CAAC,CAC7C,CACF,CC/DA,MAAM6e,GAAkB,CACtB,KAAM,OACN,KAAM,CACJ,OAAQ,IAAM,SAAS,gBAAgB,aACvC,MAAO,IAAM,SAAS,gBAAgB,WAC1C,EACE,SAAU,GACV,YAAa,GACb,gBAAiB,GACjB,cAAe,GACf,IAAK,CACH,IAAK,IACL,OAAQ,EACZ,EACE,IAAK,CACH,IAAK,GACL,MAAO,IACP,WAAY,GACZ,SAAU,EACd,EACE,MAAO,CACL,QAAS,UACT,MAAO,OACP,OAAQ,SACR,SAAU,GACV,OAAQ,GACR,UAAW,GACX,MAAO,UACP,KAAM,CACJ,KAAM,QACN,KAAM,GACN,KAAM,GACN,OAAQ,EACd,EACI,OAAQ,QACZ,CACA,EAEMC,GAAgB,GAChBC,GAAkB,GAIlBC,GAAiB,CAACxF,EAAKpP,IAAS,OAAO,UAAU,eAAe,KAAKoP,EAAKpP,CAAI,EAKpF,SAAS6U,GAASnJ,EAAKoJ,EAAKnQ,EAAQ,IAAM,CAAC,EAAG,CAC5C,KAAM,CAAE,OAAAsK,CAAM,EAAK,KACbvB,EAAYoH,EAAI,MAAK,EACrB,CAACC,EAAKC,CAAG,EAAItJ,EAAI,KAAI,EACrB,CAAC4G,EAAKC,CAAG,EAAIuC,EAAI,KAAI,EAO3B,OANIC,EAAMzC,IACR5E,EAAU,IAAMoH,EAAI,IAAMC,EAAM,GAE9BC,EAAMzC,IACR7E,EAAU,IAAMoH,EAAI,IAAME,EAAM,GAE9B/F,EAAO,WAAWvB,CAAS,GAC7B/I,EAAMrT,GAAE,0BAA0B,CAAC,EAC5B,IAEF,EACT,CACA,SAAS2jB,GAAUlD,EAAcC,EAAcH,EAAMI,EAAW,GAAO,CACrE,KAAM,CAAE,KAAAiD,EAAM,OAAAjG,CAAM,EAAK,MAErB4C,IAAS,OAASA,IAAS,YAC7BqD,EAAK,YAAYlD,EAAcH,CAAI,EACnC5C,EAAO,aAAa+C,CAAY,GAElCkD,EAAK,UAAUnD,EAAcC,EAAcH,EAAMI,EAAU,CAAC3F,EAAIC,EAAI+B,IAAS,CAC3E,GAAIA,GAAQA,EAAK,MAAO,CAEtB,KAAM,CAACQ,EAAIC,CAAE,EAAIT,EAAK,MACtB,GAAIQ,GAAM,GAAKC,GAAM,EAAG,OACxBE,EAAO,IAAI,IAAIjD,GAAUM,EAAIC,EAAID,EAAKwC,EAAIvC,EAAKwC,CAAE,CAAC,CACpD,CACF,CAAC,CACH,CAEA,SAASoG,GAASpD,EAAcC,EAAc,CAC5C,KAAM,CAAE,UAAAoD,EAAW,KAAAF,EAAM,OAAAjG,CAAM,EAAK,KACpCiG,EAAK,SAASnD,EAAcC,CAAY,EACxC/C,EAAO,KAAK8C,EACVC,EAAa,IAAMD,EAAa,IAChCC,EAAa,IAAMD,EAAa,GAAG,EACrCqD,EAAU,MAAK,CACjB,CAGA,SAASC,GAAe/I,EAAIC,EAAI+I,EAAK,CACnC,KAAM,CAAE,OAAAC,EAAQ,KAAAL,CAAI,EAAK,KACnB5G,EAAO4G,EAAK,aAAa5I,EAAIC,CAAE,EACrC,IAAIiJ,EAAS,CAAA,EACTlH,EAAK,QAAU,SACjBkH,EAASjE,GAAO,UAAUgE,EAAOjH,EAAK,KAAK,CAAC,GAE9CkH,EAASjE,GAAO,MAAMiE,EAAQ,CAAE,OAAQF,EAAK,EAC7ChH,EAAK,MAAQ,KAAK,SAASkH,CAAM,CACnC,CAEA,SAASC,GAAgB,CAAE,KAAA1Z,EAAM,MAAA2H,EAAO,MAAAgS,CAAK,EAAI,CAC/C,KAAM,CAAE,OAAAH,EAAQ,SAAAI,EAAU,KAAAT,CAAI,EAAK,KAC7B,CACJ,IAAAjJ,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACnB,EAAMuJ,EAAS,MACPC,EAAW,CAAC,KAAK,iBAAgB,EACvC,GAAI,GAACA,IACC7Z,IAAS,UAAYA,IAAS,cAAgBA,IAAS,cAI7D,GAAIA,IAAS,WAAa,CAAC6Z,EACzBP,GAAe,KAAK,KAAMpJ,EAAKC,EAAK,CAClC,IAAK,CAACxI,EAAOgS,CAAK,EAAG,OAAQ,CAAChS,EAAOgS,CAAK,EAAG,KAAM,CAAChS,EAAOgS,CAAK,EAAG,MAAO,CAAChS,EAAOgS,CAAK,CAC7F,CAAK,UACQ3Z,IAAS,OAClB4Z,EAAS,MAAM,KAAK,CAACrJ,EAAIC,IAAO,CAC9B,MAAM+B,EAAO4G,EAAK,QAAQ5I,EAAIC,CAAE,EAChC,GAAI+B,GAAQA,EAAK,QAAU,OAAW,CACpC,MAAMuH,EAAKtE,GAAO,UAAUgE,EAAOjH,EAAK,KAAK,CAAC,EAC9C,OAAOuH,EAAG,OAIVvH,EAAK,MAAQ,KAAK,SAASuH,CAAE,CAC/B,CACF,CAAC,UACQ9Z,IAAS,OAASA,IAAS,UAAYA,IAAS,WACtDA,IAAS,cAAgBA,IAAS,WAAY,CACjD,MAAMkT,EAAS,CAAA,EACf,QAAS3C,EAAKL,EAAKK,GAAMH,EAAKG,GAAM,EAClC,QAASC,EAAKL,EAAKK,GAAMH,EAAKG,GAAM,EAAG,CAErC,MAAMuJ,EAAe,CAAA,EACrB,QAASxT,EAAK,EAAGA,EAAK2M,EAAO,OAAQ3M,GAAM,EAAG,CAC5C,KAAM,CAACyT,EAAKC,EAAKlH,EAAIC,CAAE,EAAIE,EAAO3M,CAAE,EAEpC,GADIgK,IAAOyJ,EAAMjH,EAAK,GAAGgH,EAAa,KAAKxT,CAAE,EACzCyT,GAAOzJ,GAAMA,GAAMyJ,EAAMjH,GACvBvC,IAAOyJ,EAAK,CACdzJ,GAAMwC,EAAK,EACX,KACF,CAEJ,CAEA,GADA+G,EAAa,QAAQlgB,GAAMqZ,EAAO,OAAOrZ,EAAI,CAAC,CAAC,EAC3C2W,EAAKH,EAAK,MAEd,MAAMkC,EAAO4G,EAAK,QAAQ5I,EAAIC,CAAE,EAChC,GAAI,CAACuC,EAAIC,CAAE,EAAI,CAAC,EAAG,CAAC,EAChBT,GAAQA,EAAK,QACf,CAACQ,EAAIC,CAAE,EAAIT,EAAK,MAChBW,EAAO,KAAK,CAAC3C,EAAIC,EAAIuC,EAAIC,CAAE,CAAC,GAE9B,MAAMkH,EAAMnH,EAAK,GAAKxC,EAAKwC,IAAO3C,EAC5B+J,EAAMnH,EAAK,GAAKxC,EAAKwC,IAAO3C,EAClC,IAAIkJ,EAAM,CAAA,EACNvZ,IAAS,MACXuZ,EAAM,CACJ,OAAQ,CAAC5R,EAAOgS,CAAK,EACrB,IAAK,CAAChS,EAAOgS,CAAK,EAClB,KAAM,CAAChS,EAAOgS,CAAK,EACnB,MAAO,CAAChS,EAAOgS,CAAK,CAChC,EACmB3Z,IAAS,UACd,CAACma,GAAO3J,EAAKH,IAAKkJ,EAAI,MAAQ,CAAC5R,EAAOgS,CAAK,GAC3C,CAACO,GAAO3J,EAAKH,IAAKmJ,EAAI,OAAS,CAAC5R,EAAOgS,CAAK,IACvC3Z,IAAS,aACd,CAACka,GAAO3J,EAAKH,IAAKmJ,EAAI,OAAS,CAAC5R,EAAOgS,CAAK,GACvC3Z,IAAS,WACd,CAACma,GAAO3J,EAAKH,IAAKkJ,EAAI,MAAQ,CAAC5R,EAAOgS,CAAK,GACtC3Z,IAAS,WAAa6Z,IAC3B3J,IAAQK,IAAIgJ,EAAI,IAAM,CAAC5R,EAAOgS,CAAK,IACnCO,GAAO9J,IAAQG,KAAIgJ,EAAI,OAAS,CAAC5R,EAAOgS,CAAK,GAC7CxJ,IAAQK,IAAI+I,EAAI,KAAO,CAAC5R,EAAOgS,CAAK,IACpCQ,GAAO9J,IAAQG,KAAI+I,EAAI,MAAQ,CAAC5R,EAAOgS,CAAK,IAE9C,OAAO,KAAKJ,CAAG,EAAE,OAAS,GAC5BD,GAAe,KAAK,KAAM/I,EAAIC,EAAI+I,CAAG,EAEvC/I,GAAMwC,CACR,CAEJ,SAAWhT,IAAS,OAASA,IAAS,SACpC,QAASwQ,EAAKL,EAAKK,GAAMH,EAAKG,GAAM,EAC9BxQ,IAAS,QACXsZ,GAAe,KAAK,KAAMpJ,EAAKM,EAAI,CAAE,IAAK,CAAC7I,EAAOgS,CAAK,EAAG,EAC1DnJ,GAAM2I,EAAK,aAAajJ,EAAKM,CAAE,EAAE,CAAC,GAEhCxQ,IAAS,WACXsZ,GAAe,KAAK,KAAMlJ,EAAKI,EAAI,CAAE,OAAQ,CAAC7I,EAAOgS,CAAK,EAAG,EAC7DnJ,GAAM2I,EAAK,aAAa/I,EAAKI,CAAE,EAAE,CAAC,WAG7BxQ,IAAS,QAAUA,IAAS,QACrC,QAASuQ,EAAKL,EAAKK,GAAMH,EAAKG,GAAM,EAC9BvQ,IAAS,SACXsZ,GAAe,KAAK,KAAM/I,EAAIJ,EAAK,CAAE,KAAM,CAACxI,EAAOgS,CAAK,EAAG,EAC3DpJ,GAAM4I,EAAK,aAAa5I,EAAIJ,CAAG,EAAE,CAAC,GAEhCnQ,IAAS,UACXsZ,GAAe,KAAK,KAAM/I,EAAIF,EAAK,CAAE,MAAO,CAAC1I,EAAOgS,CAAK,EAAG,EAC5DpJ,GAAM4I,EAAK,aAAa5I,EAAIF,CAAG,EAAE,CAAC,GAI1C,CAEA,SAAS+J,GAAcniB,EAAGoiB,EAAe,CACvC,KAAM,CAAE,KAAAlB,CAAI,EAAK,KACXmB,EAAM,KAAK,kBAAiB,EAElC,IAAI7F,EAAQ0E,EAAK,OACbmB,EAAMnB,EAAK,OAASlhB,IAAGwc,GAAS4F,GAGpC,MAAME,EAAQ,KAAK,aAEnB,IAAIhK,EAAK,EACLiK,EAAM/F,EACN,CAAE,OAAA/M,CAAM,EAAKyR,EACjB,KAAO5I,EAAK4I,EAAK,KACX,EAAAqB,EAAMviB,GADUsY,GAAM,EAErBgK,EAAM,IAAIhK,CAAE,IACf7I,EAASyR,EAAK,UAAU5I,CAAE,EAC1BiK,GAAO9S,GAMX,OAHA8S,GAAO9S,EAGH8S,GAAO,EACF,CAAE,GAAI,GAAI,IAAK,EAAG,OAAA9S,CAAM,EAG1B,CAAE,GAAI6I,EAAK,EAAG,IAAAiK,EAAK,OAAA9S,CAAM,CAClC,CAEA,SAAS+S,GAAc7iB,EAAG8iB,EAAe,CACvC,KAAM,CAAE,KAAAC,CAAI,EAAK,KACXC,EAAM,KAAK,iBAAgB,EACjC,IAAInG,EAAQkG,EAAK,WACbC,EAAMD,EAAK,WAAa/iB,IAAG6c,GAASiG,GACxC,KAAM,CAAClK,EAAIqK,EAAMpT,CAAK,EAAI+N,GAAO,cAC/B,EACAmF,EAAK,IACLlG,EACAkG,EAAK,WACL/iB,EACAzB,GAAKwkB,EAAK,SAASxkB,CAAC,CACxB,EACE,OAAI0kB,GAAQ,EACH,CAAE,GAAI,GAAI,KAAM,EAAG,MAAOF,EAAK,UAAU,EAE3C,CAAE,GAAInK,EAAK,EAAG,KAAAqK,EAAM,MAAApT,CAAK,CAClC,CAEe,MAAMqT,EAAU,CAC7B,YAAY7W,EAAM8W,EAAU,CAC1B,KAAK,SAAWvF,GAAO,MAAMkD,GAAiBqC,GAAY,EAAE,EAE5D,KAAK,KAAO9W,GAAQ,QACpB,KAAK,OAAS,CAAC,EAAG,CAAC,EACnB,KAAK,OAAS,GACd,KAAK,OAAS,IAAIyO,GAClB,KAAK,KAAO,IAAI+C,GAAK,KAAK,SAAS,GAAG,EACtC,KAAK,KAAO,IAAI6B,GAAK,KAAK,SAAS,GAAG,EACtC,KAAK,YAAc,IAAIkB,GACvB,KAAK,WAAa,CAAA,EAClB,KAAK,SAAW,CAAA,EAIhB,KAAK,SAAW,IAAIwC,GACpB,KAAK,OAAS,IAAI5J,GAClB,KAAK,QAAU,IAAIC,GACnB,KAAK,UAAY,IAAIK,GACrB,KAAK,WAAa,IAAIM,GACtB,KAAK,OAAS,IAAM,CAAC,EACrB,KAAK,aAAe,IAAI,IACxB,KAAK,aAAe,IAAI,IACxB,KAAK,eAAiB,IAAI,GAC5B,CAEA,cAAchS,EAAMiR,EAAKqH,EAAW,CAElC,KAAK,WAAW,IAAM,CACpB,KAAK,YAAY,IAAItY,EAAMiR,EAAKqH,CAAS,CAC3C,CAAC,CACH,CAEA,kBAAmB,CACjB,KAAM,CAAE,MAAAxF,GAAU,KAAK,SACvB,KAAK,WAAW,IAAM,CACpB,KAAK,YAAY,OAAOA,CAAK,CAC/B,CAAC,CACH,CAEA,sBAAuB,CACrB,KAAM,CAAE,GAAAvC,EAAI,GAAAC,CAAE,EAAK,KAAK,SAClBxY,EAAI,KAAK,YAAY,IAAIuY,EAAIC,CAAE,EACrC,OAAOxY,EAAIA,EAAE,UAAY,IAC3B,CAEA,uBAAwB,CACtB,KAAM,CAAE,GAAAuY,EAAI,GAAAC,EAAI,MAAAsC,CAAK,EAAK,KAAK,SACzB9a,EAAI,KAAK,YAAY,IAAIuY,EAAIC,CAAE,EAC/BhB,EAAM,CAAE,IAAKsD,EAAM,SAAQ,CAAE,EACnC,OAAI9a,IAAM,OACRwX,EAAI,KAAOxX,EAAE,KACbwX,EAAI,UAAYxX,EAAE,WAEbwX,CACT,CAEA,SAAU,CACR,OAAO,KAAK,QAAQ,QAAO,CAC7B,CAEA,SAAU,CACR,OAAO,KAAK,QAAQ,QAAO,CAC7B,CAEA,MAAO,CACL,KAAK,QAAQ,KAAK,KAAK,QAAO,EAAKvY,GAAM,CACvC,KAAK,QAAQA,CAAC,CAChB,CAAC,CACH,CAEA,MAAO,CACL,KAAK,QAAQ,KAAK,KAAK,QAAO,EAAKA,GAAM,CACvC,KAAK,QAAQA,CAAC,CAChB,CAAC,CACH,CAEA,MAAO,CACL,KAAK,UAAU,KAAK,KAAK,SAAS,KAAK,CACzC,CAEA,uBAAwB,CAEtB,GAAI,UAAU,YAAc,OAC1B,OAEF,IAAIgkB,EAAW,GACf,MAAMC,EAAU,KAAK,KAAK,QAAO,EACjC,QAAS3K,EAAK,KAAK,SAAS,MAAM,IAAKA,GAAM,KAAK,SAAS,MAAM,IAAKA,GAAM,EAAG,CAC7E,GAAIsI,GAAeqC,EAAS3K,CAAE,GAC5B,QAASC,EAAK,KAAK,SAAS,MAAM,IAAKA,GAAM,KAAK,SAAS,MAAM,IAAKA,GAAM,EAI1E,GAHIA,EAAK,KAAK,SAAS,MAAM,MAC3ByK,GAAY,KAEVpC,GAAeqC,EAAQ3K,CAAE,EAAE,MAAOC,CAAE,EAAG,CACzC,MAAM2K,EAAW,OAAOD,EAAQ3K,CAAE,EAAE,MAAMC,CAAE,EAAE,IAAI,EAC7C2K,EAAS,QAAQ;AAAA,CAAI,IAAM,IAAQA,EAAS,QAAQ,GAAI,IAAM,IAAQA,EAAS,QAAQ,GAAG,IAAM,GACnGF,GAAYE,EAEZF,GAAY,IAAIE,CAAQ,GAE5B,MAGF,SAAS3K,EAAK,KAAK,SAAS,MAAM,IAAKA,GAAM,KAAK,SAAS,MAAM,IAAKA,GAAM,EAC1EyK,GAAY,IAGhBA,GAAY;AAAA,CACd,CACA,UAAU,UAAU,UAAUA,CAAQ,EAAE,KAAK,IAAM,CAAC,EAAIxN,GAAQ,CAC9D,QAAQ,IAAI,4CAA6CwN,EAAUxN,CAAG,CACxE,CAAC,CACH,CAEA,KAAM,CACJ,KAAK,UAAU,IAAI,KAAK,SAAS,KAAK,CACxC,CAGA,MAAMqI,EAAO,MAAOlN,EAAQ,IAAM,CAAC,EAAG,CAEpC,KAAM,CAAE,UAAAyQ,EAAW,SAAAO,CAAQ,EAAK,KAEhC,OADIP,EAAU,QAAO,GACjB,CAACP,GAAS,KAAK,KAAMO,EAAU,MAAOO,EAAS,MAAOhR,CAAK,EAAU,IAEzE,KAAK,WAAW,IAAM,CAChByQ,EAAU,SACZH,GAAU,KAAK,KAAMG,EAAU,MAAOO,EAAS,MAAO9D,CAAI,EACjDuD,EAAU,SACnBD,GAAS,KAAK,KAAMC,EAAU,MAAOO,EAAS,KAAK,CAEvD,CAAC,EACM,GACT,CAEA,cAAcwB,EAAK,CACjB,MAAMC,EAAQD,EAAI,MAAM;AAAA,CAAM,EAAE,IAAIvhB,GAAMA,EAAG,QAAQ,KAAM,EAAE,EAAE,MAAM,GAAI,CAAC,EACtEwhB,EAAM,OAAS,IAAGA,EAAM,QAAU,GACtC,KAAM,CAAE,KAAAlC,EAAM,SAAAS,CAAQ,EAAK,KAC3B,KAAK,WAAW,IAAM,CACpBT,EAAK,MAAMkC,EAAOzB,EAAS,KAAK,CAClC,CAAC,CACH,CAEA,SAASjI,EAAWmE,EAAMlN,EAAQ,IAAM,CAAC,EAAG,CAC1C,MAAM0S,EAAW,KAAK,SAAS,MAC/B,OAAKxC,GAAS,KAAK,KAAMwC,EAAU3J,EAAW/I,CAAK,GACnD,KAAK,WAAW,IAAM,CACpBsQ,GAAU,KAAK,KAAMoC,EAAU3J,EAAWmE,EAAM,EAAI,CACtD,CAAC,EACM,IAJsD,EAK/D,CAEA,gBAAiB,CACf,KAAK,UAAU,MAAK,CACtB,CAEA,sBAAsBvF,EAAIC,EAAI,CAC5B,KAAM,CACJ,SAAAoJ,EAAU,KAAAT,EAAM,KAAAwB,EAAM,OAAAzH,CAC5B,EAAQ,KACJ,GAAI,CACF,IAAAhD,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQuJ,EAAS,MACb,MAAM2B,EAAM3B,EAAS,GACf4B,EAAM5B,EAAS,GACrB,GAAI,CAAChD,EAAKC,CAAG,EAAI,CAACtG,EAAIC,CAAE,EACxB,OAAID,EAAK,IAAGqG,EAAMuC,EAAK,IAAM,GACzB3I,EAAK,IAAGqG,EAAM8D,EAAK,IAAM,GACzB/D,EAAM2E,EAAK,CAACrL,EAAKE,CAAG,EAAI,CAACmL,EAAK3E,CAAG,EAChC,CAAC1G,EAAKE,CAAG,EAAI,CAACwG,EAAK2E,CAAG,EACvB1E,EAAM2E,EAAK,CAACrL,EAAKE,CAAG,EAAI,CAACmL,EAAK3E,CAAG,EAChC,CAAC1G,EAAKE,CAAG,EAAI,CAACwG,EAAK2E,CAAG,EAC3B5B,EAAS,MAAQ1G,EAAO,MAAM,IAAIjD,GAChCC,EAAKC,EAAKC,EAAKC,CACrB,CAAK,EACDuJ,EAAS,MAAQ1G,EAAO,MAAM0G,EAAS,KAAK,EAErCA,EAAS,KAClB,CAEA,wBAAwBrJ,EAAIC,EAAI,CAC9B,KAAM,CACJ,SAAAoJ,EAAU,KAAAT,EAAM,KAAAwB,EAAM,OAAAzH,CAC5B,EAAQ,KACJ,IAAIvB,EAAYuB,EAAO,iBAAiB3C,EAAIC,CAAE,EAE9C,OAAImB,IAAc,OAChBA,EAAY,IAAI1B,GAAUM,EAAIC,EAAID,EAAIC,CAAE,EACpCD,IAAO,KACToB,EAAU,IAAM,EAChBA,EAAU,IAAMwH,EAAK,IAAM,GAEzB3I,IAAO,KACTmB,EAAU,IAAM,EAChBA,EAAU,IAAMgJ,EAAK,IAAM,IAG/Bf,EAAS,MAAQjI,EACVA,CACT,CAEA,oBAAoByC,EAAU9Z,EAAO,CACnC,KAAK,WAAW,IAAM,CACpB,KAAM,CAAE,SAAAsf,EAAU,OAAAJ,EAAQ,KAAAL,CAAI,EAAK,KACnC,GAAI/E,IAAa,QACX9Z,EAAO,KAAK,MAAK,EAChB,KAAK,QAAO,UACR8Z,IAAa,SACtBsF,GAAgB,KAAK,KAAMpf,CAAK,UACvB8Z,IAAa,UAAW,CAEjC,KAAM,CAAE,GAAA7D,EAAI,GAAAC,EAAI,MAAAsC,CAAK,EAAK8G,EAC1B,GAAIA,EAAS,WAAY,CACvB,KAAM,CAAC7G,EAAIC,CAAE,EAAI4G,EAAS,KAAI,EACxB,CACJ,IAAA1J,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CAC3B,EAAcyC,EACJ,GAAIC,EAAK,EACP,QAAS5c,EAAIga,EAAKha,GAAKka,EAAKla,GAAK,EAAG,CAClC,MAAMoc,EAAO4G,EAAK,aAAa/I,EAAM,EAAGja,CAAC,EACzCoc,EAAK,KAAO,IAAIjY,CAAK,IAAIsV,GAAQzZ,EAAG+Z,CAAG,CAAC,IAAIN,GAAQzZ,EAAGia,CAAG,CAAC,GAC7D,SACS4C,EAAK,EAAG,CACjB,MAAMT,EAAO4G,EAAK,aAAa5I,EAAIF,EAAM,CAAC,EAC1CkC,EAAK,KAAO,IAAIjY,CAAK,IAAIsV,GAAQO,EAAKI,CAAE,CAAC,IAAIX,GAAQS,EAAKE,CAAE,CAAC,GAC/D,CACF,KAAO,CACL,MAAMgC,EAAO4G,EAAK,aAAa5I,EAAIC,CAAE,EACrC+B,EAAK,KAAO,IAAIjY,CAAK,IACvB,CACF,MACEsf,EAAS,MAAM,KAAK,CAACrJ,EAAIC,IAAO,CAC9B,MAAM+B,EAAO4G,EAAK,aAAa5I,EAAIC,CAAE,EACrC,IAAIiJ,EAAS,CAAA,EAIb,GAHIlH,EAAK,QAAU,SACjBkH,EAASjE,GAAO,UAAUgE,EAAOjH,EAAK,KAAK,CAAC,GAE1C6B,IAAa,SACfqF,EAAO,OAASnf,EAChBiY,EAAK,MAAQ,KAAK,SAASkH,CAAM,UACxBrF,IAAa,aAAeA,IAAa,eAC/CA,IAAa,aAAeA,IAAa,YAAa,CACzD,MAAMqH,EAAQ,CAAA,EACdA,EAAMrH,EAAS,MAAM,GAAG,EAAE,CAAC,CAAC,EAAI9Z,EAChCmf,EAAO,KAAO,OAAO,OAAOA,EAAO,MAAQ,CAAA,EAAIgC,CAAK,EACpDlJ,EAAK,MAAQ,KAAK,SAASkH,CAAM,CACnC,MAAWrF,IAAa,UAAYA,IAAa,YAC5CA,IAAa,aACbA,IAAa,SAAWA,IAAa,UACrCA,IAAa,SAAWA,IAAa,WACxCqF,EAAOrF,CAAQ,EAAI9Z,EACnBiY,EAAK,MAAQ,KAAK,SAASkH,CAAM,GAEjClH,EAAK6B,CAAQ,EAAI9Z,CAErB,CAAC,CAEL,CAAC,CACH,CAGA,oBAAoByb,EAAM2F,EAAQ,QAAS,CACzC,KAAM,CAAE,WAAAC,EAAY,SAAA/B,EAAU,KAAAT,CAAI,EAAK,KACjC,CAAE,GAAA5I,EAAI,GAAAC,CAAE,EAAKoJ,EACnB,IAAIhD,EAAMrG,EACN,KAAK,eAAe,IAAIA,CAAE,IAC5BqG,EAAM,KAAK,eAAe,IAAIrG,CAAE,GAElC,MAAMqL,EAAUzC,EAAK,QAAQvC,EAAKpG,CAAE,EAC9BqL,EAAUD,EAAUA,EAAQ,KAAO,GAGzC,GAFA,KAAK,YAAYhF,EAAKpG,EAAIuF,EAAM2F,CAAK,EAEjCC,EAAW,SAAU,CACvB,MAAMxJ,EAASwJ,EAAW,UAAUnL,CAAE,EACtC,GAAI2B,EAAQ,CACV,MAAM2J,EAAS3J,EAAO,MAAM,UAAUna,GAAKA,IAAM6jB,CAAO,EACpDC,GAAU,GACZ3J,EAAO,MAAM,OAAO2J,EAAQ,EAAG/F,CAAI,CAGvC,CACF,CAEF,CAEA,iBAAkB,CAChB,KAAM,CAAE,GAAAxF,EAAI,GAAAC,CAAE,EAAK,KAAK,SACxB,IAAIoG,EAAMrG,EACV,OAAI,KAAK,eAAe,IAAIA,CAAE,IAC5BqG,EAAM,KAAK,eAAe,IAAIrG,CAAE,GAE3B,KAAK,KAAK,QAAQqG,EAAKpG,CAAE,CAClC,CAEA,iBAAiB5Y,EAAGK,EAAG,CACrB,KAAM,CACJ,KAAA4iB,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACxB,EAAQ,KAAK,gBAAe,EAClBqU,EAAKnkB,EAAI,KAAK,KAAK,WACnBokB,EAAK/jB,EAAI,KAAK,KAAK,OAEzB,OAAO8jB,EAAKlB,GAAQkB,EAAMlB,EAAOpT,GAC5BuU,EAAKxB,GAAOwB,EAAMxB,EAAM9S,CAC/B,CAEA,iBAAkB,CAChB,OAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,CACzC,CAEA,kBAAmB,CACjB,KAAM,CAAE,UAAA2R,CAAS,EAAK,KACtB,OAAKA,EAAU,UAGR,CAAE,KAAM,KAAM,IAAK,IAAI,EAFrB,KAAK,QAAQA,EAAU,KAAK,CAGvC,CAEA,QAAQ1H,EAAW,CACjB,KAAM,CACJ,OAAAsK,EAAQ,KAAA9C,EAAM,KAAAwB,EAAM,aAAAuB,CAC1B,EAAQ,KACE,CACJ,IAAAhM,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQsB,EAGJ,GAAIzB,EAAM,GAAKC,EAAM,EACnB,MAAO,CACL,KAAM,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,OAAA8L,CACrC,EAEI,MAAMpB,EAAOF,EAAK,SAAS,EAAGxK,CAAG,EAC3BqK,EAAMrB,EAAK,UAAU,EAAGjJ,EAAKgM,CAAY,EACzCxU,EAASyR,EAAK,UAAUjJ,EAAKE,EAAM,EAAG8L,CAAY,EAClDzU,EAAQkT,EAAK,SAASxK,EAAKE,EAAM,CAAC,EAExC,IAAI8L,EAAQtB,EAAOoB,EAAO,EACtBG,EAAO5B,EAAMyB,EAAO,EACxB,MAAM3B,EAAM,KAAK,kBAAiB,EAC5BM,EAAM,KAAK,iBAAgB,EACjC,OAAIA,EAAM,GAAKA,EAAMC,IACnBsB,EAAQtB,GAENP,EAAM,GAAKA,EAAME,IACnB4B,EAAO5B,GAEF,CACL,EAAGK,EACH,EAAGL,EACH,KAAM2B,EACN,IAAKC,EACL,OAAA1U,EACA,MAAAD,EACA,OAAAwU,CACN,CACE,CAEA,gBAAgBrkB,EAAGK,EAAG,CACpB,KAAM,CACJ,OAAAgkB,EAAQ,OAAA/I,EAAQ,KAAAiG,EAAM,KAAAwB,CAC5B,EAAQ,KACJ,GAAI,CAAE,GAAApK,EAAI,IAAAiK,EAAK,OAAA9S,GAAW0S,GAAc,KAAK,KAAMniB,EAAGgkB,EAAO,CAAC,EAC1D,CAAE,GAAAzL,EAAI,KAAAqK,EAAM,MAAApT,GAAUgT,GAAc,KAAK,KAAM7iB,EAAGqkB,EAAO,CAAC,EAO9D,GANIzL,IAAO,KACT/I,EAAQkT,EAAK,WAAU,GAErBpK,IAAO,KACT7I,EAASyR,EAAK,YAAW,GAEvB5I,GAAM,GAAKC,GAAM,EAAG,CACtB,MAAM2C,EAAQD,EAAO,iBAAiB3C,EAAIC,CAAE,EACxC2C,IACF5C,EAAK4C,EAAM,IACX3C,EAAK2C,EAAM,IACV,CACC,KAAA0H,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CAC5B,EAAY,KAAK,SAAS6I,EAAIC,CAAE,EAE5B,CACA,MAAO,CACL,GAAAD,EAAI,GAAAC,EAAI,KAAAqK,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CAChC,CACE,CAEA,kBAAmB,CACjB,KAAM,CACJ,IAAAwI,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KAAK,SAAS,MACZkC,EAAO,KAAK,QAAQrC,EAAKC,CAAG,EAClC,GAAIoC,GAAQA,EAAK,MAAO,CACtB,KAAM,CAACQ,EAAIC,CAAE,EAAIT,EAAK,MACtB,GAAIrC,EAAM6C,IAAO3C,GAAOD,EAAM6C,IAAO3C,EAAK,MAAO,EACnD,CACA,MAAO,CAAC,KAAK,SAAS,SAAQ,CAChC,CAEA,YAAa,CACX,KAAM,CACJ,IAAAH,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KAAK,SAAS,MACZkC,EAAO,KAAK,QAAQrC,EAAKC,CAAG,EAClC,GAAIoC,GAAQA,EAAK,MAAO,CACtB,KAAM,CAACQ,EAAIC,CAAE,EAAIT,EAAK,MACtB,GAAIrC,EAAM6C,IAAO3C,GAAOD,EAAM6C,IAAO3C,EAAK,MAAO,EACnD,CACA,MAAO,EACT,CAEA,OAAQ,CACN,KAAM,CAAE,SAAAuJ,EAAU,KAAAT,CAAI,EAAK,KAC3B,GAAI,KAAK,mBAAoB,OAC7B,KAAM,CAACpG,EAAIC,CAAE,EAAI4G,EAAS,KAAI,EAE9B,GAAI7G,EAAK,GAAKC,EAAK,EAAG,CACpB,KAAM,CAAE,IAAA9C,EAAK,IAAAC,CAAG,EAAKyJ,EAAS,MAC9B,KAAK,WAAW,IAAM,CACpB,MAAMrH,EAAO4G,EAAK,aAAajJ,EAAKC,CAAG,EACvCoC,EAAK,MAAQ,CAACQ,EAAK,EAAGC,EAAK,CAAC,EAC5B,KAAK,OAAO,IAAI4G,EAAS,KAAK,EAE9B,KAAK,KAAK,YAAYA,EAAS,KAAK,EAEpC,KAAK,KAAK,QAAQ1J,EAAKC,EAAKoC,CAAI,CAClC,CAAC,CACH,CACF,CAEA,SAAU,CACR,KAAM,CAAE,SAAAqH,CAAQ,EAAK,KACrB,GAAI,CAAC,KAAK,mBAAoB,OAC9B,KAAM,CAAE,IAAA1J,EAAK,IAAAC,CAAG,EAAKyJ,EAAS,MAC9B,KAAK,WAAW,IAAM,CACpB,KAAK,KAAK,WAAW1J,EAAKC,EAAK,OAAO,EACtC,KAAK,OAAO,aAAayJ,EAAS,KAAK,CACzC,CAAC,CACH,CAEA,eAAgB,CACd,MAAO,CAAC,KAAK,WAAW,OAAM,CAChC,CAEA,YAAa,CACX,KAAM,CAAE,WAAA+B,EAAY,SAAA/B,CAAQ,EAAK,KACjC,KAAK,WAAW,IAAM,CAChB+B,EAAW,UACbA,EAAW,MAAK,EAChB,KAAK,aAAe,IAAI,IACxB,KAAK,aAAe,IAAI,IACxB,KAAK,eAAiB,IAAI,KAE1BA,EAAW,IAAM/B,EAAS,MAAM,SAAQ,CAE5C,CAAC,CACH,CAEA,cAAcpJ,EAAIuB,EAAOF,EAAUvX,EAAO,CACxC,KAAM,CAAE,WAAAqhB,CAAU,EAAK,KACvBA,EAAW,UAAUnL,EAAIqB,EAAUvX,CAAK,EACxCqhB,EAAW,QAAQnL,EAAIuB,CAAK,EAC5B,KAAK,gBAAe,CACtB,CAEA,iBAAkB,CAChB,KAAM,CAAE,WAAA4J,EAAY,KAAAxC,CAAI,EAAK,KAC7B,GAAI,CAACwC,EAAW,SAAU,OAC1B,KAAM,CAAE,KAAAzJ,CAAI,EAAKyJ,EACX,CAAE,KAAAtJ,EAAM,KAAAC,GAASqJ,EAAW,aAAa,CAAC9lB,EAAGO,IAAM+iB,EAAK,QAAQtjB,EAAGO,CAAC,CAAC,EACrEimB,EAAO,MAAM,KAAK/J,CAAI,EACtBgK,EAAS,MAAM,KAAKhK,CAAI,EAC1BJ,GACFmK,EAAK,KAAK,CAACnmB,EAAGwB,IACRwa,EAAK,QAAU,MAAchc,EAAIwB,EACjCwa,EAAK,QAAU,OAAexa,EAAIxB,EAC/B,CACR,EAEH,KAAK,aAAemc,EACpB,KAAK,aAAe,IAAI,IACxB,KAAK,eAAiB,IAAI,IAC1BgK,EAAK,QAAQ,CAACxiB,EAAIoF,IAAU,CAC1B,KAAK,aAAa,IAAIqd,EAAOrd,CAAK,EAAGpF,CAAE,EACvC,KAAK,eAAe,IAAIA,EAAIyiB,EAAOrd,CAAK,CAAC,CAC3C,CAAC,CACH,CAEA,WAAW6W,EAAO,MAAO,CACvB,KAAM,CAAE,SAAA8D,CAAQ,EAAK,KACrB,KAAK,WAAW,IAAM,CACpB,KAAK,KAAK,YAAYA,EAAS,MAAO9D,CAAI,GACtCA,IAAS,OAASA,IAAS,WAC7B,KAAK,OAAO,aAAa8D,EAAS,KAAK,CAE3C,CAAC,CACH,CAGA,OAAOhH,EAAMtd,EAAI,EAAG,CAClB,KAAK,WAAW,IAAM,CACpB,KAAM,CAAE,IAAA4a,EAAK,IAAAC,CAAG,EAAK,KAAK,SAAS,MAC7B,CAAE,KAAAgJ,EAAM,OAAAjG,EAAQ,KAAAyH,CAAI,EAAK,KAC/B,IAAI4B,EAAKrM,EACL0C,IAAS,MACXuG,EAAK,OAAOjJ,EAAK5a,CAAC,EACTsd,IAAS,WAClBuG,EAAK,aAAahJ,EAAK7a,CAAC,EACxBinB,EAAKpM,EACLwK,EAAK,KAAO,GAEdzH,EAAO,MAAMN,EAAM2J,EAAIjnB,EAAG,CAACib,EAAIC,EAAIuC,EAAIC,IAAO,CAC5C,MAAMT,EAAO4G,EAAK,QAAQ5I,EAAIC,CAAE,EAChC+B,EAAK,MAAM,CAAC,GAAKQ,EACjBR,EAAK,MAAM,CAAC,GAAKS,CACnB,CAAC,CACH,CAAC,CACH,CAGA,OAAOJ,EAAM,CACX,KAAK,WAAW,IAAM,CACpB,KAAM,CACJ,KAAAuG,EAAM,OAAAjG,EAAQ,SAAA0G,EAAU,KAAAe,CAChC,EAAU,KACE,CAAE,MAAA7H,CAAK,EAAK8G,EACZ,CACJ,IAAA1J,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACvB,EAAUuJ,EAAS,MACP,CAAC4C,EAAOC,CAAK,EAAI7C,EAAS,MAAM,KAAI,EAC1C,IAAI2C,EAAKrM,EACLgE,EAAOsI,EACP5J,IAAS,MACXuG,EAAK,OAAOjJ,EAAKE,CAAG,EACXwC,IAAS,WAClBuG,EAAK,aAAahJ,EAAKE,CAAG,EAC1BkM,EAAKzJ,EAAM,IACXoB,EAAOuI,EACP9B,EAAK,KAAO,GAGdzH,EAAO,MAAMN,EAAM2J,EAAI,CAACrI,EAAM,CAAC3D,EAAIC,EAAIuC,EAAIC,IAAO,CAEhD,MAAMT,EAAO4G,EAAK,QAAQ5I,EAAIC,CAAE,EAChC+B,EAAK,MAAM,CAAC,GAAKQ,EACjBR,EAAK,MAAM,CAAC,GAAKS,EACbT,EAAK,MAAM,CAAC,IAAM,GAAKA,EAAK,MAAM,CAAC,IAAM,GAC3C,OAAOA,EAAK,KAEhB,CAAC,CACH,CAAC,CACH,CAEA,QAAQ3a,EAAG6Y,EAAI,CACb,KAAM,CAAE,OAAAwL,EAAQ,OAAAS,EAAQ,KAAA/B,CAAI,EAAK,KAC3B,CAAA,CAAGgC,CAAG,EAAID,EACV,CACJlM,EAAIqK,EAAMpT,CAChB,EAAQ+N,GAAO,cAAcmH,EAAKhC,EAAK,IAAK,EAAG,EAAG/iB,EAAGzB,GAAKwkB,EAAK,SAASxkB,CAAC,CAAC,EAEtE,IAAI4lB,EAAKlB,EACLjjB,EAAI,IAAGmkB,GAAMtU,GACbwU,EAAO,IAAMF,IACfE,EAAO,GAAKrkB,EAAI,EAAI4Y,EAAK,EACzByL,EAAO,EAAIF,EACXtL,EAAE,EAEN,CAEA,QAAQxY,EAAGwY,EAAI,CACb,KAAM,CAAE,OAAAwL,EAAQ,OAAAS,EAAQ,KAAAvD,CAAI,EAAK,KAC3B,CAACyD,CAAG,EAAIF,EACR,CACJnM,EAAIiK,EAAK9S,CACf,EAAQ8N,GAAO,cAAcoH,EAAKzD,EAAK,IAAK,EAAG,EAAGlhB,EAAG9B,GAAKgjB,EAAK,UAAUhjB,CAAC,CAAC,EACvE,IAAI6lB,EAAKxB,EACLviB,EAAI,IAAG+jB,GAAMtU,GAEbuU,EAAO,IAAMD,IACfC,EAAO,GAAKhkB,EAAI,EAAIsY,EAAK,EACzB0L,EAAO,EAAID,EACXvL,EAAE,EAEN,CAEA,SAASF,EAAIC,EAAI,CACf,KAAM,CAAE,KAAA2I,EAAM,KAAAwB,CAAI,EAAK,KACjBE,EAAOF,EAAK,SAAS,EAAGnK,CAAE,EAC1BgK,EAAMrB,EAAK,UAAU,EAAG5I,CAAE,EAC1BgC,EAAO4G,EAAK,QAAQ5I,EAAIC,CAAE,EAChC,IAAI/I,EAAQkT,EAAK,SAASnK,CAAE,EACxB9I,EAASyR,EAAK,UAAU5I,CAAE,EAC9B,GAAIgC,IAAS,MACPA,EAAK,MAAO,CACd,KAAM,CAACQ,EAAIC,CAAE,EAAIT,EAAK,MAEtB,GAAIQ,EAAK,EACP,QAAS5c,EAAI,EAAGA,GAAK4c,EAAI5c,GAAK,EAC5BuR,GAAUyR,EAAK,UAAU5I,EAAKpa,CAAC,EAGnC,GAAI6c,EAAK,EACP,QAAS7c,EAAI,EAAGA,GAAK6c,EAAI7c,GAAK,EAC5BsR,GAASkT,EAAK,SAASnK,EAAKra,CAAC,CAGnC,CAGF,MAAO,CACL,KAAA0kB,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,EAAQ,KAAA6K,CAChC,CACE,CAEA,QAAQhC,EAAIC,EAAI,CACd,OAAO,KAAK,KAAK,QAAQD,EAAIC,CAAE,CACjC,CAEA,qBAAqBD,EAAIC,EAAI,CAC3B,MAAM+B,EAAO,KAAK,QAAQhC,EAAIC,CAAE,EAChC,OAAQ+B,GAAQA,EAAK,KAAQA,EAAK,KAAO,EAC3C,CAEA,aAAahC,EAAIC,EAAI,CACnB,MAAM+B,EAAO,KAAK,QAAQhC,EAAIC,CAAE,EAChC,OAAI+B,GAAQA,EAAK,QAAU,OAClB,KAAK,OAAOA,EAAK,KAAK,EAExB,IACT,CAEA,sBAAsBhC,EAAIC,EAAI,CAC5B,KAAM,CAAE,OAAAgJ,EAAQ,KAAAL,CAAI,EAAK,KACnB5G,EAAO4G,EAAK,QAAQ5I,EAAIC,CAAE,EAC1BqM,EAAatK,GAAQA,EAAK,QAAU,OAAaiH,EAAOjH,EAAK,KAAK,EAAI,CAAA,EAC5E,OAAOiD,GAAO,MAAM,KAAK,aAAY,EAAIqH,CAAS,CACpD,CAEA,sBAAuB,CACrB,KAAM,CAAE,GAAAtM,EAAI,GAAAC,CAAE,EAAK,KAAK,SACxB,OAAO,KAAK,sBAAsBD,EAAIC,CAAE,CAC1C,CAGA,YAAYD,EAAIC,EAAIuF,EAAM2F,EAAO,CAC/B,KAAM,CAAE,KAAAvC,EAAM,QAAA2D,EAAS,YAAAC,CAAW,EAAK,KACnCrB,IAAU,YACZvC,EAAK,YAAY5I,EAAIC,EAAI,EAAE,EAC3BsM,EAAQ,IAAI,KAAK,SAAS,EAC1B3D,EAAK,YAAY5I,EAAIC,EAAIuF,CAAI,IAE7BoD,EAAK,YAAY5I,EAAIC,EAAIuF,CAAI,EAC7B,KAAK,OAAO,KAAK,SAAS,GAG5BgH,EAAY,SAASxM,EAAIC,EAAIuF,CAAI,CACnC,CAEA,gBAAiB,CACf,KAAM,CAACxF,EAAIC,CAAE,EAAI,KAAK,OACtB,OAAOD,EAAK,GAAKC,EAAK,CACxB,CAEA,UAAUD,EAAIC,EAAI,CAChB,KAAK,WAAW,IAAM,CACpB,KAAK,OAAS,CAACD,EAAIC,CAAE,CACvB,CAAC,CACH,CAEA,kBAAmB,CACjB,OAAO,KAAK,KAAK,SAAS,EAAG,KAAK,OAAO,CAAC,CAAC,CAC7C,CAEA,mBAAoB,CAClB,OAAO,KAAK,KAAK,UAAU,EAAG,KAAK,OAAO,CAAC,CAAC,CAC9C,CAEA,aAAaD,EAAI7I,EAAQ,CACvB,KAAK,WAAW,IAAM,CACpB,KAAK,KAAK,UAAU6I,EAAI7I,CAAM,CAChC,CAAC,CACH,CAEA,YAAY8I,EAAI/I,EAAO,CACrB,KAAK,WAAW,IAAM,CACpB,KAAK,KAAK,SAAS+I,EAAI/I,CAAK,CAC9B,CAAC,CACH,CAEA,YAAa,CACX,KAAM,CAAE,KAAAuV,EAAM,YAAAC,EAAa,cAAAC,CAAa,EAAK,KAAK,SAClD,IAAIvlB,EAAIqlB,EAAK,OAAM,EACnB,OAAIE,IACFvlB,GAAKihB,IAEHqE,IACFtlB,GAAKghB,IAEAhhB,CACT,CAEA,WAAY,CACV,OAAO,KAAK,SAAS,KAAK,MAAK,CACjC,CAEA,iBAAkB,CAChB,KAAM,CAAC4Y,EAAIC,CAAE,EAAI,KAAK,OACtB,OAAO,IAAIP,GAAU,EAAG,EAAGM,EAAK,EAAGC,EAAK,EAAG,KAAK,iBAAgB,EAAI,KAAK,kBAAiB,CAAE,CAC9F,CAEA,cAAe,CACb,KAAM,CAAE,KAAA2I,EAAM,KAAAwB,CAAI,EAAK,KACjB,CAACpK,EAAIC,CAAE,EAAI2I,EAAK,QAAO,EACvBxhB,EAAIwhB,EAAK,UAAU,EAAG5I,EAAK,CAAC,EAC5B1Y,EAAI8iB,EAAK,SAAS,EAAGnK,EAAK,CAAC,EACjC,OAAO,IAAIP,GAAU,EAAG,EAAGM,EAAIC,EAAI3Y,EAAGF,CAAC,CACzC,CAEA,qBAAqBuY,EAAKE,EAAK,CAC7B,KAAM,CAAE,aAAA8L,EAAc,KAAA/C,CAAI,EAAK,KACzBgE,EAAa,MAAM,KAAKjB,CAAY,EAC1C,IAAIkB,EAAc,EAClB,OAAAD,EAAW,QAAS5M,GAAO,CACzB,GAAIA,EAAKL,GAAOK,EAAKH,EAAK,CACxB,MAAM1I,EAASyR,EAAK,UAAU5I,CAAE,EAChC6M,GAAe1V,CACjB,CACF,CAAC,EACM0V,CACT,CAEA,WAAY,CACV,KAAM,CACJ,OAAAnB,EAAQ,KAAA9C,EAAM,KAAAwB,EAAM,OAAA+B,EAAQ,aAAAR,CAClC,EAAQ,KAEJ,GAAI,CAAE,GAAA3L,EAAI,GAAAC,CAAE,EAAKyL,EACb1L,GAAM,IAAG,CAACA,CAAE,EAAImM,GAChBlM,GAAM,IAAG,CAAA,CAAGA,CAAE,EAAIkM,GAEtB,GAAI,CAAC9kB,EAAGK,CAAC,EAAI,CAAC,EAAG,CAAC,EACd,CAACmY,EAAKC,CAAG,EAAI,CAAC8I,EAAK,IAAKwB,EAAK,GAAG,EACpC,QAASxkB,EAAIoa,EAAIpa,EAAIgjB,EAAK,MACnB+C,EAAa,IAAI/lB,CAAC,IACrB8B,GAAKkhB,EAAK,UAAUhjB,CAAC,EACrBia,EAAMja,GAEJ,EAAA8B,EAAI,KAAK,eALgB9B,GAAK,EAKlC,CAEF,QAASf,EAAIob,EAAIpb,EAAIulB,EAAK,MACxB/iB,GAAK+iB,EAAK,SAASvlB,CAAC,EACpBib,EAAMjb,EACF,EAAAwC,EAAI,KAAK,cAHgBxC,GAAK,EAGlC,CAGF,OAAO,IAAI6a,GAAUM,EAAIC,EAAIJ,EAAKC,EAAKzY,EAAGK,CAAC,CAC7C,CAEA,iBAAiBolB,EAAW5M,EAAI,CAC9B,KAAK,OAAO,iBAAiB4M,CAAS,EACnC,QAAQxjB,GAAM4W,EAAG5W,CAAE,CAAC,CACzB,CAEA,gBAAiB,CACf,KAAM,CAAE,KAAAsf,EAAM,KAAAwB,EAAM,SAAAf,CAAQ,EAAK,KAC3B,CAAC0D,EAAMC,CAAI,EAAI3D,EAAS,KAAI,EAC5B,CACJ,IAAA1J,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQuJ,EAAS,MACb,GAAI0D,IAASnE,EAAK,IAChB,QAAS3I,EAAKL,EAAKK,GAAMH,EAAKG,GAAM,EAClCmK,EAAK,QAAQnK,EAAI,EAAI,UAEd+M,IAAS5C,EAAK,IACvB,QAASpK,EAAKL,EAAKK,GAAMH,EAAKG,GAAM,EAClC4I,EAAK,QAAQ5I,EAAI,EAAI,CAG3B,CAIA,iBAAiBqC,EAAM3T,EAAO,CAC5B,KAAK,GAAG2T,CAAI,GAAG,EAAE,OAAO3T,CAAK,CAC/B,CAEA,QAAQsV,EAAKC,EAAK/D,EAAI,CACpB,IAAIxY,EAAI,EACR,KAAM,CAAE,KAAAkhB,CAAI,EAAK,KACXoB,EAAQ,KAAK,aACbiD,EAAQ,CAAC,GAAGjD,CAAK,EACvB,IAAIkD,EAAS,EACb,QAAStnB,EAAI,EAAGA,EAAIqnB,EAAM,OAAQrnB,GAAK,EACjCqnB,EAAMrnB,CAAC,EAAIoe,IACbkJ,GAAU,GAId,QAAStnB,EAAIoe,EAAMkJ,EAAQtnB,GAAKqe,EAAMiJ,EAAQtnB,GAAK,EACjD,GAAIokB,EAAM,IAAIpkB,CAAC,EACbsnB,GAAU,MACL,CACL,MAAMC,EAAYvE,EAAK,UAAUhjB,CAAC,EAClC,GAAIunB,EAAY,IACdjN,EAAGta,EAAG8B,EAAGylB,CAAS,EAClBzlB,GAAKylB,EACDzlB,EAAI,KAAK,cAAc,KAE/B,CAEJ,CAEA,QAAQsc,EAAKC,EAAK/D,EAAI,CACpB,IAAI7Y,EAAI,EACR,KAAM,CAAE,KAAA+iB,CAAI,EAAK,KACjB,QAASxkB,EAAIoe,EAAKpe,GAAKqe,EAAKre,GAAK,EAAG,CAClC,MAAMwnB,EAAWhD,EAAK,SAASxkB,CAAC,EAChC,GAAIwnB,EAAW,IACblN,EAAGta,EAAGyB,EAAG+lB,CAAQ,EACjB/lB,GAAK+lB,EACD/lB,EAAI,KAAK,aAAa,KAE9B,CACF,CAEA,cAAe,CACb,OAAO,KAAK,SAAS,KACvB,CAEA,SAASgmB,EAAQ,CACf,KAAM,CAAE,OAAApE,CAAM,EAAK,KAEnB,QAASrjB,EAAI,EAAGA,EAAIqjB,EAAO,OAAQrjB,GAAK,EAAG,CACzC,MAAMwR,EAAQ6R,EAAOrjB,CAAC,EACtB,GAAIqf,GAAO,OAAO7N,EAAOiW,CAAM,EAAG,OAAOznB,CAC3C,CACA,OAAAqjB,EAAO,KAAKoE,CAAM,EACXpE,EAAO,OAAS,CACzB,CAEA,WAAW/I,EAAI,CACb,KAAK,QAAQ,IAAI,KAAK,QAAO,CAAE,EAC/BA,EAAE,EACF,KAAK,OAAO,KAAK,SAAS,CAC5B,CAEA,QAAQxZ,EAAG,CACT,cAAO,KAAKA,CAAC,EAAE,QAASmd,GAAa,CACnC,GAAIA,IAAa,UAAYA,IAAa,QACrCA,IAAa,QAAUA,IAAa,cACvC,KAAKA,CAAQ,EAAE,QAAQnd,EAAEmd,CAAQ,CAAC,UACzBA,IAAa,SAAU,CAChC,KAAM,CAACxc,EAAGK,CAAC,EAAIyX,GAAQzY,EAAEmd,CAAQ,CAAC,EAClC,KAAK,OAAS,CAACnc,EAAGL,CAAC,CACrB,MAAWwc,IAAa,aACtB,KAAK,WAAW,QAAQnd,EAAEmd,CAAQ,CAAC,EAC1Bnd,EAAEmd,CAAQ,IAAM,SACzB,KAAKA,CAAQ,EAAInd,EAAEmd,CAAQ,EAE/B,CAAC,EACM,IACT,CAEA,SAAU,CACR,KAAM,CACJ,KAAAnQ,EAAM,OAAAyY,EAAQ,OAAAlD,EAAQ,OAAAtG,EAAQ,KAAAiG,EAAM,KAAAwB,EAAM,YAAAoC,EAAa,WAAApB,CAC7D,EAAQ,KACJ,MAAO,CACL,KAAA1X,EACA,OAAQ2L,GAAQ8M,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EACpC,OAAAlD,EACA,OAAQtG,EAAO,QAAO,EACtB,KAAMiG,EAAK,QAAO,EAClB,KAAMwB,EAAK,QAAO,EAClB,YAAaoC,EAAY,QAAO,EAChC,WAAYpB,EAAW,QAAO,CACpC,CACE,CACF,CCtrCO,SAASkC,GAAKC,EAAQ7Z,EAAM8Z,EAAI,CACrCD,EAAO,iBAAiB7Z,EAAM8Z,CAAE,CAClC,CACO,SAASC,GAAOF,EAAQ7Z,EAAM8Z,EAAI,CACvCD,EAAO,oBAAoB7Z,EAAM8Z,CAAE,CACrC,CACO,SAASE,GAAmBvZ,EAAI,CACjCA,EAAG,gBACLsZ,GAAO,OAAO,SAAS,KAAM,QAAStZ,EAAG,aAAa,EACtD,OAAOA,EAAG,cAEd,CAKO,SAASwZ,GAAiBxZ,EAAI+L,EAAI,CACvC/L,EAAG,cAAiB4J,GAAQ,CAGtBA,EAAI,SAAW,GAAK5J,EAAG,SAAS4J,EAAI,MAAM,IAC1CmC,EAAIA,EAAG/L,CAAE,GAEXA,EAAG,KAAI,EACPuZ,GAAmBvZ,CAAE,GAEzB,EACAmZ,GAAK,OAAO,SAAS,KAAM,QAASnZ,EAAG,aAAa,CACtD,CACO,SAASyZ,GAAYL,EAAQM,EAAUC,EAAQ,CACpDR,GAAKC,EAAQ,YAAaM,CAAQ,EAClC,MAAM7oB,EAAIuoB,EACVvoB,EAAE,OAAU+Y,GAAQ,CAElB0P,GAAOF,EAAQ,YAAaM,CAAQ,EACpCJ,GAAOF,EAAQ,UAAWA,EAAO,MAAM,EACvCO,EAAO/P,CAAG,CACZ,EACAuP,GAAKC,EAAQ,UAAWA,EAAO,MAAM,CACvC,CAEA,SAASQ,GAAkBC,EAAOC,EAAOlQ,EAAKmC,EAAI,CAChD,IAAIgO,EAAY,GAEZ,KAAK,IAAIF,CAAK,EAAI,KAAK,IAAIC,CAAK,GAElCC,EAAYF,EAAQ,EAAI,QAAU,OAClC9N,EAAGgO,EAAWF,EAAOjQ,CAAG,IAGxBmQ,EAAYD,EAAQ,EAAI,OAAS,KACjC/N,EAAGgO,EAAWD,EAAOlQ,CAAG,EAE5B,CAEO,SAASoQ,GAAUZ,EAAQ,CAAE,KAAAa,EAAM,IAAAC,CAAG,EAAI,CAC/C,IAAIC,EAAS,EACTC,EAAS,EACbjB,GAAKC,EAAQ,aAAexP,GAAQ,CAClC,KAAM,CAAE,MAAAyQ,EAAO,MAAAC,CAAK,EAAK1Q,EAAI,QAAQ,CAAC,EACtCuQ,EAASE,EACTD,EAASE,CACX,CAAC,EACDnB,GAAKC,EAAQ,YAAcxP,GAAQ,CACjC,GAAI,CAACqQ,EAAM,OACX,KAAM,CAAE,MAAAI,EAAO,MAAAC,CAAK,EAAK1Q,EAAI,eAAe,CAAC,EACvCiQ,EAAQQ,EAAQF,EAChBL,EAAQQ,EAAQF,GAClB,KAAK,IAAIP,CAAK,EAAI,IAAM,KAAK,IAAIC,CAAK,EAAI,MAE5CF,GAAkBC,EAAOC,EAAOlQ,EAAKqQ,CAAI,EACzCE,EAASE,EACTD,EAASE,GAEX1Q,EAAI,eAAc,CACpB,CAAC,EACDuP,GAAKC,EAAQ,WAAaxP,GAAQ,CAChC,GAAI,CAACsQ,EAAK,OACV,KAAM,CAAE,MAAAG,EAAO,MAAAC,CAAK,EAAK1Q,EAAI,eAAe,CAAC,EACvCiQ,EAAQQ,EAAQF,EAChBL,EAAQQ,EAAQF,EACtBR,GAAkBC,EAAOC,EAAOlQ,EAAKsQ,CAAG,CAC1C,CAAC,CACH,CAGO,SAASK,IAAqB,CACnC,MAAMC,EAAY,IAAI,IAEtB,SAASC,EAAG9Q,EAAW+Q,EAAU,CAC/B,MAAMC,EAAO,IAAM,CACjB,MAAMC,EAAkBJ,EAAU,IAAI7Q,CAAS,EAC/C,OAAQ,MAAM,QAAQiR,CAAe,GAC9BA,EAAgB,KAAKF,CAAQ,GAC7B,EACT,EAEMG,EAAS,IAAML,EAAU,IAAI7Q,EAAW,GAAG,OAAO+Q,CAAQ,CAAC,EAEjE,OAAQF,EAAU,IAAI7Q,CAAS,GACxBgR,EAAI,GACJE,EAAM,CACf,CAEA,SAASC,EAAKnR,EAAWiC,EAAM,CAC7B,MAAMmP,EAAO,IAAM,CACjB,MAAMH,EAAkBJ,EAAU,IAAI7Q,CAAS,EAC/C,UAAW+Q,KAAYE,EAAiBF,EAAS,KAAK,KAAM,GAAG9O,CAAI,CACrE,EAEA,OAAO4O,EAAU,IAAI7Q,CAAS,GACvBoR,EAAI,CACb,CAEA,SAASC,EAAerR,EAAW+Q,EAAU,CAC3C,MAAMO,EAAS,IAAM,CACnB,MAAML,EAAkBJ,EAAU,IAAI7Q,CAAS,EACzCuH,EAAM0J,EAAgB,QAAQF,CAAQ,EAC5C,OAAQxJ,GAAO,GACR0J,EAAgB,OAAO1J,EAAK,CAAC,GAC7BsJ,EAAU,IAAI7Q,CAAS,EAAE,SAAW,GACpC6Q,EAAU,OAAO7Q,CAAS,CACnC,EAEA,OAAO6Q,EAAU,IAAI7Q,CAAS,GACvBsR,EAAM,CACf,CAEA,SAASC,EAAKvR,EAAW+Q,EAAU,CACjC,MAAMS,EAAgB,IAAIvP,IAAS,CACjC8O,EAAS,KAAK,KAAM,GAAG9O,CAAI,EAC3BoP,EAAerR,EAAWwR,CAAa,CACzC,EAEA,OAAOV,EAAG9Q,EAAWwR,CAAa,CACpC,CAEA,SAASC,GAAqB,CAC5BZ,EAAU,MAAK,CACjB,CAEA,MAAO,CACL,IAAI,SAAU,CACZ,OAAOA,CACT,EACA,GAAAC,EACA,KAAAS,EACA,KAAAJ,EACA,eAAAE,EACA,mBAAAI,CACJ,CACA,CCvJO,MAAMC,EAAY,gBCIV,MAAMC,EAAQ,CAC3B,YAAYC,EAAW,GAAOpU,EAAa,CACzC,KAAK,OAAS,GACd,KAAK,SAAWoU,EAChB,KAAK,GAAKtoB,EAAE,MAAO,GAAGooB,CAAS,YAAYE,EAAW,WAAa,YAAY,EAAE,EAAE,SACjF,KAAK,cAAgBtoB,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EACvD,GAAG,gBAAiBzR,GAAO,KAAK,qBAAqBA,CAAG,CAAC,EACzD,IAAI,WAAY,UAAU,EAAE,KAAI,EACnC,KAAK,QAAU3W,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EACjD,GAAG,iBAAkBzR,GAAO,KAAK,iBAAiBA,CAAG,CAAC,EACzD,KAAK,OAAS3W,EAAE,MAAO,GAAGooB,CAAS,eAAe,EAAE,KAAI,CAC9D,EAAM,KAAI,EAEN,KAAK,MAAQ,KACb,KAAK,WAAa,KAClB,KAAK,YAAclU,EACnB,KAAK,SAAW,IAAM,CAAC,CACzB,CAEA,WAAW5M,EAAO,CAChB,KAAK,YAAcA,EACnB,KAAK,cAAc,KAAI,CACzB,CAEA,YAAa,CACX,KAAK,cAAc,KAAI,CACzB,CAIA,KAAKyL,EAAMwV,EAAM,CACf,KAAM,CACJ,OAAAC,EAAQ,SAAAF,EAAU,QAAAG,EAAS,OAAAC,EAAQ,GAAA3b,EACnC,cAAA4b,CACN,EAAQ,KACJ,GAAIH,EAAQ,OACZ,KAAK,MAAQzV,EACb,KAAM,CACJ,KAAAmQ,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACxB,EAAQgD,EACJhG,EAAG,OAAO,CACR,KAAMub,EAAWpF,EAAOpT,EAAQ,EAAIoT,EACpC,IAAKoF,EAAWzF,EAAMA,EAAM9S,EAAS,CAC3C,CAAK,EAAE,KAAI,EACP0Y,EAAQ,OAAO,CACb,MAAOH,EAAW,EAAIxY,EACtB,OAAQwY,EAAWvY,EAAS,CAClC,CAAK,EACD2Y,EAAO,OAAO,CACZ,MAAOJ,EAAW,EAAIC,EAAK,MAC3B,OAAQD,EAAWC,EAAK,OAAS,CACvC,CAAK,EACDI,EAAc,OAAO,CACnB,KAAML,EAAW,EAAIxY,EAAQoT,EAC7B,IAAKoF,EAAWzF,EAAM,EAAI9S,EAC1B,MAAOuY,EAAW,EAAIxY,EACtB,OAAQwY,EAAWvY,EAAS,CAClC,CAAK,CACH,CAEA,MAAO,CACL,KAAK,GAAG,OAAO,CACb,KAAM,EACN,IAAK,CACX,CAAK,EAAE,KAAI,EACP,KAAK,WAAU,CACjB,CAEA,sBAAuB,CACjB,KAAK,aAAa,KAAK,SAAS,KAAK,WAAW,CACtD,CAEA,iBAAiB4G,EAAK,CACpB,IAAIiS,EAAWjS,EACf,KAAM,CACJ,GAAA5J,EAAI,OAAA2b,EAAQ,MAAAG,EAAO,SAAAP,EAAU,YAAApU,CACnC,EAAQ,KACJ,IAAIK,EAAW+T,EAAWO,EAAM,MAAQA,EAAM,OAE9CH,EAAO,KAAI,EACXlC,GAAY,OAAS9oB,GAAM,CACzB,KAAK,OAAS,GACVkrB,IAAa,MAAQlrB,EAAE,UAAY,IAEjC4qB,GACF/T,GAAY7W,EAAE,UACV6W,EAAWL,GACbnH,EAAG,IAAI,OAAQ,GAAG8b,EAAM,KAAOtU,CAAQ,IAAI,IAG7CA,GAAY7W,EAAE,UACV6W,EAAWL,GACbnH,EAAG,IAAI,MAAO,GAAG8b,EAAM,IAAMtU,CAAQ,IAAI,GAG7CqU,EAAWlrB,EAEf,EAAG,IAAM,CACPkrB,EAAW,KACXF,EAAO,KAAI,EACX,KAAK,OAAS,GACd,KAAK,KAAI,EACL,KAAK,aACHnU,EAAWL,IAAaK,EAAWL,GACvC,KAAK,WAAW2U,EAAOtU,CAAQ,EAEnC,CAAC,CACH,CACF,CC9Ge,MAAMuU,EAAU,CAC7B,YAAYR,EAAU,CACpB,KAAK,SAAWA,EAChB,KAAK,OAAS,KACd,KAAK,GAAKtoB,EAAE,MAAO,GAAGooB,CAAS,cAAcE,EAAW,WAAa,YAAY,EAAE,EAChF,MAAM,KAAK,UAAYtoB,EAAE,MAAO,EAAE,CAAC,EACnC,GAAG,iBAAkB,IAAM,CAAC,CAAC,EAC7B,GAAG,cAAgB2W,GAAQ,CAC1B,KAAM,CAAE,UAAA5C,EAAW,WAAAgV,CAAU,EAAKpS,EAAI,OAElC,KAAK,QACP,KAAK,OAAO,KAAK,SAAW5C,EAAYgV,EAAYpS,CAAG,CAG3D,CAAC,CACL,CAEA,KAAKtW,EAAG,CACN,YAAK,GAAG,OAAOA,CAAC,EACT,IACT,CAEA,QAAS,CACP,OAAO,KAAK,GAAG,OAAM,CACvB,CAEA,IAAIkU,EAAUyU,EAAiB,CAC7B,MAAM1pB,EAAIiV,EAAW,EAErB,GAAIyU,EAAkB1pB,EAAG,CACvB,MAAM2pB,EAAS,KAAK,SAAW,SAAW,QAE1C,KAAK,GAAG,IAAIA,EAAQ,GAAG3pB,EAAI,EAAE,IAAI,EAAE,KAAI,EACvC,KAAK,UACF,IAAI,KAAK,SAAW,QAAU,SAAU,KAAK,EAC7C,IAAI2pB,EAAQ,GAAGD,CAAe,IAAI,CACvC,MACE,KAAK,GAAG,KAAI,EAEd,OAAO,IACT,CACF,CCxCA,MAAME,GAA4B,EAAI,EAAI,EAC1C,IAAIC,GAAc,GAElB,MAAMC,EAAgB,CACpB,YAAYC,EAAe,GAAO,CAChC,KAAK,aAAeA,EACpB,KAAK,YAAc,IAAM,CAAC,EAC1B,KAAK,SAAWrpB,EAAE,MAAO,GAAGooB,CAAS,kBAAkB,EACvD,KAAK,OAASpoB,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EAChD,MAAM,KAAK,QAAQ,EAAE,KAAI,EAC5B,KAAK,YAAcpoB,EAAE,MAAO,GAAGooB,CAAS,qBAAqB,EAAE,KAAI,EACnE,KAAK,WAAapoB,EAAE,MAAO,GAAGooB,CAAS,oBAAoB,EAAE,KAAI,EACjE,KAAK,GAAKpoB,EAAE,MAAO,GAAGooB,CAAS,WAAW,EACvC,IAAI,UAAW,GAAGe,EAAW,EAAE,EAC/B,SAAS,KAAK,OAAQ,KAAK,YAAa,KAAK,UAAU,EACvD,KAAI,EACHE,IACF,KAAK,UAAYrpB,EAAE,QAAS,EAAE,EAC3B,GAAG,iBAAmB2W,GAAQ,CAC7B,KAAK,YAAYA,EAAI,OAAO,KAAK,CACnC,CAAC,EACH,KAAK,GAAG,MAAM,KAAK,aAAe3W,EAAE,MAAO,YAAY,EAAE,MAAM,KAAK,SAAS,CAAC,EAC9E,KAAK,GAAG,MAAM,KAAK,aAAeA,EAAE,MAAO,YAAY,EAAE,MAAM,KAAK,SAAS,CAAC,GAEhFmpB,IAAe,CACjB,CAEA,UAAU9oB,EAAG,CACX,YAAK,GAAG,OAAOA,CAAC,EAAE,KAAI,EACf,IACT,CAEA,MAAO,CACL,YAAK,GAAG,KAAI,EACL,IACT,CAEA,cAAcA,EAAG,CACf,KAAM,CACJ,KAAA6iB,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACxB,EAAQ1P,EACEipB,EAAK,CACT,MAAOxZ,EAAQoZ,GAA4B,GAC3C,OAAQnZ,EAASmZ,GAA4B,GAC7C,KAAMhG,EAAO,GACb,IAAKL,EAAM,EACjB,EACI,KAAK,OAAO,OAAOyG,CAAE,EAAE,KAAI,EACvB,KAAK,eACP,KAAK,aAAa,OAAOA,CAAE,EAC3B,KAAK,UAAU,IAAI,EAAE,EAAE,MAAK,EAEhC,CAEA,mBAAmBjpB,EAAG,CACpB,KAAM,CACJ,KAAA6iB,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACxB,EAAQ1P,EACJ,KAAK,YAAY,OAAO,CACtB,KAAA6iB,EACA,IAAAL,EACA,MAAO/S,EAAQ,EACf,OAAQC,EAAS,CACvB,CAAK,CACH,CAEA,aAAa1P,EAAG,CACd,KAAM,CACJ,KAAA6iB,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACxB,EAAQ1P,EACJ,KAAK,WAAW,OAAO,CACrB,MAAOyP,EAAQoZ,GACf,OAAQnZ,EAASmZ,GACjB,KAAAhG,EACA,IAAAL,CACN,CAAK,EAAE,KAAI,CACT,CAEA,cAAe,CACb,KAAK,WAAW,KAAI,CACtB,CAEA,eAAgB,CACd,KAAK,YAAY,KAAI,CACvB,CAEA,eAAgB,CACd,KAAK,YAAY,KAAI,CACvB,CACF,CAEA,SAAS0G,GAAgBzD,EAAQ,CAC/B,KAAM,CAAE,KAAAnM,CAAI,EAAK,KACX,CACJ,KAAAuJ,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,EAAQ,OAAAuU,EAAQ,EAAA3lB,EAAG,EAAAf,CACzC,EAAMkoB,EACE0D,EAAU7P,EAAK,iBAAgB,EAC/B8P,EAAW9P,EAAK,kBAAiB,EACvC,IAAI6K,EAAQtB,EAAOsG,EACfA,EAAU7qB,IAAG6lB,GAASF,EAAO,GACjC,IAAIG,EAAO5B,EAAM4G,EACjB,OAAIA,EAAW7rB,IAAG6mB,GAAQH,EAAO,GAC1B,CACL,KAAME,EACN,IAAKC,EACL,MAAA3U,EACA,OAAAC,CACJ,CACA,CAEA,SAAS2Z,GAAe5D,EAAQ,CAC9B,KAAM,CAAE,KAAAnM,CAAI,EAAK,KACX,CACJ,KAAAuJ,EAAM,MAAApT,EAAO,OAAAC,EAAQ,EAAApR,EAAG,EAAAf,EAAG,OAAA0mB,CAC/B,EAAMwB,EACE0D,EAAU7P,EAAK,iBAAgB,EACrC,IAAI6K,EAAQtB,EAAOsG,EACnB,OAAIA,EAAU7qB,IAAG6lB,GAASF,EAAO,GAC1B,CACL,KAAME,EAAO,IAAK5mB,EAAG,MAAAkS,EAAO,OAAAC,CAChC,CACA,CAEA,SAAS4Z,GAAe7D,EAAQ,CAC9B,KAAM,CAAE,KAAAnM,CAAI,EAAK,KACX,CACJ,IAAAkJ,EAAK,MAAA/S,EAAO,OAAAC,EAAQ,EAAApR,EAAG,EAAAf,EAAG,OAAA0mB,CAC9B,EAAMwB,EACE2D,EAAW9P,EAAK,kBAAiB,EACvC,IAAI8K,EAAO5B,EAAM4G,EAEjB,OAAIA,EAAW7rB,IAAG6mB,GAAQH,EAAO,GAC1B,CACL,KAAM3lB,EAAG,IAAK8lB,EAAM,MAAA3U,EAAO,OAAAC,CAC/B,CACA,CAEA,SAAS6Z,GAAgB9D,EAAQ,CAC/B,KAAM,CAAE,GAAA+D,CAAE,EAAK,KACfA,EAAG,cAAcN,GAAgB,KAAK,KAAMzD,CAAM,CAAC,CACrD,CAEA,SAASgE,GAAgBhE,EAAQ,CAC/B,KAAM,CAAE,GAAAiE,CAAE,EAAK,KACfA,EAAG,cAAcjE,CAAM,CACzB,CAEA,SAASkE,GAAelE,EAAQ,CAC9B,KAAM,CAAE,EAAAloB,CAAC,EAAK,KACdA,EAAE,cAAc8rB,GAAe,KAAK,KAAM5D,CAAM,CAAC,CACnD,CAEA,SAASmE,GAAenE,EAAQ,CAC9B,KAAM,CAAE,EAAAnnB,CAAC,EAAK,KACdA,EAAE,cAAcgrB,GAAe,KAAK,KAAM7D,CAAM,CAAC,CACnD,CAEA,SAASoE,GAAoBpE,EAAQ,CACnC,KAAM,CAAE,EAAAnnB,CAAC,EAAK,KACdA,EAAE,mBAAmBgrB,GAAe,KAAK,KAAM7D,CAAM,CAAC,CACxD,CAEA,SAASqE,GAAqBrE,EAAQ,CACpC,KAAM,CAAE,GAAA+D,CAAE,EAAK,KACfA,EAAG,mBAAmBN,GAAgB,KAAK,KAAMzD,CAAM,CAAC,CAC1D,CAEA,SAASsE,GAAqBtE,EAAQ,CACpC,KAAM,CAAE,GAAAiE,CAAE,EAAK,KACfA,EAAG,mBAAmBjE,CAAM,CAC9B,CAEA,SAASuE,GAAoBvE,EAAQ,CACnC,KAAM,CAAE,EAAAloB,CAAC,EAAK,KACdA,EAAE,mBAAmB8rB,GAAe,KAAK,KAAM5D,CAAM,CAAC,CACxD,CAEA,SAASwE,GAAiBxE,EAAQ,CAChC8D,GAAgB,KAAK,KAAM9D,CAAM,EACjCgE,GAAgB,KAAK,KAAMhE,CAAM,EACjCkE,GAAe,KAAK,KAAMlE,CAAM,EAChCmE,GAAe,KAAK,KAAMnE,CAAM,CAClC,CAEA,SAASyE,GAAsBzE,EAAQ,CACrCqE,GAAqB,KAAK,KAAMrE,CAAM,EACtCsE,GAAqB,KAAK,KAAMtE,CAAM,EACtCuE,GAAoB,KAAK,KAAMvE,CAAM,EACrCoE,GAAoB,KAAK,KAAMpE,CAAM,CACvC,CAEe,MAAMzC,EAAS,CAC5B,YAAY1J,EAAM,CAChB,KAAK,YAAc,IAAM,CAAC,EAC1B,KAAK,KAAOA,EACZ,KAAK,GAAK,IAAIyP,GAAgB,EAAI,EAClC,KAAK,EAAI,IAAIA,GACb,KAAK,EAAI,IAAIA,GACb,KAAK,GAAK,IAAIA,GACd,KAAK,GAAG,YAAe/oB,GAAM,CAC3B,KAAK,YAAYA,CAAC,CACpB,EACA,KAAK,GAAG,GAAG,KAAI,EACf,KAAK,OAAS,KACd,KAAK,WAAa,KAClB,KAAK,QAAU,KACf,KAAK,MAAQ,KACb,KAAK,OAAS,KACd,KAAK,GAAKL,EAAE,MAAO,GAAGooB,CAAS,YAAY,EACxC,SACC,KAAK,GAAG,GACR,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,GAAG,EAChB,EAAQ,KAAI,EAGR,KAAK,OAAS,GACd,KAAK,OAAS,GAEde,IAAe,CACjB,CAEA,UAAUxP,EAAM,CACd,KAAK,KAAOA,EACZ,KAAK,MAAQA,EAAK,SAAS,MAC3B,KAAK,gBAAe,CACtB,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,CACd,CAEA,aAAc,CACZ,KAAM,CACJ,KAAAA,EAAM,GAAAoQ,EAAI,EAAAnsB,EAAG,EAAAe,EAAG,GAAAkrB,CACtB,EAAQ,KACEW,EAAe7Q,EAAK,kBAAiB,EACrC8Q,EAAc9Q,EAAK,iBAAgB,EACrC6Q,EAAe,GAAKC,EAAc,GACpCV,EAAG,UAAU,CAAE,MAAOU,EAAa,OAAQD,EAAc,EACzD5sB,EAAE,UAAU,CAAE,KAAM6sB,EAAa,OAAQD,EAAc,EACvD7rB,EAAE,UAAU,CAAE,IAAK6rB,EAAc,MAAOC,EAAa,EACrDZ,EAAG,UAAU,CAAE,KAAMY,EAAa,IAAKD,EAAc,IAErDT,EAAG,KAAI,EACPnsB,EAAE,KAAI,EACNe,EAAE,KAAI,EACNkrB,EAAG,UAAU,CAAE,KAAM,EAAG,IAAK,EAAG,EAEpC,CAEA,iBAAkB,CAEhB,MAAM/D,EAAS,KAAK,KAAK,gBAAe,EAClC4E,EAAU,KAAK,KAAK,iBAAgB,EAC1CJ,GAAiB,KAAK,KAAMxE,CAAM,EAClCyE,GAAsB,KAAK,KAAMG,CAAO,EACxC,KAAK,YAAW,CAClB,CAEA,oBAAqB,CACnB,MAAM5E,EAAS,KAAK,KAAK,gBAAe,EAClC4E,EAAU,KAAK,KAAK,iBAAgB,EAC1Cd,GAAgB,KAAK,KAAM9D,CAAM,EACjCkE,GAAe,KAAK,KAAMlE,CAAM,EAChCqE,GAAqB,KAAK,KAAMO,CAAO,EACvCL,GAAoB,KAAK,KAAMK,CAAO,EACtC,KAAK,YAAW,CAClB,CAEA,oBAAqB,CACnB,MAAM5E,EAAS,KAAK,KAAK,gBAAe,EAClC4E,EAAU,KAAK,KAAK,iBAAgB,EAC1Cd,GAAgB,KAAK,KAAM9D,CAAM,EACjCmE,GAAe,KAAK,KAAMnE,CAAM,EAChCqE,GAAqB,KAAK,KAAMO,CAAO,EACvCR,GAAoB,KAAK,KAAMQ,CAAO,EACtC,KAAK,YAAW,CAClB,CAEA,IAAI9R,EAAIC,EAAI8R,EAAiB,GAAM,CACjC,KAAM,CAAE,KAAAhR,CAAI,EAAK,KACXK,EAAYL,EAAK,wBAAwBf,EAAIC,CAAE,EAC/C,CAAE,IAAAN,EAAK,IAAAC,CAAG,EAAKwB,EACrB,GAAI2Q,EAAgB,CAClB,GAAI,CAAC/G,EAAKC,CAAG,EAAI,CAACjL,EAAIC,CAAE,EACpBD,EAAK,IAAGgL,EAAM,GACd/K,EAAK,IAAGgL,EAAM,GAClBlK,EAAK,SAAS,WAAWiK,EAAKC,CAAG,EACjC,KAAK,QAAU,CAACD,EAAKC,CAAG,CAC1B,CAEA,KAAK,YAAc,CAACtL,EAAKC,CAAG,EAG5B,KAAK,MAAQwB,EACb,KAAK,gBAAe,EACpB,KAAK,GAAG,KAAI,CACd,CAEA,OAAOpB,EAAIC,EAAI2P,EAAS,GAAM,CAC5B,KAAM,CAAE,KAAA7O,EAAM,OAAAiR,EAAQ,OAAAC,CAAM,EAAK,KACjC,GAAIrC,EAAQ,CACV,GAAI5P,IAAOgS,GAAU/R,IAAOgS,EAAQ,OACpC,KAAK,OAASjS,EACd,KAAK,OAASC,CAChB,CACA,KAAK,MAAQc,EAAK,sBAAsBf,EAAIC,CAAE,EAC9CyR,GAAiB,KAAK,KAAM,KAAK,KAAK,gBAAe,CAAE,CACzD,CAEA,OAAQ,CAEN,KAAM,CAAE,IAAA7R,EAAK,IAAAC,CAAG,EAAK,KAAK,KAAK,SAAS,MACxC,KAAK,OAAOD,EAAKC,CAAG,CACtB,CAEA,aAAaE,EAAIC,EAAI,CACnB,GAAID,IAAO,IAAMC,IAAO,GAAI,OAI5B,KAAM,CACJ,IAAAN,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACrB,EAAQ,KAAK,MACH,CAACuG,EAAKC,CAAG,EAAI,CAACtG,EAAIC,CAAE,EAGpBwI,EAAM9I,EAAMK,EACZ0I,EAAM9I,EAAMK,EACZiS,EAAMrS,EAAMG,EACZmS,EAAMrS,EAAMG,EAClB,GAAIyI,EAAM,EAGR,KAAK,OAAS,IAAIhJ,GAAUC,EAAK2G,EAAKzG,EAAKD,EAAM,CAAC,UAIzC6I,EAAM,EAIf,KAAK,OAAS,IAAI/I,GAAU2G,EAAKzG,EAAKD,EAAM,EAAGG,CAAG,UAGzCqS,EAAM,EAIf,KAAK,OAAS,IAAIzS,GAAUC,EAAKG,EAAM,EAAGD,EAAKyG,CAAG,UAGzC4L,EAAM,EAIf,KAAK,OAAS,IAAIxS,GAAUG,EAAM,EAAGD,EAAKyG,EAAKvG,CAAG,MAG7C,CAEL,KAAK,OAAS,KAGd,MACF,CACA,GAAI,KAAK,SAAW,KAAM,CAExB,MAAMoN,EAAS,KAAK,KAAK,QAAQ,KAAK,MAAM,EAC5CA,EAAO,OAAS,EAChBA,EAAO,QAAU,EACjB,KAAM,CACJ,GAAA+D,EAAI,EAAAlrB,EAAG,EAAAf,EAAG,GAAAmsB,CAClB,EAAU,KACJF,EAAG,aAAaN,GAAgB,KAAK,KAAMzD,CAAM,CAAC,EAClDnnB,EAAE,aAAagrB,GAAe,KAAK,KAAM7D,CAAM,CAAC,EAChDloB,EAAE,aAAa8rB,GAAe,KAAK,KAAM5D,CAAM,CAAC,EAChDiE,EAAG,aAAajE,CAAM,CACxB,CACF,CAEA,cAAe,CACb,CAAC,KAAM,IAAK,IAAK,IAAI,EAAE,QAASrJ,GAAa,CAC3C,KAAKA,CAAQ,EAAE,aAAY,CAC7B,CAAC,CACH,CAEA,eAAgB,CACd,MAAMiO,EAAU,KAAK,KAAK,iBAAgB,EAC1CH,GAAsB,KAAK,KAAMG,CAAO,EACxC,CAAC,KAAM,IAAK,IAAK,IAAI,EAAE,QAASjO,GAAa,CAC3C,KAAKA,CAAQ,EAAE,cAAa,CAC9B,CAAC,CACH,CAEA,eAAgB,CACd,CAAC,KAAM,IAAK,IAAK,IAAI,EAAE,QAASA,GAAa,CAC3C,KAAKA,CAAQ,EAAE,cAAa,CAC9B,CAAC,CACH,CACF,CClZA,SAASuO,GAAcrU,EAAK,CAC1BA,EAAI,eAAc,EAClBA,EAAI,gBAAe,EACnB,KAAM,CAAE,YAAAsU,CAAW,EAAK,KACpBA,EAAY,QAAU,IACtB,KAAK,WAAa,GAAGA,EAAY,KAAK,SAAS,EAAE,OAAM,EAC3D,KAAK,WAAa,EACd,KAAK,UAAY,IACnB,KAAK,UAAYA,EAAY,OAAS,GAExCA,EAAY,KAAK,SAAS,EAAE,OAAM,EACpC,CAEA,SAASC,GAAcvU,EAAK,CAC1BA,EAAI,gBAAe,EACnB,KAAM,CAAE,YAAAsU,CAAW,EAAK,KACpBA,EAAY,QAAU,IACtB,KAAK,WAAa,GAAGA,EAAY,KAAK,SAAS,EAAE,OAAM,EAC3D,KAAK,WAAa,EACd,KAAK,UAAYA,EAAY,OAAS,IACxC,KAAK,UAAY,GAEnBA,EAAY,KAAK,SAAS,EAAE,OAAM,EACpC,CAEA,SAASE,GAAWxU,EAAK,CACvBA,EAAI,eAAc,EAClB,KAAM,CAAE,YAAAsU,CAAW,EAAK,KACpBA,EAAY,QAAU,IAC1BtU,EAAI,gBAAe,EACf,KAAK,UAAY,IAAG,KAAK,UAAY,GACzCsU,EAAY,KAAK,SAAS,EAAE,GAAG,MAAK,EACpC,KAAK,KAAI,EACX,CAEA,SAASG,GAAoBzU,EAAK,CAChC,KAAM,CAAE,QAAA0U,CAAO,EAAK1U,EAIpB,OAHIA,EAAI,SACNA,EAAI,gBAAe,EAEb0U,EAAO,CACb,IAAK,IACH1U,EAAI,gBAAe,EACnB,MACF,IAAK,IACHqU,GAAc,KAAK,KAAMrU,CAAG,EAC5B,MACF,IAAK,IACHA,EAAI,gBAAe,EACnB,MACF,IAAK,IACHuU,GAAc,KAAK,KAAMvU,CAAG,EAC5B,MACF,IAAK,IACHwU,GAAW,KAAK,KAAMxU,CAAG,EACzB,MACF,IAAK,GACHwU,GAAW,KAAK,KAAMxU,CAAG,EACzB,MACF,QACEA,EAAI,gBAAe,EACnB,KACN,CACA,CAEe,MAAM2U,EAAQ,CAC3B,YAAYC,EAAOC,EAAW1b,EAAQ,QAAS,CAC7C,KAAK,YAAc,CAAA,EACnB,KAAK,MAAQyb,EACb,KAAK,GAAKvrB,EAAE,MAAO,GAAGooB,CAAS,UAAU,EAAE,IAAI,QAAStY,CAAK,EAAE,KAAI,EACnE,KAAK,UAAY0b,EACjB,KAAK,UAAY,EACnB,CAEA,UAAUnrB,EAAG,CACX,KAAK,GAAG,cAAc,MAAO,QAAQ,EAClC,OAAOA,CAAC,CACb,CAEA,MAAO,CACL,KAAM,CAAE,GAAA0M,CAAE,EAAK,KACf,KAAK,YAAc,CAAA,EACnB,KAAK,UAAY,GACjBA,EAAG,KAAI,EACPuZ,GAAmB,KAAK,GAAG,QAAQ,CACrC,CAEA,SAASiF,EAAO,CACd,KAAK,MAAQA,CAEf,CAEA,OAAOnM,EAAM,CACX,GAAI,CAAE,MAAAmM,CAAK,EAAK,KAyBhB,GAxBK,QAAQ,KAAKnM,CAAI,IACpBmM,EAAQA,EAAM,OAAOrpB,IAAOA,EAAG,KAAOA,GAAI,WAAWkd,EAAK,YAAW,CAAE,CAAC,GAE1EmM,EAAQA,EAAM,IAAKrpB,GAAO,CACxB,GAAI,CAAE,MAAAupB,CAAK,EAAKvpB,EACZupB,EACE,OAAOA,GAAU,aACnBA,EAAQA,EAAK,GAGfA,EAAQvpB,EAEV,MAAMyM,EAAO3O,EAAE,MAAO,GAAGooB,CAAS,OAAO,EACtC,MAAMqD,CAAK,EACX,GAAG,aAAc,IAAM,CACtB,KAAK,UAAUvpB,CAAE,EACjB,KAAK,KAAI,CACX,CAAC,EACH,OAAIA,EAAG,OACLyM,EAAK,MAAM3O,EAAE,MAAO,OAAO,EAAE,KAAKkC,EAAG,KAAK,CAAC,EAEtCyM,CACT,CAAC,EACD,KAAK,YAAc4c,EACfA,EAAM,QAAU,EAClB,OAEF,KAAM,CAAE,GAAAxe,CAAE,EAAK,KAEfA,EAAG,KAAK,EAAE,EAAE,SAAS,GAAGwe,CAAK,EAAE,KAAI,EACnChF,GAAiBxZ,EAAG,SAAU,IAAM,CAAE,KAAK,KAAI,CAAI,CAAC,CACtD,CAEA,gBAAgB2e,EAAO,CACrBA,EAAM,GAAG,UAAW/U,GAAOyU,GAAoB,KAAK,KAAMzU,CAAG,CAAC,CAChE,CACF,CCnIe,MAAMgV,WAAavV,EAAQ,CACxC,YAAY9J,EAAM,CAChB,MAAM,MAAO,GAAG8b,CAAS,OAAO,EAChC,KAAK,WAAapoB,EAAE,MAAO,GAAGooB,CAAS,aAAa9b,CAAI,EAAE,EAC1D,KAAK,MAAM,KAAK,UAAU,CAC5B,CAEA,QAAQA,EAAM,CACZ,KAAK,WAAW,UAAU,GAAG8b,CAAS,aAAa9b,CAAI,EAAE,CAC3D,CACF,CCTA,SAASsf,GAASC,EAAMC,EAAM,CAC5BD,EAAK,SAASA,EAAK,SAAQ,EAAKC,CAAI,CACtC,CAEA,SAASC,GAAQF,EAAMvkB,EAAO,CAC5B,MAAMhI,EAAI,IAAI,KAAKusB,CAAI,EACvB,OAAAvsB,EAAE,QAAQgI,EAAQukB,EAAK,OAAM,EAAK,CAAC,EAC5BvsB,CACT,CAEA,SAAS0sB,GAAUC,EAAMC,EAAOC,EAAO,CAErC,MAAMC,EAAY,IAAI,KAAKH,EAAMC,EAAO,EAAG,GAAI,GAAI,EAAE,EAC/CG,EAAS,CAAC,GAAI,CAAA,EAAI,CAAA,EAAI,CAAA,EAAI,CAAA,EAAI,EAAE,EACtC,QAAS7tB,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAC1B,QAASf,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAG,CAC7B,MAAM6J,EAAQ9I,EAAI,EAAIf,EAChB6B,EAAIysB,GAAQK,EAAW9kB,CAAK,EAC5B8H,EAAW9P,EAAE,SAAQ,IAAO4sB,EAE5BI,EAAShtB,EAAE,SAAQ,IAAO6sB,EAAM,SAAQ,GAAM7sB,EAAE,YAAc6sB,EAAM,QAAO,EACjFE,EAAO7tB,CAAC,EAAEf,CAAC,EAAI,CAAE,EAAA6B,EAAG,SAAA8P,EAAU,OAAAkd,CAAM,CACtC,CAEF,OAAOD,CACT,CAEe,MAAME,EAAS,CAC5B,YAAY5pB,EAAO,CACjB,KAAK,MAAQA,EACb,KAAK,OAAS,IAAI,KAAKA,CAAK,EAE5B,KAAK,aAAe3C,EAAE,MAAO,sBAAsB,EACnD,KAAK,OAASA,EAAE,QAAS,EAAE,EAC3B,KAAK,SAAQ,EACb,KAAK,GAAKA,EAAE,MAAO,wBAAwB,EACxC,SACCA,EAAE,MAAO,iBAAiB,EAAE,SAC1B,KAAK,aACLA,EAAE,MAAO,uBAAuB,EAAE,SAChCA,EAAE,IAAK,eAAe,EACnB,GAAG,aAAc,IAAM,KAAK,KAAI,CAAE,EAClC,MAAM,IAAI2rB,GAAK,cAAc,CAAC,EACjC3rB,EAAE,IAAK,eAAe,EACnB,GAAG,aAAc,IAAM,KAAK,KAAI,CAAE,EAClC,MAAM,IAAI2rB,GAAK,eAAe,CAAC,CAC9C,CACA,EACQ3rB,EAAE,QAAS,eAAe,EAAE,SAC1BA,EAAE,QAAS,EAAE,EAAE,MACbA,EAAE,KAAM,EAAE,EAAE,SACV,GAAGpC,GAAE,gBAAgB,EAAE,IAAI4uB,GAAQxsB,EAAE,KAAM,MAAM,EAAE,MAAMwsB,CAAI,CAAC,CAC5E,CACA,EACU,KAAK,MACf,CACA,EACI,KAAK,aAAe,IAAM,CAAC,CAC7B,CAEA,SAAS7pB,EAAO,CACd,KAAK,MAAQA,EACb,KAAK,OAAS,IAAI,KAAKA,CAAK,EAC5B,KAAK,SAAQ,CACf,CAEA,MAAO,CACL,KAAM,CAAE,MAAAA,CAAK,EAAK,KAClBipB,GAASjpB,EAAO,EAAE,EAClB,KAAK,SAAQ,CACf,CAEA,MAAO,CACL,KAAM,CAAE,MAAAA,CAAK,EAAK,KAClBipB,GAASjpB,EAAO,CAAC,EACjB,KAAK,SAAQ,CACf,CAEA,UAAW,CACT,KAAK,gBAAe,EACpB,KAAK,UAAS,CAChB,CAEA,iBAAkB,CAChB,KAAM,CAAE,MAAAA,CAAK,EAAK,KAClB,KAAK,aAAa,KAAK,GAAG/E,GAAE,iBAAiB,EAAE+E,EAAM,SAAQ,CAAE,CAAC,IAAIA,EAAM,YAAW,CAAE,EAAE,CAC3F,CAEA,WAAY,CACV,KAAM,CAAE,MAAAA,EAAO,OAAA8pB,EAAQ,OAAAC,CAAM,EAAK,KAE5BC,EADQX,GAAUrpB,EAAM,YAAW,EAAIA,EAAM,SAAQ,EAAI8pB,CAAM,EACnD,IAAKvqB,GAAO,CAC5B,MAAM0qB,EAAM1qB,EAAG,IAAKoZ,GAAQ,CAC1B,IAAInE,EAAM,OACV,OAAImE,EAAI,WAAUnE,GAAO,aACrBmE,EAAI,SAAQnE,GAAO,WAChBnX,EAAE,KAAM,EAAE,EAAE,MACjBA,EAAE,MAAOmX,CAAG,EACT,GAAG,aAAc,IAAM,CACtB,KAAK,aAAamE,EAAI,CAAC,CACzB,CAAC,EACA,MAAMA,EAAI,EAAE,QAAO,EAAG,SAAQ,CAAE,CAC7C,CACM,CAAC,EACD,OAAOtb,EAAE,KAAM,EAAE,EAAE,SAAS,GAAG4sB,CAAG,CACpC,CAAC,EACDF,EAAO,KAAK,EAAE,EAAE,SAAS,GAAGC,CAAG,CACjC,CACF,CC5Ge,MAAME,EAAW,CAC9B,aAAc,CACZ,KAAK,SAAW,IAAIN,GAAS,IAAI,IAAM,EACvC,KAAK,GAAKvsB,EAAE,MAAO,GAAGooB,CAAS,aAAa,EAAE,MAC5C,KAAK,SAAS,EACpB,EAAM,KAAI,CACR,CAEA,SAASyD,EAAM,CAEb,KAAM,CAAE,SAAAiB,CAAQ,EAAK,KACrB,OAAI,OAAOjB,GAAS,SAEd,0BAA0B,KAAKA,CAAI,GACrCiB,EAAS,SAAS,IAAI,KAAKjB,EAAK,QAAQ,IAAI,OAAO,IAAK,GAAG,EAAG,GAAG,CAAC,CAAC,EAE5DA,aAAgB,MACzBiB,EAAS,SAASjB,CAAI,EAEjB,IACT,CAEA,OAAO/S,EAAI,CACT,KAAK,SAAS,aAAgBxZ,GAAM,CAClCwZ,EAAGxZ,CAAC,EACJ,KAAK,KAAI,CACX,CACF,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,CACd,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,CACd,CACF,CCjCA,SAASytB,IAAoB,CAC3B,KAAM,CAAE,UAAAC,CAAS,EAAK,KACtB,GAAI,CAAC,QAAQ,KAAKA,CAAS,EAAG,CAC5B,KAAM,CACJ,WAAAC,EAAY,OAAAC,EAAQ,WAAAC,CAC1B,EAAQ,KACEC,EAAOJ,EAAU,MAAM;AAAA,CAAI,EAC3BK,EAAa,KAAK,IAAI,GAAGD,EAAK,IAAIlrB,GAAMA,EAAG,MAAM,CAAC,EAElDorB,EADWL,EAAW,OAAM,EACP,MAAQD,EAAU,OACvCO,GAAcF,EAAa,GAAKC,EAAY,EAC5CE,EAAW,KAAK,OAAM,EAAG,MAAQL,EAAW,KAAOG,EACzD,IAAIG,EAAKL,EAAK,OACd,GAAIG,EAAaJ,EAAW,MAAO,CACjC,IAAIO,EAASH,EACTA,EAAaC,IACfE,EAASF,EACTC,GAAM,SAASF,EAAaC,EAAU,EAAE,EACxCC,GAAOF,EAAaC,EAAY,EAAI,EAAI,GAE1CN,EAAO,IAAI,QAAS,GAAGQ,CAAM,IAAI,CACnC,CACAD,GAAM,KAAK,UACPA,EAAKN,EAAW,QAClBD,EAAO,IAAI,SAAU,GAAGO,CAAE,IAAI,CAElC,CACF,CAEA,SAASE,GAAW,CAAE,OAAAxH,CAAM,EAAIyH,EAAM,CACpC,KAAM,CAAE,MAAAjrB,EAAO,aAAAkrB,CAAY,EAAK1H,EAC1B2H,EAAO,GAAGnrB,EAAM,MAAM,EAAGkrB,CAAY,CAAC,GAAGD,CAAI,GAAGjrB,EAAM,MAAMkrB,CAAY,CAAC,GAC/E1H,EAAO,MAAQ2H,EACf3H,EAAO,kBAAkB0H,EAAe,EAAGA,EAAe,CAAC,EAE3D,KAAK,UAAYC,EACjB,KAAK,WAAW,KAAKA,CAAI,EACzBf,GAAkB,KAAK,IAAI,CAC7B,CAEA,SAASgB,GAAoBpX,EAAK,CAChC,KAAM,CAAE,QAAA0U,EAAS,OAAA2C,CAAM,EAAKrX,EACxB0U,IAAY,IAAMA,IAAY,GAAG1U,EAAI,gBAAe,EACpD0U,IAAY,IAAM2C,IACpBL,GAAW,KAAK,KAAMhX,EAAK;AAAA,CAAI,EAC/BA,EAAI,gBAAe,GAEjB0U,IAAY,IAAM,CAAC2C,GAAQrX,EAAI,eAAc,CACnD,CAEA,SAASsX,GAAkBtX,EAAK,CAC9B,MAAMtW,EAAIsW,EAAI,OAAO,MAEf,CAAE,QAAAuX,EAAS,WAAAjB,EAAY,UAAAtM,CAAS,EAAK,KACrC,CAAE,KAAA/F,CAAI,EAAK,KACjB,GAAIA,IAAS,KACX,GAAK,aAAcA,GAAQA,EAAK,WAAa,IAAUA,EAAK,WAAa,OAAY,CAEnF,GADA,KAAK,UAAYva,EACbsgB,EACEA,EAAU,OAAS,OACrBuN,EAAQ,OAAO7tB,CAAC,EAEhB6tB,EAAQ,KAAI,MAET,CACL,MAAMC,EAAQ9tB,EAAE,YAAY,GAAG,EAC3B8tB,IAAU,GACZD,EAAQ,OAAO7tB,EAAE,UAAU8tB,EAAQ,CAAC,CAAC,EAErCD,EAAQ,KAAI,CAEhB,CACAjB,EAAW,KAAK5sB,CAAC,EACjB0sB,GAAkB,KAAK,IAAI,EAC3B,KAAK,OAAO,QAAS1sB,CAAC,CACxB,MACEsW,EAAI,OAAO,MAAQiE,EAAK,SAErB,CAEL,GADA,KAAK,UAAYva,EACbsgB,EACEA,EAAU,OAAS,OACrBuN,EAAQ,OAAO7tB,CAAC,EAEhB6tB,EAAQ,KAAI,MAET,CACL,MAAMC,EAAQ9tB,EAAE,YAAY,GAAG,EAC3B8tB,IAAU,GACZD,EAAQ,OAAO7tB,EAAE,UAAU8tB,EAAQ,CAAC,CAAC,EAErCD,EAAQ,KAAI,CAEhB,CACAjB,EAAW,KAAK5sB,CAAC,EACjB0sB,GAAkB,KAAK,IAAI,EAC3B,KAAK,OAAO,QAAS1sB,CAAC,CACxB,CACF,CAEA,SAAS+tB,GAAiBjd,EAAU,CAClC,KAAM,CAAE,GAAApE,GAAO,KAAK,OACpB,WAAW,IAAM,CACfA,EAAG,MAAK,EACRA,EAAG,kBAAkBoE,EAAUA,CAAQ,CACzC,EAAG,CAAC,CACN,CAEA,SAASkd,GAAQjQ,EAAMjN,EAAU,CAC/B,KAAM,CAAE,OAAA+b,EAAQ,WAAAD,CAAU,EAAK,KAE/BC,EAAO,GAAG,KAAI,EAEdA,EAAO,IAAI9O,CAAI,EACf6O,EAAW,KAAK7O,CAAI,EACpBgQ,GAAiB,KAAK,KAAMjd,CAAQ,CACtC,CAEA,SAASmd,GAAiBpsB,EAAI,CAC5B,KAAM,CAAE,UAAA8qB,EAAW,UAAArM,CAAS,EAAK,KACjC,IAAIxP,EAAW,EACf,GAAIwP,GAAaA,EAAU,OAAS,OAClC,KAAK,UAAYze,EACjBiP,EAAW,KAAK,UAAU,WACrB,CACL,MAAMgd,EAAQnB,EAAU,YAAY,GAAG,EACjCuB,EAAMvB,EAAU,UAAU,EAAGmB,EAAQ,CAAC,EAC5C,IAAIK,EAAMxB,EAAU,UAAUmB,EAAQ,CAAC,EACnCK,EAAI,QAAQ,GAAG,IAAM,GACvBA,EAAMA,EAAI,UAAUA,EAAI,QAAQ,GAAG,CAAC,EAEpCA,EAAM,GAER,KAAK,UAAY,GAAGD,EAAMrsB,EAAG,GAAG,IAEhCiP,EAAW,KAAK,UAAU,OAC1B,KAAK,WAAa,IAAIqd,CAAG,EAC3B,CACAH,GAAQ,KAAK,KAAM,KAAK,UAAWld,CAAQ,CAC7C,CAEA,SAASsd,IAAoB,CAC3B,KAAK,QAAQ,SAAS,KAAK,QAAQ,CACrC,CAEA,SAASC,GAAWpvB,EAAG,CACrB,IAAI4sB,EAAQ5sB,EAAE,SAAQ,EAAK,EACvBusB,EAAOvsB,EAAE,QAAO,EACpB,OAAI4sB,EAAQ,KAAIA,EAAQ,IAAIA,CAAK,IAC7BL,EAAO,KAAIA,EAAO,IAAIA,CAAI,IACvB,GAAGvsB,EAAE,YAAW,CAAE,IAAI4sB,CAAK,IAAIL,CAAI,EAC5C,CAEe,MAAM8C,EAAO,CAC1B,YAAYC,EAAUC,EAAQ9I,EAAW,CACvC,KAAK,OAAS8I,EACd,KAAK,UAAY9I,EACjB,KAAK,SAAW6I,EAChB,KAAK,QAAU,IAAItD,GAAQsD,EAAW1sB,GAAO,CAC3CosB,GAAiB,KAAK,KAAMpsB,CAAE,CAChC,CAAC,EACD,KAAK,WAAa,IAAI2qB,GACtB,KAAK,WAAW,OAAQvtB,GAAM,CAE5B,KAAK,QAAQovB,GAAWpvB,CAAC,CAAC,EAC1B,KAAK,MAAK,CACZ,CAAC,EACD,KAAK,OAASU,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAC9C,SACC,KAAK,OAASpoB,EAAE,WAAY,EAAE,EAC3B,GAAG,QAAS2W,GAAOsX,GAAkB,KAAK,KAAMtX,CAAG,CAAC,EACpD,GAAG,aAAc,IAAM,CAAC,CAAC,EACzB,GAAG,UAAWA,GAAOoX,GAAoB,KAAK,KAAMpX,CAAG,CAAC,EAC3D,KAAK,WAAa3W,EAAE,MAAO,UAAU,EACrC,KAAK,QAAQ,GACb,KAAK,WAAW,EACxB,EACO,GAAG,iBAAkB,IAAM,CAAC,CAAC,EAC7B,GAAG,iBAAkB,IAAM,CAAC,CAAC,EAChC,KAAK,GAAKA,EAAE,MAAO,GAAGooB,CAAS,SAAS,EACrC,MAAM,KAAK,MAAM,EAAE,KAAI,EAC1B,KAAK,QAAQ,gBAAgB,KAAK,MAAM,EAExC,KAAK,WAAa,KAClB,KAAK,OAAS,CAAE,EAAG,EAAG,EAAG,CAAC,EAC1B,KAAK,KAAO,KACZ,KAAK,UAAY,GACjB,KAAK,OAAS,IAAM,CAAC,CACvB,CAEA,iBAAiBtY,EAAOC,EAAQ,CAC9B,KAAK,OAAO,EAAID,EAChB,KAAK,OAAO,EAAIC,CAClB,CAEA,OAAQ,CAGF,KAAK,YAAc,IACrB,KAAK,OAAO,WAAY,KAAK,SAAS,EAExC,KAAK,KAAO,KACZ,KAAK,WAAa,KAClB,KAAK,UAAY,GACjB,KAAK,GAAG,KAAI,EACZ,KAAK,OAAO,IAAI,EAAE,EAClB,KAAK,WAAW,KAAK,EAAE,EACvB0e,GAAkB,KAAK,IAAI,EAC3B,KAAK,WAAW,KAAI,CACtB,CAEA,UAAU3I,EAAQgJ,EAAkB,MAAO,CACzC,KAAM,CACJ,OAAA5B,EAAQ,OAAA6B,EAAQ,QAAAb,EAAS,OAAAnJ,EAAQ,GAAAhY,CACvC,EAAQ,KACJ,GAAI+Y,EAAQ,CACV,KAAK,WAAaA,EAClB,KAAM,CACJ,KAAA5C,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,EAAQ,EAAApR,EAAG,EAAAf,CACrC,EAAUkoB,EAEEkJ,EAAW,CAAE,KAAM,EAAG,IAAK,CAAC,EAE9BjK,EAAO,EAAIpmB,GAAKomB,EAAO,EAAInnB,IAEpBmnB,EAAO,EAAIpmB,GAAKomB,EAAO,EAAInnB,GACpCoxB,EAAS,KAAOjK,EAAO,EACvBiK,EAAS,IAAMjK,EAAO,GACbA,EAAO,EAAIpmB,EACpBqwB,EAAS,IAAMjK,EAAO,EACbA,EAAO,EAAInnB,IACpBoxB,EAAS,KAAOjK,EAAO,IAEzBhY,EAAG,OAAOiiB,CAAQ,EAClBD,EAAO,OAAO,CAAE,KAAM7L,EAAO8L,EAAS,KAAO,GAAK,IAAKnM,EAAMmM,EAAS,IAAM,EAAG,CAAE,EACjF9B,EAAO,OAAO,CAAE,MAAOpd,EAAQ,EAAI,GAAK,OAAQC,EAAS,EAAI,EAAG,CAAE,EAClE,MAAMkf,EAAU,CAAE,KAAM,CAAC,EACzBA,EAAQH,CAAe,EAAI/e,EAC3Bme,EAAQ,UAAUe,CAAO,EACzBf,EAAQ,KAAI,CACd,CACF,CAEA,QAAQtT,EAAM+F,EAAW,CAEvB,KAAM,CAAE,GAAA5T,EAAI,WAAAmiB,EAAY,QAAAhB,CAAO,EAAK,KACpCnhB,EAAG,KAAI,EACP,KAAK,KAAO6N,EACZ,MAAMwD,EAAQxD,GAAQA,EAAK,MAAS,GAIpC,GAHA,KAAK,QAAQwD,CAAI,EAEjB,KAAK,UAAYuC,EACbA,EAAW,CACb,KAAM,CAAE,KAAA1F,CAAI,EAAK0F,EACb1F,IAAS,SACXiU,EAAW,KAAI,EACV,QAAQ,KAAK9Q,CAAI,GACpB8Q,EAAW,SAAS9Q,CAAI,GAGxBnD,IAAS,SACXiT,EAAQ,SAASvN,EAAU,QAAQ,EACnCuN,EAAQ,OAAO,EAAE,EAErB,CACF,CAEA,QAAQ9P,EAAM,CACZ,KAAK,UAAYA,EAEjBiQ,GAAQ,KAAK,KAAMjQ,EAAMA,EAAK,MAAM,EACpC2O,GAAkB,KAAK,IAAI,CAC7B,CACF,CCpRe,MAAMoC,WAAe/Y,EAAQ,CAE1C,YAAYqV,EAAOxQ,EAAO,GAAI,CAC5B,MAAM,MAAO,GAAGmN,CAAS,WAAWnN,CAAI,EAAE,EAC1C,KAAK,MAAMrd,GAAE,UAAU6tB,CAAK,EAAE,CAAC,CACjC,CACF,CCTA,SAAS2D,IAAM,CACb,OAAO,OAAO,kBAAoB,CACpC,CAEA,SAASC,IAAgB,CACvB,OAAOD,GAAG,EAAK,EACjB,CAEA,SAASE,EAAIC,EAAI,CACf,OAAO,SAASA,EAAKH,GAAG,EAAI,EAAE,CAChC,CAEA,SAASI,GAAQD,EAAI,CACnB,MAAM5xB,EAAI2xB,EAAIC,CAAE,EAChB,OAAO5xB,EAAI,EAAIA,EAAI,GAAM,EAC3B,CAEA,MAAM8xB,EAAQ,CACZ,YAAYxvB,EAAGK,EAAGJ,EAAGF,EAAG0vB,EAAU,EAAG,CACnC,KAAK,EAAIzvB,EACT,KAAK,EAAIK,EACT,KAAK,MAAQJ,EACb,KAAK,OAASF,EACd,KAAK,QAAU0vB,EACf,KAAK,QAAU,UAEf,KAAK,UAAY,KACjB,KAAK,YAAc,KACnB,KAAK,aAAe,KACpB,KAAK,WAAa,IACpB,CAEA,WAAW,CACT,IAAA7M,EAAK,OAAA8M,EAAQ,KAAAzM,EAAM,MAAA0M,CACvB,EAAK,CACG/M,IAAK,KAAK,UAAYA,GACtB+M,IAAO,KAAK,YAAcA,GAC1BD,IAAQ,KAAK,aAAeA,GAC5BzM,IAAM,KAAK,WAAaA,EAC9B,CAEA,YAAa,CACX,OAAO,KAAK,MAAS,KAAK,QAAU,EAAK,CAC3C,CAEA,aAAc,CACZ,OAAO,KAAK,OAAU,KAAK,QAAU,EAAK,CAC5C,CAEA,MAAM2M,EAAO,CACX,KAAM,CAAE,MAAA/f,EAAO,QAAA4f,CAAO,EAAK,KAC3B,GAAI,CAAE,EAAAzvB,CAAC,EAAK,KACZ,OAAI4vB,IAAU,OACZ5vB,GAAKyvB,EACIG,IAAU,SACnB5vB,GAAK6P,EAAQ,EACJ+f,IAAU,UACnB5vB,GAAK6P,EAAQ4f,GAERzvB,CACT,CAEA,MAAM4vB,EAAO7vB,EAAG,CACd,KAAM,CAAE,OAAA+P,EAAQ,QAAA2f,CAAO,EAAK,KAC5B,GAAI,CAAE,EAAApvB,CAAC,EAAK,KACZ,OAAIuvB,IAAU,MACZvvB,GAAKovB,EACIG,IAAU,SACnBvvB,GAAKyP,EAAS,EAAI/P,EAAI,EACb6vB,IAAU,WACnBvvB,GAAKyP,EAAS2f,EAAU1vB,GAEnBM,CACT,CAEA,QAAS,CACP,KAAM,CAAE,EAAAL,EAAG,EAAAK,EAAG,MAAAwP,CAAK,EAAK,KACxB,MAAO,CAAC,CAAC7P,EAAGK,CAAC,EAAG,CAACL,EAAI6P,EAAOxP,CAAC,CAAC,CAChC,CAEA,UAAW,CACT,KAAM,CACJ,EAAAL,EAAG,EAAAK,EAAG,MAAAwP,EAAO,OAAAC,CACnB,EAAQ,KACJ,MAAO,CAAC,CAAC9P,EAAI6P,EAAOxP,CAAC,EAAG,CAACL,EAAI6P,EAAOxP,EAAIyP,CAAM,CAAC,CACjD,CAEA,WAAY,CACV,KAAM,CACJ,EAAA9P,EAAG,EAAAK,EAAG,MAAAwP,EAAO,OAAAC,CACnB,EAAQ,KACJ,MAAO,CAAC,CAAC9P,EAAGK,EAAIyP,CAAM,EAAG,CAAC9P,EAAI6P,EAAOxP,EAAIyP,CAAM,CAAC,CAClD,CAEA,SAAU,CACR,KAAM,CACJ,EAAA9P,EAAG,EAAAK,EAAG,OAAAyP,CACZ,EAAQ,KACJ,MAAO,CAAC,CAAC9P,EAAGK,CAAC,EAAG,CAACL,EAAGK,EAAIyP,CAAM,CAAC,CACjC,CACF,CAEA,SAAS+f,GAAa7U,EAAM8U,EAAIC,EAAIH,EAAOI,EAAQC,EAAUC,EAAS,CACpE,MAAMC,EAAW,CAAE,EAAG,EAAG,EAAG,CAAC,EACzBnV,IAAS,YACPgV,IAAW,SACbG,EAAS,EAAI,EACJH,IAAW,MACpBG,EAAS,EAAI,EAAEF,EAAW,GAE1BE,EAAS,EAAI,CAACF,EAAW,EAElBjV,IAAS,WACdgV,IAAW,SACbG,EAAS,EAAIF,EAAW,EACfD,IAAW,QACpBG,EAAS,EAAI,EAAGF,EAAW,EAAK,KAIhCL,IAAU,SACZO,EAAS,EAAID,EAAU,EACdN,IAAU,UACnBO,EAAS,EAAID,GAEf,KAAK,KACH,CAACJ,EAAKK,EAAS,EAAGJ,EAAKI,EAAS,CAAC,EACjC,CAACL,EAAKK,EAAS,EAAID,EAASH,EAAKI,EAAS,CAAC,CAC/C,CACA,CAEA,MAAMC,EAAK,CACT,YAAYtjB,EAAI+C,EAAOC,EAAQ,CAC7B,KAAK,GAAKhD,EACV,KAAK,IAAMA,EAAG,WAAW,IAAI,EAC7B,KAAK,OAAO+C,EAAOC,CAAM,EACzB,KAAK,IAAI,MAAMqf,GAAG,EAAIA,GAAG,CAAE,CAC7B,CAEA,OAAOtf,EAAOC,EAAQ,CAEpB,KAAK,GAAG,MAAM,MAAQ,GAAGD,CAAK,KAC9B,KAAK,GAAG,MAAM,OAAS,GAAGC,CAAM,KAChC,KAAK,GAAG,MAAQuf,EAAIxf,CAAK,EACzB,KAAK,GAAG,OAASwf,EAAIvf,CAAM,CAC7B,CAEA,OAAQ,CACN,KAAM,CAAE,MAAAD,EAAO,OAAAC,CAAM,EAAK,KAAK,GAC/B,YAAK,IAAI,UAAU,EAAG,EAAGD,EAAOC,CAAM,EAC/B,IACT,CAEA,KAAKG,EAAS,CACZ,cAAO,OAAO,KAAK,IAAKA,CAAO,EACxB,IACT,CAEA,MAAO,CACL,YAAK,IAAI,KAAI,EACb,KAAK,IAAI,UAAS,EACX,IACT,CAEA,SAAU,CACR,YAAK,IAAI,QAAO,EACT,IACT,CAEA,WAAY,CACV,YAAK,IAAI,UAAS,EACX,IACT,CAEA,UAAUjQ,EAAGK,EAAG,CACd,YAAK,IAAI,UAAUgvB,EAAIrvB,CAAC,EAAGqvB,EAAIhvB,CAAC,CAAC,EAC1B,IACT,CAEA,MAAML,EAAGK,EAAG,CACV,YAAK,IAAI,MAAML,EAAGK,CAAC,EACZ,IACT,CAEA,UAAUL,EAAGK,EAAGJ,EAAGF,EAAG,CACpB,YAAK,IAAI,UAAUC,EAAGK,EAAGJ,EAAGF,CAAC,EACtB,IACT,CAEA,SAASC,EAAGK,EAAGJ,EAAGF,EAAG,CACnB,YAAK,IAAI,SAASsvB,EAAIrvB,CAAC,EAAI,GAAKqvB,EAAIhvB,CAAC,EAAI,GAAKgvB,EAAIpvB,CAAC,EAAGovB,EAAItvB,CAAC,CAAC,EACrD,IACT,CAEA,SAASoe,EAAMne,EAAGK,EAAG,CACnB,YAAK,IAAI,SAAS8d,EAAMkR,EAAIrvB,CAAC,EAAGqvB,EAAIhvB,CAAC,CAAC,EAC/B,IACT,CAmBA,KAAKgwB,EAAMC,EAAKC,EAAO,CAAA,EAAIC,EAAW,GAAM,CAC1C,KAAM,CAAE,IAAAvtB,CAAG,EAAK,KACV,CACJ,MAAA2sB,EAAO,OAAAI,EAAQ,KAAAS,EAAM,MAAA1O,EAAO,OAAA2O,EAAQ,UAAAC,CAC1C,EAAQJ,EACET,EAAKQ,EAAI,MAAMV,CAAK,EAC1B3sB,EAAI,KAAI,EACRA,EAAI,UAAS,EACb,KAAK,KAAK,CACR,UAAW2sB,EACX,aAAcI,EACd,KAAM,GAAGS,EAAK,OAAS,SAAW,EAAE,IAAIA,EAAK,KAAO,OAAS,EAAE,IAAIpB,EAAIoB,EAAK,IAAI,CAAC,MAAMA,EAAK,IAAI,GAChG,UAAW1O,EACX,YAAaA,CACnB,CAAK,EACD,MAAMoL,EAAO,GAAGkD,CAAI,GAAG,MAAM;AAAA,CAAI,EAC3BO,EAAMN,EAAI,WAAU,EACpBO,EAAQ,CAAA,EACd1D,EAAK,QAASlrB,GAAO,CACnB,MAAM6uB,EAAW7tB,EAAI,YAAYhB,CAAE,EAAE,MACrC,GAAIuuB,GAAYM,EAAWzB,EAAIuB,CAAG,EAAG,CACnC,IAAIG,EAAW,CAAE,EAAG,EAAG,IAAK,EAAG,MAAO,CAAC,EACvC,QAASxyB,EAAI,EAAGA,EAAI0D,EAAG,OAAQ1D,GAAK,EAC9BwyB,EAAS,GAAK1B,EAAIuB,CAAG,IACvBC,EAAM,KAAK5uB,EAAG,OAAO8uB,EAAS,MAAOA,EAAS,GAAG,CAAC,EAClDA,EAAW,CAAE,EAAG,EAAG,IAAK,EAAG,MAAOxyB,CAAC,GAErCwyB,EAAS,KAAO,EAChBA,EAAS,GAAK9tB,EAAI,YAAYhB,EAAG1D,CAAC,CAAC,EAAE,MAAQ,EAE3CwyB,EAAS,IAAM,GACjBF,EAAM,KAAK5uB,EAAG,OAAO8uB,EAAS,MAAOA,EAAS,GAAG,CAAC,CAEtD,MACEF,EAAM,KAAK5uB,CAAE,CAEjB,CAAC,EACD,MAAM+uB,GAAaH,EAAM,OAAS,IAAMJ,EAAK,KAAO,GACpD,IAAIV,EAAKO,EAAI,MAAMN,EAAQgB,CAAS,EACpC,OAAAH,EAAM,QAASrN,GAAQ,CACrB,MAAMsN,EAAW7tB,EAAI,YAAYugB,CAAG,EAAE,MACtC,KAAK,SAASA,EAAKsM,EAAIC,CAAE,EACrBW,GACFb,GAAa,KAAK,KAAM,SAAUC,EAAIC,EAAIH,EAAOI,EAAQS,EAAK,KAAMK,CAAQ,EAE1EH,GACFd,GAAa,KAAK,KAAM,YAAaC,EAAIC,EAAIH,EAAOI,EAAQS,EAAK,KAAMK,CAAQ,EAEjFf,GAAMU,EAAK,KAAO,CACpB,CAAC,EACDxtB,EAAI,QAAO,EACJ,IACT,CAEA,OAAO8M,EAAOgS,EAAO,CACnB,KAAM,CAAE,IAAA9e,CAAG,EAAK,KAChB,OAAAA,EAAI,UAAYmsB,GAChBnsB,EAAI,YAAc8e,EAEdhS,IAAU,SACZ9M,EAAI,UAAYosB,EAAI,CAAC,EAAI,GAChBtf,IAAU,QACnB9M,EAAI,UAAYosB,EAAI,CAAC,EACZtf,IAAU,SACnB9M,EAAI,YAAY,CAACosB,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,CAAC,EACvBtf,IAAU,SACnB9M,EAAI,YAAY,CAACosB,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,CAAC,EACvBtf,IAAU,UACnB9M,EAAI,YAAY,CAACosB,EAAI,CAAC,EAAG,CAAC,CAAC,EAEtB,IACT,CAEA,QAAQ4B,EAAK,CACX,KAAM,CAAE,IAAAhuB,CAAG,EAAK,KAChB,GAAIguB,EAAI,OAAS,EAAG,CAClBhuB,EAAI,UAAS,EACb,KAAM,CAACjD,EAAGK,CAAC,EAAI4wB,EAAI,CAAC,EACpBhuB,EAAI,OAAOssB,GAAQvvB,CAAC,EAAGuvB,GAAQlvB,CAAC,CAAC,EACjC,QAAS9B,EAAI,EAAGA,EAAI0yB,EAAI,OAAQ1yB,GAAK,EAAG,CACtC,KAAM,CAAC4lB,EAAIC,CAAE,EAAI6M,EAAI1yB,CAAC,EACtB0E,EAAI,OAAOssB,GAAQpL,CAAE,EAAGoL,GAAQnL,CAAE,CAAC,CACrC,CACAnhB,EAAI,OAAM,CACZ,CACA,OAAO,IACT,CAEA,cAAcqtB,EAAK,CACjB,KAAM,CAAE,IAAArtB,CAAG,EAAK,KAChBA,EAAI,KAAI,EAER,KAAM,CACJ,UAAAiuB,EAAW,YAAAC,EAAa,aAAAC,EAAc,WAAAC,CAC5C,EAAQf,EACAY,IACF,KAAK,OAAO,GAAGA,CAAS,EAExB,KAAK,KAAK,GAAGZ,EAAI,OAAM,CAAE,GAEvBa,IACF,KAAK,OAAO,GAAGA,CAAW,EAC1B,KAAK,KAAK,GAAGb,EAAI,SAAQ,CAAE,GAEzBc,IACF,KAAK,OAAO,GAAGA,CAAY,EAC3B,KAAK,KAAK,GAAGd,EAAI,UAAS,CAAE,GAE1Be,IACF,KAAK,OAAO,GAAGA,CAAU,EACzB,KAAK,KAAK,GAAGf,EAAI,QAAO,CAAE,GAE5BrtB,EAAI,QAAO,CACb,CAEA,SAASqtB,EAAK,CACZ,KAAM,CAAE,IAAArtB,CAAG,EAAK,KACV,CACJ,EAAAjD,EAAG,EAAAK,EAAG,MAAAwP,EAAO,OAAAC,CACnB,EAAQwgB,EACEgB,EAAKtxB,EAAI6P,EAAQ,GACjB0hB,EAAKlxB,EAAIyP,EAAS,GACxB7M,EAAI,KAAI,EACRA,EAAI,UAAS,EACbA,EAAI,OAAOosB,EAAIiC,CAAE,EAAGjC,EAAIkC,CAAE,CAAC,EAC3BtuB,EAAI,OAAOosB,EAAIiC,EAAK,CAAC,EAAGjC,EAAIkC,CAAE,CAAC,EAC/BtuB,EAAI,OAAOosB,EAAIiC,EAAK,CAAC,EAAGjC,EAAIkC,EAAK,CAAC,CAAC,EACnCtuB,EAAI,UAAS,EACbA,EAAI,UAAY,qBAChBA,EAAI,KAAI,EACRA,EAAI,QAAO,CACb,CAEA,MAAMqtB,EAAK,CACT,KAAM,CAAE,IAAArtB,CAAG,EAAK,KACV,CAAE,EAAAjD,EAAG,EAAAK,EAAG,MAAAwP,CAAK,EAAKygB,EAClBgB,EAAKtxB,EAAI6P,EAAQ,EACvB5M,EAAI,KAAI,EACRA,EAAI,UAAS,EACbA,EAAI,OAAOosB,EAAIiC,EAAK,CAAC,EAAGjC,EAAIhvB,EAAI,CAAC,CAAC,EAClC4C,EAAI,OAAOosB,EAAIiC,CAAE,EAAGjC,EAAIhvB,EAAI,CAAC,CAAC,EAC9B4C,EAAI,OAAOosB,EAAIiC,CAAE,EAAGjC,EAAIhvB,EAAI,CAAC,CAAC,EAC9B4C,EAAI,UAAS,EACbA,EAAI,UAAY,uBAChBA,EAAI,KAAI,EACRA,EAAI,QAAO,CACb,CAEA,OAAOqtB,EAAK,CACV,KAAM,CAAE,IAAArtB,CAAG,EAAK,KACV,CAAE,EAAAjD,EAAG,EAAAK,EAAG,MAAAwP,CAAK,EAAKygB,EAClBgB,EAAKtxB,EAAI6P,EAAQ,EACvB5M,EAAI,KAAI,EACRA,EAAI,UAAS,EACbA,EAAI,OAAOosB,EAAIiC,EAAK,CAAC,EAAGjC,EAAIhvB,EAAI,CAAC,CAAC,EAClC4C,EAAI,OAAOosB,EAAIiC,CAAE,EAAGjC,EAAIhvB,EAAI,CAAC,CAAC,EAC9B4C,EAAI,OAAOosB,EAAIiC,CAAE,EAAGjC,EAAIhvB,EAAI,CAAC,CAAC,EAC9B4C,EAAI,UAAS,EACbA,EAAI,UAAY,uBAChBA,EAAI,KAAI,EACRA,EAAI,QAAO,CACb,CAEA,KAAKqtB,EAAKkB,EAAS,CACjB,KAAM,CAAE,IAAAvuB,CAAG,EAAK,KACV,CACJ,EAAAjD,EAAG,EAAAK,EAAG,MAAAwP,EAAO,OAAAC,EAAQ,QAAA2hB,CAC3B,EAAQnB,EACJrtB,EAAI,KAAI,EACRA,EAAI,UAAS,EACbA,EAAI,UAAYwuB,GAAW,OAC3BxuB,EAAI,KAAKssB,GAAQvvB,EAAI,CAAC,EAAGuvB,GAAQlvB,EAAI,CAAC,EAAGgvB,EAAIxf,EAAQ,CAAC,EAAGwf,EAAIvf,EAAS,CAAC,CAAC,EACxE7M,EAAI,KAAI,EACRA,EAAI,KAAI,EACRuuB,EAAO,EACPvuB,EAAI,QAAO,CACb,CACF,CCpYA,MAAMyuB,GAAY,CAChB,CAAE,IAAK,QAAS,MAAO,OAAO,EAC9B,CAAE,IAAK,YAAa,MAAO,WAAW,EACtC,CAAE,IAAK,kBAAmB,MAAO,iBAAiB,EAClD,CAAE,IAAK,gBAAiB,MAAO,eAAe,EAC9C,CAAE,IAAK,cAAe,MAAO,aAAa,EAC1C,CAAE,IAAK,UAAW,MAAO,SAAS,EAClC,CAAE,IAAK,OAAQ,MAAO,MAAM,CAC9B,EAKMC,GAAY,CAChB,CAAE,GAAI,IAAK,GAAI,EAAE,EACjB,CAAE,GAAI,EAAG,GAAI,EAAE,EACf,CAAE,GAAI,EAAG,GAAI,EAAE,EACf,CAAE,GAAI,GAAI,GAAI,EAAE,EAChB,CAAE,GAAI,KAAM,GAAI,EAAE,EAClB,CAAE,GAAI,GAAI,GAAI,EAAE,EAChB,CAAE,GAAI,GAAI,GAAI,EAAE,EAChB,CAAE,GAAI,GAAI,GAAI,IAAI,EAClB,CAAE,GAAI,GAAI,GAAI,EAAE,EAChB,CAAE,GAAI,GAAI,GAAI,IAAI,EAClB,CAAE,GAAI,GAAI,GAAI,EAAE,EAChB,CAAE,GAAI,GAAI,GAAI,IAAI,EAClB,CAAE,GAAI,GAAI,GAAI,EAAE,EAChB,CAAE,GAAI,GAAI,GAAI,IAAI,EAClB,CAAE,GAAI,GAAI,GAAI,EAAE,EAChB,CAAE,GAAI,GAAI,GAAI,EAAE,CAIlB,EAOA,SAASC,GAAkBzzB,EAAI,CAC7B,QAASI,EAAI,EAAGA,EAAIozB,GAAU,OAAQpzB,GAAK,EAAG,CAC5C,MAAMszB,EAAWF,GAAUpzB,CAAC,EAC5B,GAAIszB,EAAS,KAAO1zB,EAClB,OAAO0zB,EAAS,EAEpB,CACA,OAAO1zB,CACT,CChDA,MAAM2zB,GAAyB/Z,GAAQ,CACrC,MAAMga,EAAgB,CAAA,EAChBC,EAAQ,CAAA,EACd,IAAIC,EAAU,CAAA,EACVC,EAAY,EACZC,EAAgB,GAChBC,EAAY,EACZC,EAAO,GACX,QAAS9zB,EAAI,EAAGA,EAAIwZ,EAAI,OAAQxZ,GAAK,EAAG,CACtC,MAAMC,EAAIuZ,EAAI,OAAOxZ,CAAC,EACtB,GAAIC,IAAM,IAAK,CACb,GAAIA,GAAK,KAAOA,GAAK,IACnByzB,EAAQ,KAAKzzB,EAAE,aAAa,UAClBA,GAAK,KAAOA,GAAK,KAASA,GAAK,KAAOA,GAAK,KAAQA,IAAM,IACnEyzB,EAAQ,KAAKzzB,CAAC,UACLA,IAAM,IAAK,CAEpB,IADAD,GAAK,EACEwZ,EAAI,OAAOxZ,CAAC,IAAM,KACvB0zB,EAAQ,KAAKla,EAAI,OAAOxZ,CAAC,CAAC,EAC1BA,GAAK,EAEPyzB,EAAM,KAAK,IAAIC,EAAQ,KAAK,EAAE,CAAC,EAAE,EACjCA,EAAU,CAAA,CACZ,SAAWzzB,IAAM,KAAO,YAAY,KAAK6zB,CAAI,EAC3CJ,EAAQ,KAAKzzB,CAAC,MACT,CAKL,GAHIA,IAAM,KAAOyzB,EAAQ,OAAS,GAChCD,EAAM,KAAKC,EAAQ,KAAK,EAAE,CAAC,EAEzBzzB,IAAM,IAAK,CACb,IAAI8zB,EAAKP,EAAc,IAAG,EAC1B,GAAIG,IAAc,EAEhB,GAAI,CACF,KAAM,CAACK,EAAIC,CAAE,EAAI1a,GAAQka,EAAM,KAAK,EAC9B,CAACV,EAAIC,CAAE,EAAIzZ,GAAQka,EAAM,KAAK,EAEpC,IAAIS,EAAW,EACf,QAASzyB,EAAIsxB,EAAItxB,GAAKuyB,EAAIvyB,GAAK,EAC7B,QAASK,EAAIkxB,EAAIlxB,GAAKmyB,EAAInyB,GAAK,EAC7B2xB,EAAM,KAAKha,GAAQhY,EAAGK,CAAC,CAAC,EACxBoyB,GAAY,EAGhBT,EAAM,KAAK,CAACM,EAAIG,CAAQ,CAAC,CAC3B,MAAY,CAEZ,SACSP,IAAc,GAAKA,IAAc,EACtCA,IAAc,GAAGF,EAAM,KAAKG,CAAa,EAE7CH,EAAM,KAAK,CAACM,EAAIF,CAAS,CAAC,EAC1BA,EAAY,MAGZ,MAAOE,IAAO,MACZN,EAAM,KAAKM,CAAE,EACT,EAAAP,EAAc,QAAU,KAC5BO,EAAKP,EAAc,IAAG,EAG1BG,EAAY,CACd,SAAW1zB,IAAM,KAAOA,IAAM,KAAOA,IAAM,IAAK,CAC9C,MAAMk0B,EAAK3a,EAAI,OAAOxZ,EAAI,CAAC,EAC3B4zB,EAAgB3zB,GACZk0B,IAAO,KAAOA,IAAO,OACvBP,GAAiBO,EACjBn0B,GAAK,GAEP2zB,EAAY,CACd,SAAW1zB,IAAM,IACf0zB,EAAY,UACH1zB,IAAM,IACX0zB,IAAc,GAChBF,EAAM,KAAKG,CAAa,EAE1BD,EAAY,EACZE,GAAa,UACJ5zB,IAAM,KAAOyzB,EAAQ,OAAS,EAEvCF,EAAc,KAAKE,EAAQ,KAAK,EAAE,CAAC,MAC9B,CAGL,GAAIF,EAAc,OAAS,IAAMvzB,IAAM,KAAOA,IAAM,KAAM,CACxD,IAAIokB,EAAMmP,EAAcA,EAAc,OAAS,CAAC,EAEhD,GADInP,IAAQ,KAAKoP,EAAM,KAAKD,EAAc,KAAK,EAC3CnP,IAAQ,KAAOA,IAAQ,IACzB,KAAOmP,EAAc,OAAS,IAC5BnP,EAAMmP,EAAcA,EAAc,OAAS,CAAC,EACxCnP,IAAQ,MAAKoP,EAAM,KAAKD,EAAc,KAAK,CAIrD,SAAWA,EAAc,OAAS,EAAG,CACnC,MAAMnP,EAAMmP,EAAcA,EAAc,OAAS,CAAC,GAC9CnP,IAAQ,KAAOA,IAAQ,MAAKoP,EAAM,KAAKD,EAAc,KAAK,CAChE,CACAA,EAAc,KAAKvzB,CAAC,CACtB,CACAyzB,EAAU,CAAA,CACZ,CACAI,EAAO7zB,CACT,CACF,CAIA,IAHIyzB,EAAQ,OAAS,GACnBD,EAAM,KAAKC,EAAQ,KAAK,EAAE,CAAC,EAEtBF,EAAc,OAAS,GAC5BC,EAAM,KAAKD,EAAc,KAAK,EAEhC,OAAOC,CACT,EAEMW,GAAc,CAACC,EAASC,IAAe,CAC3C,KAAM,CAACC,CAAE,EAAIF,EACb,IAAIG,EAAOH,EACX,GAAIE,IAAO,IACT,OAAOF,EAAQ,UAAU,CAAC,EAE5B,IAAIhb,EAAM,EAKV,GAJIkb,IAAO,MACTC,EAAOH,EAAQ,UAAU,CAAC,EAC1Bhb,EAAM,IAEJmb,EAAK,CAAC,GAAK,KAAOA,EAAK,CAAC,GAAK,IAC/B,OAAOnb,EAAM,OAAOmb,CAAI,EAE1B,KAAM,CAAC/yB,EAAGK,CAAC,EAAIyX,GAAQib,CAAI,EAC3B,OAAOnb,EAAMib,EAAW7yB,EAAGK,CAAC,CAC9B,EAMM2yB,GAAiB,CAACC,EAAUC,EAAYL,EAAYM,IAAa,CACrE,MAAMnB,EAAQ,CAAA,EAEd,QAASzzB,EAAI,EAAGA,EAAI00B,EAAS,OAAQ10B,GAAK,EAAG,CAE3C,MAAMw0B,EAAOE,EAAS10B,CAAC,EACjB60B,EAAKL,EAAK,CAAC,EACjB,GAAIA,IAAS,IAAK,CAChB,MAAMnQ,EAAMoP,EAAM,IAAG,EACrBA,EAAM,KAAKzU,GAAW,IAAKyU,EAAM,IAAG,EAAIpP,CAAG,CAAC,CAC9C,SAAWmQ,IAAS,IAClB,GAAIf,EAAM,SAAW,EAAG,CACtB,MAAMpP,EAAMoP,EAAM,IAAG,EACrBA,EAAM,KAAKzU,GAAW,IAAKqF,EAAK,EAAE,CAAC,CACrC,KAAO,CACL,MAAMA,EAAMoP,EAAM,IAAG,EACrBA,EAAM,KAAKzU,GAAW,IAAKyU,EAAM,IAAG,EAAIpP,CAAG,CAAC,CAC9C,SACSmQ,IAAS,IAClBf,EAAM,KAAKzU,GAAW,IAAKyU,EAAM,MAAOA,EAAM,IAAG,CAAE,CAAC,UAC3Ce,IAAS,IAAK,CACvB,MAAMnQ,EAAMoP,EAAM,IAAG,EACrBA,EAAM,KAAKzU,GAAW,IAAKyU,EAAM,IAAG,EAAIpP,CAAG,CAAC,CAC9C,SAAWwQ,IAAO,KAAOA,IAAO,KAAOA,IAAO,IAAK,CACjD,IAAIxQ,EAAMoP,EAAM,IAAG,EACd,OAAO,MAAMpP,CAAG,IAAGA,EAAM,OAAOA,CAAG,GACxC,IAAIK,EAAO+O,EAAM,IAAG,EACf,OAAO,MAAM/O,CAAI,IAAGA,EAAO,OAAOA,CAAI,GAC3C,IAAIrL,EAAM,GACNwb,IAAO,IACTxb,EAAOqL,IAASL,EACPmQ,IAAS,IAClBnb,EAAOqL,EAAOL,EACLmQ,IAAS,KAClBnb,EAAOqL,GAAQL,EACNmQ,IAAS,IAClBnb,EAAOqL,EAAOL,EACLmQ,IAAS,OAClBnb,EAAOqL,GAAQL,GAEjBoP,EAAM,KAAKpa,CAAG,CAChB,SAAW,MAAM,QAAQmb,CAAI,EAAG,CAC9B,KAAM,CAACM,EAASvV,CAAG,EAAIiV,EACjBO,EAAS,CAAA,EACf,QAAS91B,EAAI,EAAGA,EAAIsgB,EAAKtgB,GAAK,EAC5B81B,EAAO,KAAKtB,EAAM,KAAK,EAEzBA,EAAM,KAAKkB,EAAWG,CAAO,EAAE,OAAOC,EAAO,QAAO,CAAE,CAAC,CACzD,KAAO,CACL,GAAIH,EAAS,SAASJ,CAAI,EACxB,MAAO,IAEJK,GAAM,KAAOA,GAAM,KAASA,GAAM,KAAOA,GAAM,MAClDD,EAAS,KAAKJ,CAAI,EAEpBf,EAAM,KAAKW,GAAYI,EAAMF,CAAU,CAAC,EACxCM,EAAS,IAAG,CACd,CAEF,CACA,OAAOnB,EAAM,CAAC,CAChB,EAEMa,GAAa,CAAC9a,EAAKmb,EAAYK,EAAaJ,EAAW,CAAA,IAAO,CAClE,GAAIpb,EAAI,CAAC,IAAM,IAAK,CAClB,MAAMia,EAAQF,GAAsB/Z,EAAI,UAAU,CAAC,CAAC,EACpD,OAAIia,EAAM,QAAU,EAAUja,EACvBib,GACLhB,EACAkB,EACA,CAAClzB,EAAGK,IAAMwyB,GAAWU,EAAYvzB,EAAGK,CAAC,EAAG6yB,EAAYK,EAAaJ,CAAQ,EACzEA,CACN,CACE,CACA,OAAOpb,CACT,EAEAyb,GAAe,CACb,OAAQX,EACV,EC9MMY,GAAe,CACnB,CACE,IAAK,MACL,MAAOtT,EAAG,aAAa,EACvB,OAAQuT,GAAOA,EAAI,OAAO,CAACp1B,EAAGwB,IAAMyd,GAAW,IAAKjf,EAAGwB,CAAC,EAAG,CAAC,CAChE,EACE,CACE,IAAK,UACL,MAAOqgB,EAAG,iBAAiB,EAC3B,OAAQuT,GAAOA,EAAI,OAAO,CAACp1B,EAAGwB,IAAM,OAAOxB,CAAC,EAAI,OAAOwB,CAAC,EAAG,CAAC,EAAI4zB,EAAI,MACxE,EACE,CACE,IAAK,MACL,MAAOvT,EAAG,aAAa,EACvB,OAAQuT,GAAO,KAAK,IAAI,GAAGA,EAAI,IAAItzB,GAAK,OAAOA,CAAC,CAAC,CAAC,CACtD,EACE,CACE,IAAK,MACL,MAAO+f,EAAG,aAAa,EACvB,OAAQuT,GAAO,KAAK,IAAI,GAAGA,EAAI,IAAItzB,GAAK,OAAOA,CAAC,CAAC,CAAC,CACtD,EACE,CACE,IAAK,KACL,MAAO+f,EAAG,aAAa,EACvB,OAAQ,CAAC,CAACrgB,EAAGnC,EAAGiB,CAAC,IAAOkB,EAAInC,EAAIiB,CACpC,EACE,CACE,IAAK,MACL,MAAOuhB,EAAG,aAAa,EACvB,OAAQuT,GAAOA,EAAI,MAAMzxB,GAAMA,CAAE,CACrC,EACE,CACE,IAAK,KACL,MAAOke,EAAG,YAAY,EACtB,OAAQuT,GAAOA,EAAI,KAAKzxB,GAAMA,CAAE,CACpC,EACE,CACE,IAAK,SACL,MAAOke,EAAG,gBAAgB,EAC1B,OAAQuT,GAAOA,EAAI,KAAK,EAAE,CAC9B,CAkBA,EAEM/E,GAAW8E,GASXE,GAAW,CAAA,EACjBF,GAAa,QAAS70B,GAAM,CAC1B+0B,GAAS/0B,EAAE,GAAG,EAAIA,CACpB,CAAC,ECtFD,MAAMg1B,GAAqBxzB,GAAKA,EAE1ByzB,GAAsBzzB,GAAM,CAEhC,GAAI,iBAAiB,KAAKA,CAAC,EAAG,CAC5B,MAAM6b,EAAK,OAAO7b,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAQ,EAClC,CAAC0zB,EAAO,GAAGC,CAAK,EAAI9X,EAAG,MAAM,KAAK,EACxC,MAAO,CAAC6X,EAAM,QAAQ,0BAA2B,KAAK,EAAG,GAAGC,CAAK,CACnE,CACA,OAAO3zB,CACT,EAEM4zB,GAAc,CAClB,CACE,IAAK,SACL,MAAO7T,EAAG,eAAe,EACzB,KAAM,SACN,OAAQyT,EACZ,EACE,CACE,IAAK,OACL,MAAOzT,EAAG,aAAa,EACvB,KAAM,SACN,OAAQyT,EACZ,EACE,CACE,IAAK,SACL,MAAOzT,EAAG,eAAe,EACzB,KAAM,SACN,MAAO,WACP,OAAQ0T,EACZ,EACE,CACE,IAAK,UACL,MAAO1T,EAAG,gBAAgB,EAC1B,KAAM,SACN,MAAO,SACP,OAAQ/f,GAAK,GAAGA,CAAC,GACrB,EACE,CACE,IAAK,MACL,MAAO+f,EAAG,YAAY,EACtB,KAAM,SACN,MAAO,SACP,OAAQ/f,GAAK,IAAIyzB,GAAmBzzB,CAAC,CAAC,EAC1C,EACE,CACE,IAAK,MACL,MAAO+f,EAAG,YAAY,EACtB,KAAM,SACN,MAAO,SACP,OAAQ/f,GAAK,IAAIyzB,GAAmBzzB,CAAC,CAAC,EAC1C,EACE,CACE,IAAK,MACL,MAAO+f,EAAG,YAAY,EACtB,KAAM,SACN,MAAO,SACP,OAAQ/f,GAAK,IAAIyzB,GAAmBzzB,CAAC,CAAC,EAC1C,EACE,CACE,IAAK,OACL,MAAO+f,EAAG,aAAa,EACvB,KAAM,OACN,MAAO,aACP,OAAQyT,EACZ,EACE,CACE,IAAK,OACL,MAAOzT,EAAG,aAAa,EACvB,KAAM,OACN,MAAO,WACP,OAAQyT,EACZ,EACE,CACE,IAAK,WACL,MAAOzT,EAAG,iBAAiB,EAC3B,KAAM,OACN,MAAO,sBACP,OAAQyT,EACZ,EACE,CACE,IAAK,WACL,MAAOzT,EAAG,iBAAiB,EAC3B,KAAM,OACN,MAAO,WACP,OAAQyT,EACZ,CACA,EASMK,GAAU,CAAA,EAChBD,GAAY,QAASp1B,GAAM,CACzBq1B,GAAQr1B,EAAE,GAAG,EAAIA,CACnB,CAAC,EC5FD,MAAMs1B,GAAmB,EACnBC,GAA6B,CAAE,UAAW,SAAS,EACnDC,GAAiB,CACrB,UAAW,OACX,UAAWhF,GACX,YAAa,SACf,EACA,SAASiF,IAAwB,CAC/B,MAAO,CACL,UAAW,SACX,aAAc,SACd,KAAM,OAAOhF,EAAI,EAAE,CAAC,qBACpB,UAAW,UACX,UAAWD,GAAa,EACxB,YAAa,SACjB,CACA,CAEA,SAASkF,GAAW5a,EAAM6a,EAAQ9c,EAAQ+c,EAAU,EAAG,CACrD,KAAM,CACJ,KAAAvR,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACtB,EAAM4J,EAAK,SAAS6a,EAAQ9c,CAAM,EAChC,OAAO,IAAI+X,GAAQvM,EAAML,EAAM4R,EAAS3kB,EAAOC,EAAQokB,EAAgB,CACzE,CAkBO,SAASO,GAAWC,EAAMhb,EAAM6a,EAAQ9c,EAAQ+c,EAAU,EAAG,CAClE,KAAM,CAAE,aAAAG,EAAc,KAAApT,EAAM,KAAAwB,CAAI,EAAKrJ,EACrC,GAAI6H,EAAK,OAAOgT,CAAM,GAAKxR,EAAK,OAAOtL,CAAM,EAAG,OAChD,IAAImd,EAAUL,EACVI,EAAa,IAAIJ,CAAM,IACzBK,EAAUD,EAAa,IAAIJ,CAAM,GAGnC,MAAM5Z,EAAOjB,EAAK,QAAQkb,EAASnd,CAAM,EACzC,GAAIkD,IAAS,KAAM,OACnB,IAAIka,EAAS,GACT,aAAcla,GAAQA,EAAK,WAAa,KAC1Cka,EAAS,IAGX,MAAM9kB,EAAQ2J,EAAK,sBAAsBkb,EAASnd,CAAM,EAClDqd,EAAOR,GAAW5a,EAAM6a,EAAQ9c,EAAQ+c,CAAO,EACrDM,EAAK,QAAU/kB,EAAM,QACjBA,EAAM,SAAW,SACnB+kB,EAAK,WAAW/kB,EAAM,MAAM,EAE5B2kB,EAAK,cAAcI,CAAI,GAEzBJ,EAAK,KAAKI,EAAM,IAAM,CAEpB,IAAIvR,EAAW,GACV7J,EAAK,SAAS,WAGjB6J,EAAW5I,EAAK,MAAQ,GAFxB4I,EAAWiQ,GAAM,OAAO7Y,EAAK,MAAQ,GAAIgZ,GAAU,CAACtzB,EAAGL,IAAO0Z,EAAK,qBAAqB1Z,EAAGK,CAAC,CAAE,EAI5F0P,EAAM,SAERwT,EAAW0Q,GAAQlkB,EAAM,MAAM,EAAE,OAAOwT,CAAQ,GAElD,MAAMkN,EAAO,OAAO,OAAO,CAAA,EAAI1gB,EAAM,IAAI,EACzC0gB,EAAK,KAAOmB,GAAkBnB,EAAK,IAAI,EAEvCiE,EAAK,KAAKnR,EAAUuR,EAAM,CACxB,MAAO/kB,EAAM,MACb,OAAQA,EAAM,OACd,KAAA0gB,EACA,MAAO1gB,EAAM,MACb,OAAQA,EAAM,OACd,UAAWA,EAAM,SACvB,EAAOA,EAAM,QAAQ,EAEH2J,EAAK,YAAY,SAAS6a,EAAQ9c,CAAM,GAGpDid,EAAK,MAAMI,CAAI,EAEbD,GACFH,EAAK,OAAOI,CAAI,CAEpB,CAAC,CACH,CAEA,SAASC,GAAiBtP,EAAW,CACnC,KAAM,CAAE,KAAA/L,EAAM,KAAAgb,CAAI,EAAK,KACvB,GAAIjP,EAAW,CACb,KAAM,CAAE,WAAA1B,CAAU,EAAKrK,EACvB,GAAI,CAACqK,EAAW,SAAU,OAC1B,MAAMiR,EAAUjR,EAAW,OAAM,EAC7B0B,EAAU,WAAWuP,CAAO,GAC9BA,EAAQ,KAAK,CAACrc,EAAIC,IAAO,CACvB,MAAMkc,EAAOR,GAAW5a,EAAMf,EAAIC,CAAE,EACpC8b,EAAK,SAASI,CAAI,CACpB,CAAC,CAEL,CACF,CAEA,SAASG,GAAcxP,EAAWyP,EAAIC,EAAIrF,EAAIC,EAAI,CAChD,KAAM,CAAE,KAAA2E,EAAM,KAAAhb,CAAI,EAAK,KACvBgb,EAAK,KAAI,EACTA,EAAK,UAAUQ,EAAIC,CAAE,EAClB,UAAUrF,EAAIC,CAAE,EAEnB,KAAM,CAAE,aAAAzL,CAAY,EAAK5K,EAEnB0b,EAAyBzc,GAAO,CACpC,MAAMf,EAAM0M,EAAa,IAAI3L,CAAE,EAC/B,GAAIf,EAAK,CACP,MAAM9H,EAAS4J,EAAK,KAAK,UAAUf,CAAE,EACrC+b,EAAK,UAAU,EAAG,CAAC5kB,CAAM,CAC3B,CACA,MAAO,CAAC8H,CACV,EAEMyd,EAAuB3b,EAAK,qBAAqB+L,EAAU,IAAKA,EAAU,GAAG,EAEnFiP,EAAK,KAAI,EACTA,EAAK,UAAU,EAAG,CAACW,CAAoB,EACvC5P,EAAU,KAAK,CAAC9M,EAAIC,IAAO,CACzB6b,GAAWC,EAAMhb,EAAMf,EAAIC,CAAE,CAC/B,EAAGD,GAAMyc,EAAsBzc,CAAE,CAAC,EAClC+b,EAAK,QAAO,EAIZ,MAAMja,EAAO,IAAI,IACjBia,EAAK,KAAI,EACTA,EAAK,UAAU,EAAG,CAACW,CAAoB,EACvC3b,EAAK,iBAAiB+L,EAAW,CAAC,CAAE,IAAAnN,EAAK,IAAAC,EAAK,IAAAC,KAAU,CACtD,GAAI,CAAC8L,EAAa,IAAIhM,CAAG,EACvBmc,GAAWC,EAAMhb,EAAMpB,EAAKC,CAAG,UACtB,CAACkC,EAAK,IAAInC,CAAG,EAAG,CACzBmC,EAAK,IAAInC,CAAG,EACZ,MAAMxI,EAAS4J,EAAK,KAAK,UAAUpB,EAAKE,EAAM,CAAC,EAC/Ckc,EAAK,UAAU,EAAG,CAAC5kB,CAAM,CAC3B,CACF,CAAC,EACD4kB,EAAK,QAAO,EAGZK,GAAiB,KAAK,KAAMtP,CAAS,EAErCiP,EAAK,QAAO,CACd,CAEA,SAASY,GAAyBt1B,EAAGK,EAAGJ,EAAGF,EAAG,CAC5C,KAAM,CAAE,KAAA20B,CAAI,EAAK,KACjBA,EAAK,KAAI,EACTA,EAAK,KAAK,CAAE,UAAW,0BAA0B,CAAE,EAChD,SAAS10B,EAAGK,EAAGJ,EAAGF,CAAC,EACtB20B,EAAK,QAAO,CACd,CAQA,SAASa,GAAmBva,EAAMyK,EAAWxlB,EAAGF,EAAG+vB,EAAIC,EAAI,CACzD,KAAM,CAAE,KAAA2E,EAAM,KAAAhb,CAAI,EAAK,KACjB8b,EAAY/P,EAAU,EACtBgQ,EAAWhQ,EAAU,EACrBiQ,EAAM3F,EAAKhwB,EACX41B,EAAM7F,EAAK7vB,EAEjBy0B,EAAK,KAAI,EAETA,EAAK,KAAKP,EAA0B,GAChCnZ,IAAS,OAASA,IAAS,SAAQ0Z,EAAK,SAAS,EAAGgB,EAAKz1B,EAAGu1B,CAAS,GACrExa,IAAS,OAASA,IAAS,QAAO0Z,EAAK,SAASiB,EAAK,EAAGF,EAAU11B,CAAC,EAEvE,KAAM,CACJ,IAAAuY,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,CACnB,EAAMiB,EAAK,SAAS,MAIlBgb,EAAK,KAAKL,IAAuB,GAE7BrZ,IAAS,OAASA,IAAS,UAC7BtB,EAAK,QAAQ+L,EAAU,IAAKA,EAAU,IAAK,CAAClnB,EAAG6lB,EAAI0B,IAAc,CAC/D,MAAMzlB,EAAIq1B,EAAMtR,EACVzV,EAAKpQ,EACXm2B,EAAK,KAAK,CAAC,EAAGr0B,CAAC,EAAG,CAACJ,EAAGI,CAAC,CAAC,EACpBiY,GAAO3J,GAAMA,EAAK6J,EAAM,GAC1B8c,GAAyB,KAAK,KAAM,EAAGj1B,EAAGJ,EAAG6lB,CAAS,EAExD4O,EAAK,SAAS/lB,EAAK,EAAG1O,EAAI,EAAGI,EAAKylB,EAAY,CAAE,EAC5CvnB,EAAI,GAAKmb,EAAK,KAAK,OAAOnb,EAAI,CAAC,IACjCm2B,EAAK,KAAI,EACTA,EAAK,KAAK,CAAE,YAAa,SAAS,CAAE,EACpCA,EAAK,KAAK,CAAC,EAAGr0B,EAAI,CAAC,EAAG,CAACJ,EAAI,EAAGI,EAAI,CAAC,CAAC,EACpCq0B,EAAK,QAAO,EAEhB,CAAC,EACDA,EAAK,KAAK,CAAC,EAAGc,EAAYE,CAAG,EAAG,CAACz1B,EAAGu1B,EAAYE,CAAG,CAAC,EACpDhB,EAAK,KAAK,CAACz0B,EAAGy1B,CAAG,EAAG,CAACz1B,EAAGu1B,EAAYE,CAAG,CAAC,IAGtC1a,IAAS,OAASA,IAAS,SAC7BtB,EAAK,QAAQ+L,EAAU,IAAKA,EAAU,IAAK,CAAClnB,EAAG4lB,EAAI4B,IAAa,CAC9D,MAAM/lB,EAAI21B,EAAMxR,EACVxV,EAAKpQ,EACXm2B,EAAK,KAAK,CAAC10B,EAAG,CAAC,EAAG,CAACA,EAAGD,CAAC,CAAC,EACpBwY,GAAO5J,GAAMA,EAAK8J,EAAM,GAC1B6c,GAAyB,KAAK,KAAMt1B,EAAG,EAAG+lB,EAAUhmB,CAAC,EAEvD20B,EAAK,SAASnd,GAAS5I,CAAE,EAAG3O,EAAK+lB,EAAW,EAAIhmB,EAAI,CAAC,EACjDxB,EAAI,GAAKmb,EAAK,KAAK,OAAOnb,EAAI,CAAC,IACjCm2B,EAAK,KAAI,EACTA,EAAK,KAAK,CAAE,YAAa,SAAS,CAAE,EACpCA,EAAK,KAAK,CAAC10B,EAAI,EAAG,CAAC,EAAG,CAACA,EAAI,EAAGD,EAAI,CAAC,CAAC,EACpC20B,EAAK,QAAO,EAEhB,CAAC,EACDA,EAAK,KAAK,CAACe,EAAWE,EAAK,CAAC,EAAG,CAACF,EAAWE,EAAK51B,CAAC,CAAC,EAClD20B,EAAK,KAAK,CAAC,EAAG30B,CAAC,EAAG,CAAC01B,EAAWE,EAAK51B,CAAC,CAAC,GAEvC20B,EAAK,QAAO,CACd,CAEA,SAASkB,GAAuBV,EAAIC,EAAI,CACtC,KAAM,CAAE,KAAAT,CAAI,EAAK,KACjBA,EAAK,KAAI,EAETA,EAAK,KAAK,CAAE,UAAW,SAAS,CAAE,EAC/B,SAAS,EAAG,EAAGQ,EAAIC,CAAE,EACxBT,EAAK,QAAO,CACd,CAEA,SAASmB,GAAkB,CACzB,IAAAvd,EAAK,IAAAC,EAAK,IAAAC,EAAK,IAAAC,EAAK,EAAAxY,EAAG,EAAAF,CACzB,EAAGm1B,EAAIC,EAAIrF,EAAIC,EAAI,CACjB,KAAM,CAAE,KAAA2E,EAAM,KAAAhb,CAAI,EAAK,KACjB,CAAE,SAAAyJ,CAAQ,EAAKzJ,EASrB,GAPAgb,EAAK,KAAI,EACTA,EAAK,KAAKN,EAAc,EACrB,UAAUc,EAAKpF,EAAIqF,EAAKpF,CAAE,EAKzB,CAAC5M,EAAS,SAAU,CACtBuR,EAAK,QAAO,EACZ,MACF,CAEAhb,EAAK,QAAQpB,EAAKE,EAAK,CAACja,EAAG8B,EAAGy1B,IAAO,CAE/Bv3B,IAAM+Z,GAAKoc,EAAK,KAAK,CAAC,EAAGr0B,CAAC,EAAG,CAACJ,EAAGI,CAAC,CAAC,EACnC9B,IAAMia,GAAKkc,EAAK,KAAK,CAAC,EAAGr0B,EAAIy1B,CAAE,EAAG,CAAC71B,EAAGI,EAAIy1B,CAAE,CAAC,CACnD,CAAC,EACDpc,EAAK,QAAQnB,EAAKE,EAAK,CAACla,EAAGyB,EAAG+1B,IAAO,CAC/Bx3B,IAAMga,GAAKmc,EAAK,KAAK,CAAC10B,EAAG,CAAC,EAAG,CAACA,EAAGD,CAAC,CAAC,EACnCxB,IAAMka,GAAKic,EAAK,KAAK,CAAC10B,EAAI+1B,EAAI,CAAC,EAAG,CAAC/1B,EAAI+1B,EAAIh2B,CAAC,CAAC,CACnD,CAAC,EACD20B,EAAK,QAAO,CACd,CAEA,SAASsB,GAA0Bd,EAAIC,EAAIc,EAAKC,EAAK,CACnD,KAAM,CAAE,KAAAxB,EAAM,KAAAhb,CAAI,EAAK,KACjB+T,EAAS/T,EAAK,UAAS,EAAKwb,EAC5BiB,EAAUzc,EAAK,WAAU,EAAKyb,EACpCT,EAAK,KAAI,EACN,UAAUQ,EAAIC,CAAE,EAChB,KAAK,CAAE,YAAa,yBAA0B,EACjDT,EAAK,KAAK,CAAC,EAAGwB,CAAG,EAAG,CAACzI,EAAQyI,CAAG,CAAC,EACjCxB,EAAK,KAAK,CAACuB,EAAK,CAAC,EAAG,CAACA,EAAKE,CAAO,CAAC,EAClCzB,EAAK,QAAO,CACd,CAGA,MAAM0B,EAAM,CACV,YAAYtpB,EAAI4M,EAAM,CACpB,KAAK,GAAK5M,EACV,KAAK,KAAO,IAAIsjB,GAAKtjB,EAAI4M,EAAK,UAAS,EAAIA,EAAK,YAAY,EAC5D,KAAK,KAAOA,CACd,CAEA,UAAUA,EAAM,CACd,KAAK,KAAOA,EACZ,KAAK,OAAM,CACb,CAEA,QAAS,CAEP,KAAM,CAAE,KAAAA,CAAI,EAAK,KACX,CAAE,KAAA6H,EAAM,KAAAwB,CAAI,EAAKrJ,EAEjBwb,EAAKnS,EAAK,WAEVoS,EAAK5T,EAAK,OAEhB,KAAK,KAAK,OAAO7H,EAAK,YAAaA,EAAK,YAAY,EACpD,KAAK,MAAK,EAEV,MAAM+L,EAAY/L,EAAK,UAAS,EAE1BoW,EAAKpW,EAAK,iBAAgB,EAC1BqW,EAAKrW,EAAK,kBAAiB,EAC3B,CAAE,EAAA1Z,EAAG,EAAAK,CAAC,EAAKqZ,EAAK,OAEtBmc,GAAkB,KAAK,KAAMpQ,EAAWyP,EAAIC,EAAIrF,EAAIC,CAAE,EACtDkF,GAAc,KAAK,KAAMxP,EAAWyP,EAAIC,EAAI,CAACn1B,EAAG,CAACK,CAAC,EAClDk1B,GAAmB,KAAK,KAAM,MAAO9P,EAAWyP,EAAIC,EAAIrF,EAAIC,CAAE,EAC9D6F,GAAuB,KAAK,KAAMV,EAAIC,CAAE,EACxC,KAAM,CAACnQ,EAAKD,CAAG,EAAIrL,EAAK,OACxB,GAAIsL,EAAM,GAAKD,EAAM,EAAG,CAEtB,GAAIC,EAAM,EAAG,CACX,MAAMqR,EAAK5Q,EAAU,MAAK,EAC1B4Q,EAAG,IAAM,EACTA,EAAG,IAAMrR,EAAM,EACfqR,EAAG,EAAItG,EACP8F,GAAkB,KAAK,KAAMQ,EAAInB,EAAIC,EAAIrF,EAAI,CAAC,EAC9CmF,GAAc,KAAK,KAAMoB,EAAInB,EAAIC,EAAI,CAACn1B,EAAG,CAAC,EAC1Cu1B,GAAmB,KAAK,KAAM,MAAOc,EAAInB,EAAIC,EAAIrF,EAAI,CAAC,CACxD,CAEA,GAAI/K,EAAM,EAAG,CACX,MAAMsR,EAAK5Q,EAAU,MAAK,EAC1B4Q,EAAG,IAAM,EACTA,EAAG,IAAMtR,EAAM,EACfsR,EAAG,EAAIvG,EACP+F,GAAkB,KAAK,KAAMQ,EAAInB,EAAIC,EAAI,EAAGpF,CAAE,EAC9CwF,GAAmB,KAAK,KAAM,OAAQc,EAAInB,EAAIC,EAAI,EAAGpF,CAAE,EACvDkF,GAAc,KAAK,KAAMoB,EAAInB,EAAIC,EAAI,EAAG,CAAC90B,CAAC,CAC5C,CAEA,MAAMi2B,EAAkB5c,EAAK,gBAAe,EAC5Cmc,GAAkB,KAAK,KAAMS,EAAiBpB,EAAIC,EAAI,EAAG,CAAC,EAC1DI,GAAmB,KAAK,KAAM,MAAOe,EAAiBpB,EAAIC,EAAI,EAAG,CAAC,EAClEF,GAAc,KAAK,KAAMqB,EAAiBpB,EAAIC,EAAI,EAAG,CAAC,EAEtDa,GAA0B,KAAK,KAAMd,EAAIC,EAAIrF,EAAIC,CAAE,CACrD,CACF,CAEA,OAAQ,CACN,KAAK,KAAK,MAAK,CACjB,CACF,CCpWA,MAAMwG,GAAc,CAClB,CAAC,KAAM,MAAO,KAAK,EACnB,CAAC,KAAM,KAAM,KAAK,EAClB,CAAC,KAAM,KAAM,IAAI,EACjB,CAAC,KAAM,KAAM,IAAK,EAClB,CAAC,KAAM,KAAM,IAAI,CACnB,EAEMC,GAAqB,CAAC,YAAa,UAAU,EAEnD,SAASC,GAAUC,EAAK,CACtB,OAAO,SAAS,GAAKA,EAAK,EAAE,CAC9B,CAEA,SAASC,GAAS3b,EAAM,CAClBA,IAAS,SACX,KAAK,GAAG,KAAI,EAEZ,KAAK,QAAO,CAEhB,CAEA,SAAS4b,GAAgBlgB,EAAK,CAC5B,KAAM,CAAE,MAAAmgB,CAAK,EAAK,KACZ,CAAE,MAAAn0B,GAAUgU,EAAI,OAChBogB,EAAKP,GAAY7zB,CAAK,EAC5Bm0B,EAAM,EAAIJ,GAAUK,EAAG,CAAC,CAAC,EACzBD,EAAM,EAAIJ,GAAUK,EAAG,CAAC,CAAC,EAEzB,KAAK,QAAO,CACd,CACA,SAASC,GAAuBrgB,EAAK,CACnC,KAAM,CAAE,MAAAmgB,CAAK,EAAK,KACZ,CAAE,MAAAn0B,GAAUgU,EAAI,OAChBtW,EAAIo2B,GAAmB9zB,CAAK,EAClCm0B,EAAM,YAAcz2B,EACpB,KAAK,QAAO,CACd,CAEe,IAAA42B,GAAA,KAAY,CACzB,YAAYtd,EAAM,CAChB,KAAK,MAAQ,CACX,EAAG+c,GAAUF,GAAY,CAAC,EAAE,CAAC,CAAC,EAC9B,EAAGE,GAAUF,GAAY,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAS,GACT,YAAaC,GAAmB,CAAC,EACjC,IAAI,OAAQ,CACV,OAAO,KAAK,cAAgB,YAAc,KAAK,EAAI,KAAK,CAC1D,EACA,IAAI,QAAS,CACX,OAAO,KAAK,cAAgB,YAAc,KAAK,EAAI,KAAK,CAC1D,CACN,EACI,KAAK,KAAO9c,EACZ,KAAK,GAAK3Z,EAAE,MAAO,GAAGooB,CAAS,QAAQ,EACpC,SACCpoB,EAAE,MAAO,GAAGooB,CAAS,YAAY,EAC9B,SACCpoB,EAAE,MAAO,QAAQ,EAAE,MAAM,gBAAgB,EACzCA,EAAE,MAAO,QAAQ,EAAE,SACjBA,EAAE,MAAO,GAAGooB,CAAS,UAAU,EAAE,SAC/B,IAAI+G,GAAO,QAAQ,EAAE,GAAG,QAASyH,GAAS,KAAK,KAAM,QAAQ,CAAC,EAC9D,IAAIzH,GAAO,OAAQ,SAAS,EAAE,GAAG,QAASyH,GAAS,KAAK,KAAM,MAAM,CAAC,CACrF,CACA,CACA,EACQ52B,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EAClC,SACC,KAAK,UAAYpoB,EAAE,MAAO,UAAU,EACpCA,EAAE,MAAO,QAAQ,EAAE,MACjBA,EAAE,OAAQ,EAAE,EAAE,SACZA,EAAE,WAAY,EAAE,EAAE,SAChBA,EAAE,QAAS,EAAE,EAAE,MAAM,GAAGpC,GAAE,YAAY,CAAC,EAAE,EACzCoC,EAAE,SAAU,EAAE,EAAE,SACd,GAAGw2B,GAAY,IAAI,CAACt0B,EAAIoF,IAAUtH,EAAE,SAAU,EAAE,EAAE,KAAK,QAASsH,CAAK,EAAE,MAAM,GAAGpF,EAAG,CAAC,CAAC,MAAMA,EAAG,CAAC,CAAC,MAAMA,EAAG,CAAC,CAAC,MAAM,CAAC,CACtI,EAAoB,GAAG,SAAU20B,GAAgB,KAAK,IAAI,CAAC,CAC3D,EACgB72B,EAAE,WAAY,EAAE,EAAE,SAChBA,EAAE,QAAS,EAAE,EAAE,MAAM,GAAGpC,GAAE,mBAAmB,CAAC,EAAE,EAChDoC,EAAE,SAAU,EAAE,EAAE,SACd,GAAGy2B,GAAmB,IAAI,CAACv0B,EAAIoF,IAAUtH,EAAE,SAAU,EAAE,EAAE,KAAK,QAASsH,CAAK,EAAE,MAAM,GAAG1J,GAAE,oBAAoB,EAAE0J,CAAK,CAAC,EAAE,CAAC,CAC5I,EAAoB,GAAG,SAAU0vB,GAAuB,KAAK,IAAI,CAAC,CAClE,CACA,CACA,CACA,CACA,EAAQ,KAAI,CACV,CAEA,UAAUrd,EAAM,CACd,KAAK,KAAOA,CACd,CAEA,SAAU,CACR,KAAM,CAAE,KAAAA,EAAM,MAAAmd,CAAK,EAAK,KAClB,CAAE,MAAAhnB,EAAO,OAAAC,EAAQ,QAAA2f,CAAO,EAAKoH,EAC7BI,EAASpnB,EAAQ4f,EAAU,EAC3ByH,EAAUpnB,EAAS2f,EAAU,EAC7B1U,EAAKrB,EAAK,aAAY,EACtBpE,EAAQ,SAASyF,EAAG,EAAImc,EAAS,EAAE,EAAI,EACvChkB,EAAQ+jB,EAASlc,EAAG,EAC1B,IAAIkI,EAAOwM,EACX,MAAM7M,EAAM6M,EACRvc,EAAQ,IACV+P,IAASgU,EAASlc,EAAG,GAAK,GAE5B,IAAIpC,EAAK,EACL6b,EAAU,EACd,KAAK,UAAU,KAAK,EAAE,EACtB,KAAK,SAAW,CAAA,EAChB,MAAM2C,EAAa,CACjB,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,CACX,EACI,QAAS54B,EAAI,EAAGA,EAAI+W,EAAO/W,GAAK,EAAG,CACjC,IAAI64B,EAAK,EACLC,EAAK,EACT,MAAMC,EAAOv3B,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAC1CoP,EAASx3B,EAAE,SAAU,GAAGooB,CAAS,SAAS,EAChD,KAAK,SAAS,KAAKoP,EAAO,EAAE,EAC5B,MAAM7C,EAAO,IAAItE,GAAKmH,EAAO,GAAI1nB,EAAOC,CAAM,EAM9C,IAJA4kB,EAAK,KAAI,EACTA,EAAK,UAAUzR,EAAML,CAAG,EACpB1P,EAAQ,GAAGwhB,EAAK,MAAMxhB,EAAOA,CAAK,EAE/ByF,GAAMoC,EAAG,IAAKpC,GAAM,EAAG,CAC5B,MAAM6e,EAAK9d,EAAK,KAAK,UAAUf,CAAE,EAEjC,GADAye,GAAMI,EACFJ,EAAKF,EACP,QAASte,EAAK,EAAGA,GAAMmC,EAAG,IAAKnC,GAAM,EACnC6b,GAAWC,EAAMhb,EAAMf,EAAIC,EAAI4b,CAAO,EACtC2C,EAAW,IAAMve,MAEd,CACLye,EAAK,EAAED,EAAKI,GACZ,KACF,CACF,CACAL,EAAW,IAAMxe,EACjB+b,EAAK,QAAO,EAEZA,EAAK,KAAI,EACTA,EAAK,UAAUzR,EAAML,CAAG,EACpB1P,EAAQ,GAAGwhB,EAAK,MAAMxhB,EAAOA,CAAK,EACtC,MAAMukB,EAAMjD,EACZ9a,EAAK,iBAAiByd,EAAY,CAAC,CAAE,IAAA7e,EAAK,IAAAC,CAAG,IAAO,CAClDkc,GAAWC,EAAMhb,EAAMpB,EAAKC,EAAKkf,CAAG,CACtC,CAAC,EACD/C,EAAK,QAAO,EAEZyC,EAAW,IAAMA,EAAW,IAC5BA,EAAW,IAAMA,EAAW,IAC5B3C,GAAW6C,EACX,KAAK,UAAU,MAAMt3B,EAAE,MAAO,GAAGooB,CAAS,qBAAqB,EAAE,MAAMmP,EAAK,MAAMC,CAAM,CAAC,CAAC,CAC5F,CACA,KAAK,GAAG,KAAI,CACd,CAEA,SAAU,CACR,KAAK,GAAG,KAAI,EACZ,KAAM,CAAE,MAAAV,CAAK,EAAK,KACZa,EAAS33B,EAAE,SAAU,EAAE,EAAE,KAAI,EAC7B,CAAE,GAAA+M,CAAE,EAAK4qB,EACf,OAAO,SAAS,KAAK,YAAY5qB,CAAE,EACnC,KAAM,CAAE,cAAA6qB,CAAa,EAAK7qB,EACpB8qB,EAAOD,EAAc,SACrB5nB,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,UAAY;AAAA,sBACA8mB,EAAM,KAAK,MAAMA,EAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAO/Ce,EAAK,KAAK,YAAY7nB,CAAK,EAC3B,KAAK,SAAS,QAAS9N,GAAO,CAC5B,MAAMmZ,EAAKnZ,EAAG,UAAU,EAAK,EACjBmZ,EAAG,WAAW,IAAI,EAE1B,UAAUnZ,EAAI,EAAG,CAAC,EACtB21B,EAAK,KAAK,YAAYxc,CAAE,CAC1B,CAAC,EACDuc,EAAc,MAAK,CACrB,CACF,ECrMA,MAAME,GAAY,CAChB,CAAE,IAAK,OAAQ,MAAO1X,EAAG,kBAAkB,EAAG,MAAO,QAAQ,EAC7D,CAAE,IAAK,MAAO,MAAOA,EAAG,iBAAiB,EAAG,MAAO,QAAQ,EAC3D,CAAE,IAAK,QAAS,MAAOA,EAAG,mBAAmB,EAAG,MAAO,QAAQ,EAC/D,CAAE,IAAK,cAAe,MAAOA,EAAG,wBAAwB,EAAG,MAAO,cAAc,EAChF,CAAE,IAAK,eAAgB,MAAOA,EAAG,yBAAyB,EAAG,MAAO,YAAY,EAChF,CAAE,IAAK,SAAS,EAChB,CAAE,IAAK,aAAc,MAAOA,EAAG,uBAAuB,CAAC,EACvD,CAAE,IAAK,gBAAiB,MAAOA,EAAG,0BAA0B,CAAC,EAC7D,CAAE,IAAK,SAAS,EAChB,CAAE,IAAK,aAAc,MAAOA,EAAG,uBAAuB,CAAC,EACvD,CAAE,IAAK,gBAAiB,MAAOA,EAAG,0BAA0B,CAAC,EAC7D,CAAE,IAAK,mBAAoB,MAAOA,EAAG,4BAA4B,CAAC,EAClE,CAAE,IAAK,OAAQ,MAAOA,EAAG,kBAAkB,CAAC,EAC5C,CAAE,IAAK,SAAS,EAChB,CAAE,IAAK,aAAc,MAAOA,EAAG,wBAAwB,CAAC,EACxD,CAAE,IAAK,SAAS,EAChB,CAAE,IAAK,iBAAkB,MAAOA,EAAG,2BAA2B,CAAC,EAC/D,CAAE,IAAK,qBAAsB,MAAOA,EAAG,8BAA8B,CAAC,EACtE,CAAE,IAAK,SAAS,EAChB,CAAE,IAAK,gBAAiB,MAAOA,EAAG,0BAA0B,CAAC,EAC7D,CAAE,IAAK,oBAAqB,MAAOA,EAAG,6BAA6B,CAAC,CACtE,EAEA,SAAS2X,GAAcppB,EAAM,CAC3B,OAAIA,EAAK,MAAQ,UACR3O,EAAE,MAAO,GAAGooB,CAAS,eAAe,EAEtCpoB,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAChC,GAAG,QAAS,IAAM,CACjB,KAAK,UAAUzZ,EAAK,GAAG,EACvB,KAAK,KAAI,CACX,CAAC,EACA,SACCA,EAAK,MAAK,EACV3O,EAAE,MAAO,OAAO,EAAE,MAAM2O,EAAK,OAAS,EAAE,CAC9C,CACA,CAEA,SAASqpB,IAAY,CACnB,OAAOF,GAAU,IAAI51B,GAAM61B,GAAc,KAAK,KAAM71B,CAAE,CAAC,CACzD,CAEe,IAAA+1B,GAAA,KAAkB,CAC/B,YAAYpJ,EAAQqJ,EAAS,GAAO,CAClC,KAAK,UAAYF,GAAU,KAAK,IAAI,EACpC,KAAK,GAAKh4B,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAC1C,SAAS,GAAG,KAAK,SAAS,EAC1B,KAAI,EACP,KAAK,OAASyG,EACd,KAAK,UAAY,IAAM,CAAC,EACxB,KAAK,OAASqJ,EACd,KAAK,QAAQ,OAAO,CACtB,CAIA,QAAQ7vB,EAAM,CACZ,MAAM8vB,EAAS,KAAK,UAAU,EAAE,EAC5B9vB,IAAS,UACX8vB,EAAO,KAAI,EAEXA,EAAO,KAAI,CAEf,CAEA,MAAO,CACL,KAAM,CAAE,GAAAprB,CAAE,EAAK,KACfA,EAAG,KAAI,EACPuZ,GAAmBvZ,CAAE,CACvB,CAEA,YAAY9M,EAAGK,EAAG,CAChB,GAAI,KAAK,OAAQ,OACjB,KAAM,CAAE,GAAAyM,CAAE,EAAK,KACT,CAAE,MAAA+C,CAAK,EAAK/C,EAAG,KAAI,EAAG,OAAM,EAC5BsY,EAAO,KAAK,OAAM,EAClB+S,EAAM/S,EAAK,OAAS,EAC1B,IAAInC,EAAOjjB,EACPolB,EAAK,MAAQplB,GAAK6P,IACpBoT,GAAQpT,GAEV/C,EAAG,IAAI,OAAQ,GAAGmW,CAAI,IAAI,EACtB5iB,EAAI83B,EACNrrB,EAAG,IAAI,SAAU,GAAGsY,EAAK,OAAS/kB,CAAC,IAAI,EACpC,IAAI,aAAc,GAAGA,CAAC,IAAI,EAC1B,IAAI,MAAO,MAAM,EAEpByM,EAAG,IAAI,MAAO,GAAGzM,CAAC,IAAI,EACnB,IAAI,aAAc,GAAG+kB,EAAK,OAAS/kB,CAAC,IAAI,EACxC,IAAI,SAAU,MAAM,EAEzBimB,GAAiBxZ,CAAE,CACrB,CACF,EC9Fe,SAASsrB,GAAQljB,EAAMgR,EAAQ,CAC5C,GAAIA,EAAO,UAAU,SAAS,QAAQ,EACpC,OAEF,KAAM,CACJ,KAAAjD,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACtB,EAAMoW,EAAO,sBAAqB,EAC1BpZ,EAAK/M,EAAE,MAAO,GAAGooB,CAAS,UAAU,EAAE,KAAKjT,CAAI,EAAE,KAAI,EAC3D,SAAS,KAAK,YAAYpI,EAAG,EAAE,EAC/B,MAAMurB,EAAQvrB,EAAG,IAAG,EAEpBA,EAAG,IAAI,OAAQ,GAAGmW,EAAQpT,EAAQ,EAAMwoB,EAAM,MAAQ,CAAE,IAAI,EACzD,IAAI,MAAO,GAAGzV,EAAM9S,EAAS,CAAC,IAAI,EAErCmW,GAAKC,EAAQ,aAAc,IAAM,CAC3B,SAAS,KAAK,SAASpZ,EAAG,EAAE,GAC9B,SAAS,KAAK,YAAYA,EAAG,EAAE,CAEnC,CAAC,EAEDmZ,GAAKC,EAAQ,QAAS,IAAM,CACtB,SAAS,KAAK,SAASpZ,EAAG,EAAE,GAC9B,SAAS,KAAK,YAAYA,EAAG,EAAE,CAEnC,CAAC,CACH,CCzBe,MAAMwrB,EAAK,CAIxB,YAAYliB,EAAKmiB,EAAU71B,EAAO,CAChC,KAAK,IAAM/E,GAAE,WAAWyY,EAAI,QAAQ,UAAW5X,GAAKA,EAAE,CAAC,EAAE,YAAW,CAAE,CAAC,EAAE,EACrE+5B,IAAU,KAAK,KAAO,KAAKA,CAAQ,KACvC,KAAK,IAAMniB,EACX,KAAK,SAAWmiB,EAChB,KAAK,MAAQ71B,EACb,KAAK,GAAK,KAAK,QAAO,EACtB,KAAK,OAAS,IAAM,CAAC,CACvB,CAEA,SAAU,CACR,KAAM,CAAE,IAAA81B,CAAG,EAAK,KAChB,OAAOz4B,EAAE,MAAO,GAAGooB,CAAS,cAAc,EACvC,GAAG,aAAezR,GAAQ,CACzB0hB,GAAQI,EAAK9hB,EAAI,MAAM,CACzB,CAAC,EACA,KAAK,eAAgB8hB,CAAG,CAC7B,CAEA,UAAW,CAAC,CACd,CC3Be,MAAMC,WAAqBH,EAAK,CAC7C,UAAW,CAAC,CAEZ,SAASl4B,EAAG,CACV,OAAOA,CACT,CAEA,SAAU,CACR,KAAM,CAAE,IAAAgW,CAAG,EAAK,KAChB,YAAK,GAAK,KAAK,SAAQ,EACvB,KAAK,GAAG,OAASnU,GAAM,KAAK,OAAOmU,EAAK,KAAK,SAASnU,CAAE,CAAC,EAClD,MAAM,QAAO,EAAG,MACrB,KAAK,EACX,CACE,CAEA,SAAS7B,EAAG,CACNA,IACF,KAAK,MAAQA,EACb,KAAK,GAAG,SAASA,CAAC,EAEtB,CACF,CCpBe,MAAMs4B,WAAiBviB,EAAQ,CAC5C,YAAYqV,EAAO3b,EAAO8oB,EAAWC,KAAcn2B,EAAU,CAC3D,MAAM,MAAO,GAAG0lB,CAAS,aAAayQ,CAAS,EAAE,EACjD,KAAK,MAAQpN,EACb,KAAK,OAAS,IAAM,CAAC,EACrB,KAAK,YAAc,IAAM,CAAC,EACtB,OAAOA,GAAU,SACnB,KAAK,MAAQzrB,EAAE,MAAO,GAAGooB,CAAS,iBAAiB,EAAE,MAAMqD,CAAK,EACvDmN,GACT,KAAK,MAAM,SAAS,YAAY,EAElC,KAAK,UAAY54B,EAAE,MAAO,GAAGooB,CAAS,mBAAmB,EACtD,IAAI,QAAStY,CAAK,EAClB,KAAI,EAEP,KAAK,mBAAmB,GAAGpN,CAAQ,EAEnC,KAAK,SAAW1C,EAAE,MAAO,GAAGooB,CAAS,kBAAkB,EACvD,KAAK,SAAS,GAAG,QAAS,IAAM,CAC1B,KAAK,UAAU,IAAI,SAAS,IAAM,QACpC,KAAK,KAAI,EAET,KAAK,KAAI,CAEb,CAAC,EAAE,SACD,KAAK,MACLwQ,EAAY54B,EAAE,MAAO,GAAGooB,CAAS,mBAAmB,EAAE,MACpDpoB,EAAE,MAAO,GAAGooB,CAAS,sBAAsB,CACnD,EAAU,EACV,EACI,KAAK,SAAS,KAAK,SAAU,KAAK,SAAS,CAC7C,CAEA,sBAAsB1lB,EAAU,CAC9B,KAAK,UAAU,KAAK,EAAE,EAClBA,EAAS,OAAS,GACpB,KAAK,UAAU,SAAS,GAAGA,CAAQ,CAEvC,CAEA,SAAS+oB,EAAO,CACd,KAAK,MAAM,KAAKA,CAAK,EACrB,KAAK,KAAI,CACX,CAEA,MAAO,CACL,KAAM,CAAE,UAAAqN,CAAS,EAAK,KACtBA,EAAU,KAAI,EACd,KAAK,OAAM,EAAG,OAAM,EACpBvS,GAAiB,KAAK,OAAM,EAAI,IAAM,CACpC,KAAK,KAAI,CACX,CAAC,CACH,CAEA,MAAO,CACL,KAAK,OAAM,EAAG,OAAO,EAAK,EAC1B,KAAK,UAAU,KAAI,EACnBD,GAAmB,KAAK,QAAQ,CAClC,CACF,CC1DA,SAASyS,GAAkBC,EAAU,CACnC,OAAOh5B,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAAE,MAAM,IAAIuD,GAAKqN,CAAQ,CAAC,CAC/D,CAEe,MAAMC,WAAsBN,EAAS,CAClD,YAAYO,EAAQrJ,EAAO,CACzB,MAAM5gB,EAAO,IAAI0c,GAAK,SAASkE,CAAK,EAAE,EAChCsJ,EAAUD,EAAO,IAAIh3B,GAAM62B,GAAkB,SAAS72B,CAAE,EAAE,EAC7D,GAAG,QAAS,IAAM,CACjB,KAAK,SAASA,CAAE,EAChB,KAAK,OAAOA,CAAE,CAChB,CAAC,CAAC,EACJ,MAAM+M,EAAM,OAAQ,GAAM,cAAe,GAAGkqB,CAAO,CACrD,CAEA,SAAStJ,EAAO,CACd,KAAK,MAAM,QAAQ,SAASA,CAAK,EAAE,EACnC,KAAK,KAAI,CACX,CACF,CCrBe,MAAMuJ,WAAcV,EAAa,CAC9C,YAAY/1B,EAAO,CACjB,MAAM,QAAS,GAAIA,CAAK,CAC1B,CAEA,UAAW,CACT,KAAM,CAAE,MAAAA,CAAK,EAAK,KAClB,OAAO,IAAIs2B,GAAc,CAAC,OAAQ,SAAU,OAAO,EAAGt2B,CAAK,CAC7D,CACF,CCTe,MAAM02B,WAAeX,EAAa,CAC/C,YAAY/1B,EAAO,CACjB,MAAM,SAAU,GAAIA,CAAK,CAC3B,CAEA,UAAW,CACT,KAAM,CAAE,MAAAA,CAAK,EAAK,KAClB,OAAO,IAAIs2B,GAAc,CAAC,MAAO,SAAU,QAAQ,EAAGt2B,CAAK,CAC7D,CACF,CCTe,MAAM22B,WAAmBf,EAAK,CAC3C,SAAU,CACR,KAAM,CAAE,IAAAliB,CAAG,EAAK,KAChB,OAAO,MAAM,QAAO,EACjB,MAAM,IAAIsV,GAAKtV,CAAG,CAAC,EACnB,GAAG,QAAS,IAAM,KAAK,MAAK,CAAE,CACnC,CAEA,OAAQ,CACN,KAAK,OAAO,KAAK,IAAK,KAAK,OAAM,CAAE,CACrC,CAEA,SAASiW,EAAQ,CACf,KAAK,GAAG,OAAOA,CAAM,CACvB,CAEA,QAAS,CACP,OAAO,KAAK,GAAG,OAAM,CACvB,CAEA,QAAS,CACP,OAAO,KAAK,GAAG,SAAS,QAAQ,CAClC,CACF,CCxBe,MAAMiN,WAAmBD,EAAW,CACjD,aAAc,CACZ,MAAM,YAAY,CACpB,CAEA,UAAW,CAAC,CACd,CCNe,MAAME,WAAaF,EAAW,CAC3C,aAAc,CACZ,MAAM,YAAa,QAAQ,CAC7B,CACF,CCJe,MAAMG,WAAeH,EAAW,CAC7C,aAAc,CACZ,MAAM,cAAe,QAAQ,CAC/B,CACF,CCJe,MAAMI,WAAeJ,EAAW,CAC7C,aAAc,CACZ,MAAM,SAAU,QAAQ,CAC1B,CACF,CCJe,MAAMK,WAAkBL,EAAW,CAChD,aAAc,CACZ,MAAM,YAAa,QAAQ,CAC7B,CACF,CCHA,MAAMM,GAAyB,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAEtIC,GAAc,CAClB,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC7G,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC7G,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC7G,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC7G,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,CAC/G,EAEMC,GAAiB,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAEpI,SAASC,GAAQrI,EAAS,CACxB,OAAO1xB,EAAE,KAAM,EAAE,EAAE,MACjBA,EAAE,MAAO,GAAGooB,CAAS,qBAAqB,EACvC,GAAG,aAAc,IAAM,KAAK,OAAOsJ,CAAO,CAAC,EAC3C,IAAI,mBAAoBA,CAAO,CACtC,CACA,CAEe,MAAMsI,EAAa,CAChC,aAAc,CACZ,KAAK,GAAKh6B,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EAC/C,KAAK,OAAS,IAAM,CAAC,EACrB,MAAM6R,EAAQj6B,EAAE,QAAS,EAAE,EAAE,SAC3BA,EAAE,QAAS,EAAE,EAAE,SACbA,EAAE,KAAM,GAAGooB,CAAS,2BAA2B,EAAE,SAC/C,GAAGwR,GAAuB,IAAI5X,GAAS+X,GAAQ,KAAK,KAAM/X,CAAK,CAAC,CAC1E,EACQ,GAAG6X,GAAY,IAAI33B,GAAMlC,EAAE,KAAM,GAAGooB,CAAS,eAAe,EAAE,SAC5D,GAAGlmB,EAAG,IAAI8f,GAAS+X,GAAQ,KAAK,KAAM/X,CAAK,CAAC,CACtD,CAAS,EACDhiB,EAAE,KAAM,GAAGooB,CAAS,kBAAkB,EAAE,SACtC,GAAG0R,GAAe,IAAI9X,GAAS+X,GAAQ,KAAK,KAAM/X,CAAK,CAAC,CAClE,CACA,CACA,EACI,KAAK,GAAG,MAAMiY,CAAK,CACrB,CACF,CCtCe,MAAMC,WAAsBvB,EAAS,CAClD,YAAYK,EAAUhX,EAAO,CAC3B,MAAM/S,EAAO,IAAI0c,GAAKqN,CAAQ,EAC3B,IAAI,SAAU,MAAM,EACpB,IAAI,gBAAiB,aAAahX,CAAK,EAAE,EACtCmY,EAAe,IAAIH,GACzBG,EAAa,OAAU95B,GAAM,CAC3B,KAAK,SAASA,CAAC,EACf,KAAK,OAAOA,CAAC,CACf,EACA,MAAM4O,EAAM,OAAQ,GAAO,cAAekrB,EAAa,EAAE,CAC3D,CAEA,SAASnY,EAAO,CACd,KAAK,MAAM,IAAI,eAAgBA,CAAK,EACpC,KAAK,KAAI,CACX,CACF,CChBA,MAAMoY,GAAY,CAChB,CAAC,OAAQ,0MAA0M,EACnN,CAAC,SAAU,0MAA0M,EACrN,CAAC,QAAS,0MAA0M,EACpN,CAAC,SAAU,+NAA+N,EAC1O,CAAC,SAAU,+NAA+N,CAE5O,EAEe,MAAMC,WAAyB1B,EAAS,CACrD,YAAY1d,EAAM,CAChB,MAAMhM,EAAO,IAAI0c,GAAK,WAAW,EACjC,IAAI2O,EAAU,EACd,MAAMC,EAAcH,GAAU,IAAI,CAACl4B,EAAIs4B,IAAQx6B,EAAE,MAAO,GAAGooB,CAAS,eAAenN,IAAS/Y,EAAG,CAAC,EAAI,UAAY,EAAE,EAAE,EACjH,GAAG,QAAS,IAAM,CACjBq4B,EAAYD,CAAO,EAAE,OAAO,SAAS,EACrCC,EAAYC,CAAG,EAAE,OAAO,SAAS,EACjCF,EAAUE,EACV,KAAK,KAAI,EACT,KAAK,OAAOt4B,CAAE,CAChB,CAAC,EACA,MACClC,EAAE,MAAO,GAAGooB,CAAS,YAAY,EAAE,KAAKlmB,EAAG,CAAC,CAAC,CACrD,CAAO,EAEH,MAAM+M,EAAM,OAAQ,GAAO,cAAe,GAAGsrB,CAAW,CAC1D,CACF,CC1BA,SAASE,MAAc9N,EAAK,CAC1B,OAAO3sB,EAAE,QAAS,EAAE,EAAE,MACpBA,EAAE,QAAS,EAAE,EAAE,SAAS,GAAG2sB,CAAG,CAClC,CACA,CAEA,SAASoN,GAAQf,EAAU,CACzB,OAAOh5B,EAAE,KAAM,EAAE,EAAE,MACjBA,EAAE,MAAO,GAAGooB,CAAS,sBAAsB,EAAE,MAC3C,IAAIuD,GAAK,UAAUqN,CAAQ,EAAE,CACnC,EAAM,GAAG,QAAS,IAAM,CAClB,KAAK,KAAOA,EACZ,KAAM,CAAE,KAAA3wB,EAAM,MAAA2H,EAAO,MAAAgS,CAAK,EAAK,KAC/B,KAAK,OAAO,CAAE,KAAA3Z,EAAM,MAAA2H,EAAO,MAAAgS,CAAK,CAAE,CACpC,CAAC,CACL,CACA,CAEe,MAAM0Y,EAAc,CACjC,aAAc,CACZ,KAAK,MAAQ,OACb,KAAK,MAAQ,OACb,KAAK,KAAO,MACZ,KAAK,OAAS,IAAM,CAAC,EACrB,KAAK,QAAU,IAAIR,GAAc,aAAc,KAAK,KAAK,EACzD,KAAK,QAAQ,OAAUlY,GAAU,CAC/B,KAAK,MAAQA,CACf,EACA,KAAK,OAAS,IAAIqY,GAAiB,KAAK,KAAK,EAC7C,KAAK,OAAO,OAAS,CAAC,CAAC37B,CAAC,IAAM,CAC5B,KAAK,MAAQA,CACf,EACA,KAAK,GAAKsB,EAAE,MAAO,GAAGooB,CAAS,iBAAiB,EAChD,MAAM6R,EAAQQ,GACZz6B,EAAE,KAAM,EAAE,EAAE,SACVA,EAAE,KAAM,GAAGooB,CAAS,sBAAsB,EAAE,MAC1CqS,GACEz6B,EAAE,KAAM,EAAE,EAAE,SACV,GAAG,CAAC,MAAO,SAAU,aAAc,WAAY,SAAS,EAAE,IAAIkC,GAAM63B,GAAQ,KAAK,KAAM73B,CAAE,CAAC,CACxG,EACYlC,EAAE,KAAM,EAAE,EAAE,SACV,GAAG,CAAC,OAAQ,MAAO,QAAS,SAAU,MAAM,EAAE,IAAIkC,GAAM63B,GAAQ,KAAK,KAAM73B,CAAE,CAAC,CAC5F,CACA,CACA,EACQlC,EAAE,KAAM,GAAGooB,CAAS,uBAAuB,EAAE,SAC3CpoB,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAAE,MAAM,KAAK,QAAQ,EAAE,EAC1DpoB,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAAE,MAAM,KAAK,OAAO,EAAE,CACnE,CACA,CACA,EACI,KAAK,GAAG,MAAM6R,CAAK,CACrB,CACF,CCvDe,MAAMU,WAAuBhC,EAAS,CACnD,aAAc,CACZ,MAAM1pB,EAAO,IAAI0c,GAAK,YAAY,EAC5BiP,EAAgB,IAAIF,GAC1BE,EAAc,OAAUv6B,GAAM,CAC5B,KAAK,OAAOA,CAAC,EACb,KAAK,KAAI,CACX,EACA,MAAM4O,EAAM,OAAQ,GAAO,cAAe2rB,EAAc,EAAE,CAC5D,CACF,CCXe,MAAMC,WAAenC,EAAa,CAC/C,aAAc,CACZ,MAAM,QAAQ,CAChB,CAEA,UAAW,CACT,OAAO,IAAIiC,EACb,CACF,CCRe,MAAMG,WAAiBvC,EAAK,CACzC,SAAU,CACR,OAAO,MAAM,QAAO,EACjB,MAAM,IAAI5M,GAAK,KAAK,GAAG,CAAC,EACxB,GAAG,QAAS,IAAM,KAAK,OAAO,KAAK,GAAG,CAAC,CAC5C,CAEA,SAASvc,EAAU,CACjB,KAAK,GAAG,SAASA,CAAQ,CAC3B,CACF,CCXe,MAAM2rB,WAAoBD,EAAS,CAChD,aAAc,CACZ,MAAM,aAAa,CACrB,CACF,CCJe,MAAME,WAAoB1B,EAAW,CAClD,aAAc,CACZ,MAAM,aAAa,CACrB,CAEA,UAAW,CAAC,CACd,CCLe,MAAM2B,WAAkBvC,EAAa,CAClD,YAAY1W,EAAO,CACjB,MAAM,QAAS,OAAWA,CAAK,CACjC,CAEA,UAAW,CACT,KAAM,CAAE,IAAA3L,EAAK,MAAA1T,CAAK,EAAK,KACvB,OAAO,IAAIu3B,GAAc7jB,EAAK1T,CAAK,CACrC,CACF,CCTe,MAAMu4B,WAAkBxC,EAAa,CAClD,YAAY1W,EAAO,CACjB,MAAM,UAAW,OAAWA,CAAK,CACnC,CAEA,UAAW,CACT,KAAM,CAAE,IAAA3L,EAAK,MAAA1T,CAAK,EAAK,KACvB,OAAO,IAAIu3B,GAAc7jB,EAAK1T,CAAK,CACrC,CACF,CCPe,MAAMw4B,WAAyBxC,EAAS,CACrD,aAAc,CACZ,MAAMyC,EAAaxJ,GAAU,IAAI1vB,GAAMlC,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAChE,GAAG,QAAS,IAAM,CACjB,KAAK,SAAS,GAAGlmB,EAAG,EAAE,EAAE,EACxB,KAAK,OAAOA,CAAE,CAChB,CAAC,EACA,MAAM,GAAGA,EAAG,EAAE,EAAE,CAAC,EACpB,MAAM,KAAM,OAAQ,GAAM,cAAe,GAAGk5B,CAAU,CACxD,CACF,QCZe,cAAqB1C,EAAa,CAC/C,aAAc,CACZ,MAAM,WAAW,CACnB,CAEA,SAASx2B,EAAI,CACX,OAAOA,EAAG,EACZ,CAEA,UAAW,CACT,OAAO,IAAIm5B,EACb,CACF,ECVe,MAAMC,WAAqB3C,EAAS,CACjD,aAAc,CACZ,MAAM4C,EAAS5J,GAAU,IAAIzvB,GAAMlC,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAC5D,GAAG,QAAS,IAAM,CACjB,KAAK,SAASlmB,EAAG,KAAK,EACtB,KAAK,OAAOA,CAAE,CAChB,CAAC,EACA,MAAMA,EAAG,KAAK,CAAC,EAClB,MAAMyvB,GAAU,CAAC,EAAE,MAAO,QAAS,GAAM,cAAe,GAAG4J,CAAM,CACnE,CACF,CCZe,MAAMC,WAAa9C,EAAa,CAC7C,aAAc,CACZ,MAAM,WAAW,CACnB,CAEA,SAASx2B,EAAI,CACX,OAAOA,EAAG,GACZ,CAEA,UAAW,CACT,OAAO,IAAIo5B,EACb,CACF,CCVe,MAAMG,WAAuB9C,EAAS,CACnD,aAAc,CACZ,IAAI+C,EAAWzH,GAAY,MAAM,CAAC,EAClCyH,EAAS,OAAO,EAAG,EAAG,CAAE,IAAK,UAAW,EACxCA,EAAS,OAAO,EAAG,EAAG,CAAE,IAAK,UAAW,EACxCA,EAAWA,EAAS,IAAKx5B,GAAO,CAC9B,MAAMyM,EAAO3O,EAAE,MAAO,GAAGooB,CAAS,OAAO,EACzC,OAAIlmB,EAAG,MAAQ,UACbyM,EAAK,SAAS,SAAS,GAEvBA,EAAK,MAAMzM,EAAG,MAAK,CAAE,EAClB,GAAG,QAAS,IAAM,CACjB,KAAK,SAASA,EAAG,OAAO,EACxB,KAAK,OAAOA,CAAE,CAChB,CAAC,EACCA,EAAG,OAAOyM,EAAK,MAAM3O,EAAE,MAAO,OAAO,EAAE,KAAKkC,EAAG,KAAK,CAAC,GAEpDyM,CACT,CAAC,EACD,MAAM,SAAU,QAAS,GAAM,cAAe,GAAG+sB,CAAQ,CAC3D,CAEA,SAASplB,EAAK,CACZ,QAAS9X,EAAI,EAAGA,EAAIy1B,GAAY,OAAQz1B,GAAK,EACvCy1B,GAAYz1B,CAAC,EAAE,MAAQ8X,GACzB,KAAK,MAAM,KAAK2d,GAAYz1B,CAAC,EAAE,OAAO,EAG1C,KAAK,KAAI,CACX,CACF,QChCe,cAAqBk6B,EAAa,CAC/C,aAAc,CACZ,MAAM,QAAQ,CAChB,CAEA,SAASx2B,EAAI,CACX,OAAOA,EAAG,GACZ,CAEA,UAAW,CACT,OAAO,IAAIu5B,EACb,CACF,ECTe,MAAME,WAAwBhD,EAAS,CACpD,aAAc,CACZ,MAAMiD,EAAYlI,GAAa,IAAIxxB,GAAMlC,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAClE,GAAG,QAAS,IAAM,CACjB,KAAK,KAAI,EACT,KAAK,OAAOlmB,CAAE,CAChB,CAAC,EACA,MAAMA,EAAG,GAAG,CAAC,EAChB,MAAM,IAAIypB,GAAK,SAAS,EAAG,QAAS,GAAM,cAAe,GAAGiQ,CAAS,CACvE,CACF,CCbe,MAAMC,WAAenD,EAAa,CAC/C,aAAc,CACZ,MAAM,SAAS,CACjB,CAEA,SAASx2B,EAAI,CACX,OAAOA,EAAG,GACZ,CAEA,UAAW,CACT,OAAO,IAAIy5B,EACb,CACF,CCbe,MAAMG,WAAexC,EAAW,CAC7C,aAAc,CACZ,MAAM,QAAQ,CAChB,CACF,CCJe,MAAMyC,WAAczC,EAAW,CAC5C,aAAc,CACZ,MAAM,OAAO,CACf,CAEA,SAAShN,EAAQld,EAAU,CACzB,KAAK,GAAG,OAAOkd,CAAM,EAAE,SAASld,CAAQ,CAC1C,CACF,CCRe,MAAM4sB,WAAalB,EAAS,CACzC,aAAc,CACZ,MAAM,OAAQ,QAAQ,CACxB,CACF,CCJe,MAAMmB,WAAanB,EAAS,CACzC,aAAc,CACZ,MAAM,OAAQ,QAAQ,CACxB,CACF,CCJe,MAAMoB,WAAcpB,EAAS,CAC1C,aAAc,CACZ,MAAM,QAAS,QAAQ,CACzB,CACF,CCJe,MAAMqB,WAAiB7C,EAAW,CAC/C,aAAc,CACZ,MAAM,UAAU,CAClB,CACF,QCCA,cAA2BX,EAAS,CAClC,aAAc,CACZ,MAAM1pB,EAAO,IAAI0c,GAAK,UAAU,EAC1ByQ,EAAWp8B,EAAE,MAAO,GAAGooB,CAAS,eAAe,EACrD,MAAMnZ,EAAM,OAAQ,GAAO,eAAgBmtB,CAAQ,EACnD,KAAK,SAAWA,EAChB,KAAK,UAAU,IAAI,YAAa,OAAO,CACzC,CACF,EAEe,MAAMC,WAAa3D,EAAa,CAC7C,aAAc,CACZ,MAAM,MAAM,EACZ,KAAK,GAAG,KAAI,CACd,CAEA,UAAW,CACT,OAAO,IAAI4D,EACb,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,CACd,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,CACd,CACF,CCJA,SAASC,IAAe,CACtB,OAAOv8B,EAAE,MAAO,GAAGooB,CAAS,kBAAkB,CAChD,CAEA,SAASoU,IAAY,CACnB,KAAK,MAAQ,CAAA,EACb,KAAK,MAAM,QAASt6B,GAAO,CACzB,GAAI,MAAM,QAAQA,CAAE,EAClBA,EAAG,QAAQ,CAAC,CAAE,GAAA6K,KAAS,CACrB,MAAMgG,EAAOhG,EAAG,IAAG,EACb,CAAE,WAAA0vB,EAAY,YAAAC,GAAgB3vB,EAAG,cAAa,EACpD,KAAK,MAAM,KAAK,CAACA,EAAIgG,EAAK,MAAQ,SAAS0pB,EAAY,EAAE,EAAI,SAASC,EAAa,EAAE,CAAC,CAAC,CACzF,CAAC,MACI,CACL,MAAM3pB,EAAO7Q,EAAG,IAAG,EACb,CAAE,WAAAu6B,EAAY,YAAAC,GAAgBx6B,EAAG,cAAa,EACpD,KAAK,MAAM,KAAK,CAACA,EAAI6Q,EAAK,MAAQ,SAAS0pB,EAAY,EAAE,EAAI,SAASC,EAAa,EAAE,CAAC,CAAC,CACzF,CACF,CAAC,CACH,CAEA,SAASC,IAAa,CACpB,KAAM,CACJ,GAAA5vB,EAAI,KAAA6vB,EAAM,OAAAC,EAAQ,MAAAC,CACtB,EAAM,KACE,CAAE,SAAAV,EAAU,UAAAtD,CAAS,EAAK+D,EAAO,GACvC9vB,EAAG,IAAI,QAAS,GAAG,KAAK,QAAO,EAAK,EAAE,IAAI,EAC1C,MAAMurB,EAAQvrB,EAAG,IAAG,EAEpB,IAAI2oB,EAAW,IACXqH,EAAY,GAChB,MAAMC,EAAQ,CAAA,EACRC,EAAQ,CAAA,EACdH,EAAM,QAAQ,CAAC,CAAC56B,EAAIhC,CAAC,EAAGoH,IAAU,CAChCouB,GAAYx1B,EACRoH,IAAUw1B,EAAM,OAAS,GAAKpH,EAAW4C,EAAM,MACjD0E,EAAM,KAAK96B,CAAE,GAEb66B,GAAa78B,EACb+8B,EAAM,KAAK/6B,CAAE,EAEjB,CAAC,EACD06B,EAAK,KAAK,EAAE,EAAE,SAAS,GAAGI,CAAK,EAC/BZ,EAAS,KAAK,EAAE,EAAE,SAAS,GAAGa,CAAK,EACnCnE,EAAU,IAAI,QAAS,GAAGiE,CAAS,IAAI,EACnCE,EAAM,OAAS,EACjBJ,EAAO,KAAI,EAEXA,EAAO,KAAI,CAEf,CAEe,MAAMK,EAAQ,CAC3B,YAAYvjB,EAAMwjB,EAASjF,EAAS,GAAO,CACzC,KAAK,KAAOve,EACZ,KAAK,OAAS,IAAM,CAAC,EACrB,KAAK,QAAUwjB,EACf,KAAK,OAASjF,EACd,MAAMloB,EAAQ2J,EAAK,aAAY,EAC/B,KAAK,MAAQ,CACX,CACE,KAAK,OAAS,IAAIsiB,GAClB,KAAK,OAAS,IAAID,GAClB,IAAIE,GACJ,KAAK,cAAgB,IAAIlB,GACzB,KAAK,cAAgB,IAAID,EACjC,EACMwB,GAAY,EACZ,CACE,KAAK,SAAW,IAAIV,EAC5B,EACMU,GAAY,EACZ,CACE,KAAK,OAAS,IAAIf,GAClB,KAAK,WAAa,IAAI4B,EAC9B,EACMb,GAAY,EACZ,CACE,KAAK,OAAS,IAAI/C,GAClB,KAAK,SAAW,IAAIC,GACpB,KAAK,YAAc,IAAIE,GACvB,KAAK,SAAW,IAAID,GACpB,KAAK,YAAc,IAAIuB,GAAUjrB,EAAM,KAAK,CACpD,EACMusB,GAAY,EACZ,CACE,KAAK,YAAc,IAAIrB,GAAUlrB,EAAM,OAAO,EAC9C,KAAK,SAAW,IAAI6qB,GACpB,KAAK,QAAU,IAAIkB,EAC3B,EACMQ,GAAY,EACZ,CACE,KAAK,QAAU,IAAInD,GAAMppB,EAAM,KAAK,EACpC,KAAK,SAAW,IAAIqpB,GAAOrpB,EAAM,MAAM,EACvC,KAAK,WAAa,IAAImsB,EAC9B,EACMI,GAAY,EACZ,CACE,KAAK,SAAW,IAAIT,GACpB,KAAK,aAAe,IAAIvC,GACxB,KAAK,UAAY,IAAI8D,GACrB,KAAK,OAAS,IAAIhB,EAC1B,CACA,EAEI,KAAK,GAAKr8B,EAAE,MAAO,GAAGooB,CAAS,UAAU,EACzC,KAAK,KAAOpoB,EAAE,MAAO,GAAGooB,CAAS,eAAe,EAEhD,KAAK,MAAM,QAASlmB,GAAO,CACrB,MAAM,QAAQA,CAAE,EAClBA,EAAG,QAAS1D,GAAM,CAChB,KAAK,KAAK,MAAMA,EAAE,EAAE,EACpBA,EAAE,OAAS,IAAIma,IAAS,CACtB,KAAK,OAAO,GAAGA,CAAI,CACrB,CACF,CAAC,EAED,KAAK,KAAK,MAAMzW,EAAG,EAAE,CAEzB,CAAC,EAED,KAAK,GAAG,MAAM,KAAK,IAAI,EACnBg2B,EACF,KAAK,GAAG,KAAI,GAEZ,KAAK,MAAK,EACV,WAAW,IAAM,CACfsE,GAAU,KAAK,IAAI,EACnBG,GAAW,KAAK,IAAI,CACtB,EAAG,CAAC,EACJzW,GAAK,OAAQ,SAAU,IAAM,CAC3ByW,GAAW,KAAK,IAAI,CACtB,CAAC,EAEL,CAEA,mBAAoB,CAClB,OAAO,KAAK,cAAc,OAAM,CAClC,CAEA,mBAAoB,CAClB,KAAK,cAAc,OAAM,CAC3B,CAEA,QAAQ1hB,EAAM,CACZ,KAAK,GAAGA,CAAI,IAAI,EAAE,MAAK,CACzB,CAEA,UAAUtB,EAAM,CACd,KAAK,KAAOA,EACZ,KAAK,MAAK,CACZ,CAEA,OAAQ,CACN,GAAI,KAAK,OAAQ,OACjB,KAAM,CAAE,KAAAA,CAAI,EAAK,KACX3J,EAAQ2J,EAAK,qBAAoB,EAEvC,KAAK,OAAO,SAAS,CAACA,EAAK,QAAO,CAAE,EACpC,KAAK,OAAO,SAAS,CAACA,EAAK,QAAO,CAAE,EACpC,KAAK,QAAQ,SAASA,EAAK,WAAU,EAAI,CAACA,EAAK,SAAS,UAAU,EAClE,KAAK,aAAa,SAAS,CAACA,EAAK,cAAa,CAAE,EAGhD,KAAM,CAAE,KAAA+W,EAAM,OAAA4M,CAAM,EAAKttB,EACzB,KAAK,SAAS,SAASstB,CAAM,EAC7B,KAAK,OAAO,SAAS5M,EAAK,IAAI,EAC9B,KAAK,WAAW,SAASA,EAAK,IAAI,EAClC,KAAK,OAAO,SAASA,EAAK,IAAI,EAC9B,KAAK,SAAS,SAASA,EAAK,MAAM,EAClC,KAAK,YAAY,SAAS1gB,EAAM,SAAS,EACzC,KAAK,SAAS,SAASA,EAAM,MAAM,EACnC,KAAK,YAAY,SAASA,EAAM,KAAK,EACrC,KAAK,YAAY,SAASA,EAAM,OAAO,EACvC,KAAK,QAAQ,SAASA,EAAM,KAAK,EACjC,KAAK,SAAS,SAASA,EAAM,MAAM,EACnC,KAAK,WAAW,SAASA,EAAM,QAAQ,EAEvC,KAAK,SAAS,SAAS2J,EAAK,eAAc,CAAE,CAC9C,CACF,CC3Me,MAAM4jB,EAAM,CACzB,YAAY9R,EAAOpU,EAASvH,EAAQ,QAAS,CAC3C,KAAK,MAAQ2b,EACb,KAAK,GAAKzrB,EAAE,MAAO,GAAGooB,CAAS,QAAQ,EAAE,IAAI,QAAStY,CAAK,EAAE,SAC3D9P,EAAE,MAAO,GAAGooB,CAAS,eAAe,EAAE,SACpC,IAAIuD,GAAK,OAAO,EAAE,GAAG,aAAc,IAAM,KAAK,MAAM,EACpD,KAAK,KACb,EACM3rB,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EAAE,SAAS,GAAG/Q,CAAO,CAChE,EAAM,KAAI,CACR,CAEA,MAAO,CAEL,KAAK,OAASrX,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EACnD,SAAS,KAAK,YAAY,KAAK,OAAO,EAAE,EACxC,KAAM,CAAE,MAAAtY,EAAO,OAAAC,CAAM,EAAK,KAAK,GAAG,KAAI,EAAG,IAAG,EACtC,CAAE,aAAAytB,EAAc,YAAAC,CAAW,EAAK,SAAS,gBAC/C,KAAK,GAAG,OAAO,CACb,MAAOA,EAAc3tB,GAAS,EAC9B,KAAM0tB,EAAeztB,GAAU,CACrC,CAAK,EACD,OAAO,YAAe4G,GAAQ,CACxBA,EAAI,UAAY,IAClB,KAAK,KAAI,CAEb,EACAuP,GAAK,OAAQ,UAAW,OAAO,WAAW,CAC5C,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,EACZ,SAAS,KAAK,YAAY,KAAK,OAAO,EAAE,EACxCG,GAAO,OAAQ,UAAW,OAAO,WAAW,EAC5C,OAAO,OAAO,WAChB,CACF,CCxCe,MAAMqX,EAAU,CAC7B,YAAY5tB,EAAO6tB,EAAM,CACvB,KAAK,QAAU,IAAM,CAAC,EACtB,KAAK,GAAK39B,EAAE,MAAO,GAAGooB,CAAS,aAAa,EAC5C,KAAK,MAAQpoB,EAAE,QAAS,EAAE,EAAE,IAAI,QAAS8P,CAAK,EAC3C,GAAG,QAAS6G,GAAO,KAAK,QAAQA,CAAG,CAAC,EACpC,KAAK,cAAegnB,CAAI,EAC3B,KAAK,GAAG,MAAM,KAAK,KAAK,CAC1B,CAEA,OAAQ,CACN,WAAW,IAAM,CACf,KAAK,MAAM,GAAG,MAAK,CACrB,EAAG,EAAE,CACP,CAEA,KAAKt9B,EAAG,CACN,KAAK,MAAM,KAAK,cAAeA,CAAC,CAClC,CAEA,IAAIA,EAAG,CACL,OAAO,KAAK,MAAM,IAAIA,CAAC,CACzB,CACF,CCtBe,MAAMu9B,EAAW,CAC9B,YAAYtnB,EAAKiV,EAAOzb,EAAO+tB,EAAW37B,GAAMA,EAAI47B,EAAS,IAAM,CAAC,EAAG,CACrE,KAAK,IAAMxnB,EACX,KAAK,SAAWunB,EAChB,KAAK,QAAU,IAAM,CAAC,EACtB,KAAK,GAAK79B,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAC7C,KAAK,QAAU,IAAIkD,GAAQC,EAAM,IAAIrpB,IAAO,CAAE,IAAKA,EAAI,MAAO,KAAK,SAASA,CAAE,CAAC,EAAG,EAAIA,GAAO,CAC3F,KAAK,UAAUA,EAAG,GAAG,EACrB47B,EAAO57B,EAAG,GAAG,EACb,KAAK,QAAQA,EAAG,GAAG,CACrB,EAAG4N,EAAO,KAAK,EAAE,EACjB,KAAK,GAAG,SACN,KAAK,OAAS9P,EAAE,MAAO,YAAY,EAAE,KAAK,KAAK,SAASsW,CAAG,CAAC,EAC5D,KAAK,QAAQ,EACnB,EAAM,GAAG,QAAS,IAAM,KAAK,KAAI,CAAE,CACjC,CAEA,MAAO,CACL,KAAK,QAAQ,OAAO,EAAE,CACxB,CAEA,UAAUpU,EAAI,CACZ,KAAK,IAAMA,EACX,KAAK,OAAO,KAAK,KAAK,SAASA,CAAE,CAAC,CACpC,CAEA,IAAI7B,EAAG,CACL,OAAIA,IAAM,QACR,KAAK,IAAMA,EACX,KAAK,OAAO,KAAK,KAAK,SAASA,CAAC,CAAC,EAC1B,MAEF,KAAK,GACd,CACF,CClCA,MAAM09B,GAAW,CACf,OAAQ,8BACR,KAAM,yBACR,EAGe,MAAMC,EAAU,CAC7B,YAAYtS,EAAOuS,EAAM/uB,EAAOgvB,EAAY,CAC1C,KAAK,MAAQ,GACb,KAAK,KAAOD,EACR/uB,IACF,KAAK,MAAQlP,EAAE,QAAS,OAAO,EAAE,IAAI,QAAS,GAAGk+B,CAAU,IAAI,EAAE,KAAKhvB,CAAK,GAE7E,KAAK,IAAMlP,EAAE,MAAO,KAAK,EAAE,MAAM,KAAK,EAAE,KAAI,EAC5C,KAAK,MAAQ0rB,EACb,KAAK,MAAM,QAAU,IAAM,KAAK,SAAQ,EACxC,KAAK,GAAK1rB,EAAE,MAAO,GAAGooB,CAAS,aAAa,EACzC,SAAS,KAAK,MAAOsD,EAAM,GAAI,KAAK,GAAG,CAC5C,CAEA,QAAS,CACP,OAAO,KAAK,GAAG,IAAI,SAAS,IAAM,MACpC,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,CACd,CAEA,MAAO,CACL,YAAK,GAAG,KAAI,EACL,IACT,CAEA,IAAIrrB,EAAG,CACL,OAAO,KAAK,MAAM,IAAIA,CAAC,CACzB,CAEA,KAAKs9B,EAAM,CACT,KAAK,MAAM,KAAKA,CAAI,CACtB,CAEA,UAAW,CACT,KAAM,CACJ,MAAAjS,EAAO,KAAAuS,EAAM,IAAAxF,EAAK,GAAA1rB,CACxB,EAAQ,KACE1M,EAAIqrB,EAAM,IAAG,EACnB,OAAIuS,EAAK,UACH,QAAQ,KAAK59B,CAAC,GAChBo4B,EAAI,KAAK76B,GAAE,qBAAqB,CAAC,EACjCmP,EAAG,SAAS,OAAO,EACZ,KAGPkxB,EAAK,MAAQA,EAAK,UAEhB,EADYA,EAAK,SAAWF,GAASE,EAAK,IAAI,GACrC,KAAK59B,CAAC,GACjBo4B,EAAI,KAAK76B,GAAE,qBAAqB,CAAC,EACjCmP,EAAG,SAAS,OAAO,EACZ,KAGXA,EAAG,YAAY,OAAO,EACf,GACT,CACF,CC3DA,MAAMoxB,GAAkB,IAET,MAAMC,WAAwBb,EAAM,CACjD,aAAc,CACZ,MAAMc,EAAK,IAAIL,GACb,IAAIJ,GAAW,OACb,CAAC,MAAM,EACP,OACA17B,GAAMtE,GAAE,2BAA2BsE,CAAE,EAAE,CAAC,EAC1C,CAAE,SAAU,EAAI,EAChB,GAAGtE,GAAE,sBAAsB,CAAC,IAC5BugC,EACN,EACUG,EAAK,IAAIN,GACb,IAAIN,GAAU,QAAS,cAAc,EACrC,CAAE,SAAU,GAAM,QAAS,8CAA8C,CAC/E,EACUa,EAAK,IAAIP,GACb,IAAIJ,GAAW,OACb,CAAC,OAAQ,SAAU,OAAQ,QAAS,OAAO,EAC3C,OACA17B,GAAMtE,GAAE,uBAAuBsE,CAAE,EAAE,EACnCA,GAAM,KAAK,iBAAiBA,CAAE,CAAC,EACjC,CAAE,SAAU,EAAI,EAChB,GAAGtE,GAAE,yBAAyB,CAAC,IAC/BugC,EACN,EAGU7U,EAAK,IAAI0U,GACb,IAAIJ,GAAW,KACb,CAAC,KAAM,MAAO,KAAM,MAAO,KAAM,MAAO,KAAM,KAAK,EACnD,QACA17B,GAAMtE,GAAE,2BAA2BsE,CAAE,EAAE,EACvCA,GAAM,KAAK,yBAAyBA,CAAE,CAAC,EACzC,CAAE,SAAU,EAAI,CACtB,EAAM,KAAI,EAEAs8B,EAAQ,IAAIR,GAChB,IAAIN,GAAU,OAAQ,IAAI,EAC1B,CAAE,SAAU,EAAI,CACtB,EAAM,KAAI,EACAe,EAAQ,IAAIT,GAChB,IAAIN,GAAU,OAAQ,KAAK,EAC3B,CAAE,SAAU,GAAM,KAAM,QAAQ,CACtC,EAAM,KAAI,EAEAgB,EAAM,IAAIV,GACd,IAAIN,GAAU,QAAS,OAAO,EAC9B,CAAE,SAAU,EAAI,CACtB,EACUiB,EAAK,IAAIX,GACb,IAAIN,GAAU,OAAQ,IAAI,EAC1B,CAAE,SAAU,GAAM,KAAM,QAAQ,CACtC,EAAM,KAAI,EAEN,MAAM9/B,GAAE,wBAAwB,EAAG,CACjCoC,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAAE,SACnCiW,EAAG,GACHC,EAAG,EACX,EACMt+B,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAAE,SACnCmW,EAAG,GACHjV,EAAG,GACHkV,EAAM,GACNC,EAAM,GACNE,EAAG,GACHD,EAAI,EACZ,EACM1+B,EAAE,MAAO,GAAGooB,CAAS,UAAU,EAAE,SAC/B,IAAI+G,GAAO,QAAQ,EAAE,GAAG,QAAS,IAAM,KAAK,SAAS,QAAQ,CAAC,EAC9D,IAAIA,GAAO,QAAQ,EAAE,GAAG,QAAS,IAAM,KAAK,SAAS,QAAQ,CAAC,EAC9D,IAAIA,GAAO,OAAQ,SAAS,EAAE,GAAG,QAAS,IAAM,KAAK,SAAS,MAAM,CAAC,CAC7E,CACA,CAAK,EACD,KAAK,GAAKkP,EACV,KAAK,GAAKC,EACV,KAAK,GAAKC,EACV,KAAK,GAAKjV,EACV,KAAK,MAAQkV,EACb,KAAK,MAAQC,EACb,KAAK,GAAKE,EACV,KAAK,IAAMD,EACX,KAAK,OAAS,IAAM,CAAC,CACvB,CAEA,OAAOx8B,EAAI,CACT,MAAMy7B,EAAOz7B,IAAO,OAAS,aAAe,KACtC,CAAE,GAAAy8B,CAAE,EAAK,KACfA,EAAG,MAAM,KAAKhB,CAAI,EAClBgB,EAAG,KAAI,CACT,CAEA,iBAAiBz8B,EAAI,CACnB,KAAM,CACJ,GAAAonB,EAAI,MAAAkV,EAAO,MAAAC,EAAO,GAAAE,EAAI,IAAAD,CAC5B,EAAQ,KACAx8B,IAAO,QAAUA,IAAO,UAC1BonB,EAAG,KAAI,EACPkV,EAAM,KAAK,KAAOt8B,EAClBu8B,EAAM,KAAK,KAAOv8B,EACdA,IAAO,QACTs8B,EAAM,KAAK,YAAY,EACvBC,EAAM,KAAK,YAAY,IAEvBD,EAAM,KAAK,IAAI,EACfC,EAAM,KAAK,KAAK,GAElBD,EAAM,KAAI,EACVC,EAAM,KAAI,EACVE,EAAG,KAAI,EACPD,EAAI,KAAI,IAEJx8B,IAAO,OACTw8B,EAAI,KAAI,EAERA,EAAI,KAAI,EAEVC,EAAG,KAAI,EACPrV,EAAG,KAAI,EACPkV,EAAM,KAAI,EACVC,EAAM,KAAI,EAEd,CAEA,yBAAyBv8B,EAAI,CAC3B,GAAI,CAACA,EAAI,OACT,KAAM,CACJ,MAAAs8B,EAAO,MAAAC,EAAO,GAAAE,CACpB,EAAQ,KACJ,GAAIz8B,IAAO,MAAQA,IAAO,MACxBs8B,EAAM,KAAI,EACVC,EAAM,KAAI,EACVE,EAAG,KAAI,MACF,CACL,MAAM1jB,EAAO,KAAK,GAAG,IAAG,EACxB0jB,EAAG,KAAK,KAAO1jB,EACXA,IAAS,OACX0jB,EAAG,KAAK,YAAY,EAEpBA,EAAG,KAAK,IAAI,EAEdA,EAAG,KAAI,EACPH,EAAM,KAAI,EACVC,EAAM,KAAI,CACZ,CACF,CAEA,SAASG,EAAQ,CACf,GAAIA,IAAW,SACb,KAAK,KAAI,UACAA,IAAW,SACpB,KAAK,OAAO,QAAQ,EACpB,KAAK,KAAI,UACAA,IAAW,OAAQ,CAE5B,MAAMC,EAAQ,CAAC,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,QAAS,OAAO,EACpE,QAASrgC,EAAI,EAAGA,EAAIqgC,EAAM,OAAQrgC,GAAK,EAAG,CACxC,MAAMsgC,EAAQ,KAAKD,EAAMrgC,CAAC,CAAC,EAE3B,GAAIsgC,EAAM,UAEJ,CAACA,EAAM,WAAY,MAE3B,CAEA,MAAMz2B,EAAO,KAAK,GAAG,IAAG,EAClBiR,EAAM,KAAK,GAAG,IAAG,EACjB2B,EAAO,KAAK,GAAG,IAAG,EAClBf,EAAW,KAAK,GAAG,IAAG,EAC5B,IAAIvX,EAAQ,KAAK,IAAI,IAAG,GACpBsY,IAAS,UAAYA,IAAS,UAC5Bf,IAAa,MAAQA,IAAa,MACpCvX,EAAQ,CAAC,KAAK,MAAM,IAAG,EAAI,KAAK,MAAM,KAAK,EAE3CA,EAAQ,KAAK,GAAG,IAAG,GAIvB,KAAK,OAAO,OACV0F,EACAiR,EACA,CACE,KAAA2B,EAAM,SAAAf,EAAU,SAAU,GAAO,MAAAvX,CAC3C,CAAS,EACH,KAAK,KAAI,CACX,CACF,CAGA,SAAStC,EAAG,CACV,GAAIA,EAAG,CACL,KAAM,CACJ,GAAAg+B,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAjV,EAAI,IAAAoV,EAAK,GAAAC,EAAI,MAAAH,EAAO,MAAAC,CACxC,EAAU,KACE,CACJ,KAAAp2B,EAAM,IAAAiR,EAAK,UAAAqH,CACnB,EAAUtgB,EACE,CACJ,KAAA4a,EAAM,SAAAf,EAAU,MAAAvX,CACxB,EAAUge,GAAa,CAAE,KAAM,MAAM,EAC/B0d,EAAG,IAAIh2B,GAAQ,MAAM,EACrBi2B,EAAG,IAAIhlB,CAAG,EACVilB,EAAG,IAAItjB,CAAI,EACXqO,EAAG,IAAIpP,CAAQ,EACX,MAAM,QAAQvX,CAAK,GACrB67B,EAAM,IAAI77B,EAAM,CAAC,CAAC,EAClB87B,EAAM,IAAI97B,EAAM,CAAC,CAAC,IAElB+7B,EAAI,IAAI/7B,GAAS,EAAE,EACnBg8B,EAAG,IAAIh8B,GAAS,EAAE,GAEpB,KAAK,iBAAiBsY,CAAI,EAC1B,KAAK,yBAAyBf,CAAQ,CACxC,CACA,KAAK,KAAI,CACX,CACF,CC5NA,SAAS8d,GAAU+G,EAAS,CAC1B,OAAO/+B,EAAE,MAAO,GAAGooB,CAAS,SAAS2W,CAAO,EAAE,CAChD,CAEA,SAASC,GAAc98B,EAAI,CACzB,OAAO81B,GAAU,OAAO,EAAE,MAAMp6B,GAAE,QAAQsE,CAAE,EAAE,CAAC,EAC5C,GAAG,aAAc,IAAM,KAAK,UAAUA,CAAE,CAAC,CAC9C,CAEA,SAAS+8B,GAAgB1T,EAAO,CAC9B,KAAM,CAAE,UAAA2T,EAAW,aAAAC,CAAY,EAAK,KACpCD,EAAU,KAAK,EAAE,EACA,OAAO,KAAK3T,CAAK,EACzB,QAAQ,CAACrpB,EAAIoF,IAAU,CAC9B,MAAMwT,EAAMyQ,EAAMrpB,CAAE,EACdoqB,EAAS6S,EAAa,SAASj9B,CAAE,EAAI,UAAY,GACvDg9B,EAAU,MAAMl/B,EAAE,MAAO,GAAGooB,CAAS,eAAekE,CAAM,EAAE,EACzD,GAAG,aAAc,IAAM,KAAK,YAAYhlB,EAAOpF,CAAE,CAAC,EAClD,SAASA,IAAO,GAAKtE,GAAE,cAAc,EAAIsE,EAAIlC,EAAE,MAAO,OAAO,EAAE,KAAK,IAAI8a,CAAG,GAAG,CAAC,CAAC,CACrF,CAAC,CACH,CAEA,SAASskB,IAAoB,CAC3B,KAAM,CAAE,UAAAC,EAAW,aAAAF,EAAc,OAAAG,CAAM,EAAK,KAC5CD,EAAU,KAAK,GAAGF,EAAa,MAAM,MAAMG,EAAO,MAAM,EAAE,EAC1DD,EAAU,QAAQF,EAAa,SAAWG,EAAO,MAAM,CACzD,CAEe,MAAMC,EAAW,CAC9B,aAAc,CACZ,KAAK,UAAYv/B,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAC7C,KAAK,UAAYpoB,EAAE,MAAO,GAAGooB,CAAS,eAAe,EAAE,GAAG,aAAc,IAAM,KAAK,YAAY,EAAG,KAAK,CAAC,EACxG,KAAK,GAAKpoB,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAAE,SAC7C,KAAK,UAAY4W,GAAc,KAAK,KAAM,KAAK,EAC/C,KAAK,WAAaA,GAAc,KAAK,KAAM,MAAM,EACjDhH,GAAU,SAAS,EACnBh4B,EAAE,MAAO,GAAGooB,CAAS,SAAS,EAAE,SAC9B,KAAK,UACL,KAAK,SACb,EACMpoB,EAAE,MAAO,GAAGooB,CAAS,UAAU,EAAE,SAC/B,IAAI+G,GAAO,QAAQ,EAAE,GAAG,QAAS,IAAM,KAAK,SAAS,QAAQ,CAAC,EAC9D,IAAIA,GAAO,KAAM,SAAS,EAAE,GAAG,QAAS,IAAM,KAAK,SAAS,IAAI,CAAC,CACzE,CACA,EAAM,KAAI,EAEN,KAAK,GAAK,KACV,KAAK,SAAW,KAChB,KAAK,OAAS,KACd,KAAK,aAAe,CAAA,CACtB,CAEA,SAASjtB,EAAI,CACX,GAAIA,IAAO,KAAM,CACf,KAAM,CAAE,GAAA2W,EAAI,KAAA0B,EAAM,aAAA4kB,CAAY,EAAK,KAC/B,KAAK,IACP,KAAK,GAAGtmB,EAAI0B,EAAM,KAAM4kB,CAAY,CAExC,CACA,KAAK,KAAI,CACX,CAEA,UAAUj9B,EAAI,CAEZ,KAAK,KAAOA,EACZ,KAAM,CAAE,UAAAs9B,EAAW,WAAAC,CAAU,EAAK,KAClCD,EAAU,QAAQt9B,IAAO,KAAK,EAC9Bu9B,EAAW,QAAQv9B,IAAO,MAAM,CAClC,CAEA,YAAYoF,EAAOpF,EAAI,CAErB,KAAM,CAAE,UAAAg9B,EAAW,aAAAC,EAAc,OAAAG,CAAM,EAAK,KACtC58B,EAAWw8B,EAAU,SAAQ,EAC/Bh9B,IAAO,MACLQ,EAAS,SAAWy8B,EAAa,QACnC,KAAK,aAAe,CAAA,EACpBz8B,EAAS,QAAQlE,GAAKwB,EAAExB,CAAC,EAAE,QAAQ,EAAK,CAAC,IAEzC,KAAK,aAAe,MAAM,KAAK8gC,CAAM,EACrC58B,EAAS,QAAQlE,GAAKwB,EAAExB,CAAC,EAAE,QAAQ,EAAI,CAAC,GAG1BwB,EAAE0C,EAAS4E,CAAK,CAAC,EAAE,OAAO,SAAS,EAEjD63B,EAAa,KAAKj9B,CAAE,EAEpBi9B,EAAa,OAAOA,EAAa,UAAU3gC,GAAKA,IAAM0D,CAAE,EAAG,CAAC,EAGhEk9B,GAAkB,KAAK,IAAI,CAC7B,CAKA,IAAIvmB,EAAI0S,EAAO/Q,EAAQD,EAAM,CAC3B,KAAK,GAAK1B,EACV,KAAM,CAAE,UAAA2mB,EAAW,WAAAC,CAAU,EAAK,KAC9BllB,IAAS,MACX,KAAK,KAAOA,EAAK,MACjBilB,EAAU,QAAQjlB,EAAK,KAAK,EAC5BklB,EAAW,QAAQllB,EAAK,MAAM,IAE9B,KAAK,SAAW,KAChBilB,EAAU,QAAQ,EAAK,EACvBC,EAAW,QAAQ,EAAK,GAG1B,KAAK,OAAS,OAAO,KAAKlU,CAAK,EAC/B,KAAK,aAAe/Q,EAAS,MAAM,KAAKA,EAAO,KAAK,EAAI,OAAO,KAAK+Q,CAAK,EACzE0T,GAAgB,KAAK,KAAM1T,EAAO/Q,CAAM,EACxC4kB,GAAkB,KAAK,IAAI,CAC7B,CAEA,UAAU/+B,EAAG,CACX,KAAK,GAAG,OAAOA,CAAC,EAAE,KAAI,EACtB,IAAIq/B,EAAS,EACbnZ,GAAiB,KAAK,GAAI,IAAM,CAC1BmZ,GAAU,GACZ,KAAK,KAAI,EAEXA,GAAU,CACZ,CAAC,CACH,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,CACd,CAEA,MAAO,CACL,KAAK,GAAG,KAAI,EACZpZ,GAAmB,KAAK,EAAE,CAC5B,CACF,CCvIO,SAASqZ,GAAOlU,EAAOpU,EAAS,CACrC,MAAMtK,EAAK/M,EAAE,MAAO,GAAGooB,CAAS,QAAQ,EAClCwX,EAAS5/B,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EAC9CJ,EAAS,IAAM,CACnB,SAAS,KAAK,YAAYjb,EAAG,EAAE,EAC/B,SAAS,KAAK,YAAY6yB,EAAO,EAAE,CACrC,EAEA7yB,EAAG,SACD/M,EAAE,MAAO,GAAGooB,CAAS,eAAe,EAAE,SACpC,IAAIuD,GAAK,OAAO,EAAE,GAAG,aAAc,IAAM3D,GAAQ,EACjDyD,CACN,EACIzrB,EAAE,MAAO,GAAGooB,CAAS,gBAAgB,EAAE,KAAK/Q,CAAO,CACvD,EACE,SAAS,KAAK,YAAYtK,EAAG,EAAE,EAC/B,SAAS,KAAK,YAAY6yB,EAAO,EAAE,EAEnC,KAAM,CAAE,MAAA9vB,EAAO,OAAAC,GAAWhD,EAAG,IAAG,EAC1B,CAAE,aAAAywB,EAAc,YAAAC,CAAW,EAAK,SAAS,gBAC/C1wB,EAAG,OAAO,CACR,MAAO0wB,EAAc3tB,GAAS,EAC9B,KAAM0tB,EAAeztB,GAAU,CACnC,CAAG,CACH,CCFA,SAAS8vB,GAASC,EAAMC,EAAM,CAC5B,IAAIC,EACJ,MAAO,IAAI9oB,IAAQ,CACjB,MAAM+oB,EAAO,KACPtnB,EAAOzB,EACR8oB,IACHA,EAAU,WAAW,IAAM,CACzBA,EAAU,KACVF,EAAK,MAAMG,EAAMtnB,CAAI,CACvB,EAAGonB,CAAI,EAEX,CACF,CAEA,SAASG,IAAgB,CACvB,KAAM,CACJ,KAAAvmB,EAAM,kBAAAwmB,EAAmB,oBAAAC,CAC7B,EAAM,KACE,CACJ,EAAAzhC,EAAG,EAAAf,EAAG,KAAAslB,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CAC5B,EAAM4J,EAAK,gBAAe,EAClB0mB,EAAc,KAAK,eAAc,EAEvC,GAAI,KAAK,IAAInd,CAAI,EAAIpT,EAAQuwB,EAAY,MACvCD,EAAoB,KAAK,CAAE,KAAMzhC,EAAImR,EAAQuwB,EAAY,MAAO,MAC3D,CACL,MAAMpd,EAAMtJ,EAAK,iBAAgB,EAC7BuJ,EAAOD,GACTmd,EAAoB,KAAK,CAAE,KAAMzhC,EAAI,EAAIskB,EAAK,CAElD,CAEA,GAAI,KAAK,IAAIJ,CAAG,EAAI9S,EAASswB,EAAY,OACvCF,EAAkB,KAAK,CAAE,IAAKviC,EAAImS,EAASswB,EAAY,OAAS,EAAG,MAC9D,CACL,MAAM1d,EAAMhJ,EAAK,kBAAiB,EAC9BkJ,EAAMF,GACRwd,EAAkB,KAAK,CAAE,IAAKviC,EAAI,EAAI+kB,EAAK,CAE/C,CACF,CAEA,SAAS2d,GAAYpe,EAAUtJ,EAAIC,EAAI8R,EAAiB,GAAMnC,EAAS,GAAO,CAC5E,GAAI5P,IAAO,IAAMC,IAAO,GAAI,OAC5B,KAAM,CACJ,MAAAohB,EAAO,SAAAhY,EAAU,QAAAse,EAAS,KAAA5mB,EAC1B,YAAA6mB,CACJ,EAAM,KACJA,EAAY,QAAS5nB,IAAO,IAAMC,IAAO,GAAM,UAAY,OAAO,EAClE,MAAM+B,EAAOjB,EAAK,QAAQf,EAAIC,CAAE,EAC5BqJ,GACFD,EAAS,OAAOrJ,EAAIC,EAAI2P,CAAM,EAC9B,KAAK,QAAQ,iBAAkB5N,EAAMqH,EAAS,KAAK,IAGnDA,EAAS,IAAIrJ,EAAIC,EAAI8R,CAAc,EACnC,KAAK,QAAQ,gBAAiB/P,EAAMhC,EAAIC,CAAE,GAE5C0nB,EAAQ,MAAK,EACbtG,EAAM,OAAM,CACd,CAIA,SAASwG,GAAave,EAAU4E,EAAW,CACzC,KAAM,CACJ,SAAA7E,EAAU,KAAAtI,CACd,EAAM,KACE,CAAE,KAAA6H,EAAM,KAAAwB,CAAI,EAAKrJ,EACvB,GAAI,CAACf,EAAIC,CAAE,EAAIoJ,EAAS,QACxB,KAAM,CAAE,IAAAxJ,EAAK,IAAAC,CAAG,EAAKuJ,EAAS,MAC1BC,IACF,CAACtJ,EAAIC,CAAE,EAAIoJ,EAAS,aAGlB6E,IAAc,OACZjO,EAAK,IAAGA,GAAM,GACTiO,IAAc,SACnBpO,IAAQG,IAAIA,EAAKH,GACjBG,EAAKmK,EAAK,IAAM,IAAGnK,GAAM,IACpBiO,IAAc,KACnBlO,EAAK,IAAGA,GAAM,GACTkO,IAAc,QACnBrO,IAAQG,IAAIA,EAAKH,GACjBG,EAAK4I,EAAK,IAAM,IAAG5I,GAAM,IACpBkO,IAAc,YACvBjO,EAAK,EACIiO,IAAc,WACvBjO,EAAKmK,EAAK,IAAM,EACP8D,IAAc,YACvBlO,EAAK,EACIkO,IAAc,aACvBlO,EAAK4I,EAAK,IAAM,GAEdU,IACFD,EAAS,YAAc,CAACrJ,EAAIC,CAAE,GAEhCynB,GAAY,KAAK,KAAMpe,EAAUtJ,EAAIC,CAAE,EACvCqnB,GAAc,KAAK,IAAI,CACzB,CAGA,SAASQ,GAAmB/pB,EAAK,CAG/B,GADIA,EAAI,UAAY,GAChBA,EAAI,OAAO,YAAc,GAAGyR,CAAS,iBAAkB,OAC3D,KAAM,CAAE,QAAAuY,EAAS,QAAAC,CAAO,EAAKjqB,EACvB,CACJ,WAAAkqB,EAAY,WAAAC,EAAY,QAAAC,EAAS,KAAApnB,CACrC,EAAM,KACE,CAAE,KAAA6H,EAAM,KAAAwB,CAAI,EAAKrJ,EACvB,GAAIgnB,EAAU3d,EAAK,YAAc4d,EAAUpf,EAAK,OAAQ,CACtDqf,EAAW,KAAI,EACfC,EAAW,KAAI,EACf,MACF,CACA,MAAME,EAAQD,EAAQ,IAAG,EACnBlY,EAAQlP,EAAK,gBAAgBhD,EAAI,QAASA,EAAI,OAAO,EACvDkS,EAAM,IAAM,GAAKA,EAAM,KAAO,IAChCA,EAAM,MAAQ7F,EAAK,WACnB6d,EAAW,KAAKhY,EAAO,CACrB,MAAOmY,EAAM,KACnB,CAAK,EACGxf,EAAK,OAAOqH,EAAM,GAAK,CAAC,EAC1BgY,EAAW,WAAWhY,EAAM,EAAE,EAE9BgY,EAAW,WAAU,GAGvBA,EAAW,KAAI,EAEbhY,EAAM,KAAO,IAAMA,EAAM,IAAM,GACjCA,EAAM,OAASrH,EAAK,OACpBsf,EAAW,KAAKjY,EAAO,CACrB,OAAQmY,EAAM,MACpB,CAAK,EACGhe,EAAK,OAAO6F,EAAM,GAAK,CAAC,EAC1BiY,EAAW,WAAWjY,EAAM,EAAE,EAE9BiY,EAAW,WAAU,GAGvBA,EAAW,KAAI,CAEnB,CAGA,SAASG,GAAqBtqB,EAAK,CAKjC,KAAM,CAAE,kBAAAwpB,EAAmB,oBAAAC,EAAqB,KAAAzmB,CAAI,EAAK,KACnD,CAAE,IAAAkJ,CAAG,EAAKsd,EAAkB,OAAM,EAClC,CAAE,KAAAjd,CAAI,EAAKkd,EAAoB,OAAM,EAGrC,CAAE,KAAA5e,EAAM,KAAAwB,CAAI,EAAKrJ,EAGjB,CAAE,OAAAunB,EAAQ,OAAAC,CAAM,EAAKxqB,EACrByqB,EAAY,CAACxyB,EAAIyyB,IAAU,CAC/B,IAAI7iC,EAAIoQ,EACJvO,EAAI,EACR,GACEA,EAAIghC,EAAM7iC,CAAC,EACXA,GAAK,QACE6B,GAAK,GACd,OAAOA,CACT,EAGMihC,EAAShZ,GAAa,CAC1B,GAAIA,EAAW,EAAG,CAEhB,MAAM1P,EAAKe,EAAK,OAAO,GAAK,EAC5B,GAAIf,EAAK4I,EAAK,IAAK,CACjB,MAAMiW,EAAK2J,EAAUxoB,EAAIpa,GAAKgjB,EAAK,UAAUhjB,CAAC,CAAC,EAC/C2hC,EAAkB,KAAK,CAAE,IAAKtd,EAAM4U,EAAK,EAAG,CAC9C,CACF,KAAO,CAEL,MAAM7e,EAAKe,EAAK,OAAO,GAAK,EAC5B,GAAIf,GAAM,EAAG,CACX,MAAM6e,EAAK2J,EAAUxoB,EAAIpa,GAAKgjB,EAAK,UAAUhjB,CAAC,CAAC,EAC/C2hC,EAAkB,KAAK,CAAE,IAAKvnB,IAAO,EAAI,EAAIiK,EAAM4U,EAAI,CACzD,CACF,CACF,EAGM8J,EAASC,GAAe,CAC5B,GAAIA,EAAa,EAAG,CAElB,MAAM3oB,EAAKc,EAAK,OAAO,GAAK,EAC5B,GAAId,EAAKmK,EAAK,IAAK,CACjB,MAAMgT,EAAKoL,EAAUvoB,EAAIra,GAAKwkB,EAAK,SAASxkB,CAAC,CAAC,EAC9C4hC,EAAoB,KAAK,CAAE,KAAMld,EAAO8S,EAAK,EAAG,CAClD,CACF,KAAO,CAEL,MAAMnd,EAAKc,EAAK,OAAO,GAAK,EAC5B,GAAId,GAAM,EAAG,CACX,MAAMmd,EAAKoL,EAAUvoB,EAAIra,GAAKwkB,EAAK,SAASxkB,CAAC,CAAC,EAC9C4hC,EAAoB,KAAK,CAAE,KAAMvnB,IAAO,EAAI,EAAIqK,EAAO8S,EAAI,CAC7D,CACF,CACF,EACMyL,EAAQ,KAAK,IAAIP,CAAM,EACvBQ,EAAQ,KAAK,IAAIP,CAAM,EACvBQ,EAAO,KAAK,IAAIF,EAAOC,CAAK,EAG9B,WAAW,KAAK,OAAO,UAAU,SAAS,GAAG7B,GAASyB,EAAM3qB,EAAI,MAAM,EAAG,EAAE,EAC3EgrB,IAASD,GAAO7B,GAAS0B,EAAMJ,CAAM,EAAG,EAAE,EAC1CQ,IAASF,GAAO5B,GAASyB,EAAMJ,CAAM,EAAG,EAAE,CAChD,CAEA,SAASU,GAAe9a,EAAWvS,EAAU,CAC3C,KAAM,CAAE,kBAAA4rB,EAAmB,oBAAAC,CAAmB,EAAK,KAC7C,CAAE,IAAAvd,CAAG,EAAKsd,EAAkB,OAAM,EAClC,CAAE,KAAAjd,CAAI,EAAKkd,EAAoB,OAAM,EAEvCtZ,IAAc,QAAUA,IAAc,QACxCsZ,EAAoB,KAAK,CAAE,KAAMld,EAAO3O,CAAQ,CAAE,GACzCuS,IAAc,MAAQA,IAAc,SAC7CqZ,EAAkB,KAAK,CAAE,IAAKtd,EAAMtO,CAAQ,CAAE,CAElD,CAEA,SAASstB,IAAuB,CAC9B,KAAM,CAAE,KAAAloB,EAAM,kBAAAwmB,CAAiB,EAAK,KAC9B,CAAE,OAAApwB,CAAM,EAAK,KAAK,eAAc,EAChC+xB,EAAOnoB,EAAK,qBAAqB,EAAG,EAAE,EAE5CwmB,EAAkB,IAAIpwB,EAAQ4J,EAAK,KAAK,YAAW,EAAKmoB,CAAI,CAC9D,CAEA,SAASC,IAAyB,CAChC,KAAM,CAAE,KAAApoB,EAAM,oBAAAymB,CAAmB,EAAK,KAChC,CAAE,MAAAtwB,CAAK,EAAK,KAAK,eAAc,EACjC6J,GACFymB,EAAoB,IAAItwB,EAAO6J,EAAK,KAAK,WAAU,CAAE,CAEzD,CAEA,SAASqoB,IAAc,CACrB,KAAM,CACJ,SAAA/f,EAAU,KAAAtI,EAAM,OAAAsoB,CACpB,EAAM,KACE,CAACrpB,EAAIC,CAAE,EAAIc,EAAK,OACtB,GAAIf,EAAK,GAAKC,EAAK,EAAG,CACpB,MAAMqpB,EAASvoB,EAAK,iBAAgB,EAC9BwoB,EAAUxoB,EAAK,kBAAiB,EACtCsoB,EAAO,iBAAiBC,EAAQC,CAAO,CACzC,CACAlgB,EAAS,gBAAe,CAC1B,CAEA,SAASmgB,IAAa,CACpB,KAAM,CACJ,QAAArB,EACA,YAAAsB,EACA,aAAAC,EACA,MAAArI,EACA,QAAAsG,EACA,SAAAte,EACA,GAAAlV,CACJ,EAAM,KACEw1B,EAAU,KAAK,eAAc,EAC7BC,EAAQ,KAAK,QAAO,EAC1BzB,EAAQ,KAAKyB,CAAK,EAClBH,EAAY,OAAOG,CAAK,EACxBF,EAAa,OAAOC,CAAO,EAC3Bx1B,EAAG,IAAI,QAAS,GAAGy1B,EAAM,KAAK,IAAI,EAClCX,GAAqB,KAAK,IAAI,EAC9BE,GAAuB,KAAK,IAAI,EAChCC,GAAY,KAAK,IAAI,EACrB/H,EAAM,OAAM,EACZsG,EAAQ,MAAK,EACbte,EAAS,MAAK,CAChB,CAEA,SAASwgB,IAAiB,CACxB,KAAM,CAAE,KAAA9oB,EAAM,SAAAsI,CAAQ,EAAK,KAC3BtI,EAAK,eAAc,EACnBsI,EAAS,cAAa,CACxB,CAEA,SAASygB,IAAO,CACd,KAAM,CAAE,KAAA/oB,EAAM,SAAAsI,CAAQ,EAAK,KAC3BtI,EAAK,KAAI,EACTA,EAAK,sBAAqB,EAC1BsI,EAAS,cAAa,CACxB,CAEA,SAAS0gB,IAAM,CACb,KAAM,CAAE,KAAAhpB,EAAM,SAAAsI,CAAQ,EAAK,KAC3BtI,EAAK,IAAG,EACRsI,EAAS,cAAa,CACxB,CAEA,SAAS2gB,GAAMzkB,EAAMxH,EAAK,CACxB,KAAM,CAAE,KAAAgD,CAAI,EAAK,KACjB,GAAIA,EAAK,SAAS,OAAS,QAC3B,GAAIA,EAAK,MAAMwE,EAAM0kB,GAAOlD,GAAO,MAAOkD,CAAG,CAAC,EAC5CT,GAAW,KAAK,IAAI,UACXzrB,EAAK,CACd,MAAMmsB,EAAQnsB,EAAI,cAAc,QAAQ,YAAY,EACpD,KAAK,KAAK,cAAcmsB,CAAK,EAC7BV,GAAW,KAAK,IAAI,CACtB,EACF,CAEA,SAASW,IAAiB,CACxB,KAAK,KAAK,eAAc,EACxBX,GAAW,KAAK,IAAI,CACtB,CAEA,SAASY,GAAiB/nB,EAAM3T,EAAO,CACrC,KAAK,KAAK,iBAAiB2T,EAAM3T,CAAK,EACtC86B,GAAW,KAAK,IAAI,CACtB,CAEA,SAASa,IAAa,CACpB,KAAM,CAAE,KAAAtpB,CAAI,EAAK,KACjBA,EAAK,WAAU,EACfyoB,GAAW,KAAK,IAAI,CACtB,CAEA,SAASc,IAAgC,CACvC,KAAM,CAAE,QAAA3C,CAAO,EAAK,KAChBA,EAAQ,sBACVqC,GAAM,KAAK,KAAM,QAAQ,EACzBH,GAAe,KAAK,IAAI,EACxBlC,EAAQ,kBAAiB,EAE7B,CAEA,SAAS4C,GAAmBxsB,EAAK,CAG/B,KAAM,CACJ,SAAAsL,EAAU,KAAAtI,EAAM,MAAAsgB,EAAO,WAAAmJ,CAC3B,EAAM,KACE,CAAE,QAAAzC,EAAS,QAAAC,CAAO,EAAKjqB,EACvB0sB,EAAe1sB,EAAI,OAAO,YAAc,GAAGyR,CAAS,mBACpDkb,EAAW3pB,EAAK,gBAAgBgnB,EAASC,CAAO,EAChD,CACJ,KAAA1d,EAAM,IAAAL,EAAK,MAAA/S,EAAO,OAAAC,CACtB,EAAMuzB,EACJ,GAAI,CAAE,GAAA1qB,EAAI,GAAAC,CAAE,EAAKyqB,EAEjB,KAAM,CAAE,WAAAtf,CAAU,EAAKrK,EACvB,GAAIqK,EAAW,SAASpL,EAAIC,CAAE,GACxBqK,EAAOpT,EAAQ,GAAK6wB,GAAW9d,EAAM9S,EAAS,GAAK6wB,EAAS,CAC9D,MAAMrV,EAAQvH,EAAW,MAAMnL,EAAI,CAAC3a,EAAGO,IAAMkb,EAAK,KAAK,QAAQzb,EAAGO,CAAC,CAAC,EACpE2kC,EAAW,KAAI,EACfA,EAAW,IAAIvqB,EAAI0S,EAAOvH,EAAW,UAAUnL,CAAE,EAAGmL,EAAW,QAAQnL,CAAE,CAAC,EAC1EuqB,EAAW,UAAU,CAAE,KAAAlgB,EAAM,IAAKL,EAAM9S,EAAS,EAAG,EACpD,MACF,CAIG4G,EAAI,WAEH0sB,EACFphB,EAAS,aAAarJ,EAAIC,CAAE,EAE5BynB,GAAY,KAAK,KAAM,GAAO1nB,EAAIC,CAAE,EAItC2N,GAAY,OAAS9oB,GAAM,EAExB,CAAE,GAAAkb,EAAI,GAAAC,CAAE,EAAKc,EAAK,gBAAgBjc,EAAE,QAASA,EAAE,OAAO,GACnD2lC,EACFphB,EAAS,aAAarJ,EAAIC,CAAE,EACnBnb,EAAE,UAAY,GAAK,CAACA,EAAE,UAC/B4iC,GAAY,KAAK,KAAM,GAAM1nB,EAAIC,EAAI,GAAM,EAAI,CAEnD,EAAG,IAAM,CACHwqB,GAAgBphB,EAAS,QAAUtI,EAAK,SAAS,OAAS,QACxDA,EAAK,SAASsI,EAAS,OAAQ,MAAO4gB,GAAOlD,GAAO,MAAOkD,CAAG,CAAC,GACjE5I,EAAM,OAAM,EAGhBhY,EAAS,aAAY,EACrBihB,GAA8B,KAAK,IAAI,CACzC,CAAC,GAGC,CAACG,GAAgB1sB,EAAI,UAAY,GAC/BA,EAAI,UAEN2pB,GAAY,KAAK,KAAM,GAAM1nB,EAAIC,CAAE,CAGzC,CAEA,SAAS0qB,IAAkB,CACzB,KAAM,CAAE,OAAAtB,EAAQ,KAAAtoB,CAAI,EAAK,KACnBsV,EAAUtV,EAAK,gBAAe,EAC9B4oB,EAAU,KAAK,eAAc,EACnC,IAAIiB,EAAY,MAEZvU,EAAQ,IAAMsT,EAAQ,OAAS,IACjCiB,EAAY,UAEdvB,EAAO,UAAUhT,EAASuU,CAAS,CACrC,CAEA,SAASC,IAAY,CACnB,KAAM,CAAE,OAAAxB,EAAQ,KAAAtoB,CAAI,EAAK,KACrBA,EAAK,SAAS,OAAS,SAC3B4pB,GAAgB,KAAK,IAAI,EACzBtB,EAAO,QAAQtoB,EAAK,gBAAe,EAAIA,EAAK,sBAAsB,EAClE8oB,GAAe,KAAK,IAAI,EAC1B,CAEA,SAASiB,GAAsBnvB,EAAU,CACvC,KAAM,CAAE,KAAAoF,EAAM,MAAAsgB,EAAO,SAAAhY,CAAQ,EAAK,KAClCtI,EAAK,QAAQpF,EAAU,IAAM,CAC3B0N,EAAS,mBAAkB,EAC3BshB,GAAgB,KAAK,IAAI,EACzBtJ,EAAM,OAAM,CACd,CAAC,CACH,CAEA,SAAS0J,GAAwBpvB,EAAU,CACzC,KAAM,CAAE,KAAAoF,EAAM,MAAAsgB,EAAO,SAAAhY,CAAQ,EAAK,KAClCtI,EAAK,QAAQpF,EAAU,IAAM,CAC3B0N,EAAS,mBAAkB,EAC3BshB,GAAgB,KAAK,IAAI,EACzBtJ,EAAM,OAAM,CACd,CAAC,CACH,CAEA,SAAS2J,GAAmB/a,EAAOtU,EAAU,CAC3C,KAAM,CAAE,GAAAqE,CAAE,EAAKiQ,EACT,CAAE,MAAAoR,EAAO,SAAAhY,EAAU,KAAAtI,CAAI,EAAK,KAClCA,EAAK,KAAK,UAAUf,EAAIrE,CAAQ,EAChC0lB,EAAM,OAAM,EACZhY,EAAS,gBAAe,EACxB4f,GAAqB,KAAK,IAAI,EAC9B0B,GAAgB,KAAK,IAAI,CAC3B,CAEA,SAASM,GAAmBhb,EAAOtU,EAAU,CAC3C,KAAM,CAAE,GAAAsE,CAAE,EAAKgQ,EACT,CAAE,MAAAoR,EAAO,SAAAhY,EAAU,KAAAtI,CAAI,EAAK,KAClCA,EAAK,KAAK,SAASd,EAAItE,CAAQ,EAE/B0lB,EAAM,OAAM,EACZhY,EAAS,gBAAe,EACxB8f,GAAuB,KAAK,IAAI,EAChCwB,GAAgB,KAAK,IAAI,CAC3B,CAEA,SAASO,GAAgB1lB,EAAM2F,EAAQ,WAAY,CACjD,KAAM,CAAE,KAAApK,EAAM,MAAAsgB,CAAK,EAAK,KAExB,GAAItgB,EAAK,SAAS,OAAS,OAAQ,OACnCA,EAAK,oBAAoByE,EAAM2F,CAAK,EACpC,KAAM,CAAE,GAAAnL,EAAI,GAAAC,CAAE,EAAKc,EAAK,SACpBoK,IAAU,WACZkW,EAAM,OAAM,EAEZ,KAAK,QAAQ,cAAe7b,EAAMxF,EAAIC,CAAE,CAE5C,CAEA,SAASkrB,GAAsB9oB,EAAM,CACnC,KAAM,CAAE,KAAAtB,CAAI,EAAK,KACbA,EAAK,SAAS,OAAS,SACvBsB,IAAS,aACXtB,EAAK,OAAO,KAAK,EACRsB,IAAS,aAClBtB,EAAK,OAAO,KAAK,EACRsB,IAAS,gBAClBtB,EAAK,OAAO,QAAQ,EACXsB,IAAS,gBAClBtB,EAAK,OAAO,QAAQ,EACXsB,IAAS,cAClBtB,EAAK,WAAU,EACNsB,IAAS,qBAClBtB,EAAK,WAAW,QAAQ,EACfsB,IAAS,mBAClBtB,EAAK,WAAW,MAAM,EACbsB,IAAS,iBAClBtB,EAAK,oBAAoB,YAAa,EAAI,EACjCsB,IAAS,qBAClBtB,EAAK,oBAAoB,YAAa,EAAK,EAClCsB,IAAS,gBAClBtB,EAAK,oBAAoB,WAAY,EAAI,EAChCsB,IAAS,qBAClBtB,EAAK,oBAAoB,WAAY,EAAK,EAE5C8oB,GAAe,KAAK,IAAI,EACxBL,GAAW,KAAK,IAAI,EACtB,CAEA,SAAS4B,GAAc/oB,EAAMtY,EAAO,CAClC,KAAM,CAAE,KAAAgX,CAAI,EAAK,KACjB,GAAIsB,IAAS,OACX,KAAK,KAAI,UACAA,IAAS,OAClB,KAAK,KAAI,UACAA,IAAS,QAClB,KAAK,MAAM,QAAO,UACTA,IAAS,cACdtY,IAAU,GAAM+/B,GAAK,KAAK,IAAI,EAC7BD,GAAe,KAAK,IAAI,UACpBxnB,IAAS,cAClB8oB,GAAsB,KAAK,KAAM,oBAAoB,UAC5C9oB,IAAS,QAEb,GAAIA,IAAS,QAEb,GAAIA,IAAS,aAElBgoB,GAAW,KAAK,IAAI,UACXhoB,IAAS,SAClB,GAAItY,EAAO,CACT,KAAM,CAAE,GAAAiW,EAAI,GAAAC,CAAE,EAAKc,EAAK,SACxB,KAAK,OAAOf,EAAIC,CAAE,CACpB,MACE,KAAK,OAAO,EAAG,CAAC,OAGlBc,EAAK,oBAAoBsB,EAAMtY,CAAK,EAChCsY,IAAS,WAAa,CAACtB,EAAK,SAAS,SAAQ,GAC/C8pB,GAAU,KAAK,IAAI,EAErBrB,GAAW,KAAK,IAAI,EAExB,CAEA,SAAS6B,GAAiBprB,EAAIuB,EAAOF,EAAUvX,EAAO,CAEpD,KAAK,KAAK,cAAckW,EAAIuB,EAAOF,EAAUvX,CAAK,EAClDy/B,GAAW,KAAK,IAAI,CACtB,CAEA,SAAS8B,IAAkB,CACzB,KAAM,CACJ,SAAAjiB,EACA,YAAAogB,EACA,WAAAxB,EACA,WAAAC,EACA,kBAAAX,EACA,oBAAAC,EACA,OAAA6B,EACA,YAAAzB,EACA,QAAAD,EACA,gBAAA4D,EACA,WAAAf,CACJ,EAAM,KAEJf,EACG,GAAG,YAAc1rB,GAAQ,CACxB+pB,GAAmB,KAAK,KAAM/pB,CAAG,CACnC,CAAC,EACA,GAAG,YAAcA,GAAQ,CACxBsrB,EAAO,MAAK,EACZzB,EAAY,KAAI,EAGZ7pB,EAAI,UAAY,GACd,KAAK,KAAK,iBAAiBA,EAAI,QAASA,EAAI,OAAO,GAGrDwsB,GAAmB,KAAK,KAAMxsB,CAAG,EACjC6pB,EAAY,YAAY7pB,EAAI,QAASA,EAAI,OAAO,EAElDA,EAAI,gBAAe,GACVA,EAAI,SAAW,EACxB8sB,GAAU,KAAK,IAAI,EAEnBN,GAAmB,KAAK,KAAMxsB,CAAG,CAErC,CAAC,EACA,GAAG,kBAAoBA,GAAQ,CAC9BsqB,GAAqB,KAAK,KAAMtqB,CAAG,CACrC,CAAC,EACA,GAAG,WAAaA,GAAQ,CACvB,KAAM,CAAE,QAAAgqB,EAAS,QAAAC,CAAO,EAAKjqB,EACzBiqB,GAAW,GAAGE,EAAW,KAAI,EAC7BH,GAAW,GAAGE,EAAW,KAAI,CACnC,CAAC,EAEH5e,EAAS,YAAe5hB,GAAM,CAC5ByjC,GAAgB,KAAK,KAAMzjC,EAAG,OAAO,EACrCojC,GAAU,KAAK,IAAI,CACrB,EAGA1c,GAAUsb,EAAY,GAAI,CACxB,KAAM,CAACvb,EAAWxnB,IAAM,CACtBsiC,GAAe,KAAK,KAAM9a,EAAWxnB,CAAC,CACxC,CACJ,CAAG,EAGDihC,EAAQ,OAAS,CAACtlB,EAAMtY,IAAUqhC,GAAc,KAAK,KAAM/oB,EAAMtY,CAAK,EAGtEygC,EAAW,GAAK,CAACvqB,EAAIuB,EAAOrc,EAAGsC,IAAM4jC,GAAiB,KAAK,KAAMprB,EAAIuB,EAAOrc,EAAGsC,CAAC,EAGhFwgC,EAAW,WAAa,CAAChY,EAAOtU,IAAa,CAC3CqvB,GAAmB,KAAK,KAAM/a,EAAOtU,CAAQ,CAC/C,EACAusB,EAAW,WAAa,CAACjY,EAAOtU,IAAa,CAC3CsvB,GAAmB,KAAK,KAAMhb,EAAOtU,CAAQ,CAC/C,EAEAssB,EAAW,SAAYv5B,GAAU,CAC/B07B,GAAiB,KAAK,KAAM,MAAO17B,CAAK,CAC1C,EACAw5B,EAAW,SAAYx5B,GAAU,CAC/B07B,GAAiB,KAAK,KAAM,MAAO17B,CAAK,CAC1C,EAEA64B,EAAkB,OAAS,CAAC5rB,EAAUoC,IAAQ,CAC5C+sB,GAAsB,KAAK,KAAMnvB,EAAUoC,CAAG,CAChD,EACAypB,EAAoB,OAAS,CAAC7rB,EAAUoC,IAAQ,CAC9CgtB,GAAwB,KAAK,KAAMpvB,EAAUoC,CAAG,CAClD,EAEAsrB,EAAO,OAAS,CAACle,EAAOqgB,IAAU,CAChCN,GAAgB,KAAK,KAAMM,EAAOrgB,CAAK,CACzC,EAEAogB,EAAgB,OAAS,CAACvF,KAAWjmB,IAAS,CACxCimB,IAAW,OACb,KAAK,KAAK,cAAc,GAAGjmB,CAAI,EAE/B,KAAK,KAAK,iBAAgB,CAE9B,EAEA6nB,EAAY,UAAavlB,GAAS,CAE5BA,IAAS,aACXkpB,EAAgB,SAAS,KAAK,KAAK,sBAAqB,CAAE,EACjDlpB,IAAS,OAClBynB,GAAK,KAAK,IAAI,EACLznB,IAAS,MAClB0nB,GAAI,KAAK,IAAI,EACJ1nB,IAAS,QAClB2nB,GAAM,KAAK,KAAM,KAAK,EACb3nB,IAAS,cAClB2nB,GAAM,KAAK,KAAM,MAAM,EACd3nB,IAAS,eAClB2nB,GAAM,KAAK,KAAM,QAAQ,EAChB3nB,IAAS,OAClB8nB,GAAe,KAAK,IAAI,EAExBgB,GAAsB,KAAK,KAAM9oB,CAAI,CAEzC,EAEAiL,GAAK,OAAQ,SAAU,IAAM,CAC3B,KAAK,OAAM,CACb,CAAC,EAEDA,GAAK,OAAQ,QAAUvP,GAAQ,CAC7B,KAAK,SAAW0rB,EAAY,SAAS1rB,EAAI,MAAM,CACjD,CAAC,EAEDuP,GAAK,OAAQ,QAAUvP,GAAQ,CACxB,KAAK,WACVisB,GAAM,KAAK,KAAM,MAAOjsB,CAAG,EAC3BA,EAAI,eAAc,EACpB,CAAC,EAGDuP,GAAK,OAAQ,UAAYvP,GAAQ,CAC/B,GAAI,CAAC,KAAK,SAAU,OACpB,MAAM0U,EAAU1U,EAAI,SAAWA,EAAI,MAC7B,CACJ,IAAAL,EAAK,QAAA+tB,EAAS,SAAAC,EAAU,QAAAC,CAC9B,EAAQ5tB,EAEJ,GAAI0tB,GAAWE,EAKb,OAAQlZ,EAAO,CACb,IAAK,IAEH,KAAK,KAAI,EACT1U,EAAI,eAAc,EAClB,MACF,IAAK,IAEH,KAAK,KAAI,EACTA,EAAI,eAAc,EAClB,MACF,IAAK,IAEH+rB,GAAK,KAAK,IAAI,EACd/rB,EAAI,eAAc,EAClB,MACF,IAAK,IAEHgsB,GAAI,KAAK,IAAI,EACbhsB,EAAI,eAAc,EAClB,MACF,IAAK,IAEH4pB,EAAQ,QAAQ,WAAW,EAC3B5pB,EAAI,eAAc,EAClB,MACF,IAAK,IAIH,MACF,IAAK,IAEH8pB,GAAa,KAAK,KAAM6D,EAAU,WAAW,EAC7C3tB,EAAI,eAAc,EAClB,MACF,IAAK,IAEH8pB,GAAa,KAAK,KAAM6D,EAAU,WAAW,EAC7C3tB,EAAI,eAAc,EAClB,MACF,IAAK,IAEH8pB,GAAa,KAAK,KAAM6D,EAAU,UAAU,EAC5C3tB,EAAI,eAAc,EAClB,MACF,IAAK,IAEH8pB,GAAa,KAAK,KAAM6D,EAAU,UAAU,EAC5C3tB,EAAI,eAAc,EAClB,MACF,IAAK,IAEH2pB,GAAY,KAAK,KAAM,GAAO,GAAI,KAAK,KAAK,SAAS,GAAI,EAAK,EAC9D3pB,EAAI,eAAc,EAClB,MACF,IAAK,IAEH4pB,EAAQ,QAAQ,MAAM,EACtB,MACF,IAAK,IAEHA,EAAQ,QAAQ,QAAQ,EACxB,KAGV,KACW,CAEL,OAAQlV,EAAO,CACb,IAAK,IACCiZ,GAEFhE,GAAY,KAAK,KAAM,GAAO,KAAK,KAAK,SAAS,GAAI,GAAI,EAAK,EAEhE,MACF,IAAK,IACHE,EAAY,KAAI,EAChBiC,GAAe,KAAK,IAAI,EACxB,MACF,IAAK,IACHhC,GAAa,KAAK,KAAM6D,EAAU,MAAM,EACxC3tB,EAAI,eAAc,EAClB,MACF,IAAK,IACH8pB,GAAa,KAAK,KAAM6D,EAAU,IAAI,EACtC3tB,EAAI,eAAc,EAClB,MACF,IAAK,IACH8pB,GAAa,KAAK,KAAM6D,EAAU,OAAO,EACzC3tB,EAAI,eAAc,EAClB,MACF,IAAK,IACH8pB,GAAa,KAAK,KAAM6D,EAAU,MAAM,EACxC3tB,EAAI,eAAc,EAClB,MACF,IAAK,GACHsrB,EAAO,MAAK,EAGZxB,GAAa,KAAK,KAAM,GAAO6D,EAAW,OAAS,OAAO,EAC1D3tB,EAAI,eAAc,EAClB,MACF,IAAK,IACHsrB,EAAO,MAAK,EAGZxB,GAAa,KAAK,KAAM,GAAO6D,EAAW,KAAO,MAAM,EACvD3tB,EAAI,eAAc,EAClB,MACF,IAAK,GACHotB,GAAsB,KAAK,KAAM,kBAAkB,EACnDptB,EAAI,eAAc,EAClB,KAGV,CAEUL,IAAQ,UACVytB,GAAsB,KAAK,KAAM,kBAAkB,EACnDptB,EAAI,eAAc,GACR0U,GAAW,IAAMA,GAAW,IAClCA,GAAW,IAAMA,GAAW,IAC5BA,GAAW,IAAMA,GAAW,KAC7B1U,EAAI,MAAQ,KAEfmtB,GAAgB,KAAK,KAAMntB,EAAI,IAAK,OAAO,EAC3C8sB,GAAU,KAAK,IAAI,GACVpY,IAAY,KAErBoY,GAAU,KAAK,IAAI,CAEvB,CACF,CAAC,CACH,CAEe,MAAMe,EAAM,CACzB,YAAYC,EAAU9qB,EAAM,CAC1B,KAAK,SAAW2N,GAAkB,EAClC,KAAM,CAAE,KAAAjC,EAAM,YAAAC,EAAa,gBAAAof,CAAe,EAAK/qB,EAAK,SACpD,KAAK,GAAK3Z,EAAE,MAAO,GAAGooB,CAAS,QAAQ,EACvC,KAAK,QAAU,IAAI8U,GAAQvjB,EAAM0L,EAAK,MAAO,CAACC,CAAW,EACzD,KAAK,MAAQ,IAAI4W,GAAMviB,CAAI,EAC3B8qB,EAAS,SAAS,KAAK,QAAQ,GAAI,KAAK,GAAI,KAAK,MAAM,EAAE,EACzD,KAAK,KAAO9qB,EAEZ,KAAK,QAAU3Z,EAAE,SAAU,GAAGooB,CAAS,QAAQ,EAE/C,KAAK,WAAa,IAAIC,GAAQ,GAAO1O,EAAK,KAAK,MAAM,EACrD,KAAK,WAAa,IAAI0O,GAAQ,GAAM1O,EAAK,KAAK,QAAQ,EAEtD,KAAK,kBAAoB,IAAImP,GAAU,EAAI,EAC3C,KAAK,oBAAsB,IAAIA,GAAU,EAAK,EAE9C,KAAK,OAAS,IAAI6F,GAChBC,GACA,IAAM,KAAK,eAAc,EACzBjV,EAAK,KAAK,MAChB,EAEI,KAAK,gBAAkB,IAAIykB,GAE3B,KAAK,YAAc,IAAIuG,GAAY,IAAM,KAAK,QAAO,EAAI,CAACD,CAAe,EAEzE,KAAK,SAAW,IAAIrhB,GAAS1J,CAAI,EACjC,KAAK,aAAe3Z,EAAE,MAAO,GAAGooB,CAAS,oBAAoB,EAC1D,SACC,KAAK,OAAO,GACZ,KAAK,SAAS,EACtB,EACI,KAAK,YAAcpoB,EAAE,MAAO,GAAGooB,CAAS,YAAY,EACjD,MAAM,KAAK,YAAY,EAE1B,KAAK,WAAa,IAAImX,GAEtB,KAAK,GAAG,SACN,KAAK,QACL,KAAK,YAAY,GACjB,KAAK,WAAW,GAChB,KAAK,WAAW,GAChB,KAAK,kBAAkB,GACvB,KAAK,oBAAoB,GACzB,KAAK,YAAY,GACjB,KAAK,gBAAgB,GACrB,KAAK,WAAW,EACtB,EAEI,KAAK,MAAQ,IAAIlJ,GAAM,KAAK,QAAQ,GAAI1c,CAAI,EAC5CuqB,GAAgB,KAAK,IAAI,EACzB9B,GAAW,KAAK,IAAI,EAEpB9B,GAAY,KAAK,KAAM,GAAO,EAAG,CAAC,CACpC,CAEA,GAAG5pB,EAAWopB,EAAM,CAClB,YAAK,SAAS,GAAGppB,EAAWopB,CAAI,EACzB,IACT,CAEA,QAAQppB,KAAciC,EAAM,CAC1B,KAAM,CAAE,SAAAisB,CAAQ,EAAK,KACrBA,EAAS,KAAKluB,EAAWiC,CAAI,CAC/B,CAEA,UAAUgB,EAAM,CAEd,KAAK,OAAO,MAAK,EAEjB,KAAK,KAAOA,EACZkoB,GAAqB,KAAK,IAAI,EAC9BE,GAAuB,KAAK,IAAI,EAChC,KAAK,QAAQ,UAAUpoB,CAAI,EAC3B,KAAK,MAAM,UAAUA,CAAI,EACzB,KAAK,SAAS,UAAUA,CAAI,EAC5B,KAAK,MAAM,UAAUA,CAAI,CAC3B,CAEA,SAASA,EAAM,CACb,YAAK,KAAK,QAAQA,CAAI,EACtByoB,GAAW,KAAK,IAAI,EACb,IACT,CAGA,OAAOxpB,EAAIC,EAAI,CACb,KAAM,CAAE,KAAAc,CAAI,EAAK,KACjB,OAAAA,EAAK,UAAUf,EAAIC,CAAE,EACrBupB,GAAW,KAAK,IAAI,EACb,IACT,CAEA,MAAO,CACL,KAAK,KAAK,KAAI,EACdA,GAAW,KAAK,IAAI,CACtB,CAEA,MAAO,CACL,KAAK,KAAK,KAAI,EACdA,GAAW,KAAK,IAAI,CACtB,CAEA,QAAS,CACP,OAAAA,GAAW,KAAK,IAAI,EACb,IACT,CAEA,SAAU,CACR,KAAM,CAAE,KAAAzoB,CAAI,EAAK,KACjB,MAAO,CAAE,MAAOA,EAAK,UAAS,EAAI,OAAQA,EAAK,YAAY,CAC7D,CAEA,gBAAiB,CACf,KAAM,CAAE,KAAA6H,EAAM,KAAAwB,CAAI,EAAK,KAAK,KACtB,CAAE,MAAAlT,EAAO,OAAAC,GAAW,KAAK,QAAO,EACtC,MAAO,CACL,MAAOD,EAAQkT,EAAK,WACpB,OAAQjT,EAASyR,EAAK,OACtB,KAAMwB,EAAK,WACX,IAAKxB,EAAK,MAChB,CACE,CACF,CC18BA,MAAM8a,WAAqB3D,EAAS,CAClC,YAAYkM,EAAO,CACjB,MAAM51B,EAAO,IAAI0c,GAAK,UAAU,EAChC,MAAM1c,EAAM,OAAQ,GAAO,UAAU,EACrC,KAAK,aAAe41B,CACtB,CAEA,MAAMtZ,EAAO,CACX,MAAMvU,EAAOuU,EAAM,IAAI,CAACrpB,EAAI,IAAMlC,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAC3D,IAAI,QAAS,OAAO,EACpB,IAAI,cAAe,QAAQ,EAC3B,GAAG,QAAS,IAAM,CACjB,KAAK,aAAa,CAAC,EACnB,KAAK,KAAI,CACX,CAAC,EACA,MAAMlmB,CAAE,CAAC,EACZ,KAAK,mBAAmB,GAAG8U,CAAI,CACjC,CAEA,UAAW,CAAC,CACd,CAEA,MAAM8gB,GAAY,CAChB,CAAE,IAAK,SAAU,MAAO1X,EAAG,yBAAyB,CAAC,CACvD,EAEA,SAAS2X,GAAcppB,EAAM,CAC3B,OAAO3O,EAAE,MAAO,GAAGooB,CAAS,OAAO,EAChC,MAAMzZ,EAAK,MAAK,CAAE,EAClB,GAAG,QAAS,IAAM,CACjB,KAAK,UAAUA,EAAK,GAAG,EACvB,KAAK,KAAI,CACX,CAAC,CACL,CAEA,SAASqpB,IAAY,CACnB,OAAOF,GAAU,IAAI51B,GAAM61B,GAAc,KAAK,KAAM71B,CAAE,CAAC,CACzD,CAEA,MAAMyiC,EAAY,CAChB,aAAc,CACZ,KAAK,GAAK3kC,EAAE,MAAO,GAAGooB,CAAS,cAAc,EAC1C,IAAI,QAAS,OAAO,EACpB,SAAS,GAAG4P,GAAU,KAAK,IAAI,CAAC,EAChC,KAAI,EACP,KAAK,UAAY,IAAM,CAAC,CAC1B,CAEA,MAAO,CACL,KAAM,CAAE,GAAAjrB,CAAE,EAAK,KACfA,EAAG,KAAI,EACPuZ,GAAmBvZ,CAAE,CACvB,CAEA,UAAU+Y,EAAQ,CAChB,KAAM,CAAE,GAAA/Y,CAAE,EAAK,KACfA,EAAG,OAAO+Y,CAAM,EAChB/Y,EAAG,KAAI,EACPwZ,GAAiBxZ,CAAE,CACrB,CACF,CAEe,MAAM+3B,EAAU,CAC7B,YAAYC,EAAU,IAAM,CAAC,EAC3BC,EAAW,IAAM,CAAC,EAClBC,EAAa,IAAM,CAAC,EACpBC,EAAa,IAAM,CAAC,EAAG,CACvB,KAAK,SAAWF,EAChB,KAAK,WAAaE,EAClB,KAAK,UAAY,CAAA,EACjB,KAAK,SAAW,KAChB,KAAK,SAAW,KAChB,KAAK,MAAQ,CAAA,EACb,KAAK,OAAS,IAAI5I,GAAc99B,GAAM,CACpC,KAAK,WAAW,KAAK,MAAMA,CAAC,CAAC,CAC/B,CAAC,EACD,KAAK,YAAc,IAAImmC,GACvB,KAAK,YAAY,UAAYM,EAC7B,KAAK,GAAKjlC,EAAE,MAAO,GAAGooB,CAAS,YAAY,EAAE,SAC3C,KAAK,YAAY,GACjB,KAAK,OAASpoB,EAAE,KAAM,GAAGooB,CAAS,OAAO,EAAE,MACzCpoB,EAAE,KAAM,EAAE,EAAE,SACV,IAAI2rB,GAAK,KAAK,EAAE,GAAG,QAAS,IAAM,CAChCoZ,EAAO,CACT,CAAC,EACD/kC,EAAE,OAAQ,EAAE,EAAE,MAAM,KAAK,MAAM,CACzC,CACA,CACA,CACE,CAEA,QAAQsM,EAAMggB,EAAQ,CACpB,KAAK,UAAU,KAAKhgB,CAAI,EACxB,MAAMqC,EAAO3O,EAAE,KAAMssB,EAAS,SAAW,EAAE,EAAE,MAAMhgB,CAAI,EACvDqC,EAAK,GAAG,QAAS,IAAM,CACrB,KAAK,WAAWA,CAAI,CACtB,CAAC,EAAE,GAAG,cAAgBgI,GAAQ,CAC5B,KAAM,CAAE,WAAAE,EAAY,aAAAC,CAAY,EAAKH,EAAI,OACzC,KAAK,YAAY,UAAU,CAAE,KAAME,EAAY,OAAQC,EAAe,EAAG,EACzE,KAAK,SAAWnI,CAClB,CAAC,EAAE,GAAG,WAAY,IAAM,CACtB,MAAMtO,EAAIsO,EAAK,KAAI,EACb+c,EAAQ,IAAIgS,GAAU,OAAQ,EAAE,EACtChS,EAAM,IAAIrrB,CAAC,EACXqrB,EAAM,MAAM,GAAG,OAAQ,CAAC,CAAE,OAAAvF,CAAM,IAAO,CACrC,KAAM,CAAE,MAAAxjB,CAAK,EAAKwjB,EACZgf,EAAS,KAAK,UAAU,UAAUjjC,GAAMA,IAAO7B,CAAC,EACtD,KAAK,WAAW8kC,EAAQxiC,CAAK,CAO/B,CAAC,EACDgM,EAAK,KAAK,EAAE,EAAE,MAAM+c,EAAM,EAAE,EAC5BA,EAAM,MAAK,CACb,CAAC,EACGY,GACF,KAAK,UAAU3d,CAAI,EAErB,KAAK,MAAM,KAAKA,CAAI,EACpB,KAAK,OAAO,MAAMA,CAAI,EACtB,KAAK,OAAO,MAAM,KAAK,SAAS,CAClC,CAEA,WAAWrH,EAAO3E,EAAO,CACvB,KAAK,UAAU,OAAO2E,EAAO,EAAG3E,CAAK,EACrC,KAAK,OAAO,MAAM,KAAK,SAAS,EAChC,KAAK,MAAM2E,CAAK,EAAE,KAAK,EAAE,EAAE,MAAM3E,CAAK,EACtC,KAAK,WAAW2E,EAAO3E,CAAK,CAC9B,CAEA,OAAQ,CACN,KAAK,MAAM,QAAST,GAAO,CACzB,KAAK,OAAO,YAAYA,EAAG,EAAE,CAC/B,CAAC,EACD,KAAK,MAAQ,CAAA,EACb,KAAK,UAAY,CAAA,EACjB,KAAK,OAAO,MAAM,KAAK,SAAS,CAClC,CAEA,YAAa,CACX,KAAM,CAAE,SAAAkjC,EAAU,SAAAC,CAAQ,EAAK,KAC/B,GAAI,KAAK,MAAM,OAAS,EAAG,CACzB,MAAM/9B,EAAQ,KAAK,MAAM,UAAUpF,GAAMA,IAAOmjC,CAAQ,EAKxD,GAJA,KAAK,MAAM,OAAO/9B,EAAO,CAAC,EAC1B,KAAK,UAAU,OAAOA,EAAO,CAAC,EAC9B,KAAK,OAAO,YAAY+9B,EAAS,EAAE,EACnC,KAAK,OAAO,MAAM,KAAK,SAAS,EAC5BD,IAAaC,EAAU,CACzB,KAAM,CAACxmC,CAAC,EAAI,KAAK,MACjB,YAAK,SAAWA,EAChB,KAAK,SAAS,OAAM,EACb,CAACyI,EAAO,CAAC,CAClB,CACA,MAAO,CAACA,EAAO,EAAE,CACnB,CACA,MAAO,CAAC,EAAE,CACZ,CAEA,WAAWqH,EAAM,CACf,MAAMrH,EAAQ,KAAK,MAAM,UAAUpF,GAAMA,IAAOyM,CAAI,EACpD,KAAK,UAAUA,CAAI,EACnB,KAAK,SAAS,OAAM,EACpB,KAAK,SAASrH,CAAK,CACrB,CAEA,UAAUqH,EAAM,CACV,KAAK,WAAa,MACpB,KAAK,SAAS,OAAM,EAEtB,KAAK,SAAWA,CAClB,CACF,CC9KA,MAAM22B,EAAY,CAChB,YAAYC,EAAWr1B,EAAU,GAAI,CACnC,IAAIu0B,EAAWc,EACf,KAAK,QAAU,CAAE,cAAe,GAAM,GAAGr1B,CAAO,EAChD,KAAK,WAAa,EAClB,KAAK,MAAQ,CAAA,EACT,OAAOq1B,GAAc,WACvBd,EAAW,SAAS,cAAcc,CAAS,GAE7C,KAAK,UAAY,KAAK,QAAQ,cAAgB,IAAIT,GAAU,IAAM,CAChE,MAAMxlC,EAAI,KAAK,SAAQ,EACvB,KAAK,MAAM,UAAUA,CAAC,CACxB,EAAIgI,GAAU,CACZ,MAAMhI,EAAI,KAAK,MAAMgI,CAAK,EAC1B,KAAK,MAAM,UAAUhI,CAAC,CACxB,EAAG,IAAM,CACP,KAAK,YAAW,CAClB,EAAG,CAACgI,EAAO3E,IAAU,CACnB,KAAK,MAAM2E,CAAK,EAAE,KAAO3E,CAC3B,CAAC,EAAI,KACL,KAAK,KAAO,KAAK,SAAQ,EACzB,MAAM6iC,EAASxlC,EAAE,MAAO,GAAGooB,CAAS,EAAE,EACnC,GAAG,cAAezR,GAAOA,EAAI,eAAc,CAAE,EAEhD8tB,EAAS,YAAYe,EAAO,EAAE,EAC9B,KAAK,MAAQ,IAAIhB,GAAMgB,EAAQ,KAAK,IAAI,EACpC,KAAK,YAAc,MACrBA,EAAO,MAAM,KAAK,UAAU,EAAE,CAElC,CAEA,SAASl5B,EAAMggB,EAAS,GAAM,CAC5B,MAAM3uB,EAAI2O,GAAQ,QAAQ,KAAK,UAAU,GACnChN,EAAI,IAAI6jB,GAAUxlB,EAAG,KAAK,OAAO,EACvC,OAAA2B,EAAE,OAAS,IAAIqZ,IAAS,CACtB,KAAK,MAAM,QAAQ,SAAU,GAAGA,CAAI,CACtC,EACA,KAAK,MAAM,KAAKrZ,CAAC,EAEb,KAAK,YAAc,MACrB,KAAK,UAAU,QAAQ3B,EAAG2uB,CAAM,EAElC,KAAK,YAAc,EACZhtB,CACT,CAEA,aAAc,CACZ,GAAI,KAAK,YAAc,KAAM,OAE7B,KAAM,CAACmmC,EAAUN,CAAM,EAAI,KAAK,UAAU,WAAU,EAChDM,GAAY,IACd,KAAK,MAAM,OAAOA,EAAU,CAAC,EACzBN,GAAU,GAAG,KAAK,MAAM,UAAU,KAAK,MAAMA,CAAM,CAAC,EAE5D,CAEA,SAASxrB,EAAM,CACb,MAAM+rB,EAAK,MAAM,QAAQ/rB,CAAI,EAAIA,EAAO,CAACA,CAAI,EAK7C,GAJI,KAAK,YAAc,MACrB,KAAK,UAAU,MAAK,EAEtB,KAAK,MAAQ,CAAA,EACT+rB,EAAG,OAAS,EACd,QAASlnC,EAAI,EAAGA,EAAIknC,EAAG,OAAQlnC,GAAK,EAAG,CACrC,MAAM0D,EAAKwjC,EAAGlnC,CAAC,EACTmnC,EAAK,KAAK,SAASzjC,EAAG,KAAM1D,IAAM,CAAC,EACzCmnC,EAAG,QAAQzjC,CAAE,EACT1D,IAAM,GACR,KAAK,MAAM,UAAUmnC,CAAE,CAE3B,CAEF,OAAO,IACT,CAEA,SAAU,CACR,OAAO,KAAK,MAAM,IAAIzjC,GAAMA,EAAG,SAAS,CAC1C,CAEA,SAAS0W,EAAIC,EAAIuF,EAAMwnB,EAAa,EAAG,CACrC,YAAK,MAAMA,CAAU,EAAE,YAAYhtB,EAAIC,EAAIuF,EAAM,UAAU,EACpD,IACT,CAEA,KAAKxF,EAAIC,EAAI+sB,EAAa,EAAG,CAC3B,OAAO,KAAK,MAAMA,CAAU,EAAE,QAAQhtB,EAAIC,CAAE,CAC9C,CAEA,UAAUD,EAAIC,EAAI+sB,EAAa,EAAG,CAChC,OAAO,KAAK,MAAMA,CAAU,EAAE,aAAahtB,EAAIC,CAAE,CACnD,CAEA,UAAW,CACT,YAAK,MAAM,MAAM,OAAM,EAChB,IACT,CAEA,GAAGnC,EAAWopB,EAAM,CAClB,YAAK,MAAM,GAAGppB,EAAWopB,CAAI,EACtB,IACT,CAEA,UAAW,CACT,KAAM,CAAE,YAAA1a,GAAgB,KAAK,KAC7B,OAAOA,EAAY,OAAO,MAAQ,CACpC,CAEA,OAAOtM,EAAI,CACT,YAAK,MAAM,GAAG,SAAUA,CAAE,EACnB,IACT,CAEA,OAAO,OAAOoH,EAAMC,EAAS,CAC3B3d,GAAO0d,EAAMC,CAAO,CACtB,CACF,CAEA,MAAM0lB,GAAc,CAAC94B,EAAImD,EAAU,CAAA,IAAO,IAAIo1B,GAAYv4B,EAAImD,CAAO,EAEjE,SACF,OAAO,cAAgB21B,GACvB,OAAO,cAAc,OAAS,CAAC3lB,EAAMC,IAAY3d,GAAO0d,EAAMC,CAAO,GCvHhE,MAAMxa,GAA4C,CAAC,CAAE,IAAA8K,KAAU,CACpE,MAAM7S,EAAIqF,EAAA,EACJ,CAACoS,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChDiJ,EAAe9H,EAAAA,OAAuB,IAAI,EAC1C87B,EAAiB97B,EAAAA,OAA2B,IAAI,EAChD+7B,EAAe/7B,EAAAA,OAAyC,IAAI,EAC5Dg8B,EAAoBh8B,EAAAA,OAA8B,IAAI,EACtDi8B,EAAmBj8B,EAAAA,OAAsB,IAAI,EAC7Ck8B,EAAoBl8B,EAAAA,OAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,EAElDm8B,EAAsBt6B,EAAAA,YAAY,IAAM,CAC5C,GAAI,CAACiG,EAAa,QAAS,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAA,EACxD,MAAMs0B,EAAWt0B,EAAa,QAAQ,YAChCu0B,EAAYv0B,EAAa,QAAQ,aACjChC,EAAQs2B,EAAW,IAAMA,EAAW,IACpCr2B,EAASs2B,EAAY,IAAMA,EAAY,IAC7C,MAAO,CAAE,MAAAv2B,EAAO,OAAAC,CAAA,CAClB,EAAG,CAAA,CAAE,EAECu2B,EAAmBz6B,EAAAA,YAAY,IAAM,CACzC,GAAI,CAACiG,EAAa,SAAW,CAACi0B,EAAa,QAAS,OAGpDj0B,EAAa,QAAQ,UAAY,GACjCg0B,EAAe,QAAU,KAEzB,KAAM,CAAE,MAAAh2B,EAAO,OAAAC,CAAA,EAAWo2B,EAAA,EACpBI,EAAWz2B,EAAQ,IAEnBpR,EAAI,IAAI4mC,GAAYxzB,EAAa,QAAS,CAC9C,KAAM,OACN,YAAa,GACb,gBAAiB,GACjB,SAAU,GACV,IAAK,CACH,IAAK,IACL,OAAQ,EAAA,EAEV,IAAK,CACH,IAAK,GACL,MAAOy0B,EAAW,GAAK,IACvB,WAAYA,EAAW,GAAK,GAC5B,SAAUA,EAAW,GAAK,EAAA,EAE5B,KAAM,CACJ,OAAQ,IAAMx2B,EACd,MAAO,IAAMD,CAAA,CACf,CACD,EAEDpR,EAAE,SAASqnC,EAAa,OAA6C,EACrED,EAAe,QAAUpnC,CAC3B,EAAG,CAACynC,CAAmB,CAAC,EAGxBr9B,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACgJ,EAAa,QAAS,OAE3B,IAAI00B,EAAkB,GAEtB,MAAMC,EAAmB,IAAM,CAC7B,GAAID,EAAiB,CACnBA,EAAkB,GAClBN,EAAkB,QAAUC,EAAA,EAC5B,MACF,CAEA,MAAMO,EAAgBP,EAAA,EAChBQ,EAAiBT,EAAkB,QACnCU,EAAY,KAAK,IAAID,EAAe,MAAQD,EAAc,KAAK,EAC/DG,EAAa,KAAK,IAAIF,EAAe,OAASD,EAAc,MAAM,EAEpEE,EAAY,IAAMC,EAAa,KAEnCX,EAAkB,QAAUQ,EAExBT,EAAiB,SACnB,aAAaA,EAAiB,OAAO,EAGvCA,EAAiB,QAAU,OAAO,WAAW,IAAM,CAC7CF,EAAa,SACfO,EAAA,CAEJ,EAAG,GAAG,EACR,EAEA,OAAAN,EAAkB,QAAU,IAAI,eAAe,IAAM,CACnDS,EAAA,CACF,CAAC,EAEDT,EAAkB,QAAQ,QAAQl0B,EAAa,OAAO,EAE/C,IAAM,CACPk0B,EAAkB,SACpBA,EAAkB,QAAQ,WAAA,EAExBC,EAAiB,SACnB,aAAaA,EAAiB,OAAO,CAEzC,CACF,EAAG,CAACE,EAAqBG,CAAgB,CAAC,EAE1Cx9B,EAAAA,UAAU,IAAM,CACd,IAAIg+B,EAAY,GAEhB,MAAMC,EAAY,SAAY,CAC5B,GAAKj1B,EAAa,QAElB,CAAAwD,EAAW,EAAI,EACfpE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMwE,EAAW,MAAM,MAAMjF,EAAK,CAChC,KAAM,OACN,YAAa,OACb,SAAU,QAAA,CACX,EAED,GAAI,CAACiF,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAI,MAAM9X,EAAE,gBAAgB,CAAC,EAC1B8X,EAAS,SAAW,IACvB,IAAI,MAAM,UAAU,EAEpB,IAAI,MAAM,WAAWA,EAAS,MAAM,GAAG,EAIjD,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAEnC,GAAIC,EAAY,aAAe,EAC7B,MAAM,IAAI,MAAM,MAAM,EAIxB,MAAMqxB,EAAW,IAAIC,GAAQ,SAC7B,MAAMD,EAAS,KAAK,KAAKrxB,CAAW,EAGpC,MAAMuxB,EAAYC,GAAiCH,CAAQ,EAE3D,GAAI,CAACF,EAAW,OAEhBf,EAAa,QAAUmB,EAGvBZ,EAAA,EAEAhxB,EAAW,EAAK,CAClB,OAASQ,EAAK,CACZ,GAAIgxB,EAAW,CACb,QAAQ,MAAM,cAAehxB,CAAG,EAChC,IAAIsxB,EAAWxpC,EAAE,mBAAmB,EAChCkY,aAAe,QACjBsxB,EAAWtxB,EAAI,SAEjB5E,EAASk2B,CAAQ,EACjB9xB,EAAW,EAAK,CAClB,CACF,EACF,EAEM+xB,EAAQ,WAAW,IAAM,CAC7B,sBAAsB,IAAM,CAC1BN,EAAA,CACF,CAAC,CACH,EAAG,GAAG,EAEN,MAAO,IAAM,CACXD,EAAY,GACZ,aAAaO,CAAK,EAClBtB,EAAa,QAAU,KACnBj0B,EAAa,UACfA,EAAa,QAAQ,UAAY,IAEnCg0B,EAAe,QAAU,IAC3B,CACF,EAAG,CAACr1B,EAAK61B,CAAgB,CAAC,EAGxB3+B,EAAAA,KAAC,MAAA,CAAI,UAAU,4EAEZ,SAAA,CAAA0N,SACE,MAAA,CAAI,UAAU,6HACb,SAAA1N,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,gKAAA,CAAiK,QAC/K,IAAA,CAAE,UAAU,mEAAoE,SAAAlF,EAAE,cAAc,CAAA,CAAE,CAAA,CAAA,CACrG,CAAA,CACF,EAIDqT,GAAS,CAACoE,GACTvS,EAAAA,IAAC,MAAA,CAAI,UAAU,6HACb,SAAA6E,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAA7E,EAAAA,IAAC,OAAI,UAAU,yPACb,eAACwkC,EAAAA,gBAAA,CAAgB,UAAU,gEAAgE,CAAA,CAC7F,QACC,IAAA,CAAE,UAAU,sFAAuF,SAAA1pC,EAAE,kBAAkB,EAAE,EAC1HkF,EAAAA,IAAC,IAAA,CAAE,UAAU,uEACV,SAAAmO,EACH,EACAtJ,EAAAA,KAAC,IAAA,CACC,KAAM8I,EACN,SAAQ,GACR,UAAU,uRAEV,SAAA,CAAA3N,EAAAA,IAAC,OAAI,UAAU,wCAAwC,KAAK,OAAO,OAAO,eAAe,QAAQ,YAC/F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,iEAAiE,CAAA,CACxI,EACClF,EAAE,iBAAiB,CAAA,CAAA,CAAA,EAEtBkF,EAAAA,IAAC,IAAA,CAAE,UAAU,qDAAqD,SAAA,kCAAA,CAElE,CAAA,CAAA,CACF,CAAA,CACF,EAID,CAACmO,GACAnO,EAAAA,IAAC,MAAA,CACC,IAAKgP,EACL,UAAU,mDACV,MAAO,CAAE,QAASuD,EAAU,EAAI,CAAA,CAAE,CAAA,CACpC,EAEJ,CAEJ,gHCxOaxP,GAA4C,CAAC,CAAE,IAAA4K,EAAK,MAAA82B,EAAQ,MAAW,CAClF,MAAM,EAAItkC,EAAA,EACJ,CAACoS,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAAC2+B,EAAYC,CAAa,EAAI5+B,EAAAA,SAAS,CAAC,EACxCiJ,EAAe9H,EAAAA,OAAuB,IAAI,EAC1C09B,EAAe19B,EAAAA,OAAuC,IAAI,EAC1Dg8B,EAAoBh8B,EAAAA,OAA8B,IAAI,EACtD29B,EAAiB39B,EAAAA,OAA2B,IAAI,EAChDi8B,EAAmBj8B,EAAAA,OAAsB,IAAI,EAC7Ck8B,EAAoBl8B,EAAAA,OAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,EAGlDm8B,EAAsBt6B,EAAAA,YAAY,IAAM,OAC5C,GAAI,CAACiG,EAAa,QAAS,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAA,EACxD,MAAMs0B,EAAWt0B,EAAa,QAAQ,YAChC81B,IAAcvjC,EAAAyN,EAAa,QAAQ,gBAArB,YAAAzN,EAAoC,cAAe,EAEjEoI,EAAiB25B,EAAW,IAAMA,EAAYwB,EAAc,IAAMA,EAAc,IAEhF73B,EAAS,KAAK,MAAMtD,EAAiB,EAAI,EAAE,EACjD,MAAO,CAAE,MAAOA,EAAgB,OAAAsD,CAAA,CAClC,EAAG,CAAA,CAAE,EAGC83B,EAAwBh8B,EAAAA,YAAY,SAAY,CACpD,GAAI,GAACiG,EAAa,SAAW,CAAC61B,EAAe,SAAWH,IAAe,GAEvE,GAAI,CAEF,GAAIE,EAAa,QACf,GAAI,CACFA,EAAa,QAAQ,QAAA,CACvB,MAAQ,CAER,CAIF51B,EAAa,QAAQ,UAAY,GAGjC,MAAMg2B,EAAoB3B,EAAA,EAGpB4B,EAAYC,GAAAA,KAAKl2B,EAAa,QAAS,CAC3C,MAAOg2B,EAAkB,MACzB,OAAQP,EAAQO,EAAkB,OAASN,EAAaM,EAAkB,OAC1E,KAAMP,EAAQ,OAAS,OAAA,CACxB,EACDG,EAAa,QAAUK,EAGvB,MAAMA,EAAU,QAAQJ,EAAe,OAAO,CAChD,MAAQ,CAER,CACF,EAAG,CAACxB,EAAqBoB,EAAOC,CAAU,CAAC,EAG3C1+B,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACgJ,EAAa,QAAS,OAE3B,IAAI00B,EAAkB,GAEtB,MAAMC,EAAmB,IAAM,CAE7B,GAAID,EAAiB,CACnBA,EAAkB,GAClBN,EAAkB,QAAUC,EAAA,EAC5B,MACF,CAEA,MAAMO,EAAgBP,EAAA,EAGhBQ,EAAiBT,EAAkB,QACnCU,EAAY,KAAK,IAAID,EAAe,MAAQD,EAAc,KAAK,EAC/DG,EAAa,KAAK,IAAIF,EAAe,OAASD,EAAc,MAAM,EAEpEE,EAAY,IAAMC,EAAa,KAKnCX,EAAkB,QAAUQ,EAGxBT,EAAiB,SACnB,aAAaA,EAAiB,OAAO,EAIvCA,EAAiB,QAAU,OAAO,WAAW,IAAM,CAC7CyB,EAAa,SAAWC,EAAe,SACzCE,EAAA,CAEJ,EAAG,GAAG,EACR,EAGA,OAAA7B,EAAkB,QAAU,IAAI,eAAe,IAAM,CACnDS,EAAA,CACF,CAAC,EAGDT,EAAkB,QAAQ,QAAQl0B,EAAa,OAAO,EAE/C,IAAM,CACPk0B,EAAkB,SACpBA,EAAkB,QAAQ,WAAA,EAExBC,EAAiB,SACnB,aAAaA,EAAiB,OAAO,CAEzC,CACF,EAAG,CAACE,EAAqB0B,CAAqB,CAAC,EAE/C/+B,EAAAA,UAAU,IAAM,CACd,IAAIg+B,EAAY,GACZmB,EAAkD,KAEtD,MAAMC,EAAW,SAAY,CAC3B,GAAKp2B,EAAa,QAElB,CAAAwD,EAAW,EAAI,EACfpE,EAAS,IAAI,EAGb+2B,EAAY,WAAW,IAAM,CACvBnB,IACF51B,EAAS,EAAE,cAAc,CAAC,EAC1BoE,EAAW,EAAK,EAEpB,EAAG,GAAK,EAER,GAAI,CAEF,MAAMI,EAAW,MAAM,MAAMjF,EAAK,CAChC,KAAM,OACN,YAAa,OACb,SAAU,QAAA,CACX,EAED,GAAI,CAACiF,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAI,MAAM,EAAE,gBAAgB,CAAC,EAC1BA,EAAS,SAAW,IACvB,IAAI,MAAM,UAAU,EACjBA,EAAS,QAAU,IACtB,IAAI,MAAM,aAAa,EAEvB,IAAI,MAAM,WAAWA,EAAS,MAAM,GAAG,EAIjD,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAGnC,GAAIC,EAAY,aAAe,EAC7B,MAAM,IAAI,MAAM,MAAM,EAKxB,GAFAgyB,EAAe,QAAUhyB,EAErB,CAACmxB,EAAW,OAGhB,MAAMqB,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,MAAM,QAAU,+DAChC,SAAS,KAAK,YAAYA,CAAe,EAEzC,GAAI,CAEF,MAAMC,EAAgBJ,GAAAA,KAAKG,EAAiB,CAC1C,MAAO,IACP,OAAQ,IACR,KAAM,OAAA,CACP,EAED,GAAI,CACF,MAAMC,EAAc,QAAQzyB,CAAW,CACzC,MAAQ,CACN,MAAM,IAAI,MAAM,EAAE,qBAAqB,CAAC,CAC1C,CAEA,MAAM0yB,EAAQD,EAAc,WAE5B,GAAI,CAACC,GAASA,IAAU,EACtB,MAAM,IAAI,MAAM,EAAE,eAAe,CAAC,EAMpC,GAFAD,EAAc,QAAA,EAEV,CAACtB,EAAW,OAGhBW,EAAcY,CAAK,EAGfv2B,EAAa,UACfA,EAAa,QAAQ,UAAY,IAGnC,MAAMg2B,EAAoB3B,EAAA,EAGpB4B,EAAYC,GAAAA,KAAKl2B,EAAa,QAAS,CAC3C,MAAOg2B,EAAkB,MACzB,OAAQP,EAAQO,EAAkB,OAASO,EAAQP,EAAkB,OACrE,KAAMP,EAAQ,OAAS,OAAA,CACxB,EACDG,EAAa,QAAUK,EAGvB,MAAMA,EAAU,QAAQpyB,CAAW,EAG/BsyB,IACF,aAAaA,CAAS,EACtBA,EAAY,MAGVnB,GACFxxB,EAAW,EAAK,CAEpB,QAAA,CAEM,SAAS,KAAK,SAAS6yB,CAAe,GACxC,SAAS,KAAK,YAAYA,CAAe,CAE7C,CACF,OAASryB,EAAK,CAOZ,GALImyB,IACF,aAAaA,CAAS,EACtBA,EAAY,MAGVnB,EAAW,CACb,IAAIM,EAAW,EAAE,mBAAmB,EAChCtxB,aAAe,MACjBsxB,EAAWtxB,EAAI,QACN,OAAOA,GAAQ,WACxBsxB,EAAWtxB,GAEb5E,EAASk2B,CAAQ,EACjB9xB,EAAW,EAAK,CAClB,CACF,EACF,EAGM+xB,EAAQ,WAAW,IAAM,CAC7B,sBAAsB,IAAM,CAC1B,sBAAsB,IAAM,CAC1Ba,EAAA,CACF,CAAC,CACH,CAAC,CACH,EAAG,GAAG,EAGN,MAAO,IAAM,CAQX,GAPApB,EAAY,GACZ,aAAaO,CAAK,EACdY,GACF,aAAaA,CAAS,EAExBN,EAAe,QAAU,KACzBF,EAAc,CAAC,EACXC,EAAa,QACf,GAAI,CACFA,EAAa,QAAQ,QAAA,CACvB,MAAQ,CAER,CAEFA,EAAa,QAAU,IACzB,CACF,EAAG,CAACj3B,EAAK01B,EAAqBoB,CAAK,CAAC,EAGlC5/B,EAAAA,KAAC,MAAA,CAAI,UAAU,4EAEZ,SAAA,CAAA0N,SACE,MAAA,CAAI,UAAU,6HACb,SAAA1N,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,gKAAA,CAAiK,QAC/K,IAAA,CAAE,UAAU,mEAAoE,SAAA,EAAE,cAAc,CAAA,CAAE,CAAA,CAAA,CACrG,CAAA,CACF,EAIDmO,GAAS,CAACoE,GACTvS,EAAAA,IAAC,MAAA,CAAI,UAAU,6HACb,SAAA6E,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAA7E,EAAAA,IAAC,OAAI,UAAU,sPACb,eAACwlC,EAAAA,aAAA,CAAa,UAAU,gEAAgE,CAAA,CAC1F,QACC,IAAA,CAAE,UAAU,sFAAuF,SAAA,EAAE,kBAAkB,EAAE,EAC1HxlC,EAAAA,IAAC,IAAA,CAAE,UAAU,uEACV,SAAAmO,EACH,EACAtJ,EAAAA,KAAC,IAAA,CACC,KAAM8I,EACN,SAAQ,GACR,UAAU,uRAEV,SAAA,CAAA3N,EAAAA,IAAC,OAAI,UAAU,wCAAwC,KAAK,OAAO,OAAO,eAAe,QAAQ,YAC/F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,iEAAiE,CAAA,CACxI,EACC,EAAE,iBAAiB,CAAA,CAAA,CAAA,EAEtBA,EAAAA,IAAC,IAAA,CAAE,UAAU,qDAAqD,SAAA,uCAAA,CAElE,CAAA,CAAA,CACF,CAAA,CACF,EAID,CAACmO,GACAnO,EAAAA,IAAC,MAAA,CACC,IAAKgP,EACL,UAAU,0DACV,MAAO,CAAE,QAASuD,EAAU,EAAI,CAAA,CAAE,CAAA,CACpC,EAEJ,CAEJ,gHC7UA,SAASkzB,GAAiBC,EAAsCvtB,EAAmC,CACjG,OAAKutB,EACEA,EACJ,OAAQtqC,GAAMA,EAAE,YAAc+c,CAAI,EAClC,IAAK/c,GAAM,CACV,MAAMoO,EAAOpO,EAAE,MAAQ,GACjBuqC,EAAQvqC,EAAE,aAAeA,EAAE,OAAS,GAC1C,OAAIoO,GAAQm8B,GAASn8B,IAASm8B,EACrB,GAAGn8B,CAAI,KAAKm8B,CAAK,IAEnBn8B,GAAQm8B,CACjB,CAAC,EACA,OAAO,OAAO,EACd,KAAK,IAAI,EAZY,EAa1B,CAEA,SAASC,GAAWC,EAAqC,CACvD,GAAI,CAACA,EAAS,MAAO,GACrB,GAAI,CACF,MAAM9c,EAAO,IAAI,KAAK8c,CAAO,EAC7B,OAAI,MAAM9c,EAAK,QAAA,CAAS,EAAU8c,EAC3B9c,EAAK,eAAA,CACd,MAAQ,CACN,OAAO8c,CACT,CACF,CAEA,SAASC,GAAeC,EAAoBC,EAA+B,CAEzE,GAAID,EAAO,SACT,OAAOA,EAAO,SAGhB,GAAIA,EAAO,KACT,GAAI,CAEF,OADgB,IAAI,YAAY,OAAO,EACxB,OAAOA,EAAO,IAAI,CACnC,MAAQ,CAER,CAGF,OAAIA,EAAO,KACF,kGAAkGA,EAAO,KAAK,QAAQ,KAAM,OAAO,EAAE,QAAQ,QAAS,MAAM,EAAE,QAAQ,KAAM,MAAM,CACvL,SAEG,2BAA2BC,CAAa,MACjD,CAEA,SAASC,GAAmBC,EAA0C,CACpE,OAAKA,EACoC,CACvC,WAAY,QACZ,iBAAkB,kBAClB,iCAAkC,eAClC,kBAAmB,cACnB,+BAAgC,kBAChC,gCAAiC,uBACjC,cAAe,UACf,WAAY,OACZ,iBAAkB,aAAA,EAEJA,CAAY,GAAKA,EAZP,EAa5B,CAEA,MAAMC,GAAkC,CACtC,WAAY,EACZ,MAAO,UACP,WAAY,IACZ,YAAa,MACb,WAAY,QACd,EAEMC,GAAgC,CACpC,QAAS,OACT,WAAY,aACZ,IAAK,MACL,QAAS,OACX,EAEMC,GAAqC,CACzC,WAAY,EACZ,QAAS,OACT,WAAY,SACZ,OAAQ,OACV,EAEMC,GAAiC,CACrC,WAAY,EACZ,MAAO,SACT,EAEMC,GAAkC,CACtC,MAAO,UACP,UAAW,aACX,KAAM,CACR,EAEatjC,GAA0C,CAAC,CAAE,IAAA0K,KAAU,CAClE,MAAM7S,EAAIqF,EAAA,EACJ,CAACoS,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAACggC,EAAQS,CAAS,EAAIzgC,EAAAA,SAA4B,IAAI,EA6B5D,GA3BAC,EAAAA,UAAU,IAAM,EACE,SAAY,CAC1BwM,EAAW,EAAI,EACfpE,EAAS,IAAI,EACbo4B,EAAU,IAAI,EAEd,GAAI,CACF,MAAM5zB,EAAW,MAAM,MAAMjF,CAAG,EAChC,GAAI,CAACiF,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQ,EAG1B,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAE7B6zB,EADY,IAAIC,GAAU7zB,CAAW,EAChB,YAAA,EAC3B2zB,EAAUC,CAAQ,CACpB,OAASzzB,EAAK,CACZ,QAAQ,MAAM,YAAaA,CAAG,EAC9B5E,EAAStT,EAAE,kBAAkB,CAAC,CAChC,QAAA,CACE0X,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC7E,CAAG,CAAC,EAEJ4E,EACF,OACEvS,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIJ,GAAImO,GAAS,CAAC43B,EACZ,aACG,MAAA,CAAI,UAAU,qEACb,SAAA/lC,EAAAA,IAAC,OAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,GAASrT,EAAE,wBAAwB,EAAE,EACnE,CAAA,CACF,EAIJ,MAAM6rC,EAAQlB,GAAiBM,EAAO,WAAY,IAAI,EAChDa,EAAQnB,GAAiBM,EAAO,WAAY,IAAI,EAChDc,EAASpB,GAAiBM,EAAO,WAAY,KAAK,EAClDe,EAAaf,EAAO,YAAc,GAClCgB,EAAchB,EAAO,mBAAqBA,EAAO,aAAe,GAChEiB,EAASF,GAAcC,GAAeD,IAAeC,EACvD,GAAGD,CAAU,KAAKC,CAAW,IAC7BD,GAAcC,EACZE,EAAWrB,GAAWG,EAAO,gBAAgB,EAC7CmB,EAAetB,GAAWG,EAAO,mBAAmB,EACpDoB,EAAcvB,GAAWG,EAAO,YAAY,EAC5CqB,EAAexB,GAAWG,EAAO,oBAAoB,EACrDsB,EAAUtB,EAAO,SAAW,QAC5BuB,GAAevB,EAAO,aAAe,CAAA,GAAI,OAAQtqC,GAAM,CAACA,EAAE,gBAAgB,EAC1E8rC,EAAWzB,GAAeC,EAAQjrC,EAAE,gBAAgB,CAAC,EACrDorC,EAAeD,GAAmBF,EAAO,YAAY,EACrDyB,EAAYzB,EAAO,WAAa,GAChC0B,EAAY1B,EACZ2B,EAAa,OAAOD,EAAU,YAAe,SAAWA,EAAU,WAAa,OAC/EE,EAAkBD,IAAe,EAAI,OAASA,IAAe,EAAI,MAAQ,GACzEE,EAAc,OAAOH,EAAU,aAAgB,SAAWA,EAAU,YAAc,OAOlFI,EAAmBD,IAAgB,QAAaA,IAAgB,GANpB,CAChD,EAAG,SACH,EAAG,WACH,EAAG,UACH,EAAG,cAAA,EAEuFA,CAAW,GAAK,GAE5G,OACE5nC,EAAAA,IAAC,MAAA,CACC,UAAU,0CACV,MAAO,CAAE,WAAY,OAAA,EAErB,SAAA6E,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,MAAO,OACP,WAAY,QACZ,UAAW,MAAA,EAIb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,aAAc,oBAAqB,QAAS,gDAAiD,WAAY,SAAA,EAErH,SAAA,CAAA7E,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,OAAQ,aAAc,SAAU,2BAA4B,WAAY,IAAK,MAAO,UAAW,WAAY,KACrH,SAAAqnC,EACH,EAGAxiC,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,SAAU,2BAA4B,MAAO,SAAA,EAClG,SAAA,CAAAmiC,GACCniC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAAC8nC,QAAK,KAAM,GAAI,MAAOxB,EAAA,CAAW,CAAA,CAAE,EAChEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,OAAI,EAC7BnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAS,CAAA,CAAO,CAAA,CAAA,CACnC,CAAA,EACF,EAGDL,GACC9hC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAAC+nC,SAAM,KAAM,GAAI,MAAOzB,EAAA,CAAW,CAAA,CAAE,EACjEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,KAAE,EAC3BnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAI,CAAA,CAAM,CAAA,CAAA,CAClC,CAAA,EACF,EAGDC,GACC/hC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAAC+nC,SAAM,KAAM,GAAI,MAAOzB,EAAA,CAAW,CAAA,CAAE,EACjEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,KAAE,EAC3BnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAK,CAAA,CAAM,CAAA,CAAA,CAClC,CAAA,EACF,EAGDC,GACChiC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAAC+nC,SAAM,KAAM,GAAI,MAAOzB,EAAA,CAAW,CAAA,CAAE,EACjEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,MAAG,EAC5BnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAM,CAAA,CAAO,CAAA,CAAA,CACnC,CAAA,EACF,EAGDI,GACCpiC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACypB,YAAS,KAAM,GAAI,MAAO6c,EAAA,CAAW,CAAA,CAAE,EACpEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,OAAI,EAC7BnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAU,CAAA,CAAS,CAAA,CAAA,CACrC,CAAA,EACF,EAGDC,GAAgBA,IAAiBD,GAChCpiC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACgoC,SAAM,KAAM,GAAI,MAAO1B,EAAA,CAAW,CAAA,CAAE,EACjEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,WAAQ,EACjCnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAW,CAAA,CAAa,CAAA,CAAA,CACzC,CAAA,EACF,EAGD,CAACD,GAAY,CAACC,GAAgBC,GAC7BtiC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACypB,YAAS,KAAM,GAAI,MAAO6c,EAAA,CAAW,CAAA,CAAE,EACpEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,OAAI,EAC7BnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAY,CAAA,CAAY,CAAA,CAAA,CACxC,CAAA,EACF,EAGDQ,GACC9iC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACioC,OAAI,KAAM,GAAI,MAAO3B,EAAA,CAAW,CAAA,CAAE,EAC/DzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,aAAU,EACnCnmC,MAAC,QAAK,MAAO,CACX,GAAGumC,GACH,MAAOmB,IAAe,EAAI,UAAY,UACtC,WAAY,GAAA,EAEX,SAAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,EAGDE,GACChjC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACioC,OAAI,KAAM,GAAI,MAAO3B,EAAA,CAAW,CAAA,CAAE,EAC/DzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,cAAW,EACpCnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAsB,CAAA,CAAiB,CAAA,CAAA,CAC7C,CAAA,EACF,EAGD3B,GAAgBA,IAAiB,SAChCrhC,EAAAA,KAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACkoC,QAAK,KAAM,GAAI,MAAO5B,EAAA,CAAW,CAAA,CAAE,EAChEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,OAAI,EAC7BnmC,EAAAA,IAAC,OAAA,CAAK,MAAOumC,GAAa,SAAAL,CAAA,CAAa,CAAA,CAAA,CACzC,CAAA,EACF,EAGDoB,EAAY,OAAS,GACpBziC,EAAAA,KAAC,OAAI,MAAO,CAAE,GAAGuhC,GAAU,UAAW,oBAAqB,UAAW,MAAO,WAAY,QACvF,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACmoC,aAAU,KAAM,GAAI,MAAO7B,EAAA,CAAW,CAAA,CAAE,EACrEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,cAAW,QACnC,MAAA,CAAI,MAAO,CAAE,GAAGI,GAAY,QAAS,OAAQ,SAAU,OAAQ,IAAK,KAAA,EAClE,WAAY,IAAI,CAAC9qC,EAAGC,IAAM,CACzB,MAAM8N,EAAO/N,EAAE,UAAYA,EAAE,MAAQ,OAC/Bge,EAAOhe,EAAE,cACT2sC,EAAU3uB,EACZA,EAAO,QACL,IAAIA,EAAO,SAAS,QAAQ,CAAC,CAAC,MAC9BA,EAAO,KACL,IAAIA,EAAO,MAAM,QAAQ,CAAC,CAAC,MAC3B,GAAGA,CAAI,KACX,GACJ,OACE5U,EAAAA,KAAC,OAAA,CAEC,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,MACL,QAAS,UACT,WAAY,UACZ,aAAc,MACd,SAAU,OACV,MAAO,UACP,OAAQ,mBAAA,EAGT,SAAA,CAAA2E,EACA4+B,UACE,OAAA,CAAK,MAAO,CAAE,MAAO,UAAW,SAAU,MAAA,EAAU,SAAA,CAAA,IAAEA,EAAQ,GAAA,CAAA,CAAC,CAAA,CAAA,EAf7D1sC,CAAA,CAmBX,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,EAGD8rC,GACC3iC,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,GAAGuhC,GAAU,UAAWkB,EAAY,OAAS,EAAI,OAAS,oBAAqB,UAAW,MAAO,WAAY,QACzH,SAAA,CAAAtnC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACqoC,QAAK,KAAM,GAAI,MAAO/B,EAAA,CAAW,CAAA,CAAE,EAChEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,aAAU,EACnCnmC,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,GAAGumC,GAAY,SAAU,OAAQ,MAAO,UAAW,WAAY,WAAA,EAAgB,SAAAiB,CAAA,CAAU,CAAA,CAAA,CAC1G,CAAA,EACF,EAGDJ,GAAgBA,IAAiBH,GAAYG,IAAiBF,GAC7DriC,OAAC,MAAA,CAAI,MAAOuhC,GACV,SAAA,CAAApmC,EAAAA,IAAC,OAAA,CAAK,MAAOqmC,GAAe,SAAArmC,EAAAA,IAACgoC,SAAM,KAAM,GAAI,MAAO1B,EAAA,CAAW,CAAA,CAAE,EACjEzhC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAOmmC,GAAY,SAAA,WAAQ,EACjCnmC,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,GAAGumC,GAAY,SAAU,OAAQ,MAAO,WAAc,SAAAa,CAAA,CAAa,CAAA,CAAA,CACpF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,EAGApnC,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,QAAS,gDACT,WAAY,uCACZ,WAAY,MACZ,MAAO,OACP,UAAW,MAAA,EAEb,wBAAyB,CAAE,OAAQunC,CAAA,CAAS,CAAA,CAC9C,CAAA,CAAA,CACF,CAAA,CAGN,+GCpYA,GAAI,OAAO,SAAa,KAAe,CAAC,SAAS,eAAe,iBAAiB,EAAG,CAClF,MAAMe,EAAU,SAAS,cAAc,OAAO,EAC9CA,EAAQ,GAAK,kBACbA,EAAQ,YAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQtB,SAAS,KAAK,YAAYA,CAAO,CACnC,CA+CA,MAAMC,GAAW,IAEJplC,GAAeqlC,EAAAA,WAC1B,CAAC,CAAE,IAAA76B,EAAK,gBAAA86B,EAAiB,kBAAAC,CAAA,EAAqBlyB,IAAQ,CACpD,MAAM1b,EAAIqF,EAAA,EACJwoC,EAAYzhC,EAAAA,OAAuB,IAAI,EACvC0hC,EAAU1hC,EAAAA,OAAwB,IAAI,EACtC2hC,EAAe3hC,EAAAA,OAA6B,IAAI,EAChD4hC,EAAqB5hC,EAAAA,OAAOuhC,CAAe,EAC3CM,EAAuB7hC,EAAAA,OAAOwhC,CAAiB,EACrDI,EAAmB,QAAUL,EAC7BM,EAAqB,QAAUL,EAE/B,MAAMM,EAAoB9hC,EAAAA,OAAO,CAAC,EAC5B+hC,EAAa/hC,EAAAA,OAAsB,IAAI,EACvCgiC,EAAiBhiC,EAAAA,OAAO,EAAK,EAE7B,CAACqL,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAACojC,EAAaC,CAAc,EAAIrjC,EAAAA,SAAS,EAAK,EAC9C,CAACsjC,EAAKC,CAAM,EAAIvjC,EAAAA,SAAoB,CAAA,CAAE,EACtC,CAACwjC,EAASC,CAAU,EAAIzjC,EAAAA,SAAS,EAAK,EACtC,CAAC0jC,EAAeC,CAAgB,EAAI3jC,EAAAA,SAAiB,EAAE,EACvD4jC,EAASziC,EAAAA,OAAkB,EAAE,EACnCyiC,EAAO,QAAUN,EAEjBH,EAAe,QAAUC,EAEzB,MAAMS,EAAa7gC,EAAAA,YAAY,IAAM,QACnCxH,EAAAsnC,EAAa,UAAb,MAAAtnC,EAAsB,MACxB,EAAG,CAAA,CAAE,EAECsoC,EAAa9gC,EAAAA,YAAY,IAAM,QACnCxH,EAAAsnC,EAAa,UAAb,MAAAtnC,EAAsB,MACxB,EAAG,CAAA,CAAE,EAGCuoC,EAAqB5iC,EAAAA,OAAuB,IAAI,EAChD6iC,EAAe7iC,EAAAA,OAAO,CAAC,EAEvB8iC,EAAc9iC,SAAQ+iC,GAAe,UACzC,MAAM36B,EAAYw6B,EAAmB,QACrC,GAAI,CAACx6B,EAAW,OAChB,MAAMrF,EAAKqF,EAEX,GADmBrF,EAAG,UAAYA,EAAG,cAAgBA,EAAG,aAAe,IAErE,GAAI,CACF,MAAMigC,IAAO3oC,EAAAsnC,EAAa,UAAb,YAAAtnC,EAA4G,SACzH8J,GAAA6+B,IAAA,YAAAA,GAAK,QAAL,MAAA7+B,GAAA,KAAA6+B,GAAa,IAAK,IACpB,MAAQ,CAAe,CAE3B,CAAC,EAEKC,EAAyBphC,EAAAA,YAAY,IAAM,CAE3C+gC,EAAmB,UACrBA,EAAmB,QAAQ,oBAAoB,SAAUE,EAAY,OAAO,EAC5EF,EAAmB,QAAU,MAE/B,qBAAqBC,EAAa,OAAO,EAEzC,MAAMK,EAAY,IAAM,OACtB,MAAM96B,IAAY/N,EAAAonC,EAAU,UAAV,YAAApnC,EAAmB,cAAc,qBAAsB,KACzE,GAAI,CAAC+N,EAAW,CACdy6B,EAAa,QAAU,sBAAsBK,CAAS,EACtD,MACF,CACAN,EAAmB,QAAUx6B,EAC7BA,EAAU,iBAAiB,SAAU06B,EAAY,QAAS,CAAE,QAAS,GAAM,CAC7E,EACAD,EAAa,QAAU,sBAAsBK,CAAS,CACxD,EAAG,CAAA,CAAE,EAECC,EAAkBthC,EAAAA,YAAY,IAAM,OACxC,MAAMuhC,EAAS,CAACpB,EAAe,QAC/BE,EAAekB,CAAM,GACrB/oC,EAAAwnC,EAAqB,UAArB,MAAAxnC,EAAA,KAAAwnC,EAA+BuB,GAE/B,WAAW,IAAM,CACf,MAAMC,EAAS5B,EAAU,QACnB6B,GAAY3B,EAAa,QAC3B,CAAC0B,GAAU,CAACC,KAChBA,GAAU,OAAOD,EAAO,YAAaA,EAAO,YAAY,EAEpDtB,EAAW,SACbuB,GAAU,QAAQvB,EAAW,OAAO,EAGtCkB,EAAA,EACF,EAAG,GAAG,CACR,EAAG,CAACA,CAAsB,CAAC,EAErBM,EAAY1hC,EAAAA,YAAY,IAAM,CAClCygC,EAAWr/B,GAAQ,CAACA,CAAI,CAC1B,EAAG,CAAA,CAAE,EAECugC,EAAiB3hC,cAAa4hC,GAAiB,OACnDjB,EAAiBiB,CAAI,GACrBppC,EAAAsnC,EAAa,UAAb,MAAAtnC,EAAsB,QAAQopC,GAC9BnB,EAAW,EAAK,CAClB,EAAG,CAAA,CAAE,EAELoB,EAAAA,oBAAoBp0B,EAAK,KAAO,CAC9B,SAAUozB,EACV,SAAUC,EACV,gBAAAQ,EACA,UAAAI,CAAA,GACE,CAACb,EAAYC,EAAYQ,EAAiBI,CAAS,CAAC,EAExDzkC,EAAAA,UAAU,IAAM,CACd,MAAMukC,EAAS5B,EAAU,QACzB,GAAI,CAAC4B,EAAQ,OAEb/3B,EAAW,EAAI,EACfpE,EAAS,IAAI,EACbk7B,EAAO,CAAA,CAAE,EACTE,EAAW,EAAK,EAChBe,EAAO,UAAY,GACnBtB,EAAW,QAAU,KACrBD,EAAkB,QAAU,EAE5B,IAAI6B,EAAY,GAGhB,MAAMC,EAAY,OAAO,WAAW,IAAM,CACpCD,GACJE,GAAA,CACF,EAAG,CAAC,EAEEA,GAAO,SAAY,OACvB,GAAI,CACF,IAAIC,GAAkCr9B,EAClCA,EAAI,WAAW,OAAO,IAExBq9B,GAAY,MADC,MAAM,MAAMr9B,CAAG,GACL,YAAA,GAGzB,MAAMs9B,GAAOC,GAAKF,EAAS,EAC3BpC,EAAQ,QAAUqC,GAElB,MAAMT,GAAYS,GAAK,SAASV,EAAQ,CACtC,QAAS,aACT,KAAM,WACN,MAAO,OACP,OAAQ,MAAA,CACT,EACD1B,EAAa,QAAU2B,GAEvBA,GAAU,OAAO,SAAS,UAAW,CACnC,KAAM,CACJ,WAAY,qBACZ,MAAO,qBACP,cAAe,uFACf,YAAa,kBACb,cAAe,eACf,QAAS,uBACT,YAAa,kBACb,aAAc,wBACd,aAAc,wBACd,gBAAiB,uBAAA,EAEnB,EAAG,CAAE,cAAe,iBAAkB,OAAQ,oBAAA,EAC9C,GAAI,CAAE,aAAc,oBAAqB,OAAQ,wBAAA,EACjD,GAAI,CAAE,OAAQ,0BAAA,EACd,GAAI,CAAE,OAAQ,wBAAA,EACd,IAAK,CAAE,YAAa,kBAAmB,OAAQ,iBAAA,EAC/C,EAAG,CAAE,MAAO,qBAAsB,kBAAmB,iBAAA,CAAkB,CACxE,EACDA,GAAU,OAAO,OAAO,SAAS,EAEjC,MAAMS,GAAK,MAGXA,GAAK,UAAU,SAAS,IAAI,EAAE,KAAK,IAAM,cACvC,GAAIJ,EAAW,OACf7B,EAAkB,QAAUiC,GAAK,UAAU,OAAA,EAE3C,MAAME,IAAM5pC,GAAAsnC,EAAa,UAAb,YAAAtnC,GAAsB,kBAC5B6pC,IAAM//B,GAAA8/B,IAAA,YAAAA,GAAK,QAAL,YAAA9/B,GAAY,WAAY,GACpCggC,GAAAvC,EAAmB,UAAnB,MAAAuC,GAAA,KAAAvC,EAA6BsC,EAAM,EAAGpC,EAAkB,QAC1D,CAAC,EAAE,MAAM,IAAM,CAAe,CAAC,EAG/B,MAAMsC,GAAM,MAAML,GAAK,OAAO,WAO9B,GANI,CAACJ,GAAa,MAAM,QAAQS,IAAA,YAAAA,GAAK,GAAG,GACtChC,EAAOgC,GAAI,GAAG,EAGhB,MAAMd,GAAU,QAAA,EAEZK,EAAW,OAEfr4B,EAAW,EAAK,GAChBjR,EAAAunC,EAAmB,UAAnB,MAAAvnC,EAAA,KAAAunC,EAA6B,EAAGE,EAAkB,SAAW,GAE7DwB,GAAU,GAAG,YAAce,IAAsB,iBAC/C,MAAMJ,EAAMI,GAIZ,IAHIhqC,GAAA4pC,GAAA,YAAAA,EAAK,QAAL,MAAA5pC,GAAY,MACd0nC,EAAW,QAAUkC,EAAI,MAAM,MAE7B9/B,GAAA8/B,GAAA,YAAAA,EAAK,QAAL,MAAA9/B,GAAY,KAAM,CAEpB,MAAMmgC,GAAYL,EAAI,MAAM,KACtBM,GAAoB,CAAA,EACpBC,GAAWjjB,IAAqB,CACpC,UAAW5c,MAAQ4c,GAAO,CACxB,MAAMkjB,GAAO9/B,GAAK,KAAK,MAAM,GAAG,EAAE,CAAC,EAC/B8/B,KAASH,KAAcG,IAAQH,GAAU,SAAS,IAAMG,EAAI,GAAKH,GAAU,SAASG,EAAI,IAC1FF,GAAQ,KAAK5/B,GAAK,IAAI,EAEpBA,GAAK,UAAU6/B,GAAQ7/B,GAAK,QAAQ,CAC1C,CACF,EACA6/B,GAAQ/B,EAAO,OAAO,EAClB8B,GAAQ,SAAW,GAErB/B,EAAiB+B,GAAQ,CAAC,CAAC,CAG/B,CACA,MAAML,IAAMC,GAAAF,GAAA,YAAAA,EAAK,QAAL,YAAAE,GAAY,SAClBtgC,GAAQi+B,EAAkB,QAC5B,OAAOoC,IAAQ,UAAYrgC,GAAQ,KACrC6gC,GAAA9C,EAAmB,UAAnB,MAAA8C,GAAA,KAAA9C,EAA6BsC,GAAM,EAAGrgC,IAE1C,CAAC,CAEH,OAASiI,GAAK,CACZ,QAAQ,MAAM,aAAcA,EAAG,EAC1B63B,IACHz8B,EAAStT,EAAE,kBAAkB,CAAC,EAC9B0X,EAAW,EAAK,EAEpB,CACF,EAEA,MAAO,IAAM,aACXq4B,EAAY,GACZ,OAAO,aAAaC,CAAS,EAC7B,GAAI,EAAEz/B,IAAA9J,EAAAsnC,EAAa,UAAb,YAAAtnC,EAAsB,UAAtB,MAAA8J,GAAA,KAAA9J,EAAmC,MAAQ,CAAe,CAChE,GAAI,EAAE8pC,GAAAzC,EAAQ,UAAR,MAAAyC,GAAiB,SAAW,MAAQ,CAAe,CACzDxC,EAAa,QAAU,KACvBD,EAAQ,QAAU,IACpB,CACF,EAAG,CAACj7B,CAAG,CAAC,EAER3H,EAAAA,UAAU,IAAM,CACd,MAAM6lC,EAAW,IAAM,CACrB,MAAMtB,EAAS5B,EAAU,QACrB,CAAC4B,GAAU,CAAC1B,EAAa,SAC7BA,EAAa,QAAQ,OAAO0B,EAAO,YAAaA,EAAO,YAAY,CACrE,EACA,cAAO,iBAAiB,SAAUsB,CAAQ,EACnC,IAAM,OAAO,oBAAoB,SAAUA,CAAQ,CAC5D,EAAG,CAAA,CAAE,EAEL7lC,EAAAA,UAAU,KACRmkC,EAAA,EACO,IAAM,OACX,qBAAqBJ,EAAa,OAAO,GACzCxoC,EAAAuoC,EAAmB,UAAnB,MAAAvoC,EAA4B,oBAAoB,SAAUyoC,EAAY,QACxE,GACC,CAACr8B,EAAKw8B,CAAsB,CAAC,EAEhC,MAAM2B,EAAW/iC,cAAa4hC,GACrBA,IAASlB,EACf,CAACA,CAAa,CAAC,EAEZsC,EAAiB,CAACtjB,EAAkBujB,EAAQ,IAChDhsC,MAAC,MAAG,MAAO,CAAE,WAAYgsC,EAAQ,EAAI,GAAK,GACvC,WAAM,IAAI,CAACngC,EAAMnQ,KAAM,CACtB,MAAM8tB,EAASsiB,EAASjgC,EAAK,IAAI,EACjC,cACG,KAAA,CACC,SAAA,CAAA7L,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM0qC,EAAe7+B,EAAK,IAAI,EACvC,UAAW,sGAAsG2d,EAC3G,uDACA,wEACJ,GACF,MAAO3d,EAAK,MAEX,SAAAA,EAAK,MAAM,KAAA,CAAK,CAAA,EAElBA,EAAK,UAAYA,EAAK,SAAS,OAAS,GAAKkgC,EAAelgC,EAAK,SAAUmgC,EAAQ,CAAC,CAAA,CAAA,EAX9E,GAAGngC,EAAK,IAAI,IAAInQ,EAAC,EAY1B,CAEJ,CAAC,CAAA,CACH,EAGF,OACEmJ,EAAAA,KAAC,MAAA,CAAI,UAAU,sGACZ,SAAA,CAAAsJ,GACCnO,EAAAA,IAAC,OAAI,UAAU,8GACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,CAAA,CACpC,EAGDoE,GAAW,CAACpE,GACXnO,EAAAA,IAAC,MAAA,CAAI,UAAU,iFACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAIDqpC,EAAI,OAAS,GACZxkC,EAAAA,KAAC,MAAA,CACC,UAAU,qFACV,MAAO,CACL,QAAS0kC,EAAU,EAAI,EACvB,cAAeA,EAAU,OAAS,MAAA,EAGpC,SAAA,CAAA1kC,EAAAA,KAAC,MAAA,CACC,UAAU,mMACV,MAAO,CAAE,UAAW0kC,EAAU,gBAAkB,mBAAA,EAEhD,SAAA,CAAA1kC,EAAAA,KAAC,MAAA,CAAI,UAAU,sHACb,SAAA,CAAA7E,MAAC,OAAA,CAAK,UAAU,kDAAmD,SAAAlF,EAAE,aAAa,EAAE,EACpFkF,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMwpC,EAAW,EAAK,EAC/B,UAAU,uEAEV,SAAAxpC,EAAAA,IAAC1B,EAAAA,EAAA,CAAE,UAAU,iBAAA,CAAkB,CAAA,CAAA,CACjC,EACF,QACC,MAAA,CAAI,UAAU,mDACZ,SAAAytC,EAAe1C,CAAG,CAAA,CACrB,CAAA,CAAA,CAAA,EAEFrpC,EAAAA,IAAC,MAAA,CACC,UAAU,qDACV,MAAO,CAAE,WAAYupC,EAAU,kBAAoB,aAAA,EACnD,QAAS,IAAMC,EAAW,EAAK,CAAA,CAAA,CACjC,CAAA,CAAA,EAIH,CAACr7B,GACAnO,EAAAA,IAAC,MAAA,CACC,IAAK2oC,EACL,UAAU,kDACV,MAAO,CACL,MAAOQ,EAAc,OAAS,GAAGZ,EAAQ,KACzC,SAAU,OACV,WAAY,kBACZ,SAAU,QAAA,CACZ,CAAA,CACF,EAEJ,CAEJ,CACF,gHCtZM0D,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBb1D,GAAW,IAeJllC,GAAemlC,EAAAA,WAC1B,CAAC,CAAE,IAAA76B,EAAK,gBAAA86B,EAAiB,kBAAAC,CAAA,EAAqBlyB,IAAQ,CACpD,MAAM1b,EAAIqF,EAAA,EACJ+rC,EAAUhlC,EAAAA,OAAuB,IAAI,EACrCilC,EAAUjlC,EAAAA,OAA2B,IAAI,EACzC4hC,EAAqB5hC,EAAAA,OAAOuhC,CAAe,EAC3CM,EAAuB7hC,EAAAA,OAAOwhC,CAAiB,EACrDI,EAAmB,QAAUL,EAC7BM,EAAqB,QAAUL,EAG/B,MAAMM,EAAoB9hC,EAAAA,OAAO,CAAC,EAE5B,CAACqL,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAACsjC,EAAKC,CAAM,EAAIvjC,EAAAA,SAAoB,CAAA,CAAE,EACtC,CAACwjC,EAASC,CAAU,EAAIzjC,EAAAA,SAAS,EAAK,EACtC,CAAC0jC,EAAeC,CAAgB,EAAI3jC,EAAAA,SAAiB,EAAE,EACvD,CAACojC,EAAaC,CAAc,EAAIrjC,EAAAA,SAAS,EAAK,EAC9CmjC,EAAiBhiC,EAAAA,OAAO,EAAK,EACnCgiC,EAAe,QAAUC,EAEzB,MAAMiD,EAAiBrjC,EAAAA,YAAY,CAAC+B,EAAiBC,IAAkB,OACjEA,EAAQ,IAAGi+B,EAAkB,QAAUj+B,IAC3CxJ,EAAAunC,EAAmB,UAAnB,MAAAvnC,EAAA,KAAAunC,EAA6B,KAAK,IAAI,EAAGh+B,EAAU,CAAC,EAAGk+B,EAAkB,QAC3E,EAAG,CAAA,CAAE,EAECY,EAAa7gC,EAAAA,YAAY,IAAM,CACnC,MAAMwZ,EAAO4pB,EAAQ,QAChB5pB,GACLA,EAAK,OAAO,MAAM,IAAM,CAAC,CAAC,CAC5B,EAAG,CAAA,CAAE,EAECsnB,EAAa9gC,EAAAA,YAAY,IAAM,CACnC,MAAMwZ,EAAO4pB,EAAQ,QAChB5pB,GACLA,EAAK,OAAO,MAAM,IAAM,CAAC,CAAC,CAC5B,EAAG,CAAA,CAAE,EAECkoB,EAAY1hC,EAAAA,YAAY,IAAMygC,EAAYr/B,GAAS,CAACA,CAAI,EAAG,EAAE,EAE7DkgC,EAAkBthC,EAAAA,YAAY,IAAM,OACxC,MAAMuhC,EAAS,CAACpB,EAAe,QAC/BE,EAAekB,CAAM,GACrB/oC,EAAAwnC,EAAqB,UAArB,MAAAxnC,EAAA,KAAAwnC,EAA+BuB,GAE/B,MAAM/nB,EAAO4pB,EAAQ,QACrB,GAAI,CAAC5pB,EAAM,OACX,MAAMlZ,EAAYkZ,EAA+C,SAC7DlZ,GACFA,EAAS,aAAa,kBAAmBihC,EAAS,OAAS,KAAK,CAEpE,EAAG,CAAA,CAAE,EAECI,EAAiB3hC,cAAa4hC,GAAiB,OACnDjB,EAAiBiB,CAAI,EACrBnB,EAAW,EAAK,GAChBjoC,EAAA4qC,EAAQ,UAAR,MAAA5qC,EAAiB,KAAKopC,GAAM,MAAM,IAAM,CAAC,EAC3C,EAAG,CAAA,CAAE,EAELC,EAAAA,oBAAoBp0B,EAAK,KAAO,CAC9B,SAAUozB,EACV,SAAUC,EACV,gBAAAQ,EACA,UAAAI,CAAA,GACE,CAACb,EAAYC,EAAYQ,EAAiBI,CAAS,CAAC,EAExDzkC,EAAAA,UAAU,IAAM,CACd,MAAMqmC,EAAOH,EAAQ,QACrB,GAAI,CAACG,EAAM,OAEX75B,EAAW,EAAI,EACfpE,EAAS,IAAI,EACbk7B,EAAO,CAAA,CAAE,EACTE,EAAW,EAAK,EAChBE,EAAiB,EAAE,EACnB2C,EAAK,gBAAA,EAEL,IAAIxB,EAAY,GACZtoB,EAA2B,KA4E/B,OA1Ea,SAAY,kBACvB,GAAI,CACF,GAAIsoB,EAAW,OAEftoB,EAAO,SAAS,cAAc,cAAc,EAC5C8pB,EAAK,YAAY9pB,CAAI,EACrB4pB,EAAQ,QAAU5pB,EAGlBA,EAAK,iBAAiB,WAAa3nB,IAAa,WAC9C,MAAM0xC,EAAU1xC,GAAkB,OAClC,GAAI,CAAC0xC,EAAQ,OAEb,MAAMnB,GAAMmB,EAAO,SACnB,GAAInB,IAAO,OAAOA,GAAI,SAAY,UAAY,OAAOA,GAAI,OAAU,SACjEiB,EAAejB,GAAI,QAASA,GAAI,KAAK,MAChC,CAEL,MAAMoB,KAAWlhC,IAAA9J,GAAA4qC,EAAQ,UAAR,YAAA5qC,GAAiB,OAAjB,YAAA8J,GAAuB,WAAY,CAAA,EAC9C8P,GAAMmxB,EAAO,OAAS,EACtBE,GAAOF,EAAO,UAAY,EAC1BvhC,GAAQ,KAAK,IAAIwhC,GAAS,OAAQ,CAAC,EACnCzhC,GAAU,KAAK,OAAOqQ,GAAMqxB,IAAQzhC,GAAQA,EAAK,EACvDqhC,EAAethC,GAASC,EAAK,CAC/B,CACA,MAAM0hC,GAAUH,EAAO,QACnBG,IAAA,MAAAA,GAAS,MACX/C,EAAiB+C,GAAQ,IAAI,CAEjC,CAAC,EAED,MAAMC,EAAM,MAAM,MAAM/+B,CAAG,EAC3B,GAAI,CAAC++B,EAAI,GAAI,MAAM,IAAI,MAAM,SAASA,EAAI,MAAM,EAAE,EAClD,MAAMC,GAAO,MAAMD,EAAI,KAAA,EACvB,IAAIljC,GAAO,YACX,GAAI,CAEF,MAAMmiC,EADI,IAAI,IAAIh+B,EAAK,OAAO,SAAS,IAAI,EAC5B,SAAS,MAAM,GAAG,EAAE,IAAA,EAC/Bg+B,IAAMniC,GAAO,mBAAmBmiC,CAAI,EAC1C,MAAQ,CAAkB,CAC1B,MAAMiB,GAAO,IAAI,KAAK,CAACD,EAAI,EAAGnjC,EAAI,EAGlC,GADA,MAAM+Y,EAAK,KAAKqqB,EAAI,EAChB/B,EAAW,EAAEx/B,GAAA9J,EAAAghB,EAAK,OAAL,YAAAhhB,EAAW,UAAX,MAAA8J,EAAA,KAAA9J,GAAwB,MAAQ,CAGjD,MAAM8H,GAAYkZ,EAGb,SAEDlZ,KAEFA,GAAS,aAAa,WAAY,EAAE,EACpCA,GAAS,aAAa,kBAAmB,KAAK,EAC9CA,GAAS,aAAa,SAAU,IAAI,EACpCA,GAAS,aAAa,MAAO,IAAI,GACjCgiC,EAAAhiC,GAAS,YAAT,MAAAgiC,EAAA,KAAAhiC,GAAqB4iC,IAErB,OAAML,EAAAviC,GAAS,OAAT,YAAAuiC,EAAA,KAAAviC,MAGRigC,IAAOW,EAAA1nB,EAAK,OAAL,YAAA0nB,EAAW,MAAO,CAAA,CAAE,EAC3Bz3B,EAAW,EAAK,EAChB45B,EAAe,IAAGS,GAAAtqB,EAAK,OAAL,YAAAsqB,GAAW,SAAS,SAAU,CAAC,CACnD,OAAS75B,EAAK,CACZ,QAAQ,MAAM,kBAAmBA,CAAG,EAC/B63B,IACHz8B,EAAStT,EAAE,kBAAkB,CAAC,EAC9B0X,EAAW,EAAK,EAEpB,CACF,GAEA,EAEO,IAAM,WACXq4B,EAAY,GACZ,GAAI,EAAEQ,GAAAhgC,GAAA9J,EAAA4qC,EAAQ,UAAR,YAAA5qC,EAAiB,OAAjB,YAAA8J,EAAuB,UAAvB,MAAAggC,EAAA,KAAAhgC,EAAoC,MAAQ,CAAe,CACjE8gC,EAAQ,QAAU,KAClBE,EAAK,gBAAA,CACP,CACF,EAAG,CAAC1+B,EAAKy+B,CAAc,CAAC,EAExB,MAAMN,EAAW/iC,EAAAA,YACd4hC,GAA6B,CAAC,CAACA,GAAQA,IAASlB,EACjD,CAACA,CAAa,CAAA,EAGVsC,EAAiB,CAACtjB,EAAkBujB,EAAQ,UAC/C,KAAA,CAAG,MAAO,CAAE,UAAW,OAAQ,QAAS,EAAG,OAAQA,EAAQ,EAAI,aAAe,CAAA,EAC5E,SAAAvjB,EAAM,IAAI,CAAC5c,EAAMnQ,IAAA,SAChBmJ,OAAAA,EAAAA,KAAC,KAAA,CACE,SAAA,CAAAgH,EAAK,KACJ7L,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM0qC,EAAe7+B,EAAK,IAAK,EACxC,UAAW,sGACTigC,EAASjgC,EAAK,IAAI,EACd,uDACA,wEACN,GACA,MAAOA,EAAK,MAEX,UAAAtK,EAAAsK,EAAK,QAAL,YAAAtK,EAAY,MAAK,CAAA,QAGnB,MAAA,CAAI,UAAU,6EACZ,UAAA8J,EAAAQ,EAAK,QAAL,YAAAR,EAAY,OACf,EAEDQ,EAAK,UAAYA,EAAK,SAAS,OAAS,GAAKkgC,EAAelgC,EAAK,SAAUmgC,EAAQ,CAAC,CAAA,CAAA,EAlB9E,GAAGngC,EAAK,MAAQA,EAAK,KAAK,IAAInQ,CAAC,EAmBxC,EACD,EACH,EAGF,OACEmJ,EAAAA,KAAC,MAAA,CAAI,UAAU,sGACZ,SAAA,CAAAsJ,GACCnO,EAAAA,IAAC,OAAI,UAAU,sHACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,CAAA,CACpC,EAGDoE,GAAW,CAACpE,GACXnO,EAAAA,IAAC,MAAA,CAAI,UAAU,iFACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAIDqpC,EAAI,OAAS,GACZxkC,EAAAA,KAAC,MAAA,CACC,UAAU,qFACV,MAAO,CAAE,QAAS0kC,EAAU,EAAI,EAAG,cAAeA,EAAU,OAAS,MAAA,EAErE,SAAA,CAAA1kC,EAAAA,KAAC,MAAA,CACC,UAAU,mMACV,MAAO,CAAE,UAAW0kC,EAAU,gBAAkB,mBAAA,EAEhD,SAAA,CAAA1kC,EAAAA,KAAC,MAAA,CAAI,UAAU,sHACb,SAAA,CAAA7E,MAAC,OAAA,CAAK,UAAU,kDAAmD,SAAAlF,EAAE,aAAa,EAAE,EACpFkF,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMwpC,EAAW,EAAK,EAC/B,UAAU,uEAEV,SAAAxpC,EAAAA,IAAC1B,EAAAA,EAAA,CAAE,UAAU,iBAAA,CAAkB,CAAA,CAAA,CACjC,EACF,QACC,MAAA,CAAI,UAAU,mDACZ,SAAAytC,EAAe1C,CAAG,CAAA,CACrB,CAAA,CAAA,CAAA,EAEFrpC,EAAAA,IAAC,MAAA,CACC,UAAU,qDACV,MAAO,CAAE,WAAYupC,EAAU,kBAAoB,aAAA,EACnD,QAAS,IAAMC,EAAW,EAAK,CAAA,CAAA,CACjC,CAAA,CAAA,EAIH,CAACr7B,GACAnO,EAAAA,IAAC,MAAA,CACC,IAAKksC,EACL,UAAU,kDACV,MAAO,CACL,MAAO/C,EAAc,OAAS,GAAGZ,EAAQ,KACzC,SAAU,OACV,WAAY,iBAAA,CACd,CAAA,CACF,EAEJ,CAEJ,CACF,EAEAllC,GAAa,YAAc,mIC1SrBypC,GAAgBn/B,GAAwB,OAC5C,MAAMvC,IAAM7J,EAAAoM,EAAI,MAAM,GAAG,EAAE,IAAA,IAAf,YAAApM,EAAsB,cAAc,MAAM,KAAK,KAAM,GAajE,MAZwC,CACtC,IAAK,YACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,IAAK,kBACL,IAAK,kBACL,IAAK,mBACL,IAAK,YACL,MAAO,aACP,IAAK,aAAA,EAEQ6J,CAAG,GAAK,WACzB,EAEa7H,GAA8C,CAAC,CAAE,IAAAoK,KAAU,CACtE,MAAM7S,EAAIqF,EAAA,EACJ,CAACgO,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAACgnC,EAAWC,CAAY,EAAIjnC,EAAAA,SAAS,EAAI,EACzCknC,EAAW/lC,EAAAA,OAAuB,IAAI,EACtCgmC,EAAYhmC,EAAAA,OAA6B,IAAI,EAmFnD,OAjFAlB,EAAAA,UAAU,IAAM,CAEd,GAAI,CAACknC,EAAU,SAAWD,EAAS,QAAS,CAC1C,MAAME,EAAe,SAAS,cAAc,UAAU,EACtDA,EAAa,UAAU,IAAI,wBAAyB,iBAAiB,EACrEF,EAAS,QAAQ,YAAYE,CAAY,EAEzC,MAAMC,EAAYN,GAAan/B,CAAG,EAU5B0/B,EAASC,GAAQH,EAAc,CACnC,SAAU,GACV,KAAM,GACN,QAAS,OACT,WAAY,CACV,SAAU,CACR,aACA,cACA,qBACA,cACA,kBACA,kBACA,uBACA,kBAAA,EAEF,YAAa,CACX,OAAQ,EAAA,CACV,EAEF,MAAO,CACL,IAAK,CACH,eAAgB,EAAA,EAElB,kBAAmB,GACnB,kBAAmB,GACnB,iBAAkB,EAAA,EAEpB,QAlCcC,IAAc,kBAC1B,CACA,CAAE,IAAKz/B,EAAK,KAAM,iBAAA,EAClB,CAAE,IAAKA,EAAK,KAAM,WAAA,CAAY,EAE9B,CAAC,CAAE,IAAKA,EAAK,KAAMy/B,EAAW,CA6BhC,CACD,EAGKG,EAAUF,EAAO,GAAA,EAAK,cAAc,OAAO,EAC7CE,IACDA,EAA6B,MAAM,UAAY,WAIlDF,EAAO,GAAG,aAAc,IAAM,CAC5BL,EAAa,EAAK,CACpB,CAAC,EAEDK,EAAO,GAAG,QAAS,IAAM,CACvB,MAAMl/B,EAAQk/B,EAAO,MAAA,EACrB,QAAQ,MAAM,kBAAmBl/B,CAAK,EACtCC,EAAStT,EAAE,+BAAgC,CAAE,OAAOqT,GAAAA,YAAAA,EAAO,UAAWrT,EAAE,sBAAsB,CAAA,CAAG,CAAC,EAClGkyC,EAAa,EAAK,CACpB,CAAC,EAEDE,EAAU,QAAUG,CACtB,CACF,EAAG,CAAC1/B,CAAG,CAAC,EAGR3H,EAAAA,UAAU,IAAM,CACd,MAAMqnC,EAASH,EAAU,QAEzB,MAAO,IAAM,CACPG,GAAU,CAACA,EAAO,eACpBA,EAAO,QAAA,EACPH,EAAU,QAAU,KAExB,CACF,EAAG,CAAA,CAAE,EAED/+B,QAEC,MAAA,CAAI,UAAU,qEACb,SAAAtJ,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,yHACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mCAAmC,KAAK,OAAO,QAAQ,YAAY,OAAO,eACvF,SAAAA,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,sIAAA,CAAuI,CAAA,CAC9M,CAAA,CACF,QACC,IAAA,CAAE,UAAU,2DAA4D,SAAAlF,EAAE,mBAAmB,EAAE,EAChGkF,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAoC,SAAAmO,CAAA,CAAM,CAAA,CAAA,CACzD,CAAA,CACF,QAKD,MAAA,CAAI,UAAU,qEACb,SAAAtJ,EAAAA,KAAC,MAAA,CAAI,UAAU,qCAEZ,SAAA,CAAAkoC,SACE,MAAA,CAAI,UAAU,uHACb,SAAAloC,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,wIAAA,CAAyI,QACvJ,IAAA,CAAE,UAAU,oDAAqD,SAAAlF,EAAE,eAAe,CAAA,CAAE,CAAA,CAAA,CACvF,CAAA,CACF,EAIFkF,EAAAA,IAAC,MAAA,CACC,IAAKitC,EACL,UAAU,yEACV,MAAO,CACL,UAAW,qEAAA,CACb,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAEJ,iHCnIO,SAASO,GAAe,CAC7B,IAAA7/B,CACF,EAAgD,CAC9C,MAAM8/B,EAAWvmC,EAAAA,OAAyB,IAAI,EACxC,CAACwmC,EAAWC,CAAY,EAAI5nC,EAAAA,SAAS,EAAK,EAC1C,CAACgnC,EAAWC,CAAY,EAAIjnC,EAAAA,SAAS,EAAI,EACzC,CAAC6nC,EAAaC,CAAc,EAAI9nC,EAAAA,SAAS,CAAC,EAC1C,CAAC+nC,EAAUC,CAAW,EAAIhoC,EAAAA,SAAS,CAAC,EACpC,CAACioC,EAAQC,CAAc,EAAIloC,EAAAA,SAAS,CAAC,EACrC,CAACmoC,EAASC,CAAU,EAAIpoC,EAAAA,SAAS,EAAK,EACtC,CAACqoC,EAAQC,CAAS,EAAItoC,EAAAA,SAAS,EAAK,EACpC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAEtDC,EAAAA,UAAU,IAAM,CACd,MAAMsoC,EAAQb,EAAS,QACvB,GAAI,CAACa,EAAO,OAGZtB,EAAa,EAAI,EACjB5+B,EAAS,IAAI,EAEb,MAAMmgC,EAAe,IAAM,CACpB,MAAMD,EAAM,WAAW,GAC1BT,EAAeS,EAAM,WAAW,CAEpC,EAEME,EAAmB,IAAM,CACzB,CAAC,MAAMF,EAAM,QAAQ,GAAK,SAASA,EAAM,QAAQ,GACnDP,EAAYO,EAAM,QAAQ,CAE9B,EAEMG,EAAY,IAAM,CACtBzB,EAAa,EAAK,EAClBwB,EAAA,CACF,EAEME,EAAY,IAAM1B,EAAa,EAAI,EACnC2B,EAAY,IAAM,CACtB3B,EAAa,EAAK,EAClBW,EAAa,EAAI,CACnB,EAGMiB,EAAS,IAAMjB,EAAa,EAAI,EAChCkB,EAAU,IAAMlB,EAAa,EAAK,EAClCmB,EAAU,IAAMnB,EAAa,EAAK,EAElCoB,EAAU,IAAM,CACpB3gC,EAAS,QAAQ,EACjB4+B,EAAa,EAAK,CACpB,EAEA,OAAAsB,EAAM,iBAAiB,aAAcC,CAAY,EACjDD,EAAM,iBAAiB,iBAAkBE,CAAgB,EACzDF,EAAM,iBAAiB,iBAAkBE,CAAgB,EACzDF,EAAM,iBAAiB,UAAWG,CAAS,EAC3CH,EAAM,iBAAiB,UAAWI,CAAS,EAC3CJ,EAAM,iBAAiB,UAAWK,CAAS,EAC3CL,EAAM,iBAAiB,OAAQM,CAAM,EACrCN,EAAM,iBAAiB,QAASO,CAAO,EACvCP,EAAM,iBAAiB,QAASQ,CAAO,EACvCR,EAAM,iBAAiB,QAASS,CAAO,EAGnCT,EAAM,YAAc,GACtBtB,EAAa,EAAK,EAClBwB,EAAA,GACSF,EAAM,YAAc,GAC7BE,EAAA,EAGK,IAAM,CACXF,EAAM,oBAAoB,aAAcC,CAAY,EACpDD,EAAM,oBAAoB,iBAAkBE,CAAgB,EAC5DF,EAAM,oBAAoB,iBAAkBE,CAAgB,EAC5DF,EAAM,oBAAoB,UAAWG,CAAS,EAC9CH,EAAM,oBAAoB,UAAWI,CAAS,EAC9CJ,EAAM,oBAAoB,UAAWK,CAAS,EAC9CL,EAAM,oBAAoB,OAAQM,CAAM,EACxCN,EAAM,oBAAoB,QAASO,CAAO,EAC1CP,EAAM,oBAAoB,QAASQ,CAAO,EAC1CR,EAAM,oBAAoB,QAASS,CAAO,CAC5C,CACF,EAAG,CAACphC,CAAG,CAAC,EAER,MAAMqhC,EAAajmC,EAAAA,YAAY,IAAM,CACnC,MAAMulC,EAAQb,EAAS,QAClBa,IAEDA,EAAM,OACRA,EAAM,OAAO,MAAM,IAAM,CAEzB,CAAC,EAEDA,EAAM,MAAA,EAEV,EAAG,CAAA,CAAE,EAECW,EAAOlmC,cAAammC,GAAiB,CACzC,MAAMZ,EAAQb,EAAS,QAClBa,IACLA,EAAM,YAAcY,EACpBrB,EAAeqB,CAAI,EACrB,EAAG,CAAA,CAAE,EAECC,EAAOpmC,EAAAA,YACVqmC,GAAoB,CACnB,MAAMd,EAAQb,EAAS,QAClBa,IACLA,EAAM,YAAc,KAAK,IACvB,EACA,KAAK,IAAIA,EAAM,YAAcc,EAASd,EAAM,UAAY,GAAQ,CAAA,EAEpE,EACA,CAAA,CAAC,EAGGe,EAAYtmC,cAAaumC,GAAgB,CAC7C,MAAMhB,EAAQb,EAAS,QACvB,GAAI,CAACa,EAAO,OACZ,MAAMiB,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGD,CAAG,CAAC,EAC5ChB,EAAM,OAASiB,EACftB,EAAesB,CAAO,EAClBA,EAAU,IACZjB,EAAM,MAAQ,GACdH,EAAW,EAAK,EAEpB,EAAG,CAAA,CAAE,EAECqB,EAAazmC,EAAAA,YAAY,IAAM,CACnC,MAAMulC,EAAQb,EAAS,QAClBa,IACLA,EAAM,MAAQ,CAACA,EAAM,MACrBH,EAAWG,EAAM,KAAK,EACxB,EAAG,CAAA,CAAE,EAECmB,EAAa1mC,EAAAA,YAAY,IAAM,CACnC,MAAMulC,EAAQb,EAAS,QACvB,GAAI,CAACa,EAAO,OACZ,MAAMoB,EAAO,CAACpB,EAAM,KACpBA,EAAM,KAAOoB,EACbrB,EAAUqB,CAAI,CAChB,EAAG,CAAA,CAAE,EAECC,EAAa5mC,cAAammC,GAAiB,CAC/C,GAAI,CAAC,SAASA,CAAI,GAAK,MAAMA,CAAI,GAAKA,EAAO,EAAG,MAAO,OACvD,MAAMU,EAAU,KAAK,MAAMV,EAAO,EAAE,EAC9BE,EAAU,KAAK,MAAMF,EAAO,EAAE,EACpC,MAAO,GAAGU,CAAO,IAAIR,EAAQ,WAAW,SAAS,EAAG,GAAG,CAAC,EAC1D,EAAG,CAAA,CAAE,EAEL,MAAO,CACL,SAAA3B,EACA,UAAAC,EACA,UAAAX,EACA,OAAAqB,EACA,YAAAR,EACA,SAAAE,EACA,OAAAE,EACA,QAAAE,EACA,MAAA//B,EACA,WAAA6gC,EACA,KAAAC,EACA,KAAAE,EACA,UAAAE,EACA,WAAAG,EACA,WAAAC,EACA,WAAAE,CAAA,CAEJ,CC9LA,MAAME,GAID,CAAC,CAAE,KAAAv0B,EAAM,UAAA1a,EAAY,GAAI,MAAAsM,KAAY,CACxC,MAAM8B,EAAe9H,EAAAA,OAAuB,IAAI,EAC1C4oC,EAAW5oC,EAAAA,OAAuB,IAAI,EACtC,CAAC6oC,EAAUC,CAAW,EAAIjqC,EAAAA,SAAS,EAAK,EACxC,CAACkqC,EAAYC,CAAa,EAAInqC,EAAAA,SAAS,CAAC,EAE9CC,EAAAA,UAAU,IAAM,CACd,MAAMmqC,EAAQ,IAAM,CAClB,MAAM7gC,EAAYN,EAAa,QACzBohC,EAAQN,EAAS,QACvB,GAAI,CAACxgC,GAAa,CAAC8gC,EAAO,OAC1B,MAAMld,EAAK5jB,EAAU,YACf+gC,EAAKD,EAAM,YACjBJ,EAAYK,EAAKnd,CAAE,EACnBgd,EAAcG,CAAE,CAClB,EACAF,EAAA,EACA,MAAMG,EAAW,IAAI,eAAeH,CAAK,EACzC,OAAInhC,EAAa,SAASshC,EAAS,QAAQthC,EAAa,OAAO,EACxD,IAAMshC,EAAS,WAAA,CACxB,EAAG,CAACh1B,CAAI,CAAC,EAET,MAAMi1B,EAAM,GACNC,EAAcP,EAAaM,EAC3BE,EAAMD,EAAc,GAE1B,OACE3rC,EAAAA,KAAC,MAAA,CACC,IAAKmK,EACL,UAAW,6CAA6CpO,CAAS,GACjE,MAAAsM,EAEC,SAAA,CAAA6iC,EACClrC,EAAAA,KAACmH,GAAAA,OAAO,IAAP,CACC,UAAU,wCACV,QAAS,CAAE,EAAG,CAAC,EAAG,CAACwkC,CAAW,CAAA,EAC9B,WAAY,CAAE,SAAUC,EAAK,OAAQ,IAAU,KAAM,SAAU,YAAa,GAAA,EAE5E,SAAA,CAAAzwC,EAAAA,IAAC,QAAM,SAAAsb,CAAA,CAAK,EACZtb,MAAC,QAAK,MAAO,CAAE,MAAOuwC,CAAA,EAAO,UAAU,mBAAmB,EAC1DvwC,EAAAA,IAAC,QAAM,SAAAsb,CAAA,CAAK,CAAA,CAAA,CAAA,EAEZ,KAEJtb,EAAAA,IAAC,MAAA,CACC,IAAK8vC,EACL,UAAU,wBACV,MAAOC,EAAW,CAAE,SAAU,WAAY,WAAY,SAAU,cAAe,MAAA,EAAW,OAEzF,SAAAz0B,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,EAGMo1B,GAA4C,CAAC,CAAE,UAAAhD,CAAA,IACnD1tC,EAAAA,IAACgM,GAAAA,OAAO,IAAP,CACC,UAAU,eACV,MAAO,CACL,IAAK,OACL,MAAO,MACP,MAAO,QACP,OAAQ,QACR,gBAAiB,YACjB,OAAQ,CAAA,EAEV,QAAS,CAAE,OAAQ0hC,EAAY,GAAK,CAAA,EACpC,WAAY,CAAE,SAAU,GAAK,KAAM,CAAC,GAAK,EAAG,GAAK,CAAC,CAAA,EAElD,SAAA7oC,EAAAA,KAAC,MAAA,CACC,MAAM,MACN,OAAO,MACP,QAAQ,cACR,KAAK,OACL,MAAM,6BAGN,SAAA,CAAA7E,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,iBAAA,CAAkB,EAEtDA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,gBAAA,CAAiB,EAErDA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,qBAAA,CAAsB,EAEzDA,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,OAAO,YAAY,MAAM,EAG5EA,EAAAA,IAAC,OAAA,CACC,EAAE,gBACF,OAAO,gBACP,YAAY,MACZ,cAAc,OAAA,CAAA,EAGhBA,EAAAA,IAAC,OAAA,CACC,EAAE,oBACF,OAAO,yBACP,YAAY,IACZ,cAAc,OAAA,CAAA,EAIhBA,EAAAA,IAAC,OAAA,CAAK,EAAE,KAAK,EAAE,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,MAAM,KAAK,iBAAiB,EAEzEA,EAAAA,IAAC,OAAA,CAAK,EAAE,OAAO,EAAE,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,KAAK,sBAAsB,EAE7EA,EAAAA,IAAC,OAAA,CAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,OAAO,OAAO,YAAY,MAAM,cAAc,QAAQ,EAC9FA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,QAAQ,EAAE,MAAM,KAAK,MAAA,CAAO,SAG9C,OAAA,CACC,SAAA,CAAA6E,OAAC,kBAAe,GAAG,WAAW,GAAG,MAAM,GAAG,MACxC,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,SAAA,CAAU,CAAA,EAC1C,SACC,iBAAA,CAAe,GAAG,gBAAgB,GAAG,MAAM,GAAG,MAC7C,SAAA,CAAAA,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,EACvC,EACA6E,EAAAA,KAAC,iBAAA,CAAe,GAAG,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IACnD,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,MAAM,UAAU,OAAO,EACpCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,EACvC,EACA6E,EAAAA,KAAC,iBAAA,CAAe,GAAG,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IACpD,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,EACvC,EACA6E,EAAAA,KAAC,iBAAA,CAAe,GAAG,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IACzD,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,CAAA,CACvC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,EAQWyD,GAA8C,CAAC,CAAE,IAAAkK,EAAK,SAAAjJ,KAAe,CAChF,MAAM,EAAIvE,EAAA,EACJ,CACJ,SAAAstC,EACA,UAAAC,EACA,UAAAX,EACA,OAAAqB,EACA,YAAAR,EACA,SAAAE,EACA,OAAAE,EACA,QAAAE,EACA,MAAA//B,EACA,WAAA6gC,EACA,KAAAC,EACA,KAAAE,EACA,UAAAE,EACA,WAAAG,EACA,WAAAC,EACA,WAAAE,CAAA,EACEnC,GAAe,CAAE,IAAA7/B,EAAK,EAEpB,CAACgjC,EAAYC,CAAa,EAAI7qC,EAAAA,SAAS,EAAK,EAC5C8qC,EAAY3pC,EAAAA,OAAuB,IAAI,EACvC4pC,EAAiB5pC,EAAAA,OAAA,EAEjB6pC,EAAWjD,EAAW,EAAIF,EAAcE,EAAW,EAEzD9nC,EAAAA,UAAU,IAAM,CACd,MAAMgrC,EAAsBp2C,GAAkB,CACxCi2C,EAAU,SAAW,CAACA,EAAU,QAAQ,SAASj2C,EAAE,MAAc,GACnEg2C,EAAc,EAAK,CAEvB,EACA,OAAID,GACF,SAAS,iBAAiB,YAAaK,CAAkB,EAEpD,IAAM,SAAS,oBAAoB,YAAaA,CAAkB,CAC3E,EAAG,CAACL,CAAU,CAAC,EAEf,MAAMM,EAAoB,IAAM,CAC9B,aAAaH,EAAe,OAAO,EACnCF,EAAc,EAAI,CACpB,EAEMM,EAAoB,IAAM,CAC9BJ,EAAe,QAAU,WAAW,IAAMF,EAAc,EAAK,EAAG,GAAG,CACrE,EAEMO,EAAajD,GAAWF,IAAW,EAAIoD,EAAAA,QAAUpD,EAAS,GAAMqD,EAAAA,QAAUC,EAAAA,QAEhF,OAAInjC,EAEAnO,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,EACpC,EACF,EAKFtJ,EAAAA,KAAC,MAAA,CAAI,UAAU,4IAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,eAAe,MAAO,CAAE,MAAO,QAAS,OAAQ,OAAA,EAE7D,SAAA,CAAA7E,EAAAA,IAACgM,GAAAA,OAAO,IAAP,CACC,UAAU,gCACV,MAAO,CACL,MAAO,QACP,OAAQ,QACR,IAAK,OACL,KAAM,MACN,WAAY,qEAAA,EAEd,QAAS0hC,EAAY,CAAE,MAAO,CAAC,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,GAAK,EAAG,EAAG,CAAA,EAAM,CAAE,MAAO,EAAG,QAAS,EAAA,EAC5F,WAAYA,EAAY,CAAE,SAAU,EAAG,OAAQ,IAAU,KAAM,aAAgB,CAAE,SAAU,EAAA,CAAI,CAAA,EAIjG7oC,EAAAA,KAAC,MAAA,CACC,UAAU,oDACV,MAAO,CACL,MAAO,QACP,OAAQ,QACR,IAAK,OACL,KAAM,OACN,WAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAYZ,UAAW6oC,EACP,6FACA,6DACJ,UAAW,oCACX,mBAAoBA,EAAY,UAAY,QAAA,EAI9C,SAAA,CAAA7oC,EAAAA,KAAC,MAAA,CACC,UAAU,gCACV,MAAO,CACL,MAAO,MACP,OAAQ,MACR,IAAK,MACL,KAAM,MACN,WAAY,yEACZ,UAAW,mGAAA,EAGb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CACC,UAAU,2DACV,MAAO,CACL,WAAY;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,CAMd,CAAA,EAEFA,EAAAA,IAAC,MAAA,CACC,UAAU,gCACV,MAAO,CACL,MAAO,MACP,OAAQ,MACR,IAAK,MACL,KAAM,MACN,WAAY,oDACZ,UAAW,0DAAA,CACb,CAAA,CACF,CAAA,CAAA,EAGD+sC,GACC/sC,EAAAA,IAACgM,GAAAA,OAAO,IAAP,CACC,UAAU,4CACV,MAAO,CAAE,OAAQ,iCAAA,EACjB,QAAS,CAAE,MAAO,CAAC,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,GAAK,GAAK,EAAG,CAAA,EACvD,WAAY,CAAE,SAAU,IAAK,OAAQ,GAAA,CAAS,CAAA,CAChD,CAAA,CAAA,EAKJhM,MAAC0wC,IAAQ,UAAAhD,CAAA,CAAsB,CAAA,EACjC,EAGA7oC,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAA7E,EAAAA,IAAC6vC,GAAA,CACC,KAAMnrC,EACN,UAAU,yEAAA,CAAA,EAEZ1E,EAAAA,IAAC,IAAA,CAAE,UAAU,gEAAgE,SAAA,OAAA,CAE7E,CAAA,EACF,EAGA6E,EAAAA,KAAC,MAAA,CACC,UAAU,8HACV,MAAO,CAAE,eAAgB,YAAA,EAGzB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iDACb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,uEAAA,CAAwE,EACvFA,EAAAA,IAAC,MAAA,CACC,UAAU,oEACV,MAAO,CACL,MAAO,GAAG+wC,EAAW,GAAG,IACxB,WAAY,mEACZ,UAAWrD,EAAY,gCAAkC,OACzD,WAAY,mBAAA,CACd,CAAA,EAEF1tC,EAAAA,IAAC,QAAA,CACC,KAAK,QACL,IAAI,IACJ,IAAK8tC,EAAW,EAAIA,EAAWF,GAAe,IAC9C,KAAK,MACL,MAAOA,EACP,SAAWhzC,GAAMq0C,EAAK,WAAWr0C,EAAE,OAAO,KAAK,CAAC,EAChD,SAAUkzC,GAAY,EACtB,aAAY,EAAE,qBAAqB,EACnC,UAAU,sCAAA,CAAA,CACZ,EACF,EACAjpC,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,mBAAoB,gBAAmB,SAAA2vC,EAAW/B,CAAW,EAAE,EAC9E5tC,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,mBAAoB,cAAA,EAAmB,SAAA8tC,EAAW,EAAI6B,EAAW7B,CAAQ,EAAI,OAAA,CAAQ,CAAA,CAAA,CACtG,CAAA,EACF,EAGAjpC,EAAAA,KAAC,MAAA,CAAI,UAAU,yDAEb,SAAA,CAAA7E,EAAAA,IAACgM,GAAAA,OAAO,OAAP,CACC,QAASyjC,EACT,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAqB,EAATrB,EAAW,sBAA2B,oBAAN,EAC5C,UAAW,uGACTA,EACI,qCACA,uCACN,GAEA,SAAApuC,EAAAA,IAACuxC,EAAAA,OAAA,CAAO,UAAU,iBAAA,CAAkB,CAAA,CAAA,EAItCvxC,EAAAA,IAACgM,GAAAA,OAAO,OAAP,CACC,QAAS,IAAMmjC,EAAK,GAAG,EACvB,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAY,EAAE,wBAAwB,EACtC,UAAU,+IAEV,SAAAnvC,EAAAA,IAACwxC,EAAAA,SAAA,CAAS,UAAU,2BAAA,CAA4B,CAAA,CAAA,EAIlDxxC,EAAAA,IAACgM,GAAAA,OAAO,OAAP,CACC,QAASgjC,EACT,WAAY,CAAE,MAAO,IAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAwB,EAAZtB,EAAc,mBAAwB,iBAAN,EAC5C,UAAU,kFACV,MAAO,CACL,WAAY,oEACZ,MAAO,OACP,UAAW,kCAAA,EAGZ,SAAAA,QACE+D,EAAAA,MAAA,CAAM,UAAU,kBAAkB,EAEnCzxC,EAAAA,IAAC0xC,EAAAA,KAAA,CAAK,UAAU,4BAAA,CAA6B,CAAA,CAAA,EAKjD1xC,EAAAA,IAACgM,GAAAA,OAAO,OAAP,CACC,QAAS,IAAMmjC,EAAK,EAAE,EACtB,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAY,EAAE,uBAAuB,EACrC,UAAU,+IAEV,SAAAnvC,EAAAA,IAAC2xC,EAAAA,YAAA,CAAY,UAAU,2BAAA,CAA4B,CAAA,CAAA,EAIrD9sC,EAAAA,KAAC,MAAA,CACC,IAAKgsC,EACL,UAAU,eACV,aAAcI,EACd,aAAcC,EAEd,SAAA,CAAAlxC,EAAAA,IAACgM,GAAAA,OAAO,OAAP,CACC,QAASwjC,EACT,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAsB,EAAVtB,EAAY,oBAAyB,iBAAN,EAC3C,UAAW,uGACTyC,EACI,qCACA,wCACN,GAEA,SAAA3wC,EAAAA,IAACmxC,EAAA,CAAW,UAAU,iBAAA,CAAkB,CAAA,CAAA,EAG1CnxC,EAAAA,IAAC6M,GAAAA,iBACE,SAAA8jC,GACC3wC,EAAAA,IAACgM,GAAAA,OAAO,IAAP,CACC,QAAS,CAAE,QAAS,EAAG,MAAO,GAAA,EAC9B,QAAS,CAAE,QAAS,EAAG,MAAO,CAAA,EAC9B,KAAM,CAAE,QAAS,EAAG,MAAO,GAAA,EAC3B,WAAY,CAAE,SAAU,GAAA,EACxB,UAAU,2GACV,MAAO,CACL,KAAM,MACN,WAAY,QACZ,eAAgB,YAAA,EAElB,aAAcilC,EACd,aAAcC,EAEd,SAAArsC,EAAAA,KAAC,OAAI,UAAU,mDAAmD,MAAO,CAAE,OAAQ,SACjF,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4DAA4D,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAA,EACzG,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CACC,UAAU,iDACV,MAAO,CAAE,MAAO,MAAO,OAAQ,MAAA,CAAO,CAAA,EAExCA,EAAAA,IAAC,MAAA,CACC,UAAU,qEACV,MAAO,CACL,MAAO,MACP,OAAQ,IAAIkuC,EAAU,EAAIF,GAAU,GAAG,IACvC,WAAY,yBACZ,WAAY,oBAAA,CACd,CAAA,EAEFhuC,EAAAA,IAAC,QAAA,CACC,KAAK,QACL,IAAI,IACJ,IAAI,IACJ,KAAK,OACL,MAAOkuC,EAAU,EAAIF,EACrB,SAAWpzC,GAAMy0C,EAAU,WAAWz0C,EAAE,OAAO,KAAK,CAAC,EACrD,aAAY,EAAE,mBAAmB,EACjC,UAAU,sCACV,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,iBACX,gBAAiB,eAAA,CACnB,CAAA,CACF,EACF,EACAoF,EAAAA,IAAC,OAAA,CAAK,UAAU,wDACb,SAAA,KAAK,OAAOkuC,EAAU,EAAIF,GAAU,GAAG,CAAA,CAC1C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAAA,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAAA,QAGD,QAAA,CAAM,IAAKP,EAAU,IAAK9/B,EAAK,UAAU,YAAA,CAAa,CAAA,EACzD,CAEJ,iHCheO,SAASikC,GAAkBC,EAAcz0B,EAAkD,CAChG,MAAMjX,EAAgBzF,GAAA,EAChB,CAAC2R,EAAMC,CAAO,EAAIvM,EAAAA,SAAS,EAAE,EAC7B,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EAE3CC,OAAAA,EAAAA,UAAU,IAAM,CACd,IAAI6kC,EAAY,GAChB,OAAAr4B,EAAW,EAAI,EACfs/B,GAAAA,WAAWD,EAAM,CACf,KAAAz0B,EACA,MAAOjX,IAAkB,QAAU,eAAiB,WAAA,CACrD,EACE,KAAM4rC,GAAQ,CACRlH,IACHv4B,EAAQy/B,CAAG,EACXv/B,EAAW,EAAK,EAEpB,CAAC,EACA,MAAM,IAAM,CACNq4B,IACHv4B,EAAQ,EAAE,EACVE,EAAW,EAAK,EAEpB,CAAC,EACI,IAAM,CACXq4B,EAAY,EACd,CACF,EAAG,CAACgH,EAAMz0B,EAAMjX,CAAa,CAAC,EAEvB,CAAE,KAAAkM,EAAM,QAAAE,CAAA,CACjB,CC9BA,MAAMy/B,GAAW12B,GAAiB,CAChC,KAAM,CAAC22B,EAAQC,CAAS,EAAInsC,EAAAA,SAAS,EAAK,EACpCosC,EAAappC,EAAAA,YAAY,SAAY,CACzC,GAAI,CACF,MAAM,UAAU,UAAU,UAAUuS,CAAI,CAC1C,MAAQ,CACN,MAAM82B,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,MAAQ92B,EACjB,SAAS,KAAK,YAAY82B,CAAQ,EAClCA,EAAS,OAAA,EACT,SAAS,YAAY,MAAM,EAC3B,SAAS,KAAK,YAAYA,CAAQ,CACpC,CACAF,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CACzC,EAAG,CAAC52B,CAAI,CAAC,EACT,MAAO,CAAE,OAAA22B,EAAQ,WAAAE,CAAA,CACnB,EAGME,GAAmB,CAAC,CAAE,KAAA/2B,KAA6B,CACvD,MAAMxgB,EAAIqF,EAAA,EACJ,CAAE,OAAA8xC,EAAQ,WAAAE,GAAeH,GAAQ12B,CAAI,EAC3C,OACEtb,EAAAA,IAAC,SAAA,CACC,QAASmyC,EACT,UAAU,8HACV,MAAgBr3C,EAATm3C,EAAW,kBAAuB,oBAAN,EAElC,SAAAA,QAAUK,EAAAA,MAAA,CAAM,KAAM,GAAI,EAAKtyC,EAAAA,IAACuyC,EAAAA,KAAA,CAAK,KAAM,EAAA,CAAI,CAAA,CAAA,CAGtD,EAGMC,GAAqB,CAAC,CAAE,KAAAl3B,KAA6B,CACzD,MAAMxgB,EAAIqF,EAAA,EACJ,CAAE,OAAA8xC,EAAQ,WAAAE,GAAeH,GAAQ12B,CAAI,EAC3C,OACEtb,EAAAA,IAAC,SAAA,CACC,QAASmyC,EACT,UAAU,kPACV,MAAgBr3C,EAATm3C,EAAW,kBAAuB,oBAAN,EAElC,SAAAA,QAAUK,EAAAA,MAAA,CAAM,KAAM,GAAI,EAAKtyC,EAAAA,IAACuyC,EAAAA,KAAA,CAAK,KAAM,EAAA,CAAI,CAAA,CAAA,CAGtD,EAGME,GAAiB,CAAC,CAAE,KAAAZ,EAAM,KAAAz0B,KAA2C,CACzE,KAAM,CAAE,KAAA/K,CAAA,EAASu/B,GAAkBC,EAAMz0B,CAAI,EAC7C,OACEvY,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,qJACb,SAAA,CAAA7E,EAAAA,IAAC,OAAA,CAAK,UAAU,kEAAmE,SAAAod,EAAK,EACxFpd,EAAAA,IAACqyC,GAAA,CAAiB,KAAMR,CAAA,CAAM,CAAA,EAChC,EACCx/B,EACCrS,EAAAA,IAAC,MAAA,CACC,UAAU,wGACV,wBAAyB,CAAE,OAAQqS,CAAA,CAAK,CAAA,EAG1CrS,EAAAA,IAAC,MAAA,CACC,UAAU,qHACV,MAAO,CAAE,SAAU,OAAQ,WAAY,KAAA,EAEvC,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,6CAA8C,SAAA6xC,CAAA,CAAK,CAAA,CAAA,CACrE,EAEJ,CAEJ,EAEaluC,GAAoD,CAAC,CAAE,IAAAgK,EAAK,SAAA+kC,EAAW,aAAgB,CAClG,MAAM,EAAIvyC,EAAA,EACJ,CAACoU,EAASo+B,CAAU,EAAI5sC,EAAAA,SAAiB,EAAE,EAC3C,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAAE,KAAM6sC,CAAA,EAAehB,GAC3Bc,IAAa,SAAWn+B,EAAU,GAClC,UAAA,EAqBF,OAlBAvO,EAAAA,UAAU,IAAM,EACO,SAAY,CAC/B,GAAI,CACFwM,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMkN,EAAO,MAAMu3B,GAAcllC,CAAG,EACpCglC,EAAWr3B,CAAI,CACjB,OAAStI,EAAK,CACZ5E,EAAS,EAAE,sBAAsB,CAAC,EAClC,QAAQ,MAAM4E,CAAG,CACnB,QAAA,CACER,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC7E,CAAG,CAAC,EAEJ4E,EAEAvS,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIAmO,EAEAnO,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,EACpC,EACF,EAKAukC,IAAa,SAEb1yC,EAAAA,IAAC,MAAA,CAAI,UAAU,yDACZ,SAAA4yC,EACC5yC,EAAAA,IAAC,MAAA,CACC,UAAU,sCACV,wBAAyB,CAAE,OAAQ4yC,CAAA,CAAW,CAAA,EAGhD5yC,EAAAA,IAAC,MAAA,CAAI,UAAU,gGACZ,WACH,EAEJ,QAMD,MAAA,CAAI,UAAU,8DACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,8CACb,SAAAA,EAAAA,IAAC8yC,GAAA,CACG,cAAe,CAACC,GAAWC,EAAU,EACrC,cAAe,CAACC,GAAWC,EAAW,EACtC,WAAY,CACV,KAAK,CAAE,KAAAC,EAAM,OAAAC,EAAQ,UAAAxyC,EAAW,SAAAhB,EAAU,GAAGyzC,GAAc,CACzD,MAAMC,EAAQ,iBAAiB,KAAK1yC,GAAa,EAAE,EAC7C2yC,EAAa,OAAO3zC,CAAQ,EAAE,QAAQ,MAAO,EAAE,EACrD,MAAI,CAACwzC,GAAUE,QAELb,GAAA,CAAe,KAAMc,EAAY,KAAMD,EAAM,CAAC,EAAG,EAEtDF,EAgBHpzC,EAAAA,IAAC,OAAA,CACC,UAAU,mIACT,GAAGqzC,EAEH,SAAAzzC,CAAA,CAAA,EAjBDiF,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAA7E,EAAAA,IAACwyC,GAAA,CAAmB,KAAMe,CAAA,CAAY,EACtCvzC,EAAAA,IAAC,MAAA,CACC,UAAU,oGACV,MAAO,CAAE,SAAU,OAAQ,WAAY,KAAA,EAEvC,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,6CAA8C,SAAAJ,CAAA,CAAS,CAAA,CAAA,CACzE,EACF,CAYN,EACA,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sFACX,SAAAJ,EACH,EAEF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,uEACX,SAAAJ,EACH,EAEF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sEAAuE,SAAAJ,EAAS,EAEhG,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sEAAuE,SAAAJ,EAAS,EAEhG,EAAG,CAAC,CAAE,SAAAA,CAAA,IACJI,EAAAA,IAAC,IAAA,CAAE,UAAU,6DAA8D,SAAAJ,EAAS,EAEtF,EAAG,CAAC,CAAE,KAAA+qC,EAAM,SAAA/qC,KACVI,EAAAA,IAAC,IAAA,CACC,KAAA2qC,EACA,UAAU,wHACV,OAAO,SACP,IAAI,sBAEH,SAAA/qC,CAAA,CAAA,EAGL,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sEAAuE,SAAAJ,EAAS,EAEhG,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,yEAA0E,SAAAJ,EAAS,EAEnG,GAAI,CAAC,CAAE,SAAAA,CAAA,IAAeI,EAAAA,IAAC,KAAA,CAAG,UAAU,gBAAiB,SAAAJ,EAAS,EAC9D,WAAY,CAAC,CAAE,SAAAA,CAAA,IACbI,EAAAA,IAAC,aAAA,CAAW,UAAU,0FACnB,SAAAJ,EACH,EAEF,MAAO,CAAC,CAAE,SAAAA,CAAA,IACRI,EAAAA,IAAC,MAAA,CAAI,UAAU,yEACb,SAAAA,EAAAA,IAAC,QAAA,CAAM,UAAU,gDAAiD,SAAAJ,EAAS,EAC7E,EAEF,MAAO,CAAC,CAAE,SAAAA,CAAA,IAAeI,EAAAA,IAAC,QAAA,CAAM,UAAU,mBAAoB,SAAAJ,EAAS,EACvE,MAAO,CAAC,CAAE,SAAAA,CAAA,IACRI,EAAAA,IAAC,QAAA,CAAM,UAAU,oDAAqD,SAAAJ,EAAS,EAEjF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,+CAAgD,SAAAJ,EAAS,EAEzE,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sHACX,SAAAJ,EACH,EAEF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sDAAuD,SAAAJ,EAAS,EAEhF,GAAI,IAAMI,EAAAA,IAAC,KAAA,CAAG,UAAU,0BAAA,CAA2B,EACnD,IAAK,CAAC,CAAE,IAAAkV,EAAK,IAAAs+B,KACXxzC,EAAAA,IAAC,MAAA,CACC,IAAAkV,EACA,IAAAs+B,EACA,UAAU,uFAAA,CAAA,EAGd,MAAO,CAAC,CAAE,KAAAr7B,EAAM,QAAAs7B,EAAS,GAAGJ,KACtBl7B,IAAS,WAETnY,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAAAyzC,EACA,SAAQ,GACR,UAAU,uCACT,GAAGJ,CAAA,CAAA,EAIHrzC,EAAAA,IAAC,QAAA,CAAM,KAAAmY,EAAa,GAAGk7B,CAAA,CAAO,EAEvC,OAAQ,CAAC,CAAE,SAAAzzC,CAAA,IACTI,EAAAA,IAAC,SAAA,CAAO,UAAU,wCAAyC,SAAAJ,EAAS,EAEtE,GAAI,CAAC,CAAE,SAAAA,CAAA,IAAeI,EAAAA,IAAC,KAAA,CAAG,UAAU,aAAc,SAAAJ,EAAS,EAC3D,IAAK,CAAC,CAAE,SAAAA,KACNI,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAsC,SAAAJ,CAAA,CAAS,CAAA,EAIjE,SAAA2U,CAAA,CAAA,EAEP,CAAA,CACF,CAEJ,oHC7QMm/B,GAA0B,CAC9B,IAAK,UACL,OAAQ,UACR,OAAQ,UACR,QAAS,UACT,QAAS,UACT,MAAO,yBACP,UAAW,yBACX,MAAO,wBACT,EAEMC,GAA2B,CAC/B,IAAK,UACL,OAAQ,UACR,OAAQ,UACR,QAAS,UACT,QAAS,UACT,MAAO,sBACP,UAAW,uBACX,MAAO,sBACT,EAYMC,GAAoC,CAAC,CAAE,QAAAC,EAAS,MAAAh0C,EAAO,MAAAmsC,EAAO,gBAAA8H,EAAiB,OAAAC,KAAa,CAChG,MAAMj5C,EAAIqF,EAAA,EACJ,CAAC6zC,EAAUC,CAAW,EAAIluC,EAAAA,SAAS+tC,CAAe,EAClDI,EAASlI,EAAQ,GAEjBmI,EAASprC,EAAAA,YAAY,IAAMkrC,KAAoB,CAAC9pC,CAAI,EAAG,EAAE,EAG/D,GAAItK,GAAU,MAA+B,OAAOA,GAAU,SAC5D,OACEgF,EAAAA,KAAC,MAAA,CAAI,UAAU,+DAA+D,MAAO,CAAE,YAAa,GAAGqvC,CAAM,IAAA,EAC3G,SAAA,CAAAl0C,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAA,CAAoC,EACnD6zC,IAAY,QACXhvC,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,MAAO,CAAE,MAAOkvC,EAAO,GAAA,EAAO,SAAA,CAAA,IAC9DF,EAAQ,IAAC7zC,MAAC,QAAK,MAAO,CAAE,MAAO+zC,EAAO,KAAA,EAAS,SAAA,IAAA,CAAE,CAAA,EACrD,EAEDK,GAAgBv0C,EAAOk0C,CAAM,CAAA,EAChC,EAIJ,MAAMM,EAAU,MAAM,QAAQx0C,CAAK,EAE7B0lC,GADU8O,EAAWx0C,EAAsB,OAAO,QAAQA,CAAgC,GAC1E,OAChBy0C,EAAcD,EAAU,IAAM,IAC9BE,EAAeF,EAAU,IAAM,IAGrC,OAAI9O,IAAU,EAEV1gC,EAAAA,KAAC,MAAA,CAAI,UAAU,+DAA+D,MAAO,CAAE,YAAa,GAAGqvC,CAAM,IAAA,EAC3G,SAAA,CAAAl0C,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAA,CAAoC,EACnD6zC,IAAY,QACXhvC,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,MAAO,CAAE,MAAOkvC,EAAO,GAAA,EAAO,SAAA,CAAA,IAC9DF,EAAQ,IAAC7zC,MAAC,QAAK,MAAO,CAAE,MAAO+zC,EAAO,KAAA,EAAS,SAAA,IAAA,CAAE,CAAA,EACrD,SAED,OAAA,CAAK,MAAO,CAAE,MAAOA,EAAO,SAAY,SAAA,CAAAO,EAAaC,CAAA,CAAA,CAAa,CAAA,EACrE,SAKD,MAAA,CAEC,SAAA,CAAA1vC,EAAAA,KAAC,MAAA,CACC,UAAU,yHACV,MAAO,CAAE,YAAa,GAAGqvC,CAAM,IAAA,EAC/B,QAASC,EAET,SAAA,CAAAn0C,EAAAA,IAAC,QAAK,UAAU,iFAAiF,MAAO,CAAE,MAAO+zC,EAAO,KAAA,EACrH,WACG/zC,EAAAA,IAACw0C,cAAA,CAAY,UAAU,sBAAsB,QAC5C/yC,EAAAA,aAAA,CAAa,UAAU,sBAAsB,CAAA,CAEpD,EACCoyC,IAAY,QACXhvC,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,MAAO,CAAE,MAAOkvC,EAAO,GAAA,EAAO,SAAA,CAAA,IAC9DF,EAAQ,IAAC7zC,MAAC,QAAK,MAAO,CAAE,MAAO+zC,EAAO,KAAA,EAAS,SAAA,IAAA,CAAE,CAAA,EACrD,EAEF/zC,MAAC,QAAK,MAAO,CAAE,MAAO+zC,EAAO,OAAA,EAAY,SAAAO,EAAY,EACpD,CAACN,GACAnvC,EAAAA,KAAC,OAAA,CAAK,UAAU,WAAW,MAAO,CAAE,MAAOkvC,EAAO,SAAA,EAC/C,SAAA,CAAAM,EAAU,GAAG9O,CAAK,IAAIzqC,EAAE,YAAY,CAAC,GAAK,GAAGyqC,CAAK,IAAIzqC,EAAE,WAAW,CAAC,UACpE,OAAA,CAAK,MAAO,CAAE,MAAOi5C,EAAO,SAAW,SAAA,CAAA,IAAEQ,CAAA,CAAA,CAAa,CAAA,CAAA,CACzD,CAAA,CAAA,CAAA,EAKHP,GACCnvC,EAAAA,KAAAqH,WAAA,CACG,SAAA,CAAAmoC,EACIx0C,EAAoB,IAAI,CAACgM,EAAMnQ,IAC9BsE,MAAC4zC,IAAiB,MAAO/nC,EAAM,MAAOmgC,EAAQ,EAAG,gBAAiBA,EAAQ,EAAG,OAAA+H,GAA9Dr4C,CAA8E,CAC9F,EACD,OAAO,QAAQmE,CAAgC,EAAE,IAAI,CAAC,CAAC9E,EAAG,CAAC,IACzDiF,MAAC4zC,IAAiB,QAAS74C,EAAG,MAAO,EAAG,MAAOixC,EAAQ,EAAG,gBAAiBA,EAAQ,EAAG,OAAA+H,GAAvEh5C,CAAuF,CACvG,EAELiF,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAsC,MAAO,CAAE,YAAa,GAAGk0C,EAAS,EAAE,KAAM,MAAOH,EAAO,OAAA,EAC1G,SAAAQ,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,EAEA,SAASH,GAAgBv0C,EAAgBk0C,EAAoB,CAC3D,OAAIl0C,IAAU,KAAaG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAO+zC,EAAO,QAAS,UAAW,QAAA,EAAY,SAAA,OAAI,EACxFl0C,IAAU,OAAkBG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAO+zC,EAAO,QAAS,UAAW,QAAA,EAAY,SAAA,YAAS,EAClG,OAAOl0C,GAAU,gBAAmB,OAAA,CAAK,MAAO,CAAE,MAAOk0C,EAAO,OAAA,EAAY,SAAA,OAAOl0C,CAAK,EAAE,EAC1F,OAAOA,GAAU,eAAkB,OAAA,CAAK,MAAO,CAAE,MAAOk0C,EAAO,MAAA,EAAW,SAAA,OAAOl0C,CAAK,EAAE,EACxF,OAAOA,GAAU,SAAiBgF,EAAAA,KAAC,OAAA,CAAK,MAAO,CAAE,MAAOkvC,EAAO,MAAA,EAAU,SAAA,CAAA,IAAEl0C,EAAM,GAAA,EAAC,EAC/EG,MAAC,OAAA,CAAK,MAAO,CAAE,MAAO+zC,EAAO,OAAA,EAAY,SAAA,OAAOl0C,CAAK,CAAA,CAAE,CAChE,CAEA,SAAS40C,GAAWh0C,EAAkC,CACpD,OAAOA,IAAU,QAAUkzC,GAAeD,EAC5C,CAIO,MAAM7vC,GAA4C,CAAC,CAAE,IAAA8J,KAAU,CACpE,MAAM7S,EAAIqF,EAAA,EACJgG,EAAgBzF,GAAA,EAChBqzC,EAASj0C,EAAAA,QAAQ,IAAM20C,GAAWtuC,CAAa,EAAG,CAACA,CAAa,CAAC,EACjE,CAAC0Q,EAAM69B,CAAO,EAAI3uC,EAAAA,SAAkB,IAAI,EACxC,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAmBtD,OAjBAC,EAAAA,UAAU,IAAM,EACG,SAAY,CAC3B,GAAI,CACFwM,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMkN,EAAO,MAAMu3B,GAAcllC,CAAG,EACpC+mC,EAAQ,KAAK,MAAMp5B,CAAI,CAAC,CAC1B,OAAStI,EAAK,CACZ5E,EAAStT,EAAE,kBAAkB,CAAC,EAC9B,QAAQ,MAAMkY,CAAG,CACnB,QAAA,CACER,EAAW,EAAK,CAClB,CACF,GACA,CACF,EAAG,CAAC7E,CAAG,CAAC,EAEJ4E,EAEAvS,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIAmO,EAEAnO,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,EACpC,EACF,EAKFnO,EAAAA,IAAC,MAAA,CAAI,UAAU,2EACb,SAAAA,EAAAA,IAAC4zC,GAAA,CAAS,MAAO/8B,EAAM,MAAO,EAAG,gBAAe,GAAC,OAAAk9B,EAAgB,EACnE,CAEJ,gHChMahwC,GAA0C,CAAC,CAAE,IAAA4J,EAAK,SAAAjJ,KAAe,CAC5E,MAAM,EAAIvE,EAAA,EACJ,CAACoS,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChDiJ,EAAe9H,EAAAA,OAAuB,IAAI,EAC1C87B,EAAiB97B,EAAAA,OAA2B,IAAI,EAChD+7B,EAAe/7B,EAAAA,OAAyC,IAAI,EAC5Dg8B,EAAoBh8B,EAAAA,OAA8B,IAAI,EACtDi8B,EAAmBj8B,EAAAA,OAAsB,IAAI,EAC7Ck8B,EAAoBl8B,EAAAA,OAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,EAElDm8B,EAAsBt6B,EAAAA,YAAY,IAAM,CAC5C,GAAI,CAACiG,EAAa,QAAS,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAA,EACxD,MAAMs0B,EAAWt0B,EAAa,QAAQ,YAChCu0B,EAAYv0B,EAAa,QAAQ,aACjChC,EAAQs2B,EAAW,IAAMA,EAAW,IACpCr2B,EAASs2B,EAAY,IAAMA,EAAY,IAC7C,MAAO,CAAE,MAAAv2B,EAAO,OAAAC,CAAA,CAClB,EAAG,CAAA,CAAE,EAECu2B,EAAmBz6B,EAAAA,YAAY,IAAM,CACzC,GAAI,CAACiG,EAAa,SAAW,CAACi0B,EAAa,QAAS,OAEpDj0B,EAAa,QAAQ,UAAY,GACjCg0B,EAAe,QAAU,KAEzB,KAAM,CAAE,MAAAh2B,EAAO,OAAAC,CAAA,EAAWo2B,EAAA,EACpBI,EAAWz2B,EAAQ,IAEnBpR,EAAI,IAAI4mC,GAAYxzB,EAAa,QAAS,CAC9C,KAAM,OACN,YAAa,GACb,gBAAiB,GACjB,SAAU,GACV,IAAK,CACH,IAAK,IACL,OAAQ,EAAA,EAEV,IAAK,CACH,IAAK,GACL,MAAOy0B,EAAW,GAAK,IACvB,WAAYA,EAAW,GAAK,GAC5B,SAAUA,EAAW,GAAK,EAAA,EAE5B,KAAM,CACJ,OAAQ,IAAMx2B,EACd,MAAO,IAAMD,CAAA,CACf,CACD,EAEDpR,EAAE,SAASqnC,EAAa,OAA6C,EACrED,EAAe,QAAUpnC,CAC3B,EAAG,CAACynC,CAAmB,CAAC,EAExBr9B,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACgJ,EAAa,QAAS,OAE3B,IAAI00B,EAAkB,GAEtB,MAAMC,EAAmB,IAAM,CAC7B,GAAID,EAAiB,CACnBA,EAAkB,GAClBN,EAAkB,QAAUC,EAAA,EAC5B,MACF,CAEA,MAAMO,EAAgBP,EAAA,EAChBQ,EAAiBT,EAAkB,QACnCU,EAAY,KAAK,IAAID,EAAe,MAAQD,EAAc,KAAK,EAC/DG,EAAa,KAAK,IAAIF,EAAe,OAASD,EAAc,MAAM,EAEpEE,EAAY,IAAMC,EAAa,KAEnCX,EAAkB,QAAUQ,EAExBT,EAAiB,SACnB,aAAaA,EAAiB,OAAO,EAGvCA,EAAiB,QAAU,OAAO,WAAW,IAAM,CAC7CF,EAAa,SACfO,EAAA,CAEJ,EAAG,GAAG,EACR,EAEA,OAAAN,EAAkB,QAAU,IAAI,eAAe,IAAM,CACnDS,EAAA,CACF,CAAC,EAEDT,EAAkB,QAAQ,QAAQl0B,EAAa,OAAO,EAE/C,IAAM,CACPk0B,EAAkB,SACpBA,EAAkB,QAAQ,WAAA,EAExBC,EAAiB,SACnB,aAAaA,EAAiB,OAAO,CAEzC,CACF,EAAG,CAACE,EAAqBG,CAAgB,CAAC,EAE1Cx9B,EAAAA,UAAU,IAAM,CACd,IAAIg+B,EAAY,GAEhB,MAAM2Q,EAAU,SAAY,CAC1B,GAAK3lC,EAAa,QAElB,CAAAwD,EAAW,EAAI,EACfpE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMkN,EAAO,MAAMu3B,GAAcllC,CAAG,EAC9BinC,EAASC,GAASv5B,EAAM,CAAE,UAAWw5B,GAAkBpwC,CAAQ,EAAG,EAClE0/B,EAAY2Q,GAA4BH,EAAO,OAAQA,EAAO,KAAMlwC,CAAQ,EAElF,GAAI,CAACs/B,EAAW,OAEhBf,EAAa,QAAUmB,EACvBZ,EAAA,EACAhxB,EAAW,EAAK,CAClB,OAASQ,EAAK,CACRgxB,IACF,QAAQ,MAAM,YAAahxB,CAAG,EAC9B5E,EAAS,EAAE,iBAAiB,CAAC,EAC7BoE,EAAW,EAAK,EAEpB,EACF,EAEM+xB,EAAQ,WAAW,IAAM,CAC7B,sBAAsB,IAAM,CAC1BoQ,EAAA,CACF,CAAC,CACH,EAAG,GAAG,EAEN,MAAO,IAAM,CACX3Q,EAAY,GACZ,aAAaO,CAAK,EAClBtB,EAAa,QAAU,KACnBj0B,EAAa,UACfA,EAAa,QAAQ,UAAY,IAEnCg0B,EAAe,QAAU,IAC3B,CACF,EAAG,CAACr1B,EAAKjJ,EAAU8+B,CAAgB,CAAC,EAGlC3+B,EAAAA,KAAC,MAAA,CAAI,UAAU,4EACZ,SAAA,CAAA0N,SACE,MAAA,CAAI,UAAU,6HACb,SAAA1N,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,gKAAA,CAAiK,QAC/K,IAAA,CAAE,UAAU,mEAAoE,SAAA,EAAE,aAAa,CAAA,CAAE,CAAA,CAAA,CACpG,CAAA,CACF,EAGDmO,GAAS,CAACoE,GACTvS,EAAAA,IAAC,MAAA,CAAI,UAAU,6HACb,SAAA6E,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAA7E,EAAAA,IAAC,OAAI,UAAU,yPACb,eAACwkC,EAAAA,gBAAA,CAAgB,UAAU,gEAAgE,CAAA,CAC7F,QACC,IAAA,CAAE,UAAU,sFAAuF,SAAA,EAAE,iBAAiB,EAAE,EACzHxkC,EAAAA,IAAC,IAAA,CAAE,UAAU,uEAAwE,SAAAmO,CAAA,CAAM,CAAA,CAAA,CAC7F,CAAA,CACF,EAGD,CAACA,GACAnO,EAAAA,IAAC,MAAA,CACC,IAAKgP,EACL,UAAU,mDACV,MAAO,CAAE,QAASuD,EAAU,EAAI,CAAA,CAAE,CAAA,CACpC,EAEJ,CAEJ,+GCvLMyiC,GAAkBC,GAAwB,CAC9C,GAAI,CAEF,MAAMC,EADS,IAAI,UAAA,EACA,gBAAgBD,EAAK,iBAAiB,EAGzD,GADgBC,EAAI,cAAc,aAAa,EAClC,OAAOD,EAGpB,MAAME,EADa,IAAI,cAAA,EACO,kBAAkBD,CAAG,EACnD,OAAOE,GAAUD,CAAU,CAC7B,MAAQ,CACN,OAAOF,CACT,CACF,EAEMG,GAAaH,GAAwB,CACzC,MAAMI,EAAU,KACVC,EAAM,eACZ,IAAIC,EAAYN,EAAI,QAAQK,EAAK;AAAA,KAAU,EAEvCE,EAAM,EACV,OAAOD,EACJ,MAAM;AAAA,CAAI,EACV,IAAK9vB,GAAS,CACb,IAAIyuB,EAAS,EACT,SAAS,KAAKzuB,CAAI,EACpB+vB,EAAM,KAAK,IAAIA,EAAM,EAAG,CAAC,EAChB,oBAAoB,KAAK/vB,CAAI,GAAK,CAAC,aAAa,KAAKA,CAAI,IAClEyuB,EAAS,GAEX,MAAMuB,EAASJ,EAAQ,OAAOG,CAAG,EAAI/vB,EACrC,OAAA+vB,GAAOtB,EACAuB,CACT,CAAC,EACA,KAAK;AAAA,CAAI,CACd,EAEaxxC,GAA0C,CAAC,CAAE,IAAA0J,KAAU,CAClE,MAAM7S,EAAIqF,EAAA,EACJ,CAACoU,EAASo+B,CAAU,EAAI5sC,EAAAA,SAAiB,EAAE,EAC3C,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAAE,KAAM2vC,CAAA,EAAgB9D,GAAkBr9B,EAAS,KAAK,EAmB9D,OAjBAvO,EAAAA,UAAU,IAAM,EACD,SAAY,CACvB,GAAI,CACFwM,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMunC,EAAM,MAAM9C,GAAcllC,CAAG,EACnCglC,EAAWqC,GAAeW,CAAG,CAAC,CAChC,OAAS3iC,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACjB5E,EAAStT,EAAE,iBAAiB,CAAC,CAC/B,QAAA,CACE0X,EAAW,EAAK,CAClB,CACF,GACA,CACF,EAAG,CAAC7E,CAAG,CAAC,EAEJ4E,EAEAvS,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIAmO,EAEAnO,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,EACpC,EACF,EAKFnO,EAAAA,IAAC,MAAA,CAAI,UAAU,yDACZ,SAAA01C,EACC11C,EAAAA,IAAC,MAAA,CACC,UAAU,sCACV,wBAAyB,CAAE,OAAQ01C,CAAA,CAAY,CAAA,EAGjD11C,EAAAA,IAAC,MAAA,CAAI,UAAU,gGACZ,WACH,EAEJ,CAEJ,+GC5FM41C,GAAgD,CACpD,IAAK,MACL,IAAK,MACL,IAAK,MACL,KAAM,OACN,IAAK,MACL,IAAK,MACL,KAAM,OACN,KAAM,MACR,EAEMC,GAAanxC,GAAiD,OAClE,MAAM0G,IAAM7J,EAAAmD,EAAS,MAAM,GAAG,EAAE,IAAA,IAApB,YAAAnD,EAA2B,gBAAiB,GACxD,OAAOq0C,GAAcxqC,CAAG,CAC1B,EAEajH,GAAoD,CAAC,CAAE,IAAAwJ,EAAK,SAAAjJ,KAAe,CACtF,MAAM,EAAIvE,EAAA,EACJ,CAACmb,EAAMiQ,CAAO,EAAIxlB,EAAAA,SAAiB,EAAE,EACrC,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAEtDC,EAAAA,UAAU,IAAM,EACD,SAAY,CACvB,GAAI,CACFwM,EAAW,EAAI,EACfpE,EAAS,IAAI,EACbmd,EAAQ,MAAMsnB,GAAcllC,CAAG,CAAC,CAClC,OAASqF,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACjB5E,EAAS,EAAE,sBAAsB,CAAC,CACpC,QAAA,CACEoE,EAAW,EAAK,CAClB,CACF,GACA,CACF,EAAG,CAAC7E,CAAG,CAAC,EAER,MAAMinC,EAAqC90C,EAAAA,QAAQ,IAAM,CACvD,GAAI,CAACwb,EAAM,OAAO,KAClB,GAAI,CACF,OAAOw6B,GAAcx6B,EAAMu6B,GAAUnxC,CAAQ,CAAC,CAChD,OAASsO,EAAK,CACZ,eAAQ,MAAMA,CAAG,EACV,IACT,CACF,EAAG,CAACsI,EAAM5W,CAAQ,CAAC,EAEnB,GAAI6N,EACF,OACEvS,MAAC,OAAI,UAAU,sFACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIJ,GAAImO,GAAS,CAACymC,EACZ,aACG,MAAA,CAAI,UAAU,sFACb,SAAA50C,EAAAA,IAAC,OAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,GAAS,EAAE,uBAAuB,EAAE,EAClE,CAAA,CACF,EAIJ,MAAM4nC,EAAUnB,EAAO,SAAW,OAASA,EAAO,SAAW,OACvDoB,EAAOpB,EAAO,UAAY,CAAA,EAC1BqB,EAAWF,EAAU,gCAAkC,6BAE7D,OACElxC,EAAAA,KAAC,MAAA,CAAI,UAAU,sDAEb,SAAA,CAAA7E,EAAAA,IAAC,OAAI,UAAU,gGACb,SAAA6E,EAAAA,KAAC,MAAA,CAAI,UAAU,yCAEb,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CAAI,UAAU,gGAAA,CAAiG,EAEhHA,EAAAA,IAAC,KAAA,CAAG,UAAU,iCACX,SAAA40C,EAAO,KAAK,IAAI,CAACsB,EAAKx6C,IACrBmJ,OAAC,KAAA,CAAoB,UAAU,8CAE7B,SAAA,CAAA7E,EAAAA,IAAC,MAAA,CACC,UAAW,+IAA+Ii2C,CAAQ,EAAA,CAAA,EAGpKpxC,EAAAA,KAAC,MAAA,CAAI,UAAU,+EACb,SAAA,CAAA7E,MAAC,QAAK,UAAU,mEACb,SAAAm2C,GAAmBD,EAAI,KAAK,EAC/B,EACAl2C,EAAAA,IAAC,OAAA,CAAK,UAAU,uCAAuC,SAAA,IAAC,QACvD,OAAA,CAAK,UAAU,mEACb,SAAAm2C,GAAmBD,EAAI,GAAG,EAC7B,EACArxC,EAAAA,KAAC,OAAA,CAAK,UAAU,sEAAsE,SAAA,CAAA,IAClFqxC,EAAI,IAAMx6C,EAAI,CAAA,EAClB,EACCw6C,EAAI,OACHl2C,EAAAA,IAAC,QAAK,UAAU,2JACb,WAAI,KAAA,CACP,CAAA,EAEJ,EAECk2C,EAAI,OAASA,EAAI,MAAM,OAAS,EAC/Bl2C,EAAAA,IAAC,MAAA,CAAI,UAAU,8KACZ,SAAAk2C,EAAI,MAAM,IAAI,CAAC55B,EAAM85B,IACpBvxC,EAAAA,KAAC,OAAA,CAEC,UAAU,+CACV,MAAOsxC,GAAmB75B,EAAK,KAAK,EAEpC,SAAA,CAAAtc,EAAAA,IAAC,OAAA,CAAK,UAAU,sFACb,SAAAm2C,GAAmB75B,EAAK,KAAK,EAAE,MAAM,EAAG,CAAC,CAAA,CAC5C,EACAtc,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAoB,WAAK,IAAA,CAAK,CAAA,CAAA,EAPzC,KAAKo2C,CAAE,EAAA,CASf,EACH,EAEAp2C,EAAAA,IAAC,IAAA,CACC,UAAW,yIACT+1C,EAAU,+CAAiD,8BAC7D,GAEC,SAAAG,EAAI,IAAA,CAAA,CACP,CAAA,EA9CK,OAAOx6C,CAAC,EAgDjB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,EAGAmJ,EAAAA,KAAC,MAAA,CAAI,UAAU,iTACb,SAAA,CAAAA,OAAC,OAAA,CAAM,SAAA,CAAA+vC,EAAO,KAAK,OAAO,IAAY,EAAVmB,EAAY,iBAAsB,eAAN,CAAqB,EAAE,EAC9EC,EAAK,QACJnxC,EAAAA,KAAAqH,EAAAA,SAAA,CACE,SAAA,CAAAlM,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAuB,SAAA,IAAC,EACxCA,EAAAA,IAAC,OAAA,CAAM,SAAAg2C,EAAK,MAAA,CAAO,CAAA,CAAA,CACrB,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,oHCpIaK,GAAgD,CAAC,CAC5D,KAAAj2B,EACA,MAAA0M,EACA,iBAAAwpB,EAAmB,IACnB,aAAAC,EAAe,IACf,aAAAC,EAAe,IACf,cAAAC,EAAgB,IAChB,WAAAC,EACA,aAAAC,EAAe,qBACf,UAAA/1C,EAAY,EACd,IAAM,CACJ,MAAMoO,EAAe9H,EAAAA,OAAuB,IAAI,EAC1C,CAAC0vC,EAAWC,CAAY,EAAI9wC,EAAAA,SAAiB,IAAM,CACvD,GAAI2wC,GAAc,OAAO,OAAW,IAAa,CAC/C,MAAMI,EAAQ,OAAO,OAAO,aAAa,QAAQJ,CAAU,CAAC,EAC5D,GAAI,CAAC,MAAMI,CAAK,GAAKA,EAAQ,EAAG,OAAOA,CACzC,CACA,OAAOR,CACT,CAAC,EACK,CAACS,EAAUC,CAAW,EAAIjxC,EAAAA,SAAS,EAAK,EACxC,CAACkxC,EAAWC,CAAY,EAAInxC,EAAAA,SAAS,EAAK,EAGhDC,EAAAA,UAAU,IAAM,CACd,GAAI,OAAO,OAAW,IAAa,OACnC,MAAMmxC,EAAK,OAAO,WAAWR,CAAY,EACnCzwC,EAAU,IAAMgxC,EAAaC,EAAG,OAAO,EAC7C,OAAAjxC,EAAA,EACAixC,EAAG,iBAAiB,SAAUjxC,CAAO,EAC9B,IAAMixC,EAAG,oBAAoB,SAAUjxC,CAAO,CACvD,EAAG,CAACywC,CAAY,CAAC,EAGjB3wC,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC+wC,EAAU,OACf,MAAMK,EAAcx8C,GAAkB,CACpC,GAAI,CAACoU,EAAa,QAAS,OAC3B,MAAMiB,EAAOjB,EAAa,QAAQ,sBAAA,EAC5B7R,EAAIvC,EAAE,QAAUqV,EAAK,KACrBonC,EAAMpnC,EAAK,MAAQwmC,EAAgB,EACnCa,EAAe,KAAK,IAAId,EAAca,CAAG,EACzCE,EAAO,KAAK,IAAIhB,EAAc,KAAK,IAAIe,EAAcn6C,CAAC,CAAC,EAC7D05C,EAAaU,CAAI,CACnB,EACMC,EAAW,IAAMR,EAAY,EAAK,EACxC,OAAO,iBAAiB,YAAaI,CAAU,EAC/C,OAAO,iBAAiB,UAAWI,CAAQ,EAC3C,MAAMC,EAAa,SAAS,KAAK,MAAM,OACjCC,EAAa,SAAS,KAAK,MAAM,WACvC,gBAAS,KAAK,MAAM,OAAS,aAC7B,SAAS,KAAK,MAAM,WAAa,OAC1B,IAAM,CACX,OAAO,oBAAoB,YAAaN,CAAU,EAClD,OAAO,oBAAoB,UAAWI,CAAQ,EAC9C,SAAS,KAAK,MAAM,OAASC,EAC7B,SAAS,KAAK,MAAM,WAAaC,CACnC,CACF,EAAG,CAACX,EAAUR,EAAcC,EAAcC,CAAa,CAAC,EAGxDzwC,EAAAA,UAAU,IAAM,CACd,GAAI,GAAC0wC,GAAcK,GACnB,GAAI,CACF,OAAO,aAAa,QAAQL,EAAY,OAAOE,CAAS,CAAC,CAC3D,MAAQ,CAER,CACF,EAAG,CAACA,EAAWF,EAAYK,CAAQ,CAAC,EAEpC,MAAMY,EAAoB5uC,cAAanO,GAAwB,CAC7DA,EAAE,eAAA,EACFo8C,EAAY,EAAI,CAClB,EAAG,CAAA,CAAE,EAEL,OACEnyC,EAAAA,KAAC,MAAA,CACC,IAAKmK,EACL,UAAW,uFAAuFpO,CAAS,GAE3G,SAAA,CAAAZ,EAAAA,IAAC,MAAA,CACC,UAAU,oGACV,MAAOi3C,EAAY,CAAE,MAAO,GAAGL,CAAS,MAAS,OAEhD,SAAAx2B,CAAA,CAAA,EAGHpgB,EAAAA,IAAC,MAAA,CACC,KAAK,YACL,mBAAiB,WACjB,YAAa23C,EACb,UAAW,gHACTZ,EAAW,yBAA2B,yCACxC,GAGA,SAAA/2C,EAAAA,IAAC,OAAA,CAAK,UAAU,qDAAA,CAAsD,CAAA,CAAA,EAExEA,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAA0D,SAAA8sB,CAAA,CAAM,CAAA,CAAA,CAAA,CAGrF,ECrGM8qB,GAAyBr1C,EAAAA,KAAK,IAClC,QAAA,QAAA,EAAA,KAAA,IAAAs1C,EAAA,EAAmC,SAAW,CAAE,QAASh7C,EAAE,oBAAqB,CAClF,EAkBMi7C,GAAetuC,GAAiB,CACpC,MAAMuuC,EAAKzuC,GAAY,CAAU,KAAAE,EAAe,KAAM,EAAA,CAAI,EAC1D,OAAIuuC,IAAO,QAAgBC,EAAAA,UACvBD,IAAO,QAAUA,IAAO,YAAcA,IAAO,QAAUA,IAAO,OAASA,IAAO,OAASA,IAAO,WACzFvuC,EAAK,SAAS,KAAK,GAAKA,EAAK,SAAS,WAAW,EAAIyuC,EAAAA,SAAWC,EAAAA,SAElEC,EAAAA,IACT,EAuBMC,GAAoC,CAAC,CACzC,KAAAjF,EACA,MAAAnH,EACA,aAAAqM,EACA,SAAArE,EACA,SAAAsE,EACA,SAAAC,EACA,QAAAC,EACA,QAAAC,CACF,IAAM,OACJ,MAAMjsC,EAASwnC,EAAS,IAAIb,EAAK,IAAI,EAC/BuF,EAAaL,IAAiBlF,EAAK,KACnCqC,EAAM,CAAE,YAAa,GAAGxJ,EAAQ,GAAK,EAAE,IAAA,EACvC2M,EAAe/9C,GAAqC,CACxD,MAAMqV,EAAQrV,EAAE,cAA8B,sBAAA,EAC9C49C,EAAQrF,EAAK,MAAQ,IAAKljC,CAAI,CAChC,EAEA,GAAIkjC,EAAK,MACP,OACEtuC,EAAAA,KAAAqH,WAAA,CACE,SAAA,CAAArH,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMyzC,EAASnF,EAAK,IAAI,EACjC,aAAcwF,EACd,aAAcF,EACd,UAAU,8IACV,MAAOjD,EAEP,SAAA,CAAAx1C,EAAAA,IAACyB,EAAAA,aAAA,CACC,UAAW,kEACT+K,EAAS,gBAAkB,EAC7B,EAAA,CAAA,EAEDA,QACEosC,aAAA,CAAW,UAAU,0DAA0D,EAEhF54C,EAAAA,IAAC64C,EAAAA,OAAA,CAAO,UAAU,yDAAA,CAA0D,QAE7E,OAAA,CAAK,UAAU,sCAAuC,SAAA1F,EAAK,MAAQ,GAAA,CAAI,CAAA,CAAA,CAAA,EAEzE3mC,KACCjL,EAAA4xC,EAAK,WAAL,YAAA5xC,EAAe,IAAK4R,GAClBnT,EAAAA,IAACo4C,GAAA,CAEC,KAAMjlC,EACN,MAAO64B,EAAQ,EACf,aAAAqM,EACA,SAAArE,EACA,SAAAsE,EACA,SAAAC,EACA,QAAAC,EACA,QAAAC,CAAA,EARKtlC,EAAM,IAAA,GAUd,EACL,EAIJ,MAAM0V,EAAOivB,GAAY3E,EAAK,IAAI,EAElC,OACEtuC,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM0zC,EAASpF,CAAI,EAC5B,aAAcwF,EACd,aAAcF,EACd,UAAW,kGACTC,EAAa,uCAAyC,8CACxD,GACA,MAAOlD,EAEP,SAAA,CAAAx1C,EAAAA,IAAC,OAAA,CAAK,UAAU,uCAAA,CAAwC,EACxDA,EAAAA,IAAC6oB,EAAA,CAAK,UAAU,wDAAA,CAAyD,EACzE7oB,EAAAA,IAAC,OAAA,CAAK,UAAU,sCAAuC,WAAK,KAAK,QAChE,OAAA,CAAK,UAAU,8DACb,SAAA+B,GAAeoxC,EAAK,IAAI,CAAA,CAC3B,CAAA,CAAA,CAAA,CAGN,EAIa9uC,GAA0C,CAAC,CAAE,IAAAsJ,EAAK,aAAAmrC,EAAe,EAAG,cAAAC,KAAoB,OACnG,MAAMj+C,EAAIqF,EAAA,EACJ,CAAC64C,EAAKC,CAAM,EAAIlzC,EAAAA,SAAuB,IAAI,EAC3C,CAACmzC,EAAMC,CAAO,EAAIpzC,EAAAA,SAA6B,IAAI,EACnD,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChD,CAACiuC,EAAUC,CAAW,EAAIluC,EAAAA,aAA0B,IAAI,CAAC,EAAE,CAAC,CAAC,EAC7D,CAACqzC,EAAUC,CAAW,EAAItzC,EAAAA,SAAiC,IAAI,EAC/D,CAACuzC,EAAgBC,CAAiB,EAAIxzC,EAAAA,SAAS,EAAK,EACpD,CAACyzC,EAAcC,CAAe,EAAI1zC,EAAAA,SAAwB,IAAI,EAC9D,CAAC2zC,EAAUC,CAAW,EAAI5zC,EAAAA,SAA+B,IAAI,EAC7D6zC,EAAmB1yC,EAAAA,OAAO6xC,CAAa,EAE7C/yC,EAAAA,UAAU,IAAM,CACd4zC,EAAiB,QAAUb,CAC7B,EAAG,CAACA,CAAa,CAAC,EAElB/yC,EAAAA,UAAU,IAAM,CACd,IAAI6kC,EAAY,GA0BhB,OAzBa,SAAY,CACvB,GAAI,CACFr4B,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMs+B,EAAM,MAAM,MAAM/+B,CAAG,EAC3B,GAAI,CAAC++B,EAAI,GAAI,MAAM,IAAI,MAAM,MAAM,EACnC,MAAMmN,EAAM,MAAMnN,EAAI,YAAA,EAChBxwC,EAAI,MAAM49C,GAAQD,CAAG,EAC3B,GAAIhP,EAAW,OACf,MAAMkP,EAAUC,GAAe99C,CAAC,EAC1B+9C,EAAOC,GAAaH,CAAO,EACjCd,EAAO/8C,CAAC,EACRi9C,EAAQc,CAAI,EACZ,MAAM/U,EAAO,IAAI,IAAY,CAAC,EAAE,CAAC,EACjC,GAAI+U,EAAK,SACP,UAAWt+C,KAAKs+C,EAAK,SAAct+C,EAAE,OAAOupC,EAAK,IAAIvpC,EAAE,IAAI,EAE7Ds4C,EAAY/O,CAAI,CAClB,OAASlyB,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACZ63B,GAAWz8B,EAAStT,EAAE,iBAAiB,CAAC,CAC/C,QAAA,CACO+vC,GAAWr4B,EAAW,EAAK,CAClC,CACF,GACA,EACO,IAAM,CACXq4B,EAAY,EACd,CACF,EAAG,CAACl9B,CAAG,CAAC,EAGR3H,EAAAA,UAAU,IACD,IAAM,CACPozC,GAAA,MAAAA,EAAU,SAAS,IAAI,gBAAgBA,EAAS,OAAO,CAC7D,EACC,CAACA,CAAQ,CAAC,EAEb,MAAMe,EAAar6C,EAAAA,QAAgC,IAAM,CACvD,GAAI,CAACo5C,EAAM,OAAO,KAClB,IAAI/zC,EAAQ,EACRi1C,EAAO,EACP3gC,EAAO,EACX,MAAM4gC,EAAQx/C,GAAmB,OAC3BA,EAAE,OACAA,EAAE,MAAMu/C,KACZ74C,EAAA1G,EAAE,WAAF,MAAA0G,EAAY,QAAQ84C,KAEpBl1C,IACAsU,GAAQ5e,EAAE,KAEd,EACA,OAAAw/C,EAAKnB,CAAI,EACF,CAAE,MAAA/zC,EAAO,KAAAi1C,EAAM,KAAA3gC,CAAA,CACxB,EAAG,CAACy/B,CAAI,CAAC,EAGTlzC,EAAAA,UAAU,IAAM,OACd,OAAAzE,EAAAq4C,EAAiB,UAAjB,MAAAr4C,EAAA,KAAAq4C,EAA2BO,GACpB,IAAM,QACX54C,EAAAq4C,EAAiB,UAAjB,MAAAr4C,EAAA,KAAAq4C,EAA2B,KAC7B,CACF,EAAG,CAACO,CAAU,CAAC,EAEf,MAAMG,EAAevxC,cAAawxC,GAAiB,CACjDtG,EAAa9pC,GAAS,CACpB,MAAMulC,EAAO,IAAI,IAAIvlC,CAAI,EACzB,OAAIulC,EAAK,IAAI6K,CAAI,EAAG7K,EAAK,OAAO6K,CAAI,EAC/B7K,EAAK,IAAI6K,CAAI,EACX7K,CACT,CAAC,CACH,EAAG,CAAA,CAAE,EAEC8K,EAAczxC,EAAAA,YAAY,CAACuS,EAAcrL,IAAkB,CAC/D0pC,EAAY,CACV,KAAAr+B,EACA,EAAGrL,EAAK,MAAQ,EAChB,EAAGA,EAAK,IAAMA,EAAK,OAAS,CAAA,CAC7B,CACH,EAAG,CAAA,CAAE,EAECwqC,EAAc1xC,EAAAA,YAAY,IAAM,CACpC4wC,EAAY,IAAI,CAClB,EAAG,CAAA,CAAE,EAECe,EAAe3xC,EAAAA,YACnB,MAAOoqC,GAAsB,CAC3B,GAAI,GAAC6F,GAAO7F,EAAK,OACjB,CAAIiG,GAAA,MAAAA,EAAU,SAAS,IAAI,gBAAgBA,EAAS,OAAO,EAC3DG,EAAkB,EAAI,EACtBE,EAAgB,IAAI,EAEpB,GAAI,CACF,MAAMkB,EAAOC,GAAczH,EAAK,IAAI,EAC9BxG,EAAO,MAAMkO,GAAiB7B,EAAK7F,EAAK,KAAMwH,IAAS,2BAA6BA,EAAO,MAAS,EACpGG,EAAU,IAAI,gBAAgBnO,CAAI,EACxC0M,EAAY,CAAE,KAAMlG,EAAK,KAAM,KAAMA,EAAK,KAAM,KAAMA,EAAK,KAAM,QAAA2H,CAAA,CAAS,CAC5E,OAAS9nC,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACjBymC,EAAgB,QAAQ,CAC1B,QAAA,CACEF,EAAkB,EAAK,CACzB,EACF,EACA,CAACP,EAAKI,CAAQ,CAAA,EAGhB,GAAI7mC,EACF,OACEvS,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIJ,GAAImO,GAAS,CAAC+qC,EACZ,aACG,MAAA,CAAI,UAAU,qEACb,SAAAl5C,EAAAA,IAAC,OAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,GAASrT,EAAE,kBAAkB,EAAE,EAC7D,CAAA,CACF,EAKJ,MAAMigD,QACH,MAAA,CAAI,UAAU,0CACZ,UAAAx5C,EAAA23C,EAAK,WAAL,YAAA33C,EAAe,IAAK4R,GACnBnT,EAAAA,IAACo4C,GAAA,CAEC,KAAMjlC,EACN,MAAO,EACP,cAAcimC,GAAA,YAAAA,EAAU,OAAQ,KAChC,SAAApF,EACA,SAAUsG,EACV,SAAUI,EACV,QAASF,EACT,QAASC,CAAA,EARJtnC,EAAM,IAAA,GAWjB,EAII6nC,EACJn2C,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACZ,SAAA,CAAA,CAACu0C,GACAp5C,EAAAA,IAAC,MAAA,CAAI,UAAU,gGAAgG,SAAA,eAE/G,EAEDo5C,GAAYE,GACXt5C,EAAAA,IAAC,MAAA,CAAI,UAAU,0DACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,iHAAA,CAAkH,CAAA,CACnI,EAEDo5C,GAAY,CAACE,GAAkBE,SAC7B,MAAA,CAAI,UAAU,gFACZ,SAAAA,EACH,EAEDJ,GAAY,CAACE,GAAkB,CAACE,GAC/Bx5C,EAAAA,IAAAkM,EAAAA,SAAA,CACE,SAAAlM,EAAAA,IAAC,MAAA,CAAI,UAAU,2EACb,SAAAA,EAAAA,IAACiM,EAAAA,SAAA,CACC,eACG,MAAA,CAAI,UAAU,0DACb,SAAAjM,EAAAA,IAAC,MAAA,CAAI,UAAU,iHAAA,CAAkH,CAAA,CACnI,EAGF,SAAAA,EAAAA,IAAC43C,GAAA,CACC,KAAK,QACL,MAAO,CAAC,CAAE,KAAMwB,EAAS,KAAM,IAAKA,EAAS,QAAS,KAAMwB,GAAcxB,EAAS,IAAI,EAAG,EAC1F,aAAc,EACd,gBAAiBN,EAAe,CAAA,CAAA,CAClC,CAAA,EAEJ,CAAA,CACF,CAAA,EAEJ,EAGF,OACEj0C,EAAAA,KAAAqH,WAAA,CACE,SAAA,CAAAlM,EAAAA,IAACq2C,GAAA,CACC,KAAM0E,EACN,MAAOC,EACP,iBAAkB,IAClB,aAAc,IACd,aAAc,IACd,WAAW,oBAAA,CAAA,EAGZtB,GACC,OAAO,SAAa,KACpB5sC,GAAAA,aACE9M,EAAAA,IAAC,MAAA,CACC,UAAU,6KACV,MAAO,CACL,KAAM,GAAG05C,EAAS,CAAC,KACnB,IAAK,GAAGA,EAAS,CAAC,KAClB,UAAW,kBAAA,EAGZ,SAAAA,EAAS,IAAA,CAAA,EAEZ,SAAS,IAAA,CACX,EACJ,CAEJ,+GC9Xan1C,GAA4C,CAAC,CACxD,IAAAoJ,EACA,SAAAjJ,EACA,SAAAu2C,EAAW,GACX,YAAAC,EAAc,EAChB,IAAM,CACJ,MAAMpgD,EAAIqF,EAAA,EACJ,CAACoU,EAASo+B,CAAU,EAAI5sC,EAAAA,SAAiB,EAAE,EAC3C,CAACwM,EAASC,CAAU,EAAIzM,EAAAA,SAAS,EAAI,EACrC,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAwB,IAAI,EAChDo1C,EAAWC,GAAwB12C,CAAQ,EAC3C,CAAE,KAAMgxC,CAAA,EAAgB9D,GAC5BuJ,IAAa,OAAS5mC,EAAU,GAChC4mC,CAAA,EAqBF,OAlBAn1C,EAAAA,UAAU,IAAM,EACG,SAAY,CAC3B,GAAI,CACFwM,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMkN,EAAO,MAAMu3B,GAAcllC,CAAG,EACpCglC,EAAWr3B,CAAI,CACjB,OAAStI,EAAK,CACZ5E,EAAStT,EAAE,kBAAkB,CAAC,EAC9B,QAAQ,MAAMkY,CAAG,CACnB,QAAA,CACER,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC7E,CAAG,CAAC,EAEJ4E,EAEAvS,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIAmO,EAEAnO,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAmO,CAAA,CAAM,EACpC,EACF,EAKA+sC,GAAgBC,IAAa,OAE7Bn7C,EAAAA,IAAC,MAAA,CAAI,UAAU,+CACb,SAAAA,EAAAA,IAAC,SAAA,CACC,OAAQuU,EACR,QAAQ,oBACR,UAAU,qCACV,MAAO7P,CAAA,CAAA,EAEX,QAMD,MAAA,CAAI,UAAU,yDACZ,SAAAy2C,IAAa,QAAU,CAACzF,EACvB11C,EAAAA,IAAC,MAAA,CACC,UAAW,yDACTi7C,EAAW,0CAA4C,oBACzD,GAEC,SAAA1mC,CAAA,CAAA,EAGHvU,EAAAA,IAAC,MAAA,CACC,UAAW,uCAAuCi7C,EAAW,GAAK,SAAS,GAC3E,wBAAyB,CAAE,OAAQvF,CAAA,CAAY,CAAA,EAGrD,CAEJ","x_google_ignoreList":[21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../file-preview-core/lib/index.mjs","../src/i18n/LocaleContext.tsx","../src/ThemeContext.tsx","../src/renderers/Image/toolbar.tsx","../src/renderers/Pdf/toolbar.tsx","../src/renderers/Epub/toolbar.tsx","../src/renderers/Mobi/toolbar.tsx","../src/renderers/Zip/toolbar.tsx","../src/renderers/Text/toolbar.tsx","../src/renderers/Markdown/toolbar.tsx","../src/RequestContext.tsx","../src/renderers/lazy.tsx","../src/renderers/Unsupported/index.tsx","../src/renderers/RendererLoading.tsx","../src/FilePreviewContent.tsx","../src/FilePreviewModal.tsx","../src/FilePreviewEmbed.tsx","../src/utils/pdfConfig.ts","../src/index.ts","../src/renderers/Image/index.tsx","../src/renderers/Pdf/index.tsx","../src/renderers/Docx/index.tsx","../src/renderers/Xlsx/index.tsx","../src/renderers/Pptx/index.tsx","../src/renderers/Msg/index.tsx","../src/renderers/Epub/index.tsx","../src/renderers/Mobi/index.tsx","../src/renderers/Video/index.tsx","../src/hooks/useAudioPlayer.ts","../src/renderers/Audio/index.tsx","../src/hooks/useShikiHighlight.ts","../src/renderers/Markdown/index.tsx","../src/renderers/Json/index.tsx","../src/renderers/Csv/index.tsx","../src/renderers/Xml/index.tsx","../src/renderers/Subtitle/index.tsx","../src/components/ResizableSplit.tsx","../src/renderers/Zip/index.tsx","../src/renderers/Text/index.tsx"],"sourcesContent":["import j from \"jszip\";\nfunction A(e) {\n try {\n const n = new URL(e).pathname.split(\"/\").pop() || \"file\";\n return decodeURIComponent(n);\n } catch {\n const t = e.split(\"/\").pop() || \"file\";\n return decodeURIComponent(t);\n }\n}\nfunction k(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase()) || \"\";\n return {\n // 图片\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n // 视频\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n ogg: \"video/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n m4v: \"video/x-m4v\",\n \"3gp\": \"video/3gpp\",\n flv: \"video/x-flv\",\n // 音频\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n m4a: \"audio/mp4\",\n aac: \"audio/aac\",\n flac: \"audio/flac\",\n // 文档\n pdf: \"application/pdf\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ppt: \"application/vnd.ms-powerpoint\",\n msg: \"application/vnd.ms-outlook\",\n mobi: \"application/x-mobipocket-ebook\",\n azw: \"application/vnd.amazon.ebook\",\n azw3: \"application/vnd.amazon.ebook\",\n kf8: \"application/vnd.amazon.ebook\",\n // 文本\n txt: \"text/plain\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n json: \"application/json\",\n xml: \"application/xml\",\n html: \"text/html\",\n css: \"text/css\",\n js: \"text/javascript\",\n ts: \"text/typescript\",\n jsx: \"text/javascript\",\n tsx: \"text/typescript\",\n py: \"text/x-python\",\n java: \"text/x-java\",\n cpp: \"text/x-c++src\",\n c: \"text/x-csrc\",\n cs: \"text/x-csharp\",\n php: \"text/x-php\",\n rb: \"text/x-ruby\",\n go: \"text/x-go\",\n rs: \"text/x-rust\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n toml: \"text/toml\",\n ini: \"text/plain\",\n env: \"text/plain\",\n diff: \"text/x-diff\",\n patch: \"text/x-diff\",\n log: \"text/plain\",\n csv: \"text/csv\",\n tsv: \"text/tab-separated-values\",\n srt: \"application/x-subrip\",\n vtt: \"text/vtt\",\n zip: \"application/zip\"\n }[t] || \"application/octet-stream\";\n}\nfunction U(e, t = 0) {\n if (e instanceof File)\n return {\n id: `file-${Date.now()}-${t}`,\n name: e.name,\n url: URL.createObjectURL(e),\n type: e.type || k(e.name),\n size: e.size\n };\n if (typeof e == \"string\") {\n const o = A(e);\n return {\n id: `url-${Date.now()}-${t}`,\n name: o,\n url: e,\n type: k(o)\n };\n }\n return {\n id: e.id || `link-${Date.now()}-${t}`,\n name: e.name,\n url: e.url,\n type: e.type || k(e.name),\n size: e.size\n };\n}\nfunction dt(e) {\n return e.map((t, o) => U(t, o));\n}\nfunction ut(e) {\n var r;\n const t = ((r = e.name.split(\".\").pop()) == null ? void 0 : r.toLowerCase()) || \"\", o = e.type.toLowerCase();\n if (o.startsWith(\"image/\") || [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"svg\"].includes(t))\n return \"image\";\n if (o.includes(\"pdf\") || t === \"pdf\")\n return \"pdf\";\n if (o.includes(\"wordprocessingml\") || t === \"docx\")\n return \"docx\";\n if (o.includes(\"spreadsheetml\") || t === \"xlsx\")\n return \"xlsx\";\n if (o.includes(\"presentationml\") || t === \"pptx\" || t === \"ppt\")\n return \"pptx\";\n if (o.includes(\"ms-outlook\") || t === \"msg\")\n return \"msg\";\n if (o.includes(\"epub\") || t === \"epub\")\n return \"epub\";\n if ([\"mobi\", \"azw\", \"azw3\", \"kf8\"].includes(t) || o === \"application/x-mobipocket-ebook\" || o === \"application/vnd.amazon.ebook\")\n return \"mobi\";\n if ([\"csv\", \"tsv\"].includes(t) || o === \"text/csv\" || o === \"text/tab-separated-values\")\n return \"csv\";\n if (t === \"xml\" || o === \"application/xml\" || o === \"text/xml\")\n return \"xml\";\n if ([\"srt\", \"vtt\", \"lrc\", \"elrc\", \"ass\", \"ssa\", \"ttml\", \"dfxp\"].includes(t) || o === \"text/vtt\" || o === \"application/x-subrip\" || o === \"application/ttml+xml\")\n return \"subtitle\";\n if (t === \"zip\" || o === \"application/zip\" || o === \"application/x-zip-compressed\")\n return \"zip\";\n if (o.startsWith(\"video/\") || [\"mp4\", \"webm\", \"ogg\", \"ogv\", \"mov\", \"avi\", \"mkv\", \"m4v\", \"3gp\", \"flv\"].includes(t))\n return \"video\";\n if (o.startsWith(\"audio/\") || [\"mp3\", \"wav\", \"ogg\", \"m4a\", \"flac\", \"aac\"].includes(t))\n return \"audio\";\n if (t === \"md\" || t === \"markdown\")\n return \"markdown\";\n if (o === \"application/json\" || t === \"json\")\n return \"json\";\n const n = [\n \"txt\",\n \"log\",\n \"lock\",\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"py\",\n \"java\",\n \"cpp\",\n \"c\",\n \"h\",\n \"cs\",\n \"php\",\n \"rb\",\n \"go\",\n \"mod\",\n \"rs\",\n \"swift\",\n \"kt\",\n \"lua\",\n \"vim\",\n \"html\",\n \"css\",\n \"scss\",\n \"sass\",\n \"less\",\n \"yaml\",\n \"yml\",\n \"toml\",\n \"ini\",\n \"conf\",\n \"env\",\n \"diff\",\n \"patch\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"sql\"\n ];\n return o.startsWith(\"text/\") || n.includes(t) ? \"text\" : \"unsupported\";\n}\nfunction ft(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase()) || \"\";\n return {\n js: \"javascript\",\n jsx: \"jsx\",\n ts: \"typescript\",\n tsx: \"tsx\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n cs: \"csharp\",\n php: \"php\",\n rb: \"ruby\",\n go: \"go\",\n mod: \"go\",\n rs: \"rust\",\n swift: \"swift\",\n kt: \"kotlin\",\n lua: \"lua\",\n vim: \"vim\",\n scala: \"scala\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n json: \"json\",\n xml: \"xml\",\n html: \"html\",\n css: \"css\",\n scss: \"scss\",\n sass: \"sass\",\n less: \"less\",\n sql: \"sql\",\n yaml: \"yaml\",\n yml: \"yaml\",\n toml: \"toml\",\n ini: \"ini\",\n env: \"bash\",\n conf: \"nginx\",\n diff: \"diff\",\n patch: \"diff\",\n log: \"log\",\n md: \"markdown\",\n txt: \"text\"\n }[t] || \"text\";\n}\nfunction pt(e) {\n var n;\n const t = ((n = e.split(\".\").pop()) == null ? void 0 : n.toLowerCase().split(\"?\")[0]) || \"\";\n return {\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n ogg: \"video/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n m4v: \"video/mp4\",\n \"3gp\": \"video/3gpp\",\n flv: \"video/x-flv\"\n }[t] || \"video/mp4\";\n}\nfunction mt(e) {\n return e < 1024 ? `${e} B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)} KB` : `${(e / (1024 * 1024)).toFixed(1)} MB`;\n}\nfunction ht(e) {\n if (!isFinite(e) || isNaN(e) || e < 0) return \"0:00\";\n const t = Math.floor(e / 60), o = Math.floor(e % 60);\n return `${t}:${o.toString().padStart(2, \"0\")}`;\n}\nfunction gt(e) {\n var o;\n return (((o = e.split(\".\").pop()) == null ? void 0 : o.toLowerCase()) || \"\") === \"tsv\" ? \"\t\" : \",\";\n}\nfunction xt(e, t = {}) {\n const o = t.delimiter ?? \",\", n = t.firstRowAsHeader ?? !0, r = [];\n let a = [], i = \"\", l = !1, s = 0;\n const c = e.length;\n for (; s < c; ) {\n const f = e[s];\n if (l) {\n if (f === '\"') {\n if (e[s + 1] === '\"') {\n i += '\"', s += 2;\n continue;\n }\n l = !1, s += 1;\n continue;\n }\n i += f, s += 1;\n continue;\n }\n if (f === '\"') {\n l = !0, s += 1;\n continue;\n }\n if (f === o) {\n a.push(i), i = \"\", s += 1;\n continue;\n }\n if (f === \"\\r\") {\n e[s + 1] === `\n` && (s += 1), a.push(i), r.push(a), a = [], i = \"\", s += 1;\n continue;\n }\n if (f === `\n`) {\n a.push(i), r.push(a), a = [], i = \"\", s += 1;\n continue;\n }\n i += f, s += 1;\n }\n for ((i.length > 0 || a.length > 0) && (a.push(i), r.push(a)); r.length > 0; ) {\n const f = r[r.length - 1];\n if (f.length === 1 && f[0] === \"\")\n r.pop();\n else\n break;\n }\n let d = [], p = r;\n n && r.length > 0 && (d = r[0], p = r.slice(1));\n const u = Math.max(\n d.length,\n ...p.map((f) => f.length),\n 0\n );\n for (const f of p)\n for (; f.length < u; ) f.push(\"\");\n return {\n header: d,\n rows: p,\n columnCount: u,\n delimiter: o\n };\n}\nfunction $(e) {\n const t = e instanceof Uint8Array ? e : new Uint8Array(e);\n if (t.length >= 3 && t[0] === 239 && t[1] === 187 && t[2] === 191)\n return new TextDecoder(\"utf-8\").decode(t);\n if (t.length >= 2 && t[0] === 255 && t[1] === 254)\n return new TextDecoder(\"utf-16le\").decode(t);\n if (t.length >= 2 && t[0] === 254 && t[1] === 255)\n return new TextDecoder(\"utf-16be\").decode(t);\n try {\n return new TextDecoder(\"utf-8\", { fatal: !0 }).decode(t);\n } catch {\n }\n try {\n return new TextDecoder(\"gbk\").decode(t);\n } catch {\n }\n return new TextDecoder(\"utf-8\", { fatal: !1 }).decode(t);\n}\nconst I = $;\nasync function bt(e, t) {\n const o = !!t && (\"fetcher\" in t || \"init\" in t), n = o ? t.fetcher ?? fetch : fetch, r = o ? t.init : t, a = await n(e, r);\n if (!a.ok) throw new Error(`请求失败: ${a.status}`);\n const i = await a.arrayBuffer();\n return $(i);\n}\nasync function B(e, t) {\n if (e)\n return typeof e == \"function\" ? await e(t) : e;\n}\nfunction W(e, t) {\n if (!e && !t) return;\n if (!e) return t;\n if (!t) return e;\n const o = new Headers(e.headers || {});\n return t.headers && new Headers(t.headers).forEach((n, r) => {\n o.set(r, n);\n }), {\n ...e,\n ...t,\n headers: o\n };\n}\nfunction Ft(e) {\n const t = (e == null ? void 0 : e.requestHandler) ?? ((n, r) => fetch(n, r)), o = e == null ? void 0 : e.requestInit;\n return async (n, r) => {\n const a = await B(o, n), i = W(a, r);\n return t(n, i);\n };\n}\nasync function wt(e, t = fetch, o) {\n const n = await t(e, o);\n if (!n.ok) throw new Error(`请求失败: ${n.status}`);\n const r = await n.blob();\n return URL.createObjectURL(r);\n}\nasync function vt(e, t, o = fetch, n) {\n const r = await o(e, n);\n if (!r.ok) throw new Error(`请求失败: ${r.status}`);\n const a = await r.blob(), i = URL.createObjectURL(a);\n try {\n const l = document.createElement(\"a\");\n l.href = i, l.download = t, l.style.display = \"none\", document.body.appendChild(l), l.click(), document.body.removeChild(l);\n } finally {\n setTimeout(() => URL.revokeObjectURL(i), 1e3);\n }\n}\nfunction z(e) {\n const t = e.trim().replace(\",\", \".\"), o = t.split(\":\").map((n) => n.trim());\n if (o.length === 3) {\n const [n, r, a] = o;\n return Number(n) * 3600 + Number(r) * 60 + Number(a);\n }\n if (o.length === 2) {\n const [n, r] = o;\n return Number(n) * 60 + Number(r);\n }\n return Number(t) || 0;\n}\nfunction yt(e) {\n if (!isFinite(e) || e < 0) return \"00:00:00.000\";\n const t = Math.floor(e * 1e3), o = t % 1e3, n = Math.floor(t / 1e3) % 60, r = Math.floor(t / 6e4) % 60, a = Math.floor(t / 36e5), i = (l, s = 2) => l.toString().padStart(s, \"0\");\n return `${i(a)}:${i(r)}:${i(n)}.${i(o, 3)}`;\n}\nconst E = /(\\d{1,2}:)?\\d{1,2}:\\d{1,2}[.,]\\d{1,3}\\s*-->\\s*(\\d{1,2}:)?\\d{1,2}:\\d{1,2}[.,]\\d{1,3}/, Z = /^\\s*\\[\\d{1,2}:\\d{1,2}(?:[.:]\\d{1,3})?\\]/;\nfunction V(e) {\n const t = e.replace(/^\\uFEFF/, \"\").trimStart();\n return /^WEBVTT/.test(t) ? \"vtt\" : /^<\\?xml/i.test(t) || /<tt\\b[^>]*>/i.test(t) ? \"ttml\" : /^\\[Script Info\\]/im.test(t) || /^Dialogue:/m.test(t) ? /ScriptType:\\s*v4\\.00\\s*$/im.test(t) ? \"ssa\" : \"ass\" : Z.test(t) || /^\\[(ti|ar|al|au|by|length|offset|re|ve):/im.test(t) ? /<\\d{1,2}:\\d{1,2}(?:[.:]\\d{1,3})?>/.test(t) ? \"elrc\" : \"lrc\" : \"srt\";\n}\nfunction L(e, t) {\n const n = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), r = [];\n let a, i = 0;\n if (t === \"vtt\") {\n const l = [];\n for (; i < n.length && n[i].trim() !== \"\"; )\n l.push(n[i]), i++;\n for (a = l.join(`\n`); i < n.length && n[i].trim() === \"\"; ) i++;\n }\n for (; i < n.length; ) {\n for (; i < n.length && n[i].trim() === \"\"; ) i++;\n if (i >= n.length) break;\n let l, s = null;\n if (E.test(n[i]))\n s = n[i], i++;\n else if (l = n[i].trim() || void 0, i++, i < n.length && E.test(n[i]))\n s = n[i], i++;\n else\n continue;\n if (!s) continue;\n const c = s.match(/([\\d:.,]+)\\s*-->\\s*([\\d:.,]+)/);\n if (!c) continue;\n const d = z(c[1]), p = z(c[2]), u = [];\n for (; i < n.length && n[i].trim() !== \"\"; )\n u.push(n[i]), i++;\n r.push({ id: l, start: d, end: p, text: u.join(`\n`) });\n }\n return { format: t, cues: r, header: a };\n}\nfunction T(e, t, o) {\n const n = Number(e), r = Number(t);\n let a = 0;\n if (o) {\n const i = (o + \"000\").slice(0, 3);\n a = Number(i);\n }\n return n * 60 + r + a / 1e3;\n}\nfunction R(e, t) {\n const o = /^\\[(ti|ar|al|au|by|length|offset|re|ve):(.*)\\]$/i.exec(e.trim());\n if (!o) return !1;\n const n = o[1].toLowerCase(), r = o[2].trim();\n if (t.metadata[n] = r, n === \"offset\") {\n const a = Number(r);\n isNaN(a) || (t.offsetMs = a);\n }\n return !0;\n}\nfunction O(e) {\n const o = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), n = { metadata: {}, offsetMs: 0 }, r = /\\[(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?\\]/g, a = [];\n for (const s of o) {\n const c = s.trim();\n if (!c || R(c, n)) continue;\n const d = [];\n let p = 0;\n r.lastIndex = 0;\n let u;\n for (; (u = r.exec(c)) !== null && u.index === p; )\n d.push(T(u[1], u[2], u[3])), p = u.index + u[0].length;\n if (d.length === 0) continue;\n const f = c.slice(p).trim();\n for (const m of d)\n a.push({ start: m, text: f });\n }\n a.sort((s, c) => s.start - c.start);\n const i = n.offsetMs / 1e3;\n return { format: \"lrc\", cues: a.map((s, c) => {\n const d = Math.max(0, s.start - i), p = a[c + 1], u = p ? Math.max(d, p.start - i) : d + 5;\n return { start: d, end: u, text: s.text };\n }), metadata: n.metadata };\n}\nfunction q(e) {\n const o = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`), n = { metadata: {}, offsetMs: 0 }, r = /\\[(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?\\]/g, a = /<(\\d{1,2}):(\\d{1,2})(?:[.:](\\d{1,3}))?>/g, i = [];\n for (const c of o) {\n const d = c.trim();\n if (!d || R(d, n)) continue;\n const p = [];\n let u = 0;\n r.lastIndex = 0;\n let f;\n for (; (f = r.exec(d)) !== null && f.index === u; )\n p.push(T(f[1], f[2], f[3])), u = f.index + f[0].length;\n if (p.length === 0) continue;\n const m = d.slice(u);\n for (const h of p)\n i.push({ start: h, raw: m });\n }\n i.sort((c, d) => c.start - d.start);\n const l = n.offsetMs / 1e3;\n return { format: \"elrc\", cues: i.map((c, d) => {\n const p = [];\n let u = \"\", f = 0, m = null;\n a.lastIndex = 0;\n let h;\n for (; (h = a.exec(c.raw)) !== null; ) {\n const F = c.raw.slice(f, h.index);\n m !== null && F && p.push({ start: Math.max(0, m - l), text: F }), u += F, m = T(h[1], h[2], h[3]), f = h.index + h[0].length;\n }\n const b = c.raw.slice(f);\n m !== null && b && p.push({ start: Math.max(0, m - l), text: b }), u += b;\n const g = Math.max(0, c.start - l), x = i[d + 1], v = x ? Math.max(g, x.start - l) : g + 5;\n return {\n start: g,\n end: v,\n text: u.trim(),\n words: p.length ? p : void 0\n };\n }), metadata: n.metadata };\n}\nfunction N(e) {\n const t = e.trim().split(\":\");\n return t.length !== 3 ? 0 : Number(t[0]) * 3600 + Number(t[1]) * 60 + Number(t[2].replace(\",\", \".\"));\n}\nfunction D(e, t) {\n const n = e.replace(/\\r\\n?/g, `\n`).replace(/^\\uFEFF/, \"\").split(`\n`);\n let r = \"\", a = [];\n const i = [], l = [];\n for (const s of n) {\n const c = s.replace(/\\s+$/, \"\"), d = c.trim(), p = /^\\[([^\\]]+)\\]\\s*$/.exec(d);\n if (p) {\n r = p[1].toLowerCase(), l.push(c);\n continue;\n }\n if (r !== \"events\") {\n l.push(c);\n continue;\n }\n const u = /^Format:\\s*(.+)$/i.exec(d);\n if (u) {\n a = u[1].split(\",\").map((w) => w.trim());\n continue;\n }\n const f = /^(Dialogue|Comment):\\s*(.+)$/i.exec(d);\n if (!f || f[1].toLowerCase() === \"comment\" || a.length === 0) continue;\n const m = a.length, h = f[2].split(\",\"), b = h.slice(0, m - 1), g = h.slice(m - 1).join(\",\"), x = {};\n a.forEach((w, y) => {\n x[w] = y === m - 1 ? g : b[y] ?? \"\";\n });\n const v = N(x.Start || \"\"), F = N(x.End || \"\"), _ = (x.Text || \"\").replace(/\\\\N/g, `\n`).replace(/\\\\n/g, `\n`).replace(/\\\\h/g, \" \").replace(/\\{[^}]*\\}/g, \"\");\n i.push({ start: v, end: F, text: _, style: x.Style });\n }\n return i.sort((s, c) => s.start - c.start), {\n format: t,\n cues: i,\n header: l.join(`\n`).trim() || void 0\n };\n}\nfunction S(e) {\n const t = e.trim();\n if (!t) return 0;\n const o = /^(\\d+(?:\\.\\d+)?)(h|m|s|ms|f|t)$/i.exec(t);\n if (o) {\n const r = Number(o[1]), a = o[2].toLowerCase();\n return a === \"h\" ? r * 3600 : a === \"m\" ? r * 60 : a === \"ms\" ? r / 1e3 : r;\n }\n const n = t.split(\":\");\n return n.length === 3 ? Number(n[0]) * 3600 + Number(n[1]) * 60 + Number(n[2]) : n.length === 2 ? Number(n[0]) * 60 + Number(n[1]) : Number(t) || 0;\n}\nfunction H(e) {\n if (typeof DOMParser > \"u\")\n throw new Error(\"TTML parsing requires a DOMParser environment\");\n const t = new DOMParser().parseFromString(e, \"application/xml\");\n if (t.getElementsByTagName(\"parsererror\").length > 0)\n throw new Error(\"TTML XML parse error\");\n const n = t.getElementsByTagName(\"p\"), r = [];\n for (let a = 0; a < n.length; a++) {\n const i = n[a], l = i.getAttribute(\"begin\") || \"\", s = i.getAttribute(\"end\") || \"\", c = i.getAttribute(\"dur\") || \"\", d = S(l);\n let p;\n s ? p = S(s) : c ? p = d + S(c) : p = d + 5;\n let u = \"\";\n i.childNodes.forEach((m) => {\n if (m.nodeType === 3)\n u += m.nodeValue || \"\";\n else if (m.nodeType === 1) {\n const h = m;\n h.tagName.toLowerCase() === \"br\" ? u += `\n` : u += h.textContent || \"\";\n }\n });\n const f = u.replace(/[ \\t]+/g, \" \").replace(/\\n /g, `\n`).trim();\n (f || d || p) && r.push({ start: d, end: p, text: f });\n }\n return r.sort((a, i) => a.start - i.start), { format: \"ttml\", cues: r };\n}\nfunction _t(e, t) {\n switch (t ?? V(e)) {\n case \"lrc\":\n return O(e);\n case \"elrc\":\n return q(e);\n case \"ass\":\n return D(e, \"ass\");\n case \"ssa\":\n return D(e, \"ssa\");\n case \"ttml\":\n return H(e);\n case \"vtt\":\n return L(e, \"vtt\");\n case \"srt\":\n default:\n return L(e, \"srt\");\n }\n}\nasync function Ct(e) {\n return j.loadAsync(e);\n}\nfunction kt(e) {\n const t = [];\n return e.forEach((o, n) => {\n var p;\n const r = n.dir, a = r && !o.endsWith(\"/\") ? o + \"/\" : o, i = r ? a.replace(/\\/$/, \"\") : a, l = i.lastIndexOf(\"/\"), s = l >= 0 ? i.slice(l + 1) : i, c = l >= 0 ? i.slice(0, l) : \"\", d = r ? 0 : ((p = n._data) == null ? void 0 : p.uncompressedSize) ?? 0;\n t.push({\n path: a,\n name: s,\n dir: c,\n isDir: r,\n size: d,\n date: n.date\n });\n }), t;\n}\nfunction St(e) {\n const t = { name: \"\", path: \"\", isDir: !0, children: [], size: 0 }, o = /* @__PURE__ */ new Map();\n o.set(\"\", t);\n const n = (a) => {\n if (o.has(a)) return o.get(a);\n const i = a.split(\"/\").filter(Boolean);\n let l = t, s = \"\";\n for (const c of i) {\n s = s ? `${s}/${c}` : c;\n let d = o.get(s);\n d || (d = { name: c, path: s + \"/\", isDir: !0, children: [], size: 0 }, l.children.push(d), o.set(s, d)), l = d;\n }\n return l;\n };\n for (const a of e) {\n if (a.isDir) {\n n(a.path.replace(/\\/$/, \"\"));\n continue;\n }\n n(a.dir).children.push({\n name: a.name,\n path: a.path,\n isDir: !1,\n size: a.size\n });\n }\n const r = (a) => {\n if (a.children) {\n a.children.sort((i, l) => i.isDir !== l.isDir ? i.isDir ? -1 : 1 : i.name.localeCompare(l.name));\n for (const i of a.children) r(i);\n }\n };\n return r(t), t;\n}\nasync function Tt(e, t) {\n const o = e.file(t);\n if (!o) throw new Error(`ZIP entry not found: ${t}`);\n const n = await o.async(\"arraybuffer\");\n return I(n);\n}\nasync function Mt(e, t, o) {\n const n = e.file(t);\n if (!n) throw new Error(`ZIP entry not found: ${t}`);\n const r = await n.async(\"arraybuffer\");\n return new Blob([r], o ? { type: o } : void 0);\n}\nfunction G(e) {\n return e ? e.startsWith(\"#\") ? e : e.length === 8 ? \"#\" + e.substring(2) : e.length === 6 ? \"#\" + e : \"#000000\" : \"#000000\";\n}\nconst J = [\n \"FFFFFF\",\n \"000000\",\n \"E7E6E6\",\n \"44546A\",\n \"4472C4\",\n \"ED7D31\",\n \"A5A5A5\",\n \"FFC000\",\n \"5B9BD5\",\n \"70AD47\"\n], X = [\n \"000000\",\n \"FFFFFF\",\n \"FF0000\",\n \"00FF00\",\n \"0000FF\",\n \"FFFF00\",\n \"FF00FF\",\n \"00FFFF\",\n \"000000\",\n \"FFFFFF\",\n \"FF0000\",\n \"00FF00\",\n \"0000FF\",\n \"FFFF00\",\n \"FF00FF\",\n \"00FFFF\",\n \"800000\",\n \"008000\",\n \"000080\",\n \"808000\",\n \"800080\",\n \"008080\",\n \"C0C0C0\",\n \"808080\",\n \"9999FF\",\n \"993366\",\n \"FFFFCC\",\n \"CCFFFF\",\n \"660066\",\n \"FF8080\",\n \"0066CC\",\n \"CCCCFF\",\n \"000080\",\n \"FF00FF\",\n \"FFFF00\",\n \"00FFFF\",\n \"800080\",\n \"800000\",\n \"008080\",\n \"0000FF\",\n \"00CCFF\",\n \"CCFFFF\",\n \"CCFFCC\",\n \"FFFF99\",\n \"99CCFF\",\n \"FF99CC\",\n \"CC99FF\",\n \"FFCC99\",\n \"3366FF\",\n \"33CCCC\",\n \"99CC00\",\n \"FFCC00\",\n \"FF9900\",\n \"FF6600\",\n \"666699\",\n \"969696\",\n \"003366\",\n \"339966\",\n \"003300\",\n \"333300\",\n \"993300\",\n \"993366\",\n \"333399\",\n \"333333\"\n];\nfunction K(e, t) {\n const o = parseInt(e.substring(0, 2), 16), n = parseInt(e.substring(2, 4), 16), r = parseInt(e.substring(4, 6), 16), a = (c) => t < 0 ? Math.round(c * (1 + t)) : Math.round(c + (255 - c) * t), i = Math.min(255, Math.max(0, a(o))), l = Math.min(255, Math.max(0, a(n))), s = Math.min(255, Math.max(0, a(r)));\n return i.toString(16).padStart(2, \"0\") + l.toString(16).padStart(2, \"0\") + s.toString(16).padStart(2, \"0\");\n}\nfunction Q(e) {\n if (e && e.type === \"pattern\" && e.pattern === \"solid\") {\n const t = e.fgColor;\n if (t)\n return M(t);\n }\n}\nfunction M(e) {\n if (e) {\n if (\"argb\" in e && typeof e.argb == \"string\" && e.argb)\n return G(e.argb);\n if (\"theme\" in e && typeof e.theme == \"number\") {\n const t = J[e.theme] || \"000000\", o = \"tint\" in e && typeof e.tint == \"number\" ? e.tint : 0;\n return \"#\" + (o !== 0 ? K(t, o) : t);\n }\n if (\"indexed\" in e && typeof e.indexed == \"number\") {\n const t = X[e.indexed];\n if (t) return \"#\" + t;\n }\n }\n}\nfunction Y(e) {\n if (!e || !e.style) return;\n const t = M(e.color) || \"#000000\";\n return [e.style, t];\n}\nfunction tt(e) {\n const t = {};\n let o = !1;\n if (e.font) {\n const r = e.font;\n if ((r.name || r.size || r.bold || r.italic) && (o = !0, t.font = {}, r.name && (t.font.name = r.name), r.size && (t.font.size = r.size), r.bold && (t.font.bold = !0), r.italic && (t.font.italic = !0)), r.color) {\n const a = M(r.color);\n a && (o = !0, t.color = a);\n }\n r.underline && (o = !0, t.underline = !0), r.strike && (o = !0, t.strike = !0);\n }\n const n = Q(e.fill);\n if (n && (o = !0, t.bgcolor = n), e.alignment) {\n const r = e.alignment;\n r.horizontal && (o = !0, t.align = r.horizontal), r.vertical && (o = !0, t.valign = r.vertical), r.wrapText && (o = !0, t.textwrap = !0);\n }\n if (e.border) {\n const r = {};\n let a = !1;\n const i = [\"top\", \"bottom\", \"left\", \"right\"];\n for (const l of i) {\n const s = Y(e.border[l]);\n s && (r[l] = s, a = !0);\n }\n a && (o = !0, t.border = r);\n }\n return o ? t : null;\n}\nfunction et(e) {\n return JSON.stringify(e);\n}\nfunction ot(e, t, o) {\n const n = tt(e);\n if (!n) return -1;\n const r = et(n), a = o.get(r);\n if (a !== void 0) return a;\n const i = t.length;\n return t.push(n), o.set(r, i), i;\n}\nfunction nt(e) {\n const t = e.value;\n if (t == null) return \"\";\n if (typeof t == \"string\") return t;\n if (typeof t == \"number\") return String(t);\n if (typeof t == \"boolean\") return t ? \"TRUE\" : \"FALSE\";\n if (t instanceof Date)\n return t.toLocaleDateString();\n if (typeof t == \"object\" && \"formula\" in t) {\n const o = t.result;\n return o != null ? String(o) : \"\";\n }\n return typeof t == \"object\" && \"richText\" in t ? t.richText.map((n) => n.text).join(\"\") : typeof t == \"object\" && \"hyperlink\" in t ? t.text || \"\" : typeof t == \"object\" && \"error\" in t ? String(t.error) : String(t);\n}\nfunction rt(e) {\n const t = e.split(\":\"), o = P(t[0]), n = t[1] ? P(t[1]) : o;\n return {\n top: o.row,\n left: o.col,\n bottom: n.row,\n right: n.col\n };\n}\nfunction P(e) {\n const t = e.match(/^([A-Z]+)(\\d+)$/);\n if (!t) return { row: 1, col: 1 };\n const o = t[1], n = parseInt(t[2], 10);\n let r = 0;\n for (let a = 0; a < o.length; a++)\n r = r * 26 + (o.charCodeAt(a) - 64);\n return { row: n, col: r };\n}\nfunction zt(e) {\n const t = [];\n return e.eachSheet((o) => {\n const n = [], r = /* @__PURE__ */ new Map(), a = [], i = {}, l = {}, s = o.columnCount;\n for (let u = 1; u <= s; u++) {\n const f = o.getColumn(u);\n f.width && (l[String(u - 1)] = { width: Math.round(f.width * 7.5) });\n }\n l.len = Math.max(s, 26);\n const c = /* @__PURE__ */ new Map(), d = o.model, p = (d == null ? void 0 : d.merges) || [];\n for (const u of p) {\n a.push(u);\n const { top: f, left: m, bottom: h, right: b } = rt(u), g = h - f, x = b - m;\n c.set(`${f - 1},${m - 1}`, [g, x]);\n }\n o.eachRow({ includeEmpty: !0 }, (u, f) => {\n const m = f - 1, h = {};\n u.eachCell({ includeEmpty: !1 }, (g, x) => {\n const v = x - 1;\n if (g.isMerged && g.master !== g) return;\n const F = nt(g), _ = ot(g, n, r), w = { text: F };\n _ !== -1 && (w.style = _);\n const y = `${m},${v}`;\n c.has(y) && (w.merge = c.get(y)), h[String(v)] = w;\n });\n const b = { cells: h };\n u.height && (b.height = Math.round(u.height * 1.333)), i[String(m)] = b;\n }), t.push({\n name: o.name,\n styles: n,\n merges: a,\n rows: i,\n cols: l\n });\n }), t;\n}\nfunction Et(e, t, o = \"Sheet1\") {\n const n = e.length > 0, a = n ? [{ font: { bold: !0 } }] : [], i = {};\n if (n) {\n const s = {};\n e.forEach((c, d) => {\n s[String(d)] = { text: c, style: 0 };\n }), i[0] = { cells: s };\n }\n const l = n ? 1 : 0;\n return t.forEach((s, c) => {\n const d = {};\n s.forEach((p, u) => {\n p !== void 0 && p !== \"\" && (d[String(u)] = { text: p });\n }), i[String(c + l)] = { cells: d };\n }), [{ name: o, styles: a, rows: i }];\n}\nfunction Lt(e, t) {\n var i;\n if (typeof window > \"u\") return;\n const o = (e == null ? void 0 : e.version) || ((i = e == null ? void 0 : e.GlobalWorkerOptions) == null ? void 0 : i.version) || \"\", {\n workerSrc: n = `https://unpkg.com/pdfjs-dist@${o}/build/pdf.worker.min.mjs`,\n cMapUrl: r = `https://unpkg.com/pdfjs-dist@${o}/cmaps/`,\n cMapPacked: a = !0\n } = t || {};\n e.GlobalWorkerOptions && (e.GlobalWorkerOptions.workerSrc = n, e.GlobalWorkerOptions.cMapUrl = r, e.GlobalWorkerOptions.cMapPacked = a);\n}\nconst it = {\n // ─────── common ───────\n \"common.download\": \"下载\",\n \"common.close\": \"关闭\",\n \"common.loading\": \"加载中\",\n \"common.unknown_error\": \"未知错误\",\n \"common.unsupported_preview\": \"不支持预览此文件类型 ({type})\",\n // ─────── toolbar ───────\n \"toolbar.zoom_in\": \"放大\",\n \"toolbar.zoom_out\": \"缩小\",\n \"toolbar.rotate_left\": \"向左旋转\",\n \"toolbar.rotate_right\": \"向右旋转\",\n \"toolbar.reset\": \"复原\",\n \"toolbar.fit_to_window\": \"适应窗口\",\n \"toolbar.original_size\": \"原始尺寸\",\n \"toolbar.toc\": \"目录\",\n \"toolbar.prev_page\": \"上一页\",\n \"toolbar.next_page\": \"下一页\",\n \"toolbar.full_width\": \"全屏宽度\",\n \"toolbar.normal_width\": \"正常宽度\",\n \"toolbar.wrap_on\": \"自动换行\",\n \"toolbar.wrap_off\": \"不换行\",\n \"toolbar.source\": \"源码\",\n \"toolbar.preview\": \"预览\",\n // ─────── image ───────\n \"image.load_failed\": \"图片加载失败\",\n // ─────── pdf ───────\n \"pdf.load_failed\": \"PDF 文件加载失败\",\n // ─────── docx ───────\n \"docx.parse_failed\": \"Word 文档解析失败\",\n // ─────── xlsx ───────\n \"xlsx.loading\": \"加载 Excel 中...\",\n \"xlsx.load_failed\": \"Excel 加载失败\",\n \"xlsx.parse_failed\": \"Excel 文件解析失败\",\n \"xlsx.not_found\": \"Excel 文件不存在\",\n // ─────── pptx ───────\n \"pptx.loading\": \"加载 PPT 中...\",\n \"pptx.load_failed\": \"PPT 加载失败\",\n \"pptx.parse_failed\": \"PPT 文件解析失败\",\n \"pptx.not_found\": \"PPT 文件不存在\",\n \"pptx.invalid_format\": \"PPT 文件格式错误或已损坏\",\n \"pptx.no_pages\": \"PPT 文件无有效页面\",\n \"pptx.timeout\": \"加载超时,请检查网络或稍后重试\",\n // ─────── msg ───────\n \"msg.parse_failed\": \"Outlook 邮件解析失败\",\n \"msg.parse_failed_short\": \"邮件解析失败\",\n \"msg.empty_body\": \"(无邮件正文)\",\n // ─────── epub ───────\n \"epub.load_failed\": \"EPUB 文件加载失败\",\n // ─────── mobi ───────\n \"mobi.load_failed\": \"电子书加载失败,文件可能已损坏或带有 DRM 保护\",\n // ─────── video ───────\n \"video.loading\": \"加载视频中...\",\n \"video.load_failed\": \"视频加载失败\",\n \"video.load_failed_with_error\": \"视频加载失败: {error}\",\n // ─────── audio (aria-label) ───────\n \"audio.aria.play\": \"播放\",\n \"audio.aria.pause\": \"暂停\",\n \"audio.aria.forward_10\": \"前进 10 秒\",\n \"audio.aria.backward_10\": \"后退 10 秒\",\n \"audio.aria.mute\": \"静音\",\n \"audio.aria.unmute\": \"取消静音\",\n \"audio.aria.loop_on\": \"开启循环\",\n \"audio.aria.loop_off\": \"关闭循环\",\n \"audio.aria.progress\": \"播放进度\",\n \"audio.aria.volume\": \"音量\",\n // ─────── markdown ───────\n \"markdown.load_failed\": \"Markdown 文件加载失败\",\n \"markdown.copy_code\": \"复制代码\",\n \"markdown.copied\": \"已复制\",\n // ─────── json ───────\n \"json.load_failed\": \"JSON 文件加载失败\",\n \"json.items\": \"items\",\n \"json.keys\": \"keys\",\n // ─────── csv ───────\n \"csv.loading\": \"加载 CSV 中...\",\n \"csv.load_failed\": \"CSV 文件加载失败\",\n \"csv.parse_failed\": \"CSV 解析失败\",\n // ─────── xml ───────\n \"xml.load_failed\": \"XML 文件加载失败\",\n // ─────── subtitle / lyric ───────\n \"subtitle.load_failed\": \"字幕文件加载失败\",\n \"subtitle.parse_failed\": \"字幕解析失败\",\n \"subtitle.lines\": \"lines\",\n \"subtitle.cues\": \"cues\",\n \"subtitle.meta.title\": \"标题\",\n \"subtitle.meta.artist\": \"艺术家\",\n \"subtitle.meta.album\": \"专辑\",\n \"subtitle.meta.author\": \"作者\",\n \"subtitle.meta.by\": \"制作\",\n \"subtitle.meta.length\": \"时长\",\n \"subtitle.meta.offset\": \"偏移\",\n \"subtitle.meta.editor\": \"编辑器\",\n \"subtitle.meta.version\": \"版本\",\n // ─────── zip ───────\n \"zip.load_failed\": \"ZIP 文件加载失败\",\n \"zip.parse_failed\": \"ZIP 解析失败\",\n // ─────── text ───────\n \"text.load_failed\": \"文本文件加载失败\"\n}, at = {\n // ─────── common ───────\n \"common.download\": \"Download\",\n \"common.close\": \"Close\",\n \"common.loading\": \"Loading\",\n \"common.unknown_error\": \"Unknown error\",\n \"common.unsupported_preview\": \"Preview not supported for this file type ({type})\",\n // ─────── toolbar ───────\n \"toolbar.zoom_in\": \"Zoom in\",\n \"toolbar.zoom_out\": \"Zoom out\",\n \"toolbar.rotate_left\": \"Rotate left\",\n \"toolbar.rotate_right\": \"Rotate right\",\n \"toolbar.reset\": \"Reset\",\n \"toolbar.fit_to_window\": \"Fit to window\",\n \"toolbar.original_size\": \"Original size\",\n \"toolbar.toc\": \"Table of contents\",\n \"toolbar.prev_page\": \"Previous page\",\n \"toolbar.next_page\": \"Next page\",\n \"toolbar.full_width\": \"Full width\",\n \"toolbar.normal_width\": \"Normal width\",\n \"toolbar.wrap_on\": \"Word wrap\",\n \"toolbar.wrap_off\": \"No wrap\",\n \"toolbar.source\": \"Source\",\n \"toolbar.preview\": \"Preview\",\n // ─────── image ───────\n \"image.load_failed\": \"Failed to load image\",\n // ─────── pdf ───────\n \"pdf.load_failed\": \"Failed to load PDF\",\n // ─────── docx ───────\n \"docx.parse_failed\": \"Failed to parse Word document\",\n // ─────── xlsx ───────\n \"xlsx.loading\": \"Loading Excel...\",\n \"xlsx.load_failed\": \"Failed to load Excel\",\n \"xlsx.parse_failed\": \"Failed to parse Excel file\",\n \"xlsx.not_found\": \"Excel file not found\",\n // ─────── pptx ───────\n \"pptx.loading\": \"Loading PPT...\",\n \"pptx.load_failed\": \"Failed to load PPT\",\n \"pptx.parse_failed\": \"Failed to parse PPT file\",\n \"pptx.not_found\": \"PPT file not found\",\n \"pptx.invalid_format\": \"PPT file format is invalid or corrupted\",\n \"pptx.no_pages\": \"PPT file has no valid pages\",\n \"pptx.timeout\": \"Loading timed out, please check your network and retry\",\n // ─────── msg ───────\n \"msg.parse_failed\": \"Failed to parse Outlook message\",\n \"msg.parse_failed_short\": \"Failed to parse message\",\n \"msg.empty_body\": \"(No message body)\",\n // ─────── epub ───────\n \"epub.load_failed\": \"Failed to load EPUB\",\n // ─────── mobi ───────\n \"mobi.load_failed\": \"Failed to load ebook — file may be corrupted or DRM-protected\",\n // ─────── video ───────\n \"video.loading\": \"Loading video...\",\n \"video.load_failed\": \"Failed to load video\",\n \"video.load_failed_with_error\": \"Failed to load video: {error}\",\n // ─────── audio (aria-label) ───────\n \"audio.aria.play\": \"Play\",\n \"audio.aria.pause\": \"Pause\",\n \"audio.aria.forward_10\": \"Forward 10 seconds\",\n \"audio.aria.backward_10\": \"Back 10 seconds\",\n \"audio.aria.mute\": \"Mute\",\n \"audio.aria.unmute\": \"Unmute\",\n \"audio.aria.loop_on\": \"Enable loop\",\n \"audio.aria.loop_off\": \"Disable loop\",\n \"audio.aria.progress\": \"Playback progress\",\n \"audio.aria.volume\": \"Volume\",\n // ─────── markdown ───────\n \"markdown.load_failed\": \"Failed to load Markdown\",\n \"markdown.copy_code\": \"Copy code\",\n \"markdown.copied\": \"Copied\",\n // ─────── json ───────\n \"json.load_failed\": \"Failed to load JSON\",\n \"json.items\": \"items\",\n \"json.keys\": \"keys\",\n // ─────── csv ───────\n \"csv.loading\": \"Loading CSV...\",\n \"csv.load_failed\": \"Failed to load CSV\",\n \"csv.parse_failed\": \"Failed to parse CSV\",\n // ─────── xml ───────\n \"xml.load_failed\": \"Failed to load XML\",\n // ─────── subtitle / lyric ───────\n \"subtitle.load_failed\": \"Failed to load subtitle\",\n \"subtitle.parse_failed\": \"Failed to parse subtitle\",\n \"subtitle.lines\": \"lines\",\n \"subtitle.cues\": \"cues\",\n \"subtitle.meta.title\": \"Title\",\n \"subtitle.meta.artist\": \"Artist\",\n \"subtitle.meta.album\": \"Album\",\n \"subtitle.meta.author\": \"Author\",\n \"subtitle.meta.by\": \"By\",\n \"subtitle.meta.length\": \"Length\",\n \"subtitle.meta.offset\": \"Offset\",\n \"subtitle.meta.editor\": \"Editor\",\n \"subtitle.meta.version\": \"Version\",\n // ─────── zip ───────\n \"zip.load_failed\": \"Failed to load ZIP\",\n \"zip.parse_failed\": \"Failed to parse ZIP\",\n // ─────── text ───────\n \"text.load_failed\": \"Failed to load text file\"\n}, C = {\n \"zh-CN\": it,\n \"en-US\": at\n}, st = /\\{(\\w+)\\}/g;\nfunction lt(e, t) {\n return t ? e.replace(st, (o, n) => {\n const r = t[n];\n return r === void 0 ? `{${n}}` : String(r);\n }) : e;\n}\nfunction Nt(e) {\n var i;\n const t = e.fallbackLocale ?? \"zh-CN\", o = C[e.locale] ?? C[t] ?? C[\"zh-CN\"], n = (i = e.messages) == null ? void 0 : i[e.locale], r = n ? { ...o, ...n } : o, a = C[\"zh-CN\"];\n return (l, s) => {\n const c = r[l] ?? a[l] ?? l;\n return lt(c, s);\n };\n}\nexport {\n St as buildZipTree,\n C as builtInMessages,\n Lt as configurePdfWorker,\n Et as convertCsvToSpreadsheetData,\n zt as convertWorkbookToSpreadsheetData,\n Ft as createFetcher,\n Nt as createTranslator,\n $ as decodeText,\n I as decodeUtf8,\n vt as downloadFileWithFetcher,\n wt as fetchAsBlobUrl,\n bt as fetchTextUtf8,\n mt as formatFileSize,\n yt as formatSubtitleTime,\n ht as formatTime,\n A as getFileNameFromUrl,\n ut as getFileType,\n ft as getLanguageFromFileName,\n pt as getVideoMimeType,\n gt as guessCsvDelimiter,\n k as inferMimeType,\n kt as listZipEntries,\n Ct as loadZip,\n U as normalizeFile,\n dt as normalizeFiles,\n xt as parseCsv,\n _t as parseSubtitle,\n Mt as readZipEntryBlob,\n Tt as readZipEntryText\n};\n//# sourceMappingURL=index.mjs.map\n","import React, { createContext, useContext, useMemo } from 'react';\nimport {\n createTranslator,\n type Locale,\n type Messages,\n type Translator,\n} from '@eternalheart/file-preview-core';\n\nexport interface LocaleContextValue {\n locale: Locale;\n t: Translator;\n}\n\nconst LocaleContext = createContext<LocaleContextValue | null>(null);\n\nexport interface LocaleProviderProps {\n /** 当前语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义字典,浅合并到内置字典之上 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n children: React.ReactNode;\n}\n\nexport const LocaleProvider: React.FC<LocaleProviderProps> = ({\n locale = 'zh-CN',\n messages,\n children,\n}) => {\n const value = useMemo<LocaleContextValue>(() => {\n const t = createTranslator({ locale, messages });\n return { locale, t };\n }, [locale, messages]);\n\n return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;\n};\n\n/**\n * 兜底 translator(当组件被脱离 LocaleProvider 直接使用时)\n * 保持模块级单例,避免每次调用重建\n */\nlet fallbackTranslator: Translator | null = null;\nfunction getFallbackTranslator(): Translator {\n if (!fallbackTranslator) {\n fallbackTranslator = createTranslator({ locale: 'zh-CN' });\n }\n return fallbackTranslator;\n}\n\n/**\n * 获取翻译函数。任意位置调用都安全:\n * - 在 LocaleProvider 下 → 用 provider 提供的 translator\n * - 否则 → 回落到 zh-CN 兜底 translator\n */\nexport function useTranslator(): Translator {\n const ctx = useContext(LocaleContext);\n return ctx?.t ?? getFallbackTranslator();\n}\n\n/**\n * 获取当前 locale。在 Provider 之外返回 'zh-CN'。\n */\nexport function useLocale(): Locale {\n const ctx = useContext(LocaleContext);\n return ctx?.locale ?? 'zh-CN';\n}\n","import React, { createContext, useContext } from 'react';\n\n/** 已解析的主题(auto 在 FilePreviewContent 里被解析过) */\nexport type ResolvedTheme = 'dark' | 'light';\n\nconst ThemeContext = createContext<ResolvedTheme | null>(null);\n\nexport interface ThemeProviderProps {\n theme: ResolvedTheme;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n};\n\n/**\n * 获取已解析的主题('dark' | 'light')。\n * Provider 之外默认 'dark'(保持组件历史默认行为)。\n *\n * renderer 需要切第三方库的 theme prop(如 react-syntax-highlighter 的 style、\n * shiki 的 theme 选项)时使用;不要用它做 className 分支 —— class 由 CSS 变量\n * 通过根容器 [data-theme] 自动切换。\n */\nexport function useResolvedTheme(): ResolvedTheme {\n return useContext(ThemeContext) ?? 'dark';\n}\n","import React from 'react';\nimport { ZoomIn, ZoomOut, RotateCw, RotateCcw, Scan, RefreshCw } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nconst OriginalSizeIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <text x=\"12\" y=\"17.5\" textAnchor=\"middle\" fontSize=\"20\" fontWeight=\"bold\" fill=\"currentColor\" stroke=\"none\">\n 1:1\n </text>\n </svg>\n);\n\nexport interface ImageToolbarContext {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onFitToWidth: () => void;\n onOriginalSize: () => void;\n onRotateLeft: () => void;\n onRotateRight: () => void;\n onReset: () => void;\n t: Translator;\n}\n\nexport function getImageToolbarGroups(ctx: ImageToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_out'), action: ctx.onZoomOut, disabled: ctx.zoom <= 0.01 },\n { type: 'text', content: `${Math.round(ctx.zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_in'), action: ctx.onZoomIn, disabled: ctx.zoom >= 10 },\n ],\n },\n {\n items: [\n { type: 'button', icon: <Scan className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.fit_to_window'), action: ctx.onFitToWidth },\n { type: 'button', icon: <OriginalSizeIcon className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.original_size'), action: ctx.onOriginalSize },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RotateCcw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.rotate_left'), action: ctx.onRotateLeft },\n { type: 'button', icon: <RotateCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.rotate_right'), action: ctx.onRotateRight },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.reset'), action: ctx.onReset },\n ],\n },\n ];\n}\n","import { ZoomIn, ZoomOut, RefreshCw } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface PdfToolbarContext {\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n t: Translator;\n}\n\nexport function getPdfToolbarGroups(ctx: PdfToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <ZoomOut className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_out'), action: ctx.onZoomOut, disabled: ctx.zoom <= 0.01 },\n { type: 'text', content: `${Math.round(ctx.zoom * 100)}%`, minWidth: '3rem' },\n { type: 'button', icon: <ZoomIn className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.zoom_in'), action: ctx.onZoomIn, disabled: ctx.zoom >= 10 },\n ],\n },\n {\n items: [\n { type: 'button', icon: <RefreshCw className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.reset'), action: ctx.onReset },\n ],\n },\n ];\n}\n","import React from 'react';\nimport { ChevronLeft, ChevronRight, List, Maximize2, Minimize2 } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { EpubRendererHandle } from './index';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface EpubToolbarContext {\n epubRef: React.RefObject<EpubRendererHandle | null>;\n current: number;\n total: number;\n fullWidth: boolean;\n t: Translator;\n}\n\nexport function getEpubToolbarGroups(ctx: EpubToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n { type: 'button', icon: <List className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.toc'), action: () => ctx.epubRef.current?.toggleToc() },\n ],\n },\n {\n items: [\n { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.prev_page'), action: () => ctx.epubRef.current?.prevPage() },\n { type: 'text', content: `${ctx.current} / ${ctx.total}`, minWidth: '4rem' },\n { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: ctx.t('toolbar.next_page'), action: () => ctx.epubRef.current?.nextPage() },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: ctx.fullWidth ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" /> : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.fullWidth ? ctx.t('toolbar.normal_width') : ctx.t('toolbar.full_width'),\n action: () => ctx.epubRef.current?.toggleFullWidth(),\n },\n ],\n },\n ];\n}\n","import React from 'react';\nimport { ChevronLeft, ChevronRight, List, Maximize2, Minimize2 } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { MobiRendererHandle } from './index';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface MobiToolbarContext {\n mobiRef: React.RefObject<MobiRendererHandle | null>;\n current: number;\n total: number;\n fullWidth: boolean;\n t: Translator;\n}\n\nexport function getMobiToolbarGroups(ctx: MobiToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n {\n type: 'button',\n icon: <List className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.toc'),\n action: () => ctx.mobiRef.current?.toggleToc(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.prev_page'),\n action: () => ctx.mobiRef.current?.prevPage(),\n },\n {\n type: 'text',\n content: `${ctx.current} / ${ctx.total}`,\n minWidth: '4rem',\n },\n {\n type: 'button',\n icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.t('toolbar.next_page'),\n action: () => ctx.mobiRef.current?.nextPage(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: ctx.fullWidth\n ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" />\n : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.fullWidth ? ctx.t('toolbar.normal_width') : ctx.t('toolbar.full_width'),\n action: () => ctx.mobiRef.current?.toggleFullWidth(),\n },\n ],\n },\n ];\n}\n","import type { ToolbarGroup } from '../toolbar.types';\nimport { formatFileSize } from '@eternalheart/file-preview-core';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface ZipToolbarStats {\n files: number;\n dirs: number;\n size: number;\n}\n\nexport interface ZipToolbarContext {\n stats: ZipToolbarStats | null;\n t: Translator;\n}\n\nexport function getZipToolbarGroups({ stats }: ZipToolbarContext): ToolbarGroup[] {\n if (!stats) return [];\n return [\n {\n items: [\n {\n type: 'text',\n content: `${stats.files} files · ${stats.dirs} dirs · ${formatFileSize(stats.size)}`,\n minWidth: '10rem',\n },\n ],\n },\n ];\n}\n","import { WrapText, Eye, Code } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface TextToolbarContext {\n wordWrap: boolean;\n onToggleWrap: () => void;\n isHtml: boolean;\n htmlPreview: boolean;\n onToggleHtmlPreview: () => void;\n t: Translator;\n}\n\nexport function getTextToolbarGroups(ctx: TextToolbarContext): ToolbarGroup[] {\n const groups: ToolbarGroup[] = [\n {\n items: [\n {\n type: 'button',\n icon: <WrapText className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.wordWrap ? ctx.t('toolbar.wrap_off') : ctx.t('toolbar.wrap_on'),\n action: ctx.onToggleWrap,\n },\n ],\n },\n ];\n\n if (ctx.isHtml) {\n groups.push({\n items: [\n {\n type: 'button',\n icon: ctx.htmlPreview\n ? <Code className=\"rfp-w-4 rfp-h-4\" />\n : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.htmlPreview ? ctx.t('toolbar.source') : ctx.t('toolbar.preview'),\n action: ctx.onToggleHtmlPreview,\n },\n ],\n });\n }\n\n return groups;\n}\n","import { Eye, Code } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface MarkdownToolbarContext {\n viewMode: 'preview' | 'source';\n onToggleViewMode: () => void;\n t: Translator;\n}\n\nexport function getMarkdownToolbarGroups(ctx: MarkdownToolbarContext): ToolbarGroup[] {\n return [\n {\n items: [\n {\n type: 'button',\n icon: ctx.viewMode === 'preview'\n ? <Code className=\"rfp-w-4 rfp-h-4\" />\n : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n tooltip: ctx.viewMode === 'preview' ? ctx.t('toolbar.source') : ctx.t('toolbar.preview'),\n action: ctx.onToggleViewMode,\n },\n ],\n },\n ];\n}\n","import React, { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n Fetcher,\n PreviewFile,\n RequestHandler,\n RequestInitFactory,\n ShouldFetchAsBlob,\n} from '@eternalheart/file-preview-core';\nimport { createFetcher, fetchAsBlobUrl } from '@eternalheart/file-preview-core';\n\nexport interface RequestContextValue {\n fetcher: Fetcher;\n shouldFetchAsBlob?: ShouldFetchAsBlob;\n}\n\nconst defaultValue: RequestContextValue = {\n fetcher: (url, init) => fetch(url, init),\n};\n\nconst RequestContext = createContext<RequestContextValue>(defaultValue);\n\nexport interface RequestProviderProps {\n requestInit?: RequestInitFactory;\n requestHandler?: RequestHandler;\n shouldFetchAsBlob?: ShouldFetchAsBlob;\n children: React.ReactNode;\n}\n\nexport const RequestProvider: React.FC<RequestProviderProps> = ({\n requestInit,\n requestHandler,\n shouldFetchAsBlob,\n children,\n}) => {\n const value = useMemo<RequestContextValue>(\n () => ({\n fetcher: createFetcher({ requestInit, requestHandler }),\n shouldFetchAsBlob,\n }),\n [requestInit, requestHandler, shouldFetchAsBlob],\n );\n return (\n <RequestContext.Provider value={value}>{children}</RequestContext.Provider>\n );\n};\n\nexport function useRequest(): RequestContextValue {\n return useContext(RequestContext);\n}\n\nexport function useFetcher(): Fetcher {\n return useContext(RequestContext).fetcher;\n}\n\n/**\n * 解析 file 的可消费 URL:\n * - 未配置 shouldFetchAsBlob 或返回 false:直接返回 file.url\n * - 返回 true:用 fetcher 拉成 blob: URL,组件卸载或 file 变化时 revoke\n *\n * 期间返回空字符串(表示 \"还没准备好\"),调用方应避免空 URL 时挂载到 <img src> 等。\n */\nexport function useResolvedUrl(file: PreviewFile | undefined): string {\n const { fetcher, shouldFetchAsBlob } = useContext(RequestContext);\n const needBlob = !!(file && shouldFetchAsBlob?.(file));\n const [resolved, setResolved] = useState<string>(() =>\n !file ? '' : needBlob ? '' : file.url,\n );\n const createdRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!file) {\n setResolved('');\n return;\n }\n if (!needBlob) {\n setResolved(file.url);\n return;\n }\n let cancelled = false;\n setResolved('');\n fetchAsBlobUrl(file.url, fetcher)\n .then((blobUrl) => {\n if (cancelled) {\n URL.revokeObjectURL(blobUrl);\n return;\n }\n if (createdRef.current) {\n URL.revokeObjectURL(createdRef.current);\n }\n createdRef.current = blobUrl;\n setResolved(blobUrl);\n })\n .catch((err) => {\n if (!cancelled) {\n console.error('[file-preview] resolve blob url failed:', err);\n setResolved(file.url);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [file?.id, file?.url, needBlob, fetcher]);\n\n // 卸载时 revoke 最后一次创建的 blob URL\n useEffect(() => {\n return () => {\n if (createdRef.current) {\n URL.revokeObjectURL(createdRef.current);\n createdRef.current = null;\n }\n };\n }, []);\n\n return resolved;\n}\n","// 集中的 lazy 装饰:把每个 renderer 转为 React.lazy(import).then(default),\n// 让 rollup 自动按 chunk 分割。\n// 显式声明 LazyExoticComponent 以避免 TS4023(要求把内部 Props 类型导入到当前文件作用域)。\nimport { lazy, type LazyExoticComponent, type ComponentType } from 'react';\nimport type { ImageRenderer as ImageRendererImpl } from './Image';\nimport type { PdfRenderer as PdfRendererImpl } from './Pdf';\nimport type { DocxRenderer as DocxRendererImpl } from './Docx';\nimport type { XlsxRenderer as XlsxRendererImpl } from './Xlsx';\nimport type { PptxRenderer as PptxRendererImpl } from './Pptx';\nimport type { MsgRenderer as MsgRendererImpl } from './Msg';\nimport type { EpubRenderer as EpubRendererImpl } from './Epub';\nimport type { MobiRenderer as MobiRendererImpl } from './Mobi';\nimport type { VideoRenderer as VideoRendererImpl } from './Video';\nimport type { AudioRenderer as AudioRendererImpl } from './Audio';\nimport type { MarkdownRenderer as MarkdownRendererImpl } from './Markdown';\nimport type { JsonRenderer as JsonRendererImpl } from './Json';\nimport type { CsvRenderer as CsvRendererImpl } from './Csv';\nimport type { XmlRenderer as XmlRendererImpl } from './Xml';\nimport type { SubtitleRenderer as SubtitleRendererImpl } from './Subtitle';\nimport type { ZipRenderer as ZipRendererImpl } from './Zip';\nimport type { TextRenderer as TextRendererImpl } from './Text';\n\ntype Lazy<T> = LazyExoticComponent<T extends ComponentType<infer P> ? ComponentType<P> : never>;\n\nexport const ImageRenderer: Lazy<typeof ImageRendererImpl> = lazy(() =>\n import('./Image').then((m) => ({ default: m.ImageRenderer })),\n);\n\nexport const PdfRenderer: Lazy<typeof PdfRendererImpl> = lazy(() =>\n import('./Pdf').then((m) => ({ default: m.PdfRenderer })),\n);\n\nexport const DocxRenderer: Lazy<typeof DocxRendererImpl> = lazy(() =>\n import('./Docx').then((m) => ({ default: m.DocxRenderer })),\n);\n\nexport const XlsxRenderer: Lazy<typeof XlsxRendererImpl> = lazy(() =>\n import('./Xlsx').then((m) => ({ default: m.XlsxRenderer })),\n);\n\nexport const PptxRenderer: Lazy<typeof PptxRendererImpl> = lazy(() =>\n import('./Pptx').then((m) => ({ default: m.PptxRenderer })),\n);\n\nexport const MsgRenderer: Lazy<typeof MsgRendererImpl> = lazy(() =>\n import('./Msg').then((m) => ({ default: m.MsgRenderer })),\n);\n\nexport const EpubRenderer: Lazy<typeof EpubRendererImpl> = lazy(() =>\n import('./Epub').then((m) => ({ default: m.EpubRenderer })),\n);\n\nexport const MobiRenderer: Lazy<typeof MobiRendererImpl> = lazy(() =>\n import('./Mobi').then((m) => ({ default: m.MobiRenderer })),\n);\n\nexport const VideoRenderer: Lazy<typeof VideoRendererImpl> = lazy(() =>\n import('./Video').then((m) => ({ default: m.VideoRenderer })),\n);\n\nexport const AudioRenderer: Lazy<typeof AudioRendererImpl> = lazy(() =>\n import('./Audio').then((m) => ({ default: m.AudioRenderer })),\n);\n\nexport const MarkdownRenderer: Lazy<typeof MarkdownRendererImpl> = lazy(() =>\n import('./Markdown').then((m) => ({ default: m.MarkdownRenderer })),\n);\n\nexport const JsonRenderer: Lazy<typeof JsonRendererImpl> = lazy(() =>\n import('./Json').then((m) => ({ default: m.JsonRenderer })),\n);\n\nexport const CsvRenderer: Lazy<typeof CsvRendererImpl> = lazy(() =>\n import('./Csv').then((m) => ({ default: m.CsvRenderer })),\n);\n\nexport const XmlRenderer: Lazy<typeof XmlRendererImpl> = lazy(() =>\n import('./Xml').then((m) => ({ default: m.XmlRenderer })),\n);\n\nexport const SubtitleRenderer: Lazy<typeof SubtitleRendererImpl> = lazy(() =>\n import('./Subtitle').then((m) => ({ default: m.SubtitleRenderer })),\n);\n\nexport const ZipRenderer: Lazy<typeof ZipRendererImpl> = lazy(() =>\n import('./Zip').then((m) => ({ default: m.ZipRenderer })),\n);\n\nexport const TextRenderer: Lazy<typeof TextRendererImpl> = lazy(() =>\n import('./Text').then((m) => ({ default: m.TextRenderer })),\n);\n","import { FileQuestion, Download } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface UnsupportedRendererProps {\n fileName: string;\n fileType: string;\n onDownload: () => void;\n}\n\nexport const UnsupportedRenderer: React.FC<UnsupportedRendererProps> = ({\n fileName,\n fileType,\n onDownload,\n}) => {\n const t = useTranslator();\n return (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-p-8 rfp-gap-6\">\n <div className=\"rfp-w-32 rfp-h-32 rfp-rounded-full rfp-bg-surface-2 rfp-flex rfp-items-center rfp-justify-center\">\n <FileQuestion className=\"rfp-w-16 rfp-h-16 rfp-text-fg-secondary\" />\n </div>\n\n <div className=\"rfp-text-fg-primary rfp-text-center\">\n <p className=\"rfp-text-xl rfp-font-medium rfp-mb-2\">{fileName}</p>\n <p className=\"rfp-text-fg-secondary\">{t('common.unsupported_preview', { type: fileType })}</p>\n </div>\n\n <button\n onClick={onDownload}\n className=\"rfp-flex rfp-items-center rfp-gap-2 rfp-px-6 rfp-py-3 rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-backdrop-blur-sm rfp-rounded-lg rfp-text-fg-primary rfp-font-medium rfp-transition-all\"\n >\n <Download className=\"rfp-w-5 rfp-h-5\" />\n {t('common.download')}\n </button>\n </div>\n );\n};\n","import React from 'react';\nimport { useTranslator } from '../i18n/LocaleContext';\n\nexport const RendererLoading: React.FC = () => {\n const t = useTranslator();\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-text-fg-muted\">\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-gap-3\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-rounded-full rfp-border-2 rfp-border-fg-muted rfp-border-t-transparent rfp-animate-spin\" />\n <span className=\"rfp-text-sm\">{t('common.loading') ?? 'Loading...'}</span>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback, useMemo, useRef, Suspense } from 'react';\nimport { motion } from 'framer-motion';\nimport { X, Download, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { getFileType, createTranslator, type Locale, type Messages, type Translator, type Theme } from '@eternalheart/file-preview-core';\nimport { LocaleProvider } from './i18n/LocaleContext';\nimport { ThemeProvider } from './ThemeContext';\nimport type { ToolbarGroup } from './renderers/toolbar.types';\nimport { getImageToolbarGroups } from './renderers/Image/toolbar';\nimport { getPdfToolbarGroups } from './renderers/Pdf/toolbar';\nimport { getEpubToolbarGroups } from './renderers/Epub/toolbar';\nimport { getMobiToolbarGroups } from './renderers/Mobi/toolbar';\nimport { getZipToolbarGroups, type ZipToolbarStats } from './renderers/Zip/toolbar';\nimport { getTextToolbarGroups } from './renderers/Text/toolbar';\nimport { getMarkdownToolbarGroups } from './renderers/Markdown/toolbar';\n\nimport { PreviewFileInput, CustomRenderer, CustomRendererContext } from './types';\nimport type { CustomRendererEventPayload, PreviewFile, RequestHandler, RequestInitFactory, ShouldFetchAsBlob } from '@eternalheart/file-preview-core';\nimport { downloadFileWithFetcher } from '@eternalheart/file-preview-core';\nimport { normalizeFiles } from './utils/fileNormalizer';\nimport { RequestProvider, useResolvedUrl, useFetcher } from './RequestContext';\n// Renderer 通过 React.lazy 动态加载,运行时按需下载对应 chunk\nimport {\n ImageRenderer,\n PdfRenderer,\n DocxRenderer,\n XlsxRenderer,\n PptxRenderer,\n MsgRenderer,\n EpubRenderer,\n MobiRenderer,\n VideoRenderer,\n AudioRenderer,\n MarkdownRenderer,\n JsonRenderer,\n CsvRenderer,\n XmlRenderer,\n SubtitleRenderer,\n ZipRenderer,\n TextRenderer,\n} from './renderers/lazy';\nimport type { EpubRendererHandle } from './renderers/Epub';\nimport type { MobiRendererHandle } from './renderers/Mobi';\n// 不支持类型回退;体积极小,仍静态打包到主入口\nimport { UnsupportedRenderer } from './renderers/Unsupported';\nimport { RendererLoading } from './renderers/RendererLoading';\n\nconst MAX_ZIP_NESTING_DEPTH = 3;\n\nexport interface FilePreviewContentProps {\n files: PreviewFileInput[];\n currentIndex: number;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 运行模式:modal(弹窗) 或 embed(嵌入) */\n mode?: 'modal' | 'embed';\n /** 关闭回调,仅 modal 模式使用 */\n onClose?: () => void;\n /** ZIP 嵌套深度(内部使用),超过上限时不再递归渲染 ZIP */\n zipNestingDepth?: number;\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典,浅合并到内置字典之上 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头,仅渲染文件内容 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口,载荷为 `{ name, payload, file }` */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n /** 自定义 RequestInit(或工厂函数):用于注入 Authorization 等鉴权头 */\n requestInit?: RequestInitFactory;\n /** 自定义请求处理器:完全接管库内 fetch;与 requestInit 同时存在时 handler 接收已合并的 init */\n requestHandler?: RequestHandler;\n /** 返回 true 时,对应文件会先经 fetcher 拉成 blob: URL 再喂给 image/video/audio/pdf 等 renderer */\n shouldFetchAsBlob?: ShouldFetchAsBlob;\n /**\n * 自定义下载回调。提供后完全接管下载行为;\n * 不提供时,库内默认通过 fetcher 拉成 Blob 触发下载(鉴权 URL 场景自动可用)。\n */\n onDownload?: (file: PreviewFile) => void | Promise<void>;\n}\n\nexport const FilePreviewContent: React.FC<FilePreviewContentProps> = (props) => {\n const { requestInit, requestHandler, shouldFetchAsBlob } = props;\n return (\n <RequestProvider\n requestInit={requestInit}\n requestHandler={requestHandler}\n shouldFetchAsBlob={shouldFetchAsBlob}\n >\n <FilePreviewContentInner {...props} />\n </RequestProvider>\n );\n};\n\nconst FilePreviewContentInner: React.FC<FilePreviewContentProps> = ({\n files,\n currentIndex,\n onNavigate,\n customRenderers = [],\n mode = 'modal',\n onClose,\n zipNestingDepth = 0,\n locale = 'zh-CN',\n messages: userMessages,\n headless = false,\n theme = 'dark',\n onCustomEvent,\n onDownload,\n // 以下三项已由外层 RequestProvider 消费,Inner 内不再直接使用\n requestInit: _requestInit,\n requestHandler: _requestHandler,\n shouldFetchAsBlob: _shouldFetchAsBlob,\n}) => {\n const t: Translator = useMemo(\n () => createTranslator({ locale, messages: userMessages }),\n [locale, userMessages],\n );\n\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [, setTotalPages] = useState(1);\n const [contentNaturalWidth, setContentNaturalWidth] = useState(0);\n const [contentNaturalHeight, setContentNaturalHeight] = useState(0);\n const [imageResetKey, setImageResetKey] = useState(0);\n const contentRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const epubRef = useRef<EpubRendererHandle>(null);\n const [epubCurrent, setEpubCurrent] = useState(0);\n const [epubTotal, setEpubTotal] = useState(0);\n const [epubFullWidth, setEpubFullWidth] = useState(false);\n const mobiRef = useRef<MobiRendererHandle>(null);\n const [mobiCurrent, setMobiCurrent] = useState(0);\n const [mobiTotal, setMobiTotal] = useState(0);\n const [mobiFullWidth, setMobiFullWidth] = useState(false);\n const [zipStats, setZipStats] = useState<ZipToolbarStats | null>(null);\n const [textWordWrap, setTextWordWrap] = useState(true);\n const [textHtmlPreview, setTextHtmlPreview] = useState(false);\n const [markdownViewMode, setMarkdownViewMode] = useState<'preview' | 'source'>('preview');\n\n // 导航箭头自动隐藏\n const [navVisible, setNavVisible] = useState(true);\n const navHideTimerRef = useRef<number | null>(null);\n const NAV_HIDE_DELAY = 2000;\n\n const resetNavTimer = useCallback(() => {\n setNavVisible(true);\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n navHideTimerRef.current = window.setTimeout(() => {\n setNavVisible(false);\n }, NAV_HIDE_DELAY);\n }, []);\n\n const handleMouseMove = useCallback(() => {\n resetNavTimer();\n }, [resetNavTimer]);\n\n // 标准化文件输入\n const normalizedFiles = useMemo(() => normalizeFiles(files), [files]);\n\n const currentFile = normalizedFiles[currentIndex];\n\n // 命中 shouldFetchAsBlob 时,把 file.url 转成 blob: URL 喂给 src 类 renderer\n const resolvedUrl = useResolvedUrl(currentFile);\n\n // 检查是否有自定义渲染器匹配当前文件\n const customRenderer = useMemo(() => {\n if (!currentFile) return null;\n return customRenderers.find(renderer => renderer.test(currentFile));\n }, [currentFile, customRenderers]);\n\n const fileType = currentFile ? getFileType(currentFile) : 'unsupported';\n\n // 自定义渲染器事件派发器:未绑定 onCustomEvent 时静默忽略\n const emitCustom = useCallback(\n (name: string, payload?: unknown) => {\n if (!currentFile) return;\n onCustomEvent?.({ name, payload, file: currentFile });\n },\n [currentFile, onCustomEvent],\n );\n\n // 自定义渲染器上下文:注入给 render / getToolbarGroups\n const customCtx = useMemo<CustomRendererContext>(\n () => ({\n emit: emitCustom,\n t,\n theme: resolvedTheme,\n locale,\n }),\n [emitCustom, t, resolvedTheme, locale],\n );\n\n // 重置状态当文件改变时\n useEffect(() => {\n setZoom(1);\n setRotation(0);\n setCurrentPage(1);\n setTotalPages(1);\n setContentNaturalWidth(0);\n setContentNaturalHeight(0);\n setNavVisible(true);\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n }, [currentIndex]);\n\n // 图片加载后默认适应窗口\n useEffect(() => {\n if (fileType === 'image' && contentNaturalWidth > 0 && contentNaturalHeight > 0 && contentRef.current) {\n const containerWidth = contentRef.current.clientWidth;\n const containerHeight = contentRef.current.clientHeight;\n const scaleX = containerWidth / contentNaturalWidth;\n const scaleY = containerHeight / contentNaturalHeight;\n const newZoom = Math.min(scaleX, scaleY);\n setZoom(Math.max(0.01, Math.min(10, newZoom)));\n }\n }, [fileType, contentNaturalWidth, contentNaturalHeight]);\n\n // 导航箭头自动隐藏计时器启动 & 清理\n useEffect(() => {\n if (normalizedFiles.length > 1) {\n resetNavTimer();\n }\n return () => {\n if (navHideTimerRef.current) {\n clearTimeout(navHideTimerRef.current);\n }\n };\n }, [normalizedFiles.length, resetNavTimer]);\n\n // 键盘导航\n // - modal 模式:全局监听(window)\n // - embed 模式:只在根容器 focus 时监听,避免影响外部页面交互\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && mode === 'modal') {\n onClose?.();\n } else if (e.key === 'ArrowLeft' && currentIndex > 0) {\n onNavigate?.(currentIndex - 1);\n } else if (e.key === 'ArrowRight' && currentIndex < normalizedFiles.length - 1) {\n onNavigate?.(currentIndex + 1);\n }\n };\n\n if (mode === 'modal') {\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n } else {\n const el = rootRef.current;\n if (!el) return;\n el.addEventListener('keydown', handleKeyDown as EventListener);\n return () => el.removeEventListener('keydown', handleKeyDown as EventListener);\n }\n }, [mode, currentIndex, normalizedFiles.length, onClose, onNavigate]);\n\n const handleZoomIn = useCallback(() => {\n setZoom((prev) => Math.min(prev + 0.1, 10));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom((prev) => Math.max(prev - 0.1, 0.01));\n }, []);\n\n const handleRotate = useCallback(() => {\n setRotation((prev) => prev + 90);\n }, []);\n\n const handleRotateLeft = useCallback(() => {\n setRotation((prev) => prev - 90);\n }, []);\n\n const handleFitToWidth = useCallback(() => {\n if (contentRef.current && contentNaturalWidth > 0 && contentNaturalHeight > 0) {\n const containerWidth = contentRef.current.clientWidth;\n const containerHeight = contentRef.current.clientHeight;\n const scaleX = containerWidth / contentNaturalWidth;\n const scaleY = containerHeight / contentNaturalHeight;\n const newZoom = Math.min(scaleX, scaleY);\n setZoom(Math.max(0.01, Math.min(10, newZoom)));\n } else {\n setZoom(1);\n }\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, [contentNaturalWidth, contentNaturalHeight]);\n\n const handleOriginalSize = useCallback(() => {\n setZoom(1);\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, []);\n\n const handleZoomChange = useCallback((newZoom: number) => {\n setZoom(newZoom);\n }, []);\n\n const handleReset = useCallback(() => {\n setZoom(1);\n setRotation(0);\n setImageResetKey(k => k + 1);\n }, []);\n\n const fetcher = useFetcher();\n const handleDownload = useCallback(async () => {\n if (!currentFile) return;\n if (onDownload) {\n await onDownload(currentFile);\n return;\n }\n try {\n await downloadFileWithFetcher(currentFile.url, currentFile.name, fetcher);\n } catch (err) {\n console.error('[file-preview] download failed:', err);\n }\n }, [currentFile, onDownload, fetcher]);\n\n const handleEpubChapterChange = useCallback((current: number, total: number) => {\n setEpubCurrent(current);\n setEpubTotal(total);\n }, []);\n\n const handleMobiChapterChange = useCallback((current: number, total: number) => {\n setMobiCurrent(current);\n setMobiTotal(total);\n }, []);\n\n const handleZipStatsChange = useCallback((stats: ZipToolbarStats | null) => {\n setZipStats(stats);\n }, []);\n\n if (!currentFile) return null;\n\n const showCloseButton = mode === 'modal' && !!onClose;\n\n // 工具栏配置 — 各 Renderer 自行声明。命中自定义渲染器时优先使用其 getToolbarGroups\n const toolGroups: ToolbarGroup[] = (() => {\n if (customRenderer) {\n return customRenderer.getToolbarGroups?.(currentFile, customCtx) ?? [];\n }\n if (fileType === 'image') {\n return getImageToolbarGroups({\n zoom,\n onZoomIn: handleZoomIn,\n onZoomOut: handleZoomOut,\n onFitToWidth: handleFitToWidth,\n onOriginalSize: handleOriginalSize,\n onRotateLeft: handleRotateLeft,\n onRotateRight: handleRotate,\n onReset: handleReset,\n t,\n });\n }\n if (fileType === 'pdf') {\n return getPdfToolbarGroups({\n zoom,\n onZoomIn: handleZoomIn,\n onZoomOut: handleZoomOut,\n onReset: handleReset,\n t,\n });\n }\n if (fileType === 'epub') {\n return getEpubToolbarGroups({\n epubRef,\n current: epubCurrent,\n total: epubTotal,\n fullWidth: epubFullWidth,\n t,\n });\n }\n if (fileType === 'mobi') {\n return getMobiToolbarGroups({\n mobiRef,\n current: mobiCurrent,\n total: mobiTotal,\n fullWidth: mobiFullWidth,\n t,\n });\n }\n if (fileType === 'zip') {\n return getZipToolbarGroups({ stats: zipStats, t });\n }\n if (fileType === 'text') {\n const ext = currentFile.name.split('.').pop()?.toLowerCase() || '';\n return getTextToolbarGroups({\n wordWrap: textWordWrap,\n onToggleWrap: () => setTextWordWrap(prev => !prev),\n isHtml: ext === 'html' || ext === 'htm',\n htmlPreview: textHtmlPreview,\n onToggleHtmlPreview: () => setTextHtmlPreview(prev => !prev),\n t,\n });\n }\n if (fileType === 'markdown') {\n return getMarkdownToolbarGroups({\n viewMode: markdownViewMode,\n onToggleViewMode: () => setMarkdownViewMode(prev => prev === 'preview' ? 'source' : 'preview'),\n t,\n });\n }\n return [];\n })();\n\n // 操作组:下载、关闭(通用,不属于任何 Renderer)\n const actionGroups: ToolbarGroup[] = [\n {\n items: [\n { type: 'button', icon: <Download className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('common.download'), action: handleDownload },\n ],\n },\n ...(showCloseButton ? [{\n items: [\n { type: 'button' as const, icon: <X className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('common.close'), action: onClose! },\n ],\n }] : []),\n ];\n\n const renderToolbarItems = (groups: ToolbarGroup[], dividerClass: string) =>\n groups.map((group, gi, arr) => (\n <React.Fragment key={gi}>\n {group.items.map((item, ii) =>\n item.type === 'button' ? (\n <ToolbarButton\n key={`${gi}-${ii}`}\n icon={item.icon}\n label={item.tooltip}\n onClick={item.action}\n disabled={item.disabled}\n />\n ) : (\n <span\n key={`${gi}-${ii}`}\n className=\"rfp-text-xs rfp-text-center rfp-font-medium rfp-tabular-nums rfp-text-fg-tertiary\"\n style={{ minWidth: item.minWidth || 'auto' }}\n >\n {item.content}\n </span>\n )\n )}\n {gi < arr.length - 1 && <div className={`rfp-w-px rfp-h-4 rfp-bg-divide ${dividerClass}`} />}\n </React.Fragment>\n ));\n\n return (\n <LocaleProvider locale={locale} messages={userMessages}>\n <ThemeProvider theme={resolvedTheme}>\n <div\n ref={rootRef}\n tabIndex={mode === 'embed' ? 0 : -1}\n data-theme={resolvedTheme}\n className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-flex-col rfp-overflow-hidden rfp-outline-none\"\n >\n {/* 顶部工具栏 - 全屏融合式 */}\n {!headless && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"rfp-flex-shrink-0 rfp-z-10 rfp-backdrop-blur-md rfp-border-b rfp-bg-surface-toolbar rfp-border-line\"\n style={{ paddingTop: 'env(safe-area-inset-top, 0px)' }}\n >\n {/* 第一行:文件名 + 分页 + 关闭/下载(移动端右侧)/ 全部按钮(桌面端) */}\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-3 md:rfp-px-5 rfp-py-1.5 md:rfp-py-2.5\">\n {/* 左侧:文件名 + 分页 */}\n <div className=\"rfp-flex rfp-items-center rfp-flex-1 rfp-min-w-0 rfp-mr-2 md:rfp-mr-3\">\n <h2 className=\"rfp-font-medium rfp-text-xs md:rfp-text-sm rfp-truncate rfp-text-fg-primary\">\n {currentFile.name}\n </h2>\n <span className=\"rfp-text-xs rfp-ml-2 rfp-flex-shrink-0 rfp-text-fg-muted\">\n {currentIndex + 1}/{normalizedFiles.length}\n </span>\n </div>\n\n {/* 移动端:仅显示下载+关闭 */}\n <div className=\"rfp-flex rfp-items-center rfp-gap-1 md:rfp-hidden rfp-flex-shrink-0\">\n {renderToolbarItems(actionGroups, 'rfp-mx-0.5')}\n </div>\n\n {/* 桌面端:所有工具按钮 */}\n <div className=\"rfp-hidden md:rfp-flex rfp-items-center rfp-gap-1 rfp-flex-shrink-0\">\n {renderToolbarItems(toolGroups, 'rfp-mx-1')}\n {toolGroups.length > 0 && <div className=\"rfp-w-px rfp-h-4 rfp-mx-1 rfp-bg-divide\" />}\n {renderToolbarItems(actionGroups, 'rfp-mx-1')}\n </div>\n </div>\n\n {/* 第二行:移动端工具按钮(image/pdf/epub) */}\n {toolGroups.length > 0 && (\n <div className=\"rfp-flex rfp-items-center rfp-gap-1 rfp-px-3 rfp-pb-1.5 rfp-overflow-x-auto scrollbar-hide md:rfp-hidden\">\n {renderToolbarItems(toolGroups, 'rfp-mx-0.5')}\n </div>\n )}\n </motion.div>\n )}\n\n {/* 内容区域 */}\n <div\n ref={contentRef}\n className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-overflow-auto\"\n onMouseMove={handleMouseMove}\n >\n {customRenderer ? (\n customRenderer.render(currentFile, customCtx)\n ) : (\n <Suspense fallback={<RendererLoading />}>\n {fileType === 'image' && (\n <ImageRenderer\n url={resolvedUrl}\n zoom={zoom}\n rotation={rotation}\n resetKey={imageResetKey}\n fileSize={currentFile.size}\n onZoomChange={handleZoomChange}\n onNaturalWidthChange={setContentNaturalWidth}\n onNaturalHeightChange={setContentNaturalHeight}\n />\n )}\n {fileType === 'pdf' && (\n <PdfRenderer\n url={resolvedUrl}\n zoom={zoom}\n currentPage={currentPage}\n onPageChange={setCurrentPage}\n onTotalPagesChange={setTotalPages}\n onPageWidthChange={setContentNaturalWidth}\n />\n )}\n {fileType === 'docx' && <DocxRenderer url={resolvedUrl} />}\n {fileType === 'xlsx' && <XlsxRenderer url={resolvedUrl} />}\n {fileType === 'pptx' && <PptxRenderer url={resolvedUrl} />}\n {fileType === 'msg' && <MsgRenderer url={resolvedUrl} />}\n {fileType === 'epub' && (\n <EpubRenderer\n ref={epubRef}\n url={resolvedUrl}\n onChapterChange={handleEpubChapterChange}\n onFullWidthChange={setEpubFullWidth}\n />\n )}\n {fileType === 'mobi' && (\n <MobiRenderer\n ref={mobiRef}\n url={resolvedUrl}\n onChapterChange={handleMobiChapterChange}\n onFullWidthChange={setMobiFullWidth}\n />\n )}\n {fileType === 'video' && <VideoRenderer url={resolvedUrl} />}\n {fileType === 'audio' && (\n <AudioRenderer url={resolvedUrl} fileName={currentFile.name} />\n )}\n {fileType === 'markdown' && <MarkdownRenderer url={resolvedUrl} viewMode={markdownViewMode} />}\n {fileType === 'json' && (\n <JsonRenderer url={resolvedUrl} fileName={currentFile.name} />\n )}\n {fileType === 'csv' && (\n <CsvRenderer url={resolvedUrl} fileName={currentFile.name} />\n )}\n {fileType === 'xml' && (\n <XmlRenderer url={resolvedUrl} fileName={currentFile.name} />\n )}\n {fileType === 'subtitle' && (\n <SubtitleRenderer url={resolvedUrl} fileName={currentFile.name} />\n )}\n {fileType === 'zip' && (\n zipNestingDepth >= MAX_ZIP_NESTING_DEPTH ? (\n <UnsupportedRenderer\n fileName={currentFile.name}\n fileType={currentFile.type}\n onDownload={handleDownload}\n />\n ) : (\n <ZipRenderer url={resolvedUrl} onStatsChange={handleZipStatsChange} nestingDepth={zipNestingDepth} />\n )\n )}\n {fileType === 'text' && (\n <TextRenderer\n url={resolvedUrl}\n fileName={currentFile.name}\n wordWrap={textWordWrap}\n htmlPreview={textHtmlPreview}\n />\n )}\n {fileType === 'unsupported' && (\n <UnsupportedRenderer\n fileName={currentFile.name}\n fileType={currentFile.type}\n onDownload={handleDownload}\n />\n )}\n </Suspense>\n )}\n </div>\n\n {/* 左右导航箭头 - 自动隐藏 */}\n {!headless && normalizedFiles.length > 1 && (\n <>\n {currentIndex > 0 && (\n <motion.button\n initial={{ opacity: 0 }}\n animate={{ opacity: navVisible ? 1 : 0, x: navVisible ? 0 : -20 }}\n transition={{ duration: 0.2 }}\n onClick={() => onNavigate?.(currentIndex - 1)}\n onMouseEnter={() => setNavVisible(true)}\n style={{ pointerEvents: navVisible ? 'auto' : 'none' }}\n className=\"rfp-absolute rfp-z-20 rfp-left-2 md:rfp-left-4 rfp-top-1/2 -rfp-translate-y-1/2 rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-rounded-full rfp-backdrop-blur-xl rfp-border rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-shadow-2xl rfp-bg-surface-nav rfp-border-line hover:rfp-bg-surface-nav-hover rfp-text-fg-primary\"\n >\n <ChevronLeft className=\"rfp-w-5 rfp-h-5 md:rfp-w-6 md:rfp-h-6\" />\n </motion.button>\n )}\n\n {currentIndex < normalizedFiles.length - 1 && (\n <motion.button\n initial={{ opacity: 0 }}\n animate={{ opacity: navVisible ? 1 : 0, x: navVisible ? 0 : 20 }}\n transition={{ duration: 0.2 }}\n onClick={() => onNavigate?.(currentIndex + 1)}\n onMouseEnter={() => setNavVisible(true)}\n style={{ pointerEvents: navVisible ? 'auto' : 'none' }}\n className=\"rfp-absolute rfp-z-20 rfp-right-2 md:rfp-right-4 rfp-top-1/2 -rfp-translate-y-1/2 rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-rounded-full rfp-backdrop-blur-xl rfp-border rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-shadow-2xl rfp-bg-surface-nav rfp-border-line hover:rfp-bg-surface-nav-hover rfp-text-fg-primary\"\n >\n <ChevronRight className=\"rfp-w-5 rfp-h-5 md:rfp-w-6 md:rfp-h-6\" />\n </motion.button>\n )}\n </>\n )}\n </div>\n </ThemeProvider>\n </LocaleProvider>\n );\n};\n\n// 工具栏按钮组件\ninterface ToolbarButtonProps {\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({ icon, label, onClick, disabled }) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`rfp-relative rfp-group rfp-p-2 md:rfp-p-1.5 rfp-rounded-md rfp-transition-all rfp-select-none ${\n disabled\n ? 'rfp-text-fg-disabled rfp-cursor-not-allowed'\n : 'rfp-text-fg-primary hover:rfp-bg-surface-2 active:rfp-bg-surface-3'\n }`}\n >\n {icon}\n <span className=\"rfp-absolute rfp-left-1/2 -rfp-translate-x-1/2 rfp-top-full rfp-mt-1.5 rfp-px-2 rfp-py-1 rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-pointer-events-none rfp-opacity-0 rfp-invisible group-hover:rfp-opacity-100 group-hover:rfp-visible rfp-transition-opacity rfp-duration-200 rfp-z-50 rfp-bg-fg-primary rfp-text-fg-inverse\">\n <span className=\"rfp-absolute rfp-left-1/2 -rfp-translate-x-1/2 -rfp-top-1 rfp-w-2 rfp-h-2 rfp-rotate-45 rfp-bg-fg-primary\" />\n <span className=\"rfp-relative\">{label}</span>\n </span>\n </button>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { PreviewFileInput, CustomRenderer } from './types';\nimport { FilePreviewContent } from './FilePreviewContent';\nimport type { Locale, Messages, Theme, CustomRendererEventPayload, PreviewFile, RequestHandler, RequestInitFactory, ShouldFetchAsBlob } from '@eternalheart/file-preview-core';\n\ninterface FilePreviewModalProps {\n files: PreviewFileInput[];\n currentIndex: number;\n isOpen: boolean;\n onClose: () => void;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口 */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n /** 自定义 RequestInit(或工厂函数):注入 Authorization 等鉴权头 */\n requestInit?: RequestInitFactory;\n /** 自定义请求处理器:完全接管库内 fetch */\n requestHandler?: RequestHandler;\n /** 返回 true 时,对应文件先 fetcher→blob URL 后喂给 image/video/audio/pdf 等 renderer */\n shouldFetchAsBlob?: ShouldFetchAsBlob;\n /** 自定义下载回调;不传时库内默认通过 fetcher 拉 Blob 触发下载 */\n onDownload?: (file: PreviewFile) => void | Promise<void>;\n}\n\nexport const FilePreviewModal: React.FC<FilePreviewModalProps> = ({\n files,\n currentIndex,\n isOpen,\n onClose,\n onNavigate,\n customRenderers = [],\n locale,\n messages,\n headless,\n theme = 'dark',\n onCustomEvent,\n requestInit,\n requestHandler,\n shouldFetchAsBlob,\n onDownload,\n}) => {\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n // 锁定 body 滚动\n useEffect(() => {\n if (isOpen) {\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n document.body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const modalContent = (\n <div className=\"rfp-root\" data-theme={resolvedTheme}>\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"rfp-fixed rfp-inset-0 rfp-z-[9999] rfp-flex rfp-items-center rfp-justify-center rfp-backdrop-blur-md rfp-overflow-hidden rfp-bg-surface-overlay\"\n onClick={onClose}\n onWheel={(e) => e.stopPropagation()}\n >\n <div\n className=\"rfp-relative rfp-w-full rfp-h-full\"\n onClick={(e) => e.stopPropagation()}\n >\n <FilePreviewContent\n mode=\"modal\"\n files={files}\n currentIndex={currentIndex}\n onClose={onClose}\n onNavigate={onNavigate}\n customRenderers={customRenderers}\n locale={locale}\n messages={messages}\n headless={headless}\n theme={theme}\n onCustomEvent={onCustomEvent}\n requestInit={requestInit}\n requestHandler={requestHandler}\n shouldFetchAsBlob={shouldFetchAsBlob}\n onDownload={onDownload}\n />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n\n return createPortal(modalContent, document.body);\n};\n","import { useEffect, useState } from 'react';\nimport { PreviewFileInput, CustomRenderer } from './types';\nimport { FilePreviewContent } from './FilePreviewContent';\nimport type { Locale, Messages, Theme, CustomRendererEventPayload, PreviewFile, RequestHandler, RequestInitFactory, ShouldFetchAsBlob } from '@eternalheart/file-preview-core';\n\ninterface FilePreviewEmbedProps {\n files: PreviewFileInput[];\n currentIndex?: number;\n onNavigate?: (index: number) => void;\n customRenderers?: CustomRenderer[];\n /** 宽度,默认 100% 填充父容器 */\n width?: number | string;\n /** 高度,默认 100% 填充父容器 */\n height?: number | string;\n className?: string;\n style?: React.CSSProperties;\n /** 国际化语言,默认 'zh-CN' */\n locale?: Locale;\n /** 用户自定义翻译字典 */\n messages?: Partial<Record<Locale, Partial<Messages>>>;\n /** 无头模式:隐藏工具栏和导航箭头 */\n headless?: boolean;\n /** 主题模式,默认 'dark' */\n theme?: Theme;\n /** 自定义渲染器派发的事件出口 */\n onCustomEvent?: (event: CustomRendererEventPayload) => void;\n /** 自定义 RequestInit(或工厂函数):注入 Authorization 等鉴权头 */\n requestInit?: RequestInitFactory;\n /** 自定义请求处理器:完全接管库内 fetch */\n requestHandler?: RequestHandler;\n /** 返回 true 时,对应文件先 fetcher→blob URL 后喂给 image/video/audio/pdf 等 renderer */\n shouldFetchAsBlob?: ShouldFetchAsBlob;\n /** 自定义下载回调;不传时库内默认通过 fetcher 拉 Blob 触发下载 */\n onDownload?: (file: PreviewFile) => void | Promise<void>;\n}\n\nexport const FilePreviewEmbed: React.FC<FilePreviewEmbedProps> = ({\n files,\n currentIndex = 0,\n onNavigate,\n customRenderers = [],\n width = '100%',\n height = '100%',\n className,\n style,\n locale,\n messages,\n headless,\n theme = 'dark',\n onCustomEvent,\n requestInit,\n requestHandler,\n shouldFetchAsBlob,\n onDownload,\n}) => {\n const [systemDark, setSystemDark] = useState(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : true,\n );\n\n useEffect(() => {\n if (theme !== 'auto') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [theme]);\n\n const resolvedTheme = theme === 'auto' ? (systemDark ? 'dark' : 'light') : theme;\n\n return (\n <div\n className={`rfp-root ${className ?? ''}`}\n style={{ width, height, ...style }}\n data-theme={resolvedTheme}\n >\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-overflow-hidden rfp-bg-surface-overlay\">\n <FilePreviewContent\n mode=\"embed\"\n files={files}\n currentIndex={currentIndex}\n onNavigate={onNavigate}\n customRenderers={customRenderers}\n locale={locale}\n messages={messages}\n headless={headless}\n theme={theme}\n onCustomEvent={onCustomEvent}\n requestInit={requestInit}\n requestHandler={requestHandler}\n shouldFetchAsBlob={shouldFetchAsBlob}\n onDownload={onDownload}\n />\n </div>\n </div>\n );\n};\n","import { pdfjs } from 'react-pdf';\n\n/**\n * PDF.js Worker 配置选项\n */\nexport interface PdfConfigOptions {\n /**\n * PDF.js worker 文件路径\n * 默认使用 CDN: `https://unpkg.com/pdfjs-dist@${version}/build/pdf.worker.min.mjs`\n */\n workerSrc?: string;\n \n /**\n * CMap 文件目录路径\n * 默认使用 CDN: `https://unpkg.com/pdfjs-dist@${version}/cmaps/`\n */\n cMapUrl?: string;\n \n /**\n * 是否使用压缩的 CMap 文件\n * 默认: true\n */\n cMapPacked?: boolean;\n}\n\n/**\n * 配置 PDF.js\n *\n * @example\n * ```ts\n * // 使用本地静态文件(推荐用于生产环境)\n * configurePdfjs({\n * workerSrc: '/pdfjs/pdf.worker.min.mjs',\n * cMapUrl: '/pdfjs/cmaps/',\n * cMapPacked: true\n * });\n * ```\n *\n * @example\n * ```ts\n * // 使用 CDN(默认配置)\n * configurePdfjs(); // 自动使用 unpkg CDN\n * ```\n */\nexport function configurePdfjs(options?: PdfConfigOptions) {\n if (typeof window === 'undefined') return;\n\n const {\n workerSrc = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`,\n cMapUrl = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`,\n cMapPacked = true\n } = options || {};\n\n pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n // @ts-ignore - cMapUrl 和 cMapPacked 在 react-pdf 的类型定义中不存在,但在运行时可用\n pdfjs.GlobalWorkerOptions.cMapUrl = cMapUrl;\n // @ts-ignore\n pdfjs.GlobalWorkerOptions.cMapPacked = cMapPacked;\n}\n\n// 默认使用 CDN 配置\nconfigurePdfjs();\n\nexport { pdfjs };\n\n","// 导入样式\nimport './index.css';\n\n// 导入版本号\nimport packageJson from '../package.json';\n\n// 导出版本号\nexport const VERSION = packageJson.version;\n\n// 导出主组件\nexport { FilePreviewModal } from './FilePreviewModal';\nexport { FilePreviewEmbed } from './FilePreviewEmbed';\nexport { FilePreviewContent } from './FilePreviewContent';\n\n// 导出类型定义\nexport type {\n PreviewFile,\n PreviewFileLink,\n PreviewFileInput,\n FileType,\n ToolbarAction,\n PreviewState,\n CustomRenderer,\n CustomRendererContext,\n CustomRendererEventPayload,\n} from './types';\n\n// 导出工具函数\nexport { normalizeFile, normalizeFiles } from './utils/fileNormalizer';\n\n// 导出 PDF.js 配置函数和类型\nexport { configurePdfjs, pdfjs } from './utils/pdfConfig';\nexport type { PdfConfigOptions } from './utils/pdfConfig';\n\n// 导出 i18n 国际化\nexport { LocaleProvider, useTranslator, useLocale } from './i18n/LocaleContext';\nexport type { LocaleProviderProps, LocaleContextValue } from './i18n/LocaleContext';\nexport type {\n Locale,\n Messages,\n MessageKey,\n Translator,\n TranslateParams,\n CreateTranslatorOptions,\n Theme,\n} from '@eternalheart/file-preview-core';\n\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { motion } from 'framer-motion';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ninterface ImageRendererProps {\n url: string;\n zoom: number;\n rotation: number;\n resetKey?: number;\n fileSize?: number;\n onZoomChange?: (zoom: number) => void;\n onNaturalWidthChange?: (width: number) => void;\n onNaturalHeightChange?: (height: number) => void;\n}\n\nexport const ImageRenderer: React.FC<ImageRendererProps> = ({\n url,\n zoom,\n rotation,\n resetKey,\n fileSize,\n onZoomChange,\n onNaturalWidthChange,\n onNaturalHeightChange\n}) => {\n const t = useTranslator();\n const [loaded, setLoaded] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [internalZoom, setInternalZoom] = useState(1);\n const [naturalSize, setNaturalSize] = useState({ width: 0, height: 0 });\n const imgRef = useRef<HTMLImageElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLoaded(false);\n setError(null);\n setPosition({ x: 0, y: 0 });\n setInternalZoom(1);\n }, [url]);\n\n // 当外部 zoom 改变时,同步内部 zoom\n useEffect(() => {\n setInternalZoom(zoom);\n }, [zoom]);\n\n // 适应窗口/原始尺寸等操作时重置位置居中\n useEffect(() => {\n if (resetKey !== undefined) {\n setPosition({ x: 0, y: 0 });\n }\n }, [resetKey]);\n\n const handleLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(true);\n const img = e.currentTarget;\n setNaturalSize({ width: img.naturalWidth, height: img.naturalHeight });\n onNaturalWidthChange?.(img.naturalWidth);\n onNaturalHeightChange?.(img.naturalHeight);\n };\n\n // 边界限制:确保图片至少有一部分可见\n const clampPosition = useCallback((pos: { x: number; y: number }, currentZoom: number) => {\n const container = containerRef.current;\n if (!container || naturalSize.width === 0) return pos;\n\n const containerW = container.clientWidth;\n const containerH = container.clientHeight;\n const imgW = naturalSize.width * currentZoom;\n const imgH = naturalSize.height * currentZoom;\n\n // 至少保留 margin px 的图片在视口内\n const margin = Math.min(80, containerW * 0.15, containerH * 0.15);\n const rangeX = (containerW + imgW) / 2 - margin;\n const rangeY = (containerH + imgH) / 2 - margin;\n\n return {\n x: rangeX > 0 ? Math.max(-rangeX, Math.min(rangeX, pos.x)) : 0,\n y: rangeY > 0 ? Math.max(-rangeY, Math.min(rangeY, pos.y)) : 0,\n };\n }, [naturalSize]);\n\n const handleError = () => {\n setError(t('image.load_failed'));\n setLoaded(true);\n };\n\n // 双击复原:居中 + 缩放100%\n const handleDoubleClick = () => {\n setPosition({ x: 0, y: 0 });\n setInternalZoom(1);\n onZoomChange?.(1);\n };\n\n // 鼠标滚轮缩放 —— 以鼠标位置为缩放原点\n // 使用原生事件 + passive: false,确保 preventDefault 生效,\n // 避免滚轮事件冒泡触发外层(如嵌入模式下的页面滚动)\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheelNative = (e: WheelEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const rect = container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left - rect.width / 2;\n const mouseY = e.clientY - rect.top - rect.height / 2;\n\n const delta = e.deltaY > 0 ? -0.05 : 0.05;\n\n setInternalZoom(prev => {\n const newZoom = Math.max(0.01, Math.min(10, prev + delta));\n const scale = newZoom / prev;\n\n setPosition(pos => clampPosition({\n x: mouseX - scale * (mouseX - pos.x),\n y: mouseY - scale * (mouseY - pos.y),\n }, newZoom));\n\n onZoomChange?.(newZoom);\n return newZoom;\n });\n };\n\n container.addEventListener('wheel', handleWheelNative, { passive: false });\n return () => container.removeEventListener('wheel', handleWheelNative);\n }, [onZoomChange, clampPosition]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (e.button !== 0) return;\n setIsDragging(true);\n setDragStart({\n x: e.clientX - position.x,\n y: e.clientY - position.y,\n });\n }, [position]);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n setPosition(clampPosition({\n x: e.clientX - dragStart.x,\n y: e.clientY - dragStart.y,\n }, internalZoom));\n }, [isDragging, dragStart, internalZoom, clampPosition]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n return (\n <div\n ref={containerRef}\n className=\"rfp-relative rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-overflow-hidden\"\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n {!loaded && !error && (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {error && (\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n <motion.img\n ref={imgRef}\n src={url}\n alt=\"Preview\"\n className={`rfp-max-w-none rfp-select-none ${!loaded ? 'rfp-hidden' : ''}`}\n style={{\n transform: `translate(${position.x}px, ${position.y}px) scale(${internalZoom}) rotate(${rotation}deg)`,\n transformOrigin: 'center',\n transition: isDragging ? 'none' : 'transform 0.3s ease-out',\n }}\n onLoad={handleLoad}\n onError={handleError}\n onDoubleClick={handleDoubleClick}\n initial={{ opacity: 0 }}\n animate={{ opacity: loaded ? 1 : 0 }}\n transition={{ duration: 0.3 }}\n draggable={false}\n />\n\n {/* 右下角分辨率 */}\n {loaded && !error && naturalSize.width > 0 && (\n <div className=\"rfp-absolute rfp-bottom-2 rfp-right-3 rfp-text-[10px] rfp-text-fg-disabled hover:rfp-text-fg-secondary rfp-transition-colors rfp-pointer-events-auto rfp-select-none rfp-cursor-default\">\n {naturalSize.width} × {naturalSize.height}{fileSize != null && ` · ${fileSize < 1024 ? `${fileSize} B` : fileSize < 1024 * 1024 ? `${(fileSize / 1024).toFixed(1)} KB` : `${(fileSize / (1024 * 1024)).toFixed(1)} MB`}`}\n </div>\n )}\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Document, Page } from 'react-pdf';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\n// 导入 PDF.js 配置\nimport '../../utils/pdfConfig';\n\ninterface PdfRendererProps {\n url: string;\n zoom: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n onTotalPagesChange: (total: number) => void;\n onPageWidthChange?: (width: number) => void;\n}\n\nexport const PdfRenderer: React.FC<PdfRendererProps> = ({\n url,\n zoom,\n currentPage,\n onPageChange,\n onTotalPagesChange,\n onPageWidthChange,\n}) => {\n const t = useTranslator();\n const [numPages, setNumPages] = useState<number>(0);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const pageRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n useEffect(() => {\n setError(null);\n }, [url]);\n\n const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => {\n setNumPages(numPages);\n onTotalPagesChange(numPages);\n onPageChange(1);\n };\n\n const onDocumentLoadError = (error: Error) => {\n console.error('PDF 加载错误:', error);\n setError(t('pdf.load_failed'));\n };\n\n // 滚动时更新当前页码\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const scrollTop = container.scrollTop;\n const containerHeight = container.clientHeight;\n const scrollCenter = scrollTop + containerHeight / 2;\n\n // 找到当前可见的页面\n let currentVisiblePage = 1;\n let minDistance = Infinity;\n\n pageRefs.current.forEach((pageElement, pageNumber) => {\n const rect = pageElement.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const pageCenter = rect.top - containerRect.top + rect.height / 2 + scrollTop;\n const distance = Math.abs(pageCenter - scrollCenter);\n\n if (distance < minDistance) {\n minDistance = distance;\n currentVisiblePage = pageNumber;\n }\n });\n\n if (currentVisiblePage !== currentPage) {\n onPageChange(currentVisiblePage);\n }\n }, [currentPage, onPageChange]);\n\n // 监听滚动事件\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [handleScroll]);\n\n // 设置页面引用\n const setPageRef = useCallback((pageNumber: number, element: HTMLDivElement | null) => {\n if (element) {\n pageRefs.current.set(pageNumber, element);\n } else {\n pageRefs.current.delete(pageNumber);\n }\n }, []);\n\n return (\n <div\n ref={containerRef}\n className=\"rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-4 md:rfp-py-8 rfp-px-2 md:rfp-px-4\"\n >\n {error && (\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n {!error && (\n <Document\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-min-h-screen\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n >\n <div className=\"rfp-flex rfp-flex-col rfp-gap-4\">\n {Array.from(new Array(numPages), (_, index) => {\n const pageNumber = index + 1;\n return (\n <div\n key={`page_${pageNumber}`}\n ref={(el) => setPageRef(pageNumber, el)}\n className=\"rfp-relative\"\n >\n <Page\n pageNumber={pageNumber}\n scale={zoom}\n loading={\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-p-8 rfp-bg-surface-1 rfp-rounded-lg rfp-min-h-[600px]\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n renderTextLayer={false}\n renderAnnotationLayer={false}\n className=\"rfp-shadow-2xl\"\n onRenderSuccess={(page) => {\n if (pageNumber === 1 && onPageWidthChange) {\n // 上报 scale=1 时的原始页面宽度\n onPageWidthChange(page.originalWidth || page.width / zoom);\n }\n }}\n />\n {/* 页码标签 */}\n <div className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-bg-surface-nav-hover rfp-backdrop-blur-sm rfp-text-fg-primary rfp-text-xs rfp-px-3 rfp-py-1 rfp-rounded-full\">\n {pageNumber}\n </div>\n </div>\n );\n })}\n </div>\n </Document>\n )}\n\n {/* 底部页码指示器 */}\n {numPages > 0 && (\n <div className=\"rfp-sticky rfp-bottom-2 md:rfp-bottom-4 rfp-mt-4 md:rfp-mt-8 rfp-bg-surface-nav-hover rfp-backdrop-blur-xl rfp-text-fg-primary rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-rounded-full rfp-text-xs md:rfp-text-sm rfp-font-medium rfp-shadow-2xl rfp-border rfp-border-line-weak\">\n 第 {currentPage} 页 / 共 {numPages} 页\n </div>\n )}\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport mammoth from 'mammoth';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\ninterface DocxRendererProps {\n url: string;\n}\n\n// A4 page dimensions (96dpi)\nconst PAGE_HEIGHT = 1123;\nconst PAGE_PADDING_Y = 60;\nconst PAGE_PADDING_X = 50;\nconst PAGE_CONTENT_HEIGHT = PAGE_HEIGHT - PAGE_PADDING_Y * 2;\nconst PAGE_GAP = 24;\n\nconst contentStyle: React.CSSProperties = {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n lineHeight: '1.8',\n color: '#333',\n};\n\nexport const DocxRenderer: React.FC<DocxRendererProps> = ({ url }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [html, setHtml] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [pages, setPages] = useState<string[]>([]);\n const measureRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const loadDocx = async () => {\n setLoading(true);\n setError(null);\n setHtml('');\n\n try {\n const response = await fetcher(url);\n if (!response.ok) {\n throw new Error('文件加载失败');\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const result = await mammoth.convertToHtml({ arrayBuffer });\n setHtml(result.value);\n } catch (err) {\n console.error('Docx 解析错误:', err);\n setError(t('docx.parse_failed'));\n } finally {\n setLoading(false);\n }\n };\n\n loadDocx();\n }, [url, fetcher, t]);\n\n const paginate = useCallback(() => {\n const container = measureRef.current;\n if (!container || !html) return;\n\n const children = Array.from(container.children) as HTMLElement[];\n if (children.length === 0) {\n setPages([html]);\n return;\n }\n\n const result: string[][] = [[]];\n let currentPageUsed = 0;\n\n for (const child of children) {\n const h = child.offsetHeight;\n\n // If adding this block would exceed page content area and page isn't empty,\n // start a new page\n if (currentPageUsed > 0 && currentPageUsed + h > PAGE_CONTENT_HEIGHT) {\n result.push([]);\n currentPageUsed = 0;\n }\n\n result[result.length - 1].push(child.outerHTML);\n currentPageUsed += h;\n }\n\n // At least one page\n if (result.length === 0) result.push([]);\n\n setPages(result.map(blocks => blocks.join('')));\n }, [html]);\n\n useEffect(() => {\n if (!html || !measureRef.current) return;\n requestAnimationFrame(() => {\n paginate();\n });\n }, [html, paginate]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"rfp-w-full rfp-h-full rfp-overflow-auto\"\n style={{ background: 'rgba(0, 0, 0, 0.15)' }}\n >\n {/* Hidden measurement div — same width as page content area */}\n <div\n ref={measureRef}\n dangerouslySetInnerHTML={{ __html: html }}\n style={{\n ...contentStyle,\n position: 'absolute',\n visibility: 'hidden',\n width: `${794 - PAGE_PADDING_X * 2}px`,\n pointerEvents: 'none',\n }}\n />\n\n {/* Visible pages */}\n <div\n className=\"rfp-py-6 md:rfp-py-10 rfp-flex rfp-flex-col rfp-items-center\"\n style={{ gap: `${PAGE_GAP}px` }}\n >\n {(pages.length > 0 ? pages : ['']).map((pageHtml, i) => (\n <div\n key={i}\n style={{\n width: '100%',\n maxWidth: '794px',\n minHeight: `${PAGE_HEIGHT}px`,\n background: 'white',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.15)',\n flexShrink: 0,\n padding: `${PAGE_PADDING_Y}px ${PAGE_PADDING_X}px`,\n }}\n >\n <div\n dangerouslySetInnerHTML={{ __html: pageHtml }}\n style={contentStyle}\n />\n </div>\n ))}\n </div>\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { FileSpreadsheet } from 'lucide-react';\nimport ExcelJS from 'exceljs';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport { convertWorkbookToSpreadsheetData } from '../../utils/excelDataConverter';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\ninterface XlsxRendererProps {\n url: string;\n}\n\nexport const XlsxRenderer: React.FC<XlsxRendererProps> = ({ url }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n // 清空容器\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n // 监听容器尺寸变化\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadExcel = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetcher(url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(t('xlsx.not_found'));\n } else if (response.status === 403) {\n throw new Error('无权限访问此文件');\n } else {\n throw new Error(`文件加载失败 (${response.status})`);\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n // 使用 exceljs 解析\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer);\n\n // 转换为 x-data-spreadsheet 数据格式\n const sheetData = convertWorkbookToSpreadsheetData(workbook);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n\n // 挂载 x-data-spreadsheet\n mountSpreadsheet();\n\n setLoading(false);\n } catch (err) {\n if (isMounted) {\n console.error('Excel 解析错误:', err);\n let errorMsg = t('xlsx.parse_failed');\n if (err instanceof Error) {\n errorMsg = err.message;\n }\n setError(errorMsg);\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadExcel();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {/* 加载状态 */}\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('xlsx.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 错误状态 */}\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <div className=\"rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-green-500 rfp-via-emerald-500 rfp-to-teal-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl\">\n <FileSpreadsheet className=\"rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary\" />\n </div>\n <p className=\"rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium\">{t('xlsx.load_failed')}</p>\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6\">\n {error}\n </p>\n <a\n href={url}\n download\n className=\"rfp-inline-flex rfp-items-center rfp-gap-2 rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-bg-gradient-to-r rfp-from-purple-500 rfp-to-pink-500 rfp-text-fg-primary rfp-text-sm md:rfp-text-base rfp-rounded-lg md:rfp-rounded-xl hover:rfp-scale-105 rfp-transition-all rfp-shadow-lg\"\n >\n <svg className=\"rfp-w-4 rfp-h-4 md:rfp-w-5 md:rfp-h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n {t('common.download')}\n </a>\n <p className=\"rfp-text-xs rfp-text-fg-muted rfp-mt-3 md:rfp-mt-4\">\n 提示:可以使用 Microsoft Excel 或 WPS 打开\n </p>\n </div>\n </div>\n )}\n\n {/* Spreadsheet 容器 */}\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Presentation } from 'lucide-react';\nimport { init } from 'pptx-preview';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\ninterface PptxRendererProps {\n url: string;\n /** 是否平铺展示所有页面,默认 true */\n tiled?: boolean;\n}\n\nexport const PptxRenderer: React.FC<PptxRendererProps> = ({ url, tiled = true }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [slideCount, setSlideCount] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const previewerRef = useRef<ReturnType<typeof init> | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const arrayBufferRef = useRef<ArrayBuffer | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n // 计算容器尺寸,带回退逻辑\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 960, height: 540 };\n const rawWidth = containerRef.current.clientWidth;\n const parentWidth = containerRef.current.parentElement?.clientWidth || 0;\n // 如果容器宽度太小,回退到父容器宽度或默认最小值\n const containerWidth = rawWidth > 100 ? rawWidth : (parentWidth > 100 ? parentWidth : 300);\n // 16:9 比例\n const height = Math.floor(containerWidth * 9 / 16);\n return { width: containerWidth, height };\n }, []);\n\n // 重新初始化预览器\n const reinitializePreviewer = useCallback(async () => {\n if (!containerRef.current || !arrayBufferRef.current || slideCount === 0) return;\n\n try {\n // 销毁旧的预览器\n if (previewerRef.current) {\n try {\n previewerRef.current.destroy();\n } catch {\n // 忽略销毁错误\n }\n }\n\n // 清空容器\n containerRef.current.innerHTML = '';\n\n // 获取当前容器尺寸\n const currentDimensions = calculateDimensions();\n\n // 初始化新的预览器,平铺模式下高度按页数计算\n const previewer = init(containerRef.current, {\n width: currentDimensions.width,\n height: tiled ? currentDimensions.height * slideCount : currentDimensions.height,\n mode: tiled ? 'list' : 'slide',\n });\n previewerRef.current = previewer;\n\n // 重新预览\n await previewer.preview(arrayBufferRef.current);\n } catch {\n // 重新初始化失败,静默处理\n }\n }, [calculateDimensions, tiled, slideCount]);\n\n // 监听容器尺寸变化\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n // 跳过初始渲染时的尺寸检查\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n\n // 检查尺寸是否真正变化(至少变化10px才触发)\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) {\n return;\n }\n\n // 更新最后的尺寸\n lastDimensionsRef.current = newDimensions;\n\n // 清除之前的定时器\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n // 防抖:800ms 后重新初始化预览器\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (previewerRef.current && arrayBufferRef.current) {\n reinitializePreviewer();\n }\n }, 800);\n };\n\n // 创建 ResizeObserver\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n // 开始观察容器\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, reinitializePreviewer]);\n\n useEffect(() => {\n let isMounted = true;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const loadPptx = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n // 设置30秒超时\n timeoutId = setTimeout(() => {\n if (isMounted) {\n setError(t('pptx.timeout'));\n setLoading(false);\n }\n }, 30000);\n\n try {\n // 获取文件,处理 CORS 和重定向\n const response = await fetcher(url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(t('pptx.not_found'));\n } else if (response.status === 403) {\n throw new Error('无权限访问此文件');\n } else if (response.status >= 500) {\n throw new Error('服务器错误,请稍后重试');\n } else {\n throw new Error(`文件加载失败 (${response.status})`);\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n // 验证文件大小\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n arrayBufferRef.current = arrayBuffer;\n\n if (!isMounted) return;\n\n // 步骤 1: 创建隐藏容器,预处理获取 slideCount\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.cssText = 'position:absolute;left:-9999px;top:-9999px;visibility:hidden';\n document.body.appendChild(hiddenContainer);\n\n try {\n // 在隐藏容器中初始化临时预览器获取页数\n const tempPreviewer = init(hiddenContainer, {\n width: 100,\n height: 100,\n mode: 'slide',\n });\n\n try {\n await tempPreviewer.preview(arrayBuffer);\n } catch {\n throw new Error(t('pptx.invalid_format'));\n }\n\n const count = tempPreviewer.slideCount;\n\n if (!count || count === 0) {\n throw new Error(t('pptx.no_pages'));\n }\n\n // 销毁临时预览器\n tempPreviewer.destroy();\n\n if (!isMounted) return;\n\n // 保存 slideCount\n setSlideCount(count);\n\n // 步骤 2: 清空真实容器并初始化\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n\n const currentDimensions = calculateDimensions();\n\n // 步骤 3: 初始化真实预览器,平铺模式下使用正确的总高度\n const previewer = init(containerRef.current, {\n width: currentDimensions.width,\n height: tiled ? currentDimensions.height * count : currentDimensions.height,\n mode: tiled ? 'list' : 'slide',\n });\n previewerRef.current = previewer;\n\n // 步骤 4: 预览 PPTX\n await previewer.preview(arrayBuffer);\n\n // 清除超时定时器\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (isMounted) {\n setLoading(false);\n }\n } finally {\n // 移除隐藏容器\n if (document.body.contains(hiddenContainer)) {\n document.body.removeChild(hiddenContainer);\n }\n }\n } catch (err) {\n // 清除超时定时器\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (isMounted) {\n let errorMsg = t('pptx.parse_failed');\n if (err instanceof Error) {\n errorMsg = err.message;\n } else if (typeof err === 'string') {\n errorMsg = err;\n }\n setError(errorMsg);\n setLoading(false);\n }\n }\n };\n\n // 延迟执行,使用 requestAnimationFrame 确保 DOM 已准备好\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n loadPptx();\n });\n });\n }, 150);\n\n // 清理函数\n return () => {\n isMounted = false;\n clearTimeout(timer);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n arrayBufferRef.current = null;\n setSlideCount(0);\n if (previewerRef.current) {\n try {\n previewerRef.current.destroy();\n } catch {\n // 忽略销毁错误\n }\n }\n previewerRef.current = null;\n };\n }, [url, calculateDimensions, tiled]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {/* 加载状态 - 绝对定位覆盖 */}\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('pptx.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 错误状态 - 绝对定位覆盖 */}\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <div className=\"rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-orange-500 rfp-via-red-500 rfp-to-pink-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl\">\n <Presentation className=\"rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary\" />\n </div>\n <p className=\"rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium\">{t('pptx.load_failed')}</p>\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6\">\n {error}\n </p>\n <a\n href={url}\n download\n className=\"rfp-inline-flex rfp-items-center rfp-gap-2 rfp-px-4 rfp-py-2 md:rfp-px-6 md:rfp-py-3 rfp-bg-gradient-to-r rfp-from-purple-500 rfp-to-pink-500 rfp-text-fg-primary rfp-text-sm md:rfp-text-base rfp-rounded-lg md:rfp-rounded-xl hover:rfp-scale-105 rfp-transition-all rfp-shadow-lg\"\n >\n <svg className=\"rfp-w-4 rfp-h-4 md:rfp-w-5 md:rfp-h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n {t('common.download')}\n </a>\n <p className=\"rfp-text-xs rfp-text-fg-muted rfp-mt-3 md:rfp-mt-4\">\n 提示:可以使用 Microsoft PowerPoint 或 WPS 打开\n </p>\n </div>\n </div>\n )}\n\n {/* PPT 容器 - 仅在非错误状态下渲染 */}\n {!error && (\n <div\n ref={containerRef}\n className=\"pptx-wrapper rfp-w-full rfp-max-w-full md:rfp-max-w-6xl\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport MsgReader from '@kenjiuno/msgreader';\nimport type { FieldsData } from '@kenjiuno/msgreader';\nimport { User, Users, Paperclip, Calendar, Mail, Tag, Clock, Hash } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\ninterface MsgRendererProps {\n url: string;\n}\n\nfunction formatRecipients(recipients: FieldsData[] | undefined, type: 'to' | 'cc' | 'bcc'): string {\n if (!recipients) return '';\n return recipients\n .filter((r) => r.recipType === type)\n .map((r) => {\n const name = r.name || '';\n const email = r.smtpAddress || r.email || '';\n if (name && email && name !== email) {\n return `${name} <${email}>`;\n }\n return name || email;\n })\n .filter(Boolean)\n .join('; ');\n}\n\nfunction formatDate(dateStr: string | undefined): string {\n if (!dateStr) return '';\n try {\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n return date.toLocaleString();\n } catch {\n return dateStr;\n }\n}\n\nfunction decodeHtmlBody(fields: FieldsData, emptyBodyText: string): string {\n // 优先使用 bodyHtml (string 类型)\n if (fields.bodyHtml) {\n return fields.bodyHtml;\n }\n // 其次尝试 html (Uint8Array 类型)\n if (fields.html) {\n try {\n const decoder = new TextDecoder('utf-8');\n return decoder.decode(fields.html);\n } catch {\n // fallback\n }\n }\n // 最后使用纯文本,转换为简单 HTML\n if (fields.body) {\n return `<pre style=\"white-space: pre-wrap; word-wrap: break-word; font-family: system-ui, sans-serif;\">${fields.body.replace(/&/g, '&').replace(/\\x3c/g, '<').replace(/>/g, '>')\n }</pre>`;\n }\n return `<p style=\"color: #999;\">${emptyBodyText}</p>`;\n}\n\nfunction formatMessageClass(messageClass: string | undefined): string {\n if (!messageClass) return '';\n const classMap: Record<string, string> = {\n 'IPM.Note': 'Email',\n 'IPM.Note.SMIME': 'Encrypted Email',\n 'IPM.Note.SMIME.MultipartSigned': 'Signed Email',\n 'IPM.Appointment': 'Appointment',\n 'IPM.Schedule.Meeting.Request': 'Meeting Request',\n 'IPM.Schedule.Meeting.Canceled': 'Meeting Cancellation',\n 'IPM.Contact': 'Contact',\n 'IPM.Task': 'Task',\n 'IPM.StickyNote': 'Sticky Note',\n };\n return classMap[messageClass] || messageClass;\n}\n\nconst labelStyle: React.CSSProperties = {\n flexShrink: 0,\n color: '#6b7280',\n fontWeight: 500,\n marginRight: '8px',\n whiteSpace: 'nowrap',\n};\n\nconst rowStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n padding: '6px 0',\n};\n\nconst iconWrapStyle: React.CSSProperties = {\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n height: '1.4em',\n};\n\nconst iconStyle: React.CSSProperties = {\n flexShrink: 0,\n color: '#9ca3af',\n};\n\nconst valueStyle: React.CSSProperties = {\n color: '#111827',\n wordBreak: 'break-word' as const,\n flex: 1,\n};\n\nexport const MsgRenderer: React.FC<MsgRendererProps> = ({ url }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [fields, setFields] = useState<FieldsData | null>(null);\n\n useEffect(() => {\n const loadMsg = async () => {\n setLoading(true);\n setError(null);\n setFields(null);\n\n try {\n const response = await fetcher(url);\n if (!response.ok) {\n throw new Error('文件加载失败');\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const msgReader = new MsgReader(arrayBuffer);\n const fileData = msgReader.getFileData();\n setFields(fileData);\n } catch (err) {\n console.error('MSG 解析错误:', err);\n setError(t('msg.parse_failed'));\n } finally {\n setLoading(false);\n }\n };\n\n loadMsg();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error || !fields) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error || t('msg.parse_failed_short')}</p>\n </div>\n </div>\n );\n }\n\n const toStr = formatRecipients(fields.recipients, 'to');\n const ccStr = formatRecipients(fields.recipients, 'cc');\n const bccStr = formatRecipients(fields.recipients, 'bcc');\n const senderName = fields.senderName || '';\n const senderEmail = fields.senderSmtpAddress || fields.senderEmail || '';\n const sender = senderName && senderEmail && senderName !== senderEmail\n ? `${senderName} <${senderEmail}>`\n : senderName || senderEmail;\n const sentDate = formatDate(fields.clientSubmitTime);\n const receivedDate = formatDate(fields.messageDeliveryTime);\n const createdDate = formatDate(fields.creationTime);\n const lastModified = formatDate(fields.lastModificationTime);\n const subject = fields.subject || '(无主题)';\n const attachments = (fields.attachments || []).filter((a) => !a.attachmentHidden);\n const bodyHtml = decodeHtmlBody(fields, t('msg.empty_body'));\n const messageClass = formatMessageClass(fields.messageClass);\n const messageId = fields.messageId || '';\n const fieldsAny = fields as FieldsData & Record<string, unknown>;\n const importance = typeof fieldsAny.importance === 'number' ? fieldsAny.importance : undefined;\n const importanceLabel = importance === 2 ? 'High' : importance === 0 ? 'Low' : '';\n const sensitivity = typeof fieldsAny.sensitivity === 'number' ? fieldsAny.sensitivity : undefined;\n const sensitivityLabels: Record<number, string> = {\n 0: 'Normal',\n 1: 'Personal',\n 2: 'Private',\n 3: 'Confidential',\n };\n const sensitivityLabel = sensitivity !== undefined && sensitivity !== 0 ? sensitivityLabels[sensitivity] || '' : '';\n\n return (\n <div\n className=\"rfp-w-full rfp-h-full rfp-overflow-auto\"\n style={{ background: 'white' }}\n >\n <div\n style={{\n width: '100%',\n background: 'white',\n minHeight: '100%',\n }}\n >\n {/* 邮件头部 */}\n <div style={{ borderBottom: '1px solid #e5e7eb', padding: 'clamp(12px, 3vw, 24px) clamp(16px, 3vw, 28px)', background: '#f9fafb' }}>\n {/* 主题 */}\n <h2 style={{ margin: '0 0 16px 0', fontSize: 'clamp(16px, 2.5vw, 20px)', fontWeight: 600, color: '#111827', lineHeight: 1.4 }}>\n {subject}\n </h2>\n\n {/* 元信息 */}\n <div style={{ display: 'flex', flexDirection: 'column', fontSize: 'clamp(12px, 1.8vw, 14px)', color: '#4b5563' }}>\n {sender && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><User size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>From</span>\n <span style={valueStyle}>{sender}</span>\n </div>\n </div>\n )}\n\n {toStr && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Users size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>To</span>\n <span style={valueStyle}>{toStr}</span>\n </div>\n </div>\n )}\n\n {ccStr && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Users size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Cc</span>\n <span style={valueStyle}>{ccStr}</span>\n </div>\n </div>\n )}\n\n {bccStr && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Users size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Bcc</span>\n <span style={valueStyle}>{bccStr}</span>\n </div>\n </div>\n )}\n\n {sentDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Calendar size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Sent</span>\n <span style={valueStyle}>{sentDate}</span>\n </div>\n </div>\n )}\n\n {receivedDate && receivedDate !== sentDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Clock size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Received</span>\n <span style={valueStyle}>{receivedDate}</span>\n </div>\n </div>\n )}\n\n {!sentDate && !receivedDate && createdDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Calendar size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Date</span>\n <span style={valueStyle}>{createdDate}</span>\n </div>\n </div>\n )}\n\n {importanceLabel && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Tag size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Importance</span>\n <span style={{\n ...valueStyle,\n color: importance === 2 ? '#dc2626' : '#2563eb',\n fontWeight: 500,\n }}>\n {importanceLabel}\n </span>\n </div>\n </div>\n )}\n\n {sensitivityLabel && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Tag size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Sensitivity</span>\n <span style={valueStyle}>{sensitivityLabel}</span>\n </div>\n </div>\n )}\n\n {messageClass && messageClass !== 'Email' && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Mail size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Type</span>\n <span style={valueStyle}>{messageClass}</span>\n </div>\n </div>\n )}\n\n {attachments.length > 0 && (\n <div style={{ ...rowStyle, borderTop: '1px solid #e5e7eb', marginTop: '4px', paddingTop: '10px' }}>\n <span style={iconWrapStyle}><Paperclip size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Attachments</span>\n <div style={{ ...valueStyle, display: 'flex', flexWrap: 'wrap', gap: '6px' }}>\n {attachments.map((a, i) => {\n const name = a.fileName || a.name || '未知文件';\n const size = a.contentLength;\n const sizeStr = size\n ? size > 1048576\n ? `${(size / 1048576).toFixed(1)} MB`\n : size > 1024\n ? `${(size / 1024).toFixed(0)} KB`\n : `${size} B`\n : '';\n return (\n <span\n key={i}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n background: '#f3f4f6',\n borderRadius: '4px',\n fontSize: '13px',\n color: '#374151',\n border: '1px solid #e5e7eb',\n }}\n >\n {name}\n {sizeStr && (\n <span style={{ color: '#9ca3af', fontSize: '12px' }}>({sizeStr})</span>\n )}\n </span>\n );\n })}\n </div>\n </div>\n </div>\n )}\n\n {messageId && (\n <div style={{ ...rowStyle, borderTop: attachments.length > 0 ? 'none' : '1px solid #e5e7eb', marginTop: '4px', paddingTop: '10px' }}>\n <span style={iconWrapStyle}><Hash size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Message-ID</span>\n <span style={{ ...valueStyle, fontSize: '12px', color: '#9ca3af', fontFamily: 'monospace' }}>{messageId}</span>\n </div>\n </div>\n )}\n\n {lastModified && lastModified !== sentDate && lastModified !== receivedDate && (\n <div style={rowStyle}>\n <span style={iconWrapStyle}><Clock size={16} style={iconStyle} /></span>\n <div style={{ display: 'flex', flex: 1 }}>\n <span style={labelStyle}>Modified</span>\n <span style={{ ...valueStyle, fontSize: '12px', color: '#9ca3af' }}>{lastModified}</span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* 邮件正文 */}\n <div\n style={{\n padding: 'clamp(12px, 3vw, 24px) clamp(16px, 3vw, 28px)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n lineHeight: '1.6',\n color: '#333',\n overflowX: 'auto',\n }}\n dangerouslySetInnerHTML={{ __html: bodyHtml }}\n />\n </div>\n </div>\n );\n};\n","import { useEffect, useRef, useState, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport ePub from '@likecoin/epub-ts';\nimport { X } from 'lucide-react';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\n// 全局注入 epubjs 容器样式(只注入一次)\nif (typeof document !== 'undefined' && !document.getElementById('rfp-epub-styles')) {\n const styleEl = document.createElement('style');\n styleEl.id = 'rfp-epub-styles';\n styleEl.textContent = `\n .epub-container { overflow-y: auto !important; scrollbar-width: thin; }\n .epub-container::-webkit-scrollbar { width: 8px; }\n .epub-container::-webkit-scrollbar-track { background: transparent; }\n .epub-container::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.15); border-radius: 4px; }\n .epub-container::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.3); }\n .epub-view > iframe { background: white; }\n `;\n document.head.appendChild(styleEl);\n}\n\nexport interface TocItem {\n label: string;\n href: string;\n subitems?: TocItem[];\n}\n\nexport interface EpubRendererHandle {\n prevPage: () => void;\n nextPage: () => void;\n toggleFullWidth: () => void;\n toggleToc: () => void;\n}\n\ninterface EpubRendererProps {\n url: string;\n onChapterChange?: (current: number, total: number) => void;\n onFullWidthChange?: (isFullWidth: boolean) => void;\n}\n\ninterface RenditionLike {\n display: (target?: string) => Promise<unknown>;\n next: () => Promise<unknown>;\n prev: () => Promise<unknown>;\n on: (event: string, cb: (...args: unknown[]) => void) => void;\n resize: (width: number, height: number) => void;\n currentLocation: () => unknown;\n destroy?: () => void;\n themes: {\n register: (name: string, styles: Record<string, unknown>) => void;\n select: (name: string) => void;\n };\n}\n\ninterface BookLike {\n ready: Promise<unknown>;\n loaded: { navigation: Promise<unknown> };\n locations: {\n generate: (chars: number) => Promise<string[]>;\n length: () => number;\n locationFromCfi: (cfi: string) => number;\n };\n renderTo: (el: HTMLElement, opts: Record<string, unknown>) => RenditionLike;\n destroy: () => void;\n}\n\nconst A4_WIDTH = 794;\n\nexport const EpubRenderer = forwardRef<EpubRendererHandle, EpubRendererProps>(\n ({ url, onChapterChange, onFullWidthChange }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const viewerRef = useRef<HTMLDivElement>(null);\n const bookRef = useRef<BookLike | null>(null);\n const renditionRef = useRef<RenditionLike | null>(null);\n const onChapterChangeRef = useRef(onChapterChange);\n const onFullWidthChangeRef = useRef(onFullWidthChange);\n onChapterChangeRef.current = onChapterChange;\n onFullWidthChangeRef.current = onFullWidthChange;\n\n const totalLocationsRef = useRef(0);\n const lastCfiRef = useRef<string | null>(null);\n const isFullWidthRef = useRef(false);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isFullWidth, setIsFullWidth] = useState(false);\n const [toc, setToc] = useState<TocItem[]>([]);\n const [showToc, setShowToc] = useState(false);\n const [activeTocHref, setActiveTocHref] = useState<string>('');\n const tocRef = useRef<TocItem[]>([]);\n tocRef.current = toc;\n\n isFullWidthRef.current = isFullWidth;\n\n const handlePrev = useCallback(() => {\n renditionRef.current?.prev();\n }, []);\n\n const handleNext = useCallback(() => {\n renditionRef.current?.next();\n }, []);\n\n // 滚动监听:接近底部时强制触发 check 加载后续 section\n const scrollContainerRef = useRef<Element | null>(null);\n const scrollRafRef = useRef(0);\n\n const onScrollRef = useRef((_e?: Event) => {\n const container = scrollContainerRef.current;\n if (!container) return;\n const el = container as HTMLElement;\n const nearBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 200;\n if (nearBottom) {\n try {\n const mgr = (renditionRef.current as unknown as { manager?: { check?: (t?: number, e?: number) => Promise<unknown> } })?.manager;\n mgr?.check?.(500, 500);\n } catch { /* ignore */ }\n }\n });\n\n const reattachScrollListener = useCallback(() => {\n // 清理旧监听\n if (scrollContainerRef.current) {\n scrollContainerRef.current.removeEventListener('scroll', onScrollRef.current);\n scrollContainerRef.current = null;\n }\n cancelAnimationFrame(scrollRafRef.current);\n\n const tryAttach = () => {\n const container = viewerRef.current?.querySelector('.epub-container') ?? null;\n if (!container) {\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n return;\n }\n scrollContainerRef.current = container;\n container.addEventListener('scroll', onScrollRef.current, { passive: true });\n };\n scrollRafRef.current = requestAnimationFrame(tryAttach);\n }, []);\n\n const toggleFullWidth = useCallback(() => {\n const newVal = !isFullWidthRef.current;\n setIsFullWidth(newVal);\n onFullWidthChangeRef.current?.(newVal);\n // 等 CSS transition 完成后再 resize 并恢复位置\n setTimeout(() => {\n const viewer = viewerRef.current;\n const rendition = renditionRef.current;\n if (!viewer || !rendition) return;\n rendition.resize(viewer.offsetWidth, viewer.offsetHeight);\n // 重排后恢复阅读位置\n if (lastCfiRef.current) {\n rendition.display(lastCfiRef.current);\n }\n // resize/display 可能重建 .epub-container,需要重新绑定滚动监听\n reattachScrollListener();\n }, 350);\n }, [reattachScrollListener]);\n\n const toggleToc = useCallback(() => {\n setShowToc(prev => !prev);\n }, []);\n\n const handleTocClick = useCallback((href: string) => {\n setActiveTocHref(href);\n renditionRef.current?.display(href);\n setShowToc(false);\n }, []);\n\n useImperativeHandle(ref, () => ({\n prevPage: handlePrev,\n nextPage: handleNext,\n toggleFullWidth,\n toggleToc,\n }), [handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n useEffect(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n\n setLoading(true);\n setError(null);\n setToc([]);\n setShowToc(false);\n viewer.innerHTML = '';\n lastCfiRef.current = null;\n totalLocationsRef.current = 0;\n\n let cancelled = false;\n // StrictMode 下 effect 会立即 mount→unmount→mount\n // 用 microtask 延迟初始化,让第一次的 cleanup 先执行,避免 epubjs 内部状态被污染\n const loadTimer = window.setTimeout(() => {\n if (cancelled) return;\n load();\n }, 0);\n\n const load = async () => {\n try {\n let bookInput: string | ArrayBuffer = url;\n if (url.startsWith('blob:')) {\n const resp = await fetcher(url);\n bookInput = await resp.arrayBuffer();\n }\n\n const book = ePub(bookInput) as unknown as BookLike;\n bookRef.current = book;\n\n const rendition = book.renderTo(viewer, {\n manager: 'continuous',\n flow: 'scrolled',\n width: '100%',\n height: '100%',\n });\n renditionRef.current = rendition;\n\n rendition.themes.register('default', {\n body: {\n background: '#ffffff !important',\n color: '#1a1a1a !important',\n 'font-family': '\"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important',\n 'font-size': '16px !important',\n 'line-height': '2 !important',\n padding: '40px 60px !important',\n 'max-width': '100% !important',\n 'box-sizing': 'border-box !important',\n 'word-break': 'break-word !important',\n 'overflow-wrap': 'break-word !important',\n },\n p: { 'text-indent': '2em !important', margin: '0.8em 0 !important' },\n h1: { 'text-align': 'center !important', margin: '1.5em 0 1em !important' },\n h2: { margin: '1.2em 0 0.8em !important' },\n h3: { margin: '1em 0 0.6em !important' },\n img: { 'max-width': '100% !important', height: 'auto !important' },\n a: { color: '#2563eb !important', 'text-decoration': 'none !important' },\n });\n rendition.themes.select('default');\n\n await book.ready;\n\n // 异步生成 locations 索引(用于实时页数)\n book.locations.generate(1024).then(() => {\n if (cancelled) return;\n totalLocationsRef.current = book.locations.length();\n // 触发一次更新让父组件拿到 total\n const loc = renditionRef.current?.currentLocation() as { start?: { location?: number; cfi?: string } } | undefined;\n const cur = loc?.start?.location ?? 0;\n onChapterChangeRef.current?.(cur + 1, totalLocationsRef.current);\n }).catch(() => { /* ignore */ });\n\n // 获取目录\n const nav = await book.loaded.navigation as { toc?: TocItem[] };\n if (!cancelled && Array.isArray(nav?.toc)) {\n setToc(nav.toc);\n }\n\n await rendition.display();\n\n if (cancelled) return;\n\n setLoading(false);\n onChapterChangeRef.current?.(1, totalLocationsRef.current || 1);\n\n rendition.on('relocated', (location: unknown) => {\n const loc = location as { start?: { cfi?: string; location?: number; href?: string } };\n if (loc?.start?.cfi) {\n lastCfiRef.current = loc.start.cfi;\n }\n if (loc?.start?.href) {\n // 根据 spine href 查找匹配的 TOC 项\n const spineHref = loc.start.href;\n const matches: string[] = [];\n const collect = (items: TocItem[]) => {\n for (const item of items) {\n const base = item.href.split('#')[0];\n if (base && (spineHref === base || spineHref.endsWith('/' + base) || spineHref.endsWith(base))) {\n matches.push(item.href);\n }\n if (item.subitems) collect(item.subitems);\n }\n };\n collect(tocRef.current);\n if (matches.length === 1) {\n // 唯一匹配,直接设置\n setActiveTocHref(matches[0]);\n }\n // 多个匹配(同一文件不同 anchor)时保持当前选中(由点击设置)\n }\n const cur = loc?.start?.location;\n const total = totalLocationsRef.current;\n if (typeof cur === 'number' && total > 0) {\n onChapterChangeRef.current?.(cur + 1, total);\n }\n });\n\n } catch (err) {\n console.error('EPUB 加载错误:', err);\n if (!cancelled) {\n setError(t('epub.load_failed'));\n setLoading(false);\n }\n }\n };\n\n return () => {\n cancelled = true;\n window.clearTimeout(loadTimer);\n try { renditionRef.current?.destroy?.(); } catch { /* ignore */ }\n try { bookRef.current?.destroy(); } catch { /* ignore */ }\n renditionRef.current = null;\n bookRef.current = null;\n };\n }, [url]);\n\n useEffect(() => {\n const onResize = () => {\n const viewer = viewerRef.current;\n if (!viewer || !renditionRef.current) return;\n renditionRef.current.resize(viewer.offsetWidth, viewer.offsetHeight);\n };\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n useEffect(() => {\n reattachScrollListener();\n return () => {\n cancelAnimationFrame(scrollRafRef.current);\n scrollContainerRef.current?.removeEventListener('scroll', onScrollRef.current);\n };\n }, [url, reattachScrollListener]);\n\n const isActive = useCallback((href: string) => {\n return href === activeTocHref;\n }, [activeTocHref]);\n\n const renderTocItems = (items: TocItem[], depth = 0) => (\n <ul style={{ marginLeft: depth > 0 ? 16 : 0 }}>\n {items.map((item, i) => {\n const active = isActive(item.href);\n return (\n <li key={`${item.href}-${i}`}>\n <button\n onClick={() => handleTocClick(item.href)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${active\n ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.label}\n >\n {item.label.trim()}\n </button>\n {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n </li>\n );\n })}\n </ul>\n );\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-[#f5f5f0] rfp-overflow-hidden\">\n {error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n {loading && !error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {/* 目录侧栏 - 滑入动画 */}\n {toc.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{\n opacity: showToc ? 1 : 0,\n pointerEvents: showToc ? 'auto' : 'none',\n }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.toc')}</span>\n <button\n onClick={() => setShowToc(false)}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderTocItems(toc)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowToc(false)}\n />\n </div>\n )}\n\n {!error && (\n <div\n ref={viewerRef}\n className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n style={{\n width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n maxWidth: '100%',\n transition: 'width 0.3s ease',\n overflow: 'hidden',\n }}\n />\n )}\n </div>\n );\n }\n);\n","import {\n useEffect,\n useRef,\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from 'react';\nimport { X } from 'lucide-react';\nimport 'foliate-js/view.js';\nimport type { FoliateView, TocItem } from 'foliate-js/view.js';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\nconst READER_CSS = `\n @namespace epub \"http://www.idpf.org/2007/ops\";\n html { color-scheme: light; }\n body {\n background: #ffffff !important;\n color: #1a1a1a !important;\n font-family: \"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important;\n font-size: 16px !important;\n line-height: 2 !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n }\n p, li, blockquote, dd { line-height: 2; text-align: justify; }\n p { text-indent: 2em; margin: 0.8em 0; }\n h1 { text-align: center; margin: 1.5em 0 1em; }\n h2 { margin: 1.2em 0 0.8em; }\n h3 { margin: 1em 0 0.6em; }\n img { max-width: 100% !important; height: auto !important; }\n a { color: #2563eb; text-decoration: none; }\n pre { white-space: pre-wrap !important; }\n`;\n\nconst A4_WIDTH = 794;\n\nexport interface MobiRendererHandle {\n prevPage: () => void;\n nextPage: () => void;\n toggleFullWidth: () => void;\n toggleToc: () => void;\n}\n\ninterface MobiRendererProps {\n url: string;\n onChapterChange?: (current: number, total: number) => void;\n onFullWidthChange?: (isFullWidth: boolean) => void;\n}\n\nexport const MobiRenderer = forwardRef<MobiRendererHandle, MobiRendererProps>(\n ({ url, onChapterChange, onFullWidthChange }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const hostRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<FoliateView | null>(null);\n const onChapterChangeRef = useRef(onChapterChange);\n const onFullWidthChangeRef = useRef(onFullWidthChange);\n onChapterChangeRef.current = onChapterChange;\n onFullWidthChangeRef.current = onFullWidthChange;\n\n // 模拟 epub.js 的 locations 显示\n const totalLocationsRef = useRef(1);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [toc, setToc] = useState<TocItem[]>([]);\n const [showToc, setShowToc] = useState(false);\n const [activeTocHref, setActiveTocHref] = useState<string>('');\n const [isFullWidth, setIsFullWidth] = useState(false);\n const isFullWidthRef = useRef(false);\n isFullWidthRef.current = isFullWidth;\n\n const reportProgress = useCallback((current: number, total: number) => {\n if (total > 0) totalLocationsRef.current = total;\n onChapterChangeRef.current?.(Math.max(1, current + 1), totalLocationsRef.current);\n }, []);\n\n const handlePrev = useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n view.prev().catch(() => {});\n }, []);\n\n const handleNext = useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n view.next().catch(() => {});\n }, []);\n\n const toggleToc = useCallback(() => setShowToc((prev) => !prev), []);\n\n const toggleFullWidth = useCallback(() => {\n const newVal = !isFullWidthRef.current;\n setIsFullWidth(newVal);\n onFullWidthChangeRef.current?.(newVal);\n // 宽度改变后 paginator 需要重新分页\n const view = viewRef.current;\n if (!view) return;\n const renderer = (view as unknown as { renderer?: HTMLElement }).renderer;\n if (renderer) {\n renderer.setAttribute('max-inline-size', newVal ? '9999' : '720');\n }\n }, []);\n\n const handleTocClick = useCallback((href: string) => {\n setActiveTocHref(href);\n setShowToc(false);\n viewRef.current?.goTo(href).catch(() => {});\n }, []);\n\n useImperativeHandle(ref, () => ({\n prevPage: handlePrev,\n nextPage: handleNext,\n toggleFullWidth,\n toggleToc,\n }), [handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n setLoading(true);\n setError(null);\n setToc([]);\n setShowToc(false);\n setActiveTocHref('');\n host.replaceChildren();\n\n let cancelled = false;\n let view: FoliateView | null = null;\n\n const load = async () => {\n try {\n if (cancelled) return;\n\n view = document.createElement('foliate-view') as FoliateView;\n host.appendChild(view);\n viewRef.current = view;\n\n // 先注册事件\n view.addEventListener('relocate', (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n // SectionProgress 返回的 location 对象: { current, next, total }\n const loc = detail.location as { current?: number; total?: number } | undefined;\n if (loc && typeof loc.current === 'number' && typeof loc.total === 'number') {\n reportProgress(loc.current, loc.total);\n } else {\n // fallback:用 section 级别估算\n const sections = viewRef.current?.book?.sections ?? [];\n const idx = detail.index ?? 0;\n const frac = detail.fraction ?? 0;\n const total = Math.max(sections.length, 1);\n const current = Math.round((idx + frac) / total * total);\n reportProgress(current, total);\n }\n const tocItem = detail.tocItem as { href?: string } | undefined;\n if (tocItem?.href) {\n setActiveTocHref(tocItem.href);\n }\n });\n\n const res = await fetcher(url);\n if (!res.ok) throw new Error(`请求失败: ${res.status}`);\n const blob = await res.blob();\n let name = 'book.mobi';\n try {\n const u = new URL(url, window.location.href);\n const base = u.pathname.split('/').pop();\n if (base) name = decodeURIComponent(base);\n } catch { /* blob: URL */ }\n const file = new File([blob], name);\n\n await view.open(file);\n if (cancelled) { view.book?.destroy?.(); return; }\n\n // 配置 paginator:paginated 模式(默认),带动画\n const renderer = (view as unknown as { renderer: HTMLElement & {\n setStyles?: (css: string) => void;\n next?: () => Promise<void>;\n } }).renderer;\n\n if (renderer) {\n // flow=\"paginated\" 是默认值,不需要显式设置\n renderer.setAttribute('animated', '');\n renderer.setAttribute('max-inline-size', '720');\n renderer.setAttribute('margin', '48');\n renderer.setAttribute('gap', '5%');\n renderer.setStyles?.(READER_CSS);\n // 必须调 next() 渲染首页\n await renderer.next?.();\n }\n\n setToc(view.book?.toc ?? []);\n setLoading(false);\n reportProgress(0, view.book?.sections.length ?? 1);\n } catch (err) {\n console.error('MOBI/AZW3 加载错误:', err);\n if (!cancelled) {\n setError(t('mobi.load_failed'));\n setLoading(false);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n try { viewRef.current?.book?.destroy?.(); } catch { /* ignore */ }\n viewRef.current = null;\n host.replaceChildren();\n };\n }, [url, reportProgress]);\n\n const isActive = useCallback(\n (href: string | undefined) => !!href && href === activeTocHref,\n [activeTocHref]\n );\n\n const renderTocItems = (items: TocItem[], depth = 0) => (\n <ul style={{ listStyle: 'none', padding: 0, margin: depth > 0 ? '0 0 0 16px' : 0 }}>\n {items.map((item, i) => (\n <li key={`${item.href ?? item.label}-${i}`}>\n {item.href ? (\n <button\n onClick={() => handleTocClick(item.href!)}\n className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${\n isActive(item.href)\n ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n }`}\n title={item.label}\n >\n {item.label?.trim()}\n </button>\n ) : (\n <div className=\"rfp-w-full rfp-py-2 rfp-px-3 rfp-text-sm rfp-text-fg-tertiary rfp-truncate\">\n {item.label?.trim()}\n </div>\n )}\n {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n </li>\n ))}\n </ul>\n );\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-[#f5f5f0] rfp-overflow-hidden\">\n {error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary rfp-text-center rfp-p-6\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n )}\n\n {loading && !error && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n\n {/* 目录侧栏 */}\n {toc.length > 0 && (\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n style={{ opacity: showToc ? 1 : 0, pointerEvents: showToc ? 'auto' : 'none' }}\n >\n <div\n className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n style={{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }}\n >\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.toc')}</span>\n <button\n onClick={() => setShowToc(false)}\n className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n >\n <X className=\"rfp-w-4 rfp-h-4\" />\n </button>\n </div>\n <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n {renderTocItems(toc)}\n </div>\n </div>\n <div\n className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n onClick={() => setShowToc(false)}\n />\n </div>\n )}\n\n {!error && (\n <div\n ref={hostRef}\n className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n style={{\n width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n maxWidth: '100%',\n transition: 'width 0.3s ease',\n }}\n />\n )}\n </div>\n );\n }\n);\n\nMobiRenderer.displayName = 'MobiRenderer';\n","import { useRef, useEffect, useState } from 'react';\nimport videojs from 'video.js';\nimport 'video.js/dist/video-js.css';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\ntype VideoJsPlayer = ReturnType<typeof videojs>;\n\ninterface VideoRendererProps {\n url: string;\n}\n\n// 根据 URL 获取视频 MIME 类型\nconst getVideoType = (url: string): string => {\n const ext = url.split('.').pop()?.toLowerCase().split('?')[0] || '';\n const typeMap: Record<string, string> = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n ogg: 'video/ogg',\n ogv: 'video/ogg',\n mov: 'video/quicktime', // MOV 使用 QuickTime MIME 类型\n avi: 'video/x-msvideo',\n mkv: 'video/x-matroska',\n m4v: 'video/mp4',\n '3gp': 'video/3gpp',\n flv: 'video/x-flv',\n };\n return typeMap[ext] || 'video/mp4';\n};\n\nexport const VideoRenderer: React.FC<VideoRendererProps> = ({ url }) => {\n const t = useTranslator();\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const videoRef = useRef<HTMLDivElement>(null);\n const playerRef = useRef<VideoJsPlayer | null>(null);\n\n useEffect(() => {\n // 确保 Video.js 播放器只初始化一次\n if (!playerRef.current && videoRef.current) {\n const videoElement = document.createElement('video-js');\n videoElement.classList.add('vjs-big-play-centered', 'vjs-theme-apple');\n videoRef.current.appendChild(videoElement);\n\n const videoType = getVideoType(url);\n\n // 为 MOV 格式提供多个 MIME 类型作为备用\n const sources = videoType === 'video/quicktime'\n ? [\n { src: url, type: 'video/quicktime' },\n { src: url, type: 'video/mp4' } // 备用方案\n ]\n : [{ src: url, type: videoType }];\n\n const player = videojs(videoElement, {\n controls: true,\n fill: true,\n preload: 'auto',\n controlBar: {\n children: [\n 'playToggle',\n 'volumePanel',\n 'currentTimeDisplay',\n 'timeDivider',\n 'durationDisplay',\n 'progressControl',\n 'remainingTimeDisplay',\n 'fullscreenToggle'\n ],\n volumePanel: {\n inline: false\n }\n },\n html5: {\n vhs: {\n overrideNative: true\n },\n nativeVideoTracks: false,\n nativeAudioTracks: false,\n nativeTextTracks: false\n },\n sources\n });\n\n // 确保视频保持比例\n const videoEl = player.el().querySelector('video');\n if (videoEl) {\n (videoEl as HTMLVideoElement).style.objectFit = 'contain';\n }\n\n // 监听加载完成\n player.on('loadeddata', () => {\n setIsLoading(false);\n });\n\n player.on('error', () => {\n const error = player.error();\n console.error('Video.js error:', error);\n setError(t('video.load_failed_with_error', { error: error?.message || t('common.unknown_error') }));\n setIsLoading(false);\n });\n\n playerRef.current = player;\n }\n }, [url]);\n\n // 清理函数\n useEffect(() => {\n const player = playerRef.current;\n\n return () => {\n if (player && !player.isDisposed()) {\n player.dispose();\n playerRef.current = null;\n }\n };\n }, []);\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-16 rfp-h-16 rfp-mx-auto rfp-mb-4 rfp-rounded-full rfp-bg-red-500/10 rfp-flex rfp-items-center rfp-justify-center\">\n <svg className=\"rfp-w-8 rfp-h-8 rfp-text-red-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n </div>\n <p className=\"rfp-text-lg rfp-font-medium rfp-text-fg-primary rfp-mb-2\">{t('video.load_failed')}</p>\n <p className=\"rfp-text-sm rfp-text-fg-tertiary\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-full rfp-h-full rfp-relative\">\n {/* 加载状态 */}\n {isLoading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-3 rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-3 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('video.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 视频播放器容器 */}\n <div\n ref={videoRef}\n className=\"rfp-overflow-hidden rfp-w-full rfp-h-full [&_video]:rfp-object-contain\"\n style={{\n boxShadow: '0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05)'\n }}\n />\n </div>\n </div>\n );\n};\n","import { useState, useRef, useEffect, useCallback } from 'react';\n\ninterface UseAudioPlayerOptions {\n url: string;\n skipSeconds?: number;\n}\n\ninterface UseAudioPlayerReturn {\n audioRef: React.RefObject<HTMLAudioElement>;\n isPlaying: boolean;\n isLoading: boolean;\n isLoop: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isMuted: boolean;\n error: string | null;\n togglePlay: () => void;\n seek: (time: number) => void;\n skip: (seconds: number) => void;\n setVolume: (vol: number) => void;\n toggleMute: () => void;\n toggleLoop: () => void;\n formatTime: (time: number) => string;\n}\n\nexport function useAudioPlayer({\n url,\n}: UseAudioPlayerOptions): UseAudioPlayerReturn {\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolumeState] = useState(1);\n const [isMuted, setIsMuted] = useState(false);\n const [isLoop, setIsLoop] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n // 重置加载状态\n setIsLoading(true);\n setError(null);\n\n const onTimeUpdate = () => {\n if (!isNaN(audio.currentTime)) {\n setCurrentTime(audio.currentTime);\n }\n };\n\n const onDurationChange = () => {\n if (!isNaN(audio.duration) && isFinite(audio.duration)) {\n setDuration(audio.duration);\n }\n };\n\n const onCanPlay = () => {\n setIsLoading(false);\n onDurationChange();\n };\n\n const onWaiting = () => setIsLoading(true);\n const onPlaying = () => {\n setIsLoading(false);\n setIsPlaying(true);\n };\n\n // 由 audio 事件驱动播放状态,而非手动设置\n const onPlay = () => setIsPlaying(true);\n const onPause = () => setIsPlaying(false);\n const onEnded = () => setIsPlaying(false);\n\n const onError = () => {\n setError('音频加载失败');\n setIsLoading(false);\n };\n\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onDurationChange);\n audio.addEventListener('durationchange', onDurationChange);\n audio.addEventListener('canplay', onCanPlay);\n audio.addEventListener('waiting', onWaiting);\n audio.addEventListener('playing', onPlaying);\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('error', onError);\n\n // 如果 audio 已经就绪\n if (audio.readyState >= 3) {\n setIsLoading(false);\n onDurationChange();\n } else if (audio.readyState >= 1) {\n onDurationChange();\n }\n\n return () => {\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onDurationChange);\n audio.removeEventListener('durationchange', onDurationChange);\n audio.removeEventListener('canplay', onCanPlay);\n audio.removeEventListener('waiting', onWaiting);\n audio.removeEventListener('playing', onPlaying);\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('error', onError);\n };\n }, [url]);\n\n const togglePlay = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (audio.paused) {\n audio.play().catch(() => {\n // 浏览器自动播放策略拒绝\n });\n } else {\n audio.pause();\n }\n }, []);\n\n const seek = useCallback((time: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = time;\n setCurrentTime(time);\n }, []);\n\n const skip = useCallback(\n (seconds: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.currentTime = Math.max(\n 0,\n Math.min(audio.currentTime + seconds, audio.duration || Infinity)\n );\n },\n []\n );\n\n const setVolume = useCallback((vol: number) => {\n const audio = audioRef.current;\n if (!audio) return;\n const clamped = Math.max(0, Math.min(1, vol));\n audio.volume = clamped;\n setVolumeState(clamped);\n if (clamped > 0) {\n audio.muted = false;\n setIsMuted(false);\n }\n }, []);\n\n const toggleMute = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.muted = !audio.muted;\n setIsMuted(audio.muted);\n }, []);\n\n const toggleLoop = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n const next = !audio.loop;\n audio.loop = next;\n setIsLoop(next);\n }, []);\n\n const formatTime = useCallback((time: number) => {\n if (!isFinite(time) || isNaN(time) || time < 0) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n }, []);\n\n return {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n };\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Play, Pause, Volume2, VolumeX, Volume1, SkipBack, SkipForward, Repeat } from 'lucide-react';\nimport { useAudioPlayer } from '../../hooks/useAudioPlayer';\nimport { useTranslator } from '../../i18n/LocaleContext';\n\n/** 文本溢出时自动横向滚动 */\nconst MarqueeText: React.FC<{\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}> = ({ text, className = '', style }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [overflow, setOverflow] = useState(false);\n const [scrollDist, setScrollDist] = useState(0);\n\n useEffect(() => {\n const check = () => {\n const container = containerRef.current;\n const inner = innerRef.current;\n if (!container || !inner) return;\n const cw = container.clientWidth;\n const tw = inner.scrollWidth;\n setOverflow(tw > cw);\n setScrollDist(tw);\n };\n check();\n const observer = new ResizeObserver(check);\n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, [text]);\n\n const gap = 60;\n const totalScroll = scrollDist + gap;\n const dur = totalScroll / 40;\n\n return (\n <div\n ref={containerRef}\n className={`rfp-overflow-hidden rfp-whitespace-nowrap ${className}`}\n style={style}\n >\n {overflow ? (\n <motion.div\n className=\"rfp-inline-flex rfp-whitespace-nowrap\"\n animate={{ x: [0, -totalScroll] }}\n transition={{ duration: dur, repeat: Infinity, ease: 'linear', repeatDelay: 1.5 }}\n >\n <span>{text}</span>\n <span style={{ width: gap }} className=\"rfp-inline-block\" />\n <span>{text}</span>\n </motion.div>\n ) : null}\n {/* 始终渲染用于测量的隐藏层 */}\n <div\n ref={innerRef}\n className=\"rfp-whitespace-nowrap\"\n style={overflow ? { position: 'absolute', visibility: 'hidden', pointerEvents: 'none' } : undefined}\n >\n {text}\n </div>\n </div>\n );\n};\n\n/** SVG 唱臂组件 */\nconst Tonearm: React.FC<{ isPlaying: boolean }> = ({ isPlaying }) => (\n <motion.div\n className=\"rfp-absolute\"\n style={{\n top: '-6px',\n right: '2px',\n width: '100px',\n height: '120px',\n transformOrigin: '76px 16px',\n zIndex: 5,\n }}\n animate={{ rotate: isPlaying ? 16 : 0 }}\n transition={{ duration: 0.8, ease: [0.4, 0, 0.2, 1] }}\n >\n <svg\n width=\"100\"\n height=\"120\"\n viewBox=\"0 0 100 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* 底座阴影 */}\n <circle cx=\"76\" cy=\"16\" r=\"13\" fill=\"rgba(0,0,0,0.3)\" />\n {/* 底座外圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"11\" fill=\"url(#baseGrad)\" />\n {/* 底座内圈 */}\n <circle cx=\"76\" cy=\"16\" r=\"6\" fill=\"url(#baseInnerGrad)\" />\n {/* 底座中心轴 */}\n <circle cx=\"76\" cy=\"16\" r=\"2.5\" fill=\"#222\" stroke=\"#555\" strokeWidth=\"0.5\" />\n\n {/* 臂杆 */}\n <path\n d=\"M74 22 L56 88\"\n stroke=\"url(#armGrad)\"\n strokeWidth=\"3.5\"\n strokeLinecap=\"round\"\n />\n {/* 臂杆高光 */}\n <path\n d=\"M74.8 22 L56.8 88\"\n stroke=\"rgba(255,255,255,0.06)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n\n {/* 唱头座 (Headshell) */}\n <rect x=\"50\" y=\"86\" width=\"12\" height=\"7\" rx=\"1.5\" fill=\"url(#headGrad)\" />\n {/* 唱头 (Cartridge) */}\n <rect x=\"52.5\" y=\"92\" width=\"7\" height=\"9\" rx=\"1\" fill=\"url(#cartridgeGrad)\" />\n {/* 唱针 (Stylus) */}\n <line x1=\"56\" y1=\"101\" x2=\"56\" y2=\"105\" stroke=\"#bbb\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"56\" cy=\"105.5\" r=\"0.8\" fill=\"#ddd\" />\n\n {/* 渐变定义 */}\n <defs>\n <radialGradient id=\"baseGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#1a1a1a\" />\n </radialGradient>\n <radialGradient id=\"baseInnerGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stopColor=\"#666\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </radialGradient>\n <linearGradient id=\"armGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"50%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"headGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#555\" />\n <stop offset=\"100%\" stopColor=\"#333\" />\n </linearGradient>\n <linearGradient id=\"cartridgeGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#444\" />\n <stop offset=\"100%\" stopColor=\"#222\" />\n </linearGradient>\n </defs>\n </svg>\n </motion.div>\n);\n\ninterface AudioRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const AudioRenderer: React.FC<AudioRendererProps> = ({ url, fileName }) => {\n const t = useTranslator();\n const {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n } = useAudioPlayer({ url });\n\n const [showVolume, setShowVolume] = useState(false);\n const volumeRef = useRef<HTMLDivElement>(null);\n const volumeTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const progress = duration > 0 ? currentTime / duration : 0;\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setShowVolume(false);\n }\n };\n if (showVolume) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showVolume]);\n\n const handleVolumeEnter = () => {\n clearTimeout(volumeTimerRef.current);\n setShowVolume(true);\n };\n\n const handleVolumeLeave = () => {\n volumeTimerRef.current = setTimeout(() => setShowVolume(false), 300);\n };\n\n const VolumeIcon = isMuted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2;\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-p-4 md:rfp-p-8 rfp-gap-5 md:rfp-gap-8 rfp-select-none\">\n {/* 唱片机整体 */}\n <div className=\"rfp-relative\" style={{ width: '260px', height: '240px' }}>\n {/* 外圈光晕 */}\n <motion.div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '220px',\n height: '220px',\n top: '18px',\n left: '8px',\n background: 'radial-gradient(circle, rgba(129,140,248,0.12) 0%, transparent 70%)',\n }}\n animate={isPlaying ? { scale: [1, 1.08, 1], opacity: [0.5, 1, 0.5] } : { scale: 1, opacity: 0.2 }}\n transition={isPlaying ? { duration: 3, repeat: Infinity, ease: 'easeInOut' } : { duration: 0.5 }}\n />\n\n {/* 唱片主体 */}\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-overflow-hidden\"\n style={{\n width: '200px',\n height: '200px',\n top: '28px',\n left: '18px',\n background: `\n radial-gradient(circle at center, transparent 95%, rgba(30,30,30,0.8) 95.5%, #111 97%),\n radial-gradient(circle at center, transparent 38%, rgba(50,50,50,0.5) 38.15%, transparent 38.4%),\n radial-gradient(circle at center, transparent 45%, rgba(50,50,50,0.3) 45.15%, transparent 45.4%),\n radial-gradient(circle at center, transparent 52%, rgba(50,50,50,0.5) 52.15%, transparent 52.4%),\n radial-gradient(circle at center, transparent 59%, rgba(50,50,50,0.3) 59.15%, transparent 59.4%),\n radial-gradient(circle at center, transparent 66%, rgba(50,50,50,0.5) 66.15%, transparent 66.4%),\n radial-gradient(circle at center, transparent 73%, rgba(50,50,50,0.3) 73.15%, transparent 73.4%),\n radial-gradient(circle at center, transparent 80%, rgba(50,50,50,0.4) 80.15%, transparent 80.4%),\n radial-gradient(circle at center, transparent 87%, rgba(50,50,50,0.3) 87.15%, transparent 87.4%),\n conic-gradient(from 0deg, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c, #212121, #1a1a1a, #252525, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c)\n `,\n boxShadow: isPlaying\n ? '0 0 36px rgba(129,140,248,0.1), 0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)'\n : '0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)',\n animation: 'rfp-vinyl-spin 8s linear infinite',\n animationPlayState: isPlaying ? 'running' : 'paused',\n }}\n >\n {/* 中心标签 */}\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '34%',\n height: '34%',\n top: '33%',\n left: '33%',\n background: 'radial-gradient(circle at 40% 38%, #818cf8, #6366f1, #4f46e5, #4338ca)',\n boxShadow: 'inset 0 1px 3px rgba(255,255,255,0.25), inset 0 -1px 3px rgba(0,0,0,0.3), 0 0 8px rgba(0,0,0,0.3)',\n }}\n >\n <div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full rfp-opacity-20\"\n style={{\n background: `\n radial-gradient(circle at center, transparent 30%, rgba(0,0,0,0.3) 31%, transparent 32%),\n radial-gradient(circle at center, transparent 50%, rgba(0,0,0,0.2) 51%, transparent 52%),\n radial-gradient(circle at center, transparent 70%, rgba(0,0,0,0.3) 71%, transparent 72%),\n radial-gradient(circle at center, transparent 88%, rgba(0,0,0,0.2) 89%, transparent 90%)\n `,\n }}\n />\n <div\n className=\"rfp-absolute rfp-rounded-full\"\n style={{\n width: '14%',\n height: '14%',\n top: '43%',\n left: '43%',\n background: 'radial-gradient(circle at 40% 40%, #333, #0d0d0d)',\n boxShadow: 'inset 0 1px 3px rgba(0,0,0,0.9), 0 0 2px rgba(0,0,0,0.5)',\n }}\n />\n </div>\n\n {isLoading && (\n <motion.div\n className=\"rfp-absolute rfp-inset-0 rfp-rounded-full\"\n style={{ border: '2px solid rgba(129,140,248,0.3)' }}\n animate={{ scale: [1, 1.02, 1], opacity: [0.3, 0.6, 0.3] }}\n transition={{ duration: 1.5, repeat: Infinity }}\n />\n )}\n </div>\n\n {/* 唱臂 */}\n <Tonearm isPlaying={isPlaying} />\n </div>\n\n {/* 文件名 */}\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <MarqueeText\n text={fileName}\n className=\"rfp-text-lg md:rfp-text-xl rfp-font-medium rfp-mb-1 rfp-text-fg-primary\"\n />\n <p className=\"rfp-text-xs rfp-tracking-widest rfp-uppercase rfp-text-accent\">\n Audio\n </p>\n </div>\n\n {/* 控制面板 */}\n <div\n className=\"rfp-w-full rfp-max-w-sm md:rfp-max-w-md rfp-rounded-2xl rfp-p-4 md:rfp-p-6 rfp-border rfp-bg-surface-1 rfp-border-line-weak\"\n style={{ backdropFilter: 'blur(16px)' }}\n >\n {/* 进度条 */}\n <div className=\"rfp-mb-5\">\n <div className=\"rfp-relative rfp-h-4 rfp-flex rfp-items-center\">\n <div className=\"rfp-absolute rfp-w-full rfp-h-[5px] rfp-rounded-full rfp-bg-surface-2\" />\n <div\n className=\"rfp-absolute rfp-h-[5px] rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: `${progress * 100}%`,\n background: 'linear-gradient(90deg, var(--fp-accent), var(--fp-accent-hover))',\n boxShadow: isPlaying ? '0 0 8px rgba(129,140,248,0.4)' : 'none',\n transition: 'width 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max={duration > 0 ? duration : currentTime || 100}\n step=\"any\"\n value={currentTime}\n onChange={(e) => seek(parseFloat(e.target.value))}\n disabled={duration <= 0}\n aria-label={t('audio.aria.progress')}\n className=\"audio-slider rfp-absolute rfp-w-full\"\n />\n </div>\n <div className=\"rfp-flex rfp-justify-between rfp-text-xs rfp-mt-2.5 rfp-text-fg-tertiary\">\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{formatTime(currentTime)}</span>\n <span style={{ fontVariantNumeric: 'tabular-nums' }}>{duration > 0 ? formatTime(duration) : '--:--'}</span>\n </div>\n </div>\n\n {/* 控制按钮 */}\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-gap-3\">\n {/* 循环 */}\n <motion.button\n onClick={toggleLoop}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isLoop ? t('audio.aria.loop_off') : t('audio.aria.loop_on')}\n className={`rfp-w-9 rfp-h-9 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors ${\n isLoop\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-tertiary'\n }`}\n >\n <Repeat className=\"rfp-w-4 rfp-h-4\" />\n </motion.button>\n\n {/* 后退 */}\n <motion.button\n onClick={() => skip(-10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.backward_10')}\n className=\"rfp-w-10 rfp-h-10 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary\"\n >\n <SkipBack className=\"rfp-w-[18px] rfp-h-[18px]\" />\n </motion.button>\n\n {/* 播放/暂停 */}\n <motion.button\n onClick={togglePlay}\n whileHover={{ scale: 1.06 }}\n whileTap={{ scale: 0.94 }}\n aria-label={isPlaying ? t('audio.aria.pause') : t('audio.aria.play')}\n className=\"rfp-w-14 rfp-h-14 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center\"\n style={{\n background: 'linear-gradient(135deg, var(--fp-accent-hover), var(--fp-accent))',\n color: '#fff',\n boxShadow: '0 4px 20px rgba(99,102,241,0.35)',\n }}\n >\n {isPlaying ? (\n <Pause className=\"rfp-w-6 rfp-h-6\" />\n ) : (\n <Play className=\"rfp-w-6 rfp-h-6 rfp-ml-0.5\" />\n )}\n </motion.button>\n\n {/* 前进 */}\n <motion.button\n onClick={() => skip(10)}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={t('audio.aria.forward_10')}\n className=\"rfp-w-10 rfp-h-10 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary\"\n >\n <SkipForward className=\"rfp-w-[18px] rfp-h-[18px]\" />\n </motion.button>\n\n {/* 音量 */}\n <div\n ref={volumeRef}\n className=\"rfp-relative\"\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <motion.button\n onClick={toggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.92 }}\n aria-label={isMuted ? t('audio.aria.unmute') : t('audio.aria.mute')}\n className={`rfp-w-9 rfp-h-9 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors ${\n showVolume\n ? 'rfp-bg-accent-soft rfp-text-accent'\n : 'rfp-bg-surface-2 rfp-text-fg-secondary'\n }`}\n >\n <VolumeIcon className=\"rfp-w-4 rfp-h-4\" />\n </motion.button>\n\n <AnimatePresence>\n {showVolume && (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.12 }}\n className=\"rfp-absolute rfp-bottom-full rfp-mb-2 rfp-rounded-xl rfp-p-3 rfp-border rfp-bg-surface-3 rfp-border-line\"\n style={{\n left: '50%',\n marginLeft: '-27px',\n backdropFilter: 'blur(16px)',\n }}\n onMouseEnter={handleVolumeEnter}\n onMouseLeave={handleVolumeLeave}\n >\n <div className=\"rfp-flex rfp-flex-col rfp-items-center rfp-gap-2\" style={{ height: '100px' }}>\n <div className=\"rfp-relative rfp-flex rfp-items-center rfp-justify-center\" style={{ width: '24px', height: '80px' }}>\n <div\n className=\"rfp-absolute rfp-rounded-full rfp-bg-surface-2\"\n style={{ width: '3px', height: '100%' }}\n />\n <div\n className=\"rfp-absolute rfp-bottom-0 rfp-rounded-full rfp-pointer-events-none\"\n style={{\n width: '3px',\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: 'var(--fp-accent-hover)',\n transition: 'height 0.1s linear',\n }}\n />\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={isMuted ? 0 : volume}\n onChange={(e) => setVolume(parseFloat(e.target.value))}\n aria-label={t('audio.aria.volume')}\n className=\"volume-slider-vertical rfp-absolute\"\n style={{\n width: '80px',\n height: '24px',\n transform: 'rotate(-90deg)',\n transformOrigin: 'center center',\n }}\n />\n </div>\n <span className=\"rfp-text-[10px] rfp-tabular-nums rfp-text-fg-tertiary\">\n {Math.round((isMuted ? 0 : volume) * 100)}\n </span>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </div>\n\n <audio ref={audioRef} src={url} className=\"rfp-hidden\" />\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { codeToHtml } from 'shiki';\nimport { useResolvedTheme } from '../ThemeContext';\n\n/**\n * 用 shiki 把代码高亮成 HTML(与 vue-file-preview 同引擎、同主题,保证两端视觉一致)。\n *\n * - dark 主题用 `dark-plus`(VSCode Dark Plus)\n * - light 主题用 `github-light`(GitHub Light)\n *\n * shiki 输出的 <pre> 自带 inline 背景/前景色,主题切换时必须重新高亮,\n * 因此 resolvedTheme 进入依赖数组。\n *\n * @returns\n * - `html`: 高亮后的 HTML 字符串(失败或加载中为 '')\n * - `loading`: 是否正在高亮\n */\nexport function useShikiHighlight(code: string, lang: string): { html: string; loading: boolean } {\n const resolvedTheme = useResolvedTheme();\n const [html, setHtml] = useState('');\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n codeToHtml(code, {\n lang,\n theme: resolvedTheme === 'light' ? 'github-light' : 'dark-plus',\n })\n .then((out) => {\n if (!cancelled) {\n setHtml(out);\n setLoading(false);\n }\n })\n .catch(() => {\n if (!cancelled) {\n setHtml('');\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [code, lang, resolvedTheme]);\n\n return { html, loading };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport { Copy, Check } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n url: string;\n viewMode?: 'preview' | 'source';\n}\n\nconst useCopy = (text: string) => {\n const [copied, setCopied] = useState(false);\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [text]);\n return { copied, handleCopy };\n};\n\n/** 内联版复制按钮:放在代码块 header 行内,始终可见 */\nconst InlineCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-p-1 rfp-rounded rfp-text-fg-muted hover:rfp-text-fg-secondary rfp-transition-colors rfp-flex rfp-items-center rfp-gap-1\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={13} /> : <Copy size={13} />}\n </button>\n );\n};\n\n/** 浮动版复制按钮:无 header 时绝对定位于代码块右上角(hover 显示) */\nconst FloatingCopyButton = ({ text }: { text: string }) => {\n const t = useTranslator();\n const { copied, handleCopy } = useCopy(text);\n return (\n <button\n onClick={handleCopy}\n className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-p-1.5 rfp-rounded-md rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-text-fg-tertiary hover:rfp-text-fg-secondary rfp-transition-colors rfp-opacity-0 group-hover:rfp-opacity-100 rfp-border rfp-border-line\"\n title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n );\n};\n\n/** 带语言标注的代码块:shiki 高亮 + header + 复制按钮 */\nconst ShikiCodeBlock = ({ code, lang }: { code: string; lang: string }) => {\n const { html } = useShikiHighlight(code, lang);\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-1.5 rfp-bg-surface-1 rfp-border rfp-border-line-weak rfp-rounded-t-md rfp-border-b-0\">\n <span className=\"rfp-text-xs rfp-text-fg-secondary rfp-font-mono rfp-select-none\">{lang}</span>\n <InlineCopyButton text={code} />\n </div>\n {html ? (\n <div\n className=\"rfp-shiki-wrapper rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre\n className=\"rfp-m-0 rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{code}</code>\n </pre>\n )}\n </div>\n );\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ url, viewMode = 'preview' }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const { html: sourceHtml } = useShikiHighlight(\n viewMode === 'source' ? content : '',\n 'markdown',\n );\n\n useEffect(() => {\n const loadMarkdown = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url, { fetcher });\n setContent(text);\n } catch (err) {\n setError(t('markdown.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadMarkdown();\n }, [url, fetcher, t]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n // 源码视图\n if (viewMode === 'source') {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {sourceHtml ? (\n <div\n className=\"rfp-shiki-wrapper with-line-numbers\"\n dangerouslySetInnerHTML={{ __html: sourceHtml }}\n />\n ) : (\n <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n {content}\n </pre>\n )}\n </div>\n );\n }\n\n // 预览视图\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-p-6 md:rfp-p-10\">\n <div className=\"rfp-max-w-full md:rfp-max-w-4xl rfp-mx-auto\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeRaw, rehypeKatex]}\n components={{\n code({ node, inline, className, children, ...props }: any) {\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n if (!inline && match) {\n // 有语言标注的代码块 - shiki 高亮\n return <ShikiCodeBlock code={codeString} lang={match[1]} />;\n }\n if (!inline) {\n // 无语言标注的代码块 - 纯文本暗色显示\n return (\n <div className=\"rfp-relative rfp-group rfp-my-4\">\n <FloatingCopyButton text={codeString} />\n <pre\n className=\"rfp-m-0 rfp-rounded-md rfp-border rfp-border-line-weak rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n style={{ fontSize: '13px', lineHeight: '1.5' }}\n >\n <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{children}</code>\n </pre>\n </div>\n );\n }\n // 行内代码\n return (\n <code\n className=\"rfp-bg-surface-2 rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-text-sm rfp-font-mono rfp-text-fg-primary rfp-border rfp-border-line-weak\"\n {...props}\n >\n {children}\n </code>\n );\n },\n h1: ({ children }) => (\n <h1 className=\"rfp-text-3xl rfp-font-semibold rfp-mb-4 rfp-mt-6 rfp-text-fg-primary first:rfp-mt-0\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"rfp-text-2xl rfp-font-semibold rfp-mb-3 rfp-mt-8 rfp-text-fg-primary\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"rfp-text-xl rfp-font-semibold rfp-mb-2 rfp-mt-6 rfp-text-fg-primary\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"rfp-text-lg rfp-font-semibold rfp-mb-2 rfp-mt-4 rfp-text-fg-primary\">{children}</h4>\n ),\n p: ({ children }) => (\n <p className=\"rfp-text-fg-secondary rfp-mb-4 rfp-leading-7 rfp-text-base\">{children}</p>\n ),\n a: ({ href, children }) => (\n <a\n href={href}\n className=\"rfp-text-indigo-400 hover:rfp-text-indigo-300 rfp-underline rfp-decoration-indigo-600 hover:rfp-decoration-indigo-400\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n ul: ({ children }) => (\n <ul className=\"rfp-list-disc rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"rfp-list-decimal rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ol>\n ),\n li: ({ children }) => <li className=\"rfp-leading-7\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"rfp-border-l-4 rfp-border-line-strong rfp-pl-4 rfp-text-fg-tertiary rfp-my-4 rfp-italic\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <div className=\"rfp-overflow-x-auto rfp-my-4 rfp-rounded-md rfp-border rfp-border-line\">\n <table className=\"rfp-min-w-full rfp-divide-y rfp-divide-divide\">{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"rfp-bg-surface-1\">{children}</thead>,\n tbody: ({ children }) => (\n <tbody className=\"rfp-divide-y rfp-divide-divide rfp-bg-transparent\">{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"hover:rfp-bg-surface-1 rfp-transition-colors\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"rfp-px-4 rfp-py-3 rfp-text-left rfp-text-xs rfp-font-semibold rfp-text-fg-tertiary rfp-uppercase rfp-tracking-wider\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"rfp-px-4 rfp-py-3 rfp-text-sm rfp-text-fg-secondary\">{children}</td>\n ),\n hr: () => <hr className=\"rfp-border-line rfp-my-6\" />,\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt}\n className=\"rfp-rounded-md rfp-max-w-full rfp-h-auto rfp-my-4 rfp-mx-auto rfp-block rfp-shadow-sm\"\n />\n ),\n input: ({ type, checked, ...props }) => {\n if (type === 'checkbox') {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n readOnly\n className=\"rfp-mr-2 rfp-rounded rfp-border-line\"\n {...props}\n />\n );\n }\n return <input type={type} {...props} />;\n },\n strong: ({ children }) => (\n <strong className=\"rfp-font-semibold rfp-text-fg-primary\">{children}</strong>\n ),\n em: ({ children }) => <em className=\"rfp-italic\">{children}</em>,\n del: ({ children }) => (\n <del className=\"rfp-text-fg-muted rfp-line-through\">{children}</del>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n </div>\n );\n};\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { ChevronRight, ChevronDown } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useResolvedTheme, type ResolvedTheme } from '../../ThemeContext';\n\ninterface JsonRendererProps {\n url: string;\n fileName: string;\n}\n\ninterface JsonColors {\n key: string;\n string: string;\n number: string;\n keyword: string;\n bracket: string; // { } [ ]\n colon: string; // :\n collapsed: string; // \"N items / N keys\" 折叠提示\n arrow: string; // 折叠箭头\n}\n\n// VSCode Dark Plus / GitHub Light 两套配色,与 react-syntax-highlighter 的 vscDarkPlus / vs 主题保持一致\nconst DARK_COLORS: JsonColors = {\n key: '#9cdcfe',\n string: '#ce9178',\n number: '#b5cea8',\n keyword: '#569cd6',\n bracket: '#d4d4d4',\n colon: 'rgb(255 255 255 / 0.6)',\n collapsed: 'rgb(255 255 255 / 0.4)',\n arrow: 'rgb(255 255 255 / 0.5)',\n};\n\nconst LIGHT_COLORS: JsonColors = {\n key: '#005cc5',\n string: '#032f62',\n number: '#005cc5',\n keyword: '#d73a49',\n bracket: '#24292e',\n colon: 'rgb(23 23 23 / 0.6)',\n collapsed: 'rgb(23 23 23 / 0.45)',\n arrow: 'rgb(23 23 23 / 0.55)',\n};\n\n// ---------- JSON 树节点 ----------\n\ninterface JsonNodeProps {\n keyName?: string;\n value: unknown;\n depth: number;\n defaultExpanded: boolean;\n colors: JsonColors;\n}\n\nconst JsonNode: React.FC<JsonNodeProps> = ({ keyName, value, depth, defaultExpanded, colors }) => {\n const t = useTranslator();\n const [expanded, setExpanded] = useState(defaultExpanded);\n const indent = depth * 20;\n\n const toggle = useCallback(() => setExpanded(prev => !prev), []);\n\n // 基本类型\n if (value === null || value === undefined || typeof value !== 'object') {\n return (\n <div className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm\" style={{ paddingLeft: `${indent}px` }}>\n <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0\" />\n {keyName !== undefined && (\n <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n </span>\n )}\n {renderPrimitive(value, colors)}\n </div>\n );\n }\n\n const isArray = Array.isArray(value);\n const entries = isArray ? (value as unknown[]) : Object.entries(value as Record<string, unknown>);\n const count = entries.length;\n const openBracket = isArray ? '[' : '{';\n const closeBracket = isArray ? ']' : '}';\n\n // 空对象/数组\n if (count === 0) {\n return (\n <div className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm\" style={{ paddingLeft: `${indent}px` }}>\n <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0\" />\n {keyName !== undefined && (\n <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n </span>\n )}\n <span style={{ color: colors.bracket }}>{openBracket}{closeBracket}</span>\n </div>\n );\n }\n\n return (\n <div>\n {/* 折叠行 */}\n <div\n className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm rfp-cursor-pointer hover:rfp-bg-surface-1 rfp-select-none\"\n style={{ paddingLeft: `${indent}px` }}\n onClick={toggle}\n >\n <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0 rfp-flex rfp-items-center rfp-justify-center\" style={{ color: colors.arrow }}>\n {expanded\n ? <ChevronDown className=\"rfp-w-3.5 rfp-h-3.5\" />\n : <ChevronRight className=\"rfp-w-3.5 rfp-h-3.5\" />\n }\n </span>\n {keyName !== undefined && (\n <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n </span>\n )}\n <span style={{ color: colors.bracket }}>{openBracket}</span>\n {!expanded && (\n <span className=\"rfp-ml-1\" style={{ color: colors.collapsed }}>\n {isArray ? `${count} ${t('json.items')}` : `${count} ${t('json.keys')}`}\n <span style={{ color: colors.bracket }}> {closeBracket}</span>\n </span>\n )}\n </div>\n\n {/* 子节点 */}\n {expanded && (\n <>\n {isArray\n ? (value as unknown[]).map((item, i) => (\n <JsonNode key={i} value={item} depth={depth + 1} defaultExpanded={depth < 1} colors={colors} />\n ))\n : Object.entries(value as Record<string, unknown>).map(([k, v]) => (\n <JsonNode key={k} keyName={k} value={v} depth={depth + 1} defaultExpanded={depth < 1} colors={colors} />\n ))\n }\n <div className=\"rfp-font-mono rfp-text-sm rfp-py-px\" style={{ paddingLeft: `${indent + 20}px`, color: colors.bracket }}>\n {closeBracket}\n </div>\n </>\n )}\n </div>\n );\n};\n\nfunction renderPrimitive(value: unknown, colors: JsonColors) {\n if (value === null) return <span style={{ color: colors.keyword, fontStyle: 'italic' }}>null</span>;\n if (value === undefined) return <span style={{ color: colors.keyword, fontStyle: 'italic' }}>undefined</span>;\n if (typeof value === 'boolean') return <span style={{ color: colors.keyword }}>{String(value)}</span>;\n if (typeof value === 'number') return <span style={{ color: colors.number }}>{String(value)}</span>;\n if (typeof value === 'string') return <span style={{ color: colors.string }}>\"{value}\"</span>;\n return <span style={{ color: colors.bracket }}>{String(value)}</span>;\n}\n\nfunction pickColors(theme: ResolvedTheme): JsonColors {\n return theme === 'light' ? LIGHT_COLORS : DARK_COLORS;\n}\n\n// ---------- Main ----------\n\nexport const JsonRenderer: React.FC<JsonRendererProps> = ({ url }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const resolvedTheme = useResolvedTheme();\n const colors = useMemo(() => pickColors(resolvedTheme), [resolvedTheme]);\n const [data, setData] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadJson = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url, { fetcher });\n setData(JSON.parse(text));\n } catch (err) {\n setError(t('json.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n loadJson();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg rfp-py-3 rfp-pr-4\">\n <JsonNode value={data} depth={0} defaultExpanded colors={colors} />\n </div>\n );\n};\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { FileSpreadsheet } from 'lucide-react';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport {\n parseCsv,\n guessCsvDelimiter,\n fetchTextUtf8,\n convertCsvToSpreadsheetData,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\ninterface CsvRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const CsvRenderer: React.FC<CsvRendererProps> = ({ url, fileName }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadCsv = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const text = await fetchTextUtf8(url, { fetcher });\n const parsed = parseCsv(text, { delimiter: guessCsvDelimiter(fileName) });\n const sheetData = convertCsvToSpreadsheetData(parsed.header, parsed.rows, fileName);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n setLoading(false);\n } catch (err) {\n if (isMounted) {\n console.error('CSV 解析错误:', err);\n setError(t('csv.load_failed'));\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadCsv();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, fileName, mountSpreadsheet]);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('csv.loading')}</p>\n </div>\n </div>\n )}\n\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center rfp-max-w-sm md:rfp-max-w-md rfp-px-4\">\n <div className=\"rfp-w-24 rfp-h-24 md:rfp-w-32 md:rfp-h-32 rfp-mx-auto rfp-mb-4 md:rfp-mb-6 rfp-rounded-2xl md:rfp-rounded-3xl rfp-bg-gradient-to-br rfp-from-green-500 rfp-via-emerald-500 rfp-to-teal-500 rfp-flex rfp-items-center rfp-justify-center rfp-shadow-2xl\">\n <FileSpreadsheet className=\"rfp-w-12 rfp-h-12 md:rfp-w-16 md:rfp-h-16 rfp-text-fg-primary\" />\n </div>\n <p className=\"rfp-text-lg md:rfp-text-xl rfp-text-fg-primary rfp-mb-2 md:rfp-mb-3 rfp-font-medium\">{t('csv.load_failed')}</p>\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-tertiary rfp-mb-4 md:rfp-mb-6\">{error}</p>\n </div>\n </div>\n )}\n\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\n\ninterface XmlRendererProps {\n url: string;\n fileName: string;\n}\n\n/**\n * 用 DOMParser 美化 XML:失败则原样返回\n */\nconst prettyPrintXml = (xml: string): string => {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xml, 'application/xml');\n // 检测解析错误\n const errNode = doc.querySelector('parsererror');\n if (errNode) return xml;\n // 使用 XSLT 或手动缩进:这里手动缩进更稳\n const serializer = new XMLSerializer();\n const serialized = serializer.serializeToString(doc);\n return indentXml(serialized);\n } catch {\n return xml;\n }\n};\n\nconst indentXml = (xml: string): string => {\n const PADDING = ' ';\n const reg = /(>)(<)(\\/*)/g;\n let formatted = xml.replace(reg, '$1\\n$2$3');\n // 自闭合和 CDATA 等不处理\n let pad = 0;\n return formatted\n .split('\\n')\n .map((line) => {\n let indent = 0;\n if (/^<\\/\\w/.test(line)) {\n pad = Math.max(pad - 1, 0);\n } else if (/^<\\w[^>]*[^/]>.*$/.test(line) && !/<.+<\\/.+>$/.test(line)) {\n indent = 1;\n }\n const padded = PADDING.repeat(pad) + line;\n pad += indent;\n return padded;\n })\n .join('\\n');\n};\n\nexport const XmlRenderer: React.FC<XmlRendererProps> = ({ url }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const { html: highlighted } = useShikiHighlight(content, 'xml');\n\n useEffect(() => {\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const raw = await fetchTextUtf8(url, { fetcher });\n setContent(prettyPrintXml(raw));\n } catch (err) {\n console.error(err);\n setError(t('xml.load_failed'));\n } finally {\n setLoading(false);\n }\n };\n load();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {highlighted ? (\n <div\n className=\"rfp-shiki-wrapper with-line-numbers\"\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n ) : (\n <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n {content}\n </pre>\n )}\n </div>\n );\n};\n","import { useState, useEffect, useMemo } from 'react';\nimport {\n parseSubtitle,\n formatSubtitleTime,\n fetchTextUtf8,\n type SubtitleParseResult,\n type SubtitleFormat,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\ninterface SubtitleRendererProps {\n url: string;\n fileName: string;\n}\n\nconst FORMAT_BY_EXT: Record<string, SubtitleFormat> = {\n srt: 'srt',\n vtt: 'vtt',\n lrc: 'lrc',\n elrc: 'elrc',\n ass: 'ass',\n ssa: 'ssa',\n ttml: 'ttml',\n dfxp: 'ttml',\n};\n\nconst getFormat = (fileName: string): SubtitleFormat | undefined => {\n const ext = fileName.split('.').pop()?.toLowerCase() || '';\n return FORMAT_BY_EXT[ext];\n};\n\nexport const SubtitleRenderer: React.FC<SubtitleRendererProps> = ({ url, fileName }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [text, setText] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n setText(await fetchTextUtf8(url, { fetcher }));\n } catch (err) {\n console.error(err);\n setError(t('subtitle.load_failed'));\n } finally {\n setLoading(false);\n }\n };\n load();\n }, [url]);\n\n const parsed: SubtitleParseResult | null = useMemo(() => {\n if (!text) return null;\n try {\n return parseSubtitle(text, getFormat(fileName));\n } catch (err) {\n console.error(err);\n return null;\n }\n }, [text, fileName]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-bg-[#0f0f12]\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error || !parsed) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-bg-[#0f0f12]\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error || t('subtitle.parse_failed')}</p>\n </div>\n </div>\n );\n }\n\n const isLyric = parsed.format === 'lrc' || parsed.format === 'elrc';\n const meta = parsed.metadata ?? {};\n const dotHover = isLyric ? 'group-hover:rfp-bg-violet-400' : 'group-hover:rfp-bg-sky-400';\n\n return (\n <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-bg-[#0f0f12]\">\n {/* 内容滚动区 */}\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-px-6 md:rfp-px-10 rfp-pt-6 rfp-pb-16 md:rfp-pb-20\">\n <div className=\"rfp-relative rfp-max-w-5xl rfp-mx-auto\">\n {/* vertical line */}\n <div className=\"rfp-absolute rfp-left-[5px] md:rfp-left-[7px] rfp-top-2 rfp-bottom-2 rfp-w-px rfp-bg-surface-1\" />\n\n <ol className=\"rfp-space-y-5 md:rfp-space-y-6\">\n {parsed.cues.map((cue, i) => (\n <li key={`cue-${i}`} className=\"rfp-relative rfp-pl-6 md:rfp-pl-8 rfp-group\">\n {/* dot */}\n <div\n className={`rfp-absolute rfp-left-0 rfp-top-2 rfp-w-3 rfp-h-3 rfp-rounded-full rfp-bg-surface-3 rfp-border-2 rfp-border-[#0f0f12] rfp-transition-colors ${dotHover}`}\n />\n\n <div className=\"rfp-flex rfp-flex-wrap rfp-items-baseline rfp-gap-x-3 rfp-gap-y-1 rfp-mb-1.5\">\n <span className=\"rfp-text-[11px] rfp-font-mono rfp-text-fg-muted rfp-tabular-nums\">\n {formatSubtitleTime(cue.start)}\n </span>\n <span className=\"rfp-text-[11px] rfp-text-fg-disabled\">→</span>\n <span className=\"rfp-text-[11px] rfp-font-mono rfp-text-fg-muted rfp-tabular-nums\">\n {formatSubtitleTime(cue.end)}\n </span>\n <span className=\"rfp-text-[10px] rfp-font-mono rfp-text-fg-disabled rfp-tabular-nums\">\n #{cue.id ?? i + 1}\n </span>\n {cue.style && (\n <span className=\"rfp-text-[9px] rfp-uppercase rfp-tracking-widest rfp-text-fg-tertiary rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-bg-surface-1 rfp-border rfp-border-line-weak\">\n {cue.style}\n </span>\n )}\n </div>\n\n {cue.words && cue.words.length > 0 ? (\n <div className=\"rfp-flex rfp-flex-wrap rfp-gap-x-1.5 rfp-gap-y-1 rfp-text-base md:rfp-text-lg rfp-text-fg-primary rfp-leading-relaxed group-hover:rfp-text-fg-primary rfp-transition-colors\">\n {cue.words.map((word, wi) => (\n <span\n key={`w-${wi}`}\n className=\"rfp-inline-flex rfp-flex-col rfp-items-start\"\n title={formatSubtitleTime(word.start)}\n >\n <span className=\"rfp-text-[9px] rfp-text-fg-disabled rfp-font-mono rfp-leading-none rfp-tabular-nums\">\n {formatSubtitleTime(word.start).slice(3, 8)}\n </span>\n <span className=\"rfp-leading-snug\">{word.text}</span>\n </span>\n ))}\n </div>\n ) : (\n <p\n className={`rfp-whitespace-pre-wrap rfp-break-words rfp-leading-relaxed group-hover:rfp-text-fg-primary rfp-transition-colors rfp-text-fg-primary ${\n isLyric ? 'rfp-text-base md:rfp-text-xl rfp-font-medium' : 'rfp-text-sm md:rfp-text-base'\n }`}\n >\n {cue.text}\n </p>\n )}\n </li>\n ))}\n </ol>\n </div>\n </div>\n\n {/* 底部状态栏 */}\n <div className=\"rfp-pointer-events-none rfp-absolute rfp-bottom-3 rfp-right-3 md:rfp-bottom-4 md:rfp-right-4 rfp-flex rfp-items-center rfp-gap-2 rfp-px-2.5 rfp-py-1 rfp-rounded-full rfp-bg-surface-nav rfp-backdrop-blur rfp-border rfp-border-line-weak rfp-text-[10px] rfp-text-fg-tertiary rfp-font-mono rfp-tabular-nums\">\n <span>{parsed.cues.length} {isLyric ? t('subtitle.lines') : t('subtitle.cues')}</span>\n {meta.length && (\n <>\n <span className=\"rfp-text-fg-disabled\">·</span>\n <span>{meta.length}</span>\n </>\n )}\n </div>\n </div>\n );\n};\n","import React, { useEffect, useRef, useState, useCallback } from 'react';\n\nexport interface ResizableSplitProps {\n /** 左侧内容 */\n left: React.ReactNode;\n /** 右侧内容 */\n right: React.ReactNode;\n /** 左侧初始宽度(px);传入 storageKey 时会从 localStorage 读取 */\n initialLeftWidth?: number;\n /** 左侧最小宽度(px) */\n minLeftWidth?: number;\n /** 左侧最大宽度(px),同时不超过 `容器宽 - minRightWidth - 分隔线宽` */\n maxLeftWidth?: number;\n /** 右侧至少保留的宽度(px) */\n minRightWidth?: number;\n /** localStorage 持久化 key;不传则不持久化 */\n storageKey?: string;\n /** 启用横向拖动的媒体查询,默认 `(min-width: 768px)` */\n desktopMedia?: string;\n /** 容器额外类名 */\n className?: string;\n}\n\n/**\n * 通用可拖动分隔布局:\n * - 桌面端(由 `desktopMedia` 判定)横向分两栏,中间分隔线可左右拖动调整左栏宽度\n * - 移动端退化为上下堆叠,不显示分隔线\n * - 可选 `storageKey` 将宽度持久化到 localStorage\n */\nexport const ResizableSplit: React.FC<ResizableSplitProps> = ({\n left,\n right,\n initialLeftWidth = 280,\n minLeftWidth = 160,\n maxLeftWidth = 640,\n minRightWidth = 200,\n storageKey,\n desktopMedia = '(min-width: 768px)',\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [leftWidth, setLeftWidth] = useState<number>(() => {\n if (storageKey && typeof window !== 'undefined') {\n const saved = Number(window.localStorage.getItem(storageKey));\n if (!isNaN(saved) && saved > 0) return saved;\n }\n return initialLeftWidth;\n });\n const [dragging, setDragging] = useState(false);\n const [isDesktop, setIsDesktop] = useState(false);\n\n // 响应式:监听媒体查询\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia(desktopMedia);\n const handler = () => setIsDesktop(mq.matches);\n handler();\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [desktopMedia]);\n\n // 拖动\n useEffect(() => {\n if (!dragging) return;\n const handleMove = (e: MouseEvent) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cap = rect.width - minRightWidth - 6;\n const effectiveMax = Math.min(maxLeftWidth, cap);\n const newW = Math.max(minLeftWidth, Math.min(effectiveMax, x));\n setLeftWidth(newW);\n };\n const handleUp = () => setDragging(false);\n window.addEventListener('mousemove', handleMove);\n window.addEventListener('mouseup', handleUp);\n const prevCursor = document.body.style.cursor;\n const prevSelect = document.body.style.userSelect;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n return () => {\n window.removeEventListener('mousemove', handleMove);\n window.removeEventListener('mouseup', handleUp);\n document.body.style.cursor = prevCursor;\n document.body.style.userSelect = prevSelect;\n };\n }, [dragging, minLeftWidth, maxLeftWidth, minRightWidth]);\n\n // 持久化\n useEffect(() => {\n if (!storageKey || dragging) return;\n try {\n window.localStorage.setItem(storageKey, String(leftWidth));\n } catch {\n // ignore\n }\n }, [leftWidth, storageKey, dragging]);\n\n const handleDividerDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setDragging(true);\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={`rfp-w-full rfp-h-full rfp-flex rfp-flex-col md:rfp-flex-row rfp-min-h-0 rfp-min-w-0 ${className}`}\n >\n <div\n className=\"rfp-min-h-0 rfp-min-w-0 rfp-flex-shrink-0 rfp-w-full rfp-max-h-60 md:rfp-h-full md:rfp-max-h-none\"\n style={isDesktop ? { width: `${leftWidth}px` } : undefined}\n >\n {left}\n </div>\n {/* 分隔线:仅桌面显示 */}\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n onMouseDown={handleDividerDown}\n className={`rfp-hidden md:rfp-block rfp-relative rfp-w-1.5 rfp-flex-shrink-0 rfp-cursor-col-resize rfp-transition-colors ${\n dragging ? 'rfp-bg-surface-toolbar' : 'rfp-bg-surface-2 hover:rfp-bg-surface-3'\n }`}\n >\n {/* 加宽命中区,改善拖动体验 */}\n <span className=\"rfp-absolute rfp-inset-y-0 -rfp-left-1 -rfp-right-1\" />\n </div>\n <div className=\"rfp-flex-1 rfp-min-w-0 rfp-min-h-0 rfp-overflow-hidden\">{right}</div>\n </div>\n );\n};\n","import { useState, useEffect, useMemo, useCallback, useRef, lazy, Suspense } from 'react';\nimport React from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n Folder,\n FolderOpen,\n FileText,\n FileImage,\n FileCode,\n File as FileIcon,\n ChevronRight,\n} from 'lucide-react';\nimport type JSZip from 'jszip';\nimport {\n loadZip,\n listZipEntries,\n buildZipTree,\n readZipEntryBlob,\n formatFileSize,\n getFileType,\n inferMimeType,\n type ZipTreeNode,\n} from '@eternalheart/file-preview-core';\nimport { ResizableSplit } from '../../components/ResizableSplit';\nimport type { ZipToolbarStats } from './toolbar';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\n\n// 懒加载 FilePreviewContent 以打破循环依赖\nconst LazyFilePreviewContent = lazy(() =>\n import('../../FilePreviewContent').then(m => ({ default: m.FilePreviewContent }))\n);\n\ninterface ZipRendererProps {\n url: string;\n /** ZIP 嵌套深度(由 FilePreviewContent 传入) */\n nestingDepth?: number;\n /** 解析完成后向外回报统计信息(files / dirs / size),供工具栏展示 */\n onStatsChange?: (stats: ZipToolbarStats | null) => void;\n}\n\ninterface SelectedPreview {\n path: string;\n name: string;\n size: number;\n blobUrl: string;\n}\n\n/** 根据文件类型返回树节点图标 */\nconst resolveIcon = (name: string) => {\n const ft = getFileType({ id: '', name, url: '', type: '' });\n if (ft === 'image') return FileImage;\n if (ft === 'text' || ft === 'markdown' || ft === 'json' || ft === 'csv' || ft === 'xml' || ft === 'subtitle') {\n return name.endsWith('.md') || name.endsWith('.markdown') ? FileText : FileCode;\n }\n return FileIcon;\n};\n\n// ---------- Tooltip via portal ----------\n\ninterface HoverTipState {\n text: string;\n x: number;\n y: number;\n}\n\n// ---------- Tree item ----------\n\ninterface TreeItemProps {\n node: ZipTreeNode;\n depth: number;\n selectedPath: string | null;\n expanded: Set<string>;\n onToggle: (path: string) => void;\n onSelect: (node: ZipTreeNode) => void;\n onHover: (text: string, rect: DOMRect) => void;\n onLeave: () => void;\n}\n\nconst TreeItem: React.FC<TreeItemProps> = ({\n node,\n depth,\n selectedPath,\n expanded,\n onToggle,\n onSelect,\n onHover,\n onLeave,\n}) => {\n const isOpen = expanded.has(node.path);\n const isSelected = selectedPath === node.path;\n const pad = { paddingLeft: `${depth * 14 + 10}px` };\n const handleEnter = (e: React.MouseEvent<HTMLElement>) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n onHover(node.name || '/', rect);\n };\n\n if (node.isDir) {\n return (\n <>\n <button\n type=\"button\"\n onClick={() => onToggle(node.path)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className=\"rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-fg-secondary hover:rfp-bg-surface-1 rfp-text-sm\"\n style={pad}\n >\n <ChevronRight\n className={`rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0 rfp-transition-transform ${\n isOpen ? 'rfp-rotate-90' : ''\n }`}\n />\n {isOpen ? (\n <FolderOpen className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n ) : (\n <Folder className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-amber-300/80\" />\n )}\n <span className=\"rfp-truncate rfp-flex-1 rfp-min-w-0\">{node.name || '/'}</span>\n </button>\n {isOpen &&\n node.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={depth + 1}\n selectedPath={selectedPath}\n expanded={expanded}\n onToggle={onToggle}\n onSelect={onSelect}\n onHover={onHover}\n onLeave={onLeave}\n />\n ))}\n </>\n );\n }\n\n const Icon = resolveIcon(node.name);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(node)}\n onMouseEnter={handleEnter}\n onMouseLeave={onLeave}\n className={`rfp-w-full rfp-flex rfp-items-center rfp-gap-1.5 rfp-py-1.5 rfp-pr-2 rfp-text-left rfp-text-sm ${\n isSelected ? 'rfp-bg-surface-2 rfp-text-fg-primary' : 'rfp-text-fg-secondary hover:rfp-bg-surface-1'\n }`}\n style={pad}\n >\n <span className=\"rfp-w-3.5 rfp-h-3.5 rfp-flex-shrink-0\" />\n <Icon className=\"rfp-w-4 rfp-h-4 rfp-flex-shrink-0 rfp-text-fg-tertiary\" />\n <span className=\"rfp-flex-1 rfp-truncate rfp-min-w-0\">{node.name}</span>\n <span className=\"rfp-text-xs rfp-text-fg-disabled rfp-flex-shrink-0 rfp-ml-2\">\n {formatFileSize(node.size)}\n </span>\n </button>\n );\n};\n\n// ---------- Main Zip Renderer ----------\n\nexport const ZipRenderer: React.FC<ZipRendererProps> = ({ url, nestingDepth = 0, onStatsChange }) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [zip, setZip] = useState<JSZip | null>(null);\n const [tree, setTree] = useState<ZipTreeNode | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [expanded, setExpanded] = useState<Set<string>>(new Set(['']));\n const [selected, setSelected] = useState<SelectedPreview | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [hoverTip, setHoverTip] = useState<HoverTipState | null>(null);\n const onStatsChangeRef = useRef(onStatsChange);\n\n useEffect(() => {\n onStatsChangeRef.current = onStatsChange;\n }, [onStatsChange]);\n\n useEffect(() => {\n let cancelled = false;\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const res = await fetcher(url);\n if (!res.ok) throw new Error('加载失败');\n const buf = await res.arrayBuffer();\n const z = await loadZip(buf);\n if (cancelled) return;\n const entries = listZipEntries(z);\n const root = buildZipTree(entries);\n setZip(z);\n setTree(root);\n const init = new Set<string>(['']);\n if (root.children) {\n for (const c of root.children) if (c.isDir) init.add(c.path);\n }\n setExpanded(init);\n } catch (err) {\n console.error(err);\n if (!cancelled) setError(t('zip.load_failed'));\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n load();\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n // 切换文件时回收 blob URL\n useEffect(() => {\n return () => {\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n };\n }, [selected]);\n\n const totalStats = useMemo<ZipToolbarStats | null>(() => {\n if (!tree) return null;\n let files = 0;\n let dirs = 0;\n let size = 0;\n const walk = (n: ZipTreeNode) => {\n if (n.isDir) {\n if (n.path) dirs++;\n n.children?.forEach(walk);\n } else {\n files++;\n size += n.size;\n }\n };\n walk(tree);\n return { files, dirs, size };\n }, [tree]);\n\n // 向外回报 stats\n useEffect(() => {\n onStatsChangeRef.current?.(totalStats);\n return () => {\n onStatsChangeRef.current?.(null);\n };\n }, [totalStats]);\n\n const handleToggle = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n }, []);\n\n const handleHover = useCallback((text: string, rect: DOMRect) => {\n setHoverTip({\n text,\n x: rect.right + 8,\n y: rect.top + rect.height / 2,\n });\n }, []);\n\n const handleLeave = useCallback(() => {\n setHoverTip(null);\n }, []);\n\n const handleSelect = useCallback(\n async (node: ZipTreeNode) => {\n if (!zip || node.isDir) return;\n if (selected?.blobUrl) URL.revokeObjectURL(selected.blobUrl);\n setPreviewLoading(true);\n setPreviewError(null);\n\n try {\n const mime = inferMimeType(node.name);\n const blob = await readZipEntryBlob(zip, node.path, mime !== 'application/octet-stream' ? mime : undefined);\n const blobUrl = URL.createObjectURL(blob);\n setSelected({ path: node.path, name: node.name, size: node.size, blobUrl });\n } catch (err) {\n console.error(err);\n setPreviewError('条目读取失败');\n } finally {\n setPreviewLoading(false);\n }\n },\n [zip, selected]\n );\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error || !tree) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error || t('zip.parse_failed')}</p>\n </div>\n </div>\n );\n }\n\n // 左侧:文件树\n const leftPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto\">\n {tree.children?.map((child) => (\n <TreeItem\n key={child.path}\n node={child}\n depth={0}\n selectedPath={selected?.path ?? null}\n expanded={expanded}\n onToggle={handleToggle}\n onSelect={handleSelect}\n onHover={handleHover}\n onLeave={handleLeave}\n />\n ))}\n </div>\n );\n\n // 右侧:预览区\n const rightPane = (\n <div className=\"rfp-w-full rfp-h-full rfp-flex rfp-flex-col\">\n {!selected && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-muted rfp-text-sm rfp-p-6\">\n 从左侧选择一个文件以预览\n </div>\n )}\n {selected && previewLoading && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n )}\n {selected && !previewLoading && previewError && (\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center rfp-text-fg-secondary\">\n {previewError}\n </div>\n )}\n {selected && !previewLoading && !previewError && (\n <>\n <div className=\"rfp-flex-1 rfp-min-h-0 rfp-overflow-hidden rfp-flex rfp-relative rfp-z-0\">\n <Suspense\n fallback={\n <div className=\"rfp-flex-1 rfp-flex rfp-items-center rfp-justify-center\">\n <div className=\"rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n }\n >\n <LazyFilePreviewContent\n mode=\"embed\"\n files={[{ name: selected.name, url: selected.blobUrl, type: inferMimeType(selected.name) }]}\n currentIndex={0}\n zipNestingDepth={nestingDepth + 1}\n />\n </Suspense>\n </div>\n </>\n )}\n </div>\n );\n\n return (\n <>\n <ResizableSplit\n left={leftPane}\n right={rightPane}\n initialLeftWidth={280}\n minLeftWidth={180}\n maxLeftWidth={560}\n storageKey=\"rfp-zip-split-left\"\n />\n {/* 文件名 hover tooltip(portal 到 body,避免被滚动区裁剪) */}\n {hoverTip &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n className=\"rfp-fixed rfp-z-[9999] rfp-pointer-events-none rfp-px-2 rfp-py-1 rfp-bg-[rgba(0,0,0,0.85)] rfp-text-fg-primary rfp-text-xs rfp-rounded rfp-whitespace-nowrap rfp-shadow-lg\"\n style={{\n left: `${hoverTip.x}px`,\n top: `${hoverTip.y}px`,\n transform: 'translateY(-50%)',\n }}\n >\n {hoverTip.text}\n </div>,\n document.body\n )}\n </>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { fetchTextUtf8, getLanguageFromFileName } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\n\ninterface TextRendererProps {\n url: string;\n fileName: string;\n wordWrap?: boolean;\n htmlPreview?: boolean;\n}\n\nexport const TextRenderer: React.FC<TextRendererProps> = ({\n url,\n fileName,\n wordWrap = true,\n htmlPreview = false,\n}) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const language = getLanguageFromFileName(fileName);\n const { html: highlighted } = useShikiHighlight(\n language !== 'text' ? content : '',\n language,\n );\n\n useEffect(() => {\n const loadText = async () => {\n try {\n setLoading(true);\n setError(null);\n const text = await fetchTextUtf8(url, { fetcher });\n setContent(text);\n } catch (err) {\n setError(t('text.load_failed'));\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n loadText();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n <div className=\"rfp-text-fg-secondary rfp-text-center\">\n <p className=\"rfp-text-lg\">{error}</p>\n </div>\n </div>\n );\n }\n\n // HTML 预览模式\n if (htmlPreview && (language === 'html')) {\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-bg-surface-toolbar\">\n <iframe\n srcDoc={content}\n sandbox=\"allow-same-origin\"\n className=\"rfp-w-full rfp-h-full rfp-border-0\"\n title={fileName}\n />\n </div>\n );\n }\n\n // 源码模式\n return (\n <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n {language === 'text' || !highlighted ? (\n <pre\n className={`rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm ${\n wordWrap ? 'rfp-whitespace-pre-wrap rfp-break-words' : 'rfp-whitespace-pre'\n }`}\n >\n {content}\n </pre>\n ) : (\n <div\n className={`rfp-shiki-wrapper with-line-numbers ${wordWrap ? '' : 'no-wrap'}`}\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n )}\n </div>\n );\n};\n"],"names":["A","e","n","k","t","U","o","dt","ut","r","ft","mt","gt","xt","a","i","s","c","f","p","u","$","bt","B","W","Ft","wt","vt","z","yt","E","Z","V","L","l","d","T","R","O","q","F","b","g","x","v","N","D","w","m","h","y","_","S","H","_t","Ct","j","kt","St","Mt","G","J","X","K","Q","M","Y","tt","et","ot","nt","rt","P","zt","Et","it","at","C","st","lt","Nt","LocaleContext","createContext","LocaleProvider","locale","messages","children","value","useMemo","createTranslator","jsx","fallbackTranslator","getFallbackTranslator","useTranslator","ctx","useContext","useLocale","ThemeContext","ThemeProvider","theme","useResolvedTheme","OriginalSizeIcon","className","getImageToolbarGroups","ZoomOut","ZoomIn","Scan","RotateCcw","RotateCw","RefreshCw","getPdfToolbarGroups","getEpubToolbarGroups","List","_a","ChevronLeft","ChevronRight","Minimize2","Maximize2","getMobiToolbarGroups","getZipToolbarGroups","stats","formatFileSize","getTextToolbarGroups","groups","WrapText","Code","Eye","getMarkdownToolbarGroups","defaultValue","url","init","RequestContext","RequestProvider","requestInit","requestHandler","shouldFetchAsBlob","createFetcher","useFetcher","useResolvedUrl","file","fetcher","needBlob","resolved","setResolved","useState","createdRef","useRef","useEffect","cancelled","fetchAsBlobUrl","blobUrl","err","ImageRenderer","lazy","index$g","PdfRenderer","index$f","DocxRenderer","index$e","XlsxRenderer","index$d","PptxRenderer","index$c","MsgRenderer","index$b","EpubRenderer","index$a","MobiRenderer","index$9","VideoRenderer","index$8","AudioRenderer","index$7","MarkdownRenderer","index$6","JsonRenderer","index$5","CsvRenderer","index$4","XmlRenderer","index$3","SubtitleRenderer","index$2","ZipRenderer","index$1","TextRenderer","index","UnsupportedRenderer","fileName","fileType","onDownload","jsxs","FileQuestion","Download","RendererLoading","MAX_ZIP_NESTING_DEPTH","FilePreviewContent","props","FilePreviewContentInner","files","currentIndex","onNavigate","customRenderers","mode","onClose","zipNestingDepth","userMessages","headless","onCustomEvent","_requestInit","_requestHandler","_shouldFetchAsBlob","systemDark","setSystemDark","mql","handler","resolvedTheme","zoom","setZoom","rotation","setRotation","currentPage","setCurrentPage","setTotalPages","contentNaturalWidth","setContentNaturalWidth","contentNaturalHeight","setContentNaturalHeight","imageResetKey","setImageResetKey","contentRef","rootRef","epubRef","epubCurrent","setEpubCurrent","epubTotal","setEpubTotal","epubFullWidth","setEpubFullWidth","mobiRef","mobiCurrent","setMobiCurrent","mobiTotal","setMobiTotal","mobiFullWidth","setMobiFullWidth","zipStats","setZipStats","textWordWrap","setTextWordWrap","textHtmlPreview","setTextHtmlPreview","markdownViewMode","setMarkdownViewMode","navVisible","setNavVisible","navHideTimerRef","NAV_HIDE_DELAY","resetNavTimer","useCallback","handleMouseMove","normalizedFiles","normalizeFiles","currentFile","resolvedUrl","customRenderer","renderer","getFileType","emitCustom","name","payload","customCtx","containerWidth","containerHeight","scaleX","scaleY","newZoom","handleKeyDown","el","handleZoomIn","prev","handleZoomOut","handleRotate","handleRotateLeft","handleFitToWidth","handleOriginalSize","handleZoomChange","handleReset","handleDownload","downloadFileWithFetcher","handleEpubChapterChange","current","total","handleMobiChapterChange","handleZipStatsChange","showCloseButton","toolGroups","ext","_b","actionGroups","renderToolbarItems","dividerClass","group","gi","arr","React","item","ii","ToolbarButton","motion","Suspense","Fragment","icon","label","onClick","disabled","FilePreviewModal","isOpen","originalOverflow","originalPaddingRight","scrollbarWidth","modalContent","AnimatePresence","createPortal","FilePreviewEmbed","width","height","style","configurePdfjs","options","workerSrc","pdfjs","cMapUrl","cMapPacked","VERSION","packageJson","resetKey","fileSize","onZoomChange","onNaturalWidthChange","onNaturalHeightChange","loaded","setLoaded","error","setError","position","setPosition","isDragging","setIsDragging","dragStart","setDragStart","internalZoom","setInternalZoom","naturalSize","setNaturalSize","imgRef","containerRef","handleLoad","img","clampPosition","pos","currentZoom","container","containerW","containerH","imgW","imgH","margin","rangeX","rangeY","handleError","handleDoubleClick","handleWheelNative","rect","mouseX","mouseY","delta","scale","handleMouseDown","handleMouseUp","onPageChange","onTotalPagesChange","onPageWidthChange","numPages","setNumPages","pageRefs","onDocumentLoadSuccess","onDocumentLoadError","handleScroll","scrollTop","scrollCenter","currentVisiblePage","minDistance","pageElement","pageNumber","containerRect","pageCenter","distance","setPageRef","element","Document","Page","page","PAGE_HEIGHT","PAGE_PADDING_Y","PAGE_PADDING_X","PAGE_CONTENT_HEIGHT","PAGE_GAP","contentStyle","html","setHtml","loading","setLoading","pages","setPages","measureRef","response","arrayBuffer","result","mammoth","paginate","currentPageUsed","child","blocks","pageHtml","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","rawWidth","rawHeight","mountSpreadsheet","isMobile","Spreadsheet","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","loadExcel","workbook","ExcelJS","sheetData","convertWorkbookToSpreadsheetData","errorMsg","timer","FileSpreadsheet","tiled","slideCount","setSlideCount","previewerRef","arrayBufferRef","parentWidth","reinitializePreviewer","currentDimensions","previewer","timeoutId","loadPptx","hiddenContainer","tempPreviewer","count","Presentation","formatRecipients","recipients","type","email","formatDate","dateStr","date","decodeHtmlBody","fields","emptyBodyText","formatMessageClass","messageClass","labelStyle","rowStyle","iconWrapStyle","iconStyle","valueStyle","setFields","fileData","MsgReader","toStr","ccStr","bccStr","senderName","senderEmail","sender","sentDate","receivedDate","createdDate","lastModified","subject","attachments","bodyHtml","messageId","fieldsAny","importance","importanceLabel","sensitivity","sensitivityLabel","User","Users","Calendar","Clock","Tag","Mail","Paperclip","size","sizeStr","Hash","styleEl","A4_WIDTH","forwardRef","onChapterChange","onFullWidthChange","ref","viewerRef","bookRef","renditionRef","onChapterChangeRef","onFullWidthChangeRef","totalLocationsRef","lastCfiRef","isFullWidthRef","isFullWidth","setIsFullWidth","toc","setToc","showToc","setShowToc","activeTocHref","setActiveTocHref","tocRef","handlePrev","handleNext","scrollContainerRef","scrollRafRef","onScrollRef","_e","mgr","reattachScrollListener","tryAttach","toggleFullWidth","newVal","viewer","rendition","toggleToc","handleTocClick","href","useImperativeHandle","loadTimer","load","bookInput","book","ePub","loc","cur","_c","nav","location","spineHref","matches","collect","items","base","_d","onResize","isActive","renderTocItems","depth","active","READER_CSS","hostRef","viewRef","reportProgress","view","host","detail","sections","idx","frac","tocItem","res","blob","_f","getVideoType","isLoading","setIsLoading","videoRef","playerRef","videoElement","videoType","player","videojs","videoEl","useAudioPlayer","audioRef","isPlaying","setIsPlaying","currentTime","setCurrentTime","duration","setDuration","volume","setVolumeState","isMuted","setIsMuted","isLoop","setIsLoop","audio","onTimeUpdate","onDurationChange","onCanPlay","onWaiting","onPlaying","onPlay","onPause","onEnded","onError","togglePlay","seek","time","skip","seconds","setVolume","vol","clamped","toggleMute","toggleLoop","next","formatTime","minutes","MarqueeText","text","innerRef","overflow","setOverflow","scrollDist","setScrollDist","check","inner","cw","tw","observer","gap","totalScroll","dur","Tonearm","showVolume","setShowVolume","volumeRef","volumeTimerRef","progress","handleClickOutside","handleVolumeEnter","handleVolumeLeave","VolumeIcon","VolumeX","Volume1","Volume2","Repeat","SkipBack","Pause","Play","SkipForward","useShikiHighlight","code","lang","codeToHtml","out","useCopy","copied","setCopied","handleCopy","textarea","InlineCopyButton","Check","Copy","FloatingCopyButton","ShikiCodeBlock","viewMode","content","setContent","sourceHtml","fetchTextUtf8","ReactMarkdown","remarkGfm","remarkMath","rehypeRaw","rehypeKatex","node","inline","match","codeString","src","alt","checked","DARK_COLORS","LIGHT_COLORS","JsonNode","keyName","defaultExpanded","colors","expanded","setExpanded","indent","toggle","renderPrimitive","isArray","openBracket","closeBracket","ChevronDown","pickColors","data","setData","loadCsv","parsed","parseCsv","guessCsvDelimiter","convertCsvToSpreadsheetData","prettyPrintXml","xml","doc","serialized","indentXml","PADDING","reg","formatted","pad","line","padded","highlighted","raw","FORMAT_BY_EXT","getFormat","setText","parseSubtitle","isLyric","meta","dotHover","cue","formatSubtitleTime","word","wi","ResizableSplit","left","right","initialLeftWidth","minLeftWidth","maxLeftWidth","minRightWidth","storageKey","desktopMedia","leftWidth","setLeftWidth","saved","dragging","setDragging","isDesktop","setIsDesktop","mq","handleMove","cap","effectiveMax","newW","handleUp","prevCursor","prevSelect","handleDividerDown","LazyFilePreviewContent","FilePreviewContent$1","resolveIcon","FileImage","FileText","FileCode","FileIcon","TreeItem","selectedPath","onToggle","onSelect","onHover","onLeave","isSelected","handleEnter","FolderOpen","Folder","Icon","nestingDepth","onStatsChange","zip","setZip","tree","setTree","selected","setSelected","previewLoading","setPreviewLoading","previewError","setPreviewError","hoverTip","setHoverTip","onStatsChangeRef","buf","loadZip","entries","listZipEntries","root","buildZipTree","totalStats","dirs","walk","handleToggle","path","handleHover","handleLeave","handleSelect","mime","inferMimeType","readZipEntryBlob","leftPane","rightPane","wordWrap","htmlPreview","language","getLanguageFromFileName"],"mappings":"osBACA,SAASA,GAAEC,EAAG,CACZ,GAAI,CACF,MAAMC,EAAI,IAAI,IAAID,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,IAAG,GAAM,OAClD,OAAO,mBAAmBC,CAAC,CAC7B,MAAQ,CACN,MAAM,EAAID,EAAE,MAAM,GAAG,EAAE,IAAG,GAAM,OAChC,OAAO,mBAAmB,CAAC,CAC7B,CACF,CACA,SAASE,GAAEF,EAAG,CACZ,IAAIC,EACJ,MAAME,IAAMF,EAAID,EAAE,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASC,EAAE,YAAW,IAAO,GAC3E,MAAO,CAEL,IAAK,aACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,KAAM,aACN,IAAK,gBACL,IAAK,YACL,IAAK,eAEL,IAAK,YACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,IAAK,kBACL,IAAK,kBACL,IAAK,mBACL,IAAK,cACL,MAAO,aACP,IAAK,cAEL,IAAK,aACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,KAAM,aAEN,IAAK,kBACL,KAAM,0EACN,KAAM,oEACN,KAAM,4EACN,IAAK,gCACL,IAAK,6BACL,KAAM,iCACN,IAAK,+BACL,KAAM,+BACN,IAAK,+BAEL,IAAK,aACL,GAAI,gBACJ,SAAU,gBACV,KAAM,mBACN,IAAK,kBACL,KAAM,YACN,IAAK,WACL,GAAI,kBACJ,GAAI,kBACJ,IAAK,kBACL,IAAK,kBACL,GAAI,gBACJ,KAAM,cACN,IAAK,gBACL,EAAG,cACH,GAAI,gBACJ,IAAK,aACL,GAAI,cACJ,GAAI,YACJ,GAAI,cACJ,KAAM,YACN,IAAK,YACL,KAAM,YACN,IAAK,aACL,IAAK,aACL,KAAM,cACN,MAAO,cACP,IAAK,aACL,IAAK,WACL,IAAK,4BACL,IAAK,uBACL,IAAK,WACL,IAAK,iBACT,EAAIE,CAAC,GAAK,0BACV,CACA,SAASC,GAAEJ,EAAG,EAAI,EAAG,CACnB,GAAIA,aAAa,KACf,MAAO,CACL,GAAI,QAAQ,KAAK,IAAG,CAAE,IAAI,CAAC,GAC3B,KAAMA,EAAE,KACR,IAAK,IAAI,gBAAgBA,CAAC,EAC1B,KAAMA,EAAE,MAAQE,GAAEF,EAAE,IAAI,EACxB,KAAMA,EAAE,IACd,EACE,GAAI,OAAOA,GAAK,SAAU,CACxB,MAAMK,EAAIN,GAAEC,CAAC,EACb,MAAO,CACL,GAAI,OAAO,KAAK,IAAG,CAAE,IAAI,CAAC,GAC1B,KAAMK,EACN,IAAKL,EACL,KAAME,GAAEG,CAAC,CACf,CACE,CACA,MAAO,CACL,GAAIL,EAAE,IAAM,QAAQ,KAAK,IAAG,CAAE,IAAI,CAAC,GACnC,KAAMA,EAAE,KACR,IAAKA,EAAE,IACP,KAAMA,EAAE,MAAQE,GAAEF,EAAE,IAAI,EACxB,KAAMA,EAAE,IACZ,CACA,CACA,SAASM,GAAGN,EAAG,CACb,OAAOA,EAAE,IAAI,CAAC,EAAGK,IAAMD,GAAE,EAAGC,CAAC,CAAC,CAChC,CACA,SAASE,GAAGP,EAAG,CACb,IAAIQ,EACJ,MAAML,IAAMK,EAAIR,EAAE,KAAK,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASQ,EAAE,YAAW,IAAO,GAAIH,EAAIL,EAAE,KAAK,YAAW,EAC1G,GAAIK,EAAE,WAAW,QAAQ,GAAK,CAAC,MAAO,OAAQ,MAAO,MAAO,OAAQ,KAAK,EAAE,SAASF,CAAC,EACnF,MAAO,QACT,GAAIE,EAAE,SAAS,KAAK,GAAKF,IAAM,MAC7B,MAAO,MACT,GAAIE,EAAE,SAAS,kBAAkB,GAAKF,IAAM,OAC1C,MAAO,OACT,GAAIE,EAAE,SAAS,eAAe,GAAKF,IAAM,OACvC,MAAO,OACT,GAAIE,EAAE,SAAS,gBAAgB,GAAKF,IAAM,QAAUA,IAAM,MACxD,MAAO,OACT,GAAIE,EAAE,SAAS,YAAY,GAAKF,IAAM,MACpC,MAAO,MACT,GAAIE,EAAE,SAAS,MAAM,GAAKF,IAAM,OAC9B,MAAO,OACT,GAAI,CAAC,OAAQ,MAAO,OAAQ,KAAK,EAAE,SAASA,CAAC,GAAKE,IAAM,kCAAoCA,IAAM,+BAChG,MAAO,OACT,GAAI,CAAC,MAAO,KAAK,EAAE,SAASF,CAAC,GAAKE,IAAM,YAAcA,IAAM,4BAC1D,MAAO,MACT,GAAIF,IAAM,OAASE,IAAM,mBAAqBA,IAAM,WAClD,MAAO,MACT,GAAI,CAAC,MAAO,MAAO,MAAO,OAAQ,MAAO,MAAO,OAAQ,MAAM,EAAE,SAASF,CAAC,GAAKE,IAAM,YAAcA,IAAM,wBAA0BA,IAAM,uBACvI,MAAO,WACT,GAAIF,IAAM,OAASE,IAAM,mBAAqBA,IAAM,+BAClD,MAAO,MACT,GAAIA,EAAE,WAAW,QAAQ,GAAK,CAAC,MAAO,OAAQ,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAAE,SAASF,CAAC,EAC9G,MAAO,QACT,GAAIE,EAAE,WAAW,QAAQ,GAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,KAAK,EAAE,SAASF,CAAC,EAClF,MAAO,QACT,GAAIA,IAAM,MAAQA,IAAM,WACtB,MAAO,WACT,GAAIE,IAAM,oBAAsBF,IAAM,OACpC,MAAO,OACT,MAAMF,EAAI,CACR,MACA,MACA,OACA,KACA,MACA,KACA,MACA,KACA,OACA,MACA,IACA,IACA,KACA,MACA,KACA,KACA,MACA,KACA,QACA,KACA,MACA,MACA,OACA,MACA,OACA,OACA,OACA,OACA,MACA,OACA,MACA,OACA,MACA,OACA,QACA,KACA,OACA,MACA,KACJ,EACE,OAAOI,EAAE,WAAW,OAAO,GAAKJ,EAAE,SAASE,CAAC,EAAI,OAAS,aAC3D,CACA,SAASM,GAAGT,EAAG,CACb,IAAIC,EACJ,MAAME,IAAMF,EAAID,EAAE,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASC,EAAE,YAAW,IAAO,GAC3E,MAAO,CACL,GAAI,aACJ,IAAK,MACL,GAAI,aACJ,IAAK,MACL,GAAI,SACJ,KAAM,OACN,IAAK,MACL,EAAG,IACH,GAAI,SACJ,IAAK,MACL,GAAI,OACJ,GAAI,KACJ,IAAK,KACL,GAAI,OACJ,MAAO,QACP,GAAI,SACJ,IAAK,MACL,IAAK,MACL,MAAO,QACP,GAAI,OACJ,KAAM,OACN,IAAK,OACL,KAAM,OACN,IAAK,MACL,KAAM,OACN,IAAK,MACL,KAAM,OACN,KAAM,OACN,KAAM,OACN,IAAK,MACL,KAAM,OACN,IAAK,OACL,KAAM,OACN,IAAK,MACL,IAAK,OACL,KAAM,QACN,KAAM,OACN,MAAO,OACP,IAAK,MACL,GAAI,WACJ,IAAK,MACT,EAAIE,CAAC,GAAK,MACV,CAiBA,SAASO,GAAGV,EAAG,CACb,OAAOA,EAAI,KAAO,GAAGA,CAAC,KAAOA,EAAI,KAAO,KAAO,IAAIA,EAAI,MAAM,QAAQ,CAAC,CAAC,MAAQ,IAAIA,GAAK,KAAO,OAAO,QAAQ,CAAC,CAAC,KAClH,CAMA,SAASW,GAAGX,EAAG,CACb,IAAIK,EACJ,SAAUA,EAAIL,EAAE,MAAM,GAAG,EAAE,IAAG,IAAO,KAAO,OAASK,EAAE,YAAW,IAAO,MAAQ,MAAQ,IAAM,GACjG,CACA,SAASO,GAAGZ,EAAG,EAAI,GAAI,CACrB,MAAMK,EAAI,EAAE,WAAa,IAAKJ,EAAI,EAAE,kBAAoB,GAAIO,EAAI,CAAA,EAChE,IAAIK,EAAI,CAAA,EAAIC,EAAI,GAAI,EAAI,GAAIC,EAAI,EAChC,MAAMC,EAAIhB,EAAE,OACZ,KAAOe,EAAIC,GAAK,CACd,MAAMC,EAAIjB,EAAEe,CAAC,EACb,GAAI,EAAG,CACL,GAAIE,IAAM,IAAK,CACb,GAAIjB,EAAEe,EAAI,CAAC,IAAM,IAAK,CACpBD,GAAK,IAAKC,GAAK,EACf,QACF,CACA,EAAI,GAAIA,GAAK,EACb,QACF,CACAD,GAAKG,EAAGF,GAAK,EACb,QACF,CACA,GAAIE,IAAM,IAAK,CACb,EAAI,GAAIF,GAAK,EACb,QACF,CACA,GAAIE,IAAMZ,EAAG,CACXQ,EAAE,KAAKC,CAAC,EAAGA,EAAI,GAAIC,GAAK,EACxB,QACF,CACA,GAAIE,IAAM,KAAM,CACdjB,EAAEe,EAAI,CAAC,IAAM;AAAA,IACbA,GAAK,GAAIF,EAAE,KAAKC,CAAC,EAAGN,EAAE,KAAKK,CAAC,EAAGA,EAAI,CAAA,EAAIC,EAAI,GAAIC,GAAK,EACpD,QACF,CACA,GAAIE,IAAM;AAAA,EACX,CACGJ,EAAE,KAAKC,CAAC,EAAGN,EAAE,KAAKK,CAAC,EAAGA,EAAI,CAAA,EAAIC,EAAI,GAAIC,GAAK,EAC3C,QACF,CACAD,GAAKG,EAAGF,GAAK,CACf,CACA,KAAMD,EAAE,OAAS,GAAKD,EAAE,OAAS,KAAOA,EAAE,KAAKC,CAAC,EAAGN,EAAE,KAAKK,CAAC,GAAIL,EAAE,OAAS,GAAK,CAC7E,MAAMS,EAAIT,EAAEA,EAAE,OAAS,CAAC,EACxB,GAAIS,EAAE,SAAW,GAAKA,EAAE,CAAC,IAAM,GAC7BT,EAAE,IAAG,MAEL,MACJ,CACA,IAAI,EAAI,GAAIU,EAAIV,EAChBP,GAAKO,EAAE,OAAS,IAAM,EAAIA,EAAE,CAAC,EAAGU,EAAIV,EAAE,MAAM,CAAC,GAC7C,MAAMW,EAAI,KAAK,IACb,EAAE,OACF,GAAGD,EAAE,IAAKD,GAAMA,EAAE,MAAM,EACxB,CACJ,EACE,UAAWA,KAAKC,EACd,KAAOD,EAAE,OAASE,GAAKF,EAAE,KAAK,EAAE,EAClC,MAAO,CACL,OAAQ,EACR,KAAMC,EACN,YAAaC,EACb,UAAWd,CACf,CACA,CACA,SAASe,GAAEpB,EAAG,CACZ,MAAM,EAAIA,aAAa,WAAaA,EAAI,IAAI,WAAWA,CAAC,EACxD,GAAI,EAAE,QAAU,GAAK,EAAE,CAAC,IAAM,KAAO,EAAE,CAAC,IAAM,KAAO,EAAE,CAAC,IAAM,IAC5D,OAAO,IAAI,YAAY,OAAO,EAAE,OAAO,CAAC,EAC1C,GAAI,EAAE,QAAU,GAAK,EAAE,CAAC,IAAM,KAAO,EAAE,CAAC,IAAM,IAC5C,OAAO,IAAI,YAAY,UAAU,EAAE,OAAO,CAAC,EAC7C,GAAI,EAAE,QAAU,GAAK,EAAE,CAAC,IAAM,KAAO,EAAE,CAAC,IAAM,IAC5C,OAAO,IAAI,YAAY,UAAU,EAAE,OAAO,CAAC,EAC7C,GAAI,CACF,OAAO,IAAI,YAAY,QAAS,CAAE,MAAO,EAAE,CAAE,EAAE,OAAO,CAAC,CACzD,MAAQ,CACR,CACA,GAAI,CACF,OAAO,IAAI,YAAY,KAAK,EAAE,OAAO,CAAC,CACxC,MAAQ,CACR,CACA,OAAO,IAAI,YAAY,QAAS,CAAE,MAAO,GAAI,EAAE,OAAO,CAAC,CACzD,CAEA,eAAeqB,GAAGrB,EAAG,EAAG,CACtB,MAAMK,EAAI,CAAC,CAAC,IAAM,YAAa,GAAK,SAAU,GAAIJ,EAAII,EAAI,EAAE,SAAW,MAAQ,MAAOG,EAAIH,EAAI,EAAE,KAAO,EAAGQ,EAAI,MAAMZ,EAAED,EAAGQ,CAAC,EAC1H,GAAI,CAACK,EAAE,GAAI,MAAM,IAAI,MAAM,SAASA,EAAE,MAAM,EAAE,EAC9C,MAAMC,EAAI,MAAMD,EAAE,YAAW,EAC7B,OAAOO,GAAEN,CAAC,CACZ,CACA,eAAeQ,GAAEtB,EAAG,EAAG,CACrB,GAAIA,EACF,OAAO,OAAOA,GAAK,WAAa,MAAMA,EAAE,CAAC,EAAIA,CACjD,CACA,SAASuB,GAAEvB,EAAG,EAAG,CACf,GAAI,CAACA,GAAK,CAAC,EAAG,OACd,GAAI,CAACA,EAAG,OAAO,EACf,GAAI,CAAC,EAAG,OAAOA,EACf,MAAMK,EAAI,IAAI,QAAQL,EAAE,SAAW,CAAA,CAAE,EACrC,OAAO,EAAE,SAAW,IAAI,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAACC,EAAGO,IAAM,CAC3DH,EAAE,IAAIG,EAAGP,CAAC,CACZ,CAAC,EAAG,CACF,GAAGD,EACH,GAAG,EACH,QAASK,CACb,CACA,CACA,SAASmB,GAAGxB,EAAG,CACb,MAAM,GAAKA,GAAK,KAAO,OAASA,EAAE,kBAAoB,CAACC,EAAGO,IAAM,MAAMP,EAAGO,CAAC,GAAIH,EAAIL,GAAK,KAAO,OAASA,EAAE,YACzG,MAAO,OAAOC,EAAGO,IAAM,CACrB,MAAMK,EAAI,MAAMS,GAAEjB,EAAGJ,CAAC,EAAGa,EAAIS,GAAEV,EAAGL,CAAC,EACnC,OAAO,EAAEP,EAAGa,CAAC,CACf,CACF,CACA,eAAeW,GAAGzB,EAAG,EAAI,MAAOK,EAAG,CACjC,MAAMJ,EAAI,MAAM,EAAED,EAAGK,CAAC,EACtB,GAAI,CAACJ,EAAE,GAAI,MAAM,IAAI,MAAM,SAASA,EAAE,MAAM,EAAE,EAC9C,MAAMO,EAAI,MAAMP,EAAE,KAAI,EACtB,OAAO,IAAI,gBAAgBO,CAAC,CAC9B,CACA,eAAekB,GAAG1B,EAAG,EAAGK,EAAI,MAAOJ,EAAG,CACpC,MAAMO,EAAI,MAAMH,EAAEL,EAAGC,CAAC,EACtB,GAAI,CAACO,EAAE,GAAI,MAAM,IAAI,MAAM,SAASA,EAAE,MAAM,EAAE,EAC9C,MAAMK,EAAI,MAAML,EAAE,KAAI,EAAIM,EAAI,IAAI,gBAAgBD,CAAC,EACnD,GAAI,CACF,MAAM,EAAI,SAAS,cAAc,GAAG,EACpC,EAAE,KAAOC,EAAG,EAAE,SAAW,EAAG,EAAE,MAAM,QAAU,OAAQ,SAAS,KAAK,YAAY,CAAC,EAAG,EAAE,MAAK,EAAI,SAAS,KAAK,YAAY,CAAC,CAC5H,QAAC,CACC,WAAW,IAAM,IAAI,gBAAgBA,CAAC,EAAG,GAAG,CAC9C,CACF,CACA,SAASa,GAAE3B,EAAG,CACZ,MAAM,EAAIA,EAAE,KAAI,EAAG,QAAQ,IAAK,GAAG,EAAGK,EAAI,EAAE,MAAM,GAAG,EAAE,IAAKJ,GAAMA,EAAE,MAAM,EAC1E,GAAII,EAAE,SAAW,EAAG,CAClB,KAAM,CAACJ,EAAGO,EAAGK,CAAC,EAAIR,EAClB,OAAO,OAAOJ,CAAC,EAAI,KAAO,OAAOO,CAAC,EAAI,GAAK,OAAOK,CAAC,CACrD,CACA,GAAIR,EAAE,SAAW,EAAG,CAClB,KAAM,CAACJ,EAAGO,CAAC,EAAIH,EACf,OAAO,OAAOJ,CAAC,EAAI,GAAK,OAAOO,CAAC,CAClC,CACA,OAAO,OAAO,CAAC,GAAK,CACtB,CACA,SAASoB,GAAG5B,EAAG,CACb,GAAI,CAAC,SAASA,CAAC,GAAKA,EAAI,EAAG,MAAO,eAClC,MAAM,EAAI,KAAK,MAAMA,EAAI,GAAG,EAAGK,EAAI,EAAI,IAAKJ,EAAI,KAAK,MAAM,EAAI,GAAG,EAAI,GAAIO,EAAI,KAAK,MAAM,EAAI,GAAG,EAAI,GAAIK,EAAI,KAAK,MAAM,EAAI,IAAI,EAAGC,EAAI,CAAC,EAAGC,EAAI,IAAM,EAAE,SAAQ,EAAG,SAASA,EAAG,GAAG,EAChL,MAAO,GAAGD,EAAED,CAAC,CAAC,IAAIC,EAAEN,CAAC,CAAC,IAAIM,EAAEb,CAAC,CAAC,IAAIa,EAAET,EAAG,CAAC,CAAC,EAC3C,CACA,MAAMwB,GAAI,sFAAuFC,GAAI,0CACrG,SAASC,GAAE/B,EAAG,CACZ,MAAM,EAAIA,EAAE,QAAQ,UAAW,EAAE,EAAE,UAAS,EAC5C,MAAO,UAAU,KAAK,CAAC,EAAI,MAAQ,WAAW,KAAK,CAAC,GAAK,eAAe,KAAK,CAAC,EAAI,OAAS,qBAAqB,KAAK,CAAC,GAAK,cAAc,KAAK,CAAC,EAAI,6BAA6B,KAAK,CAAC,EAAI,MAAQ,MAAQ8B,GAAE,KAAK,CAAC,GAAK,6CAA6C,KAAK,CAAC,EAAI,oCAAoC,KAAK,CAAC,EAAI,OAAS,MAAQ,KAC/U,CACA,SAASE,GAAEhC,EAAG,EAAG,CACf,MAAM,EAAIA,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EAAGQ,EAAI,CAAA,EACN,IAAIK,EAAG,EAAI,EACX,GAAI,IAAM,MAAO,CACf,MAAMoB,EAAI,CAAA,EACV,KAAO,EAAI,EAAE,QAAU,EAAE,CAAC,EAAE,KAAI,IAAO,IACrCA,EAAE,KAAK,EAAE,CAAC,CAAC,EAAG,IAChB,IAAKpB,EAAIoB,EAAE,KAAK;AAAA,CACnB,EAAG,EAAI,EAAE,QAAU,EAAE,CAAC,EAAE,KAAI,IAAO,IAAM,GACxC,CACA,KAAO,EAAI,EAAE,QAAU,CACrB,KAAO,EAAI,EAAE,QAAU,EAAE,CAAC,EAAE,KAAI,IAAO,IAAM,IAC7C,GAAI,GAAK,EAAE,OAAQ,MACnB,IAAIA,EAAGlB,EAAI,KACX,GAAIc,GAAE,KAAK,EAAE,CAAC,CAAC,EACbd,EAAI,EAAE,CAAC,EAAG,YACHkB,EAAI,EAAE,CAAC,EAAE,KAAI,GAAM,OAAQ,IAAK,EAAI,EAAE,QAAUJ,GAAE,KAAK,EAAE,CAAC,CAAC,EAClEd,EAAI,EAAE,CAAC,EAAG,QAEV,UACF,GAAI,CAACA,EAAG,SACR,MAAMC,EAAID,EAAE,MAAM,+BAA+B,EACjD,GAAI,CAACC,EAAG,SACR,MAAMkB,EAAIP,GAAEX,EAAE,CAAC,CAAC,EAAGE,EAAIS,GAAEX,EAAE,CAAC,CAAC,EAAGG,EAAI,CAAA,EACpC,KAAO,EAAI,EAAE,QAAU,EAAE,CAAC,EAAE,KAAI,IAAO,IACrCA,EAAE,KAAK,EAAE,CAAC,CAAC,EAAG,IAChBX,EAAE,KAAK,CAAE,GAAIyB,EAAG,MAAOC,EAAG,IAAKhB,EAAG,KAAMC,EAAE,KAAK;AAAA,CAClD,EAAG,CACF,CACA,MAAO,CAAE,OAAQ,EAAG,KAAMX,EAAG,OAAQK,CAAC,CACxC,CACA,SAASsB,GAAEnC,EAAG,EAAGK,EAAG,CAClB,MAAMJ,EAAI,OAAOD,CAAC,EAAGQ,EAAI,OAAO,CAAC,EACjC,IAAIK,EAAI,EACR,GAAIR,EAAG,CACL,MAAMS,GAAKT,EAAI,OAAO,MAAM,EAAG,CAAC,EAChCQ,EAAI,OAAOC,CAAC,CACd,CACA,OAAOb,EAAI,GAAKO,EAAIK,EAAI,GAC1B,CACA,SAASuB,GAAEpC,EAAG,EAAG,CACf,MAAMK,EAAI,mDAAmD,KAAKL,EAAE,KAAI,CAAE,EAC1E,GAAI,CAACK,EAAG,MAAO,GACf,MAAMJ,EAAII,EAAE,CAAC,EAAE,cAAeG,EAAIH,EAAE,CAAC,EAAE,KAAI,EAC3C,GAAI,EAAE,SAASJ,CAAC,EAAIO,EAAGP,IAAM,SAAU,CACrC,MAAMY,EAAI,OAAOL,CAAC,EAClB,MAAMK,CAAC,IAAM,EAAE,SAAWA,EAC5B,CACA,MAAO,EACT,CACA,SAASwB,GAAErC,EAAG,CACZ,MAAMK,EAAIL,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EAAG,EAAI,CAAE,SAAU,GAAI,SAAU,CAAC,EAAIQ,EAAI,6CAA8CK,EAAI,CAAA,EAC3F,UAAWE,KAAKV,EAAG,CACjB,MAAMW,EAAID,EAAE,KAAI,EAChB,GAAI,CAACC,GAAKoB,GAAEpB,EAAG,CAAC,EAAG,SACnB,MAAMkB,EAAI,CAAA,EACV,IAAIhB,EAAI,EACRV,EAAE,UAAY,EACd,IAAIW,EACJ,MAAQA,EAAIX,EAAE,KAAKQ,CAAC,KAAO,MAAQG,EAAE,QAAUD,GAC7CgB,EAAE,KAAKC,GAAEhB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAGD,EAAIC,EAAE,MAAQA,EAAE,CAAC,EAAE,OAClD,GAAIe,EAAE,SAAW,EAAG,SACpB,MAAMjB,EAAID,EAAE,MAAME,CAAC,EAAE,KAAI,EACzB,UAAW,KAAKgB,EACdrB,EAAE,KAAK,CAAE,MAAO,EAAG,KAAMI,EAAG,CAChC,CACAJ,EAAE,KAAK,CAACE,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EAClC,MAAM,EAAI,EAAE,SAAW,IACvB,MAAO,CAAE,OAAQ,MAAO,KAAMH,EAAE,IAAI,CAACE,EAAGC,IAAM,CAC5C,MAAMkB,EAAI,KAAK,IAAI,EAAGnB,EAAE,MAAQ,CAAC,EAAGG,EAAIL,EAAEG,EAAI,CAAC,EAAGG,EAAID,EAAI,KAAK,IAAIgB,EAAGhB,EAAE,MAAQ,CAAC,EAAIgB,EAAI,EACzF,MAAO,CAAE,MAAOA,EAAG,IAAKf,EAAG,KAAMJ,EAAE,IAAI,CACzC,CAAC,EAAG,SAAU,EAAE,QAAQ,CAC1B,CACA,SAASuB,GAAEtC,EAAG,CACZ,MAAMK,EAAIL,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EAAG,EAAI,CAAE,SAAU,CAAA,EAAI,SAAU,GAAKQ,EAAI,6CAA8CK,EAAI,2CAA4C,EAAI,CAAA,EAC3I,UAAWG,KAAKX,EAAG,CACjB,MAAM6B,EAAIlB,EAAE,KAAI,EAChB,GAAI,CAACkB,GAAKE,GAAEF,EAAG,CAAC,EAAG,SACnB,MAAMhB,EAAI,CAAA,EACV,IAAIC,EAAI,EACRX,EAAE,UAAY,EACd,IAAIS,EACJ,MAAQA,EAAIT,EAAE,KAAK0B,CAAC,KAAO,MAAQjB,EAAE,QAAUE,GAC7CD,EAAE,KAAKiB,GAAElB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAGE,EAAIF,EAAE,MAAQA,EAAE,CAAC,EAAE,OAClD,GAAIC,EAAE,SAAW,EAAG,SACpB,MAAM,EAAIgB,EAAE,MAAMf,CAAC,EACnB,UAAW,KAAKD,EACd,EAAE,KAAK,CAAE,MAAO,EAAG,IAAK,EAAG,CAC/B,CACA,EAAE,KAAK,CAACF,EAAGkB,IAAMlB,EAAE,MAAQkB,EAAE,KAAK,EAClC,MAAMD,EAAI,EAAE,SAAW,IACvB,MAAO,CAAE,OAAQ,OAAQ,KAAM,EAAE,IAAI,CAACjB,EAAGkB,IAAM,CAC7C,MAAMhB,EAAI,CAAA,EACV,IAAIC,EAAI,GAAIF,EAAI,EAAG,EAAI,KACvBJ,EAAE,UAAY,EACd,IAAI,EACJ,MAAQ,EAAIA,EAAE,KAAKG,EAAE,GAAG,KAAO,MAAQ,CACrC,MAAMuB,EAAIvB,EAAE,IAAI,MAAMC,EAAG,EAAE,KAAK,EAChC,IAAM,MAAQsB,GAAKrB,EAAE,KAAK,CAAE,MAAO,KAAK,IAAI,EAAG,EAAIe,CAAC,EAAG,KAAMM,CAAC,CAAE,EAAGpB,GAAKoB,EAAG,EAAIJ,GAAE,EAAE,CAAC,EAAG,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EAAGlB,EAAI,EAAE,MAAQ,EAAE,CAAC,EAAE,MACzH,CACA,MAAMuB,EAAIxB,EAAE,IAAI,MAAMC,CAAC,EACvB,IAAM,MAAQuB,GAAKtB,EAAE,KAAK,CAAE,MAAO,KAAK,IAAI,EAAG,EAAIe,CAAC,EAAG,KAAMO,CAAC,CAAE,EAAGrB,GAAKqB,EACxE,MAAMC,EAAI,KAAK,IAAI,EAAGzB,EAAE,MAAQiB,CAAC,EAAGS,EAAI,EAAER,EAAI,CAAC,EAAGS,EAAID,EAAI,KAAK,IAAID,EAAGC,EAAE,MAAQT,CAAC,EAAIQ,EAAI,EACzF,MAAO,CACL,MAAOA,EACP,IAAKE,EACL,KAAMxB,EAAE,KAAI,EACZ,MAAOD,EAAE,OAASA,EAAI,MAC5B,CACE,CAAC,EAAG,SAAU,EAAE,QAAQ,CAC1B,CACA,SAAS0B,GAAE5C,EAAG,CACZ,MAAM,EAAIA,EAAE,KAAI,EAAG,MAAM,GAAG,EAC5B,OAAO,EAAE,SAAW,EAAI,EAAI,OAAO,EAAE,CAAC,CAAC,EAAI,KAAO,OAAO,EAAE,CAAC,CAAC,EAAI,GAAK,OAAO,EAAE,CAAC,EAAE,QAAQ,IAAK,GAAG,CAAC,CACrG,CACA,SAAS6C,GAAE7C,EAAG,EAAG,CACf,MAAM,EAAIA,EAAE,QAAQ,SAAU;AAAA,CAC/B,EAAE,QAAQ,UAAW,EAAE,EAAE,MAAM;AAAA,CAC/B,EACC,IAAIQ,EAAI,GAAIK,EAAI,CAAA,EAChB,MAAM,EAAI,GAAIoB,EAAI,CAAA,EAClB,UAAWlB,KAAK,EAAG,CACjB,MAAMC,EAAID,EAAE,QAAQ,OAAQ,EAAE,EAAGmB,EAAIlB,EAAE,KAAI,EAAIE,EAAI,oBAAoB,KAAKgB,CAAC,EAC7E,GAAIhB,EAAG,CACLV,EAAIU,EAAE,CAAC,EAAE,YAAW,EAAIe,EAAE,KAAKjB,CAAC,EAChC,QACF,CACA,GAAIR,IAAM,SAAU,CAClByB,EAAE,KAAKjB,CAAC,EACR,QACF,CACA,MAAMG,EAAI,oBAAoB,KAAKe,CAAC,EACpC,GAAIf,EAAG,CACLN,EAAIM,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAK2B,GAAMA,EAAE,KAAI,CAAE,EACvC,QACF,CACA,MAAM7B,EAAI,gCAAgC,KAAKiB,CAAC,EAChD,GAAI,CAACjB,GAAKA,EAAE,CAAC,EAAE,YAAW,IAAO,WAAaJ,EAAE,SAAW,EAAG,SAC9D,MAAMkC,EAAIlC,EAAE,OAAQmC,EAAI/B,EAAE,CAAC,EAAE,MAAM,GAAG,EAAGuB,EAAIQ,EAAE,MAAM,EAAGD,EAAI,CAAC,EAAGN,EAAIO,EAAE,MAAMD,EAAI,CAAC,EAAE,KAAK,GAAG,EAAGL,EAAI,CAAA,EAClG7B,EAAE,QAAQ,CAACiC,EAAGG,IAAM,CAClBP,EAAEI,CAAC,EAAIG,IAAMF,EAAI,EAAIN,EAAID,EAAES,CAAC,GAAK,EACnC,CAAC,EACD,MAAMN,EAAIC,GAAEF,EAAE,OAAS,EAAE,EAAGH,EAAIK,GAAEF,EAAE,KAAO,EAAE,EAAGQ,GAAKR,EAAE,MAAQ,IAAI,QAAQ,OAAQ;AAAA,CACtF,EAAE,QAAQ,OAAQ;AAAA,CAClB,EAAE,QAAQ,OAAQ,GAAG,EAAE,QAAQ,aAAc,EAAE,EAC5C,EAAE,KAAK,CAAE,MAAOC,EAAG,IAAKJ,EAAG,KAAMW,EAAG,MAAOR,EAAE,KAAK,CAAE,CACtD,CACA,OAAO,EAAE,KAAK,CAAC3B,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EAAG,CAC1C,OAAQ,EACR,KAAM,EACN,OAAQiB,EAAE,KAAK;AAAA,CAClB,EAAE,KAAI,GAAM,MACb,CACA,CACA,SAASkB,GAAEnD,EAAG,CACZ,MAAM,EAAIA,EAAE,KAAI,EAChB,GAAI,CAAC,EAAG,MAAO,GACf,MAAMK,EAAI,mCAAmC,KAAK,CAAC,EACnD,GAAIA,EAAG,CACL,MAAMG,EAAI,OAAOH,EAAE,CAAC,CAAC,EAAGQ,EAAIR,EAAE,CAAC,EAAE,YAAW,EAC5C,OAAOQ,IAAM,IAAML,EAAI,KAAOK,IAAM,IAAML,EAAI,GAAKK,IAAM,KAAOL,EAAI,IAAMA,CAC5E,CACA,MAAMP,EAAI,EAAE,MAAM,GAAG,EACrB,OAAOA,EAAE,SAAW,EAAI,OAAOA,EAAE,CAAC,CAAC,EAAI,KAAO,OAAOA,EAAE,CAAC,CAAC,EAAI,GAAK,OAAOA,EAAE,CAAC,CAAC,EAAIA,EAAE,SAAW,EAAI,OAAOA,EAAE,CAAC,CAAC,EAAI,GAAK,OAAOA,EAAE,CAAC,CAAC,EAAI,OAAO,CAAC,GAAK,CACpJ,CACA,SAASmD,GAAEpD,EAAG,CACZ,GAAI,OAAO,UAAY,IACrB,MAAM,IAAI,MAAM,+CAA+C,EACjE,MAAM,EAAI,IAAI,UAAS,EAAG,gBAAgBA,EAAG,iBAAiB,EAC9D,GAAI,EAAE,qBAAqB,aAAa,EAAE,OAAS,EACjD,MAAM,IAAI,MAAM,sBAAsB,EACxC,MAAM,EAAI,EAAE,qBAAqB,GAAG,EAAGQ,EAAI,CAAA,EAC3C,QAASK,EAAI,EAAGA,EAAI,EAAE,OAAQA,IAAK,CACjC,MAAM,EAAI,EAAEA,CAAC,EAAGoB,EAAI,EAAE,aAAa,OAAO,GAAK,GAAIlB,EAAI,EAAE,aAAa,KAAK,GAAK,GAAIC,EAAI,EAAE,aAAa,KAAK,GAAK,GAAIkB,EAAIiB,GAAElB,CAAC,EAC5H,IAAIf,EACJH,EAAIG,EAAIiC,GAAEpC,CAAC,EAAIC,EAAIE,EAAIgB,EAAIiB,GAAEnC,CAAC,EAAIE,EAAIgB,EAAI,EAC1C,IAAIf,EAAI,GACR,EAAE,WAAW,QAAS4B,GAAM,CAC1B,GAAIA,EAAE,WAAa,EACjB5B,GAAK4B,EAAE,WAAa,WACbA,EAAE,WAAa,EAAG,CACzB,MAAMC,EAAID,EACVC,EAAE,QAAQ,gBAAkB,KAAO7B,GAAK;AAAA,EAC5CA,GAAK6B,EAAE,aAAe,EACpB,CACF,CAAC,EACD,MAAM/B,EAAIE,EAAE,QAAQ,UAAW,GAAG,EAAE,QAAQ,OAAQ;AAAA,CACvD,EAAE,KAAI,GACFF,GAAKiB,GAAKhB,IAAMV,EAAE,KAAK,CAAE,MAAO0B,EAAG,IAAKhB,EAAG,KAAMD,CAAC,CAAE,CACvD,CACA,OAAOT,EAAE,KAAK,CAACK,EAAG,IAAMA,EAAE,MAAQ,EAAE,KAAK,EAAG,CAAE,OAAQ,OAAQ,KAAML,CAAC,CACvE,CACA,SAAS6C,GAAGrD,EAAG,EAAG,CAChB,OAAQ,GAAK+B,GAAE/B,CAAC,EAAC,CACf,IAAK,MACH,OAAOqC,GAAErC,CAAC,EACZ,IAAK,OACH,OAAOsC,GAAEtC,CAAC,EACZ,IAAK,MACH,OAAO6C,GAAE7C,EAAG,KAAK,EACnB,IAAK,MACH,OAAO6C,GAAE7C,EAAG,KAAK,EACnB,IAAK,OACH,OAAOoD,GAAEpD,CAAC,EACZ,IAAK,MACH,OAAOgC,GAAEhC,EAAG,KAAK,EACnB,IAAK,MACL,QACE,OAAOgC,GAAEhC,EAAG,KAAK,CACvB,CACA,CACA,eAAesD,GAAGtD,EAAG,CACnB,OAAOuD,GAAE,UAAUvD,CAAC,CACtB,CACA,SAASwD,GAAGxD,EAAG,CACb,MAAM,EAAI,CAAA,EACV,OAAOA,EAAE,QAAQ,CAACK,EAAGJ,IAAM,CACzB,IAAIiB,EACJ,MAAMV,EAAIP,EAAE,IAAKY,EAAIL,GAAK,CAACH,EAAE,SAAS,GAAG,EAAIA,EAAI,IAAMA,EAAGS,EAAIN,EAAIK,EAAE,QAAQ,MAAO,EAAE,EAAIA,EAAGoB,EAAInB,EAAE,YAAY,GAAG,EAAGC,EAAIkB,GAAK,EAAInB,EAAE,MAAMmB,EAAI,CAAC,EAAInB,EAAGE,EAAIiB,GAAK,EAAInB,EAAE,MAAM,EAAGmB,CAAC,EAAI,GAAIC,EAAI1B,EAAI,IAAMU,EAAIjB,EAAE,QAAU,KAAO,OAASiB,EAAE,mBAAqB,EAC3P,EAAE,KAAK,CACL,KAAML,EACN,KAAME,EACN,IAAKC,EACL,MAAOR,EACP,KAAM0B,EACN,KAAMjC,EAAE,IACd,CAAK,CACH,CAAC,EAAG,CACN,CACA,SAASwD,GAAGzD,EAAG,CACb,MAAM,EAAI,CAAE,KAAM,GAAI,KAAM,GAAI,MAAO,GAAI,SAAU,CAAA,EAAI,KAAM,CAAC,EAAIK,EAAoB,IAAI,IAC5FA,EAAE,IAAI,GAAI,CAAC,EACX,MAAMJ,EAAKY,GAAM,CACf,GAAIR,EAAE,IAAIQ,CAAC,EAAG,OAAOR,EAAE,IAAIQ,CAAC,EAC5B,MAAMC,EAAID,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EACrC,IAAI,EAAI,EAAGE,EAAI,GACf,UAAWC,KAAKF,EAAG,CACjBC,EAAIA,EAAI,GAAGA,CAAC,IAAIC,CAAC,GAAKA,EACtB,IAAI,EAAIX,EAAE,IAAIU,CAAC,EACf,IAAM,EAAI,CAAE,KAAMC,EAAG,KAAMD,EAAI,IAAK,MAAO,GAAI,SAAU,CAAA,EAAI,KAAM,CAAC,EAAI,EAAE,SAAS,KAAK,CAAC,EAAGV,EAAE,IAAIU,EAAG,CAAC,GAAI,EAAI,CAChH,CACA,OAAO,CACT,EACA,UAAWF,KAAKb,EAAG,CACjB,GAAIa,EAAE,MAAO,CACXZ,EAAEY,EAAE,KAAK,QAAQ,MAAO,EAAE,CAAC,EAC3B,QACF,CACAZ,EAAEY,EAAE,GAAG,EAAE,SAAS,KAAK,CACrB,KAAMA,EAAE,KACR,KAAMA,EAAE,KACR,MAAO,GACP,KAAMA,EAAE,IACd,CAAK,CACH,CACA,MAAML,EAAKK,GAAM,CACf,GAAIA,EAAE,SAAU,CACdA,EAAE,SAAS,KAAK,CAACC,EAAG,IAAMA,EAAE,QAAU,EAAE,MAAQA,EAAE,MAAQ,GAAK,EAAIA,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC/F,UAAWA,KAAKD,EAAE,SAAUL,EAAEM,CAAC,CACjC,CACF,EACA,OAAON,EAAE,CAAC,EAAG,CACf,CAOA,eAAekD,GAAG1D,EAAG,EAAGK,EAAG,CACzB,MAAMJ,EAAID,EAAE,KAAK,CAAC,EAClB,GAAI,CAACC,EAAG,MAAM,IAAI,MAAM,wBAAwB,CAAC,EAAE,EACnD,MAAMO,EAAI,MAAMP,EAAE,MAAM,aAAa,EACrC,OAAO,IAAI,KAAK,CAACO,CAAC,EAAGH,EAAI,CAAE,KAAMA,CAAC,EAAK,MAAM,CAC/C,CACA,SAASsD,GAAE3D,EAAG,CACZ,OAAOA,EAAIA,EAAE,WAAW,GAAG,EAAIA,EAAIA,EAAE,SAAW,EAAI,IAAMA,EAAE,UAAU,CAAC,EAAIA,EAAE,SAAW,EAAI,IAAMA,EAAI,UAAY,SACpH,CACA,MAAM4D,GAAI,CACR,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,QACF,EAAGC,GAAI,CACL,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,QACF,EACA,SAASC,GAAE9D,EAAG,EAAG,CACf,MAAMK,EAAI,SAASL,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAAGC,EAAI,SAASD,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAAGQ,EAAI,SAASR,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAAGa,EAAKG,GAAM,EAAI,EAAI,KAAK,MAAMA,GAAK,EAAI,EAAE,EAAI,KAAK,MAAMA,GAAK,IAAMA,GAAK,CAAC,EAAGF,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGD,EAAER,CAAC,CAAC,CAAC,EAAG,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGQ,EAAEZ,CAAC,CAAC,CAAC,EAAGc,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGF,EAAEL,CAAC,CAAC,CAAC,EAChT,OAAOM,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAAI,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAAIC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAC3G,CACA,SAASgD,GAAE/D,EAAG,CACZ,GAAIA,GAAKA,EAAE,OAAS,WAAaA,EAAE,UAAY,QAAS,CACtD,MAAM,EAAIA,EAAE,QACZ,GAAI,EACF,OAAOgE,GAAE,CAAC,CACd,CACF,CACA,SAASA,GAAEhE,EAAG,CACZ,GAAIA,EAAG,CACL,GAAI,SAAUA,GAAK,OAAOA,EAAE,MAAQ,UAAYA,EAAE,KAChD,OAAO2D,GAAE3D,EAAE,IAAI,EACjB,GAAI,UAAWA,GAAK,OAAOA,EAAE,OAAS,SAAU,CAC9C,MAAM,EAAI4D,GAAE5D,EAAE,KAAK,GAAK,SAAUK,EAAI,SAAUL,GAAK,OAAOA,EAAE,MAAQ,SAAWA,EAAE,KAAO,EAC1F,MAAO,KAAOK,IAAM,EAAIyD,GAAE,EAAGzD,CAAC,EAAI,EACpC,CACA,GAAI,YAAaL,GAAK,OAAOA,EAAE,SAAW,SAAU,CAClD,MAAM,EAAI6D,GAAE7D,EAAE,OAAO,EACrB,GAAI,EAAG,MAAO,IAAM,CACtB,CACF,CACF,CACA,SAASiE,GAAEjE,EAAG,CACZ,GAAI,CAACA,GAAK,CAACA,EAAE,MAAO,OACpB,MAAM,EAAIgE,GAAEhE,EAAE,KAAK,GAAK,UACxB,MAAO,CAACA,EAAE,MAAO,CAAC,CACpB,CACA,SAASkE,GAAGlE,EAAG,CACb,MAAM,EAAI,CAAA,EACV,IAAIK,EAAI,GACR,GAAIL,EAAE,KAAM,CACV,MAAMQ,EAAIR,EAAE,KACZ,IAAKQ,EAAE,MAAQA,EAAE,MAAQA,EAAE,MAAQA,EAAE,UAAYH,EAAI,GAAI,EAAE,KAAO,GAAIG,EAAE,OAAS,EAAE,KAAK,KAAOA,EAAE,MAAOA,EAAE,OAAS,EAAE,KAAK,KAAOA,EAAE,MAAOA,EAAE,OAAS,EAAE,KAAK,KAAO,IAAKA,EAAE,SAAW,EAAE,KAAK,OAAS,KAAMA,EAAE,MAAO,CAClN,MAAMK,EAAImD,GAAExD,EAAE,KAAK,EACnBK,IAAMR,EAAI,GAAI,EAAE,MAAQQ,EAC1B,CACAL,EAAE,YAAcH,EAAI,GAAI,EAAE,UAAY,IAAKG,EAAE,SAAWH,EAAI,GAAI,EAAE,OAAS,GAC7E,CACA,MAAMJ,EAAI8D,GAAE/D,EAAE,IAAI,EAClB,GAAIC,IAAMI,EAAI,GAAI,EAAE,QAAUJ,GAAID,EAAE,UAAW,CAC7C,MAAMQ,EAAIR,EAAE,UACZQ,EAAE,aAAeH,EAAI,GAAI,EAAE,MAAQG,EAAE,YAAaA,EAAE,WAAaH,EAAI,GAAI,EAAE,OAASG,EAAE,UAAWA,EAAE,WAAaH,EAAI,GAAI,EAAE,SAAW,GACvI,CACA,GAAIL,EAAE,OAAQ,CACZ,MAAMQ,EAAI,CAAA,EACV,IAAIK,EAAI,GACR,MAAMC,EAAI,CAAC,MAAO,SAAU,OAAQ,OAAO,EAC3C,UAAW,KAAKA,EAAG,CACjB,MAAMC,EAAIkD,GAAEjE,EAAE,OAAO,CAAC,CAAC,EACvBe,IAAMP,EAAE,CAAC,EAAIO,EAAGF,EAAI,GACtB,CACAA,IAAMR,EAAI,GAAI,EAAE,OAASG,EAC3B,CACA,OAAOH,EAAI,EAAI,IACjB,CACA,SAAS8D,GAAGnE,EAAG,CACb,OAAO,KAAK,UAAUA,CAAC,CACzB,CACA,SAASoE,GAAGpE,EAAG,EAAGK,EAAG,CACnB,MAAMJ,EAAIiE,GAAGlE,CAAC,EACd,GAAI,CAACC,EAAG,MAAO,GACf,MAAMO,EAAI2D,GAAGlE,CAAC,EAAGY,EAAIR,EAAE,IAAIG,CAAC,EAC5B,GAAIK,IAAM,OAAQ,OAAOA,EACzB,MAAMC,EAAI,EAAE,OACZ,OAAO,EAAE,KAAKb,CAAC,EAAGI,EAAE,IAAIG,EAAGM,CAAC,EAAGA,CACjC,CACA,SAASuD,GAAGrE,EAAG,CACb,MAAM,EAAIA,EAAE,MACZ,GAAI,GAAK,KAAM,MAAO,GACtB,GAAI,OAAO,GAAK,SAAU,OAAO,EACjC,GAAI,OAAO,GAAK,SAAU,OAAO,OAAO,CAAC,EACzC,GAAI,OAAO,GAAK,UAAW,OAAO,EAAI,OAAS,QAC/C,GAAI,aAAa,KACf,OAAO,EAAE,mBAAkB,EAC7B,GAAI,OAAO,GAAK,UAAY,YAAa,EAAG,CAC1C,MAAMK,EAAI,EAAE,OACZ,OAAOA,GAAK,KAAO,OAAOA,CAAC,EAAI,EACjC,CACA,OAAO,OAAO,GAAK,UAAY,aAAc,EAAI,EAAE,SAAS,IAAK,GAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAI,OAAO,GAAK,UAAY,cAAe,EAAI,EAAE,MAAQ,GAAK,OAAO,GAAK,UAAY,UAAW,EAAI,OAAO,EAAE,KAAK,EAAI,OAAO,CAAC,CACvN,CACA,SAASiE,GAAGtE,EAAG,CACb,MAAM,EAAIA,EAAE,MAAM,GAAG,EAAGK,EAAIkE,GAAE,EAAE,CAAC,CAAC,EAAGtE,EAAI,EAAE,CAAC,EAAIsE,GAAE,EAAE,CAAC,CAAC,EAAIlE,EAC1D,MAAO,CACL,IAAKA,EAAE,IACP,KAAMA,EAAE,IACR,OAAQJ,EAAE,IACV,MAAOA,EAAE,GACb,CACA,CACA,SAASsE,GAAEvE,EAAG,CACZ,MAAM,EAAIA,EAAE,MAAM,iBAAiB,EACnC,GAAI,CAAC,EAAG,MAAO,CAAE,IAAK,EAAG,IAAK,CAAC,EAC/B,MAAMK,EAAI,EAAE,CAAC,EAAGJ,EAAI,SAAS,EAAE,CAAC,EAAG,EAAE,EACrC,IAAIO,EAAI,EACR,QAASK,EAAI,EAAGA,EAAIR,EAAE,OAAQQ,IAC5BL,EAAIA,EAAI,IAAMH,EAAE,WAAWQ,CAAC,EAAI,IAClC,MAAO,CAAE,IAAKZ,EAAG,IAAKO,CAAC,CACzB,CACA,SAASgE,GAAGxE,EAAG,CACb,MAAM,EAAI,CAAA,EACV,OAAOA,EAAE,UAAWK,GAAM,CACxB,MAAMJ,EAAI,CAAA,EAAIO,EAAoB,IAAI,IAAOK,EAAI,CAAA,EAAIC,EAAI,CAAA,EAAI,EAAI,CAAA,EAAIC,EAAIV,EAAE,YAC3E,QAASc,EAAI,EAAGA,GAAKJ,EAAGI,IAAK,CAC3B,MAAMF,EAAIZ,EAAE,UAAUc,CAAC,EACvBF,EAAE,QAAU,EAAE,OAAOE,EAAI,CAAC,CAAC,EAAI,CAAE,MAAO,KAAK,MAAMF,EAAE,MAAQ,GAAG,CAAC,EACnE,CACA,EAAE,IAAM,KAAK,IAAIF,EAAG,EAAE,EACtB,MAAMC,EAAoB,IAAI,IAAO,EAAIX,EAAE,MAAOa,GAAK,GAAK,KAAO,OAAS,EAAE,SAAW,CAAA,EACzF,UAAWC,KAAKD,EAAG,CACjBL,EAAE,KAAKM,CAAC,EACR,KAAM,CAAE,IAAKF,EAAG,KAAM8B,EAAG,OAAQC,EAAG,MAAOR,CAAC,EAAK8B,GAAGnD,CAAC,EAAGsB,EAAIO,EAAI/B,EAAGyB,EAAIF,EAAIO,EAC3E/B,EAAE,IAAI,GAAGC,EAAI,CAAC,IAAI8B,EAAI,CAAC,GAAI,CAACN,EAAGC,CAAC,CAAC,CACnC,CACArC,EAAE,QAAQ,CAAE,aAAc,EAAE,EAAI,CAACc,EAAGF,IAAM,CACxC,MAAM8B,EAAI9B,EAAI,EAAG+B,EAAI,CAAA,EACrB7B,EAAE,SAAS,CAAE,aAAc,EAAE,EAAI,CAACsB,EAAGC,IAAM,CACzC,MAAM,EAAIA,EAAI,EACd,GAAID,EAAE,UAAYA,EAAE,SAAWA,EAAG,OAClC,MAAMF,EAAI8B,GAAG5B,CAAC,EAAGS,EAAIkB,GAAG3B,EAAGxC,EAAGO,CAAC,EAAGsC,EAAI,CAAE,KAAMP,CAAC,EAC/CW,IAAM,KAAOJ,EAAE,MAAQI,GACvB,MAAMD,EAAI,GAAGF,CAAC,IAAI,CAAC,GACnB/B,EAAE,IAAIiC,CAAC,IAAMH,EAAE,MAAQ9B,EAAE,IAAIiC,CAAC,GAAID,EAAE,OAAO,CAAC,CAAC,EAAIF,CACnD,CAAC,EACD,MAAMN,EAAI,CAAE,MAAOQ,CAAC,EACpB7B,EAAE,SAAWqB,EAAE,OAAS,KAAK,MAAMrB,EAAE,OAAS,KAAK,GAAIL,EAAE,OAAOiC,CAAC,CAAC,EAAIP,CACxE,CAAC,EAAG,EAAE,KAAK,CACT,KAAMnC,EAAE,KACR,OAAQJ,EACR,OAAQY,EACR,KAAMC,EACN,KAAM,CACZ,CAAK,CACH,CAAC,EAAG,CACN,CACA,SAAS2D,GAAGzE,EAAG,EAAGK,EAAI,SAAU,CAC9B,MAAMJ,EAAID,EAAE,OAAS,EAAGa,EAAIZ,EAAI,CAAC,CAAE,KAAM,CAAE,KAAM,EAAE,CAAE,CAAE,EAAI,CAAA,EAAI,EAAI,CAAA,EACnE,GAAIA,EAAG,CACL,MAAMc,EAAI,CAAA,EACVf,EAAE,QAAQ,CAACgB,EAAGkB,IAAM,CAClBnB,EAAE,OAAOmB,CAAC,CAAC,EAAI,CAAE,KAAMlB,EAAG,MAAO,CAAC,CACpC,CAAC,EAAG,EAAE,CAAC,EAAI,CAAE,MAAOD,CAAC,CACvB,CACA,MAAMkB,EAAIhC,EAAI,EAAI,EAClB,OAAO,EAAE,QAAQ,CAACc,EAAGC,IAAM,CACzB,MAAMkB,EAAI,CAAA,EACVnB,EAAE,QAAQ,CAACG,EAAGC,IAAM,CAClBD,IAAM,QAAUA,IAAM,KAAOgB,EAAE,OAAOf,CAAC,CAAC,EAAI,CAAE,KAAMD,CAAC,EACvD,CAAC,EAAG,EAAE,OAAOF,EAAIiB,CAAC,CAAC,EAAI,CAAE,MAAOC,CAAC,CACnC,CAAC,EAAG,CAAC,CAAE,KAAM7B,EAAG,OAAQQ,EAAG,KAAM,EAAG,CACtC,CAWA,MAAM6D,GAAK,CAET,kBAAmB,KACnB,eAAgB,KAChB,iBAAkB,MAClB,uBAAwB,OACxB,6BAA8B,sBAE9B,kBAAmB,KACnB,mBAAoB,KACpB,sBAAuB,OACvB,uBAAwB,OACxB,gBAAiB,KACjB,wBAAyB,OACzB,wBAAyB,OACzB,cAAe,KACf,oBAAqB,MACrB,oBAAqB,MACrB,qBAAsB,OACtB,uBAAwB,OACxB,kBAAmB,OACnB,mBAAoB,MACpB,iBAAkB,KAClB,kBAAmB,KAEnB,oBAAqB,SAErB,kBAAmB,aAEnB,oBAAqB,cAErB,eAAgB,gBAChB,mBAAoB,aACpB,oBAAqB,eACrB,iBAAkB,cAElB,eAAgB,cAChB,mBAAoB,WACpB,oBAAqB,aACrB,iBAAkB,YAClB,sBAAuB,iBACvB,gBAAiB,cACjB,eAAgB,kBAEhB,mBAAoB,iBACpB,yBAA0B,SAC1B,iBAAkB,UAElB,mBAAoB,cAEpB,mBAAoB,4BAEpB,gBAAiB,WACjB,oBAAqB,SACrB,+BAAgC,kBAEhC,kBAAmB,KACnB,mBAAoB,KACpB,wBAAyB,UACzB,yBAA0B,UAC1B,kBAAmB,KACnB,oBAAqB,OACrB,qBAAsB,OACtB,sBAAuB,OACvB,sBAAuB,OACvB,oBAAqB,KAErB,uBAAwB,kBACxB,qBAAsB,OACtB,kBAAmB,MAEnB,mBAAoB,cACpB,aAAc,QACd,YAAa,OAEb,cAAe,cACf,kBAAmB,aACnB,mBAAoB,WAEpB,kBAAmB,aAEnB,uBAAwB,WACxB,wBAAyB,SACzB,iBAAkB,QAClB,gBAAiB,OACjB,sBAAuB,KACvB,uBAAwB,MACxB,sBAAuB,KACvB,uBAAwB,KACxB,mBAAoB,KACpB,uBAAwB,KACxB,uBAAwB,KACxB,uBAAwB,MACxB,wBAAyB,KAEzB,kBAAmB,aACnB,mBAAoB,WAEpB,mBAAoB,UACtB,EAAGC,GAAK,CAEN,kBAAmB,WACnB,eAAgB,QAChB,iBAAkB,UAClB,uBAAwB,gBACxB,6BAA8B,oDAE9B,kBAAmB,UACnB,mBAAoB,WACpB,sBAAuB,cACvB,uBAAwB,eACxB,gBAAiB,QACjB,wBAAyB,gBACzB,wBAAyB,gBACzB,cAAe,oBACf,oBAAqB,gBACrB,oBAAqB,YACrB,qBAAsB,aACtB,uBAAwB,eACxB,kBAAmB,YACnB,mBAAoB,UACpB,iBAAkB,SAClB,kBAAmB,UAEnB,oBAAqB,uBAErB,kBAAmB,qBAEnB,oBAAqB,gCAErB,eAAgB,mBAChB,mBAAoB,uBACpB,oBAAqB,6BACrB,iBAAkB,uBAElB,eAAgB,iBAChB,mBAAoB,qBACpB,oBAAqB,2BACrB,iBAAkB,qBAClB,sBAAuB,0CACvB,gBAAiB,8BACjB,eAAgB,yDAEhB,mBAAoB,kCACpB,yBAA0B,0BAC1B,iBAAkB,oBAElB,mBAAoB,sBAEpB,mBAAoB,gEAEpB,gBAAiB,mBACjB,oBAAqB,uBACrB,+BAAgC,gCAEhC,kBAAmB,OACnB,mBAAoB,QACpB,wBAAyB,qBACzB,yBAA0B,kBAC1B,kBAAmB,OACnB,oBAAqB,SACrB,qBAAsB,cACtB,sBAAuB,eACvB,sBAAuB,oBACvB,oBAAqB,SAErB,uBAAwB,0BACxB,qBAAsB,YACtB,kBAAmB,SAEnB,mBAAoB,sBACpB,aAAc,QACd,YAAa,OAEb,cAAe,iBACf,kBAAmB,qBACnB,mBAAoB,sBAEpB,kBAAmB,qBAEnB,uBAAwB,0BACxB,wBAAyB,2BACzB,iBAAkB,QAClB,gBAAiB,OACjB,sBAAuB,QACvB,uBAAwB,SACxB,sBAAuB,QACvB,uBAAwB,SACxB,mBAAoB,KACpB,uBAAwB,SACxB,uBAAwB,SACxB,uBAAwB,SACxB,wBAAyB,UAEzB,kBAAmB,qBACnB,mBAAoB,sBAEpB,mBAAoB,0BACtB,EAAGC,GAAI,CACL,QAASF,GACT,QAASC,EACX,EAAGE,GAAK,aACR,SAASC,GAAG9E,EAAG,EAAG,CAChB,OAAO,EAAIA,EAAE,QAAQ6E,GAAI,CAACxE,EAAGJ,IAAM,CACjC,MAAMO,EAAI,EAAEP,CAAC,EACb,OAAOO,IAAM,OAAS,IAAIP,CAAC,IAAM,OAAOO,CAAC,CAC3C,CAAC,EAAIR,CACP,CACA,SAAS+E,GAAG/E,EAAG,CACb,IAAIc,EACJ,MAAMX,EAAIH,EAAE,gBAAkB,QAASK,EAAIuE,GAAE5E,EAAE,MAAM,GAAK4E,GAAEzE,CAAC,GAAKyE,GAAE,OAAO,EAAG3E,GAAKa,EAAId,EAAE,WAAa,KAAO,OAASc,EAAEd,EAAE,MAAM,EAAGQ,EAAIP,EAAI,CAAE,GAAGI,EAAG,GAAGJ,CAAC,EAAKI,EAAGQ,EAAI+D,GAAE,OAAO,EAC5K,MAAO,CAAC,EAAG7D,IAAM,CACf,MAAMC,EAAIR,EAAE,CAAC,GAAKK,EAAE,CAAC,GAAK,EAC1B,OAAOiE,GAAG9D,EAAGD,CAAC,CAChB,CACF,CCxnCA,MAAMiE,GAAgBC,EAAAA,cAAyC,IAAI,EAUtDC,GAAgD,CAAC,CAC5D,OAAAC,EAAS,QACT,SAAAC,EACA,SAAAC,CACF,IAAM,CACJ,MAAMC,EAAQC,EAAAA,QAA4B,IAAM,CAC9C,MAAMpF,EAAIqF,GAAiB,CAAE,OAAAL,EAAQ,SAAAC,EAAU,EAC/C,MAAO,CAAE,OAAAD,EAAQ,EAAAhF,CAAA,CACnB,EAAG,CAACgF,EAAQC,CAAQ,CAAC,EAErB,OAAOK,EAAAA,IAACT,GAAc,SAAd,CAAuB,MAAAM,EAAe,SAAAD,CAAA,CAAS,CACzD,EAMA,IAAIK,GAAwC,KAC5C,SAASC,IAAoC,CAC3C,OAAKD,KACHA,GAAqBF,GAAiB,CAAE,OAAQ,OAAA,CAAS,GAEpDE,EACT,CAOO,SAASE,GAA4B,CAC1C,MAAMC,EAAMC,EAAAA,WAAWd,EAAa,EACpC,OAAOa,GAAA,YAAAA,EAAK,IAAKF,GAAA,CACnB,CAKO,SAASI,IAAoB,CAClC,MAAMF,EAAMC,EAAAA,WAAWd,EAAa,EACpC,OAAOa,GAAA,YAAAA,EAAK,SAAU,OACxB,CC3DA,MAAMG,GAAef,EAAAA,cAAoC,IAAI,EAOhDgB,GAA8C,CAAC,CAAE,MAAAC,EAAO,SAAAb,WAC3DW,GAAa,SAAb,CAAsB,MAAOE,EAAQ,SAAAb,EAAS,EAWjD,SAASc,IAAkC,CAChD,OAAOL,EAAAA,WAAWE,EAAY,GAAK,MACrC,CCrBA,MAAMI,GAAqD,CAAC,CAAE,UAAAC,CAAA,IAC5DZ,EAAAA,IAAC,MAAA,CACC,MAAM,6BACN,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,UAAAY,EAEA,eAAC,OAAA,CAAK,EAAE,KAAK,EAAE,OAAO,WAAW,SAAS,SAAS,KAAK,WAAW,OAAO,KAAK,eAAe,OAAO,OAAO,SAAA,KAAA,CAE5G,CAAA,CACF,EAeK,SAASC,GAAsBT,EAA0C,CAC9E,MAAO,CACL,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOU,EAAAA,QAAA,CAAQ,UAAU,kBAAkB,EAAI,QAASV,EAAI,EAAE,kBAAkB,EAAG,OAAQA,EAAI,UAAW,SAAUA,EAAI,MAAQ,GAAA,EAClJ,CAAE,KAAM,OAAQ,QAAS,GAAG,KAAK,MAAMA,EAAI,KAAO,GAAG,CAAC,IAAK,SAAU,MAAA,EACrE,CAAE,KAAM,SAAU,WAAOW,EAAAA,OAAA,CAAO,UAAU,kBAAkB,EAAI,QAASX,EAAI,EAAE,iBAAiB,EAAG,OAAQA,EAAI,SAAU,SAAUA,EAAI,MAAQ,EAAA,CAAG,CACpJ,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACgB,EAAAA,MAAK,UAAU,iBAAA,CAAkB,EAAI,QAASZ,EAAI,EAAE,uBAAuB,EAAG,OAAQA,EAAI,YAAA,EACnH,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACW,IAAiB,UAAU,iBAAA,CAAkB,EAAI,QAASP,EAAI,EAAE,uBAAuB,EAAG,OAAQA,EAAI,cAAA,CAAe,CAChJ,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACiB,EAAAA,WAAU,UAAU,iBAAA,CAAkB,EAAI,QAASb,EAAI,EAAE,qBAAqB,EAAG,OAAQA,EAAI,YAAA,EACtH,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACkB,EAAAA,UAAS,UAAU,iBAAA,CAAkB,EAAI,QAASd,EAAI,EAAE,sBAAsB,EAAG,OAAQA,EAAI,aAAA,CAAc,CACtI,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACmB,EAAAA,WAAU,UAAU,iBAAA,CAAkB,EAAI,QAASf,EAAI,EAAE,eAAe,EAAG,OAAQA,EAAI,OAAA,CAAQ,CAC1H,CACF,CAEJ,CCjDO,SAASgB,GAAoBhB,EAAwC,CAC1E,MAAO,CACL,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOU,EAAAA,QAAA,CAAQ,UAAU,kBAAkB,EAAI,QAASV,EAAI,EAAE,kBAAkB,EAAG,OAAQA,EAAI,UAAW,SAAUA,EAAI,MAAQ,GAAA,EAClJ,CAAE,KAAM,OAAQ,QAAS,GAAG,KAAK,MAAMA,EAAI,KAAO,GAAG,CAAC,IAAK,SAAU,MAAA,EACrE,CAAE,KAAM,SAAU,WAAOW,EAAAA,OAAA,CAAO,UAAU,kBAAkB,EAAI,QAASX,EAAI,EAAE,iBAAiB,EAAG,OAAQA,EAAI,SAAU,SAAUA,EAAI,MAAQ,EAAA,CAAG,CACpJ,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,KAAMJ,EAAAA,IAACmB,EAAAA,WAAU,UAAU,iBAAA,CAAkB,EAAI,QAASf,EAAI,EAAE,eAAe,EAAG,OAAQA,EAAI,OAAA,CAAQ,CAC1H,CACF,CAEJ,CCbO,SAASiB,GAAqBjB,EAAyC,CAC5E,MAAO,CACL,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOkB,EAAAA,KAAA,CAAK,UAAU,kBAAkB,EAAI,QAASlB,EAAI,EAAE,aAAa,EAAG,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,YAAU,CAAE,CAC9I,EAEF,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAOC,EAAAA,YAAA,CAAY,UAAU,kBAAkB,EAAI,QAASpB,EAAI,EAAE,mBAAmB,EAAG,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,EACtJ,CAAE,KAAM,OAAQ,QAAS,GAAGnB,EAAI,OAAO,MAAMA,EAAI,KAAK,GAAI,SAAU,MAAA,EACpE,CAAE,KAAM,SAAU,WAAOqB,EAAAA,aAAA,CAAa,UAAU,kBAAkB,EAAI,QAASrB,EAAI,EAAE,mBAAmB,EAAG,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,CAAE,CAC3J,EAEF,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMnB,EAAI,UAAYJ,EAAAA,IAAC0B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EAAK1B,EAAAA,IAAC2B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EACzG,QAASvB,EAAI,UAAYA,EAAI,EAAE,sBAAsB,EAAIA,EAAI,EAAE,oBAAoB,EACnF,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,kBAAgB,CACrD,CACF,CACF,CAEJ,CCzBO,SAASK,GAAqBxB,EAAyC,CAC5E,MAAO,CACL,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMJ,EAAAA,IAACsB,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,EACxC,QAASlB,EAAI,EAAE,aAAa,EAC5B,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,YAAU,CAC/C,CACF,EAEF,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMvB,EAAAA,IAACwB,EAAAA,YAAA,CAAY,UAAU,iBAAA,CAAkB,EAC/C,QAASpB,EAAI,EAAE,mBAAmB,EAClC,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,EAE9C,CACE,KAAM,OACN,QAAS,GAAGnB,EAAI,OAAO,MAAMA,EAAI,KAAK,GACtC,SAAU,MAAA,EAEZ,CACE,KAAM,SACN,KAAMJ,EAAAA,IAACyB,EAAAA,aAAA,CAAa,UAAU,iBAAA,CAAkB,EAChD,QAASrB,EAAI,EAAE,mBAAmB,EAClC,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,WAAS,CAC9C,CACF,EAEF,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMnB,EAAI,UACNJ,EAAAA,IAAC0B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EACvC1B,EAAAA,IAAC2B,EAAAA,UAAA,CAAU,UAAU,iBAAA,CAAkB,EAC3C,QAASvB,EAAI,UAAYA,EAAI,EAAE,sBAAsB,EAAIA,EAAI,EAAE,oBAAoB,EACnF,OAAQ,IAAA,OAAM,OAAAmB,EAAAnB,EAAI,QAAQ,UAAZ,YAAAmB,EAAqB,kBAAgB,CACrD,CACF,CACF,CAEJ,CC7CO,SAASM,GAAoB,CAAE,MAAAC,GAA4C,CAChF,OAAKA,EACE,CACL,CACE,MAAO,CACL,CACE,KAAM,OACN,QAAS,GAAGA,EAAM,KAAK,YAAYA,EAAM,IAAI,WAAWC,GAAeD,EAAM,IAAI,CAAC,GAClF,SAAU,OAAA,CACZ,CACF,CACF,EAViB,CAAA,CAYrB,CCfO,SAASE,GAAqB5B,EAAyC,CAC5E,MAAM6B,EAAyB,CAC7B,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMjC,EAAAA,IAACkC,EAAAA,SAAA,CAAS,UAAU,iBAAA,CAAkB,EAC5C,QAAS9B,EAAI,SAAWA,EAAI,EAAE,kBAAkB,EAAIA,EAAI,EAAE,iBAAiB,EAC3E,OAAQA,EAAI,YAAA,CACd,CACF,CACF,EAGF,OAAIA,EAAI,QACN6B,EAAO,KAAK,CACV,MAAO,CACL,CACE,KAAM,SACN,KAAM7B,EAAI,YACNJ,EAAAA,IAACmC,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,EAClCnC,EAAAA,IAACoC,EAAAA,IAAA,CAAI,UAAU,iBAAA,CAAkB,EACrC,QAAShC,EAAI,YAAcA,EAAI,EAAE,gBAAgB,EAAIA,EAAI,EAAE,iBAAiB,EAC5E,OAAQA,EAAI,mBAAA,CACd,CACF,CACD,EAGI6B,CACT,CCjCO,SAASI,GAAyBjC,EAA6C,CACpF,MAAO,CACL,CACE,MAAO,CACL,CACE,KAAM,SACN,KAAMA,EAAI,WAAa,UACnBJ,EAAAA,IAACmC,EAAAA,KAAA,CAAK,UAAU,iBAAA,CAAkB,EAClCnC,EAAAA,IAACoC,EAAAA,IAAA,CAAI,UAAU,iBAAA,CAAkB,EACrC,QAAShC,EAAI,WAAa,UAAYA,EAAI,EAAE,gBAAgB,EAAIA,EAAI,EAAE,iBAAiB,EACvF,OAAQA,EAAI,gBAAA,CACd,CACF,CACF,CAEJ,CCVA,MAAMkC,GAAoC,CACxC,QAAS,CAACC,EAAKC,IAAS,MAAMD,EAAKC,CAAI,CACzC,EAEMC,GAAiBjD,EAAAA,cAAmC8C,EAAY,EASzDI,GAAkD,CAAC,CAC9D,YAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,SAAAjD,CACF,IAAM,CACJ,MAAMC,EAAQC,EAAAA,QACZ,KAAO,CACL,QAASgD,GAAc,CAAE,YAAAH,EAAa,eAAAC,EAAgB,EACtD,kBAAAC,CAAA,GAEF,CAACF,EAAaC,EAAgBC,CAAiB,CAAA,EAEjD,OACE7C,EAAAA,IAACyC,GAAe,SAAf,CAAwB,MAAA5C,EAAe,SAAAD,CAAA,CAAS,CAErD,EAMO,SAASmD,IAAsB,CACpC,OAAO1C,EAAAA,WAAWoC,EAAc,EAAE,OACpC,CASO,SAASO,GAAeC,EAAuC,CACpE,KAAM,CAAE,QAAAC,EAAS,kBAAAL,GAAsBxC,EAAAA,WAAWoC,EAAc,EAC1DU,EAAW,CAAC,EAAEF,IAAQJ,GAAA,MAAAA,EAAoBI,KAC1C,CAACG,EAAUC,CAAW,EAAIC,EAAAA,SAAiB,IAC9CL,EAAYE,EAAW,GAAKF,EAAK,IAA1B,EAA0B,EAE9BM,EAAaC,EAAAA,OAAsB,IAAI,EAE7CC,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACR,EAAM,CACTI,EAAY,EAAE,EACd,MACF,CACA,GAAI,CAACF,EAAU,CACbE,EAAYJ,EAAK,GAAG,EACpB,MACF,CACA,IAAIS,EAAY,GAChB,OAAAL,EAAY,EAAE,EACdM,GAAeV,EAAK,IAAKC,CAAO,EAC7B,KAAMU,GAAY,CACjB,GAAIF,EAAW,CACb,IAAI,gBAAgBE,CAAO,EAC3B,MACF,CACIL,EAAW,SACb,IAAI,gBAAgBA,EAAW,OAAO,EAExCA,EAAW,QAAUK,EACrBP,EAAYO,CAAO,CACrB,CAAC,EACA,MAAOC,GAAQ,CACTH,IACH,QAAQ,MAAM,0CAA2CG,CAAG,EAC5DR,EAAYJ,EAAK,GAAG,EAExB,CAAC,EACI,IAAM,CACXS,EAAY,EACd,CACF,EAAG,CAACT,GAAA,YAAAA,EAAM,GAAIA,GAAA,YAAAA,EAAM,IAAKE,EAAUD,CAAO,CAAC,EAG3CO,EAAAA,UAAU,IACD,IAAM,CACPF,EAAW,UACb,IAAI,gBAAgBA,EAAW,OAAO,EACtCA,EAAW,QAAU,KAEzB,EACC,CAAA,CAAE,EAEEH,CACT,CC1FO,MAAMU,GAAgDC,EAAAA,KAAK,IAChE,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAAkB,KAAM1G,IAAO,CAAE,QAASA,EAAE,eAAgB,CAC9D,EAEa2G,GAA4CF,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAAG,EAAA,EAAgB,KAAM5G,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEa6G,GAA8CJ,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAK,EAAA,EAAiB,KAAM9G,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEa+G,GAA8CN,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAO,EAAA,EAAiB,KAAMhH,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEaiH,GAA8CR,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAS,EAAA,EAAiB,KAAMlH,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEamH,GAA4CV,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAAW,EAAA,EAAgB,KAAMpH,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEaqH,GAA8CZ,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAa,EAAA,EAAiB,KAAMtH,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEauH,GAA8Cd,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAe,EAAA,EAAiB,KAAMxH,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEayH,GAAgDhB,EAAAA,KAAK,IAChE,QAAA,QAAA,EAAA,KAAA,IAAAiB,EAAA,EAAkB,KAAM1H,IAAO,CAAE,QAASA,EAAE,eAAgB,CAC9D,EAEa2H,GAAgDlB,EAAAA,KAAK,IAChE,QAAA,QAAA,EAAA,KAAA,IAAAmB,EAAA,EAAkB,KAAM5H,IAAO,CAAE,QAASA,EAAE,eAAgB,CAC9D,EAEa6H,GAAsDpB,EAAAA,KAAK,IACtE,QAAA,QAAA,EAAA,KAAA,IAAAqB,EAAA,EAAqB,KAAM9H,IAAO,CAAE,QAASA,EAAE,kBAAmB,CACpE,EAEa+H,GAA8CtB,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAuB,EAAA,EAAiB,KAAMhI,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,EAEaiI,GAA4CxB,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAAyB,EAAA,EAAgB,KAAMlI,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEamI,GAA4C1B,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAA2B,EAAA,EAAgB,KAAMpI,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEaqI,GAAsD5B,EAAAA,KAAK,IACtE,QAAA,QAAA,EAAA,KAAA,IAAA6B,EAAA,EAAqB,KAAMtI,IAAO,CAAE,QAASA,EAAE,kBAAmB,CACpE,EAEauI,GAA4C9B,EAAAA,KAAK,IAC5D,QAAA,QAAA,EAAA,KAAA,IAAA+B,EAAA,EAAgB,KAAMxI,IAAO,CAAE,QAASA,EAAE,aAAc,CAC1D,EAEayI,GAA8ChC,EAAAA,KAAK,IAC9D,QAAA,QAAA,EAAA,KAAA,IAAAiC,EAAA,EAAiB,KAAM1I,IAAO,CAAE,QAASA,EAAE,cAAe,CAC5D,ECjFa2I,GAA0D,CAAC,CACtE,SAAAC,EACA,SAAAC,EACA,WAAAC,CACF,IAAM,CACJ,MAAM1L,EAAIyF,EAAA,EACV,OACEkG,EAAAA,KAAC,MAAA,CAAI,UAAU,oGACb,SAAA,CAAArG,EAAAA,IAAC,OAAI,UAAU,mGACb,eAACsG,EAAAA,aAAA,CAAa,UAAU,0CAA0C,CAAA,CACpE,EAEAD,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAArG,EAAAA,IAAC,IAAA,CAAE,UAAU,uCAAwC,SAAAkG,EAAS,EAC9DlG,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAtF,EAAE,6BAA8B,CAAE,KAAMyL,CAAA,CAAU,CAAA,CAAE,CAAA,EAC5F,EAEAE,EAAAA,KAAC,SAAA,CACC,QAASD,EACT,UAAU,2LAEV,SAAA,CAAApG,EAAAA,IAACuG,EAAAA,SAAA,CAAS,UAAU,iBAAA,CAAkB,EACrC7L,EAAE,iBAAiB,CAAA,CAAA,CAAA,CACtB,EACF,CAEJ,EChCa8L,GAA4B,IAAM,CAC7C,MAAM9L,EAAIyF,EAAA,EACV,aACG,MAAA,CAAI,UAAU,uFACb,SAAAkG,EAAAA,KAAC,MAAA,CAAI,UAAU,mDACb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,6GAAA,CAA8G,QAC5H,OAAA,CAAK,UAAU,cAAe,SAAAtF,EAAE,gBAAgB,GAAK,YAAA,CAAa,CAAA,CAAA,CACrE,CAAA,CACF,CAEJ,ECiCM+L,GAAwB,EAoCjBC,GAAyDC,GAAU,CAC9E,KAAM,CAAE,YAAAhE,EAAa,eAAAC,EAAgB,kBAAAC,CAAA,EAAsB8D,EAC3D,OACE3G,EAAAA,IAAC0C,GAAA,CACC,YAAAC,EACA,eAAAC,EACA,kBAAAC,EAEA,SAAA7C,EAAAA,IAAC4G,GAAA,CAAyB,GAAGD,CAAA,CAAO,CAAA,CAAA,CAG1C,EAEMC,GAA6D,CAAC,CAClE,MAAAC,EACA,aAAAC,EACA,WAAAC,EACA,gBAAAC,EAAkB,CAAA,EAClB,KAAAC,EAAO,QACP,QAAAC,EACA,gBAAAC,EAAkB,EAClB,OAAAzH,EAAS,QACT,SAAU0H,EACV,SAAAC,EAAW,GACX,MAAA5G,EAAQ,OACR,cAAA6G,EACA,WAAAlB,EAEA,YAAamB,EACb,eAAgBC,EAChB,kBAAmBC,CACrB,IAAM,CACJ,MAAM/M,EAAgBoF,EAAAA,QACpB,IAAMC,GAAiB,CAAE,OAAAL,EAAQ,SAAU0H,EAAc,EACzD,CAAC1H,EAAQ0H,CAAY,CAAA,EAGjB,CAACM,EAAYC,CAAa,EAAIrE,EAAAA,SAAS,IAC3C,OAAO,OAAW,IACd,OAAO,WAAW,8BAA8B,EAAE,QAClD,EAAA,EAGNG,EAAAA,UAAU,IAAM,CACd,GAAIhD,IAAU,OAAQ,OACtB,MAAMmH,EAAM,OAAO,WAAW,8BAA8B,EACtDC,EAAWtN,IAA2BoN,EAAcpN,GAAE,OAAO,EACnE,OAAAqN,EAAI,iBAAiB,SAAUC,CAAO,EAC/B,IAAMD,EAAI,oBAAoB,SAAUC,CAAO,CACxD,EAAG,CAACpH,CAAK,CAAC,EAEV,MAAMqH,EAAgBrH,IAAU,OAAUiH,EAAa,OAAS,QAAWjH,EAErE,CAACsH,EAAMC,CAAO,EAAI1E,EAAAA,SAAS,CAAC,EAC5B,CAAC2E,EAAUC,CAAW,EAAI5E,EAAAA,SAAS,CAAC,EACpC,CAAC6E,EAAaC,CAAc,EAAI9E,EAAAA,SAAS,CAAC,EAC1C,EAAG+E,CAAa,EAAI/E,EAAAA,SAAS,CAAC,EAC9B,CAACgF,EAAqBC,CAAsB,EAAIjF,EAAAA,SAAS,CAAC,EAC1D,CAACkF,EAAsBC,CAAuB,EAAInF,EAAAA,SAAS,CAAC,EAC5D,CAACoF,EAAeC,CAAgB,EAAIrF,EAAAA,SAAS,CAAC,EAC9CsF,EAAapF,EAAAA,OAAuB,IAAI,EACxCqF,EAAUrF,EAAAA,OAAuB,IAAI,EACrCsF,EAAUtF,EAAAA,OAA2B,IAAI,EACzC,CAACuF,EAAaC,CAAc,EAAI1F,EAAAA,SAAS,CAAC,EAC1C,CAAC2F,EAAWC,CAAY,EAAI5F,EAAAA,SAAS,CAAC,EACtC,CAAC6F,EAAeC,CAAgB,EAAI9F,EAAAA,SAAS,EAAK,EAClD+F,EAAU7F,EAAAA,OAA2B,IAAI,EACzC,CAAC8F,GAAaC,CAAc,EAAIjG,EAAAA,SAAS,CAAC,EAC1C,CAACkG,GAAWC,CAAY,EAAInG,EAAAA,SAAS,CAAC,EACtC,CAACoG,GAAeC,CAAgB,EAAIrG,EAAAA,SAAS,EAAK,EAClD,CAACsG,GAAUC,EAAW,EAAIvG,EAAAA,SAAiC,IAAI,EAC/D,CAACwG,GAAcC,EAAe,EAAIzG,EAAAA,SAAS,EAAI,EAC/C,CAAC0G,GAAiBC,EAAkB,EAAI3G,EAAAA,SAAS,EAAK,EACtD,CAAC4G,GAAkBC,EAAmB,EAAI7G,EAAAA,SAA+B,SAAS,EAGlF,CAAC8G,GAAYC,EAAa,EAAI/G,EAAAA,SAAS,EAAI,EAC3CgH,GAAkB9G,EAAAA,OAAsB,IAAI,EAC5C+G,GAAiB,IAEjBC,GAAgBC,EAAAA,YAAY,IAAM,CACtCJ,GAAc,EAAI,EACdC,GAAgB,SAClB,aAAaA,GAAgB,OAAO,EAEtCA,GAAgB,QAAU,OAAO,WAAW,IAAM,CAChDD,GAAc,EAAK,CACrB,EAAGE,EAAc,CACnB,EAAG,CAAA,CAAE,EAECG,GAAkBD,EAAAA,YAAY,IAAM,CACxCD,GAAA,CACF,EAAG,CAACA,EAAa,CAAC,EAGZG,GAAkB7K,EAAAA,QAAQ,IAAM8K,GAAe/D,CAAK,EAAG,CAACA,CAAK,CAAC,EAE9DgE,EAAcF,GAAgB7D,CAAY,EAG1CgE,GAAc9H,GAAe6H,CAAW,EAGxCE,GAAiBjL,EAAAA,QAAQ,IACxB+K,EACE7D,EAAgB,KAAKgE,GAAYA,EAAS,KAAKH,CAAW,CAAC,EADzC,KAExB,CAACA,EAAa7D,CAAe,CAAC,EAE3Bb,EAAW0E,EAAcI,GAAYJ,CAAW,EAAI,cAGpDK,GAAaT,EAAAA,YACjB,CAACU,EAAcC,IAAsB,CAC9BP,IACLvD,GAAA,MAAAA,EAAgB,CAAE,KAAA6D,EAAM,QAAAC,EAAS,KAAMP,IACzC,EACA,CAACA,EAAavD,CAAa,CAAA,EAIvB+D,GAAYvL,EAAAA,QAChB,KAAO,CACL,KAAMoL,GACN,EAAAxQ,EACA,MAAOoN,EACP,OAAApI,CAAA,GAEF,CAACwL,GAAYxQ,EAAGoN,EAAepI,CAAM,CAAA,EAIvC+D,EAAAA,UAAU,IAAM,CACduE,EAAQ,CAAC,EACTE,EAAY,CAAC,EACbE,EAAe,CAAC,EAChBC,EAAc,CAAC,EACfE,EAAuB,CAAC,EACxBE,EAAwB,CAAC,EACzB4B,GAAc,EAAI,EACdC,GAAgB,SAClB,aAAaA,GAAgB,OAAO,CAExC,EAAG,CAACxD,CAAY,CAAC,EAGjBrD,EAAAA,UAAU,IAAM,CACd,GAAI0C,IAAa,SAAWmC,EAAsB,GAAKE,EAAuB,GAAKI,EAAW,QAAS,CACrG,MAAM0C,EAAiB1C,EAAW,QAAQ,YACpC2C,EAAkB3C,EAAW,QAAQ,aACrC4C,GAASF,EAAiBhD,EAC1BmD,GAASF,EAAkB/C,EAC3BkD,GAAU,KAAK,IAAIF,GAAQC,EAAM,EACvCzD,EAAQ,KAAK,IAAI,IAAM,KAAK,IAAI,GAAI0D,EAAO,CAAC,CAAC,CAC/C,CACF,EAAG,CAACvF,EAAUmC,EAAqBE,CAAoB,CAAC,EAGxD/E,EAAAA,UAAU,KACJkH,GAAgB,OAAS,GAC3BH,GAAA,EAEK,IAAM,CACPF,GAAgB,SAClB,aAAaA,GAAgB,OAAO,CAExC,GACC,CAACK,GAAgB,OAAQH,EAAa,CAAC,EAK1C/G,EAAAA,UAAU,IAAM,CACd,MAAMkI,EAAiBpR,GAAqB,CACtCA,EAAE,MAAQ,UAAY0M,IAAS,QACjCC,GAAA,MAAAA,IACS3M,EAAE,MAAQ,aAAeuM,EAAe,EACjDC,GAAA,MAAAA,EAAaD,EAAe,GACnBvM,EAAE,MAAQ,cAAgBuM,EAAe6D,GAAgB,OAAS,IAC3E5D,GAAA,MAAAA,EAAaD,EAAe,GAEhC,EAEA,GAAIG,IAAS,QACX,cAAO,iBAAiB,UAAW0E,CAAa,EACzC,IAAM,OAAO,oBAAoB,UAAWA,CAAa,EAC3D,CACL,MAAMC,EAAK/C,EAAQ,QACnB,OAAK+C,GACLA,EAAG,iBAAiB,UAAWD,CAA8B,EACtD,IAAMC,EAAG,oBAAoB,UAAWD,CAA8B,GAFpE,MAGX,CACF,EAAG,CAAC1E,EAAMH,EAAc6D,GAAgB,OAAQzD,EAASH,CAAU,CAAC,EAEpE,MAAM8E,GAAepB,EAAAA,YAAY,IAAM,CACrCzC,EAAS8D,GAAS,KAAK,IAAIA,EAAO,GAAK,EAAE,CAAC,CAC5C,EAAG,CAAA,CAAE,EAECC,GAAgBtB,EAAAA,YAAY,IAAM,CACtCzC,EAAS8D,GAAS,KAAK,IAAIA,EAAO,GAAK,GAAI,CAAC,CAC9C,EAAG,CAAA,CAAE,EAECE,GAAevB,EAAAA,YAAY,IAAM,CACrCvC,EAAa4D,GAASA,EAAO,EAAE,CACjC,EAAG,CAAA,CAAE,EAECG,GAAmBxB,EAAAA,YAAY,IAAM,CACzCvC,EAAa4D,GAASA,EAAO,EAAE,CACjC,EAAG,CAAA,CAAE,EAECI,GAAmBzB,EAAAA,YAAY,IAAM,CACzC,GAAI7B,EAAW,SAAWN,EAAsB,GAAKE,EAAuB,EAAG,CAC7E,MAAM8C,EAAiB1C,EAAW,QAAQ,YACpC2C,EAAkB3C,EAAW,QAAQ,aACrC4C,GAASF,EAAiBhD,EAC1BmD,GAASF,EAAkB/C,EAC3BkD,GAAU,KAAK,IAAIF,GAAQC,EAAM,EACvCzD,EAAQ,KAAK,IAAI,IAAM,KAAK,IAAI,GAAI0D,EAAO,CAAC,CAAC,CAC/C,MACE1D,EAAQ,CAAC,EAEXE,EAAY,CAAC,EACbS,EAAiBlO,GAAKA,EAAI,CAAC,CAC7B,EAAG,CAAC6N,EAAqBE,CAAoB,CAAC,EAExC2D,GAAqB1B,EAAAA,YAAY,IAAM,CAC3CzC,EAAQ,CAAC,EACTE,EAAY,CAAC,EACbS,EAAiBlO,GAAKA,EAAI,CAAC,CAC7B,EAAG,CAAA,CAAE,EAEC2R,GAAmB3B,cAAaiB,GAAoB,CACxD1D,EAAQ0D,CAAO,CACjB,EAAG,CAAA,CAAE,EAECW,GAAc5B,EAAAA,YAAY,IAAM,CACpCzC,EAAQ,CAAC,EACTE,EAAY,CAAC,EACbS,EAAiBlO,GAAKA,EAAI,CAAC,CAC7B,EAAG,CAAA,CAAE,EAECyI,GAAUH,GAAA,EACVuJ,GAAiB7B,EAAAA,YAAY,SAAY,CAC7C,GAAKI,EACL,IAAIzE,EAAY,CACd,MAAMA,EAAWyE,CAAW,EAC5B,MACF,CACA,GAAI,CACF,MAAM0B,GAAwB1B,EAAY,IAAKA,EAAY,KAAM3H,EAAO,CAC1E,OAASW,EAAK,CACZ,QAAQ,MAAM,kCAAmCA,CAAG,CACtD,EACF,EAAG,CAACgH,EAAazE,EAAYlD,EAAO,CAAC,EAE/BsJ,GAA0B/B,EAAAA,YAAY,CAACgC,EAAiBC,IAAkB,CAC9E1D,EAAeyD,CAAO,EACtBvD,EAAawD,CAAK,CACpB,EAAG,CAAA,CAAE,EAECC,GAA0BlC,EAAAA,YAAY,CAACgC,EAAiBC,IAAkB,CAC9EnD,EAAekD,CAAO,EACtBhD,EAAaiD,CAAK,CACpB,EAAG,CAAA,CAAE,EAECE,GAAuBnC,cAAa3I,GAAkC,CAC1E+H,GAAY/H,CAAK,CACnB,EAAG,CAAA,CAAE,EAEL,GAAI,CAAC+I,EAAa,OAAO,KAEzB,MAAMgC,GAAkB5F,IAAS,SAAW,CAAC,CAACC,EAGxC4F,IAA8B,IAAM,SACxC,GAAI/B,GACF,QAAOxJ,EAAAwJ,GAAe,mBAAf,YAAAxJ,EAAA,KAAAwJ,GAAkCF,EAAaQ,MAAc,CAAA,EAEtE,GAAIlF,IAAa,QACf,OAAOtF,GAAsB,CAC3B,KAAAkH,EACA,SAAU8D,GACV,UAAWE,GACX,aAAcG,GACd,eAAgBC,GAChB,aAAcF,GACd,cAAeD,GACf,QAASK,GACT,EAAA3R,CAAA,CACD,EAEH,GAAIyL,IAAa,MACf,OAAO/E,GAAoB,CACzB,KAAA2G,EACA,SAAU8D,GACV,UAAWE,GACX,QAASM,GACT,EAAA3R,CAAA,CACD,EAEH,GAAIyL,IAAa,OACf,OAAO9E,GAAqB,CAC1B,QAAAyH,EACA,QAASC,EACT,MAAOE,EACP,UAAWE,EACX,EAAAzO,CAAA,CACD,EAEH,GAAIyL,IAAa,OACf,OAAOvE,GAAqB,CAC1B,QAAAyH,EACA,QAASC,GACT,MAAOE,GACP,UAAWE,GACX,EAAAhP,CAAA,CACD,EAEH,GAAIyL,IAAa,MACf,OAAOtE,GAAoB,CAAE,MAAO+H,EAAY,CAAC,EAEnD,GAAIzD,IAAa,OAAQ,CACvB,MAAM4G,KAAMC,EAAAnC,EAAY,KAAK,MAAM,GAAG,EAAE,IAAA,IAA5B,YAAAmC,EAAmC,gBAAiB,GAChE,OAAOhL,GAAqB,CAC1B,SAAU8H,GACV,aAAc,IAAMC,GAAgB+B,IAAQ,CAACA,EAAI,EACjD,OAAQiB,KAAQ,QAAUA,KAAQ,MAClC,YAAa/C,GACb,oBAAqB,IAAMC,GAAmB6B,IAAQ,CAACA,EAAI,EAC3D,EAAApR,CAAA,CACD,CACH,CACA,OAAIyL,IAAa,WACR9D,GAAyB,CAC9B,SAAU6H,GACV,iBAAkB,IAAMC,OAA4B2B,KAAS,UAAY,SAAW,SAAS,EAC7F,EAAApR,CAAA,CACD,EAEI,CAAA,CACT,GAAA,EAGMuS,GAA+B,CACnC,CACE,MAAO,CACL,CAAE,KAAM,SAAU,WAAO1G,EAAAA,SAAA,CAAS,UAAU,iBAAA,CAAkB,EAAI,QAAS7L,EAAE,iBAAiB,EAAG,OAAQ4R,EAAA,CAAe,CAC1H,EAEF,GAAIO,GAAkB,CAAC,CACrB,MAAO,CACL,CAAE,KAAM,SAAmB,WAAOzO,EAAAA,EAAA,CAAE,UAAU,iBAAA,CAAkB,EAAI,QAAS1D,EAAE,cAAc,EAAG,OAAQwM,CAAA,CAAS,CACnH,CACD,EAAI,CAAA,CAAC,EAGFgG,GAAqB,CAACjL,EAAwBkL,IAClDlL,EAAO,IAAI,CAACmL,GAAOC,GAAIC,KACrBjH,EAAAA,KAACkH,EAAM,SAAN,CACE,SAAA,CAAAH,GAAM,MAAM,IAAI,CAACI,GAAMC,KACtBD,GAAK,OAAS,SACZxN,EAAAA,IAAC0N,GAAA,CAEC,KAAMF,GAAK,KACX,MAAOA,GAAK,QACZ,QAASA,GAAK,OACd,SAAUA,GAAK,QAAA,EAJV,GAAGH,EAAE,IAAII,EAAE,EAAA,EAOlBzN,EAAAA,IAAC,OAAA,CAEC,UAAU,oFACV,MAAO,CAAE,SAAUwN,GAAK,UAAY,MAAA,EAEnC,SAAAA,GAAK,OAAA,EAJD,GAAGH,EAAE,IAAII,EAAE,EAAA,CAKlB,EAGHJ,GAAKC,GAAI,OAAS,SAAM,MAAA,CAAI,UAAW,kCAAkCH,CAAY,EAAA,CAAI,CAAA,CAAA,EApBvEE,EAqBrB,CACD,EAEH,OACErN,EAAAA,IAACP,IAAe,OAAAC,EAAgB,SAAU0H,EAC1C,SAAApH,EAAAA,IAACQ,GAAA,CAAc,MAAOsH,EACtB,SAAAzB,EAAAA,KAAC,MAAA,CACC,IAAKwC,EACL,SAAU5B,IAAS,QAAU,EAAI,GACjC,aAAYa,EACZ,UAAU,gGAGT,SAAA,CAAA,CAACT,GACFhB,EAAAA,KAACsH,GAAAA,OAAO,IAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,EACpB,KAAM,CAAE,QAAS,CAAA,EACjB,UAAU,sGACV,MAAO,CAAE,WAAY,+BAAA,EAGrB,SAAA,CAAAtH,EAAAA,KAAC,MAAA,CAAI,UAAU,8FAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,wEACb,SAAA,CAAArG,EAAAA,IAAC,KAAA,CAAG,UAAU,8EACX,SAAA6K,EAAY,KACf,EACAxE,EAAAA,KAAC,OAAA,CAAK,UAAU,2DACb,SAAA,CAAAS,EAAe,EAAE,IAAE6D,GAAgB,MAAA,CAAA,CACtC,CAAA,EACF,QAGC,MAAA,CAAI,UAAU,sEACZ,SAAAuC,GAAmBD,GAAc,YAAY,EAChD,EAGA5G,EAAAA,KAAC,MAAA,CAAI,UAAU,sEACZ,SAAA,CAAA6G,GAAmBJ,GAAY,UAAU,EACzCA,GAAW,OAAS,GAAK9M,EAAAA,IAAC,MAAA,CAAI,UAAU,0CAA0C,EAClFkN,GAAmBD,GAAc,UAAU,CAAA,CAAA,CAC9C,CAAA,EACF,EAGCH,GAAW,OAAS,GACnB9M,EAAAA,IAAC,MAAA,CAAI,UAAU,2GACZ,SAAAkN,GAAmBJ,GAAY,YAAY,CAAA,CAC9C,CAAA,CAAA,CAAA,EAMJ9M,EAAAA,IAAC,MAAA,CACC,IAAK4I,EACL,UAAU,4EACV,YAAa8B,GAEZ,SAAAK,GACCA,GAAe,OAAOF,EAAaQ,EAAS,EAE5ChF,EAAAA,KAACuH,EAAAA,SAAA,CAAS,SAAU5N,EAAAA,IAACwG,GAAA,CAAA,CAAgB,EAClC,SAAA,CAAAL,IAAa,SACZnG,EAAAA,IAAC8D,GAAA,CACC,IAAKgH,GACL,KAAA/C,EACA,SAAAE,EACA,SAAUS,EACV,SAAUmC,EAAY,KACtB,aAAcuB,GACd,qBAAsB7D,EACtB,sBAAuBE,CAAA,CAAA,EAG1BtC,IAAa,OACZnG,EAAAA,IAACiE,GAAA,CACC,IAAK6G,GACL,KAAA/C,EACA,YAAAI,EACA,aAAcC,EACd,mBAAoBC,EACpB,kBAAmBE,CAAA,CAAA,EAGtBpC,IAAa,QAAUnG,EAAAA,IAACmE,GAAA,CAAa,IAAK2G,GAAa,EACvD3E,IAAa,QAAUnG,EAAAA,IAACqE,GAAA,CAAa,IAAKyG,GAAa,EACvD3E,IAAa,QAAUnG,EAAAA,IAACuE,GAAA,CAAa,IAAKuG,GAAa,EACvD3E,IAAa,OAASnG,EAAAA,IAACyE,GAAA,CAAY,IAAKqG,GAAa,EACrD3E,IAAa,QACZnG,EAAAA,IAAC2E,GAAA,CACC,IAAKmE,EACL,IAAKgC,GACL,gBAAiB0B,GACjB,kBAAmBpD,CAAA,CAAA,EAGtBjD,IAAa,QACZnG,EAAAA,IAAC6E,GAAA,CACC,IAAKwE,EACL,IAAKyB,GACL,gBAAiB6B,GACjB,kBAAmBhD,CAAA,CAAA,EAGtBxD,IAAa,SAAWnG,EAAAA,IAAC+E,GAAA,CAAc,IAAK+F,GAAa,EACzD3E,IAAa,SACZnG,EAAAA,IAACiF,GAAA,CAAc,IAAK6F,GAAa,SAAUD,EAAY,KAAM,EAE9D1E,IAAa,YAAcnG,EAAAA,IAACmF,IAAiB,IAAK2F,GAAa,SAAUZ,GAAkB,EAC3F/D,IAAa,QACZnG,EAAAA,IAACqF,GAAA,CAAa,IAAKyF,GAAa,SAAUD,EAAY,KAAM,EAE7D1E,IAAa,OACZnG,EAAAA,IAACuF,GAAA,CAAY,IAAKuF,GAAa,SAAUD,EAAY,KAAM,EAE5D1E,IAAa,OACZnG,EAAAA,IAACyF,GAAA,CAAY,IAAKqF,GAAa,SAAUD,EAAY,KAAM,EAE5D1E,IAAa,YACZnG,EAAAA,IAAC2F,GAAA,CAAiB,IAAKmF,GAAa,SAAUD,EAAY,KAAM,EAEjE1E,IAAa,QACZgB,GAAmBV,GACjBzG,EAAAA,IAACiG,GAAA,CACC,SAAU4E,EAAY,KACtB,SAAUA,EAAY,KACtB,WAAYyB,EAAA,CAAA,QAGbzG,GAAA,CAAY,IAAKiF,GAAa,cAAe8B,GAAsB,aAAczF,CAAA,CAAiB,GAGtGhB,IAAa,QACZnG,EAAAA,IAAC+F,GAAA,CACC,IAAK+E,GACL,SAAUD,EAAY,KACtB,SAAUf,GACV,YAAaE,EAAA,CAAA,EAGhB7D,IAAa,eACZnG,EAAAA,IAACiG,GAAA,CACC,SAAU4E,EAAY,KACtB,SAAUA,EAAY,KACtB,WAAYyB,EAAA,CAAA,CACd,CAAA,CAEJ,CAAA,CAAA,EAKH,CAACjF,GAAYsD,GAAgB,OAAS,GACrCtE,OAAAwH,EAAAA,SAAA,CACG,SAAA,CAAA/G,EAAe,GACd9G,EAAAA,IAAC2N,GAAAA,OAAO,OAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAASvD,GAAa,EAAI,EAAG,EAAGA,GAAa,EAAI,GAAA,EAC5D,WAAY,CAAE,SAAU,EAAA,EACxB,QAAS,IAAMrD,GAAA,YAAAA,EAAaD,EAAe,GAC3C,aAAc,IAAMuD,GAAc,EAAI,EACtC,MAAO,CAAE,cAAeD,GAAa,OAAS,MAAA,EAC9C,UAAU,qVAEV,SAAApK,EAAAA,IAACwB,EAAAA,YAAA,CAAY,UAAU,uCAAA,CAAwC,CAAA,CAAA,EAIlEsF,EAAe6D,GAAgB,OAAS,GACvC3K,EAAAA,IAAC2N,GAAAA,OAAO,OAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAASvD,GAAa,EAAI,EAAG,EAAGA,GAAa,EAAI,EAAA,EAC5D,WAAY,CAAE,SAAU,EAAA,EACxB,QAAS,IAAMrD,GAAA,YAAAA,EAAaD,EAAe,GAC3C,aAAc,IAAMuD,GAAc,EAAI,EACtC,MAAO,CAAE,cAAeD,GAAa,OAAS,MAAA,EAC9C,UAAU,uVAEV,SAAApK,EAAAA,IAACyB,EAAAA,aAAA,CAAa,UAAU,uCAAA,CAAwC,CAAA,CAAA,CAClE,CAAA,CAEJ,CAAA,CAAA,CAAA,EAGJ,CAAA,CACA,CAEJ,EAUMiM,GAA8C,CAAC,CAAE,KAAAI,EAAM,MAAAC,EAAO,QAAAC,EAAS,SAAAC,KAEzE5H,EAAAA,KAAC,SAAA,CACC,QAAA2H,EACA,SAAAC,EACA,UAAW,iGACTA,EACI,8CACA,oEACN,GAEC,SAAA,CAAAH,EACDzH,EAAAA,KAAC,OAAA,CAAK,UAAU,wUACd,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,UAAU,2GAAA,CAA4G,EAC5HA,EAAAA,IAAC,OAAA,CAAK,UAAU,eAAgB,SAAA+N,CAAA,CAAM,CAAA,CAAA,CACxC,CAAA,CAAA,CAAA,sHCjoBOG,GAAoD,CAAC,CAChE,MAAArH,EACA,aAAAC,EACA,OAAAqH,EACA,QAAAjH,EACA,WAAAH,EACA,gBAAAC,EAAkB,CAAA,EAClB,OAAAtH,EACA,SAAAC,EACA,SAAA0H,EACA,MAAA5G,EAAQ,OACR,cAAA6G,EACA,YAAA3E,EACA,eAAAC,EACA,kBAAAC,EACA,WAAAuD,CACF,IAAM,CACJ,KAAM,CAACsB,EAAYC,CAAa,EAAIrE,EAAAA,SAAS,IAC3C,OAAO,OAAW,IACd,OAAO,WAAW,8BAA8B,EAAE,QAClD,EAAA,EAGNG,EAAAA,UAAU,IAAM,CACd,GAAIhD,IAAU,OAAQ,OACtB,MAAMmH,EAAM,OAAO,WAAW,8BAA8B,EACtDC,EAAWtN,GAA2BoN,EAAcpN,EAAE,OAAO,EACnE,OAAAqN,EAAI,iBAAiB,SAAUC,CAAO,EAC/B,IAAMD,EAAI,oBAAoB,SAAUC,CAAO,CACxD,EAAG,CAACpH,CAAK,CAAC,EAEV,MAAMqH,EAAgBrH,IAAU,OAAUiH,EAAa,OAAS,QAAWjH,EAsB3E,GAnBAgD,EAAAA,UAAU,IAAM,CACd,GAAI0K,EAAQ,CACV,MAAMC,EAAmB,SAAS,KAAK,MAAM,SACvCC,EAAuB,SAAS,KAAK,MAAM,aAE3CC,EAAiB,OAAO,WAAa,SAAS,gBAAgB,YAEpE,gBAAS,KAAK,MAAM,SAAW,SAC3BA,EAAiB,IACnB,SAAS,KAAK,MAAM,aAAe,GAAGA,CAAc,MAG/C,IAAM,CACX,SAAS,KAAK,MAAM,SAAWF,EAC/B,SAAS,KAAK,MAAM,aAAeC,CACrC,CACF,CACF,EAAG,CAACF,CAAM,CAAC,EAEP,CAACA,EAAQ,OAAO,KAEpB,MAAMI,QACH,MAAA,CAAI,UAAU,WAAW,aAAYzG,EACpC,SAAA9H,EAAAA,IAACwO,GAAAA,gBAAA,CACE,SAAAL,GACCnO,EAAAA,IAAC2N,GAAAA,OAAO,IAAP,CACC,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,EACpB,KAAM,CAAE,QAAS,CAAA,EACjB,UAAU,kJACV,QAASzG,EACT,QAAU3M,GAAMA,EAAE,gBAAA,EAElB,SAAAyF,EAAAA,IAAC,MAAA,CACC,UAAU,qCACV,QAAUzF,GAAMA,EAAE,gBAAA,EAElB,SAAAyF,EAAAA,IAAC0G,GAAA,CACC,KAAK,QACL,MAAAG,EACA,aAAAC,EACA,QAAAI,EACA,WAAAH,EACA,gBAAAC,EACA,OAAAtH,EACA,SAAAC,EACA,SAAA0H,EACA,MAAA5G,EACA,cAAA6G,EACA,YAAA3E,EACA,eAAAC,EACA,kBAAAC,EACA,WAAAuD,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EAGN,CAAA,CACF,EAGF,OAAOqI,gBAAaF,EAAc,SAAS,IAAI,CACjD,EC9FaG,GAAoD,CAAC,CAChE,MAAA7H,EACA,aAAAC,EAAe,EACf,WAAAC,EACA,gBAAAC,EAAkB,CAAA,EAClB,MAAA2H,EAAQ,OACR,OAAAC,EAAS,OACT,UAAAhO,EACA,MAAAiO,EACA,OAAAnP,EACA,SAAAC,EACA,SAAA0H,EACA,MAAA5G,EAAQ,OACR,cAAA6G,EACA,YAAA3E,EACA,eAAAC,EACA,kBAAAC,EACA,WAAAuD,CACF,IAAM,CACJ,KAAM,CAACsB,EAAYC,CAAa,EAAIrE,EAAAA,SAAS,IAC3C,OAAO,OAAW,IACd,OAAO,WAAW,8BAA8B,EAAE,QAClD,EAAA,EAGNG,EAAAA,UAAU,IAAM,CACd,GAAIhD,IAAU,OAAQ,OACtB,MAAMmH,EAAM,OAAO,WAAW,8BAA8B,EACtDC,EAAWtN,GAA2BoN,EAAcpN,EAAE,OAAO,EACnE,OAAAqN,EAAI,iBAAiB,SAAUC,CAAO,EAC/B,IAAMD,EAAI,oBAAoB,SAAUC,CAAO,CACxD,EAAG,CAACpH,CAAK,CAAC,EAEV,MAAMqH,EAAgBrH,IAAU,OAAUiH,EAAa,OAAS,QAAWjH,EAE3E,OACET,EAAAA,IAAC,MAAA,CACC,UAAW,YAAYY,GAAa,EAAE,GACtC,MAAO,CAAE,MAAA+N,EAAO,OAAAC,EAAQ,GAAGC,CAAA,EAC3B,aAAY/G,EAEZ,SAAA9H,EAAAA,IAAC,MAAA,CAAI,UAAU,gFACb,SAAAA,EAAAA,IAAC0G,GAAA,CACC,KAAK,QACL,MAAAG,EACA,aAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,OAAAtH,EACA,SAAAC,EACA,SAAA0H,EACA,MAAA5G,EACA,cAAA6G,EACA,YAAA3E,EACA,eAAAC,EACA,kBAAAC,EACA,WAAAuD,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAGN,ECrDO,SAAS0I,GAAeC,EAA4B,CACzD,GAAI,OAAO,OAAW,IAAa,OAEnC,KAAM,CACJ,UAAAC,EAAY,gCAAgCC,SAAM,OAAO,4BACzD,QAAAC,EAAU,gCAAgCD,SAAM,OAAO,UACvD,WAAAE,EAAa,EAAA,EACXJ,GAAW,CAAA,EAEfE,SAAM,oBAAoB,UAAYD,EAEtCC,SAAM,oBAAoB,QAAUC,EAEpCD,SAAM,oBAAoB,WAAaE,CACzC,CAGAL,GAAA,ECtDO,MAAMM,GAAUC,GAAY,QCQtBvL,GAA8C,CAAC,CAC1D,IAAAvB,EACA,KAAAwF,EACA,SAAAE,EACA,SAAAqH,EACA,SAAAC,EACA,aAAAC,EACA,qBAAAC,EACA,sBAAAC,CACF,IAAM,CACJ,MAAMhV,EAAIyF,EAAA,EACJ,CAACwP,EAAQC,CAAS,EAAItM,EAAAA,SAAS,EAAK,EACpC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAACyM,EAAUC,CAAW,EAAI1M,EAAAA,SAAS,CAAE,EAAG,EAAG,EAAG,EAAG,EACjD,CAAC2M,EAAYC,CAAa,EAAI5M,EAAAA,SAAS,EAAK,EAC5C,CAAC6M,EAAWC,CAAY,EAAI9M,EAAAA,SAAS,CAAE,EAAG,EAAG,EAAG,EAAG,EACnD,CAAC+M,EAAcC,CAAe,EAAIhN,EAAAA,SAAS,CAAC,EAC5C,CAACiN,EAAaC,CAAc,EAAIlN,EAAAA,SAAS,CAAE,MAAO,EAAG,OAAQ,EAAG,EAChEmN,EAASjN,EAAAA,OAAyB,IAAI,EACtCkN,EAAelN,EAAAA,OAAuB,IAAI,EAEhDC,EAAAA,UAAU,IAAM,CACdmM,EAAU,EAAK,EACfE,EAAS,IAAI,EACbE,EAAY,CAAE,EAAG,EAAG,EAAG,EAAG,EAC1BM,EAAgB,CAAC,CACnB,EAAG,CAAC/N,CAAG,CAAC,EAGRkB,EAAAA,UAAU,IAAM,CACd6M,EAAgBvI,CAAI,CACtB,EAAG,CAACA,CAAI,CAAC,EAGTtE,EAAAA,UAAU,IAAM,CACV6L,IAAa,QACfU,EAAY,CAAE,EAAG,EAAG,EAAG,EAAG,CAE9B,EAAG,CAACV,CAAQ,CAAC,EAEb,MAAMqB,EAAcpW,GAA8C,CAChEqV,EAAU,EAAI,EACd,MAAMgB,EAAMrW,EAAE,cACdiW,EAAe,CAAE,MAAOI,EAAI,aAAc,OAAQA,EAAI,cAAe,EACrEnB,GAAA,MAAAA,EAAuBmB,EAAI,cAC3BlB,GAAA,MAAAA,EAAwBkB,EAAI,cAC9B,EAGMC,EAAgBpG,EAAAA,YAAY,CAACqG,EAA+BC,IAAwB,CACxF,MAAMC,EAAYN,EAAa,QAC/B,GAAI,CAACM,GAAaT,EAAY,QAAU,EAAG,OAAOO,EAElD,MAAMG,EAAaD,EAAU,YACvBE,EAAaF,EAAU,aACvBG,EAAOZ,EAAY,MAAQQ,EAC3BK,EAAOb,EAAY,OAASQ,EAG5BM,EAAS,KAAK,IAAI,GAAIJ,EAAa,IAAMC,EAAa,GAAI,EAC1DI,GAAUL,EAAaE,GAAQ,EAAIE,EACnCE,GAAUL,EAAaE,GAAQ,EAAIC,EAEzC,MAAO,CACL,EAAGC,EAAS,EAAI,KAAK,IAAI,CAACA,EAAQ,KAAK,IAAIA,EAAQR,EAAI,CAAC,CAAC,EAAI,EAC7D,EAAGS,EAAS,EAAI,KAAK,IAAI,CAACA,EAAQ,KAAK,IAAIA,EAAQT,EAAI,CAAC,CAAC,EAAI,CAAA,CAEjE,EAAG,CAACP,CAAW,CAAC,EAEViB,EAAc,IAAM,CACxB1B,EAASpV,EAAE,mBAAmB,CAAC,EAC/BkV,EAAU,EAAI,CAChB,EAGM6B,EAAoB,IAAM,CAC9BzB,EAAY,CAAE,EAAG,EAAG,EAAG,EAAG,EAC1BM,EAAgB,CAAC,EACjBd,GAAA,MAAAA,EAAe,EACjB,EAKA/L,EAAAA,UAAU,IAAM,CACd,MAAMuN,EAAYN,EAAa,QAC/B,GAAI,CAACM,EAAW,OAEhB,MAAMU,EAAqBnX,GAAkB,CAC3CA,EAAE,eAAA,EACFA,EAAE,gBAAA,EAEF,MAAMoX,EAAOX,EAAU,sBAAA,EACjBY,EAASrX,EAAE,QAAUoX,EAAK,KAAOA,EAAK,MAAQ,EAC9CE,EAAStX,EAAE,QAAUoX,EAAK,IAAMA,EAAK,OAAS,EAE9CG,EAAQvX,EAAE,OAAS,EAAI,KAAQ,IAErC+V,EAAgBxE,GAAQ,CACtB,MAAMJ,EAAU,KAAK,IAAI,IAAM,KAAK,IAAI,GAAII,EAAOgG,CAAK,CAAC,EACnDC,EAAQrG,EAAUI,EAExB,OAAAkE,KAAmBa,EAAc,CAC/B,EAAGe,EAASG,GAASH,EAASd,EAAI,GAClC,EAAGe,EAASE,GAASF,EAASf,EAAI,EAAA,EACjCpF,CAAO,CAAC,EAEX8D,GAAA,MAAAA,EAAe9D,GACRA,CACT,CAAC,CACH,EAEA,OAAAsF,EAAU,iBAAiB,QAASU,EAAmB,CAAE,QAAS,GAAO,EAClE,IAAMV,EAAU,oBAAoB,QAASU,CAAiB,CACvE,EAAG,CAAClC,EAAcqB,CAAa,CAAC,EAEhC,MAAMmB,EAAkBvH,cAAalQ,GAAwB,CACvDA,EAAE,SAAW,IACjB2V,EAAc,EAAI,EAClBE,EAAa,CACX,EAAG7V,EAAE,QAAUwV,EAAS,EACxB,EAAGxV,EAAE,QAAUwV,EAAS,CAAA,CACzB,EACH,EAAG,CAACA,CAAQ,CAAC,EAEPrF,EAAkBD,cAAalQ,GAAwB,CACtD0V,GACLD,EAAYa,EAAc,CACxB,EAAGtW,EAAE,QAAU4V,EAAU,EACzB,EAAG5V,EAAE,QAAU4V,EAAU,CAAA,EACxBE,CAAY,CAAC,CAClB,EAAG,CAACJ,EAAYE,EAAWE,EAAcQ,CAAa,CAAC,EAEjDoB,EAAgBxH,EAAAA,YAAY,IAAM,CACtCyF,EAAc,EAAK,CACrB,EAAG,CAAA,CAAE,EAEL,OACE7J,EAAAA,KAAC,MAAA,CACC,IAAKqK,EACL,UAAU,sGACV,YAAasB,EACb,YAAatH,EACb,UAAWuH,EACX,aAAcA,EACd,MAAO,CAAE,OAAQhC,EAAa,WAAa,MAAA,EAE1C,SAAA,CAAA,CAACN,GAAU,CAACE,GACX7P,EAAAA,IAAC,MAAA,CAAI,UAAU,+CACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAGD6P,GACC7P,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,CAAA,CACpC,EAGF7P,EAAAA,IAAC2N,GAAAA,OAAO,IAAP,CACC,IAAK8C,EACL,IAAKlO,EACL,IAAI,UACJ,UAAW,kCAAmCoN,EAAwB,GAAf,YAAiB,GACxE,MAAO,CACL,UAAW,aAAaI,EAAS,CAAC,OAAOA,EAAS,CAAC,aAAaM,CAAY,YAAYpI,CAAQ,OAChG,gBAAiB,SACjB,WAAYgI,EAAa,OAAS,yBAAA,EAEpC,OAAQU,EACR,QAASa,EACT,cAAeC,EACf,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS9B,EAAS,EAAI,CAAA,EACjC,WAAY,CAAE,SAAU,EAAA,EACxB,UAAW,EAAA,CAAA,EAIZA,GAAU,CAACE,GAASU,EAAY,MAAQ,GACvClK,EAAAA,KAAC,MAAA,CAAI,UAAU,0LACZ,SAAA,CAAAkK,EAAY,MAAM,MAAIA,EAAY,OAAQhB,GAAY,MAAQ,MAAMA,EAAW,KAAO,GAAGA,CAAQ,KAAOA,EAAW,KAAO,KAAO,IAAIA,EAAW,MAAM,QAAQ,CAAC,CAAC,MAAQ,IAAIA,GAAY,KAAO,OAAO,QAAQ,CAAC,CAAC,KAAK,EAAA,CAAA,CACxN,CAAA,CAAA,CAAA,CAIR,iHCzLatL,GAA0C,CAAC,CACtD,IAAA1B,EACA,KAAAwF,EACA,YAAAI,EACA,aAAA+J,EACA,mBAAAC,EACA,kBAAAC,CACF,IAAM,CACJ,MAAM1X,EAAIyF,EAAA,EACJ,CAACkS,EAAUC,CAAW,EAAIhP,EAAAA,SAAiB,CAAC,EAC5C,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChDoN,EAAelN,EAAAA,OAAuB,IAAI,EAC1C+O,EAAW/O,EAAAA,OAAoC,IAAI,GAAK,EAE9DC,EAAAA,UAAU,IAAM,CACdqM,EAAS,IAAI,CACf,EAAG,CAACvN,CAAG,CAAC,EAER,MAAMiQ,EAAwB,CAAC,CAAE,SAAAH,KAAqC,CACpEC,EAAYD,CAAQ,EACpBF,EAAmBE,CAAQ,EAC3BH,EAAa,CAAC,CAChB,EAEMO,EAAuB5C,GAAiB,CAC5C,QAAQ,MAAM,YAAaA,CAAK,EAChCC,EAASpV,EAAE,iBAAiB,CAAC,CAC/B,EAGMgY,EAAejI,EAAAA,YAAY,IAAM,CACrC,GAAI,CAACiG,EAAa,QAAS,OAE3B,MAAMM,EAAYN,EAAa,QACzBiC,EAAY3B,EAAU,UACtBzF,EAAkByF,EAAU,aAC5B4B,EAAeD,EAAYpH,EAAkB,EAGnD,IAAIsH,EAAqB,EACrBC,EAAc,IAElBP,EAAS,QAAQ,QAAQ,CAACQ,EAAaC,IAAe,CACpD,MAAMrB,EAAOoB,EAAY,sBAAA,EACnBE,EAAgBjC,EAAU,sBAAA,EAC1BkC,EAAavB,EAAK,IAAMsB,EAAc,IAAMtB,EAAK,OAAS,EAAIgB,EAC9DQ,EAAW,KAAK,IAAID,EAAaN,CAAY,EAE/CO,EAAWL,IACbA,EAAcK,EACdN,EAAqBG,EAEzB,CAAC,EAEGH,IAAuB1K,GACzB+J,EAAaW,CAAkB,CAEnC,EAAG,CAAC1K,EAAa+J,CAAY,CAAC,EAG9BzO,EAAAA,UAAU,IAAM,CACd,MAAMuN,EAAYN,EAAa,QAC/B,GAAKM,EAEL,OAAAA,EAAU,iBAAiB,SAAU0B,CAAY,EAC1C,IAAM1B,EAAU,oBAAoB,SAAU0B,CAAY,CACnE,EAAG,CAACA,CAAY,CAAC,EAGjB,MAAMU,EAAa3I,EAAAA,YAAY,CAACuI,EAAoBK,IAAmC,CACjFA,EACFd,EAAS,QAAQ,IAAIS,EAAYK,CAAO,EAExCd,EAAS,QAAQ,OAAOS,CAAU,CAEtC,EAAG,CAAA,CAAE,EAEL,OACE3M,EAAAA,KAAC,MAAA,CACC,IAAKqK,EACL,UAAU,2HAET,SAAA,CAAAb,GACC7P,EAAAA,IAAC,OAAI,UAAU,wCACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,CAAA,CACpC,EAGD,CAACA,GACA7P,EAAAA,IAACsT,GAAAA,SAAA,CACC,KAAM/Q,EACN,cAAeiQ,EACf,YAAaC,EACb,cACG,MAAA,CAAI,UAAU,gEACb,SAAAzS,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAGF,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACZ,SAAA,MAAM,KAAK,IAAI,MAAMqS,CAAQ,EAAG,CAAC5U,EAAGuI,IAAU,CAC7C,MAAMgN,EAAahN,EAAQ,EAC3B,OACEK,EAAAA,KAAC,MAAA,CAEC,IAAMuF,GAAOwH,EAAWJ,EAAYpH,CAAE,EACtC,UAAU,eAEV,SAAA,CAAA5L,EAAAA,IAACuT,GAAAA,KAAA,CACC,WAAAP,EACA,MAAOjL,EACP,cACG,MAAA,CAAI,UAAU,yGACb,SAAA/H,EAAAA,IAAC,MAAA,CAAI,UAAU,iHAAA,CAAkH,CAAA,CACnI,EAEF,gBAAiB,GACjB,sBAAuB,GACvB,UAAU,iBACV,gBAAkBwT,GAAS,CACrBR,IAAe,GAAKZ,GAEtBA,EAAkBoB,EAAK,eAAiBA,EAAK,MAAQzL,CAAI,CAE7D,CAAA,CAAA,EAGF/H,EAAAA,IAAC,MAAA,CAAI,UAAU,sJACZ,SAAAgT,CAAA,CACH,CAAA,CAAA,EAzBK,QAAQA,CAAU,EAAA,CA4B7B,CAAC,CAAA,CACH,CAAA,CAAA,EAKHX,EAAW,GACVhM,OAAC,MAAA,CAAI,UAAU,sRAAsR,SAAA,CAAA,KAChS8B,EAAY,UAAQkK,EAAS,IAAA,CAAA,CAClC,CAAA,CAAA,CAAA,CAIR,+GCvJMoB,GAAc,KACdC,GAAiB,GACjBC,GAAiB,GACjBC,GAAsBH,GAAcC,GAAiB,EACrDG,GAAW,GAEXC,GAAoC,CACxC,WAAY,uCACZ,WAAY,MACZ,MAAO,MACT,EAEa3P,GAA4C,CAAC,CAAE,IAAA5B,KAAU,CACpE,MAAM,EAAIpC,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACgR,EAAMC,CAAO,EAAI1Q,EAAAA,SAAiB,EAAE,EACrC,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAAC6Q,EAAOC,CAAQ,EAAI9Q,EAAAA,SAAmB,CAAA,CAAE,EACzC+Q,EAAa7Q,EAAAA,OAAuB,IAAI,EAE9CC,EAAAA,UAAU,IAAM,EACG,SAAY,CAC3ByQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACbkE,EAAQ,EAAE,EAEV,GAAI,CACF,MAAMM,EAAW,MAAMpR,EAAQX,CAAG,EAClC,GAAI,CAAC+R,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQ,EAG1B,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAC7BE,EAAS,MAAMC,GAAQ,cAAc,CAAE,YAAAF,EAAa,EAC1DP,EAAQQ,EAAO,KAAK,CACtB,OAAS3Q,EAAK,CACZ,QAAQ,MAAM,aAAcA,CAAG,EAC/BiM,EAAS,EAAE,mBAAmB,CAAC,CACjC,QAAA,CACEoE,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC3R,EAAKW,EAAS,CAAC,CAAC,EAEpB,MAAMwR,EAAWjK,EAAAA,YAAY,IAAM,CACjC,MAAMuG,EAAYqD,EAAW,QAC7B,GAAI,CAACrD,GAAa,CAAC+C,EAAM,OAEzB,MAAMnU,EAAW,MAAM,KAAKoR,EAAU,QAAQ,EAC9C,GAAIpR,EAAS,SAAW,EAAG,CACzBwU,EAAS,CAACL,CAAI,CAAC,EACf,MACF,CAEA,MAAMS,EAAqB,CAAC,EAAE,EAC9B,IAAIG,EAAkB,EAEtB,UAAWC,KAAShV,EAAU,CAC5B,MAAMrC,EAAIqX,EAAM,aAIZD,EAAkB,GAAKA,EAAkBpX,EAAIqW,KAC/CY,EAAO,KAAK,EAAE,EACdG,EAAkB,GAGpBH,EAAOA,EAAO,OAAS,CAAC,EAAE,KAAKI,EAAM,SAAS,EAC9CD,GAAmBpX,CACrB,CAGIiX,EAAO,SAAW,GAAGA,EAAO,KAAK,CAAA,CAAE,EAEvCJ,EAASI,EAAO,IAAIK,GAAUA,EAAO,KAAK,EAAE,CAAC,CAAC,CAChD,EAAG,CAACd,CAAI,CAAC,EAST,OAPAtQ,EAAAA,UAAU,IAAM,CACV,CAACsQ,GAAQ,CAACM,EAAW,SACzB,sBAAsB,IAAM,CAC1BK,EAAA,CACF,CAAC,CACH,EAAG,CAACX,EAAMW,CAAQ,CAAC,EAEfT,EAEAjU,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIA6P,EAEA7P,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,EACpC,EACF,EAKFxJ,EAAAA,KAAC,MAAA,CACC,UAAU,0CACV,MAAO,CAAE,WAAY,qBAAA,EAGrB,SAAA,CAAArG,EAAAA,IAAC,MAAA,CACC,IAAKqU,EACL,wBAAyB,CAAE,OAAQN,CAAA,EACnC,MAAO,CACL,GAAGD,GACH,SAAU,WACV,WAAY,SACZ,MAAO,GAAG,IAAMH,GAAiB,CAAC,KAClC,cAAe,MAAA,CACjB,CAAA,EAIF3T,EAAAA,IAAC,MAAA,CACC,UAAU,+DACV,MAAO,CAAE,IAAK,GAAG6T,EAAQ,IAAA,EAEvB,UAAAM,EAAM,OAAS,EAAIA,EAAQ,CAAC,EAAE,GAAG,IAAI,CAACW,EAAUzZ,IAChD2E,EAAAA,IAAC,MAAA,CAEC,MAAO,CACL,MAAO,OACP,SAAU,QACV,UAAW,GAAGyT,EAAW,KACzB,WAAY,QACZ,UAAW,iCACX,WAAY,EACZ,QAAS,GAAGC,EAAc,MAAMC,EAAc,IAAA,EAGhD,SAAA3T,EAAAA,IAAC,MAAA,CACC,wBAAyB,CAAE,OAAQ8U,CAAA,EACnC,MAAOhB,EAAA,CAAA,CACT,EAdKzY,CAAA,CAgBR,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,gHCnJagJ,GAA4C,CAAC,CAAE,IAAA9B,KAAU,CACpE,MAAM,EAAIpC,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACkR,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChDoN,EAAelN,EAAAA,OAAuB,IAAI,EAC1CuR,EAAiBvR,EAAAA,OAA2B,IAAI,EAChDwR,EAAexR,EAAAA,OAAyC,IAAI,EAC5DyR,EAAoBzR,EAAAA,OAA8B,IAAI,EACtD0R,EAAmB1R,EAAAA,OAAsB,IAAI,EAC7C2R,EAAoB3R,EAAAA,OAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,EAElD4R,EAAsB3K,EAAAA,YAAY,IAAM,CAC5C,GAAI,CAACiG,EAAa,QAAS,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAA,EACxD,MAAM2E,EAAW3E,EAAa,QAAQ,YAChC4E,EAAY5E,EAAa,QAAQ,aACjC/B,EAAQ0G,EAAW,IAAMA,EAAW,IACpCzG,EAAS0G,EAAY,IAAMA,EAAY,IAC7C,MAAO,CAAE,MAAA3G,EAAO,OAAAC,CAAA,CAClB,EAAG,CAAA,CAAE,EAEC2G,EAAmB9K,EAAAA,YAAY,IAAM,CACzC,GAAI,CAACiG,EAAa,SAAW,CAACsE,EAAa,QAAS,OAGpDtE,EAAa,QAAQ,UAAY,GACjCqE,EAAe,QAAU,KAEzB,KAAM,CAAE,MAAApG,EAAO,OAAAC,CAAA,EAAWwG,EAAA,EACpBI,EAAW7G,EAAQ,IAEnBrT,EAAI,IAAIma,GAAY/E,EAAa,QAAS,CAC9C,KAAM,OACN,YAAa,GACb,gBAAiB,GACjB,SAAU,GACV,IAAK,CACH,IAAK,IACL,OAAQ,EAAA,EAEV,IAAK,CACH,IAAK,GACL,MAAO8E,EAAW,GAAK,IACvB,WAAYA,EAAW,GAAK,GAC5B,SAAUA,EAAW,GAAK,EAAA,EAE5B,KAAM,CACJ,OAAQ,IAAM5G,EACd,MAAO,IAAMD,CAAA,CACf,CACD,EAEDrT,EAAE,SAAS0Z,EAAa,OAA6C,EACrED,EAAe,QAAUzZ,CAC3B,EAAG,CAAC8Z,CAAmB,CAAC,EAGxB3R,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACiN,EAAa,QAAS,OAE3B,IAAIgF,EAAkB,GAEtB,MAAMC,EAAmB,IAAM,CAC7B,GAAID,EAAiB,CACnBA,EAAkB,GAClBP,EAAkB,QAAUC,EAAA,EAC5B,MACF,CAEA,MAAMQ,EAAgBR,EAAA,EAChBS,EAAiBV,EAAkB,QACnCW,EAAY,KAAK,IAAID,EAAe,MAAQD,EAAc,KAAK,EAC/DG,EAAa,KAAK,IAAIF,EAAe,OAASD,EAAc,MAAM,EAEpEE,EAAY,IAAMC,EAAa,KAEnCZ,EAAkB,QAAUS,EAExBV,EAAiB,SACnB,aAAaA,EAAiB,OAAO,EAGvCA,EAAiB,QAAU,OAAO,WAAW,IAAM,CAC7CF,EAAa,SACfO,EAAA,CAEJ,EAAG,GAAG,EACR,EAEA,OAAAN,EAAkB,QAAU,IAAI,eAAe,IAAM,CACnDU,EAAA,CACF,CAAC,EAEDV,EAAkB,QAAQ,QAAQvE,EAAa,OAAO,EAE/C,IAAM,CACPuE,EAAkB,SACpBA,EAAkB,QAAQ,WAAA,EAExBC,EAAiB,SACnB,aAAaA,EAAiB,OAAO,CAEzC,CACF,EAAG,CAACE,EAAqBG,CAAgB,CAAC,EAE1C9R,EAAAA,UAAU,IAAM,CACd,IAAIuS,EAAY,GAEhB,MAAMC,EAAY,SAAY,CAC5B,GAAKvF,EAAa,QAElB,CAAAwD,EAAW,EAAI,EACfpE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMwE,EAAW,MAAMpR,EAAQX,EAAK,CAClC,KAAM,OACN,YAAa,OACb,SAAU,QAAA,CACX,EAED,GAAI,CAAC+R,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAI,MAAM,EAAE,gBAAgB,CAAC,EAC1BA,EAAS,SAAW,IACvB,IAAI,MAAM,UAAU,EAEpB,IAAI,MAAM,WAAWA,EAAS,MAAM,GAAG,EAIjD,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAEnC,GAAIC,EAAY,aAAe,EAC7B,MAAM,IAAI,MAAM,MAAM,EAIxB,MAAM2B,EAAW,IAAIC,GAAQ,SAC7B,MAAMD,EAAS,KAAK,KAAK3B,CAAW,EAGpC,MAAM6B,EAAYC,GAAiCH,CAAQ,EAE3D,GAAI,CAACF,EAAW,OAEhBhB,EAAa,QAAUoB,EAGvBb,EAAA,EAEArB,EAAW,EAAK,CAClB,OAASrQ,EAAK,CACZ,GAAImS,EAAW,CACb,QAAQ,MAAM,cAAenS,CAAG,EAChC,IAAIyS,EAAW,EAAE,mBAAmB,EAChCzS,aAAe,QACjByS,EAAWzS,EAAI,SAEjBiM,EAASwG,CAAQ,EACjBpC,EAAW,EAAK,CAClB,CACF,EACF,EAEMqC,EAAQ,WAAW,IAAM,CAC7B,sBAAsB,IAAM,CAC1BN,EAAA,CACF,CAAC,CACH,EAAG,GAAG,EAEN,MAAO,IAAM,CACXD,EAAY,GACZ,aAAaO,CAAK,EAClBvB,EAAa,QAAU,KACnBtE,EAAa,UACfA,EAAa,QAAQ,UAAY,IAEnCqE,EAAe,QAAU,IAC3B,CACF,EAAG,CAACxS,EAAKgT,CAAgB,CAAC,EAGxBlP,EAAAA,KAAC,MAAA,CAAI,UAAU,4EAEZ,SAAA,CAAA4N,SACE,MAAA,CAAI,UAAU,6HACb,SAAA5N,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,gKAAA,CAAiK,QAC/K,IAAA,CAAE,UAAU,mEAAoE,SAAA,EAAE,cAAc,CAAA,CAAE,CAAA,CAAA,CACrG,CAAA,CACF,EAID6P,GAAS,CAACoE,GACTjU,EAAAA,IAAC,MAAA,CAAI,UAAU,6HACb,SAAAqG,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAArG,EAAAA,IAAC,OAAI,UAAU,yPACb,eAACwW,EAAAA,gBAAA,CAAgB,UAAU,gEAAgE,CAAA,CAC7F,QACC,IAAA,CAAE,UAAU,sFAAuF,SAAA,EAAE,kBAAkB,EAAE,EAC1HxW,EAAAA,IAAC,IAAA,CAAE,UAAU,uEACV,SAAA6P,EACH,EACAxJ,EAAAA,KAAC,IAAA,CACC,KAAM9D,EACN,SAAQ,GACR,UAAU,uRAEV,SAAA,CAAAvC,EAAAA,IAAC,OAAI,UAAU,wCAAwC,KAAK,OAAO,OAAO,eAAe,QAAQ,YAC/F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,iEAAiE,CAAA,CACxI,EACC,EAAE,iBAAiB,CAAA,CAAA,CAAA,EAEtBA,EAAAA,IAAC,IAAA,CAAE,UAAU,qDAAqD,SAAA,kCAAA,CAElE,CAAA,CAAA,CACF,CAAA,CACF,EAID,CAAC6P,GACA7P,EAAAA,IAAC,MAAA,CACC,IAAK0Q,EACL,UAAU,mDACV,MAAO,CAAE,QAASuD,EAAU,EAAI,CAAA,CAAE,CAAA,CACpC,EAEJ,CAEJ,gHCzOa1P,GAA4C,CAAC,CAAE,IAAAhC,EAAK,MAAAkU,EAAQ,MAAW,CAClF,MAAM/b,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACkR,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAACoT,EAAYC,CAAa,EAAIrT,EAAAA,SAAS,CAAC,EACxCoN,EAAelN,EAAAA,OAAuB,IAAI,EAC1CoT,EAAepT,EAAAA,OAAuC,IAAI,EAC1DyR,EAAoBzR,EAAAA,OAA8B,IAAI,EACtDqT,EAAiBrT,EAAAA,OAA2B,IAAI,EAChD0R,EAAmB1R,EAAAA,OAAsB,IAAI,EAC7C2R,EAAoB3R,EAAAA,OAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,EAGlD4R,EAAsB3K,EAAAA,YAAY,IAAM,OAC5C,GAAI,CAACiG,EAAa,QAAS,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAA,EACxD,MAAM2E,EAAW3E,EAAa,QAAQ,YAChCoG,IAAcvV,EAAAmP,EAAa,QAAQ,gBAArB,YAAAnP,EAAoC,cAAe,EAEjE+J,EAAiB+J,EAAW,IAAMA,EAAYyB,EAAc,IAAMA,EAAc,IAEhFlI,EAAS,KAAK,MAAMtD,EAAiB,EAAI,EAAE,EACjD,MAAO,CAAE,MAAOA,EAAgB,OAAAsD,CAAA,CAClC,EAAG,CAAA,CAAE,EAGCmI,EAAwBtM,EAAAA,YAAY,SAAY,CACpD,GAAI,GAACiG,EAAa,SAAW,CAACmG,EAAe,SAAWH,IAAe,GAEvE,GAAI,CAEF,GAAIE,EAAa,QACf,GAAI,CACFA,EAAa,QAAQ,QAAA,CACvB,MAAQ,CAER,CAIFlG,EAAa,QAAQ,UAAY,GAGjC,MAAMsG,EAAoB5B,EAAA,EAGpB6B,EAAYzU,GAAAA,KAAKkO,EAAa,QAAS,CAC3C,MAAOsG,EAAkB,MACzB,OAAQP,EAAQO,EAAkB,OAASN,EAAaM,EAAkB,OAC1E,KAAMP,EAAQ,OAAS,OAAA,CACxB,EACDG,EAAa,QAAUK,EAGvB,MAAMA,EAAU,QAAQJ,EAAe,OAAO,CAChD,MAAQ,CAER,CACF,EAAG,CAACzB,EAAqBqB,EAAOC,CAAU,CAAC,EAG3CjT,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACiN,EAAa,QAAS,OAE3B,IAAIgF,EAAkB,GAEtB,MAAMC,EAAmB,IAAM,CAE7B,GAAID,EAAiB,CACnBA,EAAkB,GAClBP,EAAkB,QAAUC,EAAA,EAC5B,MACF,CAEA,MAAMQ,EAAgBR,EAAA,EAGhBS,EAAiBV,EAAkB,QACnCW,EAAY,KAAK,IAAID,EAAe,MAAQD,EAAc,KAAK,EAC/DG,EAAa,KAAK,IAAIF,EAAe,OAASD,EAAc,MAAM,EAEpEE,EAAY,IAAMC,EAAa,KAKnCZ,EAAkB,QAAUS,EAGxBV,EAAiB,SACnB,aAAaA,EAAiB,OAAO,EAIvCA,EAAiB,QAAU,OAAO,WAAW,IAAM,CAC7C0B,EAAa,SAAWC,EAAe,SACzCE,EAAA,CAEJ,EAAG,GAAG,EACR,EAGA,OAAA9B,EAAkB,QAAU,IAAI,eAAe,IAAM,CACnDU,EAAA,CACF,CAAC,EAGDV,EAAkB,QAAQ,QAAQvE,EAAa,OAAO,EAE/C,IAAM,CACPuE,EAAkB,SACpBA,EAAkB,QAAQ,WAAA,EAExBC,EAAiB,SACnB,aAAaA,EAAiB,OAAO,CAEzC,CACF,EAAG,CAACE,EAAqB2B,CAAqB,CAAC,EAE/CtT,EAAAA,UAAU,IAAM,CACd,IAAIuS,EAAY,GACZkB,EAAkD,KAEtD,MAAMC,EAAW,SAAY,CAC3B,GAAKzG,EAAa,QAElB,CAAAwD,EAAW,EAAI,EACfpE,EAAS,IAAI,EAGboH,EAAY,WAAW,IAAM,CACvBlB,IACFlG,EAASpV,EAAE,cAAc,CAAC,EAC1BwZ,EAAW,EAAK,EAEpB,EAAG,GAAK,EAER,GAAI,CAEF,MAAMI,EAAW,MAAMpR,EAAQX,EAAK,CAClC,KAAM,OACN,YAAa,OACb,SAAU,QAAA,CACX,EAED,GAAI,CAAC+R,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAI,MAAM5Z,EAAE,gBAAgB,CAAC,EAC1B4Z,EAAS,SAAW,IACvB,IAAI,MAAM,UAAU,EACjBA,EAAS,QAAU,IACtB,IAAI,MAAM,aAAa,EAEvB,IAAI,MAAM,WAAWA,EAAS,MAAM,GAAG,EAIjD,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAGnC,GAAIC,EAAY,aAAe,EAC7B,MAAM,IAAI,MAAM,MAAM,EAKxB,GAFAsC,EAAe,QAAUtC,EAErB,CAACyB,EAAW,OAGhB,MAAMoB,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,MAAM,QAAU,+DAChC,SAAS,KAAK,YAAYA,CAAe,EAEzC,GAAI,CAEF,MAAMC,EAAgB7U,GAAAA,KAAK4U,EAAiB,CAC1C,MAAO,IACP,OAAQ,IACR,KAAM,OAAA,CACP,EAED,GAAI,CACF,MAAMC,EAAc,QAAQ9C,CAAW,CACzC,MAAQ,CACN,MAAM,IAAI,MAAM7Z,EAAE,qBAAqB,CAAC,CAC1C,CAEA,MAAM4c,EAAQD,EAAc,WAE5B,GAAI,CAACC,GAASA,IAAU,EACtB,MAAM,IAAI,MAAM5c,EAAE,eAAe,CAAC,EAMpC,GAFA2c,EAAc,QAAA,EAEV,CAACrB,EAAW,OAGhBW,EAAcW,CAAK,EAGf5G,EAAa,UACfA,EAAa,QAAQ,UAAY,IAGnC,MAAMsG,EAAoB5B,EAAA,EAGpB6B,EAAYzU,GAAAA,KAAKkO,EAAa,QAAS,CAC3C,MAAOsG,EAAkB,MACzB,OAAQP,EAAQO,EAAkB,OAASM,EAAQN,EAAkB,OACrE,KAAMP,EAAQ,OAAS,OAAA,CACxB,EACDG,EAAa,QAAUK,EAGvB,MAAMA,EAAU,QAAQ1C,CAAW,EAG/B2C,IACF,aAAaA,CAAS,EACtBA,EAAY,MAGVlB,GACF9B,EAAW,EAAK,CAEpB,QAAA,CAEM,SAAS,KAAK,SAASkD,CAAe,GACxC,SAAS,KAAK,YAAYA,CAAe,CAE7C,CACF,OAASvT,EAAK,CAOZ,GALIqT,IACF,aAAaA,CAAS,EACtBA,EAAY,MAGVlB,EAAW,CACb,IAAIM,EAAW5b,EAAE,mBAAmB,EAChCmJ,aAAe,MACjByS,EAAWzS,EAAI,QACN,OAAOA,GAAQ,WACxByS,EAAWzS,GAEbiM,EAASwG,CAAQ,EACjBpC,EAAW,EAAK,CAClB,CACF,EACF,EAGMqC,EAAQ,WAAW,IAAM,CAC7B,sBAAsB,IAAM,CAC1B,sBAAsB,IAAM,CAC1BY,EAAA,CACF,CAAC,CACH,CAAC,CACH,EAAG,GAAG,EAGN,MAAO,IAAM,CAQX,GAPAnB,EAAY,GACZ,aAAaO,CAAK,EACdW,GACF,aAAaA,CAAS,EAExBL,EAAe,QAAU,KACzBF,EAAc,CAAC,EACXC,EAAa,QACf,GAAI,CACFA,EAAa,QAAQ,QAAA,CACvB,MAAQ,CAER,CAEFA,EAAa,QAAU,IACzB,CACF,EAAG,CAACrU,EAAK6S,EAAqBqB,CAAK,CAAC,EAGlCpQ,EAAAA,KAAC,MAAA,CAAI,UAAU,4EAEZ,SAAA,CAAA4N,SACE,MAAA,CAAI,UAAU,6HACb,SAAA5N,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,gKAAA,CAAiK,QAC/K,IAAA,CAAE,UAAU,mEAAoE,SAAAtF,EAAE,cAAc,CAAA,CAAE,CAAA,CAAA,CACrG,CAAA,CACF,EAIDmV,GAAS,CAACoE,GACTjU,EAAAA,IAAC,MAAA,CAAI,UAAU,6HACb,SAAAqG,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAArG,EAAAA,IAAC,OAAI,UAAU,sPACb,eAACuX,EAAAA,aAAA,CAAa,UAAU,gEAAgE,CAAA,CAC1F,QACC,IAAA,CAAE,UAAU,sFAAuF,SAAA7c,EAAE,kBAAkB,EAAE,EAC1HsF,EAAAA,IAAC,IAAA,CAAE,UAAU,uEACV,SAAA6P,EACH,EACAxJ,EAAAA,KAAC,IAAA,CACC,KAAM9D,EACN,SAAQ,GACR,UAAU,uRAEV,SAAA,CAAAvC,EAAAA,IAAC,OAAI,UAAU,wCAAwC,KAAK,OAAO,OAAO,eAAe,QAAQ,YAC/F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,iEAAiE,CAAA,CACxI,EACCtF,EAAE,iBAAiB,CAAA,CAAA,CAAA,EAEtBsF,EAAAA,IAAC,IAAA,CAAE,UAAU,qDAAqD,SAAA,uCAAA,CAElE,CAAA,CAAA,CACF,CAAA,CACF,EAID,CAAC6P,GACA7P,EAAAA,IAAC,MAAA,CACC,IAAK0Q,EACL,UAAU,0DACV,MAAO,CAAE,QAASuD,EAAU,EAAI,CAAA,CAAE,CAAA,CACpC,EAEJ,CAEJ,gHC9UA,SAASuD,GAAiBC,EAAsCC,EAAmC,CACjG,OAAKD,EACEA,EACJ,OAAQ1c,GAAMA,EAAE,YAAc2c,CAAI,EAClC,IAAK3c,GAAM,CACV,MAAMoQ,EAAOpQ,EAAE,MAAQ,GACjB4c,EAAQ5c,EAAE,aAAeA,EAAE,OAAS,GAC1C,OAAIoQ,GAAQwM,GAASxM,IAASwM,EACrB,GAAGxM,CAAI,KAAKwM,CAAK,IAEnBxM,GAAQwM,CACjB,CAAC,EACA,OAAO,OAAO,EACd,KAAK,IAAI,EAZY,EAa1B,CAEA,SAASC,GAAWC,EAAqC,CACvD,GAAI,CAACA,EAAS,MAAO,GACrB,GAAI,CACF,MAAMC,EAAO,IAAI,KAAKD,CAAO,EAC7B,OAAI,MAAMC,EAAK,QAAA,CAAS,EAAUD,EAC3BC,EAAK,eAAA,CACd,MAAQ,CACN,OAAOD,CACT,CACF,CAEA,SAASE,GAAeC,EAAoBC,EAA+B,CAEzE,GAAID,EAAO,SACT,OAAOA,EAAO,SAGhB,GAAIA,EAAO,KACT,GAAI,CAEF,OADgB,IAAI,YAAY,OAAO,EACxB,OAAOA,EAAO,IAAI,CACnC,MAAQ,CAER,CAGF,OAAIA,EAAO,KACF,kGAAkGA,EAAO,KAAK,QAAQ,KAAM,OAAO,EAAE,QAAQ,QAAS,MAAM,EAAE,QAAQ,KAAM,MAAM,CACvL,SAEG,2BAA2BC,CAAa,MACjD,CAEA,SAASC,GAAmBC,EAA0C,CACpE,OAAKA,EACoC,CACvC,WAAY,QACZ,iBAAkB,kBAClB,iCAAkC,eAClC,kBAAmB,cACnB,+BAAgC,kBAChC,gCAAiC,uBACjC,cAAe,UACf,WAAY,OACZ,iBAAkB,aAAA,EAEJA,CAAY,GAAKA,EAZP,EAa5B,CAEA,MAAMC,GAAkC,CACtC,WAAY,EACZ,MAAO,UACP,WAAY,IACZ,YAAa,MACb,WAAY,QACd,EAEMC,GAAgC,CACpC,QAAS,OACT,WAAY,aACZ,IAAK,MACL,QAAS,OACX,EAEMC,GAAqC,CACzC,WAAY,EACZ,QAAS,OACT,WAAY,SACZ,OAAQ,OACV,EAEMC,GAAiC,CACrC,WAAY,EACZ,MAAO,SACT,EAEMC,GAAkC,CACtC,MAAO,UACP,UAAW,aACX,KAAM,CACR,EAEa/T,GAA0C,CAAC,CAAE,IAAAlC,KAAU,CAClE,MAAM,EAAIpC,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACkR,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAAC0U,EAAQS,CAAS,EAAInV,EAAAA,SAA4B,IAAI,EA6B5D,GA3BAG,EAAAA,UAAU,IAAM,EACE,SAAY,CAC1ByQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb2I,EAAU,IAAI,EAEd,GAAI,CACF,MAAMnE,EAAW,MAAMpR,EAAQX,CAAG,EAClC,GAAI,CAAC+R,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQ,EAG1B,MAAMC,EAAc,MAAMD,EAAS,YAAA,EAE7BoE,EADY,IAAIC,GAAUpE,CAAW,EAChB,YAAA,EAC3BkE,EAAUC,CAAQ,CACpB,OAAS7U,EAAK,CACZ,QAAQ,MAAM,YAAaA,CAAG,EAC9BiM,EAAS,EAAE,kBAAkB,CAAC,CAChC,QAAA,CACEoE,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC3R,CAAG,CAAC,EAEJ0R,EACF,OACEjU,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIJ,GAAI6P,GAAS,CAACmI,EACZ,aACG,MAAA,CAAI,UAAU,qEACb,SAAAhY,EAAAA,IAAC,OAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,GAAS,EAAE,wBAAwB,EAAE,EACnE,CAAA,CACF,EAIJ,MAAM+I,EAAQpB,GAAiBQ,EAAO,WAAY,IAAI,EAChDa,EAAQrB,GAAiBQ,EAAO,WAAY,IAAI,EAChDc,EAAStB,GAAiBQ,EAAO,WAAY,KAAK,EAClDe,EAAaf,EAAO,YAAc,GAClCgB,EAAchB,EAAO,mBAAqBA,EAAO,aAAe,GAChEiB,EAASF,GAAcC,GAAeD,IAAeC,EACvD,GAAGD,CAAU,KAAKC,CAAW,IAC7BD,GAAcC,EACZE,EAAWtB,GAAWI,EAAO,gBAAgB,EAC7CmB,EAAevB,GAAWI,EAAO,mBAAmB,EACpDoB,EAAcxB,GAAWI,EAAO,YAAY,EAC5CqB,EAAezB,GAAWI,EAAO,oBAAoB,EACrDsB,EAAUtB,EAAO,SAAW,QAC5BuB,GAAevB,EAAO,aAAe,CAAA,GAAI,OAAQ5c,GAAM,CAACA,EAAE,gBAAgB,EAC1Eoe,EAAWzB,GAAeC,EAAQ,EAAE,gBAAgB,CAAC,EACrDG,EAAeD,GAAmBF,EAAO,YAAY,EACrDyB,EAAYzB,EAAO,WAAa,GAChC0B,EAAY1B,EACZ2B,EAAa,OAAOD,EAAU,YAAe,SAAWA,EAAU,WAAa,OAC/EE,EAAkBD,IAAe,EAAI,OAASA,IAAe,EAAI,MAAQ,GACzEE,EAAc,OAAOH,EAAU,aAAgB,SAAWA,EAAU,YAAc,OAOlFI,EAAmBD,IAAgB,QAAaA,IAAgB,GANpB,CAChD,EAAG,SACH,EAAG,WACH,EAAG,UACH,EAAG,cAAA,EAEuFA,CAAW,GAAK,GAE5G,OACE7Z,EAAAA,IAAC,MAAA,CACC,UAAU,0CACV,MAAO,CAAE,WAAY,OAAA,EAErB,SAAAqG,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,MAAO,OACP,WAAY,QACZ,UAAW,MAAA,EAIb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,aAAc,oBAAqB,QAAS,gDAAiD,WAAY,SAAA,EAErH,SAAA,CAAArG,EAAAA,IAAC,KAAA,CAAG,MAAO,CAAE,OAAQ,aAAc,SAAU,2BAA4B,WAAY,IAAK,MAAO,UAAW,WAAY,KACrH,SAAAsZ,EACH,EAGAjT,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,SAAU,2BAA4B,MAAO,SAAA,EAClG,SAAA,CAAA4S,GACC5S,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAAC+Z,QAAK,KAAM,GAAI,MAAOxB,EAAA,CAAW,CAAA,CAAE,EAChElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,OAAI,EAC7BpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAS,CAAA,CAAO,CAAA,CAAA,CACnC,CAAA,EACF,EAGDL,GACCvS,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACga,SAAM,KAAM,GAAI,MAAOzB,EAAA,CAAW,CAAA,CAAE,EACjElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,KAAE,EAC3BpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAI,CAAA,CAAM,CAAA,CAAA,CAClC,CAAA,EACF,EAGDC,GACCxS,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACga,SAAM,KAAM,GAAI,MAAOzB,EAAA,CAAW,CAAA,CAAE,EACjElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,KAAE,EAC3BpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAK,CAAA,CAAM,CAAA,CAAA,CAClC,CAAA,EACF,EAGDC,GACCzS,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACga,SAAM,KAAM,GAAI,MAAOzB,EAAA,CAAW,CAAA,CAAE,EACjElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,MAAG,EAC5BpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAM,CAAA,CAAO,CAAA,CAAA,CACnC,CAAA,EACF,EAGDI,GACC7S,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACia,YAAS,KAAM,GAAI,MAAO1B,EAAA,CAAW,CAAA,CAAE,EACpElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,OAAI,EAC7BpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAU,CAAA,CAAS,CAAA,CAAA,CACrC,CAAA,EACF,EAGDC,GAAgBA,IAAiBD,GAChC7S,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACka,SAAM,KAAM,GAAI,MAAO3B,EAAA,CAAW,CAAA,CAAE,EACjElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,WAAQ,EACjCpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAW,CAAA,CAAa,CAAA,CAAA,CACzC,CAAA,EACF,EAGD,CAACD,GAAY,CAACC,GAAgBC,GAC7B/S,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACia,YAAS,KAAM,GAAI,MAAO1B,EAAA,CAAW,CAAA,CAAE,EACpElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,OAAI,EAC7BpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAY,CAAA,CAAY,CAAA,CAAA,CACxC,CAAA,EACF,EAGDQ,GACCvT,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACma,OAAI,KAAM,GAAI,MAAO5B,EAAA,CAAW,CAAA,CAAE,EAC/DlS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,aAAU,EACnCpY,MAAC,QAAK,MAAO,CACX,GAAGwY,GACH,MAAOmB,IAAe,EAAI,UAAY,UACtC,WAAY,GAAA,EAEX,SAAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,EAGDE,GACCzT,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACma,OAAI,KAAM,GAAI,MAAO5B,EAAA,CAAW,CAAA,CAAE,EAC/DlS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,cAAW,EACpCpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAsB,CAAA,CAAiB,CAAA,CAAA,CAC7C,CAAA,EACF,EAGD3B,GAAgBA,IAAiB,SAChC9R,EAAAA,KAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACoa,QAAK,KAAM,GAAI,MAAO7B,EAAA,CAAW,CAAA,CAAE,EAChElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,OAAI,EAC7BpY,EAAAA,IAAC,OAAA,CAAK,MAAOwY,GAAa,SAAAL,CAAA,CAAa,CAAA,CAAA,CACzC,CAAA,EACF,EAGDoB,EAAY,OAAS,GACpBlT,EAAAA,KAAC,OAAI,MAAO,CAAE,GAAGgS,GAAU,UAAW,oBAAqB,UAAW,MAAO,WAAY,QACvF,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACqa,aAAU,KAAM,GAAI,MAAO9B,EAAA,CAAW,CAAA,CAAE,EACrElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,cAAW,QACnC,MAAA,CAAI,MAAO,CAAE,GAAGI,GAAY,QAAS,OAAQ,SAAU,OAAQ,IAAK,KAAA,EAClE,WAAY,IAAI,CAACpd,EAAGC,IAAM,CACzB,MAAM8P,EAAO/P,EAAE,UAAYA,EAAE,MAAQ,OAC/Bkf,EAAOlf,EAAE,cACTmf,EAAUD,EACZA,EAAO,QACL,IAAIA,EAAO,SAAS,QAAQ,CAAC,CAAC,MAC9BA,EAAO,KACL,IAAIA,EAAO,MAAM,QAAQ,CAAC,CAAC,MAC3B,GAAGA,CAAI,KACX,GACJ,OACEjU,EAAAA,KAAC,OAAA,CAEC,MAAO,CACL,QAAS,cACT,WAAY,SACZ,IAAK,MACL,QAAS,UACT,WAAY,UACZ,aAAc,MACd,SAAU,OACV,MAAO,UACP,OAAQ,mBAAA,EAGT,SAAA,CAAA8E,EACAoP,UACE,OAAA,CAAK,MAAO,CAAE,MAAO,UAAW,SAAU,MAAA,EAAU,SAAA,CAAA,IAAEA,EAAQ,GAAA,CAAA,CAAC,CAAA,CAAA,EAf7Dlf,CAAA,CAmBX,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,EAGDoe,GACCpT,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,GAAGgS,GAAU,UAAWkB,EAAY,OAAS,EAAI,OAAS,oBAAqB,UAAW,MAAO,WAAY,QACzH,SAAA,CAAAvZ,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACwa,QAAK,KAAM,GAAI,MAAOjC,EAAA,CAAW,CAAA,CAAE,EAChElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,aAAU,EACnCpY,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,GAAGwY,GAAY,SAAU,OAAQ,MAAO,UAAW,WAAY,WAAA,EAAgB,SAAAiB,CAAA,CAAU,CAAA,CAAA,CAC1G,CAAA,EACF,EAGDJ,GAAgBA,IAAiBH,GAAYG,IAAiBF,GAC7D9S,OAAC,MAAA,CAAI,MAAOgS,GACV,SAAA,CAAArY,EAAAA,IAAC,OAAA,CAAK,MAAOsY,GAAe,SAAAtY,EAAAA,IAACka,SAAM,KAAM,GAAI,MAAO3B,EAAA,CAAW,CAAA,CAAE,EACjElS,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,KAAM,GACnC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAOoY,GAAY,SAAA,WAAQ,EACjCpY,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,GAAGwY,GAAY,SAAU,OAAQ,MAAO,WAAc,SAAAa,CAAA,CAAa,CAAA,CAAA,CACpF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,EAGArZ,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,QAAS,gDACT,WAAY,uCACZ,WAAY,MACZ,MAAO,OACP,UAAW,MAAA,EAEb,wBAAyB,CAAE,OAAQwZ,CAAA,CAAS,CAAA,CAC9C,CAAA,CAAA,CACF,CAAA,CAGN,+GCrYA,GAAI,OAAO,SAAa,KAAe,CAAC,SAAS,eAAe,iBAAiB,EAAG,CAClF,MAAMiB,EAAU,SAAS,cAAc,OAAO,EAC9CA,EAAQ,GAAK,kBACbA,EAAQ,YAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQtB,SAAS,KAAK,YAAYA,CAAO,CACnC,CA+CA,MAAMC,GAAW,IAEJ/V,GAAegW,EAAAA,WAC1B,CAAC,CAAE,IAAApY,EAAK,gBAAAqY,EAAiB,kBAAAC,CAAA,EAAqBC,IAAQ,CACpD,MAAMpgB,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACVgY,EAAYvX,EAAAA,OAAuB,IAAI,EACvCwX,EAAUxX,EAAAA,OAAwB,IAAI,EACtCyX,EAAezX,EAAAA,OAA6B,IAAI,EAChD0X,EAAqB1X,EAAAA,OAAOoX,CAAe,EAC3CO,EAAuB3X,EAAAA,OAAOqX,CAAiB,EACrDK,EAAmB,QAAUN,EAC7BO,EAAqB,QAAUN,EAE/B,MAAMO,EAAoB5X,EAAAA,OAAO,CAAC,EAC5B6X,EAAa7X,EAAAA,OAAsB,IAAI,EACvC8X,EAAiB9X,EAAAA,OAAO,EAAK,EAE7B,CAACyQ,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAACiY,EAAaC,CAAc,EAAIlY,EAAAA,SAAS,EAAK,EAC9C,CAACmY,EAAKC,CAAM,EAAIpY,EAAAA,SAAoB,CAAA,CAAE,EACtC,CAACqY,EAASC,CAAU,EAAItY,EAAAA,SAAS,EAAK,EACtC,CAACuY,EAAeC,CAAgB,EAAIxY,EAAAA,SAAiB,EAAE,EACvDyY,EAASvY,EAAAA,OAAkB,EAAE,EACnCuY,EAAO,QAAUN,EAEjBH,EAAe,QAAUC,EAEzB,MAAMS,EAAavR,EAAAA,YAAY,IAAM,QACnClJ,EAAA0Z,EAAa,UAAb,MAAA1Z,EAAsB,MACxB,EAAG,CAAA,CAAE,EAEC0a,EAAaxR,EAAAA,YAAY,IAAM,QACnClJ,EAAA0Z,EAAa,UAAb,MAAA1Z,EAAsB,MACxB,EAAG,CAAA,CAAE,EAGC2a,EAAqB1Y,EAAAA,OAAuB,IAAI,EAChD2Y,EAAe3Y,EAAAA,OAAO,CAAC,EAEvB4Y,EAAc5Y,SAAQ6Y,GAAe,UACzC,MAAMrL,EAAYkL,EAAmB,QACrC,GAAI,CAAClL,EAAW,OAChB,MAAMpF,EAAKoF,EAEX,GADmBpF,EAAG,UAAYA,EAAG,cAAgBA,EAAG,aAAe,IAErE,GAAI,CACF,MAAM0Q,GAAO/a,EAAA0Z,EAAa,UAAb,YAAA1Z,EAA4G,SACzHyL,GAAAsP,GAAA,YAAAA,EAAK,QAAL,MAAAtP,GAAA,KAAAsP,EAAa,IAAK,IACpB,MAAQ,CAAe,CAE3B,CAAC,EAEKC,EAAyB9R,EAAAA,YAAY,IAAM,CAE3CyR,EAAmB,UACrBA,EAAmB,QAAQ,oBAAoB,SAAUE,EAAY,OAAO,EAC5EF,EAAmB,QAAU,MAE/B,qBAAqBC,EAAa,OAAO,EAEzC,MAAMK,EAAY,IAAM,OACtB,MAAMxL,IAAYzP,EAAAwZ,EAAU,UAAV,YAAAxZ,EAAmB,cAAc,qBAAsB,KACzE,GAAI,CAACyP,EAAW,CACdmL,EAAa,QAAU,sBAAsBK,CAAS,EACtD,MACF,CACAN,EAAmB,QAAUlL,EAC7BA,EAAU,iBAAiB,SAAUoL,EAAY,QAAS,CAAE,QAAS,GAAM,CAC7E,EACAD,EAAa,QAAU,sBAAsBK,CAAS,CACxD,EAAG,CAAA,CAAE,EAECC,EAAkBhS,EAAAA,YAAY,IAAM,OACxC,MAAMiS,EAAS,CAACpB,EAAe,QAC/BE,EAAekB,CAAM,GACrBnb,EAAA4Z,EAAqB,UAArB,MAAA5Z,EAAA,KAAA4Z,EAA+BuB,GAE/B,WAAW,IAAM,CACf,MAAMC,EAAS5B,EAAU,QACnB6B,EAAY3B,EAAa,QAC3B,CAAC0B,GAAU,CAACC,IAChBA,EAAU,OAAOD,EAAO,YAAaA,EAAO,YAAY,EAEpDtB,EAAW,SACbuB,EAAU,QAAQvB,EAAW,OAAO,EAGtCkB,EAAA,EACF,EAAG,GAAG,CACR,EAAG,CAACA,CAAsB,CAAC,EAErBM,EAAYpS,EAAAA,YAAY,IAAM,CAClCmR,EAAW9P,GAAQ,CAACA,CAAI,CAC1B,EAAG,CAAA,CAAE,EAECgR,EAAiBrS,cAAasS,GAAiB,OACnDjB,EAAiBiB,CAAI,GACrBxb,EAAA0Z,EAAa,UAAb,MAAA1Z,EAAsB,QAAQwb,GAC9BnB,EAAW,EAAK,CAClB,EAAG,CAAA,CAAE,EAELoB,EAAAA,oBAAoBlC,EAAK,KAAO,CAC9B,SAAUkB,EACV,SAAUC,EACV,gBAAAQ,EACA,UAAAI,CAAA,GACE,CAACb,EAAYC,EAAYQ,EAAiBI,CAAS,CAAC,EAExDpZ,EAAAA,UAAU,IAAM,CACd,MAAMkZ,EAAS5B,EAAU,QACzB,GAAI,CAAC4B,EAAQ,OAEbzI,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb4L,EAAO,CAAA,CAAE,EACTE,EAAW,EAAK,EAChBe,EAAO,UAAY,GACnBtB,EAAW,QAAU,KACrBD,EAAkB,QAAU,EAE5B,IAAI1X,EAAY,GAGhB,MAAMuZ,EAAY,OAAO,WAAW,IAAM,CACpCvZ,GACJwZ,EAAA,CACF,EAAG,CAAC,EAEEA,EAAO,SAAY,OACvB,GAAI,CACF,IAAIC,GAAkC5a,EAClCA,EAAI,WAAW,OAAO,IAExB4a,GAAY,MADC,MAAMja,EAAQX,CAAG,GACP,YAAA,GAGzB,MAAM6a,EAAOC,GAAKF,EAAS,EAC3BnC,EAAQ,QAAUoC,EAElB,MAAMR,GAAYQ,EAAK,SAAST,EAAQ,CACtC,QAAS,aACT,KAAM,WACN,MAAO,OACP,OAAQ,MAAA,CACT,EACD1B,EAAa,QAAU2B,GAEvBA,GAAU,OAAO,SAAS,UAAW,CACnC,KAAM,CACJ,WAAY,qBACZ,MAAO,qBACP,cAAe,uFACf,YAAa,kBACb,cAAe,eACf,QAAS,uBACT,YAAa,kBACb,aAAc,wBACd,aAAc,wBACd,gBAAiB,uBAAA,EAEnB,EAAG,CAAE,cAAe,iBAAkB,OAAQ,oBAAA,EAC9C,GAAI,CAAE,aAAc,oBAAqB,OAAQ,wBAAA,EACjD,GAAI,CAAE,OAAQ,0BAAA,EACd,GAAI,CAAE,OAAQ,wBAAA,EACd,IAAK,CAAE,YAAa,kBAAmB,OAAQ,iBAAA,EAC/C,EAAG,CAAE,MAAO,qBAAsB,kBAAmB,iBAAA,CAAkB,CACxE,EACDA,GAAU,OAAO,OAAO,SAAS,EAEjC,MAAMQ,EAAK,MAGXA,EAAK,UAAU,SAAS,IAAI,EAAE,KAAK,IAAM,cACvC,GAAI1Z,EAAW,OACf0X,EAAkB,QAAUgC,EAAK,UAAU,OAAA,EAE3C,MAAME,IAAM/b,GAAA0Z,EAAa,UAAb,YAAA1Z,GAAsB,kBAC5Bgc,IAAMvQ,GAAAsQ,IAAA,YAAAA,GAAK,QAAL,YAAAtQ,GAAY,WAAY,GACpCwQ,GAAAtC,EAAmB,UAAnB,MAAAsC,GAAA,KAAAtC,EAA6BqC,EAAM,EAAGnC,EAAkB,QAC1D,CAAC,EAAE,MAAM,IAAM,CAAe,CAAC,EAG/B,MAAMqC,EAAM,MAAML,EAAK,OAAO,WAO9B,GANI,CAAC1Z,GAAa,MAAM,QAAQ+Z,GAAA,YAAAA,EAAK,GAAG,GACtC/B,EAAO+B,EAAI,GAAG,EAGhB,MAAMb,GAAU,QAAA,EAEZlZ,EAAW,OAEfwQ,EAAW,EAAK,GAChB3S,EAAA2Z,EAAmB,UAAnB,MAAA3Z,EAAA,KAAA2Z,EAA6B,EAAGE,EAAkB,SAAW,GAE7DwB,GAAU,GAAG,YAAcc,IAAsB,iBAC/C,MAAMJ,EAAMI,GAIZ,IAHInc,GAAA+b,GAAA,YAAAA,EAAK,QAAL,MAAA/b,GAAY,MACd8Z,EAAW,QAAUiC,EAAI,MAAM,MAE7BtQ,GAAAsQ,GAAA,YAAAA,EAAK,QAAL,MAAAtQ,GAAY,KAAM,CAEpB,MAAM2Q,GAAYL,EAAI,MAAM,KACtBM,GAAoB,CAAA,EACpBC,GAAWC,IAAqB,CACpC,UAAWtQ,MAAQsQ,GAAO,CACxB,MAAMC,GAAOvQ,GAAK,KAAK,MAAM,GAAG,EAAE,CAAC,EAC/BuQ,KAASJ,KAAcI,IAAQJ,GAAU,SAAS,IAAMI,EAAI,GAAKJ,GAAU,SAASI,EAAI,IAC1FH,GAAQ,KAAKpQ,GAAK,IAAI,EAEpBA,GAAK,UAAUqQ,GAAQrQ,GAAK,QAAQ,CAC1C,CACF,EACAqQ,GAAQ9B,EAAO,OAAO,EAClB6B,GAAQ,SAAW,GAErB9B,EAAiB8B,GAAQ,CAAC,CAAC,CAG/B,CACA,MAAML,IAAMC,GAAAF,GAAA,YAAAA,EAAK,QAAL,YAAAE,GAAY,SAClB9Q,GAAQ0O,EAAkB,QAC5B,OAAOmC,IAAQ,UAAY7Q,GAAQ,KACrCsR,GAAA9C,EAAmB,UAAnB,MAAA8C,GAAA,KAAA9C,EAA6BqC,GAAM,EAAG7Q,IAE1C,CAAC,CAEH,OAAS7I,GAAK,CACZ,QAAQ,MAAM,aAAcA,EAAG,EAC1BH,IACHoM,EAASpV,EAAE,kBAAkB,CAAC,EAC9BwZ,EAAW,EAAK,EAEpB,CACF,EAEA,MAAO,IAAM,YACXxQ,EAAY,GACZ,OAAO,aAAauZ,CAAS,EAC7B,GAAI,EAAEjQ,IAAAzL,EAAA0Z,EAAa,UAAb,YAAA1Z,EAAsB,UAAtB,MAAAyL,GAAA,KAAAzL,EAAmC,MAAQ,CAAe,CAChE,GAAI,EAAEic,EAAAxC,EAAQ,UAAR,MAAAwC,EAAiB,SAAW,MAAQ,CAAe,CACzDvC,EAAa,QAAU,KACvBD,EAAQ,QAAU,IACpB,CACF,EAAG,CAACzY,CAAG,CAAC,EAERkB,EAAAA,UAAU,IAAM,CACd,MAAMwa,EAAW,IAAM,CACrB,MAAMtB,EAAS5B,EAAU,QACrB,CAAC4B,GAAU,CAAC1B,EAAa,SAC7BA,EAAa,QAAQ,OAAO0B,EAAO,YAAaA,EAAO,YAAY,CACrE,EACA,cAAO,iBAAiB,SAAUsB,CAAQ,EACnC,IAAM,OAAO,oBAAoB,SAAUA,CAAQ,CAC5D,EAAG,CAAA,CAAE,EAELxa,EAAAA,UAAU,KACR8Y,EAAA,EACO,IAAM,OACX,qBAAqBJ,EAAa,OAAO,GACzC5a,EAAA2a,EAAmB,UAAnB,MAAA3a,EAA4B,oBAAoB,SAAU6a,EAAY,QACxE,GACC,CAAC7Z,EAAKga,CAAsB,CAAC,EAEhC,MAAM2B,EAAWzT,cAAasS,GACrBA,IAASlB,EACf,CAACA,CAAa,CAAC,EAEZsC,EAAiB,CAACL,EAAkBM,EAAQ,IAChDpe,MAAC,MAAG,MAAO,CAAE,WAAYoe,EAAQ,EAAI,GAAK,GACvC,WAAM,IAAI,CAAC5Q,EAAMnS,IAAM,CACtB,MAAMgjB,EAASH,EAAS1Q,EAAK,IAAI,EACjC,cACG,KAAA,CACC,SAAA,CAAAxN,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM8c,EAAetP,EAAK,IAAI,EACvC,UAAW,sGAAsG6Q,EAC3G,uDACA,wEACJ,GACF,MAAO7Q,EAAK,MAEX,SAAAA,EAAK,MAAM,KAAA,CAAK,CAAA,EAElBA,EAAK,UAAYA,EAAK,SAAS,OAAS,GAAK2Q,EAAe3Q,EAAK,SAAU4Q,EAAQ,CAAC,CAAA,CAAA,EAX9E,GAAG5Q,EAAK,IAAI,IAAInS,CAAC,EAY1B,CAEJ,CAAC,CAAA,CACH,EAGF,OACEgL,EAAAA,KAAC,MAAA,CAAI,UAAU,sGACZ,SAAA,CAAAwJ,GACC7P,EAAAA,IAAC,OAAI,UAAU,8GACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,CAAA,CACpC,EAGDoE,GAAW,CAACpE,GACX7P,EAAAA,IAAC,MAAA,CAAI,UAAU,iFACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAIDyb,EAAI,OAAS,GACZpV,EAAAA,KAAC,MAAA,CACC,UAAU,qFACV,MAAO,CACL,QAASsV,EAAU,EAAI,EACvB,cAAeA,EAAU,OAAS,MAAA,EAGpC,SAAA,CAAAtV,EAAAA,KAAC,MAAA,CACC,UAAU,mMACV,MAAO,CAAE,UAAWsV,EAAU,gBAAkB,mBAAA,EAEhD,SAAA,CAAAtV,EAAAA,KAAC,MAAA,CAAI,UAAU,sHACb,SAAA,CAAArG,MAAC,OAAA,CAAK,UAAU,kDAAmD,SAAAtF,EAAE,aAAa,EAAE,EACpFsF,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM4b,EAAW,EAAK,EAC/B,UAAU,uEAEV,SAAA5b,EAAAA,IAAC5B,EAAAA,EAAA,CAAE,UAAU,iBAAA,CAAkB,CAAA,CAAA,CACjC,EACF,QACC,MAAA,CAAI,UAAU,mDACZ,SAAA+f,EAAe1C,CAAG,CAAA,CACrB,CAAA,CAAA,CAAA,EAEFzb,EAAAA,IAAC,MAAA,CACC,UAAU,qDACV,MAAO,CAAE,WAAY2b,EAAU,kBAAoB,aAAA,EACnD,QAAS,IAAMC,EAAW,EAAK,CAAA,CAAA,CACjC,CAAA,CAAA,EAIH,CAAC/L,GACA7P,EAAAA,IAAC,MAAA,CACC,IAAK+a,EACL,UAAU,kDACV,MAAO,CACL,MAAOQ,EAAc,OAAS,GAAGb,EAAQ,KACzC,SAAU,OACV,WAAY,kBACZ,SAAU,QAAA,CACZ,CAAA,CACF,EAEJ,CAEJ,CACF,gHCvZM4D,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBb5D,GAAW,IAeJ7V,GAAe8V,EAAAA,WAC1B,CAAC,CAAE,IAAApY,EAAK,gBAAAqY,EAAiB,kBAAAC,CAAA,EAAqBC,IAAQ,CACpD,MAAMpgB,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACVwb,EAAU/a,EAAAA,OAAuB,IAAI,EACrCgb,EAAUhb,EAAAA,OAA2B,IAAI,EACzC0X,EAAqB1X,EAAAA,OAAOoX,CAAe,EAC3CO,EAAuB3X,EAAAA,OAAOqX,CAAiB,EACrDK,EAAmB,QAAUN,EAC7BO,EAAqB,QAAUN,EAG/B,MAAMO,EAAoB5X,EAAAA,OAAO,CAAC,EAE5B,CAACyQ,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAACmY,EAAKC,CAAM,EAAIpY,EAAAA,SAAoB,CAAA,CAAE,EACtC,CAACqY,EAASC,CAAU,EAAItY,EAAAA,SAAS,EAAK,EACtC,CAACuY,EAAeC,CAAgB,EAAIxY,EAAAA,SAAiB,EAAE,EACvD,CAACiY,EAAaC,CAAc,EAAIlY,EAAAA,SAAS,EAAK,EAC9CgY,EAAiB9X,EAAAA,OAAO,EAAK,EACnC8X,EAAe,QAAUC,EAEzB,MAAMkD,EAAiBhU,EAAAA,YAAY,CAACgC,EAAiBC,IAAkB,OACjEA,EAAQ,IAAG0O,EAAkB,QAAU1O,IAC3CnL,EAAA2Z,EAAmB,UAAnB,MAAA3Z,EAAA,KAAA2Z,EAA6B,KAAK,IAAI,EAAGzO,EAAU,CAAC,EAAG2O,EAAkB,QAC3E,EAAG,CAAA,CAAE,EAECY,EAAavR,EAAAA,YAAY,IAAM,CACnC,MAAMiU,EAAOF,EAAQ,QAChBE,GACLA,EAAK,OAAO,MAAM,IAAM,CAAC,CAAC,CAC5B,EAAG,CAAA,CAAE,EAECzC,EAAaxR,EAAAA,YAAY,IAAM,CACnC,MAAMiU,EAAOF,EAAQ,QAChBE,GACLA,EAAK,OAAO,MAAM,IAAM,CAAC,CAAC,CAC5B,EAAG,CAAA,CAAE,EAEC7B,EAAYpS,EAAAA,YAAY,IAAMmR,EAAY9P,GAAS,CAACA,CAAI,EAAG,EAAE,EAE7D2Q,EAAkBhS,EAAAA,YAAY,IAAM,OACxC,MAAMiS,EAAS,CAACpB,EAAe,QAC/BE,EAAekB,CAAM,GACrBnb,EAAA4Z,EAAqB,UAArB,MAAA5Z,EAAA,KAAA4Z,EAA+BuB,GAE/B,MAAMgC,EAAOF,EAAQ,QACrB,GAAI,CAACE,EAAM,OACX,MAAM1T,EAAY0T,EAA+C,SAC7D1T,GACFA,EAAS,aAAa,kBAAmB0R,EAAS,OAAS,KAAK,CAEpE,EAAG,CAAA,CAAE,EAECI,EAAiBrS,cAAasS,GAAiB,OACnDjB,EAAiBiB,CAAI,EACrBnB,EAAW,EAAK,GAChBra,EAAAid,EAAQ,UAAR,MAAAjd,EAAiB,KAAKwb,GAAM,MAAM,IAAM,CAAC,EAC3C,EAAG,CAAA,CAAE,EAELC,EAAAA,oBAAoBlC,EAAK,KAAO,CAC9B,SAAUkB,EACV,SAAUC,EACV,gBAAAQ,EACA,UAAAI,CAAA,GACE,CAACb,EAAYC,EAAYQ,EAAiBI,CAAS,CAAC,EAExDpZ,EAAAA,UAAU,IAAM,CACd,MAAMkb,EAAOJ,EAAQ,QACrB,GAAI,CAACI,EAAM,OAEXzK,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb4L,EAAO,CAAA,CAAE,EACTE,EAAW,EAAK,EAChBE,EAAiB,EAAE,EACnB6C,EAAK,gBAAA,EAEL,IAAIjb,EAAY,GACZgb,EAA2B,KA4E/B,OA1Ea,SAAY,iBACvB,GAAI,CACF,GAAIhb,EAAW,OAEfgb,EAAO,SAAS,cAAc,cAAc,EAC5CC,EAAK,YAAYD,CAAI,EACrBF,EAAQ,QAAUE,EAGlBA,EAAK,iBAAiB,WAAankB,IAAa,WAC9C,MAAMqkB,EAAUrkB,GAAkB,OAClC,GAAI,CAACqkB,EAAQ,OAEb,MAAMtB,GAAMsB,EAAO,SACnB,GAAItB,IAAO,OAAOA,GAAI,SAAY,UAAY,OAAOA,GAAI,OAAU,SACjEmB,EAAenB,GAAI,QAASA,GAAI,KAAK,MAChC,CAEL,MAAMuB,KAAW7R,IAAAzL,GAAAid,EAAQ,UAAR,YAAAjd,GAAiB,OAAjB,YAAAyL,GAAuB,WAAY,CAAA,EAC9C8R,GAAMF,EAAO,OAAS,EACtBG,GAAOH,EAAO,UAAY,EAC1BlS,GAAQ,KAAK,IAAImS,GAAS,OAAQ,CAAC,EACnCpS,GAAU,KAAK,OAAOqS,GAAMC,IAAQrS,GAAQA,EAAK,EACvD+R,EAAehS,GAASC,EAAK,CAC/B,CACA,MAAMsS,GAAUJ,EAAO,QACnBI,IAAA,MAAAA,GAAS,MACXlD,EAAiBkD,GAAQ,IAAI,CAEjC,CAAC,EAED,MAAMC,EAAM,MAAM/b,EAAQX,CAAG,EAC7B,GAAI,CAAC0c,EAAI,GAAI,MAAM,IAAI,MAAM,SAASA,EAAI,MAAM,EAAE,EAClD,MAAMC,GAAO,MAAMD,EAAI,KAAA,EACvB,IAAI9T,EAAO,YACX,GAAI,CAEF,MAAM4S,EADI,IAAI,IAAIxb,EAAK,OAAO,SAAS,IAAI,EAC5B,SAAS,MAAM,GAAG,EAAE,IAAA,EAC/Bwb,IAAM5S,EAAO,mBAAmB4S,CAAI,EAC1C,MAAQ,CAAkB,CAC1B,MAAM9a,GAAO,IAAI,KAAK,CAACic,EAAI,EAAG/T,CAAI,EAGlC,GADA,MAAMuT,EAAK,KAAKzb,EAAI,EAChBS,EAAW,EAAEsJ,GAAAzL,EAAAmd,EAAK,OAAL,YAAAnd,EAAW,UAAX,MAAAyL,EAAA,KAAAzL,GAAwB,MAAQ,CAGjD,MAAMyJ,EAAY0T,EAGb,SAED1T,IAEFA,EAAS,aAAa,WAAY,EAAE,EACpCA,EAAS,aAAa,kBAAmB,KAAK,EAC9CA,EAAS,aAAa,SAAU,IAAI,EACpCA,EAAS,aAAa,MAAO,IAAI,GACjCwS,EAAAxS,EAAS,YAAT,MAAAwS,EAAA,KAAAxS,EAAqBsT,IAErB,OAAMN,EAAAhT,EAAS,OAAT,YAAAgT,EAAA,KAAAhT,KAGR0Q,IAAOW,EAAAqC,EAAK,OAAL,YAAArC,EAAW,MAAO,CAAA,CAAE,EAC3BnI,EAAW,EAAK,EAChBuK,EAAe,IAAGU,EAAAT,EAAK,OAAL,YAAAS,EAAW,SAAS,SAAU,CAAC,CACnD,OAAStb,EAAK,CACZ,QAAQ,MAAM,kBAAmBA,CAAG,EAC/BH,IACHoM,EAASpV,EAAE,kBAAkB,CAAC,EAC9BwZ,EAAW,EAAK,EAEpB,CACF,GAEA,EAEO,IAAM,WACXxQ,EAAY,GACZ,GAAI,EAAE8Z,GAAAxQ,GAAAzL,EAAAid,EAAQ,UAAR,YAAAjd,EAAiB,OAAjB,YAAAyL,EAAuB,UAAvB,MAAAwQ,EAAA,KAAAxQ,EAAoC,MAAQ,CAAe,CACjEwR,EAAQ,QAAU,KAClBG,EAAK,gBAAA,CACP,CACF,EAAG,CAACpc,EAAKkc,CAAc,CAAC,EAExB,MAAMP,EAAWzT,EAAAA,YACdsS,GAA6B,CAAC,CAACA,GAAQA,IAASlB,EACjD,CAACA,CAAa,CAAA,EAGVsC,EAAiB,CAACL,EAAkBM,EAAQ,UAC/C,KAAA,CAAG,MAAO,CAAE,UAAW,OAAQ,QAAS,EAAG,OAAQA,EAAQ,EAAI,aAAe,CAAA,EAC5E,SAAAN,EAAM,IAAI,CAACtQ,EAAMnS,IAAA,SAChBgL,OAAAA,EAAAA,KAAC,KAAA,CACE,SAAA,CAAAmH,EAAK,KACJxN,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM8c,EAAetP,EAAK,IAAK,EACxC,UAAW,sGACT0Q,EAAS1Q,EAAK,IAAI,EACd,uDACA,wEACN,GACA,MAAOA,EAAK,MAEX,UAAAjM,EAAAiM,EAAK,QAAL,YAAAjM,EAAY,MAAK,CAAA,QAGnB,MAAA,CAAI,UAAU,6EACZ,UAAAyL,EAAAQ,EAAK,QAAL,YAAAR,EAAY,OACf,EAEDQ,EAAK,UAAYA,EAAK,SAAS,OAAS,GAAK2Q,EAAe3Q,EAAK,SAAU4Q,EAAQ,CAAC,CAAA,CAAA,EAlB9E,GAAG5Q,EAAK,MAAQA,EAAK,KAAK,IAAInS,CAAC,EAmBxC,EACD,EACH,EAGF,OACEgL,EAAAA,KAAC,MAAA,CAAI,UAAU,sGACZ,SAAA,CAAAwJ,GACC7P,EAAAA,IAAC,OAAI,UAAU,sHACb,eAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,CAAA,CACpC,EAGDoE,GAAW,CAACpE,GACX7P,EAAAA,IAAC,MAAA,CAAI,UAAU,iFACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mHAAA,CAAoH,CAAA,CACrI,EAIDyb,EAAI,OAAS,GACZpV,EAAAA,KAAC,MAAA,CACC,UAAU,qFACV,MAAO,CAAE,QAASsV,EAAU,EAAI,EAAG,cAAeA,EAAU,OAAS,MAAA,EAErE,SAAA,CAAAtV,EAAAA,KAAC,MAAA,CACC,UAAU,mMACV,MAAO,CAAE,UAAWsV,EAAU,gBAAkB,mBAAA,EAEhD,SAAA,CAAAtV,EAAAA,KAAC,MAAA,CAAI,UAAU,sHACb,SAAA,CAAArG,MAAC,OAAA,CAAK,UAAU,kDAAmD,SAAAtF,EAAE,aAAa,EAAE,EACpFsF,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM4b,EAAW,EAAK,EAC/B,UAAU,uEAEV,SAAA5b,EAAAA,IAAC5B,EAAAA,EAAA,CAAE,UAAU,iBAAA,CAAkB,CAAA,CAAA,CACjC,EACF,QACC,MAAA,CAAI,UAAU,mDACZ,SAAA+f,EAAe1C,CAAG,CAAA,CACrB,CAAA,CAAA,CAAA,EAEFzb,EAAAA,IAAC,MAAA,CACC,UAAU,qDACV,MAAO,CAAE,WAAY2b,EAAU,kBAAoB,aAAA,EACnD,QAAS,IAAMC,EAAW,EAAK,CAAA,CAAA,CACjC,CAAA,CAAA,EAIH,CAAC/L,GACA7P,EAAAA,IAAC,MAAA,CACC,IAAKue,EACL,UAAU,kDACV,MAAO,CACL,MAAOhD,EAAc,OAAS,GAAGb,EAAQ,KACzC,SAAU,OACV,WAAY,iBAAA,CACd,CAAA,CACF,EAEJ,CAEJ,CACF,EAEA7V,GAAa,YAAc,mIC5SrBua,GAAgB7c,GAAwB,OAC5C,MAAMwK,IAAMxL,EAAAgB,EAAI,MAAM,GAAG,EAAE,IAAA,IAAf,YAAAhB,EAAsB,cAAc,MAAM,KAAK,KAAM,GAajE,MAZwC,CACtC,IAAK,YACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,IAAK,kBACL,IAAK,kBACL,IAAK,mBACL,IAAK,YACL,MAAO,aACP,IAAK,aAAA,EAEQwL,CAAG,GAAK,WACzB,EAEahI,GAA8C,CAAC,CAAE,IAAAxC,KAAU,CACtE,MAAM,EAAIpC,EAAA,EACJ,CAAC0P,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAAC+b,EAAWC,CAAY,EAAIhc,EAAAA,SAAS,EAAI,EACzCic,EAAW/b,EAAAA,OAAuB,IAAI,EACtCgc,EAAYhc,EAAAA,OAA6B,IAAI,EAmFnD,OAjFAC,EAAAA,UAAU,IAAM,CAEd,GAAI,CAAC+b,EAAU,SAAWD,EAAS,QAAS,CAC1C,MAAME,EAAe,SAAS,cAAc,UAAU,EACtDA,EAAa,UAAU,IAAI,wBAAyB,iBAAiB,EACrEF,EAAS,QAAQ,YAAYE,CAAY,EAEzC,MAAMC,EAAYN,GAAa7c,CAAG,EAU5Bod,EAASC,GAAQH,EAAc,CACnC,SAAU,GACV,KAAM,GACN,QAAS,OACT,WAAY,CACV,SAAU,CACR,aACA,cACA,qBACA,cACA,kBACA,kBACA,uBACA,kBAAA,EAEF,YAAa,CACX,OAAQ,EAAA,CACV,EAEF,MAAO,CACL,IAAK,CACH,eAAgB,EAAA,EAElB,kBAAmB,GACnB,kBAAmB,GACnB,iBAAkB,EAAA,EAEpB,QAlCcC,IAAc,kBAC1B,CACA,CAAE,IAAKnd,EAAK,KAAM,iBAAA,EAClB,CAAE,IAAKA,EAAK,KAAM,WAAA,CAAY,EAE9B,CAAC,CAAE,IAAKA,EAAK,KAAMmd,EAAW,CA6BhC,CACD,EAGKG,EAAUF,EAAO,GAAA,EAAK,cAAc,OAAO,EAC7CE,IACDA,EAA6B,MAAM,UAAY,WAIlDF,EAAO,GAAG,aAAc,IAAM,CAC5BL,EAAa,EAAK,CACpB,CAAC,EAEDK,EAAO,GAAG,QAAS,IAAM,CACvB,MAAM9P,EAAQ8P,EAAO,MAAA,EACrB,QAAQ,MAAM,kBAAmB9P,CAAK,EACtCC,EAAS,EAAE,+BAAgC,CAAE,OAAOD,GAAAA,YAAAA,EAAO,UAAW,EAAE,sBAAsB,CAAA,CAAG,CAAC,EAClGyP,EAAa,EAAK,CACpB,CAAC,EAEDE,EAAU,QAAUG,CACtB,CACF,EAAG,CAACpd,CAAG,CAAC,EAGRkB,EAAAA,UAAU,IAAM,CACd,MAAMkc,EAASH,EAAU,QAEzB,MAAO,IAAM,CACPG,GAAU,CAACA,EAAO,eACpBA,EAAO,QAAA,EACPH,EAAU,QAAU,KAExB,CACF,EAAG,CAAA,CAAE,EAED3P,QAEC,MAAA,CAAI,UAAU,qEACb,SAAAxJ,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,yHACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,mCAAmC,KAAK,OAAO,QAAQ,YAAY,OAAO,eACvF,SAAAA,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,sIAAA,CAAuI,CAAA,CAC9M,CAAA,CACF,QACC,IAAA,CAAE,UAAU,2DAA4D,SAAA,EAAE,mBAAmB,EAAE,EAChGA,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAoC,SAAA6P,CAAA,CAAM,CAAA,CAAA,CACzD,CAAA,CACF,QAKD,MAAA,CAAI,UAAU,qEACb,SAAAxJ,EAAAA,KAAC,MAAA,CAAI,UAAU,qCAEZ,SAAA,CAAAgZ,SACE,MAAA,CAAI,UAAU,uHACb,SAAAhZ,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,wIAAA,CAAyI,QACvJ,IAAA,CAAE,UAAU,oDAAqD,SAAA,EAAE,eAAe,CAAA,CAAE,CAAA,CAAA,CACvF,CAAA,CACF,EAIFA,EAAAA,IAAC,MAAA,CACC,IAAKuf,EACL,UAAU,yEACV,MAAO,CACL,UAAW,qEAAA,CACb,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAEJ,iHCnIO,SAASO,GAAe,CAC7B,IAAAvd,CACF,EAAgD,CAC9C,MAAMwd,EAAWvc,EAAAA,OAAyB,IAAI,EACxC,CAACwc,EAAWC,CAAY,EAAI3c,EAAAA,SAAS,EAAK,EAC1C,CAAC+b,EAAWC,CAAY,EAAIhc,EAAAA,SAAS,EAAI,EACzC,CAAC4c,EAAaC,CAAc,EAAI7c,EAAAA,SAAS,CAAC,EAC1C,CAAC8c,EAAUC,CAAW,EAAI/c,EAAAA,SAAS,CAAC,EACpC,CAACgd,EAAQC,CAAc,EAAIjd,EAAAA,SAAS,CAAC,EACrC,CAACkd,EAASC,CAAU,EAAInd,EAAAA,SAAS,EAAK,EACtC,CAACod,EAAQC,CAAS,EAAIrd,EAAAA,SAAS,EAAK,EACpC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAEtDG,EAAAA,UAAU,IAAM,CACd,MAAMmd,EAAQb,EAAS,QACvB,GAAI,CAACa,EAAO,OAGZtB,EAAa,EAAI,EACjBxP,EAAS,IAAI,EAEb,MAAM+Q,EAAe,IAAM,CACpB,MAAMD,EAAM,WAAW,GAC1BT,EAAeS,EAAM,WAAW,CAEpC,EAEME,EAAmB,IAAM,CACzB,CAAC,MAAMF,EAAM,QAAQ,GAAK,SAASA,EAAM,QAAQ,GACnDP,EAAYO,EAAM,QAAQ,CAE9B,EAEMG,EAAY,IAAM,CACtBzB,EAAa,EAAK,EAClBwB,EAAA,CACF,EAEME,EAAY,IAAM1B,EAAa,EAAI,EACnC2B,EAAY,IAAM,CACtB3B,EAAa,EAAK,EAClBW,EAAa,EAAI,CACnB,EAGMiB,EAAS,IAAMjB,EAAa,EAAI,EAChCkB,EAAU,IAAMlB,EAAa,EAAK,EAClCmB,EAAU,IAAMnB,EAAa,EAAK,EAElCoB,EAAU,IAAM,CACpBvR,EAAS,QAAQ,EACjBwP,EAAa,EAAK,CACpB,EAEA,OAAAsB,EAAM,iBAAiB,aAAcC,CAAY,EACjDD,EAAM,iBAAiB,iBAAkBE,CAAgB,EACzDF,EAAM,iBAAiB,iBAAkBE,CAAgB,EACzDF,EAAM,iBAAiB,UAAWG,CAAS,EAC3CH,EAAM,iBAAiB,UAAWI,CAAS,EAC3CJ,EAAM,iBAAiB,UAAWK,CAAS,EAC3CL,EAAM,iBAAiB,OAAQM,CAAM,EACrCN,EAAM,iBAAiB,QAASO,CAAO,EACvCP,EAAM,iBAAiB,QAASQ,CAAO,EACvCR,EAAM,iBAAiB,QAASS,CAAO,EAGnCT,EAAM,YAAc,GACtBtB,EAAa,EAAK,EAClBwB,EAAA,GACSF,EAAM,YAAc,GAC7BE,EAAA,EAGK,IAAM,CACXF,EAAM,oBAAoB,aAAcC,CAAY,EACpDD,EAAM,oBAAoB,iBAAkBE,CAAgB,EAC5DF,EAAM,oBAAoB,iBAAkBE,CAAgB,EAC5DF,EAAM,oBAAoB,UAAWG,CAAS,EAC9CH,EAAM,oBAAoB,UAAWI,CAAS,EAC9CJ,EAAM,oBAAoB,UAAWK,CAAS,EAC9CL,EAAM,oBAAoB,OAAQM,CAAM,EACxCN,EAAM,oBAAoB,QAASO,CAAO,EAC1CP,EAAM,oBAAoB,QAASQ,CAAO,EAC1CR,EAAM,oBAAoB,QAASS,CAAO,CAC5C,CACF,EAAG,CAAC9e,CAAG,CAAC,EAER,MAAM+e,EAAa7W,EAAAA,YAAY,IAAM,CACnC,MAAMmW,EAAQb,EAAS,QAClBa,IAEDA,EAAM,OACRA,EAAM,OAAO,MAAM,IAAM,CAEzB,CAAC,EAEDA,EAAM,MAAA,EAEV,EAAG,CAAA,CAAE,EAECW,EAAO9W,cAAa+W,GAAiB,CACzC,MAAMZ,EAAQb,EAAS,QAClBa,IACLA,EAAM,YAAcY,EACpBrB,EAAeqB,CAAI,EACrB,EAAG,CAAA,CAAE,EAECC,EAAOhX,EAAAA,YACViX,GAAoB,CACnB,MAAMd,EAAQb,EAAS,QAClBa,IACLA,EAAM,YAAc,KAAK,IACvB,EACA,KAAK,IAAIA,EAAM,YAAcc,EAASd,EAAM,UAAY,GAAQ,CAAA,EAEpE,EACA,CAAA,CAAC,EAGGe,EAAYlX,cAAamX,GAAgB,CAC7C,MAAMhB,EAAQb,EAAS,QACvB,GAAI,CAACa,EAAO,OACZ,MAAMiB,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGD,CAAG,CAAC,EAC5ChB,EAAM,OAASiB,EACftB,EAAesB,CAAO,EAClBA,EAAU,IACZjB,EAAM,MAAQ,GACdH,EAAW,EAAK,EAEpB,EAAG,CAAA,CAAE,EAECqB,EAAarX,EAAAA,YAAY,IAAM,CACnC,MAAMmW,EAAQb,EAAS,QAClBa,IACLA,EAAM,MAAQ,CAACA,EAAM,MACrBH,EAAWG,EAAM,KAAK,EACxB,EAAG,CAAA,CAAE,EAECmB,EAAatX,EAAAA,YAAY,IAAM,CACnC,MAAMmW,EAAQb,EAAS,QACvB,GAAI,CAACa,EAAO,OACZ,MAAMoB,EAAO,CAACpB,EAAM,KACpBA,EAAM,KAAOoB,EACbrB,EAAUqB,CAAI,CAChB,EAAG,CAAA,CAAE,EAECC,EAAaxX,cAAa+W,GAAiB,CAC/C,GAAI,CAAC,SAASA,CAAI,GAAK,MAAMA,CAAI,GAAKA,EAAO,EAAG,MAAO,OACvD,MAAMU,EAAU,KAAK,MAAMV,EAAO,EAAE,EAC9BE,EAAU,KAAK,MAAMF,EAAO,EAAE,EACpC,MAAO,GAAGU,CAAO,IAAIR,EAAQ,WAAW,SAAS,EAAG,GAAG,CAAC,EAC1D,EAAG,CAAA,CAAE,EAEL,MAAO,CACL,SAAA3B,EACA,UAAAC,EACA,UAAAX,EACA,OAAAqB,EACA,YAAAR,EACA,SAAAE,EACA,OAAAE,EACA,QAAAE,EACA,MAAA3Q,EACA,WAAAyR,EACA,KAAAC,EACA,KAAAE,EACA,UAAAE,EACA,WAAAG,EACA,WAAAC,EACA,WAAAE,CAAA,CAEJ,CC9LA,MAAME,GAID,CAAC,CAAE,KAAAC,EAAM,UAAAxhB,EAAY,GAAI,MAAAiO,KAAY,CACxC,MAAM6B,EAAelN,EAAAA,OAAuB,IAAI,EAC1C6e,EAAW7e,EAAAA,OAAuB,IAAI,EACtC,CAAC8e,EAAUC,CAAW,EAAIjf,EAAAA,SAAS,EAAK,EACxC,CAACkf,EAAYC,CAAa,EAAInf,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMif,EAAQ,IAAM,CAClB,MAAM1R,EAAYN,EAAa,QACzBiS,EAAQN,EAAS,QACvB,GAAI,CAACrR,GAAa,CAAC2R,EAAO,OAC1B,MAAMC,EAAK5R,EAAU,YACf6R,EAAKF,EAAM,YACjBJ,EAAYM,EAAKD,CAAE,EACnBH,EAAcI,CAAE,CAClB,EACAH,EAAA,EACA,MAAMI,EAAW,IAAI,eAAeJ,CAAK,EACzC,OAAIhS,EAAa,SAASoS,EAAS,QAAQpS,EAAa,OAAO,EACxD,IAAMoS,EAAS,WAAA,CACxB,EAAG,CAACV,CAAI,CAAC,EAET,MAAMW,EAAM,GACNC,EAAcR,EAAaO,EAC3BE,EAAMD,EAAc,GAE1B,OACE3c,EAAAA,KAAC,MAAA,CACC,IAAKqK,EACL,UAAW,6CAA6C9P,CAAS,GACjE,MAAAiO,EAEC,SAAA,CAAAyT,EACCjc,EAAAA,KAACsH,GAAAA,OAAO,IAAP,CACC,UAAU,wCACV,QAAS,CAAE,EAAG,CAAC,EAAG,CAACqV,CAAW,CAAA,EAC9B,WAAY,CAAE,SAAUC,EAAK,OAAQ,IAAU,KAAM,SAAU,YAAa,GAAA,EAE5E,SAAA,CAAAjjB,EAAAA,IAAC,QAAM,SAAAoiB,CAAA,CAAK,EACZpiB,MAAC,QAAK,MAAO,CAAE,MAAO+iB,CAAA,EAAO,UAAU,mBAAmB,EAC1D/iB,EAAAA,IAAC,QAAM,SAAAoiB,CAAA,CAAK,CAAA,CAAA,CAAA,EAEZ,KAEJpiB,EAAAA,IAAC,MAAA,CACC,IAAKqiB,EACL,UAAU,wBACV,MAAOC,EAAW,CAAE,SAAU,WAAY,WAAY,SAAU,cAAe,MAAA,EAAW,OAEzF,SAAAF,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,EAGMc,GAA4C,CAAC,CAAE,UAAAlD,CAAA,IACnDhgB,EAAAA,IAAC2N,GAAAA,OAAO,IAAP,CACC,UAAU,eACV,MAAO,CACL,IAAK,OACL,MAAO,MACP,MAAO,QACP,OAAQ,QACR,gBAAiB,YACjB,OAAQ,CAAA,EAEV,QAAS,CAAE,OAAQqS,EAAY,GAAK,CAAA,EACpC,WAAY,CAAE,SAAU,GAAK,KAAM,CAAC,GAAK,EAAG,GAAK,CAAC,CAAA,EAElD,SAAA3Z,EAAAA,KAAC,MAAA,CACC,MAAM,MACN,OAAO,MACP,QAAQ,cACR,KAAK,OACL,MAAM,6BAGN,SAAA,CAAArG,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,iBAAA,CAAkB,EAEtDA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,gBAAA,CAAiB,EAErDA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,qBAAA,CAAsB,EAEzDA,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,OAAO,YAAY,MAAM,EAG5EA,EAAAA,IAAC,OAAA,CACC,EAAE,gBACF,OAAO,gBACP,YAAY,MACZ,cAAc,OAAA,CAAA,EAGhBA,EAAAA,IAAC,OAAA,CACC,EAAE,oBACF,OAAO,yBACP,YAAY,IACZ,cAAc,OAAA,CAAA,EAIhBA,EAAAA,IAAC,OAAA,CAAK,EAAE,KAAK,EAAE,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,MAAM,KAAK,iBAAiB,EAEzEA,EAAAA,IAAC,OAAA,CAAK,EAAE,OAAO,EAAE,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,KAAK,sBAAsB,EAE7EA,EAAAA,IAAC,OAAA,CAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,OAAO,OAAO,YAAY,MAAM,cAAc,QAAQ,EAC9FA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,QAAQ,EAAE,MAAM,KAAK,MAAA,CAAO,SAG9C,OAAA,CACC,SAAA,CAAAqG,OAAC,kBAAe,GAAG,WAAW,GAAG,MAAM,GAAG,MACxC,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,SAAA,CAAU,CAAA,EAC1C,SACC,iBAAA,CAAe,GAAG,gBAAgB,GAAG,MAAM,GAAG,MAC7C,SAAA,CAAAA,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,EACvC,EACAqG,EAAAA,KAAC,iBAAA,CAAe,GAAG,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IACnD,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,MAAM,UAAU,OAAO,EACpCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,EACvC,EACAqG,EAAAA,KAAC,iBAAA,CAAe,GAAG,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IACpD,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,EACvC,EACAqG,EAAAA,KAAC,iBAAA,CAAe,GAAG,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IACzD,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,OAAO,KAAK,UAAU,OAAO,EACnCA,EAAAA,IAAC,OAAA,CAAK,OAAO,OAAO,UAAU,MAAA,CAAO,CAAA,CAAA,CACvC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,EAQWiF,GAA8C,CAAC,CAAE,IAAA1C,EAAK,SAAA2D,KAAe,CAChF,MAAMxL,EAAIyF,EAAA,EACJ,CACJ,SAAA4f,EACA,UAAAC,EACA,UAAAX,EACA,OAAAqB,EACA,YAAAR,EACA,SAAAE,EACA,OAAAE,EACA,QAAAE,EACA,MAAA3Q,EACA,WAAAyR,EACA,KAAAC,EACA,KAAAE,EACA,UAAAE,EACA,WAAAG,EACA,WAAAC,EACA,WAAAE,CAAA,EACEnC,GAAe,CAAE,IAAAvd,EAAK,EAEpB,CAAC4gB,EAAYC,CAAa,EAAI9f,EAAAA,SAAS,EAAK,EAC5C+f,EAAY7f,EAAAA,OAAuB,IAAI,EACvC8f,EAAiB9f,EAAAA,OAAA,EAEjB+f,EAAWnD,EAAW,EAAIF,EAAcE,EAAW,EAEzD3c,EAAAA,UAAU,IAAM,CACd,MAAM+f,EAAsBjpB,GAAkB,CACxC8oB,EAAU,SAAW,CAACA,EAAU,QAAQ,SAAS9oB,EAAE,MAAc,GACnE6oB,EAAc,EAAK,CAEvB,EACA,OAAID,GACF,SAAS,iBAAiB,YAAaK,CAAkB,EAEpD,IAAM,SAAS,oBAAoB,YAAaA,CAAkB,CAC3E,EAAG,CAACL,CAAU,CAAC,EAEf,MAAMM,EAAoB,IAAM,CAC9B,aAAaH,EAAe,OAAO,EACnCF,EAAc,EAAI,CACpB,EAEMM,EAAoB,IAAM,CAC9BJ,EAAe,QAAU,WAAW,IAAMF,EAAc,EAAK,EAAG,GAAG,CACrE,EAEMO,EAAanD,GAAWF,IAAW,EAAIsD,EAAAA,QAAUtD,EAAS,GAAMuD,EAAAA,QAAUC,EAAAA,QAEhF,OAAIjU,EAEA7P,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,EACpC,EACF,EAKFxJ,EAAAA,KAAC,MAAA,CAAI,UAAU,4IAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,eAAe,MAAO,CAAE,MAAO,QAAS,OAAQ,OAAA,EAE7D,SAAA,CAAArG,EAAAA,IAAC2N,GAAAA,OAAO,IAAP,CACC,UAAU,gCACV,MAAO,CACL,MAAO,QACP,OAAQ,QACR,IAAK,OACL,KAAM,MACN,WAAY,qEAAA,EAEd,QAASqS,EAAY,CAAE,MAAO,CAAC,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,GAAK,EAAG,EAAG,CAAA,EAAM,CAAE,MAAO,EAAG,QAAS,EAAA,EAC5F,WAAYA,EAAY,CAAE,SAAU,EAAG,OAAQ,IAAU,KAAM,aAAgB,CAAE,SAAU,EAAA,CAAI,CAAA,EAIjG3Z,EAAAA,KAAC,MAAA,CACC,UAAU,oDACV,MAAO,CACL,MAAO,QACP,OAAQ,QACR,IAAK,OACL,KAAM,OACN,WAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAYZ,UAAW2Z,EACP,6FACA,6DACJ,UAAW,oCACX,mBAAoBA,EAAY,UAAY,QAAA,EAI9C,SAAA,CAAA3Z,EAAAA,KAAC,MAAA,CACC,UAAU,gCACV,MAAO,CACL,MAAO,MACP,OAAQ,MACR,IAAK,MACL,KAAM,MACN,WAAY,yEACZ,UAAW,mGAAA,EAGb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CACC,UAAU,2DACV,MAAO,CACL,WAAY;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,CAMd,CAAA,EAEFA,EAAAA,IAAC,MAAA,CACC,UAAU,gCACV,MAAO,CACL,MAAO,MACP,OAAQ,MACR,IAAK,MACL,KAAM,MACN,WAAY,oDACZ,UAAW,0DAAA,CACb,CAAA,CACF,CAAA,CAAA,EAGDqf,GACCrf,EAAAA,IAAC2N,GAAAA,OAAO,IAAP,CACC,UAAU,4CACV,MAAO,CAAE,OAAQ,iCAAA,EACjB,QAAS,CAAE,MAAO,CAAC,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,GAAK,GAAK,EAAG,CAAA,EACvD,WAAY,CAAE,SAAU,IAAK,OAAQ,GAAA,CAAS,CAAA,CAChD,CAAA,CAAA,EAKJ3N,MAACkjB,IAAQ,UAAAlD,CAAA,CAAsB,CAAA,EACjC,EAGA3Z,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAArG,EAAAA,IAACmiB,GAAA,CACC,KAAMjc,EACN,UAAU,yEAAA,CAAA,EAEZlG,EAAAA,IAAC,IAAA,CAAE,UAAU,gEAAgE,SAAA,OAAA,CAE7E,CAAA,EACF,EAGAqG,EAAAA,KAAC,MAAA,CACC,UAAU,8HACV,MAAO,CAAE,eAAgB,YAAA,EAGzB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iDACb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,uEAAA,CAAwE,EACvFA,EAAAA,IAAC,MAAA,CACC,UAAU,oEACV,MAAO,CACL,MAAO,GAAGujB,EAAW,GAAG,IACxB,WAAY,mEACZ,UAAWvD,EAAY,gCAAkC,OACzD,WAAY,mBAAA,CACd,CAAA,EAEFhgB,EAAAA,IAAC,QAAA,CACC,KAAK,QACL,IAAI,IACJ,IAAKogB,EAAW,EAAIA,EAAWF,GAAe,IAC9C,KAAK,MACL,MAAOA,EACP,SAAW3lB,GAAMgnB,EAAK,WAAWhnB,EAAE,OAAO,KAAK,CAAC,EAChD,SAAU6lB,GAAY,EACtB,aAAY1lB,EAAE,qBAAqB,EACnC,UAAU,sCAAA,CAAA,CACZ,EACF,EACA2L,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,mBAAoB,gBAAmB,SAAAiiB,EAAW/B,CAAW,EAAE,EAC9ElgB,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,mBAAoB,cAAA,EAAmB,SAAAogB,EAAW,EAAI6B,EAAW7B,CAAQ,EAAI,OAAA,CAAQ,CAAA,CAAA,CACtG,CAAA,EACF,EAGA/Z,EAAAA,KAAC,MAAA,CAAI,UAAU,yDAEb,SAAA,CAAArG,EAAAA,IAAC2N,GAAAA,OAAO,OAAP,CACC,QAASoU,EACT,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAqBrnB,EAATgmB,EAAW,sBAA2B,oBAAN,EAC5C,UAAW,uGACTA,EACI,qCACA,uCACN,GAEA,SAAA1gB,EAAAA,IAAC+jB,EAAAA,OAAA,CAAO,UAAU,iBAAA,CAAkB,CAAA,CAAA,EAItC/jB,EAAAA,IAAC2N,GAAAA,OAAO,OAAP,CACC,QAAS,IAAM8T,EAAK,GAAG,EACvB,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAY/mB,EAAE,wBAAwB,EACtC,UAAU,+IAEV,SAAAsF,EAAAA,IAACgkB,EAAAA,SAAA,CAAS,UAAU,2BAAA,CAA4B,CAAA,CAAA,EAIlDhkB,EAAAA,IAAC2N,GAAAA,OAAO,OAAP,CACC,QAAS2T,EACT,WAAY,CAAE,MAAO,IAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAwB5mB,EAAZslB,EAAc,mBAAwB,iBAAN,EAC5C,UAAU,kFACV,MAAO,CACL,WAAY,oEACZ,MAAO,OACP,UAAW,kCAAA,EAGZ,SAAAA,QACEiE,EAAAA,MAAA,CAAM,UAAU,kBAAkB,EAEnCjkB,EAAAA,IAACkkB,EAAAA,KAAA,CAAK,UAAU,4BAAA,CAA6B,CAAA,CAAA,EAKjDlkB,EAAAA,IAAC2N,GAAAA,OAAO,OAAP,CACC,QAAS,IAAM8T,EAAK,EAAE,EACtB,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAY/mB,EAAE,uBAAuB,EACrC,UAAU,+IAEV,SAAAsF,EAAAA,IAACmkB,EAAAA,YAAA,CAAY,UAAU,2BAAA,CAA4B,CAAA,CAAA,EAIrD9d,EAAAA,KAAC,MAAA,CACC,IAAKgd,EACL,UAAU,eACV,aAAcI,EACd,aAAcC,EAEd,SAAA,CAAA1jB,EAAAA,IAAC2N,GAAAA,OAAO,OAAP,CACC,QAASmU,EACT,WAAY,CAAE,MAAO,GAAA,EACrB,SAAU,CAAE,MAAO,GAAA,EACnB,aAAsBpnB,EAAV8lB,EAAY,oBAAyB,iBAAN,EAC3C,UAAW,uGACT2C,EACI,qCACA,wCACN,GAEA,SAAAnjB,EAAAA,IAAC2jB,EAAA,CAAW,UAAU,iBAAA,CAAkB,CAAA,CAAA,EAG1C3jB,EAAAA,IAACwO,GAAAA,iBACE,SAAA2U,GACCnjB,EAAAA,IAAC2N,GAAAA,OAAO,IAAP,CACC,QAAS,CAAE,QAAS,EAAG,MAAO,GAAA,EAC9B,QAAS,CAAE,QAAS,EAAG,MAAO,CAAA,EAC9B,KAAM,CAAE,QAAS,EAAG,MAAO,GAAA,EAC3B,WAAY,CAAE,SAAU,GAAA,EACxB,UAAU,2GACV,MAAO,CACL,KAAM,MACN,WAAY,QACZ,eAAgB,YAAA,EAElB,aAAc8V,EACd,aAAcC,EAEd,SAAArd,EAAAA,KAAC,OAAI,UAAU,mDAAmD,MAAO,CAAE,OAAQ,SACjF,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4DAA4D,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAA,EACzG,SAAA,CAAArG,EAAAA,IAAC,MAAA,CACC,UAAU,iDACV,MAAO,CAAE,MAAO,MAAO,OAAQ,MAAA,CAAO,CAAA,EAExCA,EAAAA,IAAC,MAAA,CACC,UAAU,qEACV,MAAO,CACL,MAAO,MACP,OAAQ,IAAIwgB,EAAU,EAAIF,GAAU,GAAG,IACvC,WAAY,yBACZ,WAAY,oBAAA,CACd,CAAA,EAEFtgB,EAAAA,IAAC,QAAA,CACC,KAAK,QACL,IAAI,IACJ,IAAI,IACJ,KAAK,OACL,MAAOwgB,EAAU,EAAIF,EACrB,SAAW/lB,GAAMonB,EAAU,WAAWpnB,EAAE,OAAO,KAAK,CAAC,EACrD,aAAYG,EAAE,mBAAmB,EACjC,UAAU,sCACV,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,iBACX,gBAAiB,eAAA,CACnB,CAAA,CACF,EACF,EACAsF,EAAAA,IAAC,OAAA,CAAK,UAAU,wDACb,SAAA,KAAK,OAAOwgB,EAAU,EAAIF,GAAU,GAAG,CAAA,CAC1C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAAA,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAAA,QAGD,QAAA,CAAM,IAAKP,EAAU,IAAKxd,EAAK,UAAU,YAAA,CAAa,CAAA,EACzD,CAEJ,iHCheO,SAAS6hB,GAAkBC,EAAcC,EAAkD,CAChG,MAAMxc,EAAgBpH,GAAA,EAChB,CAACqT,EAAMC,CAAO,EAAI1Q,EAAAA,SAAS,EAAE,EAC7B,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EAE3CG,OAAAA,EAAAA,UAAU,IAAM,CACd,IAAIC,EAAY,GAChB,OAAAwQ,EAAW,EAAI,EACfqQ,GAAAA,WAAWF,EAAM,CACf,KAAAC,EACA,MAAOxc,IAAkB,QAAU,eAAiB,WAAA,CACrD,EACE,KAAM0c,GAAQ,CACR9gB,IACHsQ,EAAQwQ,CAAG,EACXtQ,EAAW,EAAK,EAEpB,CAAC,EACA,MAAM,IAAM,CACNxQ,IACHsQ,EAAQ,EAAE,EACVE,EAAW,EAAK,EAEpB,CAAC,EACI,IAAM,CACXxQ,EAAY,EACd,CACF,EAAG,CAAC2gB,EAAMC,EAAMxc,CAAa,CAAC,EAEvB,CAAE,KAAAiM,EAAM,QAAAE,CAAA,CACjB,CC7BA,MAAMwQ,GAAWrC,GAAiB,CAChC,KAAM,CAACsC,EAAQC,CAAS,EAAIrhB,EAAAA,SAAS,EAAK,EACpCshB,EAAana,EAAAA,YAAY,SAAY,CACzC,GAAI,CACF,MAAM,UAAU,UAAU,UAAU2X,CAAI,CAC1C,MAAQ,CACN,MAAMyC,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,MAAQzC,EACjB,SAAS,KAAK,YAAYyC,CAAQ,EAClCA,EAAS,OAAA,EACT,SAAS,YAAY,MAAM,EAC3B,SAAS,KAAK,YAAYA,CAAQ,CACpC,CACAF,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CACzC,EAAG,CAACvC,CAAI,CAAC,EACT,MAAO,CAAE,OAAAsC,EAAQ,WAAAE,CAAA,CACnB,EAGME,GAAmB,CAAC,CAAE,KAAA1C,KAA6B,CACvD,MAAM,EAAIjiB,EAAA,EACJ,CAAE,OAAAukB,EAAQ,WAAAE,GAAeH,GAAQrC,CAAI,EAC3C,OACEpiB,EAAAA,IAAC,SAAA,CACC,QAAS4kB,EACT,UAAU,8HACV,MAAgB,EAATF,EAAW,kBAAuB,oBAAN,EAElC,SAAAA,QAAUK,EAAAA,MAAA,CAAM,KAAM,GAAI,EAAK/kB,EAAAA,IAACglB,EAAAA,KAAA,CAAK,KAAM,EAAA,CAAI,CAAA,CAAA,CAGtD,EAGMC,GAAqB,CAAC,CAAE,KAAA7C,KAA6B,CACzD,MAAM,EAAIjiB,EAAA,EACJ,CAAE,OAAAukB,EAAQ,WAAAE,GAAeH,GAAQrC,CAAI,EAC3C,OACEpiB,EAAAA,IAAC,SAAA,CACC,QAAS4kB,EACT,UAAU,kPACV,MAAgB,EAATF,EAAW,kBAAuB,oBAAN,EAElC,SAAAA,QAAUK,EAAAA,MAAA,CAAM,KAAM,GAAI,EAAK/kB,EAAAA,IAACglB,EAAAA,KAAA,CAAK,KAAM,EAAA,CAAI,CAAA,CAAA,CAGtD,EAGME,GAAiB,CAAC,CAAE,KAAAb,EAAM,KAAAC,KAA2C,CACzE,KAAM,CAAE,KAAAvQ,CAAA,EAASqQ,GAAkBC,EAAMC,CAAI,EAC7C,OACEje,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,qJACb,SAAA,CAAArG,EAAAA,IAAC,OAAA,CAAK,UAAU,kEAAmE,SAAAskB,EAAK,EACxFtkB,EAAAA,IAAC8kB,GAAA,CAAiB,KAAMT,CAAA,CAAM,CAAA,EAChC,EACCtQ,EACC/T,EAAAA,IAAC,MAAA,CACC,UAAU,wGACV,wBAAyB,CAAE,OAAQ+T,CAAA,CAAK,CAAA,EAG1C/T,EAAAA,IAAC,MAAA,CACC,UAAU,qHACV,MAAO,CAAE,SAAU,OAAQ,WAAY,KAAA,EAEvC,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,6CAA8C,SAAAqkB,CAAA,CAAK,CAAA,CAAA,CACrE,EAEJ,CAEJ,EAEalf,GAAoD,CAAC,CAAE,IAAA5C,EAAK,SAAA4iB,EAAW,aAAgB,CAClG,MAAMzqB,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACqiB,EAASC,CAAU,EAAI/hB,EAAAA,SAAiB,EAAE,EAC3C,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAAE,KAAMgiB,CAAA,EAAelB,GAC3Be,IAAa,SAAWC,EAAU,GAClC,UAAA,EAqBF,OAlBA3hB,EAAAA,UAAU,IAAM,EACO,SAAY,CAC/B,GAAI,CACFyQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMsS,EAAO,MAAMmD,GAAchjB,EAAK,CAAE,QAAAW,EAAS,EACjDmiB,EAAWjD,CAAI,CACjB,OAASve,EAAK,CACZiM,EAASpV,EAAE,sBAAsB,CAAC,EAClC,QAAQ,MAAMmJ,CAAG,CACnB,QAAA,CACEqQ,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC3R,EAAKW,EAASxI,CAAC,CAAC,EAEhBuZ,EAEAjU,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIA6P,EAEA7P,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,EACpC,EACF,EAKAsV,IAAa,SAEbnlB,EAAAA,IAAC,MAAA,CAAI,UAAU,yDACZ,SAAAslB,EACCtlB,EAAAA,IAAC,MAAA,CACC,UAAU,sCACV,wBAAyB,CAAE,OAAQslB,CAAA,CAAW,CAAA,EAGhDtlB,EAAAA,IAAC,MAAA,CAAI,UAAU,gGACZ,WACH,EAEJ,QAMD,MAAA,CAAI,UAAU,8DACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,8CACb,SAAAA,EAAAA,IAACwlB,GAAA,CACG,cAAe,CAACC,GAAWC,EAAU,EACrC,cAAe,CAACC,GAAWC,EAAW,EACtC,WAAY,CACV,KAAK,CAAE,KAAAC,EAAM,OAAAC,EAAQ,UAAAllB,EAAW,SAAAhB,EAAU,GAAG+G,GAAc,CACzD,MAAMof,EAAQ,iBAAiB,KAAKnlB,GAAa,EAAE,EAC7ColB,EAAa,OAAOpmB,CAAQ,EAAE,QAAQ,MAAO,EAAE,EACrD,MAAI,CAACkmB,GAAUC,QAELb,GAAA,CAAe,KAAMc,EAAY,KAAMD,EAAM,CAAC,EAAG,EAEtDD,EAgBH9lB,EAAAA,IAAC,OAAA,CACC,UAAU,mIACT,GAAG2G,EAEH,SAAA/G,CAAA,CAAA,EAjBDyG,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAArG,EAAAA,IAACilB,GAAA,CAAmB,KAAMe,CAAA,CAAY,EACtChmB,EAAAA,IAAC,MAAA,CACC,UAAU,oGACV,MAAO,CAAE,SAAU,OAAQ,WAAY,KAAA,EAEvC,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,6CAA8C,SAAAJ,CAAA,CAAS,CAAA,CAAA,CACzE,EACF,CAYN,EACA,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sFACX,SAAAJ,EACH,EAEF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,uEACX,SAAAJ,EACH,EAEF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sEAAuE,SAAAJ,EAAS,EAEhG,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sEAAuE,SAAAJ,EAAS,EAEhG,EAAG,CAAC,CAAE,SAAAA,CAAA,IACJI,EAAAA,IAAC,IAAA,CAAE,UAAU,6DAA8D,SAAAJ,EAAS,EAEtF,EAAG,CAAC,CAAE,KAAAmd,EAAM,SAAAnd,KACVI,EAAAA,IAAC,IAAA,CACC,KAAA+c,EACA,UAAU,wHACV,OAAO,SACP,IAAI,sBAEH,SAAAnd,CAAA,CAAA,EAGL,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sEAAuE,SAAAJ,EAAS,EAEhG,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,yEAA0E,SAAAJ,EAAS,EAEnG,GAAI,CAAC,CAAE,SAAAA,CAAA,IAAeI,EAAAA,IAAC,KAAA,CAAG,UAAU,gBAAiB,SAAAJ,EAAS,EAC9D,WAAY,CAAC,CAAE,SAAAA,CAAA,IACbI,EAAAA,IAAC,aAAA,CAAW,UAAU,0FACnB,SAAAJ,EACH,EAEF,MAAO,CAAC,CAAE,SAAAA,CAAA,IACRI,EAAAA,IAAC,MAAA,CAAI,UAAU,yEACb,SAAAA,EAAAA,IAAC,QAAA,CAAM,UAAU,gDAAiD,SAAAJ,EAAS,EAC7E,EAEF,MAAO,CAAC,CAAE,SAAAA,CAAA,IAAeI,EAAAA,IAAC,QAAA,CAAM,UAAU,mBAAoB,SAAAJ,EAAS,EACvE,MAAO,CAAC,CAAE,SAAAA,CAAA,IACRI,EAAAA,IAAC,QAAA,CAAM,UAAU,oDAAqD,SAAAJ,EAAS,EAEjF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,+CAAgD,SAAAJ,EAAS,EAEzE,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sHACX,SAAAJ,EACH,EAEF,GAAI,CAAC,CAAE,SAAAA,CAAA,IACLI,EAAAA,IAAC,KAAA,CAAG,UAAU,sDAAuD,SAAAJ,EAAS,EAEhF,GAAI,IAAMI,EAAAA,IAAC,KAAA,CAAG,UAAU,0BAAA,CAA2B,EACnD,IAAK,CAAC,CAAE,IAAAimB,EAAK,IAAAC,KACXlmB,EAAAA,IAAC,MAAA,CACC,IAAAimB,EACA,IAAAC,EACA,UAAU,uFAAA,CAAA,EAGd,MAAO,CAAC,CAAE,KAAAxO,EAAM,QAAAyO,EAAS,GAAGxf,KACtB+Q,IAAS,WAET1X,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAAAmmB,EACA,SAAQ,GACR,UAAU,uCACT,GAAGxf,CAAA,CAAA,EAIH3G,EAAAA,IAAC,QAAA,CAAM,KAAA0X,EAAa,GAAG/Q,CAAA,CAAO,EAEvC,OAAQ,CAAC,CAAE,SAAA/G,CAAA,IACTI,EAAAA,IAAC,SAAA,CAAO,UAAU,wCAAyC,SAAAJ,EAAS,EAEtE,GAAI,CAAC,CAAE,SAAAA,CAAA,IAAeI,EAAAA,IAAC,KAAA,CAAG,UAAU,aAAc,SAAAJ,EAAS,EAC3D,IAAK,CAAC,CAAE,SAAAA,KACNI,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAsC,SAAAJ,CAAA,CAAS,CAAA,EAIjE,SAAAwlB,CAAA,CAAA,EAEP,CAAA,CACF,CAEJ,oHC9QMgB,GAA0B,CAC9B,IAAK,UACL,OAAQ,UACR,OAAQ,UACR,QAAS,UACT,QAAS,UACT,MAAO,yBACP,UAAW,yBACX,MAAO,wBACT,EAEMC,GAA2B,CAC/B,IAAK,UACL,OAAQ,UACR,OAAQ,UACR,QAAS,UACT,QAAS,UACT,MAAO,sBACP,UAAW,uBACX,MAAO,sBACT,EAYMC,GAAoC,CAAC,CAAE,QAAAC,EAAS,MAAA1mB,EAAO,MAAAue,EAAO,gBAAAoI,EAAiB,OAAAC,KAAa,CAChG,MAAM/rB,EAAIyF,EAAA,EACJ,CAACumB,EAAUC,CAAW,EAAIrjB,EAAAA,SAASkjB,CAAe,EAClDI,EAASxI,EAAQ,GAEjByI,EAASpc,EAAAA,YAAY,IAAMkc,KAAoB,CAAC7a,CAAI,EAAG,EAAE,EAG/D,GAAIjM,GAAU,MAA+B,OAAOA,GAAU,SAC5D,OACEwG,EAAAA,KAAC,MAAA,CAAI,UAAU,+DAA+D,MAAO,CAAE,YAAa,GAAGugB,CAAM,IAAA,EAC3G,SAAA,CAAA5mB,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAA,CAAoC,EACnDumB,IAAY,QACXlgB,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,MAAO,CAAE,MAAOogB,EAAO,GAAA,EAAO,SAAA,CAAA,IAC9DF,EAAQ,IAACvmB,MAAC,QAAK,MAAO,CAAE,MAAOymB,EAAO,KAAA,EAAS,SAAA,IAAA,CAAE,CAAA,EACrD,EAEDK,GAAgBjnB,EAAO4mB,CAAM,CAAA,EAChC,EAIJ,MAAMM,EAAU,MAAM,QAAQlnB,CAAK,EAE7ByX,GADUyP,EAAWlnB,EAAsB,OAAO,QAAQA,CAAgC,GAC1E,OAChBmnB,EAAcD,EAAU,IAAM,IAC9BE,EAAeF,EAAU,IAAM,IAGrC,OAAIzP,IAAU,EAEVjR,EAAAA,KAAC,MAAA,CAAI,UAAU,+DAA+D,MAAO,CAAE,YAAa,GAAGugB,CAAM,IAAA,EAC3G,SAAA,CAAA5mB,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAA,CAAoC,EACnDumB,IAAY,QACXlgB,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,MAAO,CAAE,MAAOogB,EAAO,GAAA,EAAO,SAAA,CAAA,IAC9DF,EAAQ,IAACvmB,MAAC,QAAK,MAAO,CAAE,MAAOymB,EAAO,KAAA,EAAS,SAAA,IAAA,CAAE,CAAA,EACrD,SAED,OAAA,CAAK,MAAO,CAAE,MAAOA,EAAO,SAAY,SAAA,CAAAO,EAAaC,CAAA,CAAA,CAAa,CAAA,EACrE,SAKD,MAAA,CAEC,SAAA,CAAA5gB,EAAAA,KAAC,MAAA,CACC,UAAU,yHACV,MAAO,CAAE,YAAa,GAAGugB,CAAM,IAAA,EAC/B,QAASC,EAET,SAAA,CAAA7mB,EAAAA,IAAC,QAAK,UAAU,iFAAiF,MAAO,CAAE,MAAOymB,EAAO,KAAA,EACrH,WACGzmB,EAAAA,IAACknB,cAAA,CAAY,UAAU,sBAAsB,QAC5CzlB,EAAAA,aAAA,CAAa,UAAU,sBAAsB,CAAA,CAEpD,EACC8kB,IAAY,QACXlgB,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,MAAO,CAAE,MAAOogB,EAAO,GAAA,EAAO,SAAA,CAAA,IAC9DF,EAAQ,IAACvmB,MAAC,QAAK,MAAO,CAAE,MAAOymB,EAAO,KAAA,EAAS,SAAA,IAAA,CAAE,CAAA,EACrD,EAEFzmB,MAAC,QAAK,MAAO,CAAE,MAAOymB,EAAO,OAAA,EAAY,SAAAO,EAAY,EACpD,CAACN,GACArgB,EAAAA,KAAC,OAAA,CAAK,UAAU,WAAW,MAAO,CAAE,MAAOogB,EAAO,SAAA,EAC/C,SAAA,CAAAM,EAAU,GAAGzP,CAAK,IAAI5c,EAAE,YAAY,CAAC,GAAK,GAAG4c,CAAK,IAAI5c,EAAE,WAAW,CAAC,UACpE,OAAA,CAAK,MAAO,CAAE,MAAO+rB,EAAO,SAAW,SAAA,CAAA,IAAEQ,CAAA,CAAA,CAAa,CAAA,CAAA,CACzD,CAAA,CAAA,CAAA,EAKHP,GACCrgB,EAAAA,KAAAwH,WAAA,CACG,SAAA,CAAAkZ,EACIlnB,EAAoB,IAAI,CAAC2N,EAAMnS,IAC9B2E,MAACsmB,IAAiB,MAAO9Y,EAAM,MAAO4Q,EAAQ,EAAG,gBAAiBA,EAAQ,EAAG,OAAAqI,GAA9DprB,CAA8E,CAC9F,EACD,OAAO,QAAQwE,CAAgC,EAAE,IAAI,CAAC,CAACpF,EAAGyC,CAAC,IACzD8C,MAACsmB,IAAiB,QAAS7rB,EAAG,MAAOyC,EAAG,MAAOkhB,EAAQ,EAAG,gBAAiBA,EAAQ,EAAG,OAAAqI,GAAvEhsB,CAAuF,CACvG,EAELuF,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAsC,MAAO,CAAE,YAAa,GAAG4mB,EAAS,EAAE,KAAM,MAAOH,EAAO,OAAA,EAC1G,SAAAQ,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,EAEA,SAASH,GAAgBjnB,EAAgB4mB,EAAoB,CAC3D,OAAI5mB,IAAU,KAAaG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOymB,EAAO,QAAS,UAAW,QAAA,EAAY,SAAA,OAAI,EACxF5mB,IAAU,OAAkBG,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAOymB,EAAO,QAAS,UAAW,QAAA,EAAY,SAAA,YAAS,EAClG,OAAO5mB,GAAU,gBAAmB,OAAA,CAAK,MAAO,CAAE,MAAO4mB,EAAO,OAAA,EAAY,SAAA,OAAO5mB,CAAK,EAAE,EAC1F,OAAOA,GAAU,eAAkB,OAAA,CAAK,MAAO,CAAE,MAAO4mB,EAAO,MAAA,EAAW,SAAA,OAAO5mB,CAAK,EAAE,EACxF,OAAOA,GAAU,SAAiBwG,EAAAA,KAAC,OAAA,CAAK,MAAO,CAAE,MAAOogB,EAAO,MAAA,EAAU,SAAA,CAAA,IAAE5mB,EAAM,GAAA,EAAC,EAC/EG,MAAC,OAAA,CAAK,MAAO,CAAE,MAAOymB,EAAO,OAAA,EAAY,SAAA,OAAO5mB,CAAK,CAAA,CAAE,CAChE,CAEA,SAASsnB,GAAW1mB,EAAkC,CACpD,OAAOA,IAAU,QAAU4lB,GAAeD,EAC5C,CAIO,MAAM/gB,GAA4C,CAAC,CAAE,IAAA9C,KAAU,CACpE,MAAM,EAAIpC,EAAA,EACJ+C,EAAUH,GAAA,EACV+E,EAAgBpH,GAAA,EAChB+lB,EAAS3mB,EAAAA,QAAQ,IAAMqnB,GAAWrf,CAAa,EAAG,CAACA,CAAa,CAAC,EACjE,CAACsf,EAAMC,CAAO,EAAI/jB,EAAAA,SAAkB,IAAI,EACxC,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAmBtD,OAjBAG,EAAAA,UAAU,IAAM,EACG,SAAY,CAC3B,GAAI,CACFyQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMsS,EAAO,MAAMmD,GAAchjB,EAAK,CAAE,QAAAW,EAAS,EACjDmkB,EAAQ,KAAK,MAAMjF,CAAI,CAAC,CAC1B,OAASve,EAAK,CACZiM,EAAS,EAAE,kBAAkB,CAAC,EAC9B,QAAQ,MAAMjM,CAAG,CACnB,QAAA,CACEqQ,EAAW,EAAK,CAClB,CACF,GACA,CACF,EAAG,CAAC3R,CAAG,CAAC,EAEJ0R,EAEAjU,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIA6P,EAEA7P,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,EACpC,EACF,EAKF7P,EAAAA,IAAC,MAAA,CAAI,UAAU,2EACb,SAAAA,EAAAA,IAACsmB,GAAA,CAAS,MAAOc,EAAM,MAAO,EAAG,gBAAe,GAAC,OAAAX,EAAgB,EACnE,CAEJ,gHCjMalhB,GAA0C,CAAC,CAAE,IAAAhD,EAAK,SAAA2D,KAAe,CAC5E,MAAMxL,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACkR,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChDoN,EAAelN,EAAAA,OAAuB,IAAI,EAC1CuR,EAAiBvR,EAAAA,OAA2B,IAAI,EAChDwR,EAAexR,EAAAA,OAAyC,IAAI,EAC5DyR,EAAoBzR,EAAAA,OAA8B,IAAI,EACtD0R,EAAmB1R,EAAAA,OAAsB,IAAI,EAC7C2R,EAAoB3R,EAAAA,OAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,EAElD4R,EAAsB3K,EAAAA,YAAY,IAAM,CAC5C,GAAI,CAACiG,EAAa,QAAS,MAAO,CAAE,MAAO,IAAK,OAAQ,GAAA,EACxD,MAAM2E,EAAW3E,EAAa,QAAQ,YAChC4E,EAAY5E,EAAa,QAAQ,aACjC/B,EAAQ0G,EAAW,IAAMA,EAAW,IACpCzG,EAAS0G,EAAY,IAAMA,EAAY,IAC7C,MAAO,CAAE,MAAA3G,EAAO,OAAAC,CAAA,CAClB,EAAG,CAAA,CAAE,EAEC2G,EAAmB9K,EAAAA,YAAY,IAAM,CACzC,GAAI,CAACiG,EAAa,SAAW,CAACsE,EAAa,QAAS,OAEpDtE,EAAa,QAAQ,UAAY,GACjCqE,EAAe,QAAU,KAEzB,KAAM,CAAE,MAAApG,EAAO,OAAAC,CAAA,EAAWwG,EAAA,EACpBI,EAAW7G,EAAQ,IAEnBrT,EAAI,IAAIma,GAAY/E,EAAa,QAAS,CAC9C,KAAM,OACN,YAAa,GACb,gBAAiB,GACjB,SAAU,GACV,IAAK,CACH,IAAK,IACL,OAAQ,EAAA,EAEV,IAAK,CACH,IAAK,GACL,MAAO8E,EAAW,GAAK,IACvB,WAAYA,EAAW,GAAK,GAC5B,SAAUA,EAAW,GAAK,EAAA,EAE5B,KAAM,CACJ,OAAQ,IAAM5G,EACd,MAAO,IAAMD,CAAA,CACf,CACD,EAEDrT,EAAE,SAAS0Z,EAAa,OAA6C,EACrED,EAAe,QAAUzZ,CAC3B,EAAG,CAAC8Z,CAAmB,CAAC,EAExB3R,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACiN,EAAa,QAAS,OAE3B,IAAIgF,EAAkB,GAEtB,MAAMC,EAAmB,IAAM,CAC7B,GAAID,EAAiB,CACnBA,EAAkB,GAClBP,EAAkB,QAAUC,EAAA,EAC5B,MACF,CAEA,MAAMQ,EAAgBR,EAAA,EAChBS,EAAiBV,EAAkB,QACnCW,EAAY,KAAK,IAAID,EAAe,MAAQD,EAAc,KAAK,EAC/DG,EAAa,KAAK,IAAIF,EAAe,OAASD,EAAc,MAAM,EAEpEE,EAAY,IAAMC,EAAa,KAEnCZ,EAAkB,QAAUS,EAExBV,EAAiB,SACnB,aAAaA,EAAiB,OAAO,EAGvCA,EAAiB,QAAU,OAAO,WAAW,IAAM,CAC7CF,EAAa,SACfO,EAAA,CAEJ,EAAG,GAAG,EACR,EAEA,OAAAN,EAAkB,QAAU,IAAI,eAAe,IAAM,CACnDU,EAAA,CACF,CAAC,EAEDV,EAAkB,QAAQ,QAAQvE,EAAa,OAAO,EAE/C,IAAM,CACPuE,EAAkB,SACpBA,EAAkB,QAAQ,WAAA,EAExBC,EAAiB,SACnB,aAAaA,EAAiB,OAAO,CAEzC,CACF,EAAG,CAACE,EAAqBG,CAAgB,CAAC,EAE1C9R,EAAAA,UAAU,IAAM,CACd,IAAIuS,EAAY,GAEhB,MAAMsR,EAAU,SAAY,CAC1B,GAAK5W,EAAa,QAElB,CAAAwD,EAAW,EAAI,EACfpE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMsS,EAAO,MAAMmD,GAAchjB,EAAK,CAAE,QAAAW,EAAS,EAC3CqkB,EAASC,GAASpF,EAAM,CAAE,UAAWqF,GAAkBvhB,CAAQ,EAAG,EAClEkQ,EAAYsR,GAA4BH,EAAO,OAAQA,EAAO,KAAMrhB,CAAQ,EAElF,GAAI,CAAC8P,EAAW,OAEhBhB,EAAa,QAAUoB,EACvBb,EAAA,EACArB,EAAW,EAAK,CAClB,OAASrQ,EAAK,CACRmS,IACF,QAAQ,MAAM,YAAanS,CAAG,EAC9BiM,EAASpV,EAAE,iBAAiB,CAAC,EAC7BwZ,EAAW,EAAK,EAEpB,EACF,EAEMqC,EAAQ,WAAW,IAAM,CAC7B,sBAAsB,IAAM,CAC1B+Q,EAAA,CACF,CAAC,CACH,EAAG,GAAG,EAEN,MAAO,IAAM,CACXtR,EAAY,GACZ,aAAaO,CAAK,EAClBvB,EAAa,QAAU,KACnBtE,EAAa,UACfA,EAAa,QAAQ,UAAY,IAEnCqE,EAAe,QAAU,IAC3B,CACF,EAAG,CAACxS,EAAK2D,EAAUqP,CAAgB,CAAC,EAGlClP,EAAAA,KAAC,MAAA,CAAI,UAAU,4EACZ,SAAA,CAAA4N,SACE,MAAA,CAAI,UAAU,6HACb,SAAA5N,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,gKAAA,CAAiK,QAC/K,IAAA,CAAE,UAAU,mEAAoE,SAAAtF,EAAE,aAAa,CAAA,CAAE,CAAA,CAAA,CACpG,CAAA,CACF,EAGDmV,GAAS,CAACoE,GACTjU,EAAAA,IAAC,MAAA,CAAI,UAAU,6HACb,SAAAqG,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAArG,EAAAA,IAAC,OAAI,UAAU,yPACb,eAACwW,EAAAA,gBAAA,CAAgB,UAAU,gEAAgE,CAAA,CAC7F,QACC,IAAA,CAAE,UAAU,sFAAuF,SAAA9b,EAAE,iBAAiB,EAAE,EACzHsF,EAAAA,IAAC,IAAA,CAAE,UAAU,uEAAwE,SAAA6P,CAAA,CAAM,CAAA,CAAA,CAC7F,CAAA,CACF,EAGD,CAACA,GACA7P,EAAAA,IAAC,MAAA,CACC,IAAK0Q,EACL,UAAU,mDACV,MAAO,CAAE,QAASuD,EAAU,EAAI,CAAA,CAAE,CAAA,CACpC,EAEJ,CAEJ,+GCxLM0T,GAAkBC,GAAwB,CAC9C,GAAI,CAEF,MAAMC,EADS,IAAI,UAAA,EACA,gBAAgBD,EAAK,iBAAiB,EAGzD,GADgBC,EAAI,cAAc,aAAa,EAClC,OAAOD,EAGpB,MAAME,EADa,IAAI,cAAA,EACO,kBAAkBD,CAAG,EACnD,OAAOE,GAAUD,CAAU,CAC7B,MAAQ,CACN,OAAOF,CACT,CACF,EAEMG,GAAaH,GAAwB,CACzC,MAAMI,EAAU,KACVC,EAAM,eACZ,IAAIC,EAAYN,EAAI,QAAQK,EAAK;AAAA,KAAU,EAEvCE,EAAM,EACV,OAAOD,EACJ,MAAM;AAAA,CAAI,EACV,IAAKE,GAAS,CACb,IAAIxB,EAAS,EACT,SAAS,KAAKwB,CAAI,EACpBD,EAAM,KAAK,IAAIA,EAAM,EAAG,CAAC,EAChB,oBAAoB,KAAKC,CAAI,GAAK,CAAC,aAAa,KAAKA,CAAI,IAClExB,EAAS,GAEX,MAAMyB,EAASL,EAAQ,OAAOG,CAAG,EAAIC,EACrC,OAAAD,GAAOvB,EACAyB,CACT,CAAC,EACA,KAAK;AAAA,CAAI,CACd,EAEa5iB,GAA0C,CAAC,CAAE,IAAAlD,KAAU,CAClE,MAAM,EAAIpC,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACqiB,EAASC,CAAU,EAAI/hB,EAAAA,SAAiB,EAAE,EAC3C,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAAE,KAAMglB,CAAA,EAAgBlE,GAAkBgB,EAAS,KAAK,EAmB9D,OAjBA3hB,EAAAA,UAAU,IAAM,EACD,SAAY,CACvB,GAAI,CACFyQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMyY,EAAM,MAAMhD,GAAchjB,EAAK,CAAE,QAAAW,EAAS,EAChDmiB,EAAWsC,GAAeY,CAAG,CAAC,CAChC,OAAS1kB,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACjBiM,EAAS,EAAE,iBAAiB,CAAC,CAC/B,QAAA,CACEoE,EAAW,EAAK,CAClB,CACF,GACA,CACF,EAAG,CAAC3R,CAAG,CAAC,EAEJ0R,EAEAjU,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIA6P,EAEA7P,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,EACpC,EACF,EAKF7P,EAAAA,IAAC,MAAA,CAAI,UAAU,yDACZ,SAAAsoB,EACCtoB,EAAAA,IAAC,MAAA,CACC,UAAU,sCACV,wBAAyB,CAAE,OAAQsoB,CAAA,CAAY,CAAA,EAGjDtoB,EAAAA,IAAC,MAAA,CAAI,UAAU,gGACZ,WACH,EAEJ,CAEJ,+GC7FMwoB,GAAgD,CACpD,IAAK,MACL,IAAK,MACL,IAAK,MACL,KAAM,OACN,IAAK,MACL,IAAK,MACL,KAAM,OACN,KAAM,MACR,EAEMC,GAAaviB,GAAiD,OAClE,MAAM6G,IAAMxL,EAAA2E,EAAS,MAAM,GAAG,EAAE,IAAA,IAApB,YAAA3E,EAA2B,gBAAiB,GACxD,OAAOinB,GAAczb,CAAG,CAC1B,EAEapH,GAAoD,CAAC,CAAE,IAAApD,EAAK,SAAA2D,KAAe,CACtF,MAAMxL,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACqf,EAAMsG,CAAO,EAAIplB,EAAAA,SAAiB,EAAE,EACrC,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAEtDG,EAAAA,UAAU,IAAM,EACD,SAAY,CACvB,GAAI,CACFyQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb4Y,EAAQ,MAAMnD,GAAchjB,EAAK,CAAE,QAAAW,CAAA,CAAS,CAAC,CAC/C,OAASW,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACjBiM,EAASpV,EAAE,sBAAsB,CAAC,CACpC,QAAA,CACEwZ,EAAW,EAAK,CAClB,CACF,GACA,CACF,EAAG,CAAC3R,CAAG,CAAC,EAER,MAAMglB,EAAqCznB,EAAAA,QAAQ,IAAM,CACvD,GAAI,CAACsiB,EAAM,OAAO,KAClB,GAAI,CACF,OAAOuG,GAAcvG,EAAMqG,GAAUviB,CAAQ,CAAC,CAChD,OAASrC,EAAK,CACZ,eAAQ,MAAMA,CAAG,EACV,IACT,CACF,EAAG,CAACue,EAAMlc,CAAQ,CAAC,EAEnB,GAAI+N,EACF,OACEjU,MAAC,OAAI,UAAU,sFACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIJ,GAAI6P,GAAS,CAAC0X,EACZ,aACG,MAAA,CAAI,UAAU,sFACb,SAAAvnB,EAAAA,IAAC,OAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,GAASnV,EAAE,uBAAuB,EAAE,EAClE,CAAA,CACF,EAIJ,MAAMkuB,EAAUrB,EAAO,SAAW,OAASA,EAAO,SAAW,OACvDsB,EAAOtB,EAAO,UAAY,CAAA,EAC1BuB,EAAWF,EAAU,gCAAkC,6BAE7D,OACEviB,EAAAA,KAAC,MAAA,CAAI,UAAU,sDAEb,SAAA,CAAArG,EAAAA,IAAC,OAAI,UAAU,gGACb,SAAAqG,EAAAA,KAAC,MAAA,CAAI,UAAU,yCAEb,SAAA,CAAArG,EAAAA,IAAC,MAAA,CAAI,UAAU,gGAAA,CAAiG,EAEhHA,EAAAA,IAAC,KAAA,CAAG,UAAU,iCACX,SAAAunB,EAAO,KAAK,IAAI,CAACwB,EAAK1tB,IACrBgL,OAAC,KAAA,CAAoB,UAAU,8CAE7B,SAAA,CAAArG,EAAAA,IAAC,MAAA,CACC,UAAW,+IAA+I8oB,CAAQ,EAAA,CAAA,EAGpKziB,EAAAA,KAAC,MAAA,CAAI,UAAU,+EACb,SAAA,CAAArG,MAAC,QAAK,UAAU,mEACb,SAAAgpB,GAAmBD,EAAI,KAAK,EAC/B,EACA/oB,EAAAA,IAAC,OAAA,CAAK,UAAU,uCAAuC,SAAA,IAAC,QACvD,OAAA,CAAK,UAAU,mEACb,SAAAgpB,GAAmBD,EAAI,GAAG,EAC7B,EACA1iB,EAAAA,KAAC,OAAA,CAAK,UAAU,sEAAsE,SAAA,CAAA,IAClF0iB,EAAI,IAAM1tB,EAAI,CAAA,EAClB,EACC0tB,EAAI,OACH/oB,EAAAA,IAAC,QAAK,UAAU,2JACb,WAAI,KAAA,CACP,CAAA,EAEJ,EAEC+oB,EAAI,OAASA,EAAI,MAAM,OAAS,EAC/B/oB,EAAAA,IAAC,MAAA,CAAI,UAAU,8KACZ,SAAA+oB,EAAI,MAAM,IAAI,CAACE,EAAMC,IACpB7iB,EAAAA,KAAC,OAAA,CAEC,UAAU,+CACV,MAAO2iB,GAAmBC,EAAK,KAAK,EAEpC,SAAA,CAAAjpB,EAAAA,IAAC,OAAA,CAAK,UAAU,sFACb,SAAAgpB,GAAmBC,EAAK,KAAK,EAAE,MAAM,EAAG,CAAC,CAAA,CAC5C,EACAjpB,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAoB,WAAK,IAAA,CAAK,CAAA,CAAA,EAPzC,KAAKkpB,CAAE,EAAA,CASf,EACH,EAEAlpB,EAAAA,IAAC,IAAA,CACC,UAAW,yIACT4oB,EAAU,+CAAiD,8BAC7D,GAEC,SAAAG,EAAI,IAAA,CAAA,CACP,CAAA,EA9CK,OAAO1tB,CAAC,EAgDjB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,EAGAgL,EAAAA,KAAC,MAAA,CAAI,UAAU,iTACb,SAAA,CAAAA,OAAC,OAAA,CAAM,SAAA,CAAAkhB,EAAO,KAAK,OAAO,IAAY7sB,EAAVkuB,EAAY,iBAAsB,eAAN,CAAqB,EAAE,EAC9EC,EAAK,QACJxiB,EAAAA,KAAAwH,EAAAA,SAAA,CACE,SAAA,CAAA7N,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAuB,SAAA,IAAC,EACxCA,EAAAA,IAAC,OAAA,CAAM,SAAA6oB,EAAK,MAAA,CAAO,CAAA,CAAA,CACrB,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,oHCtIaM,GAAgD,CAAC,CAC5D,KAAAC,EACA,MAAAC,EACA,iBAAAC,EAAmB,IACnB,aAAAC,EAAe,IACf,aAAAC,EAAe,IACf,cAAAC,EAAgB,IAChB,WAAAC,EACA,aAAAC,EAAe,qBACf,UAAA/oB,EAAY,EACd,IAAM,CACJ,MAAM8P,EAAelN,EAAAA,OAAuB,IAAI,EAC1C,CAAComB,EAAWC,CAAY,EAAIvmB,EAAAA,SAAiB,IAAM,CACvD,GAAIomB,GAAc,OAAO,OAAW,IAAa,CAC/C,MAAMI,EAAQ,OAAO,OAAO,aAAa,QAAQJ,CAAU,CAAC,EAC5D,GAAI,CAAC,MAAMI,CAAK,GAAKA,EAAQ,EAAG,OAAOA,CACzC,CACA,OAAOR,CACT,CAAC,EACK,CAACS,EAAUC,CAAW,EAAI1mB,EAAAA,SAAS,EAAK,EACxC,CAAC2mB,EAAWC,CAAY,EAAI5mB,EAAAA,SAAS,EAAK,EAGhDG,EAAAA,UAAU,IAAM,CACd,GAAI,OAAO,OAAW,IAAa,OACnC,MAAM0mB,EAAK,OAAO,WAAWR,CAAY,EACnC9hB,EAAU,IAAMqiB,EAAaC,EAAG,OAAO,EAC7C,OAAAtiB,EAAA,EACAsiB,EAAG,iBAAiB,SAAUtiB,CAAO,EAC9B,IAAMsiB,EAAG,oBAAoB,SAAUtiB,CAAO,CACvD,EAAG,CAAC8hB,CAAY,CAAC,EAGjBlmB,EAAAA,UAAU,IAAM,CACd,GAAI,CAACsmB,EAAU,OACf,MAAMK,EAAc7vB,GAAkB,CACpC,GAAI,CAACmW,EAAa,QAAS,OAC3B,MAAMiB,EAAOjB,EAAa,QAAQ,sBAAA,EAC5BzT,EAAI1C,EAAE,QAAUoX,EAAK,KACrB0Y,EAAM1Y,EAAK,MAAQ8X,EAAgB,EACnCa,EAAe,KAAK,IAAId,EAAca,CAAG,EACzCE,EAAO,KAAK,IAAIhB,EAAc,KAAK,IAAIe,EAAcrtB,CAAC,CAAC,EAC7D4sB,EAAaU,CAAI,CACnB,EACMC,EAAW,IAAMR,EAAY,EAAK,EACxC,OAAO,iBAAiB,YAAaI,CAAU,EAC/C,OAAO,iBAAiB,UAAWI,CAAQ,EAC3C,MAAMC,EAAa,SAAS,KAAK,MAAM,OACjCC,EAAa,SAAS,KAAK,MAAM,WACvC,gBAAS,KAAK,MAAM,OAAS,aAC7B,SAAS,KAAK,MAAM,WAAa,OAC1B,IAAM,CACX,OAAO,oBAAoB,YAAaN,CAAU,EAClD,OAAO,oBAAoB,UAAWI,CAAQ,EAC9C,SAAS,KAAK,MAAM,OAASC,EAC7B,SAAS,KAAK,MAAM,WAAaC,CACnC,CACF,EAAG,CAACX,EAAUR,EAAcC,EAAcC,CAAa,CAAC,EAGxDhmB,EAAAA,UAAU,IAAM,CACd,GAAI,GAACimB,GAAcK,GACnB,GAAI,CACF,OAAO,aAAa,QAAQL,EAAY,OAAOE,CAAS,CAAC,CAC3D,MAAQ,CAER,CACF,EAAG,CAACA,EAAWF,EAAYK,CAAQ,CAAC,EAEpC,MAAMY,EAAoBlgB,cAAalQ,GAAwB,CAC7DA,EAAE,eAAA,EACFyvB,EAAY,EAAI,CAClB,EAAG,CAAA,CAAE,EAEL,OACE3jB,EAAAA,KAAC,MAAA,CACC,IAAKqK,EACL,UAAW,uFAAuF9P,CAAS,GAE3G,SAAA,CAAAZ,EAAAA,IAAC,MAAA,CACC,UAAU,oGACV,MAAOiqB,EAAY,CAAE,MAAO,GAAGL,CAAS,MAAS,OAEhD,SAAAR,CAAA,CAAA,EAGHppB,EAAAA,IAAC,MAAA,CACC,KAAK,YACL,mBAAiB,WACjB,YAAa2qB,EACb,UAAW,gHACTZ,EAAW,yBAA2B,yCACxC,GAGA,SAAA/pB,EAAAA,IAAC,OAAA,CAAK,UAAU,qDAAA,CAAsD,CAAA,CAAA,EAExEA,EAAAA,IAAC,MAAA,CAAI,UAAU,yDAA0D,SAAAqpB,CAAA,CAAM,CAAA,CAAA,CAAA,CAGrF,ECpGMuB,GAAyB7mB,EAAAA,KAAK,IAClC,QAAA,QAAA,EAAA,KAAA,IAAA8mB,EAAA,EAAmC,SAAW,CAAE,QAASvtB,EAAE,oBAAqB,CAClF,EAkBMwtB,GAAe3f,GAAiB,CACpC,MAAMnQ,EAAKiQ,GAAY,CAAU,KAAAE,EAAe,KAAM,EAAA,CAAI,EAC1D,OAAInQ,IAAO,QAAgB+vB,EAAAA,UACvB/vB,IAAO,QAAUA,IAAO,YAAcA,IAAO,QAAUA,IAAO,OAASA,IAAO,OAASA,IAAO,WACzFmQ,EAAK,SAAS,KAAK,GAAKA,EAAK,SAAS,WAAW,EAAI6f,EAAAA,SAAWC,EAAAA,SAElEC,EAAAA,IACT,EAuBMC,GAAoC,CAAC,CACzC,KAAAtF,EACA,MAAAzH,EACA,aAAAgN,EACA,SAAA1E,EACA,SAAA2E,EACA,SAAAC,EACA,QAAAC,EACA,QAAAC,CACF,IAAM,OACJ,MAAMrd,EAASuY,EAAS,IAAIb,EAAK,IAAI,EAC/B4F,EAAaL,IAAiBvF,EAAK,KACnCsC,EAAM,CAAE,YAAa,GAAG/J,EAAQ,GAAK,EAAE,IAAA,EACvCsN,EAAenxB,GAAqC,CACxD,MAAMoX,EAAQpX,EAAE,cAA8B,sBAAA,EAC9CgxB,EAAQ1F,EAAK,MAAQ,IAAKlU,CAAI,CAChC,EAEA,GAAIkU,EAAK,MACP,OACExf,EAAAA,KAAAwH,WAAA,CACE,SAAA,CAAAxH,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMglB,EAASxF,EAAK,IAAI,EACjC,aAAc6F,EACd,aAAcF,EACd,UAAU,8IACV,MAAOrD,EAEP,SAAA,CAAAnoB,EAAAA,IAACyB,EAAAA,aAAA,CACC,UAAW,kEACT0M,EAAS,gBAAkB,EAC7B,EAAA,CAAA,EAEDA,QACEwd,aAAA,CAAW,UAAU,0DAA0D,EAEhF3rB,EAAAA,IAAC4rB,EAAAA,OAAA,CAAO,UAAU,yDAAA,CAA0D,QAE7E,OAAA,CAAK,UAAU,sCAAuC,SAAA/F,EAAK,MAAQ,GAAA,CAAI,CAAA,CAAA,CAAA,EAEzE1X,KACC5M,EAAAskB,EAAK,WAAL,YAAAtkB,EAAe,IAAKqT,GAClB5U,EAAAA,IAACmrB,GAAA,CAEC,KAAMvW,EACN,MAAOwJ,EAAQ,EACf,aAAAgN,EACA,SAAA1E,EACA,SAAA2E,EACA,SAAAC,EACA,QAAAC,EACA,QAAAC,CAAA,EARK5W,EAAM,IAAA,GAUd,EACL,EAIJ,MAAMiX,EAAOf,GAAYjF,EAAK,IAAI,EAElC,OACExf,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMilB,EAASzF,CAAI,EAC5B,aAAc6F,EACd,aAAcF,EACd,UAAW,kGACTC,EAAa,uCAAyC,8CACxD,GACA,MAAOtD,EAEP,SAAA,CAAAnoB,EAAAA,IAAC,OAAA,CAAK,UAAU,uCAAA,CAAwC,EACxDA,EAAAA,IAAC6rB,EAAA,CAAK,UAAU,wDAAA,CAAyD,EACzE7rB,EAAAA,IAAC,OAAA,CAAK,UAAU,sCAAuC,WAAK,KAAK,QAChE,OAAA,CAAK,UAAU,8DACb,SAAA+B,GAAe8jB,EAAK,IAAI,CAAA,CAC3B,CAAA,CAAA,CAAA,CAGN,EAIahgB,GAA0C,CAAC,CAAE,IAAAtD,EAAK,aAAAupB,EAAe,EAAG,cAAAC,KAAoB,OACnG,MAAMrxB,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACipB,EAAKC,CAAM,EAAI3oB,EAAAA,SAAuB,IAAI,EAC3C,CAAC4oB,EAAMC,CAAO,EAAI7oB,EAAAA,SAA6B,IAAI,EACnD,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD,CAACojB,EAAUC,CAAW,EAAIrjB,EAAAA,aAA0B,IAAI,CAAC,EAAE,CAAC,CAAC,EAC7D,CAAC8oB,EAAUC,CAAW,EAAI/oB,EAAAA,SAAiC,IAAI,EAC/D,CAACgpB,EAAgBC,CAAiB,EAAIjpB,EAAAA,SAAS,EAAK,EACpD,CAACkpB,EAAcC,CAAe,EAAInpB,EAAAA,SAAwB,IAAI,EAC9D,CAACopB,EAAUC,CAAW,EAAIrpB,EAAAA,SAA+B,IAAI,EAC7DspB,EAAmBppB,EAAAA,OAAOuoB,CAAa,EAE7CtoB,EAAAA,UAAU,IAAM,CACdmpB,EAAiB,QAAUb,CAC7B,EAAG,CAACA,CAAa,CAAC,EAElBtoB,EAAAA,UAAU,IAAM,CACd,IAAIC,EAAY,GA0BhB,OAzBa,SAAY,CACvB,GAAI,CACFwQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMmP,EAAM,MAAM/b,EAAQX,CAAG,EAC7B,GAAI,CAAC0c,EAAI,GAAI,MAAM,IAAI,MAAM,MAAM,EACnC,MAAM4N,EAAM,MAAM5N,EAAI,YAAA,EAChB/iB,EAAI,MAAM4wB,GAAQD,CAAG,EAC3B,GAAInpB,EAAW,OACf,MAAMqpB,EAAUC,GAAe9wB,CAAC,EAC1B+wB,EAAOC,GAAaH,CAAO,EACjCd,EAAO/vB,CAAC,EACRiwB,EAAQc,CAAI,EACZ,MAAMzqB,EAAO,IAAI,IAAY,CAAC,EAAE,CAAC,EACjC,GAAIyqB,EAAK,SACP,UAAW1xB,KAAK0xB,EAAK,SAAc1xB,EAAE,OAAOiH,EAAK,IAAIjH,EAAE,IAAI,EAE7DorB,EAAYnkB,CAAI,CAClB,OAASqB,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACZH,GAAWoM,EAASpV,EAAE,iBAAiB,CAAC,CAC/C,QAAA,CACOgJ,GAAWwQ,EAAW,EAAK,CAClC,CACF,GACA,EACO,IAAM,CACXxQ,EAAY,EACd,CACF,EAAG,CAACnB,CAAG,CAAC,EAGRkB,EAAAA,UAAU,IACD,IAAM,CACP2oB,GAAA,MAAAA,EAAU,SAAS,IAAI,gBAAgBA,EAAS,OAAO,CAC7D,EACC,CAACA,CAAQ,CAAC,EAEb,MAAMe,EAAartB,EAAAA,QAAgC,IAAM,CACvD,GAAI,CAACosB,EAAM,OAAO,KAClB,IAAIrlB,EAAQ,EACRumB,EAAO,EACP9S,EAAO,EACX,MAAM+S,EAAQ7yB,GAAmB,OAC3BA,EAAE,OACAA,EAAE,MAAM4yB,KACZ7rB,EAAA/G,EAAE,WAAF,MAAA+G,EAAY,QAAQ8rB,KAEpBxmB,IACAyT,GAAQ9f,EAAE,KAEd,EACA,OAAA6yB,EAAKnB,CAAI,EACF,CAAE,MAAArlB,EAAO,KAAAumB,EAAM,KAAA9S,CAAA,CACxB,EAAG,CAAC4R,CAAI,CAAC,EAGTzoB,EAAAA,UAAU,IAAM,OACd,OAAAlC,EAAAqrB,EAAiB,UAAjB,MAAArrB,EAAA,KAAAqrB,EAA2BO,GACpB,IAAM,QACX5rB,EAAAqrB,EAAiB,UAAjB,MAAArrB,EAAA,KAAAqrB,EAA2B,KAC7B,CACF,EAAG,CAACO,CAAU,CAAC,EAEf,MAAMG,EAAe7iB,cAAa8iB,GAAiB,CACjD5G,EAAa7a,GAAS,CACpB,MAAMkW,EAAO,IAAI,IAAIlW,CAAI,EACzB,OAAIkW,EAAK,IAAIuL,CAAI,EAAGvL,EAAK,OAAOuL,CAAI,EAC/BvL,EAAK,IAAIuL,CAAI,EACXvL,CACT,CAAC,CACH,EAAG,CAAA,CAAE,EAECwL,EAAc/iB,EAAAA,YAAY,CAAC2X,EAAczQ,IAAkB,CAC/Dgb,EAAY,CACV,KAAAvK,EACA,EAAGzQ,EAAK,MAAQ,EAChB,EAAGA,EAAK,IAAMA,EAAK,OAAS,CAAA,CAC7B,CACH,EAAG,CAAA,CAAE,EAEC8b,EAAchjB,EAAAA,YAAY,IAAM,CACpCkiB,EAAY,IAAI,CAClB,EAAG,CAAA,CAAE,EAECe,EAAejjB,EAAAA,YACnB,MAAOob,GAAsB,CAC3B,GAAI,GAACmG,GAAOnG,EAAK,OACjB,CAAIuG,GAAA,MAAAA,EAAU,SAAS,IAAI,gBAAgBA,EAAS,OAAO,EAC3DG,EAAkB,EAAI,EACtBE,EAAgB,IAAI,EAEpB,GAAI,CACF,MAAMkB,EAAOC,GAAc/H,EAAK,IAAI,EAC9B3G,EAAO,MAAM2O,GAAiB7B,EAAKnG,EAAK,KAAM8H,IAAS,2BAA6BA,EAAO,MAAS,EACpG/pB,EAAU,IAAI,gBAAgBsb,CAAI,EACxCmN,EAAY,CAAE,KAAMxG,EAAK,KAAM,KAAMA,EAAK,KAAM,KAAMA,EAAK,KAAM,QAAAjiB,CAAA,CAAS,CAC5E,OAASC,EAAK,CACZ,QAAQ,MAAMA,CAAG,EACjB4oB,EAAgB,QAAQ,CAC1B,QAAA,CACEF,EAAkB,EAAK,CACzB,EACF,EACA,CAACP,EAAKI,CAAQ,CAAA,EAGhB,GAAInY,EACF,OACEjU,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIJ,GAAI6P,GAAS,CAACqc,EACZ,aACG,MAAA,CAAI,UAAU,qEACb,SAAAlsB,EAAAA,IAAC,OAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,GAASnV,EAAE,kBAAkB,EAAE,EAC7D,CAAA,CACF,EAKJ,MAAMozB,QACH,MAAA,CAAI,UAAU,0CACZ,UAAAvsB,EAAA2qB,EAAK,WAAL,YAAA3qB,EAAe,IAAKqT,GACnB5U,EAAAA,IAACmrB,GAAA,CAEC,KAAMvW,EACN,MAAO,EACP,cAAcwX,GAAA,YAAAA,EAAU,OAAQ,KAChC,SAAA1F,EACA,SAAU4G,EACV,SAAUI,EACV,QAASF,EACT,QAASC,CAAA,EARJ7Y,EAAM,IAAA,GAWjB,EAIImZ,EACJ1nB,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACZ,SAAA,CAAA,CAAC+lB,GACApsB,EAAAA,IAAC,MAAA,CAAI,UAAU,gGAAgG,SAAA,eAE/G,EAEDosB,GAAYE,GACXtsB,EAAAA,IAAC,MAAA,CAAI,UAAU,0DACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,iHAAA,CAAkH,CAAA,CACnI,EAEDosB,GAAY,CAACE,GAAkBE,SAC7B,MAAA,CAAI,UAAU,gFACZ,SAAAA,EACH,EAEDJ,GAAY,CAACE,GAAkB,CAACE,GAC/BxsB,EAAAA,IAAA6N,EAAAA,SAAA,CACE,SAAA7N,EAAAA,IAAC,MAAA,CAAI,UAAU,2EACb,SAAAA,EAAAA,IAAC4N,EAAAA,SAAA,CACC,eACG,MAAA,CAAI,UAAU,0DACb,SAAA5N,EAAAA,IAAC,MAAA,CAAI,UAAU,iHAAA,CAAkH,CAAA,CACnI,EAGF,SAAAA,EAAAA,IAAC4qB,GAAA,CACC,KAAK,QACL,MAAO,CAAC,CAAE,KAAMwB,EAAS,KAAM,IAAKA,EAAS,QAAS,KAAMwB,GAAcxB,EAAS,IAAI,EAAG,EAC1F,aAAc,EACd,gBAAiBN,EAAe,CAAA,CAAA,CAClC,CAAA,EAEJ,CAAA,CACF,CAAA,EAEJ,EAGF,OACEzlB,EAAAA,KAAAwH,WAAA,CACE,SAAA,CAAA7N,EAAAA,IAACmpB,GAAA,CACC,KAAM2E,EACN,MAAOC,EACP,iBAAkB,IAClB,aAAc,IACd,aAAc,IACd,WAAW,oBAAA,CAAA,EAGZrB,GACC,OAAO,SAAa,KACpBje,GAAAA,aACEzO,EAAAA,IAAC,MAAA,CACC,UAAU,6KACV,MAAO,CACL,KAAM,GAAG0sB,EAAS,CAAC,KACnB,IAAK,GAAGA,EAAS,CAAC,KAClB,UAAW,kBAAA,EAGZ,SAAAA,EAAS,IAAA,CAAA,EAEZ,SAAS,IAAA,CACX,EACJ,CAEJ,+GC/Xa3mB,GAA4C,CAAC,CACxD,IAAAxD,EACA,SAAA2D,EACA,SAAA8nB,EAAW,GACX,YAAAC,EAAc,EAChB,IAAM,CACJ,MAAMvzB,EAAIyF,EAAA,EACJ+C,EAAUH,GAAA,EACV,CAACqiB,EAASC,CAAU,EAAI/hB,EAAAA,SAAiB,EAAE,EAC3C,CAAC2Q,EAASC,CAAU,EAAI5Q,EAAAA,SAAS,EAAI,EACrC,CAACuM,EAAOC,CAAQ,EAAIxM,EAAAA,SAAwB,IAAI,EAChD4qB,EAAWC,GAAwBjoB,CAAQ,EAC3C,CAAE,KAAMoiB,CAAA,EAAgBlE,GAC5B8J,IAAa,OAAS9I,EAAU,GAChC8I,CAAA,EAqBF,OAlBAzqB,EAAAA,UAAU,IAAM,EACG,SAAY,CAC3B,GAAI,CACFyQ,EAAW,EAAI,EACfpE,EAAS,IAAI,EACb,MAAMsS,EAAO,MAAMmD,GAAchjB,EAAK,CAAE,QAAAW,EAAS,EACjDmiB,EAAWjD,CAAI,CACjB,OAASve,EAAK,CACZiM,EAASpV,EAAE,kBAAkB,CAAC,EAC9B,QAAQ,MAAMmJ,CAAG,CACnB,QAAA,CACEqQ,EAAW,EAAK,CAClB,CACF,GAEA,CACF,EAAG,CAAC3R,CAAG,CAAC,EAEJ0R,EAEAjU,MAAC,OAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,oHAAoH,CAAA,CACrI,EAIA6P,EAEA7P,EAAAA,IAAC,MAAA,CAAI,UAAU,qEACb,eAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAA6P,CAAA,CAAM,EACpC,EACF,EAKAoe,GAAgBC,IAAa,OAE7BluB,EAAAA,IAAC,MAAA,CAAI,UAAU,+CACb,SAAAA,EAAAA,IAAC,SAAA,CACC,OAAQolB,EACR,QAAQ,oBACR,UAAU,qCACV,MAAOlf,CAAA,CAAA,EAEX,QAMD,MAAA,CAAI,UAAU,yDACZ,SAAAgoB,IAAa,QAAU,CAAC5F,EACvBtoB,EAAAA,IAAC,MAAA,CACC,UAAW,yDACTguB,EAAW,0CAA4C,oBACzD,GAEC,SAAA5I,CAAA,CAAA,EAGHplB,EAAAA,IAAC,MAAA,CACC,UAAW,uCAAuCguB,EAAW,GAAK,SAAS,GAC3E,wBAAyB,CAAE,OAAQ1F,CAAA,CAAY,CAAA,EAGrD,CAEJ"}
|