react-os-shell 0.1.36 → 0.1.37

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.
@@ -0,0 +1,6 @@
1
+ export { Preview as default, setPdfPreview } from './chunk-4UVDCFGA.js';
2
+ import './chunk-WIJ45SYD.js';
3
+ import './chunk-44AH2OXU.js';
4
+ import './chunk-RFTLYCSF.js';
5
+ //# sourceMappingURL=Preview-5VINW3VH.js.map
6
+ //# sourceMappingURL=Preview-5VINW3VH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-WIXANNFW.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-5VINW3VH.js"}
@@ -1,4 +1,4 @@
1
- export { setPdfPreview } from '../chunk-IQWRDQHW.js';
1
+ export { setPdfPreview } from '../chunk-4UVDCFGA.js';
2
2
  import '../chunk-WIJ45SYD.js';
3
3
  import '../chunk-44AH2OXU.js';
4
4
  import '../chunk-RFTLYCSF.js';
@@ -19,7 +19,7 @@ var Minesweeper = lazy(() => import('../Minesweeper-7OGCUAKF.js'));
19
19
  var Email = lazy(() => import('../Email-66BDCI2Q.js'));
20
20
  var GeminiChat = lazy(() => import('../GeminiChat-BXLBJFT4.js'));
21
21
  var Calendar = lazy(() => import('../Calendar-7DNNMOKO.js'));
22
- var Preview = lazy(() => import('../Preview-WIXANNFW.js'));
22
+ var Preview = lazy(() => import('../Preview-5VINW3VH.js'));
23
23
  var Documents = lazy(() => import('../Documents-PK7QFWGR.js'));
24
24
  var utilityApps = {
25
25
  "/calculator": { component: Calculator, label: "Calculator", size: "sm", allowPinOnTop: true, utility: true, widget: true, autoHeight: true, dimensions: [280, 420] },
@@ -824,6 +824,14 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
824
824
  const AlwaysStencilFunc = 519, NotEqualStencilFunc = 517;
825
825
  const IncrementWrapStencilOp = 7682, DecrementWrapStencilOp = 7683;
826
826
  const ReplaceStencilOp = 7681;
827
+ let hasStencil = true;
828
+ try {
829
+ const gl = renderer.getContext?.();
830
+ const attrs = gl?.getContextAttributes?.();
831
+ hasStencil = attrs?.stencil !== false;
832
+ console.info("[Preview] section: stencil buffer =", hasStencil, "autoClearStencil =", renderer.autoClearStencil);
833
+ } catch {
834
+ }
827
835
  const plane = { normal: { x: 0, y: 0, z: -1 }, constant: 0 };
828
836
  const helpers = [];
829
837
  const materialState = /* @__PURE__ */ new Map();
@@ -838,9 +846,10 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
838
846
  const mat = mesh.material;
839
847
  if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);
840
848
  else applyToMaterial(mat);
841
- if (Mesh && Material) {
849
+ const sourceMat2 = Array.isArray(mat) ? mat[0] : mat;
850
+ if (Mesh && hasStencil && sourceMat2?.clone) {
842
851
  const makeStencil = (side, op) => {
843
- const m = new Material();
852
+ const m = sourceMat2.clone();
844
853
  m.depthWrite = false;
845
854
  m.depthTest = false;
846
855
  m.colorWrite = false;
@@ -850,8 +859,10 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
850
859
  m.stencilZFail = op;
851
860
  m.stencilZPass = op;
852
861
  m.side = side;
862
+ m.transparent = false;
853
863
  m.clippingPlanes = [plane];
854
864
  m.clipShadows = true;
865
+ m.needsUpdate = true;
855
866
  const helper = new Mesh(mesh.geometry, m);
856
867
  helper.matrixAutoUpdate = false;
857
868
  helper.renderOrder = 1;
@@ -869,7 +880,8 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
869
880
  else applyToMaterial(mat);
870
881
  });
871
882
  let capMesh = null;
872
- if (Mesh && Material && Geometry && BufferAttr) {
883
+ const sourceMat = targets[0]?.material && (Array.isArray(targets[0].material) ? targets[0].material[0] : targets[0].material);
884
+ if (hasStencil && Mesh && Geometry && BufferAttr && sourceMat?.clone) {
873
885
  const dx = bbox.max.x - bbox.min.x;
874
886
  const dy = bbox.max.y - bbox.min.y;
875
887
  const dz = bbox.max.z - bbox.min.z;
@@ -907,11 +919,13 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
907
919
  capGeom.setAttribute("position", new BufferAttr(positions, 3));
908
920
  capGeom.setAttribute("normal", new BufferAttr(normals, 3));
909
921
  capGeom.setIndex([0, 1, 2, 0, 2, 3]);
910
- const capMat = new Material();
911
- const m = /^#?([0-9a-f]{6})$/i.exec(sectionCapColor);
912
- const colorHex = m ? parseInt(m[1], 16) : 13159633;
922
+ const capMat = sourceMat.clone();
923
+ const mhex = /^#?([0-9a-f]{6})$/i.exec(sectionCapColor);
924
+ const colorHex = mhex ? parseInt(mhex[1], 16) : 13159633;
913
925
  capMat.color?.setHex?.(colorHex);
914
926
  capMat.side = DoubleSide;
927
+ capMat.transparent = false;
928
+ capMat.opacity = 1;
915
929
  capMat.stencilWrite = true;
916
930
  capMat.stencilRef = 0;
917
931
  capMat.stencilFunc = NotEqualStencilFunc;
@@ -919,6 +933,7 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
919
933
  capMat.stencilZFail = ReplaceStencilOp;
920
934
  capMat.stencilZPass = ReplaceStencilOp;
921
935
  capMat.clippingPlanes = [];
936
+ capMat.needsUpdate = true;
922
937
  capMesh = new Mesh(capGeom, capMat);
923
938
  capMesh.renderOrder = 2;
924
939
  capMesh.userData.__sectionHelper = true;
@@ -1354,5 +1369,5 @@ function ImagePanel({ url, filename, onDownload, onEmail }) {
1354
1369
  }
1355
1370
 
1356
1371
  export { Preview, setPdfPreview };
1357
- //# sourceMappingURL=chunk-IQWRDQHW.js.map
1358
- //# sourceMappingURL=chunk-IQWRDQHW.js.map
1372
+ //# sourceMappingURL=chunk-4UVDCFGA.js.map
1373
+ //# sourceMappingURL=chunk-4UVDCFGA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/apps/Preview.tsx"],"names":["sourceMat"],"mappings":"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","file":"chunk-4UVDCFGA.js","sourcesContent":["/**\n * Preview — windowed PDF viewer app.\n *\n * Consumers stage a PDF via `setPdfPreview({ url, filename, ... })` and then\n * call `openPage('/preview')`. If the window is already open, it swaps to the\n * new PDF in-place via a custom event.\n */\nimport { useState, useEffect, useRef } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport toast from '../shell/toast';\nimport { WindowTitle, getActiveModalId } from '../shell/Modal';\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\n// Default the worker to the matching unpkg build (mirrors the consumer's\n// installed npm version exactly). Consumers can override by setting\n// pdfjsLib.GlobalWorkerOptions.workerSrc themselves before opening the\n// Preview window.\nif (typeof window !== 'undefined' && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc =\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`;\n}\n\nexport interface PdfPreviewData {\n /** Object URL or remote URL of the PDF. Blob URLs are revoked when the window unmounts.\n * Leave blank when staging a `converting: true` placeholder; call `setPdfPreview` again\n * with the resolved URL once conversion finishes. */\n url?: string;\n /** Display name (and download filename). */\n filename: string;\n /** Renderer to use. Defaults to `'pdf'`. `'dxf'` requires the consumer to\n * have `dxf-viewer` installed (it's an optional peer dep). `'image'`\n * renders an `<img>` for raster screenshots / photos. `'3d'` covers\n * STEP / STL / OBJ / GLTF / 3MF / IGES via the optional\n * `online-3d-viewer` peer dep. */\n kind?: 'pdf' | 'dxf' | 'image' | '3d';\n /** Optional download handler — replaces the built-in \"save URL as filename\" if supplied. */\n onDownload?: () => void;\n /** Optional email handler — only shown when supplied. */\n onEmail?: () => void;\n /** Show a progress placeholder while the consumer fetches/converts the file. */\n converting?: boolean;\n /** Headline shown on the converting placeholder (e.g. \"CONVERTING DWG FILE\"). */\n convertingMessage?: string;\n}\n\nconst EVENT_NAME = 'react-os-shell:pdf-preview';\n\nlet pendingData: PdfPreviewData | null = null;\n\n/** Stage a PDF for the next Preview window mount, or swap into an open one. */\nexport function setPdfPreview(data: PdfPreviewData) {\n pendingData = data;\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: data }));\n }\n}\n\nexport default function Preview() {\n const [data, setData] = useState<PdfPreviewData | null>(() => {\n const d = pendingData;\n pendingData = null;\n return d;\n });\n\n // Swap to a new PDF if `setPdfPreview` is called while the window is open.\n useEffect(() => {\n const handler = (e: Event) => {\n const next = (e as CustomEvent<PdfPreviewData>).detail;\n setData(prev => {\n if (prev?.url && prev.url !== next.url && prev.url.startsWith('blob:')) {\n URL.revokeObjectURL(prev.url);\n }\n return next;\n });\n };\n window.addEventListener(EVENT_NAME, handler);\n return () => window.removeEventListener(EVENT_NAME, handler);\n }, []);\n\n // Revoke blob URL on unmount.\n useEffect(() => () => {\n if (data?.url?.startsWith('blob:')) URL.revokeObjectURL(data.url);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Window title reflects whatever is loaded — same pattern Spreadsheets uses.\n const titleName = data?.filename ? truncateForTitle(data.filename) : 'Untitled';\n\n const fileRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n // Drag-enter/leave fire on every child the cursor crosses, so a single\n // boolean flickers. Track depth with a counter — overlay shows on first\n // enter, clears only when the counter unwinds back to zero.\n const dragDepthRef = useRef(0);\n const handlePick = () => fileRef.current?.click();\n const resetDrag = () => {\n dragDepthRef.current = 0;\n setIsDragging(false);\n };\n // Only the frontmost (active) Preview window should accept drags. With\n // multiple Previews open this prevents the overlay flashing on every\n // window the cursor crosses, and matches the user's expectation that\n // they activate a window first by clicking it.\n const isActiveWindow = (el: HTMLElement) => {\n const myModal = el.closest('[data-modal-id]') as HTMLElement | null;\n if (!myModal) return true; // outside any modal — be permissive\n return getActiveModalId() === myModal.dataset.modalId;\n };\n // If the drag ends outside our component (e.g. dropped onto desktop trash),\n // we never receive `drop` or our outer `dragleave`. Listen on window so\n // any end of any drag clears the overlay. Also wire ESC as an escape hatch.\n useEffect(() => {\n const onWindowDragEnd = () => resetDrag();\n const onWindowDrop = () => resetDrag();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') resetDrag();\n };\n window.addEventListener('dragend', onWindowDragEnd);\n window.addEventListener('drop', onWindowDrop);\n window.addEventListener('keydown', onKey);\n return () => {\n window.removeEventListener('dragend', onWindowDragEnd);\n window.removeEventListener('drop', onWindowDrop);\n window.removeEventListener('keydown', onKey);\n };\n }, []);\n const ingestFile = (file: File) => {\n const ext = (file.name.split('.').pop() || '').toLowerCase();\n const kind: 'pdf' | 'image' | 'dxf' | '3d' | undefined =\n ext === 'pdf' ? 'pdf'\n : ext === 'dxf' ? 'dxf'\n : ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext) ? 'image'\n : ['stp', 'step', 'stl', 'obj', 'gltf', 'glb', '3mf', 'iges', 'igs', 'ply', 'fbx'].includes(ext) ? '3d'\n : undefined;\n if (!kind) {\n if (ext === 'dwg') toast.error('DWG files need server-side conversion. Convert to PDF or DXF first.');\n else toast.error(`Unsupported file type: .${ext || 'unknown'}`);\n return;\n }\n const url = URL.createObjectURL(file);\n // Local-only update: do NOT route through setPdfPreview, which dispatches\n // a global event that every other open Preview window also listens to —\n // that would replace whatever those other windows are showing. Update\n // only this instance's state.\n setData(prev => {\n if (prev?.url?.startsWith('blob:') && prev.url !== url) {\n URL.revokeObjectURL(prev.url);\n }\n return { url, filename: file.name, kind };\n });\n };\n const handleFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) ingestFile(file);\n if (fileRef.current) fileRef.current.value = '';\n };\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n resetDrag();\n const file = e.dataTransfer.files?.[0];\n if (file) ingestFile(file);\n };\n\n const Toolbar = (\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".pdf,.dxf,.jpg,.jpeg,.png,.gif,.webp,.svg,.avif,.bmp,.stp,.step,.stl,.obj,.gltf,.glb,.3mf,.iges,.igs,.ply,.fbx\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n onClick={handlePick}\n className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776\" />\n </svg>\n Open\n </button>\n <span className=\"text-[10px] text-gray-400 ml-1\">PDF · DXF · 3D · Images</span>\n {data?.filename && (\n <>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <span className=\"text-xs font-medium text-gray-700 truncate max-w-[200px]\" title={data.filename}>{data.filename}</span>\n </>\n )}\n </div>\n );\n\n let body: React.ReactNode;\n if (!data) {\n body = (\n <div className=\"flex flex-1 flex-col items-center justify-center text-gray-500 text-sm gap-3 p-8 text-center\">\n <svg className=\"h-12 w-12 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n <p className=\"font-medium text-gray-700\">Drop a file here, or click <button onClick={handlePick} className=\"text-blue-600 hover:underline\">Open</button>.</p>\n <div className=\"text-xs text-gray-500 max-w-sm\">\n <p className=\"font-semibold uppercase tracking-wide text-[10px] text-gray-400 mb-1\">Supported formats</p>\n <ul className=\"space-y-0.5\">\n <li><span className=\"font-mono text-gray-700\">.pdf</span> — multi-page document viewer</li>\n <li><span className=\"font-mono text-gray-700\">.dxf</span> — vector CAD drawings (optional <span className=\"font-mono\">dxf-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.stp .step .stl .obj .gltf .glb .3mf .iges</span> — 3D models (optional <span className=\"font-mono\">online-3d-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.jpg .jpeg .png .gif .webp .svg .avif .bmp</span> — raster images</li>\n </ul>\n <p className=\"mt-2 text-[11px] text-gray-400 italic\">DWG files need to be converted to PDF or DXF first (server-side).</p>\n </div>\n </div>\n );\n } else if (data.converting || !data.url) {\n body = <ConvertingPanel filename={data.filename} message={data.convertingMessage} />;\n } else if (data.kind === 'dxf') {\n body = <DxfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === '3d') {\n body = <StepPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === 'image') {\n body = <ImagePanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else {\n body = <PdfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n }\n\n return (\n <div\n className=\"relative flex flex-col h-full\"\n ref={rootRef}\n onDragEnter={(e) => {\n // Only count drags that actually carry files — ignore stray drags\n // (e.g. text selections) so we don't flash the overlay.\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n // And only the active (frontmost) Preview window responds.\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n dragDepthRef.current++;\n if (!isDragging) setIsDragging(true);\n }}\n onDragOver={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n }}\n onDragLeave={() => {\n if (dragDepthRef.current > 0) dragDepthRef.current--;\n if (dragDepthRef.current === 0) setIsDragging(false);\n }}\n onDrop={(e) => {\n if (!isActiveWindow(e.currentTarget as HTMLElement)) {\n resetDrag();\n return;\n }\n handleDrop(e);\n }}\n >\n <WindowTitle title={`${titleName} - Preview`} />\n {Toolbar}\n <div className=\"flex-1 min-h-0\">{body}</div>\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to open\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ConvertingPanel({ filename, message }: { filename: string; message?: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full bg-gray-100 gap-4 px-8\">\n <div className=\"flex flex-col items-center gap-3\">\n <svg className=\"h-12 w-12 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <div className=\"text-base font-semibold tracking-wide text-gray-700 uppercase\">{message || 'Converting file'}</div>\n <div className=\"text-xs text-gray-400 truncate max-w-md\">{filename}</div>\n </div>\n <div className=\"w-72 h-1.5 rounded-full bg-gray-200 overflow-hidden\">\n <div className=\"h-full w-1/3 bg-blue-500 rounded-full animate-pulse\" style={{ animation: 'preview-bar 1.4s ease-in-out infinite' }} />\n </div>\n <style>{`@keyframes preview-bar { 0% { transform: translateX(-110%); } 100% { transform: translateX(310%); } }`}</style>\n </div>\n );\n}\n\ninterface PdfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nfunction PdfPanel({ url, filename, onDownload, onEmail }: PdfPanelProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pdf, setPdf] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [scale, setScale] = useState(1.5);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n pdfjsLib.getDocument(url).promise.then(doc => {\n if (cancelled) return;\n setPdf(doc);\n setTotalPages(doc.numPages);\n setLoading(false);\n }).catch(() => {\n if (!cancelled) { toast.error('Failed to load PDF'); setLoading(false); }\n });\n return () => { cancelled = true; };\n }, [url]);\n\n useEffect(() => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(1).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n const fitScale = (containerW - 40) / viewport.width;\n setScale(Math.min(Math.max(fitScale, 0.5), 3));\n });\n }, [pdf]);\n\n useEffect(() => {\n if (!pdf || !canvasRef.current) return;\n let cancelled = false;\n pdf.getPage(page).then(p => {\n if (cancelled || !canvasRef.current) return;\n const viewport = p.getViewport({ scale });\n const canvas = canvasRef.current;\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n p.render({ canvas, canvasContext: ctx, viewport }).promise.catch(() => {});\n });\n return () => { cancelled = true; };\n }, [pdf, page, scale]);\n\n const handlePrint = () => {\n if (!pdf) return;\n const win = window.open('', '_blank');\n if (!win) { toast.error('Allow popups to print'); return; }\n const promises: Promise<string>[] = [];\n for (let i = 1; i <= totalPages; i++) {\n promises.push(pdf.getPage(i).then(p => {\n const vp = p.getViewport({ scale: 2 });\n const c = document.createElement('canvas');\n c.width = vp.width; c.height = vp.height;\n return p.render({ canvas: c, canvasContext: c.getContext('2d')!, viewport: vp }).promise.then(() => c.toDataURL());\n }));\n }\n Promise.all(promises).then(images => {\n win.document.write(`<html><head><title>${filename}</title><style>@media print{body{margin:0}img{width:100%;page-break-after:always}}</style></head><body>`);\n win.document.write(images.map(src => `<img src=\"${src}\"/>`).join(''));\n win.document.write('</body></html>');\n win.document.close();\n setTimeout(() => { win.print(); win.close(); }, 300);\n });\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const fitWidth = () => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(page).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n setScale(Math.min(Math.max((containerW - 40) / viewport.width, 0.5), 3));\n });\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setPage(p => Math.max(1, p - 1))} disabled={page <= 1} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n </button>\n <span className=\"text-gray-600 font-medium tabular-nums\">{page} / {totalPages}</span>\n <button onClick={() => setPage(p => Math.min(totalPages, p + 1))} disabled={page >= totalPages} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setScale(s => Math.max(0.3, Math.round((s - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(scale * 100)}%</span>\n <button onClick={() => setScale(s => Math.min(4, Math.round((s + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={fitWidth} className={btn}>Fit</button>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <button onClick={handlePrint} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z\" /></svg>\n Print\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </div>\n </div>\n\n <div ref={containerRef} className=\"flex-1 overflow-auto bg-gray-100 flex justify-center p-4\">\n {loading ? (\n <div className=\"flex items-center justify-center py-20 text-gray-400 text-sm\">Loading PDF...</div>\n ) : (\n <canvas ref={canvasRef} className=\"shadow-lg rounded\" />\n )}\n </div>\n </div>\n );\n}\n\ninterface DxfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// Default font set covering Latin + CJK glyphs, served from jsdelivr's mirror\n// of the dxf-viewer example assets. Without these, any TEXT/MTEXT entities in\n// the drawing render as empty boxes. Consumers can override by setting\n// `window.__REACT_OS_SHELL_DXF_FONTS__` to a different array of TTF/OTF URLs.\nconst DEFAULT_DXF_FONTS: string[] = [\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/Roboto-LightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NotoSansDisplay-SemiCondensedLightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NanumGothic-Regular.ttf',\n];\n\ninterface DxfLayer {\n name: string;\n displayName?: string;\n color?: number;\n visible: boolean;\n}\n\nfunction DxfPanel({ url, filename, onDownload, onEmail }: DxfPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [showLayers, setShowLayers] = useState(false);\n const [showHint, setShowHint] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\n setLayers([]);\n\n (async () => {\n let DxfViewer: any;\n try {\n const mod = await import('dxf-viewer');\n DxfViewer = (mod as any).DxfViewer;\n } catch (e) {\n if (!cancelled) {\n setError('dxf-viewer is not installed in this app.');\n setLoading(false);\n }\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n // dxf-viewer reads container dimensions in its constructor (with\n // autoResize:true, those become the canvas size). If the Modal is\n // still settling we may be measured as 0×0, breaking aspect math\n // and the WebGL viewport. Wait until the container has a real\n // bounding box before constructing the viewer.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n // clearColor must be a THREE.Color (Library calls .getHex()).\n let three: any = null;\n try { three = await import(/* @vite-ignore */ 'three' as any); } catch {}\n const ClearColor = three?.Color ?? null;\n const viewerOpts: any = { autoResize: true };\n if (ClearColor) viewerOpts.clearColor = new ClearColor(0xffffff);\n viewer = new DxfViewer(containerRef.current, viewerOpts);\n viewerRef.current = viewer;\n\n const fontUrls = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_DXF_FONTS__)\n || DEFAULT_DXF_FONTS;\n await viewer.Load({ url, fonts: fontUrls, workerFactory: null });\n if (cancelled) return;\n\n // Snapshot layer list — used to render the toggle panel.\n try {\n const list: any[] = viewer.GetLayers?.() ?? [];\n if (Array.isArray(list)) {\n setLayers(list.map(l => ({\n name: l.name,\n displayName: l.displayName ?? l.name,\n color: typeof l.color === 'number' ? l.color : undefined,\n visible: true,\n })));\n }\n } catch {}\n\n // Force-fit using the actual loaded bounds and refresh canvas size.\n const refit = () => {\n try {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n viewer.SetSize?.(Math.round(rect.width), Math.round(rect.height));\n }\n const bounds = viewer.GetBounds?.();\n const origin = viewer.GetOrigin?.();\n if (bounds && origin) {\n viewer.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n }\n viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] DXF refit failed', err);\n }\n };\n refit();\n requestAnimationFrame(refit);\n setLoading(false);\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to render DXF.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url]);\n\n // Auto-hide the usage hint after a few seconds.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n const toggleLayer = (name: string) => {\n setLayers(prev => prev.map(l => {\n if (l.name !== name) return l;\n const next = !l.visible;\n try { viewerRef.current?.ShowLayer?.(name, next); } catch {}\n return { ...l, visible: next };\n }));\n };\n\n const setAllLayers = (visible: boolean) => {\n setLayers(prev => prev.map(l => {\n if (l.visible === visible) return l;\n try { viewerRef.current?.ShowLayer?.(l.name, visible); } catch {}\n return { ...l, visible };\n }));\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const handleResetView = () => {\n try {\n const v = viewerRef.current;\n const bounds = v?.GetBounds?.();\n const origin = v?.GetOrigin?.();\n if (bounds && origin) {\n v.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n } else {\n v?.FitView?.();\n }\n v?.Render?.();\n } catch {}\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n const colorHex = (n?: number) => {\n if (typeof n !== 'number') return '#999';\n return '#' + n.toString(16).padStart(6, '0');\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">DXF</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1 relative\">\n <button\n onClick={() => setShowLayers(s => !s)}\n className={btn + (showLayers ? ' bg-gray-200' : '')}\n title=\"Toggle layer visibility\"\n disabled={layers.length === 0}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3\" /></svg>\n Layers {layers.length > 0 && <span className=\"text-gray-400\">({layers.filter(l => l.visible).length}/{layers.length})</span>}\n </button>\n <button onClick={() => setShowHint(s => !s)} className={btn} title=\"How to navigate\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" /></svg>\n </button>\n <button onClick={handleResetView} className={btn} title=\"Fit drawing to view\">Fit</button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </div>\n </div>\n <div className=\"relative flex-1 bg-white min-h-0\">\n {/* dxf-viewer overrides container's `position` to `relative` in its\n * constructor, which kills any `inset: 0` sizing. Use explicit\n * width/height: 100% so the container always fills its flex parent. */}\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {showLayers && layers.length > 0 && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[70%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Layers</span>\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setAllLayers(true)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">All</button>\n <button onClick={() => setAllLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">None</button>\n <button onClick={() => setShowLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n </div>\n <div className=\"overflow-y-auto py-1\">\n {layers.map(l => (\n <label key={l.name} className=\"flex items-center gap-2 px-2 py-1 hover:bg-gray-100 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={l.visible}\n onChange={() => toggleLayer(l.name)}\n className=\"h-3.5 w-3.5\"\n />\n <span\n className=\"inline-block h-3 w-3 rounded-sm border border-gray-300 shrink-0\"\n style={{ background: colorHex(l.color) }}\n />\n <span className=\"truncate text-gray-700\" title={l.displayName}>{l.displayName || l.name}</span>\n </label>\n ))}\n </div>\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122\" /></svg>\n Drag to pan\n </span>\n <span className=\"text-white/40\">•</span>\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6\" /></svg>\n Scroll to zoom\n </span>\n <span className=\"text-white/40\">•</span>\n <span>Fit to reset</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/80 text-sm text-gray-500\">Loading drawing…</div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center\">{error}</div>\n )}\n </div>\n </div>\n );\n}\n\ninterface StepPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// online-3d-viewer expects an \"external libs\" base URL where it can find the\n// occt-import-js WASM (for STEP/IGES) plus draco/rhino3dm/web-ifc decoders.\n// jsdelivr mirrors the npm package at this path; consumers can override via\n// `window.__REACT_OS_SHELL_O3DV_LIBS__` to self-host (e.g. air-gapped).\nconst DEFAULT_O3DV_LIBS = 'https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/';\n\ninterface TreeNode {\n id: number;\n name: string;\n isMeshNode: boolean;\n meshIndices: number[];\n children: TreeNode[];\n}\n\nfunction buildTree(node: any, depth = 0): TreeNode {\n return {\n id: node.GetId?.() ?? 0,\n name: node.GetName?.() || (depth === 0 ? 'Root' : 'Node'),\n isMeshNode: !!node.IsMeshNode?.(),\n meshIndices: node.GetMeshIndices?.() ?? [],\n children: (node.GetChildNodes?.() ?? []).map((c: any) => buildTree(c, depth + 1)),\n };\n}\n\n// Collect every nodeId in the subtree rooted at `node` (inclusive).\nfunction collectNodeIds(node: TreeNode, out: Set<number>) {\n out.add(node.id);\n for (const c of node.children) collectNodeIds(c, out);\n}\n\n// Hex string (\"#rrggbb\") → RGBColor instance.\nfunction hexToRgb(OV: any, hex: string) {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex);\n const n = m ? parseInt(m[1], 16) : 0;\n return new OV.RGBColor((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff);\n}\nfunction rgbToHex(c: { r?: number; g?: number; b?: number }) {\n const r = (c.r ?? 0) | 0, g = (c.g ?? 0) | 0, b = (c.b ?? 0) | 0;\n return '#' + [r, g, b].map(v => v.toString(16).padStart(2, '0')).join('');\n}\n\nfunction StepPanel({ url, filename, onDownload, onEmail }: StepPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const ovRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [showHint, setShowHint] = useState(true);\n\n // Mesh tree + per-node visibility (true = visible).\n const [tree, setTree] = useState<TreeNode | null>(null);\n const [expanded, setExpanded] = useState<Record<number, boolean>>({});\n const [hidden, setHidden] = useState<Set<number>>(new Set());\n\n // Right-panel display settings.\n const [bgColor, setBgColor] = useState('#f5f6f8');\n const [showEdges, setShowEdges] = useState(true);\n const [edgeColor, setEdgeColor] = useState('#000000');\n const [edgeThreshold, setEdgeThreshold] = useState(1);\n\n // Sidebar visibility.\n const [showMeshes, setShowMeshes] = useState(true);\n const [showSettings, setShowSettings] = useState(true);\n\n // Section view (capped clipping plane).\n const [sectionEnabled, setSectionEnabled] = useState(false);\n const [sectionAxis, setSectionAxis] = useState<'x' | 'y' | 'z'>('z');\n const [sectionFlip, setSectionFlip] = useState(false);\n const [sectionPosition, setSectionPosition] = useState(0.5); // 0–1 within bbox\n const [sectionCapColor, setSectionCapColor] = useState('#c8ccd1');\n\n // Persistent section state — stencil helpers, cap mesh, original material\n // settings — held in a ref so we can mutate the plane in place on slider\n // tick instead of rebuilding every helper mesh.\n const sectionRef = useRef<{\n plane: any;\n capMesh: any;\n helpers: any[];\n materialState: Map<any, { clippingPlanes: any; clipShadows: any }>;\n bbox: any;\n } | null>(null);\n\n // Load model.\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\n setTree(null);\n setExpanded({});\n setHidden(new Set());\n\n (async () => {\n let OV: any;\n try {\n OV = await import('online-3d-viewer');\n } catch {\n if (!cancelled) {\n setError('online-3d-viewer is not installed in this app. Add it to enable 3D file viewing.');\n setLoading(false);\n }\n return;\n }\n ovRef.current = OV;\n if (cancelled || !containerRef.current) return;\n\n // Wait for container to have a real layout before constructing the\n // viewer — same dance as the DXF panel.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n try {\n const libsBase = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_O3DV_LIBS__)\n || DEFAULT_O3DV_LIBS;\n OV.SetExternalLibLocation?.(libsBase);\n\n viewer = new OV.EmbeddedViewer(containerRef.current, {\n backgroundColor: new OV.RGBAColor(245, 246, 248, 255),\n defaultColor: new OV.RGBColor(180, 188, 200),\n edgeSettings: new OV.EdgeSettings(true, new OV.RGBColor(0, 0, 0), 1),\n onModelLoaded: () => {\n if (cancelled) return;\n try {\n const model = viewer.GetModel?.();\n const root = model?.GetRootNode?.();\n if (root) {\n const t = buildTree(root);\n setTree(t);\n // Expand top two levels by default.\n const expandIds: Record<number, boolean> = { [t.id]: true };\n for (const c of t.children) expandIds[c.id] = true;\n setExpanded(expandIds);\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] mesh tree extraction failed', err);\n }\n setLoading(false);\n },\n onModelLoadFailed: () => {\n if (!cancelled) {\n setError('Failed to load 3D model.');\n setLoading(false);\n }\n },\n });\n viewerRef.current = viewer;\n\n const inputFile = new OV.InputFile(filename, OV.FileSource.Url, url);\n viewer.LoadModelFromInputFiles([inputFile]);\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to load 3D model.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url, filename]);\n\n // Apply per-node visibility by walking the THREE scene's mesh userData. The\n // engine's public `SetMeshesVisibility` is global-only, so we go one level\n // deeper to flip individual `mesh.visible` flags.\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer) return;\n try {\n const visit = (mesh: any) => {\n if (mesh.userData?.__sectionHelper) return;\n const ud = mesh.userData?.originalMeshInstance ?? mesh.userData;\n const nodeId: number | undefined = ud?.id?.nodeId ?? ud?.nodeId;\n if (typeof nodeId === 'number') {\n mesh.visible = !hidden.has(nodeId);\n }\n };\n v.viewer.mainModel?.EnumerateMeshesAndLines?.(visit);\n v.viewer.mainModel?.EnumerateEdges?.(visit);\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] visibility update failed', err);\n }\n }, [hidden, tree]);\n\n // Apply edge settings.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n v.viewer.SetEdgeSettings(new OV.EdgeSettings(showEdges, hexToRgb(OV, edgeColor), edgeThreshold));\n v.viewer.Render?.();\n } catch {}\n }, [showEdges, edgeColor, edgeThreshold]);\n\n // Apply background color.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const c = hexToRgb(OV, bgColor);\n v.viewer.SetBackgroundColor(new OV.RGBAColor(c.r, c.g, c.b, 255));\n v.viewer.Render?.();\n } catch {}\n }, [bgColor]);\n\n // Section view — set / tear down on enable.\n //\n // Capped clipping using the standard three.js stencil technique. The\n // tricky bit is that we can't `import('three')` — it resolves to a\n // different three instance than the one online-3d-viewer bundles\n // (transitive duplicate), which breaks instanceof checks against the\n // renderer's THREE. Workaround: pluck constructors (Mesh, BufferGeometry,\n // BufferAttribute, MeshPhongMaterial) from a sample mesh in the loaded\n // scene — those are guaranteed to be from the renderer's THREE. The\n // stencil/side constants are universal numeric values, so we hardcode\n // them. The plane itself stays duck-typed — three's WebGLClipping just\n // calls `.copy()` on it (reads .normal.x/y/z and .constant).\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n if (!renderer || !scene) return;\n\n // Tear down any previous state.\n if (sectionRef.current) {\n const s = sectionRef.current;\n for (const [mat, prev] of s.materialState.entries()) {\n mat.clippingPlanes = prev.clippingPlanes;\n mat.clipShadows = prev.clipShadows;\n mat.needsUpdate = true;\n }\n for (const helper of s.helpers) {\n helper.parent?.remove(helper);\n // Don't dispose helper.geometry — it's shared with the original mesh.\n helper.material?.dispose?.();\n }\n if (s.capMesh) {\n scene.remove(s.capMesh);\n s.capMesh.geometry?.dispose?.();\n s.capMesh.material?.dispose?.();\n }\n sectionRef.current = null;\n }\n\n if (!sectionEnabled) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n if (!bbox) return;\n\n // Snapshot the mesh list — never traverse-and-mutate.\n const targets: any[] = [];\n v.viewer.mainModel?.EnumerateMeshes?.((mesh: any) => {\n if (!mesh.userData?.__sectionHelper) targets.push(mesh);\n });\n if (!targets.length) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n // Pluck THREE constructors from a sample mesh (these come from the\n // renderer's THREE, so the renderer recognizes the resulting objects).\n const sample = targets[0];\n const Mesh = sample.constructor;\n const Material = sample.material?.constructor; // MeshPhongMaterial\n const Geometry = sample.geometry?.constructor;\n const BufferAttr = sample.geometry?.attributes?.position?.constructor;\n if (!Mesh || !Material || !Geometry || !BufferAttr) {\n // Fallback to plain clipping if we can't pluck constructors.\n // eslint-disable-next-line no-console\n console.warn('[Preview] section: missing THREE constructors, falling back to no cap');\n }\n\n // Universal three.js / WebGL constants.\n const FrontSide = 0, BackSide = 1, DoubleSide = 2;\n const AlwaysStencilFunc = 519, NotEqualStencilFunc = 517;\n const IncrementWrapStencilOp = 7682, DecrementWrapStencilOp = 7683;\n const ReplaceStencilOp = 7681;\n\n // Verify the WebGL context actually has a stencil buffer — without one\n // every stencil op is a no-op, the cap stays at ref 0 forever, and the\n // cut reads as a hollow shell. If we can't get one, log and skip the\n // cap (clipping still works, just without fill).\n let hasStencil = true;\n try {\n const gl = renderer.getContext?.();\n const attrs = gl?.getContextAttributes?.();\n hasStencil = attrs?.stencil !== false;\n // eslint-disable-next-line no-console\n console.info('[Preview] section: stencil buffer =', hasStencil, 'autoClearStencil =', renderer.autoClearStencil);\n } catch {}\n\n const plane: any = { normal: { x: 0, y: 0, z: -1 }, constant: 0 };\n const helpers: any[] = [];\n const materialState = new Map<any, { clippingPlanes: any; clipShadows: any }>();\n\n const applyToMaterial = (mat: any) => {\n if (!mat || materialState.has(mat)) return;\n materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n\n for (const mesh of targets) {\n const mat = mesh.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n\n // Stencil-only helpers per mesh: back-faces increment the stencil,\n // front-faces decrement. Where the running count is non-zero on the\n // cap plane, we're inside the solid → cap renders.\n //\n // We clone the source material rather than `new Material()` so the\n // shader compiles with the same uniform/attribute setup as the\n // existing scene (avoids subtle \"shader fails silently\" cases).\n const sourceMat = Array.isArray(mat) ? mat[0] : mat;\n if (Mesh && hasStencil && sourceMat?.clone) {\n const makeStencil = (side: number, op: number) => {\n const m: any = sourceMat.clone();\n m.depthWrite = false;\n m.depthTest = false;\n m.colorWrite = false;\n m.stencilWrite = true;\n m.stencilFunc = AlwaysStencilFunc;\n m.stencilFail = op;\n m.stencilZFail = op;\n m.stencilZPass = op;\n m.side = side;\n m.transparent = false;\n m.clippingPlanes = [plane];\n m.clipShadows = true;\n m.needsUpdate = true;\n const helper = new Mesh(mesh.geometry, m);\n helper.matrixAutoUpdate = false;\n helper.renderOrder = 1;\n helper.userData.__sectionHelper = true;\n mesh.add(helper);\n helpers.push(helper);\n };\n makeStencil(BackSide, IncrementWrapStencilOp);\n makeStencil(FrontSide, DecrementWrapStencilOp);\n }\n }\n\n // Edges — clip them too so the cut isn't framed by a stale outline.\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n });\n\n // Cap quad — sized to the bbox diagonal × 2 so it always covers the cut,\n // built as a manual BufferGeometry quad (4 verts, 2 tris). We clone\n // the source material (same shader as the rest of the scene) instead\n // of `new Material()` so the cap actually receives lighting consistent\n // with the model.\n let capMesh: any = null;\n const sourceMat = (targets[0]?.material && (Array.isArray(targets[0].material) ? targets[0].material[0] : targets[0].material)) as any;\n if (hasStencil && Mesh && Geometry && BufferAttr && sourceMat?.clone) {\n const dx = bbox.max.x - bbox.min.x;\n const dy = bbox.max.y - bbox.min.y;\n const dz = bbox.max.z - bbox.min.z;\n const capSize = Math.max(dx, dy, dz, 1) * 2;\n const half = capSize / 2;\n\n const capGeom: any = new Geometry();\n const positions = new Float32Array([\n -half, -half, 0,\n half, -half, 0,\n half, half, 0,\n -half, half, 0,\n ]);\n const normals = new Float32Array([\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n ]);\n capGeom.setAttribute('position', new BufferAttr(positions, 3));\n capGeom.setAttribute('normal', new BufferAttr(normals, 3));\n capGeom.setIndex([0, 1, 2, 0, 2, 3]);\n\n const capMat: any = sourceMat.clone();\n const mhex = /^#?([0-9a-f]{6})$/i.exec(sectionCapColor);\n const colorHex = mhex ? parseInt(mhex[1], 16) : 0xc8ccd1;\n capMat.color?.setHex?.(colorHex);\n capMat.side = DoubleSide;\n capMat.transparent = false;\n capMat.opacity = 1;\n capMat.stencilWrite = true;\n capMat.stencilRef = 0;\n capMat.stencilFunc = NotEqualStencilFunc;\n capMat.stencilFail = ReplaceStencilOp;\n capMat.stencilZFail = ReplaceStencilOp;\n capMat.stencilZPass = ReplaceStencilOp;\n // Don't clip the cap itself by the same plane.\n capMat.clippingPlanes = [];\n capMat.needsUpdate = true;\n\n capMesh = new Mesh(capGeom, capMat);\n capMesh.renderOrder = 2;\n capMesh.userData.__sectionHelper = true;\n scene.add(capMesh);\n }\n\n renderer.localClippingEnabled = true;\n sectionRef.current = { plane, capMesh, helpers, materialState, bbox };\n v.viewer.Render?.();\n }, [sectionEnabled, loading, tree, sectionCapColor]);\n\n // Section view — update plane orientation/position on axis/flip/slider change.\n useEffect(() => {\n const v = viewerRef.current;\n const s = sectionRef.current;\n if (!v?.viewer || !s || !sectionEnabled) return;\n try {\n const bbox = s.bbox;\n const axisIdx = sectionAxis === 'x' ? 0 : sectionAxis === 'y' ? 1 : 2;\n const min = [bbox.min.x, bbox.min.y, bbox.min.z][axisIdx];\n const max = [bbox.max.x, bbox.max.y, bbox.max.z][axisIdx];\n const value = min + (max - min) * sectionPosition;\n\n // three.js clips fragments where (normal · p) + constant < 0.\n // Default direction (not flipped): keep \"axis < value\", clip \"axis > value\".\n const dir = sectionFlip ? 1 : -1;\n const nx = sectionAxis === 'x' ? dir : 0;\n const ny = sectionAxis === 'y' ? dir : 0;\n const nz = sectionAxis === 'z' ? dir : 0;\n s.plane.normal.x = nx;\n s.plane.normal.y = ny;\n s.plane.normal.z = nz;\n s.plane.constant = -dir * value;\n\n // Re-position the cap mesh on the plane and orient it so its visible\n // face points along the plane normal.\n if (s.capMesh) {\n const cx = (bbox.min.x + bbox.max.x) / 2;\n const cy = (bbox.min.y + bbox.max.y) / 2;\n const cz = (bbox.min.z + bbox.max.z) / 2;\n // Distance from bbox center to plane along the normal.\n const dist = nx * cx + ny * cy + nz * cz + s.plane.constant;\n const px = cx - nx * dist;\n const py = cy - ny * dist;\n const pz = cz - nz * dist;\n s.capMesh.position.set(px, py, pz);\n s.capMesh.lookAt?.(px + nx, py + ny, pz + nz);\n }\n\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] section update failed', err);\n }\n }, [sectionEnabled, sectionAxis, sectionFlip, sectionPosition]);\n\n // Hint timer.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n const toggleNodeVisible = (node: TreeNode) => {\n const ids = new Set<number>();\n collectNodeIds(node, ids);\n setHidden(prev => {\n const next = new Set(prev);\n // If any descendant is currently visible, hide them all; else reveal.\n const anyVisible = [...ids].some(id => !next.has(id));\n for (const id of ids) {\n if (anyVisible) next.add(id);\n else next.delete(id);\n }\n return next;\n });\n };\n\n const toggleExpanded = (id: number) => {\n setExpanded(prev => ({ ...prev, [id]: !prev[id] }));\n };\n\n const fitNode = (node: TreeNode) => {\n // Fit the whole model — fitting to a specific subtree would need its\n // bounds via a custom enumerator; defer that for now.\n handleFit();\n // Future: filter visibility-by-subtree to focus.\n void node;\n };\n\n const handleFit = () => {\n try {\n const v = viewerRef.current;\n const sphere = v?.viewer?.GetBoundingSphere?.(() => true);\n if (sphere) v.viewer.FitSphereToWindow(sphere, true);\n v?.viewer?.Render?.();\n } catch {}\n };\n\n // Camera presets — eye/center/up around the model's bounding sphere.\n const setCameraPreset = (preset: 'top' | 'front' | 'side' | 'iso') => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const sphere = v.viewer.GetBoundingSphere?.(() => true);\n if (!sphere) return;\n const c = sphere.center;\n const r = sphere.radius || 1;\n const dist = r * 3;\n const cx = c.x ?? 0, cy = c.y ?? 0, cz = c.z ?? 0;\n let eye: any, up: any;\n switch (preset) {\n case 'top': eye = new OV.Coord3D(cx, cy, cz + dist); up = new OV.Coord3D(0, 1, 0); break;\n case 'front': eye = new OV.Coord3D(cx, cy - dist, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'side': eye = new OV.Coord3D(cx + dist, cy, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'iso':\n default: {\n const k = dist / Math.sqrt(3);\n eye = new OV.Coord3D(cx + k, cy - k, cz + k);\n up = new OV.Coord3D(0, 0, 1);\n break;\n }\n }\n const center = new OV.Coord3D(cx, cy, cz);\n const cam = new OV.Camera(eye, center, up, 45);\n v.viewer.SetCamera(cam);\n v.viewer.AdjustClippingPlanesToSphere?.(sphere);\n v.viewer.Render?.();\n } catch {}\n };\n\n const handleSnapshot = () => {\n try {\n const v = viewerRef.current;\n const size = v?.viewer?.GetCanvasSize?.() ?? { width: 1280, height: 720 };\n const dataUrl = v?.viewer?.GetImageAsDataUrl?.(size.width, size.height, false);\n if (!dataUrl) return;\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename.replace(/\\.[^.]+$/, '')}-snapshot.png`;\n a.click();\n } catch {}\n };\n\n const handleResetDisplay = () => {\n setBgColor('#f5f6f8');\n setShowEdges(true);\n setEdgeColor('#000000');\n setEdgeThreshold(1);\n setSectionEnabled(false);\n setSectionAxis('z');\n setSectionFlip(false);\n setSectionPosition(0.5);\n setSectionCapColor('#c8ccd1');\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const ext = (filename.split('.').pop() || '').toUpperCase();\n\n // ── render helpers ───────────────────────────────────────────────────────\n const renderTreeNode = (node: TreeNode, depth = 0): React.ReactNode => {\n const hasChildren = node.children.length > 0;\n const isExpanded = expanded[node.id] !== false; // default expanded for first two levels\n const isVisible = !hidden.has(node.id);\n return (\n <div key={node.id}>\n <div\n className=\"group flex items-center gap-1 px-1.5 py-1 hover:bg-gray-100 cursor-default text-[12px] text-gray-700\"\n style={{ paddingLeft: `${depth * 12 + 6}px` }}\n >\n {hasChildren ? (\n <button\n onClick={() => toggleExpanded(node.id)}\n className=\"h-4 w-4 shrink-0 flex items-center justify-center text-gray-500 hover:text-gray-900\"\n title={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={isExpanded ? 'M19.5 8.25l-7.5 7.5-7.5-7.5' : 'M8.25 4.5l7.5 7.5-7.5 7.5'} />\n </svg>\n </button>\n ) : (\n <span className=\"h-4 w-4 shrink-0 flex items-center justify-center\">\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n </span>\n )}\n <span className={`flex-1 truncate ${isVisible ? '' : 'opacity-40'}`} title={node.name}>{node.name}</span>\n <button\n onClick={() => fitNode(node)}\n className=\"h-4 w-4 shrink-0 text-gray-400 hover:text-gray-900 opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Fit to view\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <button\n onClick={() => toggleNodeVisible(node)}\n className=\"h-4 w-4 shrink-0 text-gray-500 hover:text-gray-900\"\n title={isVisible ? 'Hide' : 'Show'}\n >\n {isVisible ? (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n ) : (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n )}\n </button>\n </div>\n {isExpanded && hasChildren && (\n <div>{node.children.map(c => renderTreeNode(c, depth + 1))}</div>\n )}\n </div>\n );\n };\n\n const tBtn = 'h-8 w-8 shrink-0 flex items-center justify-center rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnActive = 'h-8 w-8 shrink-0 flex items-center justify-center rounded bg-gray-200 text-gray-900';\n const tBtnSep = 'h-5 w-px bg-gray-300 mx-1';\n\n return (\n <div className=\"flex flex-col h-full bg-white\">\n {/* Top toolbar */}\n <div className=\"flex items-center gap-1 px-2 py-1.5 bg-gray-50 border-b border-gray-200 shrink-0\">\n <span className=\"text-[11px] font-semibold tracking-wide text-gray-700 px-2 truncate max-w-xs\" title={filename}>{filename}</span>\n <div className={tBtnSep} />\n <button onClick={handleFit} className={tBtn} title=\"Fit to view\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <div className={tBtnSep} />\n <button onClick={() => setCameraPreset('iso')} className={tBtn} title=\"Isometric view\">\n <span className=\"text-[10px] font-semibold\">ISO</span>\n </button>\n <button onClick={() => setCameraPreset('top')} className={tBtn} title=\"Top view\">\n <span className=\"text-[10px] font-semibold\">TOP</span>\n </button>\n <button onClick={() => setCameraPreset('front')} className={tBtn} title=\"Front view\">\n <span className=\"text-[10px] font-semibold\">FRT</span>\n </button>\n <button onClick={() => setCameraPreset('side')} className={tBtn} title=\"Side view\">\n <span className=\"text-[10px] font-semibold\">SDE</span>\n </button>\n <div className={tBtnSep} />\n <button onClick={handleSnapshot} className={tBtn} title=\"Save snapshot as PNG\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z\" />\n </svg>\n </button>\n <button onClick={() => setShowHint(s => !s)} className={tBtn} title=\"How to navigate\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" />\n </svg>\n </button>\n <div className=\"flex-1\" />\n <button onClick={() => setShowMeshes(s => !s)} className={showMeshes ? tBtnActive : tBtn} title=\"Toggle meshes panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n <button onClick={() => setShowSettings(s => !s)} className={showSettings ? tBtnActive : tBtn} title=\"Toggle display panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={tBtn} title=\"Download original file\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n </button>\n {onEmail && (\n <button onClick={onEmail} className={tBtn} title=\"Email\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Body: meshes | viewport | settings */}\n <div className=\"flex-1 flex min-h-0\">\n {showMeshes && (\n <div className=\"w-60 shrink-0 bg-gray-50 border-r border-gray-200 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-gray-500 border-b border-gray-200\">Meshes</div>\n <div className=\"flex-1 overflow-y-auto py-1\">\n {tree ? renderTreeNode(tree) : (\n <div className=\"px-3 py-3 text-[11px] text-gray-500 italic\">{loading ? 'Reading model…' : 'No structure available'}</div>\n )}\n </div>\n {tree && (\n <div className=\"px-3 py-1.5 text-[10px] text-gray-500 border-t border-gray-200\">\n {hidden.size === 0 ? 'All visible' : `${hidden.size} hidden`}\n </div>\n )}\n </div>\n )}\n\n <div className=\"relative flex-1 min-w-0\" style={{ background: bgColor }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span>Drag to rotate</span>\n <span className=\"text-white/40\">•</span>\n <span>Right-click drag to pan</span>\n <span className=\"text-white/40\">•</span>\n <span>Scroll to zoom</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-white/85 text-sm text-gray-600 gap-2\">\n <svg className=\"h-6 w-6 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <span>Loading 3D model…</span>\n {ext === 'STP' || ext === 'STEP' ? <span className=\"text-[10px] text-gray-400\">STEP files load OpenCascade WASM (~5 MB) on first use.</span> : null}\n </div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center bg-white/85\">{error}</div>\n )}\n </div>\n\n {showSettings && (\n <div className=\"w-60 shrink-0 bg-gray-50 border-l border-gray-200 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-gray-500 border-b border-gray-200\">Model Display</div>\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-gray-700\">\n <label className=\"flex items-center justify-between gap-2\">\n <span>Background Color</span>\n <input type=\"color\" value={bgColor} onChange={(e) => setBgColor(e.target.value)} className=\"h-6 w-10 rounded border border-gray-300 bg-white\" />\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span>Show Edges</span>\n <button\n onClick={() => setShowEdges(s => !s)}\n className={`relative h-5 w-9 rounded-full transition-colors ${showEdges ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${showEdges ? 'translate-x-4' : 'translate-x-0.5'}`} />\n </button>\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span className={showEdges ? '' : 'opacity-40'}>Edge Color</span>\n <input\n type=\"color\"\n value={edgeColor}\n onChange={(e) => setEdgeColor(e.target.value)}\n disabled={!showEdges}\n className=\"h-6 w-10 rounded border border-gray-300 bg-white disabled:opacity-40\"\n />\n </label>\n <div className={showEdges ? '' : 'opacity-40 pointer-events-none'}>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Edge Threshold</span>\n <span className=\"text-gray-500 tabular-nums\">{edgeThreshold}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={45}\n step={1}\n value={edgeThreshold}\n onChange={(e) => setEdgeThreshold(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div className=\"border-t border-gray-200 -mx-3 px-3 pt-3 mt-1\">\n <label className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">Section View</span>\n <button\n onClick={() => setSectionEnabled(s => !s)}\n className={`relative h-5 w-9 rounded-full transition-colors ${sectionEnabled ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${sectionEnabled ? 'translate-x-4' : 'translate-x-0.5'}`} />\n </button>\n </label>\n\n <div className={sectionEnabled ? 'mt-2 space-y-2' : 'mt-2 space-y-2 opacity-40 pointer-events-none'}>\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Axis</span>\n <button\n onClick={() => setSectionFlip(f => !f)}\n className=\"text-[10px] text-gray-600 hover:text-gray-900 px-1.5 py-0.5 rounded bg-gray-100 hover:bg-gray-200\"\n title=\"Flip section direction\"\n >\n {sectionFlip ? '← flipped' : 'flip →'}\n </button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {(['x', 'y', 'z'] as const).map(ax => (\n <button\n key={ax}\n onClick={() => setSectionAxis(ax)}\n className={`py-1 rounded text-[11px] font-semibold ${sectionAxis === ax ? 'bg-blue-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}\n >\n {ax.toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Position</span>\n <span className=\"text-gray-500 tabular-nums\">{Math.round(sectionPosition * 100)}%</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={sectionPosition}\n onChange={(e) => setSectionPosition(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <label className=\"flex items-center justify-between gap-2\">\n <span>Cap Color</span>\n <input\n type=\"color\"\n value={sectionCapColor}\n onChange={(e) => setSectionCapColor(e.target.value)}\n className=\"h-6 w-10 rounded border border-gray-300 bg-white\"\n />\n </label>\n\n </div>\n </div>\n </div>\n <div className=\"px-3 py-2 border-t border-gray-200\">\n <button\n onClick={handleResetDisplay}\n className=\"w-full text-[11px] text-gray-700 bg-gray-100 hover:bg-gray-200 rounded py-1.5 transition-colors\"\n >\n Reset to Default\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface ImagePanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nfunction ImagePanel({ url, filename, onDownload, onEmail }: ImagePanelProps) {\n const [zoom, setZoom] = useState(1);\n const [error, setError] = useState(false);\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">Image</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setZoom(z => Math.max(0.1, Math.round((z - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(8, Math.round((z + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={() => setZoom(1)} className={btn}>1:1</button>\n </div>\n <div className=\"flex items-center gap-1\">\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </div>\n </div>\n <div className=\"flex-1 overflow-auto bg-gray-100 flex items-center justify-center p-4\">\n {error ? (\n <div className=\"text-sm text-red-600\">Failed to load image.</div>\n ) : (\n <img\n src={url}\n alt={filename}\n onError={() => setError(true)}\n style={{ transform: `scale(${zoom})`, transformOrigin: 'center center', transition: 'transform 120ms ease' }}\n className=\"max-w-full max-h-full shadow-lg rounded bg-white\"\n />\n )}\n </div>\n </div>\n );\n}\n"]}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { formatDate } from './chunk-NSU7OHPC.js';
3
3
  export { formatDate } from './chunk-NSU7OHPC.js';
4
4
  import { useGoogleAuth } from './chunk-5O2KEISQ.js';
5
5
  import { playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, playLogout, setSoundForType, previewSound, setAllSounds } from './chunk-D7PYW2QS.js';
6
- import { setPdfPreview } from './chunk-IQWRDQHW.js';
6
+ import { setPdfPreview } from './chunk-4UVDCFGA.js';
7
7
  import { toast_default } from './chunk-WIJ45SYD.js';
8
8
  export { toast_default as toast } from './chunk-WIJ45SYD.js';
9
9
  import { useShellPrefs } from './chunk-36VM54SC.js';
@@ -651,7 +651,7 @@ function StatusBadge({ status }) {
651
651
  }
652
652
 
653
653
  // src/version.ts
654
- var VERSION = "0.1.36" ;
654
+ var VERSION = "0.1.37" ;
655
655
  var APP_VERSION = VERSION;
656
656
 
657
657
  // src/changelog.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-os-shell",
3
- "version": "0.1.36",
3
+ "version": "0.1.37",
4
4
  "description": "Desktop-style React UI shell — windows, taskbar, start menu, sticky notes, frosted glass theming, and 17 bundled apps including a PDF Preview viewer.",
5
5
  "license": "MIT",
6
6
  "author": "Victor Y. Mau",
@@ -1,6 +0,0 @@
1
- export { Preview as default, setPdfPreview } from './chunk-IQWRDQHW.js';
2
- import './chunk-WIJ45SYD.js';
3
- import './chunk-44AH2OXU.js';
4
- import './chunk-RFTLYCSF.js';
5
- //# sourceMappingURL=Preview-WIXANNFW.js.map
6
- //# sourceMappingURL=Preview-WIXANNFW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/apps/Preview.tsx"],"names":[],"mappings":";;;;;;AAYA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,SAAS,iBAAiB,CAAA,EAAW;AACnC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,iBAAA,GAAoB,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,iBAAA,GAAoB,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AAClF;AAMA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAU,6BAAoB,SAAA,EAAW;AAC5E,EAAS,QAAA,CAAA,mBAAA,CAAoB,SAAA,GAC3B,CAAA,6BAAA,EAAyC,QAAA,CAAA,OAAO,CAAA,yBAAA,CAAA;AACpD;AAyBA,IAAM,UAAA,GAAa,4BAAA;AAEnB,IAAI,WAAA,GAAqC,IAAA;AAGlC,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,WAAA,GAAc,IAAA;AACd,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,UAAA,EAAY,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACpE;AACF;AAEe,SAAR,OAAA,GAA2B;AAChC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAgC,MAAM;AAC5D,IAAA,MAAM,CAAA,GAAI,WAAA;AACV,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,OAAQ,CAAA,CAAkC,MAAA;AAChD,MAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,QAAA,IAAI,IAAA,EAAM,GAAA,IAAO,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACtE,UAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,QAC9B;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,OAAO,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM,MAAM;AACpB,IAAA,IAAI,IAAA,EAAM,KAAK,UAAA,CAAW,OAAO,GAAG,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAElE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAY,IAAA,EAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,GAAI,UAAA;AAErE,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAIlD,EAAA,MAAM,YAAA,GAAe,OAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM;AAChD,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAKA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAoB;AAC1C,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,iBAAiB,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,gBAAA,EAAiB,KAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA;AAAA,EAChD,CAAA;AAIA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,MAAM,SAAA,EAAU;AACxC,IAAA,MAAM,YAAA,GAAe,MAAM,SAAA,EAAU;AACrC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,SAAA,EAAU;AAAA,IACpC,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,eAAe,CAAA;AAClD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACrD,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,YAAY,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAe;AACjC,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,EAAI,WAAA,EAAY;AAC3D,IAAA,MAAM,OACJ,GAAA,KAAQ,KAAA,GAAQ,KAAA,GACd,GAAA,KAAQ,QAAQ,KAAA,GAChB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,GAAI,UAC5E,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAO,KAAK,EAAE,QAAA,CAAS,GAAG,IAAI,IAAA,GACjG,MAAA;AACJ,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,GAAA,KAAQ,KAAA,EAAO,aAAA,CAAM,KAAA,CAAM,qEAAqE,CAAA;AAAA,WAC/F,aAAA,CAAM,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAA,IAAO,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAKpC,IAAA,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACd,MAAA,IAAI,MAAM,GAAA,EAAK,UAAA,CAAW,OAAO,CAAA,IAAK,IAAA,CAAK,QAAQ,GAAA,EAAK;AACtD,QAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,MAC9B;AACA,MAAA,OAAO,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA2C;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AACzB,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAuB;AACzC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,SAAA,EAAU;AACV,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,OAAA,mBACJ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,gHAAA;AAAA,QACP,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAU,yHAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,sUAAqU,CAAA,EAC5X,CAAA;AAAA,UAAM;AAAA;AAAA;AAAA,KAER;AAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA,kCAAA,EAAuB,CAAA;AAAA,IACvE,IAAA,EAAM,4BACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3C,GAAA,CAAC,UAAK,SAAA,EAAU,0DAAA,EAA2D,OAAO,IAAA,CAAK,QAAA,EAAW,eAAK,QAAA,EAAS;AAAA,KAAA,EAClH;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,mBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA0B,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1G,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,gQAA+P,CAAA,EACtT,CAAA;AAAA,sBACA,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA;AAAA,QAAA,6BAAA;AAAA,4BAA4B,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,EAAY,SAAA,EAAU,iCAAgC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA;AAAA,sBACzJ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sEAAA,EAAuE,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,wBACrG,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,YAAO;AAAA,WAAA,EAA6B,CAAA;AAAA,+BACrF,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,YAAO,wCAAA;AAAA,4BAAiC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,YAAO;AAAA,WAAA,EAAU,CAAA;AAAA,+BAChJ,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,YAAO,8BAAA;AAAA,4BAAuB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,YAAO;AAAA,WAAA,EAAU,CAAA;AAAA,+BAClL,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,4CAAA,EAA0C,CAAA;AAAA,YAAO;AAAA,WAAA,EAAgB;AAAA,SAAA,EACjH,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,mEAAA,EAAiE;AAAA,OAAA,EACxH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,GAAA,EAAK;AACvC,IAAA,IAAA,uBAAQ,eAAA,EAAA,EAAgB,QAAA,EAAU,KAAK,QAAA,EAAU,OAAA,EAAS,KAAK,iBAAA,EAAmB,CAAA;AAAA,EACpF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAC9B,IAAA,IAAA,mBAAO,GAAA,CAAC,QAAA,EAAA,EAAwB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC9H,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,IAAA,EAAM;AAC7B,IAAA,IAAA,mBAAO,GAAA,CAAC,SAAA,EAAA,EAAyB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC/H,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,IAAA,mBAAO,GAAA,CAAC,UAAA,EAAA,EAA0B,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAChI,CAAA,MAAO;AACL,IAAA,IAAA,mBAAO,GAAA,CAAC,QAAA,EAAA,EAAwB,GAAA,EAAK,IAAA,CAAK,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAA7F,KAAK,GAAiG,CAAA;AAAA,EAC9H;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,+BAAA;AAAA,MACV,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAa,CAAC,CAAA,KAAM;AAGlB,QAAA,IAAI,CAAC,CAAA,CAAE,YAAA,EAAc,KAAA,EAAO,QAAA,GAAW,OAAO,CAAA,EAAG;AAEjD,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACrD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,CAAa,OAAA,EAAA;AACb,QAAA,IAAI,CAAC,UAAA,EAAY,aAAA,CAAc,IAAI,CAAA;AAAA,MACrC,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,IAAI,CAAC,CAAA,CAAE,YAAA,EAAc,KAAA,EAAO,QAAA,GAAW,OAAO,CAAA,EAAG;AACjD,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACrD,QAAA,CAAA,CAAE,cAAA,EAAe;AAAA,MACnB,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,IAAI,YAAA,CAAa,OAAA,GAAU,CAAA,EAAG,YAAA,CAAa,OAAA,EAAA;AAC3C,QAAA,IAAI,YAAA,CAAa,OAAA,KAAY,CAAA,EAAG,aAAA,CAAc,KAAK,CAAA;AAAA,MACrD,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,QAAA,IAAI,CAAC,cAAA,CAAe,CAAA,CAAE,aAA4B,CAAA,EAAG;AACnD,UAAA,SAAA,EAAU;AACV,UAAA;AAAA,QACF;AACA,QAAA,UAAA,CAAW,CAAC,CAAA;AAAA,MACd,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,UAAA,CAAA,EAAc,CAAA;AAAA,QAC7C,OAAA;AAAA,wBACD,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QACrC,UAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kIAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAA4E,QAAA,EAAA,cAAA,EAE3F,CAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,OAAA,EAAQ,EAA2C;AACtF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAuC,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EACvH,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,IAAG,IAAA,EAAK,EAAA,EAAG,MAAK,CAAA,EAAE,IAAA,EAAK,eAAc,KAAA,EAAM,CAAA;AAAA,wBACnD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,eAAc,OAAA,EAAQ;AAAA,OAAA,EAC3D,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAiE,qBAAW,iBAAA,EAAkB,CAAA;AAAA,sBAC7G,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACrE,CAAA;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EAAsD,KAAA,EAAO,EAAE,SAAA,EAAW,uCAAA,IAA2C,CAAA,EACtI,CAAA;AAAA,oBACA,GAAA,CAAC,WAAO,QAAA,EAAA,CAAA,qGAAA,CAAA,EAAwG;AAAA,GAAA,EAClH,CAAA;AAEJ;AASA,SAAS,SAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAkB;AACvE,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAA2C,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,GAAG,CAAA;AACtC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAS,QAAA,CAAA,WAAA,CAAY,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,GAAA,KAAO;AAC5C,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAA,CAAO,GAAG,CAAA;AACV,MAAA,aAAA,CAAc,IAAI,QAAQ,CAAA;AAC1B,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW;AAAE,QAAA,aAAA,CAAM,MAAM,oBAAoB,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAG;AAAA,IAC1E,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,YAAA,CAAa,OAAA,EAAS;AACnC,IAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK;AACvB,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,WAAA,IAAe,GAAA;AACxD,MAAA,MAAM,WAAW,CAAA,CAAE,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAC3C,MAAA,MAAM,QAAA,GAAA,CAAY,UAAA,GAAa,EAAA,IAAM,QAAA,CAAS,KAAA;AAC9C,MAAA,QAAA,CAAS,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,GAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,SAAA,CAAU,OAAA,EAAS;AAChC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK;AAC1B,MAAA,IAAI,SAAA,IAAa,CAAC,SAAA,CAAU,OAAA,EAAS;AACrC,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,WAAA,CAAY,EAAE,OAAO,CAAA;AACxC,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,MAAA,CAAO,QAAQ,QAAA,CAAS,KAAA;AACxB,MAAA,MAAA,CAAO,SAAS,QAAA,CAAS,MAAA;AACzB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,CAAA,CAAE,MAAA,CAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,GAAA,EAAK,UAAU,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAErB,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA,aAAA,CAAM,MAAM,uBAAuB,CAAA;AAAG,MAAA;AAAA,IAAQ;AAC1D,IAAA,MAAM,WAA8B,EAAC;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,QAAA,CAAS,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK;AACrC,QAAA,MAAM,KAAK,CAAA,CAAE,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AACrC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,QAAA,CAAA,CAAE,QAAQ,EAAA,CAAG,KAAA;AAAO,QAAA,CAAA,CAAE,SAAS,EAAA,CAAG,MAAA;AAClC,QAAA,OAAO,EAAE,MAAA,CAAO,EAAE,QAAQ,CAAA,EAAG,aAAA,EAAe,EAAE,UAAA,CAAW,IAAI,GAAI,QAAA,EAAU,EAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA;AAAA,MACnH,CAAC,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU;AACnC,MAAA,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,uGAAA,CAAyG,CAAA;AAC1J,MAAA,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,UAAA,EAAa,GAAG,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACpE,MAAA,GAAA,CAAI,QAAA,CAAS,MAAM,gBAAgB,CAAA;AACnC,MAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AACnB,MAAA,UAAA,CAAW,MAAM;AAAE,QAAA,GAAA,CAAI,KAAA,EAAM;AAAG,QAAA,GAAA,CAAI,KAAA,EAAM;AAAA,MAAG,GAAG,GAAG,CAAA;AAAA,IACrD,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,YAAA,CAAa,OAAA,EAAS;AACnC,IAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK;AAC1B,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,WAAA,IAAe,GAAA;AACxD,MAAA,MAAM,WAAW,CAAA,CAAE,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAC3C,MAAA,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAK,UAAA,GAAa,EAAA,IAAM,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACzE,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,6FAAA;AAEZ,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA,EAAG,SAAA,EAAU,2DACtF,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,CAAA,EAAG,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,6BAAA,EAA8B,GAAE,CAAA,EAC1L,CAAA;AAAA,wBACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAK,KAAA;AAAA,UAAI;AAAA,SAAA,EAAW,CAAA;AAAA,4BAC7E,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAK,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,UAAU,IAAA,IAAQ,UAAA,EAAY,WAAU,yDAAA,EACxG,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,CAAA,EAAG,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAE,2BAAA,EAA4B,GAAE,CAAA,EACxL;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,SAAS,CAAA,CAAA,KAAK,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,KAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBAC1G,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA;AAAA,wBACxF,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,SAAS,CAAA,CAAA,KAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,KAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,4BACvG,QAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,KAAK,QAAA,EAAA,KAAA,EAAG;AAAA,OAAA,EAChD,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,WAAA,EAAa,SAAA,EAAW,GAAA,EACvC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,4lBAA2lB,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE/vB,CAAA;AAAA,6BACC,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,4GAA2G,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE/Q,CAAA;AAAA,QACC,2BACC,IAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,0PAAyP,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE7Z;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,wBAEC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAc,SAAA,EAAU,0DAAA,EAC/B,oCACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8DAAA,EAA+D,QAAA,EAAA,gBAAA,EAAc,oBAE5F,GAAA,CAAC,QAAA,EAAA,EAAO,KAAK,SAAA,EAAW,SAAA,EAAU,qBAAoB,CAAA,EAE1D;AAAA,GAAA,EACF,CAAA;AAEJ;AAaA,IAAM,iBAAA,GAA8B;AAAA,EAClC,0GAAA;AAAA,EACA,gIAAA;AAAA,EACA;AACF,CAAA;AASA,SAAS,SAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAkB;AACvE,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,OAAY,IAAI,CAAA;AAClC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,CAAqB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,MAAA,GAAc,IAAA;AAClB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,EAAE,CAAA;AAEZ,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,YAAY,CAAA;AACrC,QAAA,SAAA,GAAa,GAAA,CAAY,SAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,0CAA0C,CAAA;AACnD,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AACxC,MAAA,IAAI;AAMF,QAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,UAAA,MAAM,WAAW,MAAM;AACrB,YAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACtD,YAAA,IAAI,KAAK,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,CAAE,MAAA,GAAS,GAAG,OAAA,EAAQ;AAAA,uCACnB,QAAQ,CAAA;AAAA,UACrC,CAAA;AACA,UAAA,QAAA,EAAS;AAAA,QACX,CAAC,CAAA;AACD,QAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAGxC,QAAA,IAAI,KAAA,GAAa,IAAA;AACjB,QAAA,IAAI;AAAE,UAAA,KAAA,GAAQ,MAAM;AAAA;AAAA,YAA0B;AAAA,WAAc;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAC;AACxE,QAAA,MAAM,UAAA,GAAa,OAAO,KAAA,IAAS,IAAA;AACnC,QAAA,MAAM,UAAA,GAAkB,EAAE,UAAA,EAAY,IAAA,EAAK;AAC3C,QAAA,IAAI,UAAA,EAAY,UAAA,CAAW,UAAA,GAAa,IAAI,WAAW,QAAQ,CAAA;AAC/D,QAAA,MAAA,GAAS,IAAI,SAAA,CAAU,YAAA,CAAa,OAAA,EAAS,UAAU,CAAA;AACvD,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,QAAA,MAAM,QAAA,GAAY,OAAO,MAAA,KAAW,WAAA,IAAgB,OAAe,4BAAA,IAC9D,iBAAA;AACL,QAAA,MAAM,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,OAAO,QAAA,EAAU,aAAA,EAAe,MAAM,CAAA;AAC/D,QAAA,IAAI,SAAA,EAAW;AAGf,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAc,MAAA,CAAO,SAAA,IAAY,IAAK,EAAC;AAC7C,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,YAAA,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,CAAA,MAAM;AAAA,cACvB,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA;AAAA,cAChC,OAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,KAAA,CAAA;AAAA,cAC/C,OAAA,EAAS;AAAA,cACT,CAAC,CAAA;AAAA,UACL;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAAC;AAGT,QAAA,MAAM,QAAQ,MAAM;AAClB,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACzD,YAAA,IAAI,QAAQ,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,cAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,YAClE;AACA,YAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAY;AAClC,YAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAY;AAClC,YAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,cAAA,MAAA,CAAO,OAAA;AAAA,gBACL,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAAG,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAC7C,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,gBAAG,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,eAC/C;AAAA,YACF;AACA,YAAA,MAAA,CAAO,MAAA,IAAS;AAAA,UAClB,SAAS,GAAA,EAAK;AAEZ,YAAA,OAAA,CAAQ,IAAA,CAAK,8BAA8B,GAAG,CAAA;AAAA,UAChD;AAAA,QACF,CAAA;AACA,QAAA,KAAA,EAAM;AACN,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,CAAA,EAAG,WAAW,uBAAuB,CAAA;AAC9C,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AAAE,QAAA,MAAA,EAAQ,OAAA,IAAU;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AACpC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAGR,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,GAAG,GAAI,CAAA;AACnD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAiB;AACpC,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC9B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,IAAA,EAAM,OAAO,CAAA;AAC5B,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,CAAE,OAAA;AAChB,MAAA,IAAI;AAAE,QAAA,SAAA,CAAU,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC3D,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK;AAAA,IAC/B,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAAqB;AACzC,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC9B,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,OAAA,EAAS,OAAO,CAAA;AAClC,MAAA,IAAI;AAAE,QAAA,SAAA,CAAU,OAAA,EAAS,SAAA,GAAY,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAChE,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAQ;AAAA,IACzB,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAY;AAC9B,MAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAY;AAC9B,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,CAAA,CAAE,OAAA;AAAA,UACA,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAAG,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAC7C,MAAA,CAAO,OAAO,MAAA,CAAO,CAAA;AAAA,UAAG,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,SAC/C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,CAAA,EAAG,OAAA,IAAU;AAAA,MACf;AACA,MAAA,CAAA,EAAG,MAAA,IAAS;AAAA,IACd,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,6FAAA;AACZ,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAe;AAC/B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,MAAA;AAClC,IAAA,OAAO,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBAC/C,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EAAmC,QAAA,EAAA,QAAA,EAAS;AAAA,OAAA,EAC9D,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,YACpC,SAAA,EAAW,GAAA,IAAO,UAAA,GAAa,cAAA,GAAiB,EAAA,CAAA;AAAA,YAChD,KAAA,EAAM,yBAAA;AAAA,YACN,QAAA,EAAU,OAAO,MAAA,KAAW,CAAA;AAAA,YAE5B,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,wMAAuM,CAAA,EAAE,CAAA;AAAA,cAAM,SAAA;AAAA,cACjW,OAAO,MAAA,GAAS,CAAA,oBAAK,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,gBAAA,GAAA;AAAA,gBAAE,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,gBAAO,GAAA;AAAA,gBAAE,MAAA,CAAO,MAAA;AAAA,gBAAO;AAAA,eAAA,EAAC;AAAA;AAAA;AAAA,SACvH;AAAA,wBACA,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAY,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,GAAA,EAAK,KAAA,EAAM,iBAAA,EACjE,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,sMAAA,EAAuM,GAAE,CAAA,EACrW,CAAA;AAAA,wBACA,GAAA,CAAC,YAAO,OAAA,EAAS,eAAA,EAAiB,WAAW,GAAA,EAAK,KAAA,EAAM,uBAAsB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,6BAChF,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,4GAA2G,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE/Q,CAAA;AAAA,QACC,2BACC,IAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,0PAAyP,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE7Z;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAIb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAK,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAA;AAAA,MAEjE,cAAc,MAAA,CAAO,MAAA,GAAS,qBAC7B,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0IAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAClD,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAS,MAAM,YAAA,CAAa,IAAI,CAAA,EAAG,SAAA,EAAU,yDAAwD,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,4BAChH,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,aAAa,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4BAClH,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,SAAA,EAAU,uDAAA,EAAwD,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,WAAA,EAChI;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA,qBACV,IAAA,CAAC,OAAA,EAAA,EAAmB,SAAA,EAAU,oEAAA,EAC5B,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,QAAA,EAAU,MAAM,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AAAA,cAClC,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iEAAA;AAAA,cACV,OAAO,EAAE,UAAA,EAAY,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAE;AAAA,WACzC;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,KAAA,EAAO,EAAE,WAAA,EAAc,QAAA,EAAA,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA,EAAK;AAAA,SAAA,EAAA,EAX9E,CAAA,CAAE,IAYd,CACD,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,yBACxB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uKAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yBAAA,EACd,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,qIAAoI,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAExS,CAAA;AAAA,wBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,gGAA+F,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAEnQ,CAAA;AAAA,wBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjC,GAAA,CAAC,UAAK,QAAA,EAAA,cAAA,EAAY;AAAA,OAAA,EACpB,CAAA;AAAA,MAGD,OAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uFAAsF,QAAA,EAAA,uBAAA,EAAgB,CAAA;AAAA,MAEtH,KAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAA2F,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAEpH;AAAA,GAAA,EACF,CAAA;AAEJ;AAaA,IAAM,iBAAA,GAAoB,4DAAA;AAU1B,SAAS,SAAA,CAAU,IAAA,EAAW,KAAA,GAAQ,CAAA,EAAa;AACjD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA,CAAK,KAAA,IAAQ,IAAK,CAAA;AAAA,IACtB,MAAM,IAAA,CAAK,OAAA,IAAU,KAAM,KAAA,KAAU,IAAI,MAAA,GAAS,MAAA,CAAA;AAAA,IAClD,UAAA,EAAY,CAAC,CAAC,IAAA,CAAK,UAAA,IAAa;AAAA,IAChC,WAAA,EAAa,IAAA,CAAK,cAAA,IAAiB,IAAK,EAAC;AAAA,IACzC,QAAA,EAAA,CAAW,IAAA,CAAK,aAAA,IAAgB,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,SAAA,CAAU,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC;AAAA,GAClF;AACF;AAGA,SAAS,cAAA,CAAe,MAAgB,GAAA,EAAkB;AACxD,EAAA,GAAA,CAAI,GAAA,CAAI,KAAK,EAAE,CAAA;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,cAAA,CAAe,GAAG,GAAG,CAAA;AACtD;AAGA,SAAS,QAAA,CAAS,IAAS,GAAA,EAAa;AACtC,EAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAA;AACvC,EAAA,MAAM,IAAI,CAAA,GAAI,QAAA,CAAS,EAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AACnC,EAAA,OAAO,IAAI,EAAA,CAAG,QAAA,CAAU,CAAA,IAAK,EAAA,GAAM,KAAO,CAAA,IAAK,CAAA,GAAK,GAAA,EAAM,CAAA,GAAI,GAAI,CAAA;AACpE;AAMA,SAAS,UAAU,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAmB;AACzE,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,OAAY,IAAI,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,OAAY,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAG7C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA0B,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAkC,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAI,QAAA,iBAAsB,IAAI,KAAK,CAAA;AAG3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,SAAS,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,SAAS,CAAA;AACpD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,CAAC,CAAA;AAGpD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,IAAI,CAAA;AAGrD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA0B,GAAG,CAAA;AACnE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,GAAG,CAAA;AAC1D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,SAAS,CAAA;AAKhE,EAAA,MAAM,UAAA,GAAa,OAMT,IAAI,CAAA;AAGd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,MAAA,GAAc,IAAA;AAClB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,SAAA,iBAAU,IAAI,KAAK,CAAA;AAEnB,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,EAAA;AACJ,MAAA,IAAI;AACF,QAAA,EAAA,GAAK,MAAM,OAAO,kBAAkB,CAAA;AAAA,MACtC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,kFAAkF,CAAA;AAC3F,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,OAAA,GAAU,EAAA;AAChB,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAIxC,MAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,QAAA,MAAM,WAAW,MAAM;AACrB,UAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACtD,UAAA,IAAI,KAAK,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,CAAE,MAAA,GAAS,GAAG,OAAA,EAAQ;AAAA,qCACnB,QAAQ,CAAA;AAAA,QACrC,CAAA;AACA,QAAA,QAAA,EAAS;AAAA,MACX,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAExC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAY,OAAO,MAAA,KAAW,WAAA,IAAgB,OAAe,4BAAA,IAC9D,iBAAA;AACL,QAAA,EAAA,CAAG,yBAAyB,QAAQ,CAAA;AAEpC,QAAA,MAAA,GAAS,IAAI,EAAA,CAAG,cAAA,CAAe,YAAA,CAAa,OAAA,EAAS;AAAA,UACnD,iBAAiB,IAAI,EAAA,CAAG,UAAU,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,UACpD,cAAc,IAAI,EAAA,CAAG,QAAA,CAAS,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,UAC3C,YAAA,EAAc,IAAI,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,IAAI,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,UACnE,eAAe,MAAM;AACnB,YAAA,IAAI,SAAA,EAAW;AACf,YAAA,IAAI;AACF,cAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,IAAW;AAChC,cAAA,MAAM,IAAA,GAAO,OAAO,WAAA,IAAc;AAClC,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,MAAM,CAAA,GAAI,UAAU,IAAI,CAAA;AACxB,gBAAA,OAAA,CAAQ,CAAC,CAAA;AAET,gBAAA,MAAM,YAAqC,EAAE,CAAC,CAAA,CAAE,EAAE,GAAG,IAAA,EAAK;AAC1D,gBAAA,KAAA,MAAW,KAAK,CAAA,CAAE,QAAA,EAAU,SAAA,CAAU,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA;AAC9C,gBAAA,WAAA,CAAY,SAAS,CAAA;AAAA,cACvB;AAAA,YACF,SAAS,GAAA,EAAK;AAEZ,cAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,GAAG,CAAA;AAAA,YAC3D;AACA,YAAA,UAAA,CAAW,KAAK,CAAA;AAAA,UAClB,CAAA;AAAA,UACA,mBAAmB,MAAM;AACvB,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,QAAA,CAAS,0BAA0B,CAAA;AACnC,cAAA,UAAA,CAAW,KAAK,CAAA;AAAA,YAClB;AAAA,UACF;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,QAAA,MAAM,SAAA,GAAY,IAAI,EAAA,CAAG,SAAA,CAAU,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,GAAG,CAAA;AACnE,QAAA,MAAA,CAAO,uBAAA,CAAwB,CAAC,SAAS,CAAC,CAAA;AAAA,MAC5C,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,CAAA,EAAG,WAAW,0BAA0B,CAAA;AACjD,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AAAE,QAAA,MAAA,EAAQ,OAAA,IAAU;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AACpC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,QAAQ,CAAC,CAAA;AAKlB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,GAAG,MAAA,EAAQ;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAc;AAC3B,QAAA,IAAI,IAAA,CAAK,UAAU,eAAA,EAAiB;AACpC,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,EAAU,oBAAA,IAAwB,IAAA,CAAK,QAAA;AACvD,QAAA,MAAM,MAAA,GAA6B,EAAA,EAAI,EAAA,EAAI,MAAA,IAAU,EAAA,EAAI,MAAA;AACzD,QAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,OAAA,GAAU,CAAC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,QACnC;AAAA,MACF,CAAA;AACA,MAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,uBAAA,GAA0B,KAAK,CAAA;AACnD,MAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,KAAK,CAAA;AAC1C,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AAAA,IACxD;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAGjB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,MAAA,CAAO,eAAA,CAAgB,IAAI,EAAA,CAAG,YAAA,CAAa,SAAA,EAAW,QAAA,CAAS,EAAA,EAAI,SAAS,CAAA,EAAG,aAAa,CAAC,CAAA;AAC/F,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,SAAA,EAAW,SAAA,EAAW,aAAa,CAAC,CAAA;AAGxC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,EAAA,EAAI,OAAO,CAAA;AAC9B,MAAA,CAAA,CAAE,MAAA,CAAO,kBAAA,CAAmB,IAAI,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAC,CAAA;AAChE,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAcZ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,OAAA,EAAS;AAE3B,IAAA,MAAM,QAAA,GAAW,EAAE,MAAA,CAAO,QAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AAGzB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,CAAA,CAAE,aAAA,CAAc,SAAQ,EAAG;AACnD,QAAA,GAAA,CAAI,iBAAiB,IAAA,CAAK,cAAA;AAC1B,QAAA,GAAA,CAAI,cAAc,IAAA,CAAK,WAAA;AACvB,QAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,MACpB;AACA,MAAA,KAAA,MAAW,MAAA,IAAU,EAAE,OAAA,EAAS;AAC9B,QAAA,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAE5B,QAAA,MAAA,CAAO,UAAU,OAAA,IAAU;AAAA,MAC7B;AACA,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,KAAA,CAAM,MAAA,CAAO,EAAE,OAAO,CAAA;AACtB,QAAA,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAA,IAAU;AAC9B,QAAA,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAA,IAAU;AAAA,MAChC;AACA,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,QAAA,CAAS,oBAAA,GAAuB,KAAA;AAChC,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,cAAA,GAAiB,MAAM,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,eAAA,GAAkB,CAAC,IAAA,KAAc;AACnD,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,eAAA,EAAiB,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACxD,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,QAAA,CAAS,oBAAA,GAAuB,KAAA;AAChC,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAClB,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAM,OAAO,MAAA,CAAO,WAAA;AACpB,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAU,WAAA;AAClC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAU,WAAA;AAClC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,WAAA;AAC1D,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,YAAY,CAAC,QAAA,IAAY,CAAC,UAAA,EAAY;AAGlD,MAAA,OAAA,CAAQ,KAAK,uEAAuE,CAAA;AAAA,IACtF;AAGA,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,QAAA,GAAW,CAAA,EAAG,UAAA,GAAa,CAAA;AAChD,IAAA,MAAM,iBAAA,GAAoB,KAAK,mBAAA,GAAsB,GAAA;AACrD,IAAA,MAAM,sBAAA,GAAyB,MAAM,sBAAA,GAAyB,IAAA;AAC9D,IAAA,MAAM,gBAAA,GAAmB,IAAA;AAEzB,IAAA,MAAM,KAAA,GAAa,EAAE,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG,EAAG,QAAA,EAAU,CAAA,EAAE;AAChE,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoD;AAE9E,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAa;AACpC,MAAA,IAAI,CAAC,GAAA,IAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AACpC,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,EAAE,cAAA,EAAgB,IAAI,cAAA,EAAgB,WAAA,EAAa,GAAA,CAAI,WAAA,EAAa,CAAA;AAC3F,MAAA,GAAA,CAAI,cAAA,GAAiB,CAAC,KAAK,CAAA;AAC3B,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,IACpB,CAAA;AAEA,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,MAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,kBAAqB,CAAC,CAAA;AAAA,2BACzC,GAAG,CAAA;AAKxB,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAM,WAAA,GAAc,CAAC,IAAA,EAAc,EAAA,KAAe;AAChD,UAAA,MAAM,CAAA,GAAS,IAAI,QAAA,EAAS;AAC5B,UAAA,CAAA,CAAE,UAAA,GAAa,KAAA;AACf,UAAA,CAAA,CAAE,SAAA,GAAY,KAAA;AACd,UAAA,CAAA,CAAE,UAAA,GAAa,KAAA;AACf,UAAA,CAAA,CAAE,YAAA,GAAe,IAAA;AACjB,UAAA,CAAA,CAAE,WAAA,GAAc,iBAAA;AAChB,UAAA,CAAA,CAAE,WAAA,GAAc,EAAA;AAChB,UAAA,CAAA,CAAE,YAAA,GAAe,EAAA;AACjB,UAAA,CAAA,CAAE,YAAA,GAAe,EAAA;AACjB,UAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,UAAA,CAAA,CAAE,cAAA,GAAiB,CAAC,KAAK,CAAA;AACzB,UAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAChB,UAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,CAAC,CAAA;AACxC,UAAA,MAAA,CAAO,gBAAA,GAAmB,KAAA;AAC1B,UAAA,MAAA,CAAO,WAAA,GAAc,CAAA;AACrB,UAAA,MAAA,CAAO,SAAS,eAAA,GAAkB,IAAA;AAClC,UAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,UAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QACrB,CAAA;AACA,QAAA,WAAA,CAAY,UAAU,sBAAsB,CAAA;AAC5C,QAAA,WAAA,CAAY,WAAW,sBAAsB,CAAA;AAAA,MAC/C;AAAA,IACF;AAGA,IAAA,CAAA,CAAE,MAAA,CAAO,SAAA,EAAW,cAAA,GAAiB,CAAC,IAAA,KAAc;AAClD,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,MAAA,IAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,aAAc,CAAA,IAAK,GAAA,kBAAqB,CAAC,CAAA;AAAA,2BACzC,GAAG,CAAA;AAAA,IAC1B,CAAC,CAAA;AAID,IAAA,IAAI,OAAA,GAAe,IAAA;AACnB,IAAA,IAAI,IAAA,IAAQ,QAAA,IAAY,QAAA,IAAY,UAAA,EAAY;AAC9C,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACjC,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA,GAAI,CAAA;AAC1C,MAAA,MAAM,OAAO,OAAA,GAAU,CAAA;AAEvB,MAAA,MAAM,OAAA,GAAe,IAAI,QAAA,EAAS;AAClC,MAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa;AAAA,QACjC,CAAC,IAAA;AAAA,QAAM,CAAC,IAAA;AAAA,QAAM,CAAA;AAAA,QACb,IAAA;AAAA,QAAM,CAAC,IAAA;AAAA,QAAM,CAAA;AAAA,QACb,IAAA;AAAA,QAAO,IAAA;AAAA,QAAM,CAAA;AAAA,QACd,CAAC,IAAA;AAAA,QAAO,IAAA;AAAA,QAAM;AAAA,OACf,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa;AAAA,QAC/B,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,CAAA;AAAA,QAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG;AAAA,OACrC,CAAA;AACD,MAAA,OAAA,CAAQ,aAAa,UAAA,EAAY,IAAI,UAAA,CAAW,SAAA,EAAW,CAAC,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,aAAa,QAAA,EAAU,IAAI,UAAA,CAAW,OAAA,EAAS,CAAC,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAEnC,MAAA,MAAM,MAAA,GAAc,IAAI,QAAA,EAAS;AACjC,MAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,IAAA,CAAK,eAAe,CAAA;AACnD,MAAA,MAAM,WAAW,CAAA,GAAI,QAAA,CAAS,EAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,EAAO,SAAS,QAAQ,CAAA;AAC/B,MAAA,MAAA,CAAO,IAAA,GAAO,UAAA;AACd,MAAA,MAAA,CAAO,YAAA,GAAe,IAAA;AACtB,MAAA,MAAA,CAAO,UAAA,GAAa,CAAA;AACpB,MAAA,MAAA,CAAO,WAAA,GAAc,mBAAA;AACrB,MAAA,MAAA,CAAO,WAAA,GAAc,gBAAA;AACrB,MAAA,MAAA,CAAO,YAAA,GAAe,gBAAA;AACtB,MAAA,MAAA,CAAO,YAAA,GAAe,gBAAA;AAEtB,MAAA,MAAA,CAAO,iBAAiB,EAAC;AAEzB,MAAA,OAAA,GAAU,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAClC,MAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,MAAA,OAAA,CAAQ,SAAS,eAAA,GAAkB,IAAA;AACnC,MAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACnB;AAEA,IAAA,QAAA,CAAS,oBAAA,GAAuB,IAAA;AAChC,IAAA,UAAA,CAAW,UAAU,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,eAAe,IAAA,EAAK;AACpE,IAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,EACpB,GAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,IAAA,EAAM,eAAe,CAAC,CAAA;AAGnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,MAAM,IAAI,UAAA,CAAW,OAAA;AACrB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,CAAC,CAAA,IAAK,CAAC,cAAA,EAAgB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,MAAA,MAAM,UAAU,WAAA,KAAgB,GAAA,GAAM,CAAA,GAAI,WAAA,KAAgB,MAAM,CAAA,GAAI,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAE,OAAO,CAAA;AACxD,MAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAE,OAAO,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,GAAA,GAAA,CAAO,GAAA,GAAM,GAAA,IAAO,eAAA;AAIlC,MAAA,MAAM,GAAA,GAAM,cAAc,CAAA,GAAI,CAAA,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,GAAA,GAAM,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,GAAA,GAAM,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,WAAA,KAAgB,GAAA,GAAM,GAAA,GAAM,CAAA;AACvC,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,QAAA,GAAW,CAAC,GAAA,GAAM,KAAA;AAI1B,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACvC,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACvC,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAEvC,QAAA,MAAM,IAAA,GAAO,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,EAAE,KAAA,CAAM,QAAA;AACnD,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,IAAA;AACrB,QAAA,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AACjC,QAAA,CAAA,CAAE,QAAQ,MAAA,GAAS,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAAA,MAC9C;AAEA,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,mCAAmC,GAAG,CAAA;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,WAAA,EAAa,WAAA,EAAa,eAAe,CAAC,CAAA;AAG9D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,GAAG,GAAI,CAAA;AACnD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAmB;AAC5C,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,cAAA,CAAe,MAAM,GAAG,CAAA;AACxB,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AAChB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AAEzB,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAA,EAAA,KAAM,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACpD,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,aACtB,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MACrB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAe;AACrC,IAAA,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,EAAE,GAAG,CAAC,IAAA,CAAK,EAAE,CAAA,EAAE,CAAE,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAmB;AAGlC,IAAA,SAAA,EAAU;AAEL,EACP,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAA,EAAQ,iBAAA,GAAoB,MAAM,IAAI,CAAA;AACxD,MAAA,IAAI,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AACnD,MAAA,CAAA,EAAG,QAAQ,MAAA,IAAS;AAAA,IACtB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAA6C;AACpE,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,IAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,CAAA,EAAG,MAAA,EAAQ;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,iBAAA,GAAoB,MAAM,IAAI,CAAA;AACtD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,MAAA,MAAM,CAAA,GAAI,OAAO,MAAA,IAAU,CAAA;AAC3B,MAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,EAAE,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA;AAChD,MAAA,IAAI,GAAA,EAAU,EAAA;AACd,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,KAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,EAAA,EAAI,KAAK,IAAI,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,OAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,EAAA,GAAK,MAAM,EAAE,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,MAAA;AAAS,UAAA,GAAA,GAAM,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,GAAK,IAAA,EAAM,IAAI,EAAE,CAAA;AAAG,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QACrF,KAAK,KAAA;AAAA,QACL,SAAS;AACP,UAAA,MAAM,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAC5B,UAAA,GAAA,GAAM,IAAI,GAAG,OAAA,CAAQ,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAC3C,UAAA,EAAA,GAAK,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3B,UAAA;AAAA,QACF;AAAA;AAEF,MAAA,MAAM,SAAS,IAAI,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,IAAI,EAAE,CAAA;AACxC,MAAA,MAAM,MAAM,IAAI,EAAA,CAAG,OAAO,GAAA,EAAK,MAAA,EAAQ,IAAI,EAAE,CAAA;AAC7C,MAAA,CAAA,CAAE,MAAA,CAAO,UAAU,GAAG,CAAA;AACtB,MAAA,CAAA,CAAE,MAAA,CAAO,+BAA+B,MAAM,CAAA;AAC9C,MAAA,CAAA,CAAE,OAAO,MAAA,IAAS;AAAA,IACpB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,MAAA,MAAM,IAAA,GAAO,GAAG,MAAA,EAAQ,aAAA,QAAqB,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AACxE,MAAA,MAAM,OAAA,GAAU,GAAG,MAAA,EAAQ,iBAAA,GAAoB,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC7E,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,OAAA;AACT,MAAA,CAAA,CAAE,WAAW,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,aAAA,CAAA;AAChD,MAAA,CAAA,CAAE,KAAA,EAAM;AAAA,IACV,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,UAAA,CAAW,SAAS,CAAA;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,cAAA,CAAe,GAAG,CAAA;AAClB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,IAAA,kBAAA,CAAmB,SAAS,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,GAAA,GAAA,CAAO,SAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,IAAK,IAAI,WAAA,EAAY;AAG1D,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAgB,KAAA,GAAQ,CAAA,KAAuB;AACrE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,KAAM,KAAA;AACzC,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,CAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AACrC,IAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sGAAA;AAAA,UACV,OAAO,EAAE,WAAA,EAAa,GAAG,KAAA,GAAQ,EAAA,GAAK,CAAC,CAAA,EAAA,CAAA,EAAK;AAAA,UAE3C,QAAA,EAAA;AAAA,YAAA,WAAA,mBACC,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,CAAK,EAAE,CAAA;AAAA,gBACrC,SAAA,EAAU,qFAAA;AAAA,gBACV,KAAA,EAAO,aAAa,UAAA,GAAa,QAAA;AAAA,gBAEjC,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAC1F,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAAG,UAAA,GAAa,6BAAA,GAAgC,2BAAA,EAA6B,CAAA,EAClI;AAAA;AAAA,aACF,uBAEC,MAAA,EAAA,EAAK,SAAA,EAAU,qDACd,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,CAAA,EACrD,CAAA;AAAA,4BAEF,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,gBAAA,EAAmB,SAAA,GAAY,EAAA,GAAK,YAAY,CAAA,CAAA,EAAI,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,4BAClG,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,OAAA,CAAY,CAAA;AAAA,gBAC3B,SAAA,EAAU,yGAAA;AAAA,gBACV,KAAA,EAAM,aAAA;AAAA,gBAEN,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,yJAAwJ,CAAA,EAC/M;AAAA;AAAA,aACF;AAAA,4BACA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,gBACrC,SAAA,EAAU,oDAAA;AAAA,gBACV,KAAA,EAAO,YAAY,MAAA,GAAS,MAAA;AAAA,gBAE3B,QAAA,EAAA,SAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC9F,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,wLAAA,EAAyL,CAAA;AAAA,sCAC7O,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kCAAA,EAAmC;AAAA,iBAAA,EAC1F,CAAA,uBAEC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAc,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,gBAAe,WAAA,EAAa,GAAA,EAC9F,8BAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uUAAA,EAAwU,CAAA,EAC/X;AAAA;AAAA;AAEJ;AAAA;AAAA,OACF;AAAA,MACC,UAAA,IAAc,WAAA,oBACb,GAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAE;AAAA,KAAA,EAAA,EAhDrD,KAAK,EAkDf,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,iIAAA;AACb,EAAA,MAAM,UAAA,GAAa,qFAAA;AACnB,EAAA,MAAM,OAAA,GAAU,2BAAA;AAEhB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAEb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kFAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8EAAA,EAA+E,KAAA,EAAO,UAAW,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,sBAC1H,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,sBACzB,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,aAAA,EACjD,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,uJAAA,EAAwJ,GAC/M,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,0BACxB,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,kBACpE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,0BACC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,YACpE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,0BACC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,OAAO,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,cACtE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,0BACC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,aACrE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,iBAAG,CAAA,EACjD,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,0BACxB,QAAA,EAAA,EAAO,OAAA,EAAS,gBAAgB,SAAA,EAAW,IAAA,EAAM,OAAM,sBAAA,EACtD,QAAA,kBAAA,IAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,mWAAA,EAAoW,CAAA;AAAA,4BACxZ,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,gFAAA,EAAiF;AAAA,OAAA,EACxI,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAY,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,WAAW,IAAA,EAAM,KAAA,EAAM,iBAAA,EAClE,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1F,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,sMAAA,EAAuM,GAC9P,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,0BACvB,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,aAAA,CAAc,OAAK,CAAC,CAAC,CAAA,EAAG,SAAA,EAAW,aAAa,UAAA,GAAa,IAAA,EAAM,KAAA,EAAM,qBAAA,EAC9F,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,QAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC1F,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,8CAAA,EAA+C,GACtG,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,EAAG,SAAA,EAAW,YAAA,GAAe,UAAA,GAAa,IAAA,EAAM,OAAM,sBAAA,EAClG,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,w9BAAA,EAAy9B,CAAA;AAAA,4BAC7gC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,kCAAA,EAAmC;AAAA,OAAA,EAC1F,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,IAAc,qBAAA,EAAuB,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,wBAAA,EAC3E,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,0GAAA,EAA2G,GAClK,CAAA,EACF,CAAA;AAAA,MACC,OAAA,oBACC,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,KAAA,EAAM,OAAA,EAC/C,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC1F,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,wPAAA,EAAyP,GAChT,CAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oGAAA,EAAqG,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,wBAC1H,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,iBAAO,cAAA,CAAe,IAAI,CAAA,mBACzB,GAAA,CAAC,SAAI,SAAA,EAAU,4CAAA,EAA8C,QAAA,EAAA,OAAA,GAAU,qBAAA,GAAmB,0BAAyB,CAAA,EAEvH,CAAA;AAAA,QACC,IAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACZ,QAAA,EAAA,MAAA,CAAO,IAAA,KAAS,CAAA,GAAI,aAAA,GAAgB,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,OAAA,CAAA,EACrD;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAGF,IAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA0B,OAAO,EAAE,UAAA,EAAY,SAAQ,EACpE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAK,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAA;AAAA,QAEjE,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,yBACxB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uKAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,0BACpB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,0BACjC,GAAA,CAAC,UAAK,QAAA,EAAA,yBAAA,EAAuB,CAAA;AAAA,0BAC7B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,0BACjC,GAAA,CAAC,UAAK,QAAA,EAAA,gBAAA,EAAc;AAAA,SAAA,EACtB,CAAA;AAAA,QAGD,OAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oGAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EACrH,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,IAAG,IAAA,EAAK,EAAA,EAAG,MAAK,CAAA,EAAE,IAAA,EAAK,eAAc,KAAA,EAAM,CAAA;AAAA,4BACnD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,eAAc,OAAA,EAAQ;AAAA,WAAA,EAC3D,CAAA;AAAA,0BACA,GAAA,CAAC,UAAK,QAAA,EAAA,wBAAA,EAAiB,CAAA;AAAA,UACtB,GAAA,KAAQ,SAAS,GAAA,KAAQ,MAAA,uBAAU,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,wDAAA,EAAsD,CAAA,GAAU;AAAA,SAAA,EACjJ,CAAA;AAAA,QAED,KAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uGAAuG,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EAEhI,CAAA;AAAA,MAEC,YAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oGAAA,EAAqG,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,wBACjI,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,4BACtB,GAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA,KAAM,WAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,WAAU,kDAAA,EAAmD;AAAA,WAAA,EAChJ,CAAA;AAAA,0BACA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAChB,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,YAAA,CAAa,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,gBACnC,SAAA,EAAW,CAAA,gDAAA,EAAmD,SAAA,GAAY,aAAA,GAAgB,aAAa,CAAA,CAAA;AAAA,gBAEvG,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,uEAAuE,SAAA,GAAY,eAAA,GAAkB,iBAAiB,CAAA,CAAA,EAAI;AAAA;AAAA;AAC7I,WAAA,EACF,CAAA;AAAA,0BACA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,GAAY,EAAA,GAAK,cAAc,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAC1D,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,KAAA,EAAO,SAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC5C,UAAU,CAAC,SAAA;AAAA,gBACX,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,SAAA,GAAY,KAAK,gCAAA,EAC/B,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,UAAK,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,8BACpB,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,gBAAA,aAAA;AAAA,gBAAc;AAAA,eAAA,EAAC;AAAA,aAAA,EAC/D,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,GAAA,EAAK,EAAA;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,KAAA,EAAO,aAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACxD,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,yCAAA,EACf,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,8BAC1C,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,kBACxC,SAAA,EAAW,CAAA,gDAAA,EAAmD,cAAA,GAAiB,aAAA,GAAgB,aAAa,CAAA,CAAA;AAAA,kBAE5G,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,uEAAuE,cAAA,GAAiB,eAAA,GAAkB,iBAAiB,CAAA,CAAA,EAAI;AAAA;AAAA;AAClJ,aAAA,EACF,CAAA;AAAA,4BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,GAAiB,mBAAmB,+CAAA,EAClD,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,UAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,kCACV,GAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,sBACrC,SAAA,EAAU,mGAAA;AAAA,sBACV,KAAA,EAAM,wBAAA;AAAA,sBAEL,wBAAc,gBAAA,GAAc;AAAA;AAAA;AAC/B,iBAAA,EACF,CAAA;AAAA,gCACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACX,QAAA,EAAA,CAAC,KAAK,GAAA,EAAK,GAAG,CAAA,CAAY,GAAA,CAAI,CAAA,EAAA,qBAC9B,GAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,oBAChC,SAAA,EAAW,CAAA,uCAAA,EAA0C,WAAA,KAAgB,EAAA,GAAK,2BAA2B,6CAA6C,CAAA,CAAA;AAAA,oBAEjJ,aAAG,WAAA;AAAY,mBAAA;AAAA,kBAJX;AAAA,iBAMR,CAAA,EACH;AAAA,eAAA,EACF,CAAA;AAAA,mCAEC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,UAAK,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,kCACd,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,GAAG,CAAA;AAAA,oBAAE;AAAA,mBAAA,EAAC;AAAA,iBAAA,EACnF,CAAA;AAAA,gCACA,GAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,GAAA,EAAK,CAAA;AAAA,oBACL,IAAA,EAAM,IAAA;AAAA,oBACN,KAAA,EAAO,eAAA;AAAA,oBACP,QAAA,EAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,oBAC1D,SAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF,CAAA;AAAA,8BAEA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EACf,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAK,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,gCACf,GAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,KAAA,EAAO,eAAA;AAAA,oBACP,UAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBAClD,SAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF;AAAA,aAAA,EAEF;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACb,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,kBAAA;AAAA,YACT,SAAA,EAAU,iGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AASA,SAAS,WAAW,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,SAAQ,EAAoB;AAC3E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,KAAK,CAAA;AAExC,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,6FAAA;AAEZ,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBACjD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EAAmC,QAAA,EAAA,QAAA,EAAS;AAAA,OAAA,EAC9D,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,KAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACzG,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC,CAAA;AAAA,wBACvF,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAA,CAAA,KAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,IAAQ,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,KAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACvG,GAAA,CAAC,YAAO,OAAA,EAAS,MAAM,QAAQ,CAAC,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,QAAA,EAAA,KAAA,EAAG;AAAA,OAAA,EACxD,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,IAAc,qBAAA,EAAuB,WAAW,GAAA,EAC/D,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,4GAA2G,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE/Q,CAAA;AAAA,QACC,2BACC,IAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,WAAW,GAAA,EACnC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAAK,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,0PAAyP,CAAA,EAAE,CAAA;AAAA,UAAM;AAAA,SAAA,EAE7Z;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACZ,QAAA,EAAA,KAAA,uBACE,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA,uBAAA,EAAqB,CAAA,mBAE3D,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,QAC5B,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,CAAA,EAAK,eAAA,EAAiB,eAAA,EAAiB,UAAA,EAAY,sBAAA,EAAuB;AAAA,QAC3G,SAAA,EAAU;AAAA;AAAA,KACZ,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-IQWRDQHW.js","sourcesContent":["/**\n * Preview — windowed PDF viewer app.\n *\n * Consumers stage a PDF via `setPdfPreview({ url, filename, ... })` and then\n * call `openPage('/preview')`. If the window is already open, it swaps to the\n * new PDF in-place via a custom event.\n */\nimport { useState, useEffect, useRef } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport toast from '../shell/toast';\nimport { WindowTitle, getActiveModalId } from '../shell/Modal';\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\n// Default the worker to the matching unpkg build (mirrors the consumer's\n// installed npm version exactly). Consumers can override by setting\n// pdfjsLib.GlobalWorkerOptions.workerSrc themselves before opening the\n// Preview window.\nif (typeof window !== 'undefined' && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc =\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`;\n}\n\nexport interface PdfPreviewData {\n /** Object URL or remote URL of the PDF. Blob URLs are revoked when the window unmounts.\n * Leave blank when staging a `converting: true` placeholder; call `setPdfPreview` again\n * with the resolved URL once conversion finishes. */\n url?: string;\n /** Display name (and download filename). */\n filename: string;\n /** Renderer to use. Defaults to `'pdf'`. `'dxf'` requires the consumer to\n * have `dxf-viewer` installed (it's an optional peer dep). `'image'`\n * renders an `<img>` for raster screenshots / photos. `'3d'` covers\n * STEP / STL / OBJ / GLTF / 3MF / IGES via the optional\n * `online-3d-viewer` peer dep. */\n kind?: 'pdf' | 'dxf' | 'image' | '3d';\n /** Optional download handler — replaces the built-in \"save URL as filename\" if supplied. */\n onDownload?: () => void;\n /** Optional email handler — only shown when supplied. */\n onEmail?: () => void;\n /** Show a progress placeholder while the consumer fetches/converts the file. */\n converting?: boolean;\n /** Headline shown on the converting placeholder (e.g. \"CONVERTING DWG FILE\"). */\n convertingMessage?: string;\n}\n\nconst EVENT_NAME = 'react-os-shell:pdf-preview';\n\nlet pendingData: PdfPreviewData | null = null;\n\n/** Stage a PDF for the next Preview window mount, or swap into an open one. */\nexport function setPdfPreview(data: PdfPreviewData) {\n pendingData = data;\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: data }));\n }\n}\n\nexport default function Preview() {\n const [data, setData] = useState<PdfPreviewData | null>(() => {\n const d = pendingData;\n pendingData = null;\n return d;\n });\n\n // Swap to a new PDF if `setPdfPreview` is called while the window is open.\n useEffect(() => {\n const handler = (e: Event) => {\n const next = (e as CustomEvent<PdfPreviewData>).detail;\n setData(prev => {\n if (prev?.url && prev.url !== next.url && prev.url.startsWith('blob:')) {\n URL.revokeObjectURL(prev.url);\n }\n return next;\n });\n };\n window.addEventListener(EVENT_NAME, handler);\n return () => window.removeEventListener(EVENT_NAME, handler);\n }, []);\n\n // Revoke blob URL on unmount.\n useEffect(() => () => {\n if (data?.url?.startsWith('blob:')) URL.revokeObjectURL(data.url);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Window title reflects whatever is loaded — same pattern Spreadsheets uses.\n const titleName = data?.filename ? truncateForTitle(data.filename) : 'Untitled';\n\n const fileRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n // Drag-enter/leave fire on every child the cursor crosses, so a single\n // boolean flickers. Track depth with a counter — overlay shows on first\n // enter, clears only when the counter unwinds back to zero.\n const dragDepthRef = useRef(0);\n const handlePick = () => fileRef.current?.click();\n const resetDrag = () => {\n dragDepthRef.current = 0;\n setIsDragging(false);\n };\n // Only the frontmost (active) Preview window should accept drags. With\n // multiple Previews open this prevents the overlay flashing on every\n // window the cursor crosses, and matches the user's expectation that\n // they activate a window first by clicking it.\n const isActiveWindow = (el: HTMLElement) => {\n const myModal = el.closest('[data-modal-id]') as HTMLElement | null;\n if (!myModal) return true; // outside any modal — be permissive\n return getActiveModalId() === myModal.dataset.modalId;\n };\n // If the drag ends outside our component (e.g. dropped onto desktop trash),\n // we never receive `drop` or our outer `dragleave`. Listen on window so\n // any end of any drag clears the overlay. Also wire ESC as an escape hatch.\n useEffect(() => {\n const onWindowDragEnd = () => resetDrag();\n const onWindowDrop = () => resetDrag();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') resetDrag();\n };\n window.addEventListener('dragend', onWindowDragEnd);\n window.addEventListener('drop', onWindowDrop);\n window.addEventListener('keydown', onKey);\n return () => {\n window.removeEventListener('dragend', onWindowDragEnd);\n window.removeEventListener('drop', onWindowDrop);\n window.removeEventListener('keydown', onKey);\n };\n }, []);\n const ingestFile = (file: File) => {\n const ext = (file.name.split('.').pop() || '').toLowerCase();\n const kind: 'pdf' | 'image' | 'dxf' | '3d' | undefined =\n ext === 'pdf' ? 'pdf'\n : ext === 'dxf' ? 'dxf'\n : ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext) ? 'image'\n : ['stp', 'step', 'stl', 'obj', 'gltf', 'glb', '3mf', 'iges', 'igs', 'ply', 'fbx'].includes(ext) ? '3d'\n : undefined;\n if (!kind) {\n if (ext === 'dwg') toast.error('DWG files need server-side conversion. Convert to PDF or DXF first.');\n else toast.error(`Unsupported file type: .${ext || 'unknown'}`);\n return;\n }\n const url = URL.createObjectURL(file);\n // Local-only update: do NOT route through setPdfPreview, which dispatches\n // a global event that every other open Preview window also listens to —\n // that would replace whatever those other windows are showing. Update\n // only this instance's state.\n setData(prev => {\n if (prev?.url?.startsWith('blob:') && prev.url !== url) {\n URL.revokeObjectURL(prev.url);\n }\n return { url, filename: file.name, kind };\n });\n };\n const handleFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) ingestFile(file);\n if (fileRef.current) fileRef.current.value = '';\n };\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n resetDrag();\n const file = e.dataTransfer.files?.[0];\n if (file) ingestFile(file);\n };\n\n const Toolbar = (\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".pdf,.dxf,.jpg,.jpeg,.png,.gif,.webp,.svg,.avif,.bmp,.stp,.step,.stl,.obj,.gltf,.glb,.3mf,.iges,.igs,.ply,.fbx\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n onClick={handlePick}\n className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776\" />\n </svg>\n Open\n </button>\n <span className=\"text-[10px] text-gray-400 ml-1\">PDF · DXF · 3D · Images</span>\n {data?.filename && (\n <>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <span className=\"text-xs font-medium text-gray-700 truncate max-w-[200px]\" title={data.filename}>{data.filename}</span>\n </>\n )}\n </div>\n );\n\n let body: React.ReactNode;\n if (!data) {\n body = (\n <div className=\"flex flex-1 flex-col items-center justify-center text-gray-500 text-sm gap-3 p-8 text-center\">\n <svg className=\"h-12 w-12 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n <p className=\"font-medium text-gray-700\">Drop a file here, or click <button onClick={handlePick} className=\"text-blue-600 hover:underline\">Open</button>.</p>\n <div className=\"text-xs text-gray-500 max-w-sm\">\n <p className=\"font-semibold uppercase tracking-wide text-[10px] text-gray-400 mb-1\">Supported formats</p>\n <ul className=\"space-y-0.5\">\n <li><span className=\"font-mono text-gray-700\">.pdf</span> — multi-page document viewer</li>\n <li><span className=\"font-mono text-gray-700\">.dxf</span> — vector CAD drawings (optional <span className=\"font-mono\">dxf-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.stp .step .stl .obj .gltf .glb .3mf .iges</span> — 3D models (optional <span className=\"font-mono\">online-3d-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.jpg .jpeg .png .gif .webp .svg .avif .bmp</span> — raster images</li>\n </ul>\n <p className=\"mt-2 text-[11px] text-gray-400 italic\">DWG files need to be converted to PDF or DXF first (server-side).</p>\n </div>\n </div>\n );\n } else if (data.converting || !data.url) {\n body = <ConvertingPanel filename={data.filename} message={data.convertingMessage} />;\n } else if (data.kind === 'dxf') {\n body = <DxfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === '3d') {\n body = <StepPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === 'image') {\n body = <ImagePanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else {\n body = <PdfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n }\n\n return (\n <div\n className=\"relative flex flex-col h-full\"\n ref={rootRef}\n onDragEnter={(e) => {\n // Only count drags that actually carry files — ignore stray drags\n // (e.g. text selections) so we don't flash the overlay.\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n // And only the active (frontmost) Preview window responds.\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n dragDepthRef.current++;\n if (!isDragging) setIsDragging(true);\n }}\n onDragOver={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n }}\n onDragLeave={() => {\n if (dragDepthRef.current > 0) dragDepthRef.current--;\n if (dragDepthRef.current === 0) setIsDragging(false);\n }}\n onDrop={(e) => {\n if (!isActiveWindow(e.currentTarget as HTMLElement)) {\n resetDrag();\n return;\n }\n handleDrop(e);\n }}\n >\n <WindowTitle title={`${titleName} - Preview`} />\n {Toolbar}\n <div className=\"flex-1 min-h-0\">{body}</div>\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to open\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ConvertingPanel({ filename, message }: { filename: string; message?: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full bg-gray-100 gap-4 px-8\">\n <div className=\"flex flex-col items-center gap-3\">\n <svg className=\"h-12 w-12 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <div className=\"text-base font-semibold tracking-wide text-gray-700 uppercase\">{message || 'Converting file'}</div>\n <div className=\"text-xs text-gray-400 truncate max-w-md\">{filename}</div>\n </div>\n <div className=\"w-72 h-1.5 rounded-full bg-gray-200 overflow-hidden\">\n <div className=\"h-full w-1/3 bg-blue-500 rounded-full animate-pulse\" style={{ animation: 'preview-bar 1.4s ease-in-out infinite' }} />\n </div>\n <style>{`@keyframes preview-bar { 0% { transform: translateX(-110%); } 100% { transform: translateX(310%); } }`}</style>\n </div>\n );\n}\n\ninterface PdfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nfunction PdfPanel({ url, filename, onDownload, onEmail }: PdfPanelProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pdf, setPdf] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [scale, setScale] = useState(1.5);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n pdfjsLib.getDocument(url).promise.then(doc => {\n if (cancelled) return;\n setPdf(doc);\n setTotalPages(doc.numPages);\n setLoading(false);\n }).catch(() => {\n if (!cancelled) { toast.error('Failed to load PDF'); setLoading(false); }\n });\n return () => { cancelled = true; };\n }, [url]);\n\n useEffect(() => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(1).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n const fitScale = (containerW - 40) / viewport.width;\n setScale(Math.min(Math.max(fitScale, 0.5), 3));\n });\n }, [pdf]);\n\n useEffect(() => {\n if (!pdf || !canvasRef.current) return;\n let cancelled = false;\n pdf.getPage(page).then(p => {\n if (cancelled || !canvasRef.current) return;\n const viewport = p.getViewport({ scale });\n const canvas = canvasRef.current;\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n p.render({ canvas, canvasContext: ctx, viewport }).promise.catch(() => {});\n });\n return () => { cancelled = true; };\n }, [pdf, page, scale]);\n\n const handlePrint = () => {\n if (!pdf) return;\n const win = window.open('', '_blank');\n if (!win) { toast.error('Allow popups to print'); return; }\n const promises: Promise<string>[] = [];\n for (let i = 1; i <= totalPages; i++) {\n promises.push(pdf.getPage(i).then(p => {\n const vp = p.getViewport({ scale: 2 });\n const c = document.createElement('canvas');\n c.width = vp.width; c.height = vp.height;\n return p.render({ canvas: c, canvasContext: c.getContext('2d')!, viewport: vp }).promise.then(() => c.toDataURL());\n }));\n }\n Promise.all(promises).then(images => {\n win.document.write(`<html><head><title>${filename}</title><style>@media print{body{margin:0}img{width:100%;page-break-after:always}}</style></head><body>`);\n win.document.write(images.map(src => `<img src=\"${src}\"/>`).join(''));\n win.document.write('</body></html>');\n win.document.close();\n setTimeout(() => { win.print(); win.close(); }, 300);\n });\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const fitWidth = () => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(page).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n setScale(Math.min(Math.max((containerW - 40) / viewport.width, 0.5), 3));\n });\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setPage(p => Math.max(1, p - 1))} disabled={page <= 1} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n </button>\n <span className=\"text-gray-600 font-medium tabular-nums\">{page} / {totalPages}</span>\n <button onClick={() => setPage(p => Math.min(totalPages, p + 1))} disabled={page >= totalPages} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setScale(s => Math.max(0.3, Math.round((s - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(scale * 100)}%</span>\n <button onClick={() => setScale(s => Math.min(4, Math.round((s + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={fitWidth} className={btn}>Fit</button>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <button onClick={handlePrint} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z\" /></svg>\n Print\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </div>\n </div>\n\n <div ref={containerRef} className=\"flex-1 overflow-auto bg-gray-100 flex justify-center p-4\">\n {loading ? (\n <div className=\"flex items-center justify-center py-20 text-gray-400 text-sm\">Loading PDF...</div>\n ) : (\n <canvas ref={canvasRef} className=\"shadow-lg rounded\" />\n )}\n </div>\n </div>\n );\n}\n\ninterface DxfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// Default font set covering Latin + CJK glyphs, served from jsdelivr's mirror\n// of the dxf-viewer example assets. Without these, any TEXT/MTEXT entities in\n// the drawing render as empty boxes. Consumers can override by setting\n// `window.__REACT_OS_SHELL_DXF_FONTS__` to a different array of TTF/OTF URLs.\nconst DEFAULT_DXF_FONTS: string[] = [\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/Roboto-LightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NotoSansDisplay-SemiCondensedLightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NanumGothic-Regular.ttf',\n];\n\ninterface DxfLayer {\n name: string;\n displayName?: string;\n color?: number;\n visible: boolean;\n}\n\nfunction DxfPanel({ url, filename, onDownload, onEmail }: DxfPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [showLayers, setShowLayers] = useState(false);\n const [showHint, setShowHint] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\n setLayers([]);\n\n (async () => {\n let DxfViewer: any;\n try {\n const mod = await import('dxf-viewer');\n DxfViewer = (mod as any).DxfViewer;\n } catch (e) {\n if (!cancelled) {\n setError('dxf-viewer is not installed in this app.');\n setLoading(false);\n }\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n // dxf-viewer reads container dimensions in its constructor (with\n // autoResize:true, those become the canvas size). If the Modal is\n // still settling we may be measured as 0×0, breaking aspect math\n // and the WebGL viewport. Wait until the container has a real\n // bounding box before constructing the viewer.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n // clearColor must be a THREE.Color (Library calls .getHex()).\n let three: any = null;\n try { three = await import(/* @vite-ignore */ 'three' as any); } catch {}\n const ClearColor = three?.Color ?? null;\n const viewerOpts: any = { autoResize: true };\n if (ClearColor) viewerOpts.clearColor = new ClearColor(0xffffff);\n viewer = new DxfViewer(containerRef.current, viewerOpts);\n viewerRef.current = viewer;\n\n const fontUrls = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_DXF_FONTS__)\n || DEFAULT_DXF_FONTS;\n await viewer.Load({ url, fonts: fontUrls, workerFactory: null });\n if (cancelled) return;\n\n // Snapshot layer list — used to render the toggle panel.\n try {\n const list: any[] = viewer.GetLayers?.() ?? [];\n if (Array.isArray(list)) {\n setLayers(list.map(l => ({\n name: l.name,\n displayName: l.displayName ?? l.name,\n color: typeof l.color === 'number' ? l.color : undefined,\n visible: true,\n })));\n }\n } catch {}\n\n // Force-fit using the actual loaded bounds and refresh canvas size.\n const refit = () => {\n try {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n viewer.SetSize?.(Math.round(rect.width), Math.round(rect.height));\n }\n const bounds = viewer.GetBounds?.();\n const origin = viewer.GetOrigin?.();\n if (bounds && origin) {\n viewer.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n }\n viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] DXF refit failed', err);\n }\n };\n refit();\n requestAnimationFrame(refit);\n setLoading(false);\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to render DXF.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url]);\n\n // Auto-hide the usage hint after a few seconds.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n const toggleLayer = (name: string) => {\n setLayers(prev => prev.map(l => {\n if (l.name !== name) return l;\n const next = !l.visible;\n try { viewerRef.current?.ShowLayer?.(name, next); } catch {}\n return { ...l, visible: next };\n }));\n };\n\n const setAllLayers = (visible: boolean) => {\n setLayers(prev => prev.map(l => {\n if (l.visible === visible) return l;\n try { viewerRef.current?.ShowLayer?.(l.name, visible); } catch {}\n return { ...l, visible };\n }));\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const handleResetView = () => {\n try {\n const v = viewerRef.current;\n const bounds = v?.GetBounds?.();\n const origin = v?.GetOrigin?.();\n if (bounds && origin) {\n v.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n } else {\n v?.FitView?.();\n }\n v?.Render?.();\n } catch {}\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n const colorHex = (n?: number) => {\n if (typeof n !== 'number') return '#999';\n return '#' + n.toString(16).padStart(6, '0');\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">DXF</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1 relative\">\n <button\n onClick={() => setShowLayers(s => !s)}\n className={btn + (showLayers ? ' bg-gray-200' : '')}\n title=\"Toggle layer visibility\"\n disabled={layers.length === 0}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3\" /></svg>\n Layers {layers.length > 0 && <span className=\"text-gray-400\">({layers.filter(l => l.visible).length}/{layers.length})</span>}\n </button>\n <button onClick={() => setShowHint(s => !s)} className={btn} title=\"How to navigate\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" /></svg>\n </button>\n <button onClick={handleResetView} className={btn} title=\"Fit drawing to view\">Fit</button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </div>\n </div>\n <div className=\"relative flex-1 bg-white min-h-0\">\n {/* dxf-viewer overrides container's `position` to `relative` in its\n * constructor, which kills any `inset: 0` sizing. Use explicit\n * width/height: 100% so the container always fills its flex parent. */}\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {showLayers && layers.length > 0 && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[70%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Layers</span>\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setAllLayers(true)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">All</button>\n <button onClick={() => setAllLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">None</button>\n <button onClick={() => setShowLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n </div>\n <div className=\"overflow-y-auto py-1\">\n {layers.map(l => (\n <label key={l.name} className=\"flex items-center gap-2 px-2 py-1 hover:bg-gray-100 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={l.visible}\n onChange={() => toggleLayer(l.name)}\n className=\"h-3.5 w-3.5\"\n />\n <span\n className=\"inline-block h-3 w-3 rounded-sm border border-gray-300 shrink-0\"\n style={{ background: colorHex(l.color) }}\n />\n <span className=\"truncate text-gray-700\" title={l.displayName}>{l.displayName || l.name}</span>\n </label>\n ))}\n </div>\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122\" /></svg>\n Drag to pan\n </span>\n <span className=\"text-white/40\">•</span>\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6\" /></svg>\n Scroll to zoom\n </span>\n <span className=\"text-white/40\">•</span>\n <span>Fit to reset</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/80 text-sm text-gray-500\">Loading drawing…</div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center\">{error}</div>\n )}\n </div>\n </div>\n );\n}\n\ninterface StepPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// online-3d-viewer expects an \"external libs\" base URL where it can find the\n// occt-import-js WASM (for STEP/IGES) plus draco/rhino3dm/web-ifc decoders.\n// jsdelivr mirrors the npm package at this path; consumers can override via\n// `window.__REACT_OS_SHELL_O3DV_LIBS__` to self-host (e.g. air-gapped).\nconst DEFAULT_O3DV_LIBS = 'https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/';\n\ninterface TreeNode {\n id: number;\n name: string;\n isMeshNode: boolean;\n meshIndices: number[];\n children: TreeNode[];\n}\n\nfunction buildTree(node: any, depth = 0): TreeNode {\n return {\n id: node.GetId?.() ?? 0,\n name: node.GetName?.() || (depth === 0 ? 'Root' : 'Node'),\n isMeshNode: !!node.IsMeshNode?.(),\n meshIndices: node.GetMeshIndices?.() ?? [],\n children: (node.GetChildNodes?.() ?? []).map((c: any) => buildTree(c, depth + 1)),\n };\n}\n\n// Collect every nodeId in the subtree rooted at `node` (inclusive).\nfunction collectNodeIds(node: TreeNode, out: Set<number>) {\n out.add(node.id);\n for (const c of node.children) collectNodeIds(c, out);\n}\n\n// Hex string (\"#rrggbb\") → RGBColor instance.\nfunction hexToRgb(OV: any, hex: string) {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex);\n const n = m ? parseInt(m[1], 16) : 0;\n return new OV.RGBColor((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff);\n}\nfunction rgbToHex(c: { r?: number; g?: number; b?: number }) {\n const r = (c.r ?? 0) | 0, g = (c.g ?? 0) | 0, b = (c.b ?? 0) | 0;\n return '#' + [r, g, b].map(v => v.toString(16).padStart(2, '0')).join('');\n}\n\nfunction StepPanel({ url, filename, onDownload, onEmail }: StepPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const ovRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [showHint, setShowHint] = useState(true);\n\n // Mesh tree + per-node visibility (true = visible).\n const [tree, setTree] = useState<TreeNode | null>(null);\n const [expanded, setExpanded] = useState<Record<number, boolean>>({});\n const [hidden, setHidden] = useState<Set<number>>(new Set());\n\n // Right-panel display settings.\n const [bgColor, setBgColor] = useState('#f5f6f8');\n const [showEdges, setShowEdges] = useState(true);\n const [edgeColor, setEdgeColor] = useState('#000000');\n const [edgeThreshold, setEdgeThreshold] = useState(1);\n\n // Sidebar visibility.\n const [showMeshes, setShowMeshes] = useState(true);\n const [showSettings, setShowSettings] = useState(true);\n\n // Section view (capped clipping plane).\n const [sectionEnabled, setSectionEnabled] = useState(false);\n const [sectionAxis, setSectionAxis] = useState<'x' | 'y' | 'z'>('z');\n const [sectionFlip, setSectionFlip] = useState(false);\n const [sectionPosition, setSectionPosition] = useState(0.5); // 0–1 within bbox\n const [sectionCapColor, setSectionCapColor] = useState('#c8ccd1');\n\n // Persistent section state — stencil helpers, cap mesh, original material\n // settings — held in a ref so we can mutate the plane in place on slider\n // tick instead of rebuilding every helper mesh.\n const sectionRef = useRef<{\n plane: any;\n capMesh: any;\n helpers: any[];\n materialState: Map<any, { clippingPlanes: any; clipShadows: any }>;\n bbox: any;\n } | null>(null);\n\n // Load model.\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\n setTree(null);\n setExpanded({});\n setHidden(new Set());\n\n (async () => {\n let OV: any;\n try {\n OV = await import('online-3d-viewer');\n } catch {\n if (!cancelled) {\n setError('online-3d-viewer is not installed in this app. Add it to enable 3D file viewing.');\n setLoading(false);\n }\n return;\n }\n ovRef.current = OV;\n if (cancelled || !containerRef.current) return;\n\n // Wait for container to have a real layout before constructing the\n // viewer — same dance as the DXF panel.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n try {\n const libsBase = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_O3DV_LIBS__)\n || DEFAULT_O3DV_LIBS;\n OV.SetExternalLibLocation?.(libsBase);\n\n viewer = new OV.EmbeddedViewer(containerRef.current, {\n backgroundColor: new OV.RGBAColor(245, 246, 248, 255),\n defaultColor: new OV.RGBColor(180, 188, 200),\n edgeSettings: new OV.EdgeSettings(true, new OV.RGBColor(0, 0, 0), 1),\n onModelLoaded: () => {\n if (cancelled) return;\n try {\n const model = viewer.GetModel?.();\n const root = model?.GetRootNode?.();\n if (root) {\n const t = buildTree(root);\n setTree(t);\n // Expand top two levels by default.\n const expandIds: Record<number, boolean> = { [t.id]: true };\n for (const c of t.children) expandIds[c.id] = true;\n setExpanded(expandIds);\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] mesh tree extraction failed', err);\n }\n setLoading(false);\n },\n onModelLoadFailed: () => {\n if (!cancelled) {\n setError('Failed to load 3D model.');\n setLoading(false);\n }\n },\n });\n viewerRef.current = viewer;\n\n const inputFile = new OV.InputFile(filename, OV.FileSource.Url, url);\n viewer.LoadModelFromInputFiles([inputFile]);\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to load 3D model.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url, filename]);\n\n // Apply per-node visibility by walking the THREE scene's mesh userData. The\n // engine's public `SetMeshesVisibility` is global-only, so we go one level\n // deeper to flip individual `mesh.visible` flags.\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer) return;\n try {\n const visit = (mesh: any) => {\n if (mesh.userData?.__sectionHelper) return;\n const ud = mesh.userData?.originalMeshInstance ?? mesh.userData;\n const nodeId: number | undefined = ud?.id?.nodeId ?? ud?.nodeId;\n if (typeof nodeId === 'number') {\n mesh.visible = !hidden.has(nodeId);\n }\n };\n v.viewer.mainModel?.EnumerateMeshesAndLines?.(visit);\n v.viewer.mainModel?.EnumerateEdges?.(visit);\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] visibility update failed', err);\n }\n }, [hidden, tree]);\n\n // Apply edge settings.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n v.viewer.SetEdgeSettings(new OV.EdgeSettings(showEdges, hexToRgb(OV, edgeColor), edgeThreshold));\n v.viewer.Render?.();\n } catch {}\n }, [showEdges, edgeColor, edgeThreshold]);\n\n // Apply background color.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const c = hexToRgb(OV, bgColor);\n v.viewer.SetBackgroundColor(new OV.RGBAColor(c.r, c.g, c.b, 255));\n v.viewer.Render?.();\n } catch {}\n }, [bgColor]);\n\n // Section view — set / tear down on enable.\n //\n // Capped clipping using the standard three.js stencil technique. The\n // tricky bit is that we can't `import('three')` — it resolves to a\n // different three instance than the one online-3d-viewer bundles\n // (transitive duplicate), which breaks instanceof checks against the\n // renderer's THREE. Workaround: pluck constructors (Mesh, BufferGeometry,\n // BufferAttribute, MeshPhongMaterial) from a sample mesh in the loaded\n // scene — those are guaranteed to be from the renderer's THREE. The\n // stencil/side constants are universal numeric values, so we hardcode\n // them. The plane itself stays duck-typed — three's WebGLClipping just\n // calls `.copy()` on it (reads .normal.x/y/z and .constant).\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n if (!renderer || !scene) return;\n\n // Tear down any previous state.\n if (sectionRef.current) {\n const s = sectionRef.current;\n for (const [mat, prev] of s.materialState.entries()) {\n mat.clippingPlanes = prev.clippingPlanes;\n mat.clipShadows = prev.clipShadows;\n mat.needsUpdate = true;\n }\n for (const helper of s.helpers) {\n helper.parent?.remove(helper);\n // Don't dispose helper.geometry — it's shared with the original mesh.\n helper.material?.dispose?.();\n }\n if (s.capMesh) {\n scene.remove(s.capMesh);\n s.capMesh.geometry?.dispose?.();\n s.capMesh.material?.dispose?.();\n }\n sectionRef.current = null;\n }\n\n if (!sectionEnabled) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n if (!bbox) return;\n\n // Snapshot the mesh list — never traverse-and-mutate.\n const targets: any[] = [];\n v.viewer.mainModel?.EnumerateMeshes?.((mesh: any) => {\n if (!mesh.userData?.__sectionHelper) targets.push(mesh);\n });\n if (!targets.length) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n // Pluck THREE constructors from a sample mesh (these come from the\n // renderer's THREE, so the renderer recognizes the resulting objects).\n const sample = targets[0];\n const Mesh = sample.constructor;\n const Material = sample.material?.constructor; // MeshPhongMaterial\n const Geometry = sample.geometry?.constructor;\n const BufferAttr = sample.geometry?.attributes?.position?.constructor;\n if (!Mesh || !Material || !Geometry || !BufferAttr) {\n // Fallback to plain clipping if we can't pluck constructors.\n // eslint-disable-next-line no-console\n console.warn('[Preview] section: missing THREE constructors, falling back to no cap');\n }\n\n // Universal three.js / WebGL constants.\n const FrontSide = 0, BackSide = 1, DoubleSide = 2;\n const AlwaysStencilFunc = 519, NotEqualStencilFunc = 517;\n const IncrementWrapStencilOp = 7682, DecrementWrapStencilOp = 7683;\n const ReplaceStencilOp = 7681;\n\n const plane: any = { normal: { x: 0, y: 0, z: -1 }, constant: 0 };\n const helpers: any[] = [];\n const materialState = new Map<any, { clippingPlanes: any; clipShadows: any }>();\n\n const applyToMaterial = (mat: any) => {\n if (!mat || materialState.has(mat)) return;\n materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n\n for (const mesh of targets) {\n const mat = mesh.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n\n // Stencil-only helpers per mesh: back-faces increment the stencil,\n // front-faces decrement. Where the running count is non-zero on the\n // cap plane, we're inside the solid → cap renders.\n if (Mesh && Material) {\n const makeStencil = (side: number, op: number) => {\n const m: any = new Material();\n m.depthWrite = false;\n m.depthTest = false;\n m.colorWrite = false;\n m.stencilWrite = true;\n m.stencilFunc = AlwaysStencilFunc;\n m.stencilFail = op;\n m.stencilZFail = op;\n m.stencilZPass = op;\n m.side = side;\n m.clippingPlanes = [plane];\n m.clipShadows = true;\n const helper = new Mesh(mesh.geometry, m);\n helper.matrixAutoUpdate = false;\n helper.renderOrder = 1;\n helper.userData.__sectionHelper = true;\n mesh.add(helper);\n helpers.push(helper);\n };\n makeStencil(BackSide, IncrementWrapStencilOp);\n makeStencil(FrontSide, DecrementWrapStencilOp);\n }\n }\n\n // Edges — clip them too so the cut isn't framed by a stale outline.\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n });\n\n // Cap quad — sized to the bbox diagonal × 2 so it always covers the cut,\n // built as a manual BufferGeometry quad (4 verts, 2 tris).\n let capMesh: any = null;\n if (Mesh && Material && Geometry && BufferAttr) {\n const dx = bbox.max.x - bbox.min.x;\n const dy = bbox.max.y - bbox.min.y;\n const dz = bbox.max.z - bbox.min.z;\n const capSize = Math.max(dx, dy, dz, 1) * 2;\n const half = capSize / 2;\n\n const capGeom: any = new Geometry();\n const positions = new Float32Array([\n -half, -half, 0,\n half, -half, 0,\n half, half, 0,\n -half, half, 0,\n ]);\n const normals = new Float32Array([\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n ]);\n capGeom.setAttribute('position', new BufferAttr(positions, 3));\n capGeom.setAttribute('normal', new BufferAttr(normals, 3));\n capGeom.setIndex([0, 1, 2, 0, 2, 3]);\n\n const capMat: any = new Material();\n const m = /^#?([0-9a-f]{6})$/i.exec(sectionCapColor);\n const colorHex = m ? parseInt(m[1], 16) : 0xc8ccd1;\n capMat.color?.setHex?.(colorHex);\n capMat.side = DoubleSide;\n capMat.stencilWrite = true;\n capMat.stencilRef = 0;\n capMat.stencilFunc = NotEqualStencilFunc;\n capMat.stencilFail = ReplaceStencilOp;\n capMat.stencilZFail = ReplaceStencilOp;\n capMat.stencilZPass = ReplaceStencilOp;\n // Don't clip the cap itself by the same plane.\n capMat.clippingPlanes = [];\n\n capMesh = new Mesh(capGeom, capMat);\n capMesh.renderOrder = 2;\n capMesh.userData.__sectionHelper = true;\n scene.add(capMesh);\n }\n\n renderer.localClippingEnabled = true;\n sectionRef.current = { plane, capMesh, helpers, materialState, bbox };\n v.viewer.Render?.();\n }, [sectionEnabled, loading, tree, sectionCapColor]);\n\n // Section view — update plane orientation/position on axis/flip/slider change.\n useEffect(() => {\n const v = viewerRef.current;\n const s = sectionRef.current;\n if (!v?.viewer || !s || !sectionEnabled) return;\n try {\n const bbox = s.bbox;\n const axisIdx = sectionAxis === 'x' ? 0 : sectionAxis === 'y' ? 1 : 2;\n const min = [bbox.min.x, bbox.min.y, bbox.min.z][axisIdx];\n const max = [bbox.max.x, bbox.max.y, bbox.max.z][axisIdx];\n const value = min + (max - min) * sectionPosition;\n\n // three.js clips fragments where (normal · p) + constant < 0.\n // Default direction (not flipped): keep \"axis < value\", clip \"axis > value\".\n const dir = sectionFlip ? 1 : -1;\n const nx = sectionAxis === 'x' ? dir : 0;\n const ny = sectionAxis === 'y' ? dir : 0;\n const nz = sectionAxis === 'z' ? dir : 0;\n s.plane.normal.x = nx;\n s.plane.normal.y = ny;\n s.plane.normal.z = nz;\n s.plane.constant = -dir * value;\n\n // Re-position the cap mesh on the plane and orient it so its visible\n // face points along the plane normal.\n if (s.capMesh) {\n const cx = (bbox.min.x + bbox.max.x) / 2;\n const cy = (bbox.min.y + bbox.max.y) / 2;\n const cz = (bbox.min.z + bbox.max.z) / 2;\n // Distance from bbox center to plane along the normal.\n const dist = nx * cx + ny * cy + nz * cz + s.plane.constant;\n const px = cx - nx * dist;\n const py = cy - ny * dist;\n const pz = cz - nz * dist;\n s.capMesh.position.set(px, py, pz);\n s.capMesh.lookAt?.(px + nx, py + ny, pz + nz);\n }\n\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] section update failed', err);\n }\n }, [sectionEnabled, sectionAxis, sectionFlip, sectionPosition]);\n\n // Hint timer.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n const toggleNodeVisible = (node: TreeNode) => {\n const ids = new Set<number>();\n collectNodeIds(node, ids);\n setHidden(prev => {\n const next = new Set(prev);\n // If any descendant is currently visible, hide them all; else reveal.\n const anyVisible = [...ids].some(id => !next.has(id));\n for (const id of ids) {\n if (anyVisible) next.add(id);\n else next.delete(id);\n }\n return next;\n });\n };\n\n const toggleExpanded = (id: number) => {\n setExpanded(prev => ({ ...prev, [id]: !prev[id] }));\n };\n\n const fitNode = (node: TreeNode) => {\n // Fit the whole model — fitting to a specific subtree would need its\n // bounds via a custom enumerator; defer that for now.\n handleFit();\n // Future: filter visibility-by-subtree to focus.\n void node;\n };\n\n const handleFit = () => {\n try {\n const v = viewerRef.current;\n const sphere = v?.viewer?.GetBoundingSphere?.(() => true);\n if (sphere) v.viewer.FitSphereToWindow(sphere, true);\n v?.viewer?.Render?.();\n } catch {}\n };\n\n // Camera presets — eye/center/up around the model's bounding sphere.\n const setCameraPreset = (preset: 'top' | 'front' | 'side' | 'iso') => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const sphere = v.viewer.GetBoundingSphere?.(() => true);\n if (!sphere) return;\n const c = sphere.center;\n const r = sphere.radius || 1;\n const dist = r * 3;\n const cx = c.x ?? 0, cy = c.y ?? 0, cz = c.z ?? 0;\n let eye: any, up: any;\n switch (preset) {\n case 'top': eye = new OV.Coord3D(cx, cy, cz + dist); up = new OV.Coord3D(0, 1, 0); break;\n case 'front': eye = new OV.Coord3D(cx, cy - dist, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'side': eye = new OV.Coord3D(cx + dist, cy, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'iso':\n default: {\n const k = dist / Math.sqrt(3);\n eye = new OV.Coord3D(cx + k, cy - k, cz + k);\n up = new OV.Coord3D(0, 0, 1);\n break;\n }\n }\n const center = new OV.Coord3D(cx, cy, cz);\n const cam = new OV.Camera(eye, center, up, 45);\n v.viewer.SetCamera(cam);\n v.viewer.AdjustClippingPlanesToSphere?.(sphere);\n v.viewer.Render?.();\n } catch {}\n };\n\n const handleSnapshot = () => {\n try {\n const v = viewerRef.current;\n const size = v?.viewer?.GetCanvasSize?.() ?? { width: 1280, height: 720 };\n const dataUrl = v?.viewer?.GetImageAsDataUrl?.(size.width, size.height, false);\n if (!dataUrl) return;\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename.replace(/\\.[^.]+$/, '')}-snapshot.png`;\n a.click();\n } catch {}\n };\n\n const handleResetDisplay = () => {\n setBgColor('#f5f6f8');\n setShowEdges(true);\n setEdgeColor('#000000');\n setEdgeThreshold(1);\n setSectionEnabled(false);\n setSectionAxis('z');\n setSectionFlip(false);\n setSectionPosition(0.5);\n setSectionCapColor('#c8ccd1');\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const ext = (filename.split('.').pop() || '').toUpperCase();\n\n // ── render helpers ───────────────────────────────────────────────────────\n const renderTreeNode = (node: TreeNode, depth = 0): React.ReactNode => {\n const hasChildren = node.children.length > 0;\n const isExpanded = expanded[node.id] !== false; // default expanded for first two levels\n const isVisible = !hidden.has(node.id);\n return (\n <div key={node.id}>\n <div\n className=\"group flex items-center gap-1 px-1.5 py-1 hover:bg-gray-100 cursor-default text-[12px] text-gray-700\"\n style={{ paddingLeft: `${depth * 12 + 6}px` }}\n >\n {hasChildren ? (\n <button\n onClick={() => toggleExpanded(node.id)}\n className=\"h-4 w-4 shrink-0 flex items-center justify-center text-gray-500 hover:text-gray-900\"\n title={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={isExpanded ? 'M19.5 8.25l-7.5 7.5-7.5-7.5' : 'M8.25 4.5l7.5 7.5-7.5 7.5'} />\n </svg>\n </button>\n ) : (\n <span className=\"h-4 w-4 shrink-0 flex items-center justify-center\">\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n </span>\n )}\n <span className={`flex-1 truncate ${isVisible ? '' : 'opacity-40'}`} title={node.name}>{node.name}</span>\n <button\n onClick={() => fitNode(node)}\n className=\"h-4 w-4 shrink-0 text-gray-400 hover:text-gray-900 opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Fit to view\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <button\n onClick={() => toggleNodeVisible(node)}\n className=\"h-4 w-4 shrink-0 text-gray-500 hover:text-gray-900\"\n title={isVisible ? 'Hide' : 'Show'}\n >\n {isVisible ? (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n ) : (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n )}\n </button>\n </div>\n {isExpanded && hasChildren && (\n <div>{node.children.map(c => renderTreeNode(c, depth + 1))}</div>\n )}\n </div>\n );\n };\n\n const tBtn = 'h-8 w-8 shrink-0 flex items-center justify-center rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnActive = 'h-8 w-8 shrink-0 flex items-center justify-center rounded bg-gray-200 text-gray-900';\n const tBtnSep = 'h-5 w-px bg-gray-300 mx-1';\n\n return (\n <div className=\"flex flex-col h-full bg-white\">\n {/* Top toolbar */}\n <div className=\"flex items-center gap-1 px-2 py-1.5 bg-gray-50 border-b border-gray-200 shrink-0\">\n <span className=\"text-[11px] font-semibold tracking-wide text-gray-700 px-2 truncate max-w-xs\" title={filename}>{filename}</span>\n <div className={tBtnSep} />\n <button onClick={handleFit} className={tBtn} title=\"Fit to view\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <div className={tBtnSep} />\n <button onClick={() => setCameraPreset('iso')} className={tBtn} title=\"Isometric view\">\n <span className=\"text-[10px] font-semibold\">ISO</span>\n </button>\n <button onClick={() => setCameraPreset('top')} className={tBtn} title=\"Top view\">\n <span className=\"text-[10px] font-semibold\">TOP</span>\n </button>\n <button onClick={() => setCameraPreset('front')} className={tBtn} title=\"Front view\">\n <span className=\"text-[10px] font-semibold\">FRT</span>\n </button>\n <button onClick={() => setCameraPreset('side')} className={tBtn} title=\"Side view\">\n <span className=\"text-[10px] font-semibold\">SDE</span>\n </button>\n <div className={tBtnSep} />\n <button onClick={handleSnapshot} className={tBtn} title=\"Save snapshot as PNG\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z\" />\n </svg>\n </button>\n <button onClick={() => setShowHint(s => !s)} className={tBtn} title=\"How to navigate\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" />\n </svg>\n </button>\n <div className=\"flex-1\" />\n <button onClick={() => setShowMeshes(s => !s)} className={showMeshes ? tBtnActive : tBtn} title=\"Toggle meshes panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n <button onClick={() => setShowSettings(s => !s)} className={showSettings ? tBtnActive : tBtn} title=\"Toggle display panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={tBtn} title=\"Download original file\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n </button>\n {onEmail && (\n <button onClick={onEmail} className={tBtn} title=\"Email\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Body: meshes | viewport | settings */}\n <div className=\"flex-1 flex min-h-0\">\n {showMeshes && (\n <div className=\"w-60 shrink-0 bg-gray-50 border-r border-gray-200 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-gray-500 border-b border-gray-200\">Meshes</div>\n <div className=\"flex-1 overflow-y-auto py-1\">\n {tree ? renderTreeNode(tree) : (\n <div className=\"px-3 py-3 text-[11px] text-gray-500 italic\">{loading ? 'Reading model…' : 'No structure available'}</div>\n )}\n </div>\n {tree && (\n <div className=\"px-3 py-1.5 text-[10px] text-gray-500 border-t border-gray-200\">\n {hidden.size === 0 ? 'All visible' : `${hidden.size} hidden`}\n </div>\n )}\n </div>\n )}\n\n <div className=\"relative flex-1 min-w-0\" style={{ background: bgColor }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span>Drag to rotate</span>\n <span className=\"text-white/40\">•</span>\n <span>Right-click drag to pan</span>\n <span className=\"text-white/40\">•</span>\n <span>Scroll to zoom</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-white/85 text-sm text-gray-600 gap-2\">\n <svg className=\"h-6 w-6 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <span>Loading 3D model…</span>\n {ext === 'STP' || ext === 'STEP' ? <span className=\"text-[10px] text-gray-400\">STEP files load OpenCascade WASM (~5 MB) on first use.</span> : null}\n </div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center bg-white/85\">{error}</div>\n )}\n </div>\n\n {showSettings && (\n <div className=\"w-60 shrink-0 bg-gray-50 border-l border-gray-200 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-gray-500 border-b border-gray-200\">Model Display</div>\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-gray-700\">\n <label className=\"flex items-center justify-between gap-2\">\n <span>Background Color</span>\n <input type=\"color\" value={bgColor} onChange={(e) => setBgColor(e.target.value)} className=\"h-6 w-10 rounded border border-gray-300 bg-white\" />\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span>Show Edges</span>\n <button\n onClick={() => setShowEdges(s => !s)}\n className={`relative h-5 w-9 rounded-full transition-colors ${showEdges ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${showEdges ? 'translate-x-4' : 'translate-x-0.5'}`} />\n </button>\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span className={showEdges ? '' : 'opacity-40'}>Edge Color</span>\n <input\n type=\"color\"\n value={edgeColor}\n onChange={(e) => setEdgeColor(e.target.value)}\n disabled={!showEdges}\n className=\"h-6 w-10 rounded border border-gray-300 bg-white disabled:opacity-40\"\n />\n </label>\n <div className={showEdges ? '' : 'opacity-40 pointer-events-none'}>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Edge Threshold</span>\n <span className=\"text-gray-500 tabular-nums\">{edgeThreshold}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={45}\n step={1}\n value={edgeThreshold}\n onChange={(e) => setEdgeThreshold(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div className=\"border-t border-gray-200 -mx-3 px-3 pt-3 mt-1\">\n <label className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">Section View</span>\n <button\n onClick={() => setSectionEnabled(s => !s)}\n className={`relative h-5 w-9 rounded-full transition-colors ${sectionEnabled ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${sectionEnabled ? 'translate-x-4' : 'translate-x-0.5'}`} />\n </button>\n </label>\n\n <div className={sectionEnabled ? 'mt-2 space-y-2' : 'mt-2 space-y-2 opacity-40 pointer-events-none'}>\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Axis</span>\n <button\n onClick={() => setSectionFlip(f => !f)}\n className=\"text-[10px] text-gray-600 hover:text-gray-900 px-1.5 py-0.5 rounded bg-gray-100 hover:bg-gray-200\"\n title=\"Flip section direction\"\n >\n {sectionFlip ? '← flipped' : 'flip →'}\n </button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {(['x', 'y', 'z'] as const).map(ax => (\n <button\n key={ax}\n onClick={() => setSectionAxis(ax)}\n className={`py-1 rounded text-[11px] font-semibold ${sectionAxis === ax ? 'bg-blue-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}\n >\n {ax.toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Position</span>\n <span className=\"text-gray-500 tabular-nums\">{Math.round(sectionPosition * 100)}%</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={sectionPosition}\n onChange={(e) => setSectionPosition(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <label className=\"flex items-center justify-between gap-2\">\n <span>Cap Color</span>\n <input\n type=\"color\"\n value={sectionCapColor}\n onChange={(e) => setSectionCapColor(e.target.value)}\n className=\"h-6 w-10 rounded border border-gray-300 bg-white\"\n />\n </label>\n\n </div>\n </div>\n </div>\n <div className=\"px-3 py-2 border-t border-gray-200\">\n <button\n onClick={handleResetDisplay}\n className=\"w-full text-[11px] text-gray-700 bg-gray-100 hover:bg-gray-200 rounded py-1.5 transition-colors\"\n >\n Reset to Default\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface ImagePanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nfunction ImagePanel({ url, filename, onDownload, onEmail }: ImagePanelProps) {\n const [zoom, setZoom] = useState(1);\n const [error, setError] = useState(false);\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">Image</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setZoom(z => Math.max(0.1, Math.round((z - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(8, Math.round((z + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={() => setZoom(1)} className={btn}>1:1</button>\n </div>\n <div className=\"flex items-center gap-1\">\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </div>\n </div>\n <div className=\"flex-1 overflow-auto bg-gray-100 flex items-center justify-center p-4\">\n {error ? (\n <div className=\"text-sm text-red-600\">Failed to load image.</div>\n ) : (\n <img\n src={url}\n alt={filename}\n onError={() => setError(true)}\n style={{ transform: `scale(${zoom})`, transformOrigin: 'center center', transition: 'transform 120ms ease' }}\n className=\"max-w-full max-h-full shadow-lg rounded bg-white\"\n />\n )}\n </div>\n </div>\n );\n}\n"]}