epochs-pdf 0.1.6 → 0.1.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"epochs-pdf.js","sources":["../src/viewer/markup.ts","../src/viewer/signature.ts","../src/viewer/coords.ts","../src/viewer/text.ts","../src/viewer/icons.tsx","../src/viewer/PageCanvas.tsx","../src/viewer/Thumbnail.tsx","../src/viewer/load.ts","../src/viewer/exportPages.ts","../src/viewer/SignaturePad.tsx","../src/viewer/toolbarTools.ts","../src/viewer/ToolbarButtons.tsx","../src/viewer/PdfViewer.tsx","../src/components.tsx","../src/reconciler.ts","../src/utils.ts","../src/layout.ts","../src/pdf-writer.ts","../src/render.ts"],"sourcesContent":["export type MarkupKind = \"highlight\" | \"underline\" | \"redact\";\n\nexport type MarkupTool = \"none\" | MarkupKind | \"erase\" | \"sign\" | \"text\";\n\n/** Opaque cover used when removing existing PDF text. */\nexport const REDACT_COLOR = \"#ffffff\";\n\nexport interface MarkupRect {\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n w: number;\n h: number;\n}\n\nexport interface MarkupAnnotation {\n id: string;\n pageNumber: number;\n kind: MarkupKind;\n color: string;\n rects: MarkupRect[];\n text?: string;\n}\n\nexport interface MarkupColorOption {\n id: string;\n label: string;\n /** Solid hex used by the swatch / color input. */\n hex: string;\n}\n\nexport const HIGHLIGHT_PRESETS: MarkupColorOption[] = [\n { id: \"yellow\", label: \"Yellow\", hex: \"#facc15\" },\n { id: \"green\", label: \"Green\", hex: \"#4ade80\" },\n { id: \"pink\", label: \"Pink\", hex: \"#f472b6\" },\n { id: \"blue\", label: \"Blue\", hex: \"#60a5fa\" },\n { id: \"orange\", label: \"Orange\", hex: \"#fb923c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#c084fc\" },\n];\n\nexport const UNDERLINE_PRESETS: MarkupColorOption[] = [\n { id: \"blue\", label: \"Blue\", hex: \"#2563eb\" },\n { id: \"red\", label: \"Red\", hex: \"#dc2626\" },\n { id: \"green\", label: \"Green\", hex: \"#16a34a\" },\n { id: \"orange\", label: \"Orange\", hex: \"#ea580c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#7c3aed\" },\n { id: \"black\", label: \"Black\", hex: \"#111827\" },\n];\n\nexport const DEFAULT_HIGHLIGHT_HEX = HIGHLIGHT_PRESETS[0].hex;\nexport const DEFAULT_UNDERLINE_HEX = UNDERLINE_PRESETS[0].hex;\n\n/** Legacy defaults kept for callers. */\nexport const HIGHLIGHT_COLOR = hexToMarkupColor(DEFAULT_HIGHLIGHT_HEX, \"highlight\");\nexport const UNDERLINE_COLOR = DEFAULT_UNDERLINE_HEX;\n\nexport function createMarkupId(): string {\n return `m_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function normalizeHex(color: string): string {\n const value = color.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(value)) return value.toLowerCase();\n if (/^#[0-9a-fA-F]{3}$/.test(value)) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n return value;\n}\n\n/** Convert a solid hex into the CSS color used for drawing markup. */\nexport function hexToMarkupColor(hex: string, kind: MarkupKind, alpha = 0.45): string {\n const normalized = normalizeHex(hex);\n if (kind === \"underline\" || kind === \"redact\") return normalized;\n\n const match = /^#([0-9a-f]{6})$/i.exec(normalized);\n if (!match) return `rgba(250, 204, 21, ${alpha})`;\n\n const int = Number.parseInt(match[1], 16);\n const r = (int >> 16) & 255;\n const g = (int >> 8) & 255;\n const b = int & 255;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/** Best-effort extract of a #rrggbb value from a stored markup color. */\nexport function markupColorToHex(color: string, fallback: string): string {\n const normalized = normalizeHex(color);\n if (/^#[0-9a-f]{6}$/i.test(normalized)) return normalized.toLowerCase();\n\n const rgba = color.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (!rgba) return normalizeHex(fallback);\n\n const toHex = (n: string) =>\n Math.max(0, Math.min(255, Math.round(Number(n))))\n .toString(16)\n .padStart(2, \"0\");\n\n return `#${toHex(rgba[1])}${toHex(rgba[2])}${toHex(rgba[3])}`;\n}\n\n/** Collect selection client rects relative to a page surface, normalized to scale=1. */\nexport function selectionRectsForPage(\n pageSurface: HTMLElement,\n scale: number,\n): { rects: MarkupRect[]; text: string } | null {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n if (!pageSurface.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pageBox = pageSurface.getBoundingClientRect();\n const clientRects = Array.from(range.getClientRects()).filter(\n (r) => r.width > 0 && r.height > 0,\n );\n\n if (!clientRects.length) return null;\n\n const safeScale = scale || 1;\n const layoutW = pageSurface.clientWidth || pageBox.width;\n const layoutH = pageSurface.clientHeight || pageBox.height;\n const rects: MarkupRect[] = clientRects.map((r) => ({\n x: pageBox.width > 0 ? ((r.left - pageBox.left) / pageBox.width) * (layoutW / safeScale) : 0,\n y: pageBox.height > 0 ? ((r.top - pageBox.top) / pageBox.height) * (layoutH / safeScale) : 0,\n w: pageBox.width > 0 ? (r.width / pageBox.width) * (layoutW / safeScale) : 0,\n h: pageBox.height > 0 ? (r.height / pageBox.height) * (layoutH / safeScale) : 0,\n }));\n\n return { rects, text: selection.toString() };\n}\n\n/** Pick the top-left anchor for replacement text from selection rects. */\nexport function selectionStartPoint(\n rects: MarkupRect[],\n): { x: number; y: number; fontSize: number } {\n const sorted = [...rects].sort((a, b) => a.y - b.y || a.x - b.x);\n const first = sorted[0] ?? { x: 0, y: 0, w: 0, h: 14 };\n return {\n x: first.x,\n y: first.y,\n fontSize: Math.max(8, Math.round(first.h * 0.9) || 14),\n };\n}\n\n/** Slightly expand rects so redaction fully covers glyph ink. */\nexport function expandRedactRects(\n rects: MarkupRect[],\n padding = 2,\n): MarkupRect[] {\n return rects.map((rect) => ({\n x: Math.max(0, rect.x - padding),\n y: Math.max(0, rect.y - padding),\n w: rect.w + padding * 2,\n h: rect.h + padding * 2,\n }));\n}\n\n/** Draw highlight / underline annotations onto a canvas (rects are stored at scale = 1). */\nexport function drawMarkupOnCanvas(\n ctx: CanvasRenderingContext2D,\n annotations: MarkupAnnotation[],\n scale: number,\n): void {\n for (const ann of annotations) {\n for (const rect of ann.rects) {\n const x = rect.x * scale;\n const y = rect.y * scale;\n const w = rect.w * scale;\n const h = rect.h * scale;\n\n if (ann.kind === \"highlight\") {\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y, w, h);\n ctx.restore();\n } else if (ann.kind === \"redact\") {\n ctx.fillStyle = ann.color || REDACT_COLOR;\n ctx.fillRect(x, y, w, h);\n } else {\n const thickness = Math.max(2, scale * 1.5);\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y + h - thickness, w, thickness);\n }\n }\n }\n}\n\n","export interface SignatureAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Top-left X in page CSS pixels at scale = 1. */\n x: number;\n /** Top-left Y in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n /** PNG data URL of the signature ink. */\n imageDataUrl: string;\n}\n\nexport type SignatureFieldType = \"sign\" | \"date\" | \"text\";\n\nexport interface SignatureField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Field behavior: \"sign\" (default), \"date\" (date picker), or \"text\" (text input). */\n type?: SignatureFieldType;\n /** Placeholder text for \"text\" type fields. */\n placeholder?: string;\n /**\n * Optional group key. When `applySignatureToSameTag` is enabled on the viewer,\n * one signature fills every field that shares this tag.\n */\n signature_tag?: string;\n /** Filled signature image (data URL) after the user signs this field. */\n signatureDataUrl?: string;\n /** Plain text / date string when `type` is `\"text\"` or `\"date\"`. */\n value?: string;\n}\n\nexport function createSignatureId(): string {\n return `s_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport async function drawSignaturesOnCanvas(\n ctx: CanvasRenderingContext2D,\n signatures: SignatureAnnotation[],\n scale: number,\n): Promise<void> {\n for (const sig of signatures) {\n const img = await loadImage(sig.imageDataUrl);\n ctx.drawImage(\n img,\n sig.x * scale,\n sig.y * scale,\n sig.width * scale,\n sig.height * scale,\n );\n }\n}\n\nexport function drawSignatureFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: SignatureField[],\n signedFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = signedFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(29, 78, 216, 0.08)\"\n : \"rgba(29, 78, 216, 0.18)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(29, 78, 216, 0.45)\"\n : \"#1d4ed8\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"Failed to load signature image\"));\n img.src = src;\n });\n}\n\n/** Fit a drawn signature canvas into a target box while keeping aspect ratio. */\nexport function signatureDisplaySize(\n sourceWidth: number,\n sourceHeight: number,\n maxWidth = 180,\n maxHeight = 64,\n): { width: number; height: number } {\n if (sourceWidth <= 0 || sourceHeight <= 0) {\n return { width: maxWidth, height: maxHeight };\n }\n const ratio = Math.min(maxWidth / sourceWidth, maxHeight / sourceHeight);\n return {\n width: Math.max(40, sourceWidth * ratio),\n height: Math.max(20, sourceHeight * ratio),\n };\n}\n","/**\n * Browser zoom changes getBoundingClientRect() but not clientWidth/clientHeight.\n * Convert viewport client coordinates into page CSS pixels at scale = 1.\n */\nexport function clientPointToPage(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n scale: number,\n): { x: number; y: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { x: 0, y: 0 };\n }\n return {\n x: ((clientX - box.left) / box.width) * (layoutW / scale),\n y: ((clientY - box.top) / box.height) * (layoutH / scale),\n };\n}\n\n/** Page size in CSS pixels at scale = 1. */\nexport function pageSizeFromSurface(\n surface: HTMLElement,\n scale: number,\n): { width: number; height: number } {\n return {\n width: surface.clientWidth / scale,\n height: surface.clientHeight / scale,\n };\n}\n\n/**\n * Convert a viewport delta (e.g. drag/resize) into page CSS pixels at scale = 1,\n * compensating for browser zoom.\n */\nexport function clientDeltaToPage(\n deltaX: number,\n deltaY: number,\n surface: HTMLElement,\n scale: number,\n): { dx: number; dy: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { dx: 0, dy: 0 };\n }\n return {\n dx: (deltaX / box.width) * (layoutW / scale),\n dy: (deltaY / box.height) * (layoutH / scale),\n };\n}\n\n/** Map a viewport Y (or rect edge) relative to surface into page coords at scale = 1. */\nexport function viewportRectToPage(\n viewport: DOMRect,\n surface: HTMLElement,\n scale: number,\n): { left: number; top: number; right: number; bottom: number } {\n const surfaceRect = surface.getBoundingClientRect();\n const { width: pageW, height: pageH } = pageSizeFromSurface(surface, scale);\n if (surfaceRect.width <= 0 || surfaceRect.height <= 0) {\n return { left: 0, top: 0, right: pageW, bottom: pageH };\n }\n return {\n left: ((viewport.left - surfaceRect.left) / surfaceRect.width) * pageW,\n top: ((viewport.top - surfaceRect.top) / surfaceRect.height) * pageH,\n right: ((viewport.right - surfaceRect.left) / surfaceRect.width) * pageW,\n bottom: ((viewport.bottom - surfaceRect.top) / surfaceRect.height) * pageH,\n };\n}\n","export interface TextField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Shown when the field is empty. */\n placeholder?: string;\n /** Font size at scale = 1. Default 14. */\n fontSize?: number;\n /** CSS color. Default #111827. */\n color?: string;\n}\n\nexport interface TextAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n value: string;\n fontSize: number;\n color: string;\n}\n\nexport const DEFAULT_TEXT_FONT_SIZE = 14;\nexport const DEFAULT_TEXT_COLOR = \"#111827\";\nexport const MIN_TEXT_WIDTH = 24;\nexport const MIN_TEXT_HEIGHT = 20;\n\nexport function createTextId(): string {\n return `t_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function measureInlineText(\n value: string,\n fontSize: number,\n): { width: number; height: number } {\n if (typeof document === \"undefined\") {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n ctx.font = `${fontSize}px sans-serif`;\n const lines = value.split(\"\\n\");\n const lineHeight = fontSize * 1.25;\n let maxWidth = MIN_TEXT_WIDTH;\n\n for (const line of lines) {\n maxWidth = Math.max(maxWidth, ctx.measureText(line || \" \").width + 4);\n }\n\n return {\n width: maxWidth,\n height: Math.max(MIN_TEXT_HEIGHT, lines.length * lineHeight),\n };\n}\n\n/** Resolve where inline text should start from a click on/near PDF text. */\nexport function resolveInlineTextPoint(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n textLayer: HTMLElement,\n scale: number,\n): { x: number; y: number; fontSize: number } {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || surfaceBox.width;\n const layoutH = surface.clientHeight || surfaceBox.height;\n const toPageX = (client: number) =>\n surfaceBox.width > 0\n ? ((client - surfaceBox.left) / surfaceBox.width) * (layoutW / scale)\n : 0;\n const toPageY = (client: number) =>\n surfaceBox.height > 0\n ? ((client - surfaceBox.top) / surfaceBox.height) * (layoutH / scale)\n : 0;\n const toPageSize = (clientSize: number, axis: \"x\" | \"y\") => {\n const boxSize = axis === \"x\" ? surfaceBox.width : surfaceBox.height;\n const layout = axis === \"x\" ? layoutW : layoutH;\n return boxSize > 0 ? (clientSize / boxSize) * (layout / scale) : 0;\n };\n\n // Default: exact click position (works for gaps between words)\n let x = toPageX(clientX);\n let y = toPageY(clientY);\n let fontSize = DEFAULT_TEXT_FONT_SIZE;\n\n // Prefer a gap between two spans on the same line (e.g. between \"this\" and \"PDF\")\n const gap = findGapBetweenSpans(clientX, clientY, textLayer);\n if (gap) {\n return {\n x: toPageX(gap.x),\n y: toPageY(gap.y),\n fontSize: Math.max(8, Math.round(toPageSize(gap.fontSize, \"y\") * 10) / 10),\n };\n }\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (range && textLayer.contains(range.startContainer)) {\n const rects = range.getClientRects();\n const rect = rects.length > 0 ? rects[0] : range.getBoundingClientRect();\n if (rect.height > 0) {\n // Keep the clicked X (insert point), snap Y/size to the line\n y = toPageY(rect.top);\n fontSize = inferFontSizeFromNode(range.startContainer, scale, surface);\n // If caret snapped to a glyph edge, use that X for cleaner alignment\n const caretX = toPageX(rect.left);\n if (Math.abs(caretX - x) < toPageSize(8, \"x\")) {\n x = caretX;\n }\n return { x, y, fontSize };\n }\n }\n\n const nearest = findNearestSpanOnLine(clientX, clientY, textLayer);\n if (nearest) {\n y = toPageY(nearest.top);\n fontSize = Math.max(8, Math.round(toPageSize(nearest.height, \"y\") * 10) / 10);\n }\n\n return { x, y, fontSize };\n}\n\n/** Find a click that lands in the horizontal gap between two word spans. */\nfunction findGapBetweenSpans(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { x: number; y: number; fontSize: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n if (spans.length < 2) return null;\n\n type SpanBox = { left: number; right: number; top: number; bottom: number; height: number };\n const boxes: SpanBox[] = [];\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n // Same visual line as the click\n if (clientY < box.top - 4 || clientY > box.bottom + 4) continue;\n boxes.push({\n left: box.left,\n right: box.right,\n top: box.top,\n bottom: box.bottom,\n height: box.height,\n });\n }\n\n boxes.sort((a, b) => a.left - b.left);\n\n for (let i = 0; i < boxes.length - 1; i += 1) {\n const left = boxes[i];\n const right = boxes[i + 1];\n const gapStart = left.right;\n const gapEnd = right.left;\n if (gapEnd - gapStart < 1) continue;\n if (clientX >= gapStart - 2 && clientX <= gapEnd + 2) {\n return {\n x: clientX,\n y: Math.min(left.top, right.top),\n fontSize: Math.min(left.height, right.height),\n };\n }\n }\n\n return null;\n}\n\nfunction findNearestSpanOnLine(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { top: number; height: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n\n let best: { top: number; height: number; dist: number } | null = null;\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n if (clientY < box.top - 6 || clientY > box.bottom + 6) continue;\n\n const midX = (box.left + box.right) / 2;\n const dist = Math.abs(clientX - midX);\n if (!best || dist < best.dist) {\n best = { top: box.top, height: box.height, dist };\n }\n }\n\n return best ? { top: best.top, height: best.height } : null;\n}\n\nfunction inferFontSizeFromNode(\n node: Node,\n scale: number,\n surface?: HTMLElement,\n): number {\n const element =\n node.nodeType === Node.ELEMENT_NODE\n ? (node as HTMLElement)\n : node.parentElement;\n if (element) return inferFontSizeFromElement(element, scale, surface);\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nfunction inferFontSizeFromElement(\n element: HTMLElement,\n scale: number,\n surface?: HTMLElement,\n): number {\n const height = element.getBoundingClientRect().height;\n if (height > 0) {\n if (surface) {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutH = surface.clientHeight || surfaceBox.height;\n if (surfaceBox.height > 0) {\n return Math.max(\n 8,\n Math.round(((height / surfaceBox.height) * (layoutH / scale)) * 10) / 10,\n );\n }\n }\n return Math.max(8, Math.round((height / scale) * 10) / 10);\n }\n\n const computed = window.getComputedStyle(element).fontSize;\n const parsed = Number.parseFloat(computed);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.max(8, Math.round((parsed / scale) * 10) / 10);\n }\n\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nexport function findTextFieldAtPoint(\n x: number,\n y: number,\n fields: TextField[],\n pageNumber: number,\n): TextField | null {\n for (const field of fields) {\n if (field.pageNumber !== pageNumber) continue;\n if (\n x >= field.x &&\n x <= field.x + field.width &&\n y >= field.y &&\n y <= field.y + field.height\n ) {\n return field;\n }\n }\n return null;\n}\n\n/** Select the word under a point in the PDF text layer (browser selection). */\nexport function selectWordAtPoint(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement | null,\n): string | null {\n if (!textLayer) return null;\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (!range || !textLayer.contains(range.startContainer)) return null;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE || !node.textContent) return null;\n\n const text = node.textContent;\n let offset = range.startOffset;\n offset = Math.min(Math.max(0, offset), text.length);\n\n const isWordChar = (ch: string) => /[\\p{L}\\p{N}_'-]/u.test(ch);\n let start = offset;\n let end = offset;\n\n while (start > 0 && isWordChar(text[start - 1]!)) start -= 1;\n while (end < text.length && isWordChar(text[end]!)) end += 1;\n\n if (start === end) return null;\n\n const wordRange = document.createRange();\n wordRange.setStart(node, start);\n wordRange.setEnd(node, end);\n\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(wordRange);\n\n return text.slice(start, end);\n}\n\nexport function drawTextsOnCanvas(\n ctx: CanvasRenderingContext2D,\n texts: TextAnnotation[],\n scale: number,\n): void {\n ctx.save();\n for (const text of texts) {\n if (!text.value.trim()) continue;\n\n const x = text.x * scale;\n const y = text.y * scale;\n const fontSize = Math.max(8, text.fontSize * scale);\n\n ctx.fillStyle = text.color;\n ctx.font = `${fontSize}px sans-serif`;\n ctx.textBaseline = \"top\";\n\n const lineHeight = fontSize * 1.25;\n const lines = text.value.split(\"\\n\");\n let cursorY = y;\n\n for (const line of lines) {\n ctx.fillText(line, x, cursorY);\n cursorY += lineHeight;\n }\n }\n ctx.restore();\n}\n\nexport function drawTextFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: TextField[],\n filledFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = filledFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(5, 150, 105, 0.08)\"\n : \"rgba(5, 150, 105, 0.16)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(5, 150, 105, 0.45)\"\n : \"#059669\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n","import type { ReactNode } from \"react\";\n\ntype IconProps = {\n size?: number;\n className?: string;\n};\n\nfunction Icon({\n size = 14,\n className,\n children,\n}: IconProps & { children: ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"15 18 9 12 15 6\" />\n </Icon>\n );\n}\n\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"9 18 15 12 9 6\" />\n </Icon>\n );\n}\n\nexport function DownloadIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function GridIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </Icon>\n );\n}\n\nexport function MinusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PlusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PrinterIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"6 9 6 2 18 2 18 9\" />\n <path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\" />\n <rect x=\"6\" y=\"14\" width=\"12\" height=\"8\" />\n </Icon>\n );\n}\n\nexport function RefreshIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </Icon>\n );\n}\n\nexport function RotateIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </Icon>\n );\n}\n\nexport function HighlightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function UnderlineIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M6 3v7a6 6 0 0 0 12 0V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </Icon>\n );\n}\n\nexport function EraserIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\" />\n <path d=\"M22 21H7\" />\n <path d=\"m5 11 9 9\" />\n </Icon>\n );\n}\n\nexport function SignatureIcon({ size = 16, className }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"12\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M232,172H57.32c4-7.83,8.18-16.11,12.21-24.56,15.14,3.55,34.13-8.06,56.54-34.59,3.67,12.5,12.53,34.83,29.08,35.15h.35c8.71,0,17.64-6.25,27.16-19.06C187.17,137.14,199.31,148,232,148a4,4,0,0,0,0-8c-42.88,0-44-19.24-44-20a4,4,0,0,0-7.35-2.18C168.74,136.1,160.42,140,155.48,140h-.18c-13-.25-21.29-26.52-23.38-36.61a4,4,0,0,0-7-1.69c-20.94,26.27-39.06,39.55-51.8,38.2C97.31,87.5,105.19,53.16,96.49,37.77,94,33.31,88.7,28,77.91,28,64.09,28,52.54,42.41,47,66.54A122.7,122.7,0,0,0,45.46,113c2.64,15.29,8.39,26.05,16.69,31.35-4.58,9.6-9.3,19-13.84,27.68H24a4,4,0,0,0,0,8H44.1c-12.87,24.17-23.37,41.68-23.53,41.94a4,4,0,0,0,1.37,5.49A3.93,3.93,0,0,0,24,228a4,4,0,0,0,3.43-1.94c.16-.27,11.85-19.75,25.72-46.06H232a4,4,0,0,0,0-8ZM53.34,111.61a114.81,114.81,0,0,1,1.49-43.29C58.4,52.7,66.34,36,77.91,36c7.52,0,10.23,3.26,11.61,5.7C99,58.4,79.92,106,65.6,137,59.76,132.69,55.46,123.83,53.34,111.61Z\" />\n </svg>\n );\n}\n\nexport function PencilIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function TextIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\n </Icon>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { TextLayer } from \"pdfjs-dist\";\nimport type { PdfDoc } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport { createMarkupId, expandRedactRects, REDACT_COLOR, selectionRectsForPage, selectionStartPoint } from \"./markup\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId } from \"./signature\";\nimport {\n clientDeltaToPage,\n clientPointToPage,\n pageSizeFromSurface,\n} from \"./coords\";\nimport type { TextAnnotation, TextField } from \"./text\";\nimport {\n createTextId,\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n findTextFieldAtPoint,\n measureInlineText,\n resolveInlineTextPoint,\n selectWordAtPoint,\n} from \"./text\";\nimport { PencilIcon } from \"./icons\";\n\ninterface PageCanvasProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n scale: number;\n rotation: number;\n pageRef?: (el: HTMLDivElement | null) => void;\n onRendered?: (pageNumber: number) => void;\n markupTool?: MarkupTool;\n markupColor?: string;\n annotations?: MarkupAnnotation[];\n onAddAnnotation?: (annotation: MarkupAnnotation) => void;\n onRemoveAnnotation?: (id: string) => void;\n signatures?: SignatureAnnotation[];\n pendingSignature?: { imageDataUrl: string; width: number; height: number } | null;\n onAddSignature?: (signature: SignatureAnnotation) => void;\n onUpdateSignature?: (id: string, patch: Partial<SignatureAnnotation>) => void;\n onRemoveSignature?: (id: string) => void;\n onEditSignature?: (id: string) => void;\n onDuplicateSignature?: (id: string) => void;\n selectedSignatureId?: string | null;\n onSelectSignature?: (id: string | null) => void;\n signatureFields?: SignatureField[];\n selectedSignatureFieldId?: string | null;\n onSelectSignatureField?: (id: string | null) => void;\n hasFixedSignatureFields?: boolean;\n onOpenSignaturePad?: (fieldType?: import(\"./signature\").SignatureFieldType) => void;\n /** Values for date/text fixed fields, keyed by field id. */\n fieldValues?: Record<string, string>;\n onFieldValueChange?: (fieldId: string, value: string) => void;\n onFieldValueCommit?: (fieldId: string) => void;\n pendingFieldValue?: { type: \"date\" | \"text\"; value: string } | null;\n onPlaceFieldValue?: (pageNumber: number, x: number, y: number) => void;\n texts?: TextAnnotation[];\n onAddText?: (text: TextAnnotation) => void;\n onUpdateText?: (id: string, patch: Partial<TextAnnotation>) => void;\n onRemoveText?: (id: string) => void;\n selectedTextId?: string | null;\n onSelectText?: (id: string | null) => void;\n textFields?: TextField[];\n selectedTextFieldId?: string | null;\n onSelectTextField?: (id: string | null) => void;\n hasFixedTextFields?: boolean;\n editingTextId?: string | null;\n onEditingTextIdChange?: (id: string | null) => void;\n}\n\nexport function PageCanvas({\n pdfDoc,\n pageNumber,\n scale,\n rotation,\n pageRef,\n onRendered,\n markupTool = \"none\",\n markupColor,\n annotations = [],\n onAddAnnotation,\n onRemoveAnnotation,\n signatures = [],\n pendingSignature = null,\n onAddSignature,\n onUpdateSignature,\n onRemoveSignature,\n onEditSignature,\n onDuplicateSignature,\n selectedSignatureId = null,\n onSelectSignature,\n signatureFields = [],\n selectedSignatureFieldId = null,\n onSelectSignatureField,\n hasFixedSignatureFields = false,\n onOpenSignaturePad,\n fieldValues = {},\n onFieldValueChange: _onFieldValueChange,\n onFieldValueCommit: _onFieldValueCommit,\n pendingFieldValue = null,\n onPlaceFieldValue,\n texts = [],\n onAddText,\n onUpdateText,\n onRemoveText,\n selectedTextId = null,\n onSelectText,\n textFields = [],\n selectedTextFieldId: _selectedTextFieldId = null,\n onSelectTextField,\n hasFixedTextFields = false,\n editingTextId = null,\n onEditingTextIdChange,\n}: PageCanvasProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const renderTaskRef = useRef<RenderTask | null>(null);\n const textLayerInstanceRef = useRef<TextLayer | null>(null);\n const [dragState, setDragState] = useState<\n | { kind: \"signature\"; id: string; offsetX: number; offsetY: number }\n | { kind: \"resize\"; id: string; startX: number; startY: number; startW: number; startH: number }\n | null\n >(null);\n const inlineEditRef = useRef<HTMLSpanElement>(null);\n const justOpenedEditorRef = useRef(false);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current || !textLayerRef.current || !surfaceRef.current) {\n return;\n }\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const textLayerDiv = textLayerRef.current;\n const surface = surfaceRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const render = async () => {\n try {\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewport = page.getViewport({ scale, rotation });\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n\n canvas.width = width;\n canvas.height = height;\n surface.style.width = `${width}px`;\n surface.style.height = `${height}px`;\n\n const task = page.render({ canvasContext: ctx, viewport });\n renderTaskRef.current = task;\n await task.promise;\n if (cancelled) return;\n\n textLayerDiv.replaceChildren();\n textLayerDiv.style.setProperty(\"--scale-factor\", String(viewport.scale));\n\n const textContent = await page.getTextContent();\n if (cancelled) return;\n\n const textLayer = new TextLayer({\n textContentSource: textContent,\n container: textLayerDiv,\n viewport,\n });\n textLayerInstanceRef.current = textLayer;\n await textLayer.render();\n if (cancelled) return;\n\n onRendered?.(pageNumber);\n } catch {\n // ignore (often cancellation)\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n };\n }, [pdfDoc, pageNumber, scale, rotation, onRendered]);\n\n useEffect(() => {\n const surface = surfaceRef.current;\n if (!surface) return;\n\n const applySelectionMarkup = (kind: \"highlight\" | \"underline\" | \"redact\") => {\n if (!onAddAnnotation) return false;\n\n const color =\n kind === \"redact\"\n ? REDACT_COLOR\n : markupColor;\n if (!color) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects =\n kind === \"redact\"\n ? expandRedactRects(captured.rects)\n : captured.rects;\n\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind,\n color,\n rects,\n text: captured.text,\n });\n\n window.getSelection()?.removeAllRanges();\n return true;\n };\n\n const replaceSelectedPdfText = (initialValue: string) => {\n if (!onAddAnnotation || !onAddText) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects = expandRedactRects(captured.rects);\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects,\n text: captured.text,\n });\n\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(initialValue || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: initialValue,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n window.setTimeout(() => {\n justOpenedEditorRef.current = false;\n }, 0);\n return true;\n };\n\n const handleMouseUp = () => {\n if (markupTool === \"highlight\" || markupTool === \"underline\") {\n applySelectionMarkup(markupTool);\n return;\n }\n // Erase tool: select PDF words to cover/remove them\n if (markupTool === \"erase\") {\n applySelectionMarkup(\"redact\");\n return;\n }\n // Text tool: select existing PDF text → open it for editing\n if (markupTool === \"text\") {\n const selection = window.getSelection();\n if (\n selection &&\n !selection.isCollapsed &&\n selection.toString().trim() &&\n selection.anchorNode &&\n surface.contains(selection.anchorNode)\n ) {\n replaceSelectedPdfText(selection.toString());\n }\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target?.closest(\"[contenteditable='true']\") ||\n target?.closest(\"[contenteditable='']\") ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const selection = window.getSelection();\n const hasPdfSelection =\n selection != null &&\n !selection.isCollapsed &&\n selection.toString().trim().length > 0 &&\n selection.anchorNode != null &&\n surface.contains(selection.anchorNode);\n\n if (markupTool === \"text\" && hasPdfSelection) {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n replaceSelectedPdfText(selection!.toString());\n return;\n }\n\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n event.preventDefault();\n replaceSelectedPdfText(event.key);\n return;\n }\n }\n\n if (markupTool !== \"text\" && markupTool !== \"erase\") return;\n if (event.key !== \"Backspace\" && event.key !== \"Delete\") return;\n\n if (!hasPdfSelection) return;\n\n event.preventDefault();\n applySelectionMarkup(\"redact\");\n };\n\n surface.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n surface.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n markupTool,\n markupColor,\n onAddAnnotation,\n onAddText,\n onEditingTextIdChange,\n onSelectText,\n pageNumber,\n scale,\n ]);\n\n useEffect(() => {\n if (!dragState) return;\n\n let rafId = 0;\n let lastClientX = 0;\n let lastClientY = 0;\n let scrollDir = 0; // -1 up, 1 down, 0 none\n\n const getScrollContainer = (): HTMLElement | null => {\n return (\n wrapRef.current?.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null\n );\n };\n\n const updateResizeAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"resize\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n const surface = surfaceRef.current;\n const pageSize = surface\n ? pageSizeFromSurface(surface, scale)\n : { width: Infinity, height: Infinity };\n const { dx, dy } = surface\n ? clientDeltaToPage(\n clientX - dragState.startX,\n clientY - dragState.startY,\n surface,\n scale,\n )\n : { dx: 0, dy: 0 };\n\n const maxW = pageSize.width - sig.x;\n const maxH = pageSize.height - sig.y;\n const newW = Math.min(maxW, Math.max(40, dragState.startW + dx));\n const newH = Math.min(maxH, Math.max(20, dragState.startH + dy));\n onUpdateSignature(dragState.id, { width: newW, height: newH });\n };\n\n const updateSignatureAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"signature\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n // Prefer element under cursor; fall back to previous page when over empty gutter\n let pageEl = document\n .elementFromPoint(clientX, clientY)\n ?.closest(\"[data-page-number]\") as HTMLElement | null;\n\n if (!pageEl) {\n const pages = Array.from(\n document.querySelectorAll(\".epochs-pdf-viewer__page[data-page-number]\"),\n ) as HTMLElement[];\n pageEl =\n pages.find((page) => {\n const box = page.getBoundingClientRect();\n return clientY >= box.top && clientY <= box.bottom;\n }) ?? null;\n }\n\n if (!pageEl) {\n pageEl = wrapRef.current;\n }\n if (!pageEl) return;\n\n const surface = pageEl.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n if (!surface) return;\n\n const targetPage = Number.parseInt(\n pageEl.getAttribute(\"data-page-number\") || String(sig.pageNumber),\n 10,\n );\n\n const point = clientPointToPage(clientX, clientY, surface, scale);\n const pageSize = pageSizeFromSurface(surface, scale);\n let nextX = point.x - dragState.offsetX;\n let nextY = point.y - dragState.offsetY;\n const maxX = Math.max(0, pageSize.width - sig.width);\n const maxY = Math.max(0, pageSize.height - sig.height);\n nextX = Math.min(Math.max(0, nextX), maxX);\n nextY = Math.min(Math.max(0, nextY), maxY);\n\n onUpdateSignature(dragState.id, {\n pageNumber: targetPage,\n x: nextX,\n y: nextY,\n });\n };\n\n const tickScroll = () => {\n rafId = 0;\n if (!scrollDir) return;\n\n const container = getScrollContainer();\n if (!container) return;\n\n const maxScroll = container.scrollHeight - container.clientHeight;\n if (maxScroll <= 0) return;\n\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = lastClientY - box.top;\n const distBottom = box.bottom - lastClientY;\n\n let speed = 0;\n if (scrollDir < 0 && distTop < edge) {\n speed = -Math.max(6, ((edge - distTop) / edge) * 28);\n } else if (scrollDir > 0 && distBottom < edge) {\n speed = Math.max(6, ((edge - distBottom) / edge) * 28);\n } else {\n scrollDir = 0;\n return;\n }\n\n const prev = container.scrollTop;\n container.scrollTop = Math.min(maxScroll, Math.max(0, prev + speed));\n\n if (container.scrollTop !== prev) {\n updateSignatureAtPoint(lastClientX, lastClientY);\n }\n\n if (\n (speed < 0 && container.scrollTop > 0) ||\n (speed > 0 && container.scrollTop < maxScroll)\n ) {\n rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n };\n\n const handleMove = (event: PointerEvent) => {\n lastClientX = event.clientX;\n lastClientY = event.clientY;\n\n const container = getScrollContainer();\n if (container) {\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = event.clientY - box.top;\n const distBottom = box.bottom - event.clientY;\n\n if (distTop < edge) {\n scrollDir = -1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else if (distBottom < edge) {\n scrollDir = 1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n }\n\n if (dragState.kind === \"resize\") {\n updateResizeAtPoint(event.clientX, event.clientY);\n } else {\n updateSignatureAtPoint(event.clientX, event.clientY);\n }\n };\n\n const handleUp = () => {\n scrollDir = 0;\n if (rafId) {\n window.cancelAnimationFrame(rafId);\n rafId = 0;\n }\n setDragState(null);\n };\n\n window.addEventListener(\"pointermove\", handleMove);\n window.addEventListener(\"pointerup\", handleUp);\n window.addEventListener(\"pointercancel\", handleUp);\n return () => {\n scrollDir = 0;\n if (rafId) window.cancelAnimationFrame(rafId);\n window.removeEventListener(\"pointermove\", handleMove);\n window.removeEventListener(\"pointerup\", handleUp);\n window.removeEventListener(\"pointercancel\", handleUp);\n };\n }, [\n dragState,\n hasFixedSignatureFields,\n onUpdateSignature,\n scale,\n signatures,\n ]);\n\n useEffect(() => {\n if (!editingTextId || !inlineEditRef.current) return;\n const el = inlineEditRef.current;\n const current = texts.find((t) => t.id === editingTextId);\n // Uncontrolled while editing — set DOM text once so React won't reset the caret\n el.textContent = current?.value ?? \"\";\n el.focus();\n\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n // Only re-run when the edit session starts, not on every keystroke\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editingTextId]);\n\n const setRefs = (el: HTMLDivElement | null) => {\n wrapRef.current = el;\n pageRef?.(el);\n };\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter((f) => f.pageNumber === pageNumber);\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n\n const commitInlineText = (text: TextAnnotation, value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n onRemoveText?.(text.id);\n onEditingTextIdChange?.(null);\n return;\n }\n\n const size = measureInlineText(trimmed, text.fontSize);\n onUpdateText?.(text.id, {\n value: trimmed,\n width: size.width,\n height: size.height,\n });\n onEditingTextIdChange?.(null);\n };\n\n const beginInlineTextAt = (clientX: number, clientY: number) => {\n if (!onAddText) return;\n\n const surface = surfaceRef.current;\n const textLayer = textLayerRef.current;\n if (!surface || !textLayer) return;\n\n let point = resolveInlineTextPoint(\n clientX,\n clientY,\n surface,\n textLayer,\n scale,\n );\n\n let fieldId: string | undefined;\n let color = DEFAULT_TEXT_COLOR;\n\n if (hasFixedTextFields) {\n const field = findTextFieldAtPoint(\n point.x,\n point.y,\n textFields,\n pageNumber,\n );\n if (!field) return;\n\n const existing = texts.find((t) => t.fieldId === field.id);\n if (existing) {\n onSelectText?.(existing.id);\n onSelectTextField?.(field.id);\n onEditingTextIdChange?.(existing.id);\n return;\n }\n\n fieldId = field.id;\n point = {\n x: field.x,\n y: field.y,\n fontSize: field.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n };\n color = field.color ?? DEFAULT_TEXT_COLOR;\n onSelectTextField?.(field.id);\n }\n\n const size = measureInlineText(\"\", point.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n fieldId,\n pageNumber,\n x: point.x,\n y: point.y,\n width: size.width,\n height: size.height,\n value: \"\",\n fontSize: point.fontSize,\n color,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n };\n\n const handleInlineTextClick = (event: React.MouseEvent<HTMLElement>) => {\n if (markupTool !== \"text\") return;\n if ((event.target as HTMLElement).closest(\".epochs-pdf-viewer__inline-text\")) {\n return;\n }\n // Skip the click that follows a select-to-edit mouseup\n if (justOpenedEditorRef.current) {\n justOpenedEditorRef.current = false;\n return;\n }\n\n // Selecting existing PDF words opens the editor on mouseup — don't insert here\n const selection = window.getSelection();\n if (selection && !selection.isCollapsed && selection.toString().trim()) {\n return;\n }\n\n // Double-click: select the word under the cursor and edit it\n if (event.detail >= 2) {\n const word = selectWordAtPoint(event.clientX, event.clientY, textLayerRef.current);\n if (word) {\n // mouseup already ran; open editor from the new word selection\n const surface = surfaceRef.current;\n if (surface && onAddAnnotation && onAddText) {\n const captured = selectionRectsForPage(surface, scale);\n if (captured) {\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects: expandRedactRects(captured.rects),\n text: captured.text,\n });\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(captured.text || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: captured.text,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n }\n }\n return;\n }\n }\n\n event.stopPropagation();\n beginInlineTextAt(event.clientX, event.clientY);\n };\n\n const handleSurfaceClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\".epochs-pdf-viewer__signature\") ||\n target.closest(\".epochs-pdf-viewer__signature-field\") ||\n target.closest(\".epochs-pdf-viewer__inline-text\")\n ) {\n return;\n }\n\n if (markupTool === \"text\") {\n beginInlineTextAt(event.clientX, event.clientY);\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingFieldValue &&\n onPlaceFieldValue\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n onPlaceFieldValue(pageNumber, Math.max(0, point.x - 75), Math.max(0, point.y - 12));\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingSignature &&\n onAddSignature\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const pageSize = pageSizeFromSurface(surface, scale);\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n\n let x = point.x - pendingSignature.width / 2;\n let y = point.y - pendingSignature.height / 2;\n\n const maxX = Math.max(0, pageSize.width - pendingSignature.width);\n const maxY = Math.max(0, pageSize.height - pendingSignature.height);\n x = Math.min(Math.max(0, x), maxX);\n y = Math.min(Math.max(0, y), maxY);\n\n onAddSignature({\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: pendingSignature.width,\n height: pendingSignature.height,\n imageDataUrl: pendingSignature.imageDataUrl,\n });\n return;\n }\n };\n\n const renderInlineText = (text: TextAnnotation) => {\n const isEditing = editingTextId === text.id;\n\n if (isEditing) {\n return (\n <span\n key={text.id}\n ref={inlineEditRef}\n contentEditable\n suppressContentEditableWarning\n role=\"textbox\"\n aria-label=\"Edit text\"\n className=\"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--editing\"\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n minWidth: Math.max(12, text.fontSize * scale * 0.5),\n width: Math.max(text.width * scale, text.fontSize * scale * 0.5),\n }}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onInput={(e) => {\n const value = e.currentTarget.textContent ?? \"\";\n const size = measureInlineText(value || \" \", text.fontSize);\n // Update metrics only — do not write value back into the DOM\n onUpdateText?.(text.id, {\n value,\n width: size.width,\n height: size.height,\n });\n }}\n onBlur={(e) => {\n commitInlineText(text, e.currentTarget.textContent ?? \"\");\n }}\n onKeyDown={(e) => {\n // Keep spaces / typing local to this editor\n e.stopPropagation();\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n }}\n />\n );\n }\n\n if (!text.value.trim()) return null;\n\n return (\n <span\n key={text.id}\n className={\n selectedTextId === text.id\n ? \"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--selected\"\n : \"epochs-pdf-viewer__inline-text\"\n }\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (markupTool === \"erase\") {\n onRemoveText?.(text.id);\n return;\n }\n if (markupTool === \"text\") {\n onSelectText?.(text.id);\n onEditingTextIdChange?.(text.id);\n }\n }}\n >\n {text.value}\n </span>\n );\n };\n\n return (\n <div\n ref={setRefs}\n data-page-number={pageNumber}\n className=\"epochs-pdf-viewer__page\"\n >\n <div\n ref={surfaceRef}\n className={`epochs-pdf-viewer__surface epochs-pdf-viewer__surface--tool-${markupTool}`}\n onClick={handleSurfaceClick}\n >\n <canvas ref={canvasRef} className=\"epochs-pdf-viewer__canvas\" />\n\n <div className=\"epochs-pdf-viewer__markup-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? null\n : ann.rects.map((rect, idx) => {\n if (ann.kind === \"highlight\") {\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--highlight\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }\n\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--underline\"\n style={{\n left: rect.x * scale,\n top: (rect.y + rect.h) * scale - Math.max(2, scale * 1.5),\n width: rect.w * scale,\n height: Math.max(2, scale * 1.5),\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }),\n )}\n </div>\n\n <div className=\"epochs-pdf-viewer__signature-layer\">\n {pageSignatureFields.map((field) => {\n const fType = field.type ?? \"sign\";\n const textValue =\n fieldValues[field.id] ?? field.value ?? \"\";\n const filled =\n fType === \"date\" || fType === \"text\"\n ? Boolean(textValue.trim())\n : pageSignatures.some((sig) => sig.fieldId === field.id);\n return (\n <button\n key={field.id}\n type=\"button\"\n data-signature-field-id={field.id}\n className={\n selectedSignatureFieldId === field.id\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--selected\"\n : filled\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--filled\"\n : \"epochs-pdf-viewer__signature-field\"\n }\n style={{\n left: field.x * scale,\n top: field.y * scale,\n width: field.width * scale,\n height: field.height * scale,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignatureField?.(field.id);\n if (fType === \"date\" || fType === \"text\") {\n onSelectSignature?.(null);\n onOpenSignaturePad?.(fType);\n return;\n }\n const existing = pageSignatures.find((sig) => sig.fieldId === field.id);\n onSelectSignature?.(existing?.id ?? null);\n if (existing) {\n onEditSignature?.(existing.id);\n } else {\n onOpenSignaturePad?.(fType);\n }\n }}\n title={\n filled\n ? \"Completed field\"\n : fType === \"date\"\n ? \"Date field\"\n : fType === \"text\"\n ? \"Text field\"\n : \"Signature field\"\n }\n >\n {(() => {\n if (fType === \"date\" || fType === \"text\") {\n if (textValue.trim()) {\n return (\n <span className=\"epochs-pdf-viewer__signature-field-value\">\n {textValue}\n </span>\n );\n }\n if (fType === \"date\") return <span>Date here</span>;\n return <span>{field.placeholder ?? \"Enter text\"}</span>;\n }\n return filled ? null : <span>Sign here</span>;\n })()}\n </button>\n );\n })}\n {pageSignatures.map((sig) => (\n <div\n key={sig.id}\n className={\n selectedSignatureId === sig.id\n ? \"epochs-pdf-viewer__signature epochs-pdf-viewer__signature--selected\"\n : \"epochs-pdf-viewer__signature\"\n }\n style={{\n left: sig.x * scale,\n top: sig.y * scale,\n width: sig.width * scale,\n height: sig.height * scale,\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n\n if (markupTool === \"erase\" && !hasFixedSignatureFields) {\n onRemoveSignature?.(sig.id);\n return;\n }\n\n if (hasFixedSignatureFields) {\n onSelectSignatureField?.(sig.fieldId ?? null);\n onEditSignature?.(sig.id);\n return;\n }\n\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(e.clientX, e.clientY, surface, scale);\n setDragState({\n kind: \"signature\",\n id: sig.id,\n offsetX: point.x - sig.x,\n offsetY: point.y - sig.y,\n });\n }}\n >\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-edit\"\n title=\"Edit signature\"\n aria-label=\"Edit signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onEditSignature?.(sig.id);\n }}\n >\n <PencilIcon size={12} />\n </button>\n {!hasFixedSignatureFields ? (\n <>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-duplicate\"\n title=\"Duplicate signature\"\n aria-label=\"Duplicate signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onDuplicateSignature?.(sig.id);\n }}\n >\n ⧉\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-remove\"\n title=\"Remove signature\"\n aria-label=\"Remove signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onRemoveSignature?.(sig.id);\n }}\n >\n ×\n </button>\n </>\n ) : null}\n <img src={sig.imageDataUrl} alt=\"Signature\" draggable={false} />\n {!hasFixedSignatureFields ? (\n <div\n className=\"epochs-pdf-viewer__signature-resize\"\n title=\"Resize\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n setDragState({\n kind: \"resize\",\n id: sig.id,\n startX: e.clientX,\n startY: e.clientY,\n startW: sig.width,\n startH: sig.height,\n });\n }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 1L1 7M7 4L4 7\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n </svg>\n </div>\n ) : null}\n </div>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__text-layer-overlay\">\n {pageTexts.map((text) => renderInlineText(text))}\n </div>\n\n <div\n ref={textLayerRef}\n className=\"textLayer epochs-pdf-viewer__text-layer\"\n onClick={handleInlineTextClick}\n />\n\n <div className=\"epochs-pdf-viewer__redact-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? ann.rects.map((rect, idx) => (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--redact\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color || REDACT_COLOR,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n ))\n : null,\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { drawMarkupOnCanvas, type MarkupAnnotation } from \"./markup\";\nimport {\n drawSignatureFieldsOnCanvas,\n drawSignaturesOnCanvas,\n type SignatureAnnotation,\n type SignatureField,\n} from \"./signature\";\nimport {\n drawTextFieldsOnCanvas,\n drawTextsOnCanvas,\n type TextAnnotation,\n type TextField,\n} from \"./text\";\nimport type { PdfDoc } from \"./types\";\n\ninterface ThumbnailProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n isActive?: boolean;\n rotation: number;\n onSelect: (pageNumber: number) => void;\n width?: number;\n annotations?: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n signatureFields?: SignatureField[];\n texts?: TextAnnotation[];\n textFields?: TextField[];\n}\n\nexport function Thumbnail({\n pdfDoc,\n pageNumber,\n isActive,\n rotation,\n onSelect,\n width = 140,\n annotations = [],\n signatures = [],\n signatureFields = [],\n texts = [],\n textFields = [],\n}: ThumbnailProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current) return;\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n let task: RenderTask | null = null;\n\n const render = async () => {\n try {\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n const scale = width / viewportAt1.width;\n const viewport = page.getViewport({ scale, rotation });\n\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n\n task = page.render({ canvasContext: ctx, viewport });\n await task.promise;\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageAnnotations.length > 0) {\n drawMarkupOnCanvas(ctx, pageAnnotations, scale);\n }\n\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageSignatureFields.length > 0) {\n drawSignatureFieldsOnCanvas(\n ctx,\n pageSignatureFields,\n new Set(pageSignatures.map((sig) => sig.fieldId).filter(Boolean) as string[]),\n scale,\n );\n }\n if (pageSignatures.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSignatures, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n const pageTextFields = textFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageTextFields.length > 0) {\n drawTextFieldsOnCanvas(\n ctx,\n pageTextFields,\n new Set(\n pageTexts\n .filter((t) => t.fieldId && t.value.trim())\n .map((t) => t.fieldId as string),\n ),\n scale,\n );\n }\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n } catch {\n // ignore\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (task) {\n try {\n task.cancel();\n } catch {\n // ignore\n }\n }\n };\n }, [\n annotations,\n pdfDoc,\n pageNumber,\n rotation,\n signatureFields,\n signatures,\n textFields,\n texts,\n width,\n ]);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(pageNumber)}\n className={\n isActive\n ? \"epochs-pdf-viewer__thumb epochs-pdf-viewer__thumb--active\"\n : \"epochs-pdf-viewer__thumb\"\n }\n title={`Page ${pageNumber}`}\n >\n <div className=\"epochs-pdf-viewer__thumb-frame\">\n <canvas ref={canvasRef} />\n </div>\n <span className=\"epochs-pdf-viewer__thumb-label\">{pageNumber}</span>\n </button>\n );\n}\n","import * as pdfjsLib from \"pdfjs-dist\";\n\nconst ABSOLUTE_URL_PATTERN = /^(blob:|https?:|data:)/i;\n\nlet workerConfigured = false;\n\n/** Configure pdf.js worker. Call once, or pass `workerSrc` to `<PdfViewer>`. */\nexport function setPdfWorkerSrc(workerSrc: string): void {\n pdfjsLib.GlobalWorkerOptions.workerSrc = workerSrc;\n workerConfigured = true;\n}\n\nexport function ensurePdfWorker(workerSrc?: string): void {\n if (workerSrc) {\n setPdfWorkerSrc(workerSrc);\n return;\n }\n if (workerConfigured || pdfjsLib.GlobalWorkerOptions.workerSrc) return;\n\n setPdfWorkerSrc(\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`,\n );\n}\n\nexport function resolvePdfUrl(\n file?: string,\n fileUrl?: string,\n baseUrl = \"\",\n): string {\n const source = fileUrl || file;\n if (!source) return \"\";\n\n if (ABSOLUTE_URL_PATTERN.test(source)) return source;\n\n const path = source.startsWith(\"/\") ? source : `/${source}`;\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n}\n\nexport async function urlToPdfArrayBuffer(\n url: string,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n const res = await fetch(url, fetchOptions);\n\n if (!res.ok) {\n throw new Error(`Failed to fetch PDF (${res.status})`);\n }\n\n return res.arrayBuffer();\n}\n\nexport async function sourceToArrayBuffer(\n source: string | ArrayBuffer | Uint8Array | Blob,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n if (typeof source === \"string\") {\n return urlToPdfArrayBuffer(source, fetchOptions);\n }\n if (source instanceof ArrayBuffer) return source.slice(0);\n if (source instanceof Uint8Array) {\n const copy = new Uint8Array(source.byteLength);\n copy.set(source);\n return copy.buffer;\n }\n return source.arrayBuffer();\n}\n\nexport { pdfjsLib };\n","import type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport type { MarkupAnnotation } from \"./markup\";\nimport { drawMarkupOnCanvas } from \"./markup\";\nimport type { SignatureAnnotation } from \"./signature\";\nimport { drawSignaturesOnCanvas } from \"./signature\";\nimport type { TextAnnotation } from \"./text\";\nimport { drawTextsOnCanvas } from \"./text\";\n\nexport interface RenderedPageImage {\n pageNumber: number;\n /** Canvas pixel size */\n width: number;\n height: number;\n /** PDF page size at scale 1 (points) */\n pageWidth: number;\n pageHeight: number;\n dataUrl: string;\n jpegBytes: Uint8Array;\n}\n\n/** Render a page in the *main* document (iframe canvases break pdf.js fonts). */\nexport async function renderPageWithMarkup(\n pdfDoc: PDFDocumentProxy,\n pageNumber: number,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage> {\n const {\n scale,\n rotation,\n annotations,\n signatures = [],\n texts = [],\n mimeType = \"image/jpeg\",\n quality = 0.92,\n } = options;\n\n const page = await pdfDoc.getPage(pageNumber);\n const viewport = page.getViewport({ scale, rotation });\n const baseViewport = page.getViewport({ scale: 1, rotation });\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n if (!ctx) {\n throw new Error(\"Could not create canvas context\");\n }\n\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n canvas.width = width;\n canvas.height = height;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, width, height);\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n const pageMarks = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageMarks.length > 0) {\n drawMarkupOnCanvas(ctx, pageMarks, scale);\n }\n\n const pageSigs = signatures.filter((s) => s.pageNumber === pageNumber);\n if (pageSigs.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSigs, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n\n const dataUrl = canvas.toDataURL(mimeType, quality);\n const jpegBytes = dataUrlToBytes(dataUrl);\n\n canvas.width = 0;\n canvas.height = 0;\n\n return {\n pageNumber,\n width,\n height,\n pageWidth: baseViewport.width,\n pageHeight: baseViewport.height,\n dataUrl,\n jpegBytes,\n };\n}\n\nexport async function renderAllPagesWithMarkup(\n pdfDoc: PDFDocumentProxy,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage[]> {\n const pages: RenderedPageImage[] = [];\n for (let i = 1; i <= pdfDoc.numPages; i += 1) {\n pages.push(await renderPageWithMarkup(pdfDoc, i, options));\n }\n return pages;\n}\n\nfunction dataUrlToBytes(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1] ?? \"\";\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction enc(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n}\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((sum, p) => sum + p.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.byteLength;\n }\n return out;\n}\n\n/**\n * Build a multi-page PDF embedding each page as a JPEG (includes baked markup).\n */\nexport function buildPdfFromJpegPages(pages: RenderedPageImage[]): Uint8Array {\n type PdfObject = Uint8Array;\n const objects: PdfObject[] = [];\n\n const add = (bytes: Uint8Array): number => {\n objects.push(bytes);\n return objects.length; // 1-indexed id\n };\n\n const pageIds: number[] = [];\n\n for (const page of pages) {\n const imageStream = concat(\n enc(\n `<< /Type /XObject /Subtype /Image /Width ${page.width} /Height ${page.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpegBytes.byteLength} >>\\nstream\\n`,\n ),\n page.jpegBytes,\n enc(`\\nendstream`),\n );\n const imageId = add(imageStream);\n\n const content = `q\\n${page.pageWidth.toFixed(2)} 0 0 ${page.pageHeight.toFixed(2)} 0 0 cm\\n/Im0 Do\\nQ`;\n const contentId = add(\n enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`),\n );\n\n // Parent placeholder replaced after pages object exists\n const pageId = add(\n enc(\n `<< /Type /Page /Parent __PAGES__ 0 R /MediaBox [0 0 ${page.pageWidth.toFixed(2)} ${page.pageHeight.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /XObject << /Im0 ${imageId} 0 R >> >> >>`,\n ),\n );\n pageIds.push(pageId);\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = add(\n enc(`<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`),\n );\n\n for (const pageId of pageIds) {\n const text = new TextDecoder().decode(objects[pageId - 1]);\n objects[pageId - 1] = enc(\n text.replace(\"/Parent __PAGES__ 0 R\", `/Parent ${pagesId} 0 R`),\n );\n }\n\n const catalogId = add(enc(`<< /Type /Catalog /Pages ${pagesId} 0 R >>`));\n\n const chunks: Uint8Array[] = [enc(\"%PDF-1.4\\n\")];\n const offsets: number[] = [0];\n let offset = chunks[0].byteLength;\n\n for (let i = 0; i < objects.length; i += 1) {\n offsets.push(offset);\n const objHeader = enc(`${i + 1} 0 obj\\n`);\n const objFooter = enc(`\\nendobj\\n`);\n chunks.push(objHeader, objects[i], objFooter);\n offset += objHeader.byteLength + objects[i].byteLength + objFooter.byteLength;\n }\n\n const xrefStart = offset;\n let xref = `xref\\n0 ${objects.length + 1}\\n`;\n xref += \"0000000000 65535 f \\n\";\n for (let i = 1; i <= objects.length; i += 1) {\n xref += `${String(offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n xref += `trailer\\n<< /Size ${objects.length + 1} /Root ${catalogId} 0 R >>\\n`;\n xref += `startxref\\n${xrefStart}\\n%%EOF`;\n chunks.push(enc(xref));\n\n return concat(...chunks);\n}\n\nexport function triggerBlobDownload(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { SignatureFieldType } from \"./signature\";\n\ninterface SignaturePadProps {\n open: boolean;\n onClose: () => void;\n onSave: (imageDataUrl: string, width: number, height: number) => void;\n /** Saves plain text for date/text fields (not converted to an image). */\n onSaveFieldValue?: (value: string, fieldType: \"date\" | \"text\") => void;\n /** When set, locks the modal to this field type (from a fixed field). */\n fieldType?: SignatureFieldType;\n /** Show Sign/Date/Text tabs when no fixed field type is provided. */\n showFieldTypeTabs?: boolean;\n /** Placeholder for text-type fields. */\n textPlaceholder?: string;\n /** Prefill when reopening an already-filled date/text field. */\n initialFieldValue?: string;\n /** Last submitted values by field type — used to prefill the modal. */\n rememberedByType?: RememberedFieldFills;\n /** Persist the values the user just submitted for this field type. */\n onRememberFill?: (\n type: SignatureFieldType,\n fill: RememberedSignFill | { value: string },\n ) => void;\n}\n\ntype PadMode = \"draw\" | \"type\";\n\nexport type RememberedSignFill = {\n mode: PadMode;\n imageDataUrl: string;\n width: number;\n height: number;\n typedName?: string;\n typedInitials?: string;\n fontId?: string;\n inkColor?: string;\n typeKind?: \"signature\" | \"initials\";\n};\n\nexport type RememberedFieldFills = {\n sign?: RememberedSignFill;\n date?: { value: string };\n text?: { value: string };\n};\n\nconst HANDWRITING_FONTS = [\n { id: \"dancing-script\", label: \"Dancing Script\", family: \"Dancing Script\" },\n { id: \"great-vibes\", label: \"Great Vibes\", family: \"Great Vibes\" },\n { id: \"pacifico\", label: \"Pacifico\", family: \"Pacifico\" },\n { id: \"satisfy\", label: \"Satisfy\", family: \"Satisfy\" },\n { id: \"allura\", label: \"Allura\", family: \"Allura\" },\n] as const;\n\ntype HandwritingFontId = (typeof HANDWRITING_FONTS)[number][\"id\"];\n\nconst HANDWRITING_FONTS_HREF =\n \"https://fonts.googleapis.com/css2?family=Allura&family=Dancing+Script:wght@500;600&family=Great+Vibes&family=Pacifico&family=Satisfy&display=swap\";\n\nlet handwritingFontsPromise: Promise<void> | null = null;\n\nfunction ensureHandwritingFonts(): Promise<void> {\n if (typeof document === \"undefined\") return Promise.resolve();\n if (handwritingFontsPromise) return handwritingFontsPromise;\n\n handwritingFontsPromise = new Promise((resolve) => {\n const existing = document.querySelector(\n `link[data-epochs-signature-fonts=\"true\"]`,\n );\n if (!existing) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = HANDWRITING_FONTS_HREF;\n link.dataset.epochsSignatureFonts = \"true\";\n document.head.appendChild(link);\n }\n\n const loadFaces = () =>\n Promise.all(\n HANDWRITING_FONTS.map((font) =>\n document.fonts.load(`48px \"${font.family}\"`),\n ),\n ).then(() => undefined);\n\n if (document.fonts?.ready) {\n document.fonts.ready.then(loadFaces).then(resolve).catch(() => resolve());\n } else {\n window.setTimeout(() => {\n loadFaces().then(resolve).catch(() => resolve());\n }, 300);\n }\n });\n\n return handwritingFontsPromise;\n}\n\nfunction typedSignatureFontSize(\n typeKind: \"signature\" | \"initials\",\n family: string,\n): number {\n if (typeKind === \"initials\") return 72;\n if (family === \"Great Vibes\" || family === \"Allura\") return 56;\n if (family === \"Pacifico\") return 44;\n return 48;\n}\n\nexport function SignaturePad({\n open,\n onClose,\n onSave,\n onSaveFieldValue,\n fieldType,\n showFieldTypeTabs = false,\n textPlaceholder,\n initialFieldValue,\n rememberedByType,\n onRememberFill,\n}: SignaturePadProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const drawingRef = useRef(false);\n const lastPointRef = useRef<{ x: number; y: number } | null>(null);\n const pathsRef = useRef<{ x: number; y: number }[][]>([]);\n const currentPathRef = useRef<{ x: number; y: number }[]>([]);\n const reusedSignatureRef = useRef<{\n imageDataUrl: string;\n width: number;\n height: number;\n } | null>(null);\n\n const resolvedFieldType: SignatureFieldType = fieldType ?? \"sign\";\n const [activeFieldType, setActiveFieldType] = useState<SignatureFieldType>(resolvedFieldType);\n const [dateValue, setDateValue] = useState(\"\");\n const [textValue, setTextValue] = useState(\"\");\n\n const [mode, setMode] = useState<PadMode>(\"draw\");\n const [typedName, setTypedName] = useState(\"\");\n const [typedInitials, setTypedInitials] = useState(\"\");\n const [initialsTouched, setInitialsTouched] = useState(false);\n const [typeKind, setTypeKind] = useState<\"signature\" | \"initials\">(\"signature\");\n const [inkColor, setInkColor] = useState(\"#111827\");\n const [fontId, setFontId] = useState<HandwritingFontId>(\"dancing-script\");\n const [fontsReady, setFontsReady] = useState(false);\n const [hasReusedSignature, setHasReusedSignature] = useState(false);\n\n const selectedFont =\n HANDWRITING_FONTS.find((font) => font.id === fontId) ?? HANDWRITING_FONTS[0];\n\n const previewText =\n typeKind === \"initials\" ? typedInitials.trim() : typedName.trim();\n const fontPreviewLabel =\n previewText || (typeKind === \"initials\" ? \"AB\" : \"Signature\");\n\n useEffect(() => {\n if (!open) return;\n setActiveFieldType(resolvedFieldType);\n\n if (resolvedFieldType === \"date\") {\n setDateValue(\n initialFieldValue ||\n rememberedByType?.date?.value ||\n new Date().toISOString().slice(0, 10),\n );\n return;\n }\n\n if (resolvedFieldType === \"text\") {\n setTextValue(initialFieldValue || rememberedByType?.text?.value || \"\");\n return;\n }\n\n const remembered = rememberedByType?.sign;\n if (!remembered) {\n setMode(\"draw\");\n setTypedName(\"\");\n setTypedInitials(\"\");\n setInitialsTouched(false);\n setTypeKind(\"signature\");\n setInkColor(\"#111827\");\n setFontId(\"dancing-script\");\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n return;\n }\n\n setMode(remembered.mode);\n setTypedName(remembered.typedName ?? \"\");\n setTypedInitials(remembered.typedInitials ?? \"\");\n setInitialsTouched(Boolean(remembered.typedInitials));\n setTypeKind(remembered.typeKind ?? \"signature\");\n setInkColor(remembered.inkColor ?? \"#111827\");\n const nextFont = HANDWRITING_FONTS.find((font) => font.id === remembered.fontId);\n if (nextFont) setFontId(nextFont.id);\n if (remembered.mode === \"draw\") {\n reusedSignatureRef.current = {\n imageDataUrl: remembered.imageDataUrl,\n width: remembered.width,\n height: remembered.height,\n };\n setHasReusedSignature(true);\n } else {\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n }\n }, [open, resolvedFieldType, rememberedByType, initialFieldValue]);\n\n useEffect(() => {\n if (!open || activeFieldType !== \"sign\") return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = 560;\n canvas.height = 200;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = inkColor;\n ctx.lineWidth = 2.5;\n lastPointRef.current = null;\n drawingRef.current = false;\n pathsRef.current = [];\n currentPathRef.current = [];\n\n if (mode !== \"draw\") return;\n\n const reused = reusedSignatureRef.current;\n if (!reused?.imageDataUrl) return;\n\n const img = new Image();\n img.onload = () => {\n const scale = Math.min(\n canvas.width / Math.max(1, reused.width),\n canvas.height / Math.max(1, reused.height),\n 1,\n );\n const w = reused.width * scale;\n const h = reused.height * scale;\n ctx.drawImage(img, (canvas.width - w) / 2, (canvas.height - h) / 2, w, h);\n };\n img.src = reused.imageDataUrl;\n }, [open, activeFieldType, mode]);\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n setFontsReady(false);\n ensureHandwritingFonts().then(() => {\n if (!cancelled) setFontsReady(true);\n });\n return () => {\n cancelled = true;\n };\n }, [open]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) return;\n ctx.strokeStyle = inkColor;\n ctx.fillStyle = inkColor;\n }, [inkColor]);\n\n useEffect(() => {\n if (!open || mode !== \"type\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n if (!previewText) return;\n\n const size = typedSignatureFontSize(typeKind, selectedFont.family);\n\n ctx.fillStyle = inkColor;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${size}px \"${selectedFont.family}\", cursive`;\n ctx.fillText(previewText, canvas.width / 2, canvas.height / 2);\n }, [\n previewText,\n typeKind,\n mode,\n inkColor,\n open,\n selectedFont,\n fontsReady,\n ]);\n\n if (!open) return null;\n\n const getPoint = (event: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n return {\n x: ((event.clientX - rect.left) / rect.width) * canvas.width,\n y: ((event.clientY - rect.top) / rect.height) * canvas.height,\n };\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (mode !== \"draw\") return;\n if (reusedSignatureRef.current) {\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.strokeStyle = inkColor;\n ctx.lineWidth = 2.5;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n }\n pathsRef.current = [];\n }\n event.currentTarget.setPointerCapture(event.pointerId);\n drawingRef.current = true;\n const pt = getPoint(event);\n lastPointRef.current = pt;\n currentPathRef.current = [pt];\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (!drawingRef.current || mode !== \"draw\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n const last = lastPointRef.current;\n if (!ctx || !last) return;\n\n const point = getPoint(event);\n ctx.beginPath();\n ctx.moveTo(last.x, last.y);\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n lastPointRef.current = point;\n currentPathRef.current.push(point);\n };\n\n const handlePointerUp = () => {\n if (currentPathRef.current.length > 1) {\n pathsRef.current.push([...currentPathRef.current]);\n }\n currentPathRef.current = [];\n drawingRef.current = false;\n lastPointRef.current = null;\n };\n\n const clearPad = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n pathsRef.current = [];\n currentPathRef.current = [];\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n setTypedName(\"\");\n setTypedInitials(\"\");\n setInitialsTouched(false);\n };\n\n const handleNameChange = (value: string) => {\n setTypedName(value);\n if (!initialsTouched) {\n setTypedInitials(deriveInitials(value));\n }\n };\n\n const trimAndSave = () => {\n if (mode === \"draw\") {\n const allPaths = pathsRef.current;\n const reused = reusedSignatureRef.current;\n if (allPaths.length === 0) {\n if (!reused) return;\n onRememberFill?.(\"sign\", {\n mode: \"draw\",\n imageDataUrl: reused.imageDataUrl,\n width: reused.width,\n height: reused.height,\n inkColor,\n });\n onSave(reused.imageDataUrl, reused.width, reused.height);\n return;\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const path of allPaths) {\n for (const pt of path) {\n if (pt.x < minX) minX = pt.x;\n if (pt.y < minY) minY = pt.y;\n if (pt.x > maxX) maxX = pt.x;\n if (pt.y > maxY) maxY = pt.y;\n }\n }\n\n const pad = 8;\n minX = Math.max(0, minX - pad);\n minY = Math.max(0, minY - pad);\n maxX += pad;\n maxY += pad;\n const w = maxX - minX;\n const h = maxY - minY;\n\n const pathData = allPaths\n .map((path) => {\n const pts = path.map((pt) => ({ x: pt.x - minX, y: pt.y - minY }));\n return \"M\" + pts.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(\"L\");\n })\n .join(\" \");\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w.toFixed(0)}\" height=\"${h.toFixed(0)}\" viewBox=\"0 0 ${w.toFixed(0)} ${h.toFixed(0)}\"><path d=\"${pathData}\" fill=\"none\" stroke=\"${inkColor}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n const dataUrl = `data:image/svg+xml;base64,${btoa(svg)}`;\n onRememberFill?.(\"sign\", {\n mode: \"draw\",\n imageDataUrl: dataUrl,\n width: w,\n height: h,\n inkColor,\n });\n onSave(dataUrl, w, h);\n return;\n }\n\n if (!previewText) return;\n\n const dpr = 3;\n const size = typedSignatureFontSize(typeKind, selectedFont.family);\n const measureCanvas = document.createElement(\"canvas\");\n const measureCtx = measureCanvas.getContext(\"2d\")!;\n measureCtx.font = `${size * dpr}px \"${selectedFont.family}\", cursive`;\n const metrics = measureCtx.measureText(previewText);\n const pad = 12 * dpr;\n const canvasW = Math.ceil(metrics.width) + pad * 2;\n const canvasH = size * dpr + pad * 2;\n\n const outCanvas = document.createElement(\"canvas\");\n outCanvas.width = canvasW;\n outCanvas.height = canvasH;\n const outCtx = outCanvas.getContext(\"2d\")!;\n outCtx.clearRect(0, 0, canvasW, canvasH);\n outCtx.font = `${size * dpr}px \"${selectedFont.family}\", cursive`;\n outCtx.fillStyle = inkColor;\n outCtx.textBaseline = \"middle\";\n outCtx.fillText(previewText, pad, canvasH / 2);\n\n const pngDataUrl = outCanvas.toDataURL(\"image/png\");\n const cssW = canvasW / dpr;\n const cssH = canvasH / dpr;\n\n // Match consumer format: SVG wrapper (base64) containing the PNG.\n const svg =\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\">` +\n `<image href=\"${pngDataUrl}\"/>` +\n `</svg>`;\n const dataUrl = `data:image/svg+xml;base64,${btoa(svg)}`;\n\n onRememberFill?.(\"sign\", {\n mode: \"type\",\n imageDataUrl: dataUrl,\n width: cssW,\n height: cssH,\n typedName,\n typedInitials,\n fontId,\n inkColor,\n typeKind,\n });\n onSave(dataUrl, cssW, cssH);\n };\n\n const handleFieldValueSave = () => {\n if (activeFieldType !== \"date\" && activeFieldType !== \"text\") return;\n const text =\n activeFieldType === \"date\" ? dateValue : textValue.trim();\n if (!text) return;\n\n onRememberFill?.(activeFieldType, { value: text });\n onSaveFieldValue?.(text, activeFieldType);\n };\n\n const showSignPad = activeFieldType === \"sign\";\n const modalTitle =\n activeFieldType === \"date\"\n ? \"Pick a date\"\n : activeFieldType === \"text\"\n ? \"Enter text\"\n : \"Create e-signature\";\n\n return (\n <div className=\"epochs-pdf-viewer__modal\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"epochs-pdf-viewer__modal-backdrop\" onClick={onClose} />\n <div className=\"epochs-pdf-viewer__modal-card\">\n <div className=\"epochs-pdf-viewer__modal-header\">\n <h3>{modalTitle}</h3>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={onClose}\n title=\"Close\"\n >\n ×\n </button>\n </div>\n\n {showFieldTypeTabs && !fieldType ? (\n <div className=\"epochs-pdf-viewer__field-type-tabs\" role=\"tablist\">\n {([\"sign\", \"date\", \"text\"] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeFieldType === t}\n className={\n activeFieldType === t\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setActiveFieldType(t)}\n >\n {t === \"sign\" ? \"Sign\" : t === \"date\" ? \"Date\" : \"Text\"}\n </button>\n ))}\n </div>\n ) : null}\n\n {showSignPad ? (\n <>\n <div className=\"epochs-pdf-viewer__sign-modes\">\n <button\n type=\"button\"\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => {\n setMode(\"draw\");\n clearPad();\n }}\n >\n Draw\n </button>\n <button\n type=\"button\"\n className={\n mode === \"type\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setMode(\"type\")}\n >\n Type\n </button>\n <label className=\"epochs-pdf-viewer__sign-ink\">\n Ink\n <input\n type=\"color\"\n value={inkColor}\n onChange={(e) => setInkColor(e.target.value)}\n />\n </label>\n </div>\n\n {mode === \"type\" ? (\n <>\n <div\n className=\"epochs-pdf-viewer__sign-fonts\"\n role=\"group\"\n aria-label=\"Handwriting style\"\n >\n {HANDWRITING_FONTS.map((font) => (\n <button\n key={font.id}\n type=\"button\"\n className={\n fontId === font.id\n ? \"epochs-pdf-viewer__sign-font epochs-pdf-viewer__sign-font--active\"\n : \"epochs-pdf-viewer__sign-font\"\n }\n style={{ fontFamily: `\"${font.family}\", cursive` }}\n onClick={() => setFontId(font.id)}\n title={font.label}\n >\n {fontPreviewLabel}\n </button>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__sign-type-fields\">\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Full name</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedName}\n onChange={(e) => handleNameChange(e.target.value)}\n onFocus={() => setTypeKind(\"signature\")}\n placeholder=\"Type your full name\"\n style={{ fontFamily: `\"${selectedFont.family}\", cursive` }}\n autoFocus\n />\n </label>\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Initials</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedInitials}\n onChange={(e) => {\n setInitialsTouched(true);\n setTypedInitials(e.target.value.toUpperCase());\n }}\n onFocus={() => setTypeKind(\"initials\")}\n placeholder=\"e.g. JD\"\n maxLength={4}\n style={{ fontFamily: `\"${selectedFont.family}\", cursive` }}\n />\n </label>\n </div>\n\n <div\n className=\"epochs-pdf-viewer__sign-type-kind\"\n role=\"group\"\n aria-label=\"Preview type\"\n >\n <button\n type=\"button\"\n className={\n typeKind === \"signature\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"signature\")}\n >\n Use full name\n </button>\n <button\n type=\"button\"\n className={\n typeKind === \"initials\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"initials\")}\n >\n Use initials\n </button>\n </div>\n </>\n ) : (\n <p className=\"epochs-pdf-viewer__sign-hint\">\n {hasReusedSignature\n ? \"Previous signature loaded — submit to reuse, or draw a new one\"\n : \"Draw your signature below\"}\n </p>\n )}\n\n <canvas\n ref={canvasRef}\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__sign-canvas\"\n : \"epochs-pdf-viewer__sign-canvas epochs-pdf-viewer__sign-canvas--preview\"\n }\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n />\n </>\n ) : activeFieldType === \"date\" ? (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Date</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"date\"\n value={dateValue}\n onChange={(e) => setDateValue(e.target.value)}\n autoFocus\n />\n </label>\n ) : (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Text</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n placeholder={textPlaceholder ?? \"Enter text\"}\n autoFocus\n />\n </label>\n )}\n\n <div className=\"epochs-pdf-viewer__modal-actions\">\n {showSignPad ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={clearPad}\n >\n Clear\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={showSignPad ? trimAndSave : handleFieldValueSave}\n disabled={\n activeFieldType === \"date\" ? !dateValue\n : activeFieldType === \"text\" ? !textValue.trim()\n : false\n }\n >\n {showSignPad ? \"Use signature\" : \"Place on page\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction deriveInitials(name: string): string {\n const parts = name\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return parts\n .slice(0, 3)\n .map((part) => part[0]?.toUpperCase() ?? \"\")\n .join(\"\");\n}\n\n","/** Brand key used to identify toolbar tool components. */\nexport const TOOLBAR_TOOL_ID = \"__epochsToolbarToolId\" as const;\n\nexport type ToolbarToolId =\n | \"thumbnail\"\n | \"navigation\"\n | \"zoom\"\n | \"rotate\"\n | \"reload\"\n | \"print\"\n | \"open\"\n | \"download\"\n | \"highlight\"\n | \"underline\"\n | \"signature\"\n | \"text\"\n | \"erase\"\n | \"clear\";\n\nexport type ToolbarToolComponent = {\n (props?: Record<string, never>): null;\n displayName: string;\n readonly [TOOLBAR_TOOL_ID]: ToolbarToolId;\n};\n\nfunction createToolbarTool(\n id: ToolbarToolId,\n displayName: string,\n): ToolbarToolComponent {\n const Tool = (() => null) as ToolbarToolComponent;\n Tool.displayName = displayName;\n Object.defineProperty(Tool, TOOLBAR_TOOL_ID, {\n value: id,\n enumerable: true,\n });\n return Tool;\n}\n\nexport function getToolbarToolId(\n tool: ToolbarToolComponent,\n): ToolbarToolId {\n return tool[TOOLBAR_TOOL_ID];\n}\n\nexport function isToolbarTool(\n value: unknown,\n): value is ToolbarToolComponent {\n return (\n typeof value === \"function\" &&\n TOOLBAR_TOOL_ID in value &&\n typeof (value as ToolbarToolComponent)[TOOLBAR_TOOL_ID] === \"string\"\n );\n}\n\n/** Toggle thumbnails sidebar. */\nexport const Thumbnail = createToolbarTool(\"thumbnail\", \"Thumbnail\");\n/** Previous / next page and page number. */\nexport const Navigation = createToolbarTool(\"navigation\", \"Navigation\");\n/** Zoom out, zoom %, zoom in, and fit width. */\nexport const Zoom = createToolbarTool(\"zoom\", \"Zoom\");\n/** Rotate pages. */\nexport const Rotate = createToolbarTool(\"rotate\", \"Rotate\");\n/** Reload the PDF. */\nexport const Reload = createToolbarTool(\"reload\", \"Reload\");\n/** Print (includes markup). */\nexport const Print = createToolbarTool(\"print\", \"Print\");\n/** Open PDF in a new tab. */\nexport const Open = createToolbarTool(\"open\", \"Open\");\n/** Download PDF (with markup when present). */\nexport const Download = createToolbarTool(\"download\", \"Download\");\n/** Highlight text markup tool. */\nexport const Highlight = createToolbarTool(\"highlight\", \"Highlight\");\n/** Underline text markup tool. */\nexport const Underline = createToolbarTool(\"underline\", \"Underline\");\n/** E-signature tool. */\nexport const Signature = createToolbarTool(\"signature\", \"Signature\");\n/** Add / edit free text on the page. */\nexport const AddText = createToolbarTool(\"text\", \"AddText\");\n/** Erase markup annotations. */\nexport const Erase = createToolbarTool(\"erase\", \"Erase\");\n/** Clear all markup. */\nexport const Clear = createToolbarTool(\"clear\", \"Clear\");\n\nexport const ALL_TOOLBAR_TOOLS = [\n Thumbnail,\n Navigation,\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n] as const;\n\n/** Default left / right toolbar layout. */\nexport const DEFAULT_TOOLBAR_LAYOUT: [\n ToolbarToolComponent[],\n ToolbarToolComponent[],\n] = [\n [Thumbnail, Navigation],\n [\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n ],\n];\n","import type { ReactNode } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n EraserIcon,\n ExternalLinkIcon,\n GridIcon,\n HighlightIcon,\n MinusIcon,\n PlusIcon,\n PrinterIcon,\n RefreshIcon,\n RotateIcon,\n SignatureIcon,\n TextIcon,\n UnderlineIcon,\n} from \"./icons\";\nimport type { MarkupTool } from \"./markup\";\nimport {\n HIGHLIGHT_PRESETS,\n UNDERLINE_PRESETS,\n normalizeHex,\n} from \"./markup\";\nimport type { ToolbarToolId } from \"./toolbarTools\";\n\nexport type ToolbarRenderContext = {\n status: string;\n showThumbnails: boolean;\n setShowThumbnails: (updater: (v: boolean) => boolean) => void;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n pageNumber: number;\n numPages: number;\n scrollToPage: (page: number) => void;\n scale: number;\n handleZoomOut: () => void;\n handleZoomIn: () => void;\n handleFitWidth: () => void | Promise<void>;\n handleRotate: () => void;\n markupTool: MarkupTool;\n toggleMarkupTool: (tool: Exclude<MarkupTool, \"none\">) => void;\n hasFixedSignatureFields: boolean;\n hasFixedTextFields: boolean;\n pendingSignature: { imageDataUrl: string; width: number; height: number } | null;\n setMarkupTool: (tool: MarkupTool) => void;\n setSignaturePadOpen: (open: boolean) => void;\n annotationsLength: number;\n signaturesLength: number;\n textsLength: number;\n handleClearAnnotations: () => void;\n highlightHex: string;\n underlineHex: string;\n setHighlightHex: (hex: string) => void;\n setUnderlineHex: (hex: string) => void;\n loadDocument: () => void | Promise<void>;\n handlePrint: () => void | Promise<void>;\n isPrinting: boolean;\n pdfDoc: unknown;\n displayUrl: string | null;\n resolvedUrl: string;\n handleDownload: () => void | Promise<void>;\n isDownloading: boolean;\n};\n\nconst MARKUP_TOOLS: ToolbarToolId[] = [\n \"highlight\",\n \"underline\",\n \"signature\",\n \"text\",\n \"erase\",\n \"clear\",\n];\n\nexport function isMarkupToolbarTool(id: ToolbarToolId): boolean {\n return MARKUP_TOOLS.includes(id);\n}\n\nexport function renderToolbarTool(\n id: ToolbarToolId,\n ctx: ToolbarRenderContext,\n options?: { showMarkupSep?: boolean },\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (options?.showMarkupSep) {\n nodes.push(\n <span\n key={`${id}-sep`}\n className=\"epochs-pdf-viewer__toolbar-sep\"\n aria-hidden=\"true\"\n />,\n );\n }\n\n switch (id) {\n case \"thumbnail\":\n nodes.push(\n <button\n key=\"thumbnail\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => ctx.setShowThumbnails((v) => !v)}\n title={ctx.showThumbnails ? \"Hide thumbnails\" : \"Show thumbnails\"}\n >\n <GridIcon />\n </button>,\n );\n break;\n\n case \"navigation\":\n nodes.push(\n <button\n key=\"nav-prev\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handlePrev}\n disabled={!ctx.canGoPrev || ctx.status !== \"ready\"}\n title=\"Previous page\"\n >\n <ChevronLeftIcon />\n </button>,\n <div key=\"nav-page\" className=\"epochs-pdf-viewer__page-input\">\n <input\n type=\"number\"\n value={ctx.pageNumber}\n min={1}\n max={ctx.numPages || 1}\n onChange={(e) => {\n const next = Number.parseInt(e.target.value, 10);\n if (!Number.isFinite(next)) return;\n ctx.scrollToPage(\n Math.max(1, Math.min(ctx.numPages || 1, next)),\n );\n }}\n disabled={ctx.status !== \"ready\"}\n aria-label=\"Page number\"\n />\n <span>/ {ctx.numPages || \"-\"}</span>\n </div>,\n <button\n key=\"nav-next\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleNext}\n disabled={!ctx.canGoNext || ctx.status !== \"ready\"}\n title=\"Next page\"\n >\n <ChevronRightIcon />\n </button>,\n );\n break;\n\n case \"zoom\":\n nodes.push(\n <button\n key=\"zoom-out\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomOut}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom out\"\n >\n <MinusIcon />\n </button>,\n <span key=\"zoom-label\" className=\"epochs-pdf-viewer__zoom-label\">\n {Math.round(ctx.scale * 100)}%\n </span>,\n <button\n key=\"zoom-in\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomIn}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom in\"\n >\n <PlusIcon />\n </button>,\n <button\n key=\"zoom-fit\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={() => void ctx.handleFitWidth()}\n disabled={ctx.status !== \"ready\"}\n title=\"Fit to width\"\n >\n Fit\n </button>,\n );\n break;\n\n case \"rotate\":\n nodes.push(\n <button\n key=\"rotate\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleRotate}\n disabled={ctx.status !== \"ready\"}\n title=\"Rotate\"\n >\n <RotateIcon />\n </button>,\n );\n break;\n\n case \"highlight\":\n nodes.push(\n <button\n key=\"highlight\"\n type=\"button\"\n className={\n ctx.markupTool === \"highlight\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"highlight\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Highlight text — select text to highlight\"\n >\n <HighlightIcon />\n </button>,\n );\n break;\n\n case \"underline\":\n nodes.push(\n <button\n key=\"underline\"\n type=\"button\"\n className={\n ctx.markupTool === \"underline\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"underline\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Underline text — select text to underline\"\n >\n <UnderlineIcon />\n </button>,\n );\n break;\n\n case \"signature\":\n nodes.push(\n <button\n key=\"signature\"\n type=\"button\"\n className={\n ctx.markupTool === \"sign\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => {\n if (\n !ctx.hasFixedSignatureFields &&\n ctx.pendingSignature &&\n ctx.markupTool !== \"sign\"\n ) {\n ctx.setMarkupTool(\"sign\");\n return;\n }\n ctx.setSignaturePadOpen(true);\n }}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedSignatureFields\n ? \"Create e-signature for a fixed field\"\n : ctx.pendingSignature\n ? \"Place signature — click on the page, then drag to move\"\n : \"Create e-signature\"\n }\n >\n <SignatureIcon />\n </button>,\n );\n break;\n\n case \"text\":\n nodes.push(\n <button\n key=\"text\"\n type=\"button\"\n className={\n ctx.markupTool === \"text\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"text\")}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedTextFields\n ? \"Edit text in predefined areas — click to type\"\n : \"Edit PDF text — select words, then change them\"\n }\n >\n <TextIcon />\n </button>,\n );\n break;\n\n case \"erase\":\n nodes.push(\n <button\n key=\"erase\"\n type=\"button\"\n className={\n ctx.markupTool === \"erase\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"erase\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Remove text — select PDF words to cover them, or click added markup\"\n >\n <EraserIcon />\n </button>,\n );\n break;\n\n case \"clear\":\n nodes.push(\n <button\n key=\"clear\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={ctx.handleClearAnnotations}\n disabled={\n ctx.status !== \"ready\" ||\n (ctx.annotationsLength === 0 &&\n ctx.signaturesLength === 0 &&\n ctx.textsLength === 0)\n }\n title=\"Clear all markup\"\n >\n Clear\n </button>,\n );\n break;\n\n case \"reload\":\n nodes.push(\n <button\n key=\"reload\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.loadDocument()}\n title=\"Reload\"\n >\n <RefreshIcon />\n </button>,\n );\n break;\n\n case \"print\":\n nodes.push(\n <button\n key=\"print\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handlePrint()}\n disabled={ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isPrinting}\n title={\n ctx.isPrinting\n ? \"Preparing print…\"\n : \"Print (includes highlights & underlines)\"\n }\n >\n <PrinterIcon />\n </button>,\n );\n break;\n\n case \"open\":\n nodes.push(\n <a\n key=\"open\"\n className=\"epochs-pdf-viewer__btn\"\n href={ctx.displayUrl || ctx.resolvedUrl || undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"Open in new tab\"\n >\n <ExternalLinkIcon />\n </a>,\n );\n break;\n\n case \"download\":\n nodes.push(\n <button\n key=\"download\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handleDownload()}\n disabled={\n ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isDownloading\n }\n title={\n ctx.isDownloading\n ? \"Preparing download…\"\n : ctx.annotationsLength > 0 ||\n ctx.signaturesLength > 0 ||\n ctx.textsLength > 0\n ? \"Download PDF with markup\"\n : \"Download PDF\"\n }\n >\n <DownloadIcon />\n </button>,\n );\n break;\n\n default:\n break;\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n\nexport function renderMarkupExtras(\n ctx: ToolbarRenderContext,\n enabledIds: Set<ToolbarToolId>,\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (\n ctx.markupTool === \"sign\" &&\n ctx.pendingSignature &&\n !ctx.hasFixedSignatureFields &&\n enabledIds.has(\"signature\")\n ) {\n nodes.push(\n <span key=\"sign-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Click page to place duplicate/new signature\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"text\" &&\n enabledIds.has(\"text\")\n ) {\n nodes.push(\n <span key=\"text-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n {ctx.hasFixedTextFields\n ? \"Click in a predefined text area to type\"\n : \"Select text to edit it — e.g. change this PDF to this is PDF\"}\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"erase\" &&\n enabledIds.has(\"erase\")\n ) {\n nodes.push(\n <span key=\"erase-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Select PDF words to remove · click added text/markup to erase\n </span>,\n );\n }\n\n if (\n (ctx.markupTool === \"highlight\" && enabledIds.has(\"highlight\")) ||\n (ctx.markupTool === \"underline\" && enabledIds.has(\"underline\"))\n ) {\n const activeMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.highlightHex : ctx.underlineHex;\n const setActiveMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.setHighlightHex : ctx.setUnderlineHex;\n const activePresets =\n ctx.markupTool === \"highlight\" ? HIGHLIGHT_PRESETS : UNDERLINE_PRESETS;\n\n nodes.push(\n <div\n key=\"color-picker\"\n className=\"epochs-pdf-viewer__color-picker\"\n role=\"group\"\n aria-label={`${ctx.markupTool} color`}\n >\n {activePresets.map((preset) => (\n <button\n key={preset.id}\n type=\"button\"\n className={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n ? \"epochs-pdf-viewer__swatch epochs-pdf-viewer__swatch--active\"\n : \"epochs-pdf-viewer__swatch\"\n }\n style={{ background: preset.hex }}\n title={preset.label}\n aria-label={preset.label}\n aria-pressed={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n }\n onClick={() => setActiveMarkupHex(normalizeHex(preset.hex))}\n />\n ))}\n <label\n className=\"epochs-pdf-viewer__custom-color\"\n title=\"Custom color\"\n >\n <span\n className=\"epochs-pdf-viewer__custom-color-chip\"\n style={{ background: activeMarkupHex }}\n />\n <input\n type=\"color\"\n value={normalizeHex(activeMarkupHex)}\n onChange={(e) =>\n setActiveMarkupHex(normalizeHex(e.target.value))\n }\n aria-label=\"Custom color\"\n />\n </label>\n </div>,\n );\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport { PageCanvas } from \"./PageCanvas\";\nimport { Thumbnail as ThumbnailStrip } from \"./Thumbnail\";\nimport {\n ensurePdfWorker,\n pdfjsLib,\n resolvePdfUrl,\n sourceToArrayBuffer,\n} from \"./load\";\nimport type { PdfDoc, PdfViewerProps, ToolbarLayout, ViewerStatus } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport {\n DEFAULT_HIGHLIGHT_HEX,\n DEFAULT_UNDERLINE_HEX,\n hexToMarkupColor,\n} from \"./markup\";\nimport {\n buildPdfFromJpegPages,\n renderAllPagesWithMarkup,\n triggerBlobDownload,\n} from \"./exportPages\";\nimport { SignaturePad } from \"./SignaturePad\";\nimport type { RememberedFieldFills, RememberedSignFill } from \"./SignaturePad\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId, signatureDisplaySize } from \"./signature\";\nimport { pageSizeFromSurface, viewportRectToPage } from \"./coords\";\nimport type { TextAnnotation } from \"./text\";\nimport {\n createTextId,\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n} from \"./text\";\nimport {\n DEFAULT_TOOLBAR_LAYOUT,\n getToolbarToolId,\n isToolbarTool,\n type ToolbarToolComponent,\n type ToolbarToolId,\n} from \"./toolbarTools\";\nimport {\n isMarkupToolbarTool,\n renderMarkupExtras,\n renderToolbarTool,\n type ToolbarRenderContext,\n} from \"./ToolbarButtons\";\nimport \"./PdfViewer.css\";\n\nfunction resolveToolbarLayout(\n enableToolbar: boolean | ToolbarLayout | undefined,\n flags: {\n enableThumbnails?: boolean;\n enableNavigation: boolean;\n enableZoom: boolean;\n enableRotate: boolean;\n enableReload: boolean;\n enablePrint: boolean;\n enableOpen: boolean;\n enableDownload: boolean;\n enableHighlight: boolean;\n enableUnderline: boolean;\n enableSignature: boolean;\n enableText: boolean;\n enableErase: boolean;\n enableClear: boolean;\n },\n): { left: ToolbarToolId[]; right: ToolbarToolId[] } | null {\n if (!enableToolbar) return null;\n\n if (Array.isArray(enableToolbar)) {\n const toIds = (side: ToolbarToolComponent[] | undefined) =>\n (side ?? [])\n .filter(isToolbarTool)\n .map(getToolbarToolId);\n\n return {\n left: toIds(enableToolbar[0]),\n right: toIds(enableToolbar[1]),\n };\n }\n\n const showThumbnailsToggle = flags.enableThumbnails;\n const filterByFlag = (\n tools: readonly ToolbarToolComponent[],\n enabled: Partial<Record<ToolbarToolId, boolean>>,\n ) =>\n tools\n .map(getToolbarToolId)\n .filter((id) => enabled[id] !== false);\n\n const flagMap: Partial<Record<ToolbarToolId, boolean>> = {\n thumbnail: showThumbnailsToggle,\n navigation: flags.enableNavigation,\n zoom: flags.enableZoom,\n rotate: flags.enableRotate,\n reload: flags.enableReload,\n print: flags.enablePrint,\n open: flags.enableOpen,\n download: flags.enableDownload,\n highlight: flags.enableHighlight,\n underline: flags.enableUnderline,\n signature: flags.enableSignature,\n text: flags.enableText,\n erase: flags.enableErase,\n clear: flags.enableClear,\n };\n\n return {\n left: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[0], flagMap),\n right: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[1], flagMap),\n };\n}\n\nexport function PdfViewer({\n file,\n fileUrl,\n baseUrl = \"\",\n fetchOptions,\n height = \"80vh\",\n title = \"PDF document\",\n initialScale = 1,\n withThumbnails = false,\n thumbnailWidth = 140,\n maxThumbnails = 60,\n className,\n workerSrc,\n enableToolbar = false,\n enableThumbnails,\n enableNavigation = true,\n enableZoom = true,\n enableRotate = true,\n enableReload = true,\n enablePrint = true,\n enableOpen = true,\n enableDownload = true,\n enableMarkup = true,\n enableHighlight = true,\n enableUnderline = true,\n enableSignature = true,\n enableText = true,\n enableErase = true,\n enableClear = true,\n signatureFields: signatureFieldsProp = [],\n textFields = [],\n onSignatureComplete,\n onSignatureFieldsChange,\n applySignatureToSameTag = false,\n onFieldValueComplete,\n openSignaturePad: externalOpenSignaturePad = false,\n onSignaturePadClose,\n onSubmit,\n submitLabel = \"Submit\",\n submitLoading = false,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const lastBlobUrlRef = useRef<string | null>(null);\n const pageRefsRef = useRef(new Map<number, HTMLDivElement | null>());\n const isProgrammaticScrollRef = useRef(false);\n\n const binarySource = useMemo(() => {\n if (file && typeof file !== \"string\") return file;\n return null;\n }, [file]);\n\n const resolvedUrl = useMemo(() => {\n if (binarySource) return \"\";\n const asString =\n typeof file === \"string\" ? file : undefined;\n return resolvePdfUrl(asString, fileUrl, baseUrl);\n }, [binarySource, file, fileUrl, baseUrl]);\n\n const [status, setStatus] = useState<ViewerStatus>(\"idle\");\n const [pdfDoc, setPdfDoc] = useState<PdfDoc | null>(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [scale, setScale] = useState(initialScale);\n const [rotation, setRotation] = useState(0);\n const [displayUrl, setDisplayUrl] = useState<string | null>(null);\n const [showThumbnails, setShowThumbnails] = useState(false);\n const [isPrinting, setIsPrinting] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const [markupTool, setMarkupTool] = useState<MarkupTool>(\"none\");\n const [annotations, setAnnotations] = useState<MarkupAnnotation[]>([]);\n const [signatures, setSignatures] = useState<SignatureAnnotation[]>([]);\n const [texts, setTexts] = useState<TextAnnotation[]>([]);\n const [signaturePadOpen, setSignaturePadOpen] = useState(false);\n const [signaturePadFieldType, setSignaturePadFieldType] = useState<\n import(\"./signature\").SignatureFieldType | undefined\n >(undefined);\n const [rememberedByType, setRememberedByType] = useState<RememberedFieldFills>({});\n const [pendingSignature, setPendingSignature] = useState<{\n imageDataUrl: string;\n width: number;\n height: number;\n } | null>(null);\n const [selectedSignatureId, setSelectedSignatureId] = useState<string | null>(\n null,\n );\n const [selectedSignatureFieldId, setSelectedSignatureFieldId] = useState<string | null>(\n null,\n );\n const [editingSignatureId, setEditingSignatureId] = useState<string | null>(null);\n const [selectedTextId, setSelectedTextId] = useState<string | null>(null);\n const [selectedTextFieldId, setSelectedTextFieldId] = useState<string | null>(null);\n const [editingTextId, setEditingTextId] = useState<string | null>(null);\n const [highlightHex, setHighlightHex] = useState(DEFAULT_HIGHLIGHT_HEX);\n const [underlineHex, setUnderlineHex] = useState(DEFAULT_UNDERLINE_HEX);\n const hasFixedTextFields = textFields.length > 0;\n const [fieldValues, setFieldValues] = useState<Record<string, string>>({});\n const [signatureFields, setSignatureFields] =\n useState<SignatureField[]>(signatureFieldsProp);\n const signatureFieldsRef = useRef(signatureFields);\n signatureFieldsRef.current = signatureFields;\n\n useEffect(() => {\n signatureFieldsRef.current = signatureFieldsProp;\n setSignatureFields(signatureFieldsProp);\n setFieldValues((prev) => {\n const next = { ...prev };\n for (const field of signatureFieldsProp) {\n const fieldType = field.type ?? \"sign\";\n if (\n (fieldType === \"date\" || fieldType === \"text\") &&\n field.value != null &&\n field.value !== \"\"\n ) {\n next[field.id] = field.value;\n }\n }\n return next;\n });\n }, [signatureFieldsProp]);\n\n const hasFixedSignatureFields = signatureFields.length > 0;\n\n const isSignatureFieldFilled = useCallback(\n (\n field: SignatureField,\n sigs: SignatureAnnotation[],\n values: Record<string, string>,\n ) => {\n const fieldType = field.type ?? \"sign\";\n if (fieldType === \"date\" || fieldType === \"text\") {\n return Boolean((values[field.id] ?? field.value)?.trim());\n }\n return (\n sigs.some((sig) => sig.fieldId === field.id) ||\n Boolean(field.signatureDataUrl)\n );\n },\n [],\n );\n\n const writeFieldValueToFields = useCallback(\n (fieldIds: string[], value: string) => {\n const idSet = new Set(fieldIds);\n const prev = signatureFieldsRef.current;\n const next = prev.map((field) =>\n idSet.has(field.id) ? { ...field, value } : field,\n );\n signatureFieldsRef.current = next;\n setSignatureFields(next);\n onSignatureFieldsChange?.(next);\n\n setFieldValues((prevValues) => {\n const updated = { ...prevValues };\n for (const id of fieldIds) updated[id] = value;\n return updated;\n });\n\n for (const id of fieldIds) {\n onFieldValueComplete?.(id, value);\n }\n },\n [onFieldValueComplete, onSignatureFieldsChange],\n );\n\n const writeSignatureImageToFields = useCallback(\n (\n fieldIds: string | string[] | undefined,\n signature: SignatureAnnotation,\n signaturesByFieldId?: Map<string, SignatureAnnotation>,\n ) => {\n const prev = signatureFieldsRef.current;\n const ids = fieldIds == null ? null : Array.isArray(fieldIds) ? fieldIds : [fieldIds];\n const idSet = ids ? new Set(ids) : null;\n\n const next: SignatureField[] = idSet\n ? prev.map((field) =>\n idSet.has(field.id)\n ? { ...field, signatureDataUrl: signature.imageDataUrl }\n : field,\n )\n : [\n ...prev,\n {\n id: signature.id,\n pageNumber: signature.pageNumber,\n x: signature.x,\n y: signature.y,\n width: signature.width,\n height: signature.height,\n type: \"sign\",\n signatureDataUrl: signature.imageDataUrl,\n },\n ];\n signatureFieldsRef.current = next;\n setSignatureFields(next);\n onSignatureFieldsChange?.(next);\n\n if (!ids || ids.length === 0) {\n onSignatureComplete?.(undefined, signature);\n return;\n }\n for (const id of ids) {\n onSignatureComplete?.(\n id,\n signaturesByFieldId?.get(id) ?? signature,\n );\n }\n },\n [onSignatureComplete, onSignatureFieldsChange],\n );\n\n useEffect(() => {\n if (externalOpenSignaturePad) {\n setSignaturePadOpen(true);\n }\n }, [externalOpenSignaturePad]);\n\n const toolbarSides = useMemo(\n () =>\n resolveToolbarLayout(enableToolbar, {\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n }),\n [\n enableToolbar,\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n ],\n );\n\n const enabledToolIds = useMemo(() => {\n if (!toolbarSides) return new Set<ToolbarToolId>();\n return new Set([...toolbarSides.left, ...toolbarSides.right]);\n }, [toolbarSides]);\n\n useEffect(() => {\n const hasThumbTool = enabledToolIds.has(\"thumbnail\");\n if (!hasThumbTool) {\n setShowThumbnails(false);\n return;\n }\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const apply = () => {\n // Mobile: hide thumbnails by default. Desktop: respect withThumbnails.\n setShowThumbnails(mq.matches ? false : withThumbnails);\n };\n apply();\n mq.addEventListener(\"change\", apply);\n return () => mq.removeEventListener(\"change\", apply);\n }, [enabledToolIds, withThumbnails]);\n\n const showHighlight =\n !hasFixedSignatureFields && enabledToolIds.has(\"highlight\");\n const showUnderline =\n !hasFixedSignatureFields && enabledToolIds.has(\"underline\");\n const showSignature =\n enabledToolIds.has(\"signature\") || hasFixedSignatureFields;\n const showText = enabledToolIds.has(\"text\") || hasFixedTextFields;\n const showErase = !hasFixedSignatureFields && enabledToolIds.has(\"erase\");\n\n const revokeDisplayUrl = useCallback(() => {\n if (lastBlobUrlRef.current) {\n URL.revokeObjectURL(lastBlobUrlRef.current);\n lastBlobUrlRef.current = null;\n }\n }, []);\n\n const loadDocument = useCallback(async () => {\n if (!binarySource && !resolvedUrl) return;\n\n ensurePdfWorker(workerSrc);\n setStatus(\"loading\");\n setPdfDoc(null);\n setNumPages(0);\n setPageNumber(1);\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setPendingSignature(null);\n setSelectedSignatureId(null);\n setSelectedSignatureFieldId(null);\n setEditingSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n setMarkupTool(\"none\");\n\n try {\n const buffer = binarySource\n ? await sourceToArrayBuffer(binarySource, fetchOptions)\n : await sourceToArrayBuffer(resolvedUrl, fetchOptions);\n\n const blob = new Blob([buffer], { type: \"application/pdf\" });\n const blobUrl = URL.createObjectURL(blob);\n revokeDisplayUrl();\n lastBlobUrlRef.current = blobUrl;\n setDisplayUrl(blobUrl);\n\n const loadingTask = pdfjsLib.getDocument({\n data: buffer,\n cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/cmaps/`,\n cMapPacked: true,\n standardFontDataUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/standard_fonts/`,\n });\n const doc = await loadingTask.promise;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setStatus(\"ready\");\n } catch {\n setStatus(\"error\");\n }\n }, [\n binarySource,\n resolvedUrl,\n fetchOptions,\n revokeDisplayUrl,\n workerSrc,\n ]);\n\n useEffect(() => {\n if (!binarySource && !resolvedUrl) {\n setStatus(\"idle\");\n setPdfDoc(null);\n setNumPages(0);\n setDisplayUrl(null);\n revokeDisplayUrl();\n return;\n }\n\n void loadDocument();\n\n return () => {\n revokeDisplayUrl();\n };\n }, [binarySource, resolvedUrl, loadDocument, revokeDisplayUrl]);\n\n useEffect(() => {\n if (markupTool === \"highlight\" && !showHighlight) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"underline\" && !showUnderline) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"sign\" && !showSignature) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"text\" && !showText) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"erase\" && !showErase) {\n setMarkupTool(\"none\");\n }\n }, [showHighlight, showUnderline, showSignature, showText, showErase, markupTool]);\n\n const scrollToPage = useCallback(\n (targetPage: number) => {\n const clamped = Math.max(1, Math.min(numPages || 1, targetPage));\n const el = pageRefsRef.current.get(clamped);\n if (!el) {\n setPageNumber(clamped);\n return;\n }\n\n isProgrammaticScrollRef.current = true;\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n setPageNumber(clamped);\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n },\n [numPages],\n );\n\n const scrollToSignatureField = useCallback(\n (field: SignatureField) => {\n const pageEl = pageRefsRef.current.get(field.pageNumber);\n if (pageEl) {\n isProgrammaticScrollRef.current = true;\n setPageNumber(field.pageNumber);\n }\n\n const focusField = () => {\n const fieldEl = containerRef.current?.querySelector(\n `[data-signature-field-id=\"${CSS.escape(field.id)}\"]`,\n ) as HTMLElement | null;\n\n if (fieldEl) {\n fieldEl.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n } else if (pageEl) {\n pageEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n };\n\n window.requestAnimationFrame(() => {\n window.setTimeout(focusField, 40);\n });\n },\n [],\n );\n\n useEffect(() => {\n if (status !== \"ready\" || !containerRef.current || !numPages) return;\n\n const container = containerRef.current;\n const observer = new IntersectionObserver(\n (entries) => {\n if (isProgrammaticScrollRef.current) return;\n\n let best: { page: number; ratio: number } | null = null;\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n const page = Number.parseInt(\n (e.target as HTMLElement).dataset.pageNumber || \"0\",\n 10,\n );\n if (!page) continue;\n if (!best || e.intersectionRatio > best.ratio) {\n best = { page, ratio: e.intersectionRatio };\n }\n }\n if (best) setPageNumber(best.page);\n },\n {\n root: container,\n threshold: [0.25, 0.5, 0.75],\n },\n );\n\n for (let p = 1; p <= numPages; p += 1) {\n const el = pageRefsRef.current.get(p);\n if (el) observer.observe(el);\n }\n\n return () => observer.disconnect();\n }, [status, numPages]);\n\n const canGoPrev = pageNumber > 1;\n const canGoNext = numPages ? pageNumber < numPages : false;\n\n const handlePrev = useCallback(() => {\n if (!canGoPrev) return;\n scrollToPage(pageNumber - 1);\n }, [canGoPrev, pageNumber, scrollToPage]);\n\n const handleNext = useCallback(() => {\n if (!canGoNext) return;\n scrollToPage(pageNumber + 1);\n }, [canGoNext, pageNumber, scrollToPage]);\n\n const handleRotate = useCallback(() => {\n setRotation((r) => (r + 90) % 360);\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((s) => Math.max(0.25, Math.round((s - 0.1) * 100) / 100));\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setScale((s) => Math.min(5, Math.round((s + 0.1) * 100) / 100));\n }, []);\n\n const handleFitWidth = useCallback(async () => {\n if (!pdfDoc || !containerRef.current) return;\n try {\n const page = await pdfDoc.getPage(pageNumber);\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n // Body already excludes the thumbnail rail; subtract page padding only.\n const isMobile = window.matchMedia(\"(max-width: 720px)\").matches;\n const pagePadding = isMobile ? 16 : 24;\n const containerWidth = Math.max(\n 0,\n containerRef.current.clientWidth - pagePadding,\n );\n const nextScale = containerWidth / viewportAt1.width;\n setScale(Math.max(0.25, Math.min(5, Math.round(nextScale * 100) / 100)));\n } catch {\n // ignore\n }\n }, [pdfDoc, pageNumber, rotation]);\n\n // On mobile, auto-fit so fixed-field coordinates/dimensions stay aligned.\n useEffect(() => {\n if (status !== \"ready\" || !pdfDoc) return;\n if (!window.matchMedia(\"(max-width: 720px)\").matches) return;\n\n let cancelled = false;\n const run = () => {\n if (!cancelled) void handleFitWidth();\n };\n run();\n\n const container = containerRef.current;\n const observer =\n typeof ResizeObserver !== \"undefined\" && container\n ? new ResizeObserver(() => run())\n : null;\n observer?.observe(container!);\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const onMq = () => {\n if (mq.matches) run();\n };\n mq.addEventListener(\"change\", onMq);\n\n return () => {\n cancelled = true;\n observer?.disconnect();\n mq.removeEventListener(\"change\", onMq);\n };\n }, [status, pdfDoc, showThumbnails, rotation, handleFitWidth]);\n\n const fieldValueTexts = useMemo((): TextAnnotation[] => {\n return signatureFields.flatMap((field) => {\n const fieldType = field.type ?? \"sign\";\n if (fieldType !== \"date\" && fieldType !== \"text\") return [];\n const value = (fieldValues[field.id] ?? field.value ?? \"\").trim();\n if (!value) return [];\n const fontSize = Math.max(\n 10,\n Math.min(DEFAULT_TEXT_FONT_SIZE, field.height * 0.55),\n );\n return [\n {\n id: `fv_${field.id}`,\n pageNumber: field.pageNumber,\n fieldId: field.id,\n x: field.x + 4,\n y: field.y + Math.max(2, (field.height - fontSize) / 2),\n width: Math.max(12, field.width - 8),\n height: Math.max(fontSize * 1.2, field.height - 4),\n value,\n fontSize,\n color: DEFAULT_TEXT_COLOR,\n },\n ];\n });\n }, [signatureFields, fieldValues]);\n\n const textsForExport = useMemo(\n () => [...texts, ...fieldValueTexts],\n [texts, fieldValueTexts],\n );\n\n const handlePrint = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n setIsPrinting(true);\n try {\n // Render in the main document — pdf.js fonts break on iframe canvases.\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 1.5,\n rotation,\n annotations,\n signatures,\n texts: textsForExport,\n mimeType: \"image/png\",\n });\n\n const iframe = document.createElement(\"iframe\");\n iframe.style.position = \"fixed\";\n iframe.style.right = \"0\";\n iframe.style.bottom = \"0\";\n iframe.style.width = \"0\";\n iframe.style.height = \"0\";\n iframe.style.border = \"0\";\n iframe.setAttribute(\"aria-hidden\", \"true\");\n document.body.appendChild(iframe);\n\n const doc = iframe.contentWindow?.document;\n if (!doc) throw new Error(\"print iframe not available\");\n\n doc.open();\n doc.write(`<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <title>${title.replace(/</g, \"&lt;\")}</title>\n <style>\n html, body { margin: 0; padding: 0; }\n img { width: 100%; display: block; }\n .page { page-break-after: always; }\n .page:last-child { page-break-after: auto; }\n @page { margin: 10mm; }\n </style>\n </head>\n <body></body>\n</html>`);\n doc.close();\n\n const body = doc.body;\n for (const page of pages) {\n const img = doc.createElement(\"img\");\n img.src = page.dataUrl;\n const wrapper = doc.createElement(\"div\");\n wrapper.className = \"page\";\n wrapper.appendChild(img);\n body.appendChild(wrapper);\n }\n\n // Wait for images to decode before printing\n await Promise.all(\n Array.from(body.querySelectorAll(\"img\")).map(\n (img) =>\n img.decode?.().catch(() => undefined) ?? Promise.resolve(),\n ),\n );\n\n setTimeout(() => {\n try {\n iframe.contentWindow?.focus();\n iframe.contentWindow?.print();\n } finally {\n setTimeout(() => {\n try {\n document.body.removeChild(iframe);\n } catch {\n // ignore\n }\n }, 1000);\n }\n }, 50);\n } catch {\n try {\n if (displayUrl) {\n window.open(displayUrl, \"_blank\", \"noopener,noreferrer\");\n } else if (resolvedUrl) {\n window.open(resolvedUrl, \"_blank\", \"noopener,noreferrer\");\n }\n } catch {\n // ignore\n }\n } finally {\n setIsPrinting(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, resolvedUrl, annotations, signatures, textsForExport]);\n\n const handleDownload = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n const filename = `${title.replace(/[^\\w.-]+/g, \"_\") || \"document\"}.pdf`;\n const hasLayers =\n annotations.length > 0 ||\n signatures.length > 0 ||\n textsForExport.length > 0;\n\n // No markup → keep original PDF bytes\n if (!hasLayers && displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n return;\n }\n\n setIsDownloading(true);\n try {\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 2,\n rotation,\n annotations,\n signatures,\n texts: textsForExport,\n mimeType: \"image/jpeg\",\n quality: 0.92,\n });\n const pdfBytes = buildPdfFromJpegPages(pages);\n const copy = new Uint8Array(pdfBytes.byteLength);\n copy.set(pdfBytes);\n triggerBlobDownload(\n new Blob([copy], { type: \"application/pdf\" }),\n filename,\n );\n } catch {\n if (displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n }\n } finally {\n setIsDownloading(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, annotations, signatures, textsForExport]);\n\n const toggleMarkupTool = useCallback((tool: MarkupTool) => {\n setMarkupTool((current) => (current === tool ? \"none\" : tool));\n }, []);\n\n const activeMarkupHex =\n markupTool === \"highlight\"\n ? highlightHex\n : markupTool === \"underline\"\n ? underlineHex\n : null;\n\n const activeMarkupColor =\n markupTool === \"highlight\" || markupTool === \"underline\"\n ? hexToMarkupColor(activeMarkupHex!, markupTool)\n : undefined;\n\n const selectedSignature =\n selectedSignatureId != null\n ? signatures.find((sig) => sig.id === selectedSignatureId) ?? null\n : null;\n\n const handleAddAnnotation = useCallback((annotation: MarkupAnnotation) => {\n setAnnotations((prev) => [...prev, annotation]);\n }, []);\n\n const handleRemoveAnnotation = useCallback((id: string) => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const handleClearAnnotations = useCallback(() => {\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setSelectedSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n }, []);\n\n const advanceToNextUnsignedField = useCallback(\n (fromFieldId: string, filledIds: Set<string>) => {\n const currentIndex = signatureFields.findIndex(\n (field) => field.id === fromFieldId,\n );\n const nextField =\n signatureFields\n .slice(currentIndex + 1)\n .find((field) => !filledIds.has(field.id)) ??\n signatureFields\n .slice(0, Math.max(0, currentIndex))\n .find((field) => !filledIds.has(field.id));\n\n if (!nextField) {\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n return;\n }\n\n setSelectedSignatureFieldId(nextField.id);\n setSelectedSignatureId(null);\n setEditingSignatureId(null);\n setSignaturePadFieldType(nextField.type ?? \"sign\");\n scrollToSignatureField(nextField);\n window.setTimeout(() => {\n setSignaturePadOpen(true);\n }, 350);\n },\n [scrollToSignatureField, signatureFields],\n );\n\n const handleOpenSignaturePad = useCallback(\n (fieldType?: import(\"./signature\").SignatureFieldType) => {\n setSignaturePadFieldType(fieldType);\n setSignaturePadOpen(true);\n },\n [],\n );\n\n const handleFieldValueChange = useCallback((fieldId: string, value: string) => {\n setFieldValues((prev) => ({ ...prev, [fieldId]: value }));\n }, []);\n\n const handleFieldValueCommit = useCallback(\n (fieldId: string) => {\n const val = fieldValues[fieldId];\n if (val) onFieldValueComplete?.(fieldId, val);\n\n const currentIndex = signatureFields.findIndex((f) => f.id === fieldId);\n const filledIds = new Set(\n Object.keys(fieldValues).filter((k) => fieldValues[k]?.trim()),\n );\n filledIds.add(fieldId);\n const nextField =\n signatureFields.slice(currentIndex + 1).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n ) ??\n signatureFields.slice(0, Math.max(0, currentIndex)).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n );\n if (nextField) {\n setSelectedSignatureFieldId(nextField.id);\n scrollToSignatureField(nextField);\n }\n },\n [signatureFields, fieldValues, signatures, scrollToSignatureField, onFieldValueComplete],\n );\n\n const handleSignatureSave = useCallback(\n (imageDataUrl: string, sourceWidth: number, sourceHeight: number) => {\n const size = signatureDisplaySize(sourceWidth, sourceHeight);\n\n if (editingSignatureId) {\n setSignatures((prev) =>\n prev.map((sig) =>\n sig.id === editingSignatureId\n ? {\n ...sig,\n imageDataUrl,\n width: sig.fieldId ? sig.width : size.width,\n height: sig.fieldId ? sig.height : size.height,\n }\n : sig,\n ),\n );\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n return;\n }\n\n if (hasFixedSignatureFields) {\n const targetField =\n signatureFields.find(\n (field) =>\n field.id === selectedSignatureFieldId &&\n (field.type ?? \"sign\") === \"sign\" &&\n !signatures.some((sig) => sig.fieldId === field.id),\n ) ??\n signatureFields.find(\n (field) =>\n (field.type ?? \"sign\") === \"sign\" &&\n !signatures.some((sig) => sig.fieldId === field.id),\n );\n\n if (!targetField) {\n setSignaturePadOpen(false);\n return;\n }\n\n const targetFields =\n applySignatureToSameTag && targetField.signature_tag\n ? signatureFields.filter(\n (field) =>\n (field.type ?? \"sign\") === \"sign\" &&\n field.signature_tag === targetField.signature_tag &&\n !signatures.some((sig) => sig.fieldId === field.id),\n )\n : [targetField];\n\n const newSignatures: SignatureAnnotation[] = targetFields.map((field) => ({\n id: createSignatureId(),\n fieldId: field.id,\n pageNumber: field.pageNumber,\n x: field.x,\n y: field.y,\n width: field.width,\n height: field.height,\n imageDataUrl,\n }));\n\n const targetIds = new Set(targetFields.map((field) => field.id));\n setSignatures((prev) => [\n ...prev.filter((sig) => !sig.fieldId || !targetIds.has(sig.fieldId)),\n ...newSignatures,\n ]);\n\n const byFieldId = new Map(\n newSignatures.map((sig) => [sig.fieldId as string, sig]),\n );\n writeSignatureImageToFields(\n targetFields.map((field) => field.id),\n newSignatures[0],\n byFieldId,\n );\n\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSelectedSignatureId(newSignatures[0]?.id ?? null);\n\n const filledIds = new Set(\n signatureFields\n .filter((field) =>\n isSignatureFieldFilled(\n field,\n [...signatures, ...newSignatures],\n fieldValues,\n ),\n )\n .map((field) => field.id),\n );\n for (const id of targetIds) filledIds.add(id);\n\n advanceToNextUnsignedField(targetField.id, filledIds);\n return;\n }\n\n const currentPageEl = pageRefsRef.current.get(pageNumber);\n const surface = currentPageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n let x = 24;\n let y = 24;\n if (surface) {\n const pageSize = pageSizeFromSurface(surface, scale);\n const scrollContainer = surface.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null;\n\n if (scrollContainer) {\n const visible = viewportRectToPage(\n scrollContainer.getBoundingClientRect(),\n surface,\n scale,\n );\n const visibleTop = Math.max(0, visible.top);\n const visibleBottom = Math.min(pageSize.height, visible.bottom);\n const visibleLeft = Math.max(0, visible.left);\n const visibleRight = Math.min(pageSize.width, visible.right);\n x = Math.max(0, (visibleLeft + visibleRight) / 2 - size.width / 2);\n y = Math.max(0, (visibleTop + visibleBottom) / 2 - size.height / 2);\n x = Math.min(x, Math.max(0, pageSize.width - size.width));\n y = Math.min(y, Math.max(0, pageSize.height - size.height));\n } else {\n x = Math.max(0, (pageSize.width - size.width) / 2);\n y = Math.max(0, (pageSize.height - size.height) / 2);\n }\n }\n\n const signature: SignatureAnnotation = {\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: size.width,\n height: size.height,\n imageDataUrl,\n };\n\n setSignatures((prev) => [...prev, signature]);\n writeSignatureImageToFields(undefined, signature);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n },\n [\n advanceToNextUnsignedField,\n applySignatureToSameTag,\n editingSignatureId,\n fieldValues,\n hasFixedSignatureFields,\n isSignatureFieldFilled,\n pageNumber,\n scale,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n writeSignatureImageToFields,\n ],\n );\n\n const handleSaveFieldValue = useCallback(\n (value: string, fieldType: \"date\" | \"text\") => {\n if (hasFixedSignatureFields) {\n const targetField =\n signatureFields.find(\n (field) =>\n field.id === selectedSignatureFieldId &&\n (field.type ?? \"sign\") === fieldType,\n ) ??\n signatureFields.find((field) => (field.type ?? \"sign\") === fieldType);\n\n if (!targetField) {\n setSignaturePadOpen(false);\n return;\n }\n\n const targetFields =\n applySignatureToSameTag && targetField.signature_tag\n ? signatureFields.filter(\n (field) =>\n (field.type ?? \"sign\") === fieldType &&\n field.signature_tag === targetField.signature_tag,\n )\n : [targetField];\n\n const targetIds = targetFields.map((field) => field.id);\n writeFieldValueToFields(targetIds, value);\n\n const nextValues = { ...fieldValues };\n for (const id of targetIds) nextValues[id] = value;\n\n const filledIds = new Set(\n signatureFields\n .filter((field) =>\n isSignatureFieldFilled(field, signatures, nextValues),\n )\n .map((field) => field.id),\n );\n\n advanceToNextUnsignedField(targetField.id, filledIds);\n return;\n }\n\n const fontSize = DEFAULT_TEXT_FONT_SIZE;\n const width = Math.max(80, value.length * fontSize * 0.55);\n const height = fontSize * 1.25;\n let x = 24;\n let y = 24;\n\n const currentPageEl = pageRefsRef.current.get(pageNumber);\n const surface = currentPageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n if (surface) {\n const pageSize = pageSizeFromSurface(surface, scale);\n const scrollContainer = surface.closest(\n \".epochs-pdf-viewer__body\",\n ) as HTMLElement | null;\n if (scrollContainer) {\n const visible = viewportRectToPage(\n scrollContainer.getBoundingClientRect(),\n surface,\n scale,\n );\n const visibleTop = Math.max(0, visible.top);\n const visibleBottom = Math.min(pageSize.height, visible.bottom);\n const visibleLeft = Math.max(0, visible.left);\n const visibleRight = Math.min(pageSize.width, visible.right);\n x = Math.max(0, (visibleLeft + visibleRight) / 2 - width / 2);\n y = Math.max(0, (visibleTop + visibleBottom) / 2 - height / 2);\n x = Math.min(x, Math.max(0, pageSize.width - width));\n y = Math.min(y, Math.max(0, pageSize.height - height));\n }\n }\n\n const text: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x,\n y,\n width,\n height,\n value,\n fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n setTexts((prev) => [...prev, text]);\n setSelectedTextId(text.id);\n setSignaturePadOpen(false);\n setMarkupTool(\"none\");\n },\n [\n advanceToNextUnsignedField,\n applySignatureToSameTag,\n fieldValues,\n hasFixedSignatureFields,\n isSignatureFieldFilled,\n pageNumber,\n scale,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n writeFieldValueToFields,\n ],\n );\n\n const handleAddSignature = useCallback((signature: SignatureAnnotation) => {\n setSignatures((prev) => [...prev, signature]);\n writeSignatureImageToFields(undefined, signature);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, [writeSignatureImageToFields]);\n\n const handleUpdateSignature = useCallback(\n (id: string, patch: Partial<SignatureAnnotation>) => {\n setSignatures((prev) =>\n prev.map((sig) => (sig.id === id ? { ...sig, ...patch } : sig)),\n );\n },\n [],\n );\n\n const handleRemoveSignature = useCallback((id: string) => {\n const removed = signatures.find((sig) => sig.id === id);\n setSignatures((prev) => prev.filter((sig) => sig.id !== id));\n setSelectedSignatureId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedSignatureFieldId(removed.fieldId);\n }\n }, [signatures]);\n\n const handleDuplicateSignature = useCallback((id?: string) => {\n const target = id\n ? signatures.find((sig) => sig.id === id) ?? null\n : selectedSignature;\n if (!target) return;\n\n const pageEl = pageRefsRef.current.get(target.pageNumber);\n const surface = pageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n const offset = 18;\n let x = target.x + offset;\n let y = target.y + offset;\n\n if (surface) {\n const pageWidth = surface.clientWidth / scale;\n const pageHeight = surface.clientHeight / scale;\n x = Math.min(\n Math.max(0, x),\n Math.max(0, pageWidth - target.width),\n );\n y = Math.min(\n Math.max(0, y),\n Math.max(0, pageHeight - target.height),\n );\n }\n\n const duplicate: SignatureAnnotation = {\n ...target,\n id: createSignatureId(),\n x,\n y,\n };\n\n setSignatures((prev) => [...prev, duplicate]);\n setSelectedSignatureId(duplicate.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, [scale, selectedSignature, signatures]);\n\n const handleEditSignature = useCallback((id?: string) => {\n const targetId = id ?? selectedSignature?.id;\n if (!targetId) return;\n const existing = signatures.find((sig) => sig.id === targetId);\n const field = existing?.fieldId\n ? signatureFields.find((item) => item.id === existing.fieldId)\n : undefined;\n setSignaturePadFieldType(field?.type ?? \"sign\");\n setSelectedSignatureId(targetId);\n setEditingSignatureId(targetId);\n setSignaturePadOpen(true);\n }, [selectedSignature, signatures, signatureFields]);\n\n const handleAddText = useCallback((text: TextAnnotation) => {\n setTexts((prev) => {\n if (text.fieldId) {\n return [...prev.filter((item) => item.fieldId !== text.fieldId), text];\n }\n return [...prev, text];\n });\n setSelectedTextId(text.id);\n if (text.fieldId) setSelectedTextFieldId(text.fieldId);\n }, []);\n\n const handleUpdateText = useCallback(\n (id: string, patch: Partial<TextAnnotation>) => {\n setTexts((prev) =>\n prev.map((text) => (text.id === id ? { ...text, ...patch } : text)),\n );\n },\n [],\n );\n\n const handleRemoveText = useCallback((id: string) => {\n const removed = texts.find((text) => text.id === id);\n setTexts((prev) => prev.filter((text) => text.id !== id));\n setSelectedTextId((current) => (current === id ? null : current));\n setEditingTextId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedTextFieldId(removed.fieldId);\n }\n }, [texts]);\n\n // Sync fixed text field geometry if the prop changes\n useEffect(() => {\n if (!hasFixedTextFields) return;\n setTexts((prev) =>\n prev.map((text) => {\n if (!text.fieldId) return text;\n const field = textFields.find((item) => item.id === text.fieldId);\n if (!field) return text;\n return {\n ...text,\n pageNumber: field.pageNumber,\n x: field.x,\n y: field.y,\n width: field.width,\n height: field.height,\n fontSize: field.fontSize ?? text.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n color: field.color ?? text.color ?? DEFAULT_TEXT_COLOR,\n };\n }),\n );\n }, [hasFixedTextFields, textFields]);\n\n const goToSignatureField = useCallback(\n (direction: -1 | 1) => {\n if (!signatureFields.length) return;\n const from =\n selectedSignatureFieldId != null\n ? signatureFields.findIndex((f) => f.id === selectedSignatureFieldId)\n : -1;\n const nextIndex = Math.min(\n signatureFields.length - 1,\n Math.max(0, (from < 0 ? 0 : from) + direction),\n );\n const field = signatureFields[nextIndex];\n if (!field) return;\n setSelectedSignatureFieldId(field.id);\n setSelectedSignatureId(\n signatures.find((sig) => sig.fieldId === field.id)?.id ?? null,\n );\n scrollToSignatureField(field);\n },\n [\n scrollToSignatureField,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n ],\n );\n\n if (!binarySource && !resolvedUrl) {\n return (\n <div\n data-testid=\"pdf-viewer\"\n className={`epochs-pdf-viewer epochs-pdf-viewer--empty ${className ?? \"\"}`.trim()}\n >\n No PDF file provided.\n </div>\n );\n }\n\n const rootStyle: CSSProperties = {\n height,\n };\n\n const toolbarCtx: ToolbarRenderContext = {\n status,\n showThumbnails,\n setShowThumbnails,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n pageNumber,\n numPages,\n scrollToPage,\n scale,\n handleZoomOut,\n handleZoomIn,\n handleFitWidth,\n handleRotate,\n markupTool,\n toggleMarkupTool: (tool) => toggleMarkupTool(tool),\n hasFixedSignatureFields,\n hasFixedTextFields,\n pendingSignature,\n setMarkupTool,\n setSignaturePadOpen,\n annotationsLength: annotations.length,\n signaturesLength: signatures.length,\n textsLength: texts.length,\n handleClearAnnotations,\n highlightHex,\n underlineHex,\n setHighlightHex,\n setUnderlineHex,\n loadDocument,\n handlePrint,\n isPrinting,\n pdfDoc,\n displayUrl,\n resolvedUrl,\n handleDownload,\n isDownloading,\n };\n\n const visibleToolIds = (ids: ToolbarToolId[]) =>\n ids.filter((id) => {\n if (\n hasFixedSignatureFields &&\n (id === \"highlight\" || id === \"underline\" || id === \"erase\")\n ) {\n return false;\n }\n return true;\n });\n\n const currentFieldIndex = selectedSignatureFieldId\n ? signatureFields.findIndex((field) => field.id === selectedSignatureFieldId)\n : 0;\n\n const filledFieldCount = signatureFields.filter((field) =>\n isSignatureFieldFilled(field, signatures, fieldValues),\n ).length;\n\n const fieldProgressPercent =\n signatureFields.length > 0\n ? Math.round((filledFieldCount / signatureFields.length) * 100)\n : 0;\n\n const renderSide = (ids: ToolbarToolId[], alignEnd = false) => {\n const visible = visibleToolIds(ids);\n if (visible.length === 0 && !alignEnd) {\n return <div className=\"epochs-pdf-viewer__toolbar-group\" />;\n }\n if (visible.length === 0) {\n return (\n <div className=\"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\" />\n );\n }\n\n const nodes = visible.map((id, index) => {\n const prev = visible[index - 1];\n const showMarkupSep =\n isMarkupToolbarTool(id) && (!prev || !isMarkupToolbarTool(prev));\n return (\n <Fragment key={id}>\n {renderToolbarTool(id, toolbarCtx, { showMarkupSep })}\n </Fragment>\n );\n });\n\n return (\n <div\n className={\n alignEnd\n ? \"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\"\n : \"epochs-pdf-viewer__toolbar-group\"\n }\n >\n {nodes}\n {renderMarkupExtras(toolbarCtx, new Set(visible))}\n </div>\n );\n };\n\n return (\n <div\n data-testid=\"pdf-viewer\"\n data-file-url={resolvedUrl || undefined}\n className={`epochs-pdf-viewer ${className ?? \"\"}`.trim()}\n style={rootStyle}\n >\n {toolbarSides ? (\n <div className=\"epochs-pdf-viewer__toolbar\">\n {renderSide(toolbarSides.left)}\n {renderSide(toolbarSides.right, true)}\n </div>\n ) : null}\n\n {(showSignature || externalOpenSignaturePad || hasFixedSignatureFields) ? (\n <SignaturePad\n open={signaturePadOpen}\n onClose={() => {\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n setSignaturePadFieldType(undefined);\n onSignaturePadClose?.();\n }}\n onSave={handleSignatureSave}\n onSaveFieldValue={handleSaveFieldValue}\n fieldType={signaturePadFieldType}\n showFieldTypeTabs={!hasFixedSignatureFields}\n textPlaceholder={\n signatureFields.find((field) => field.id === selectedSignatureFieldId)\n ?.placeholder\n }\n initialFieldValue={\n selectedSignatureFieldId\n ? fieldValues[selectedSignatureFieldId] ??\n signatureFields.find((field) => field.id === selectedSignatureFieldId)\n ?.value\n : undefined\n }\n rememberedByType={rememberedByType}\n onRememberFill={(type, fill) => {\n setRememberedByType((prev) => {\n if (type === \"sign\") {\n return { ...prev, sign: fill as RememberedSignFill };\n }\n if (type === \"date\") {\n return { ...prev, date: fill as { value: string } };\n }\n return { ...prev, text: fill as { value: string } };\n });\n }}\n />\n ) : null}\n\n <div className=\"epochs-pdf-viewer__content\">\n {showThumbnails ? (\n <div\n className=\"epochs-pdf-viewer__thumbnails\"\n style={{ width: thumbnailWidth + 24 }}\n >\n {status === \"ready\" && pdfDoc ? (\n <>\n {Array.from({\n length: Math.min(numPages || 0, maxThumbnails),\n }).map((_, idx) => {\n const n = idx + 1;\n return (\n <div key={n} className=\"epochs-pdf-viewer__thumb-wrap\">\n <ThumbnailStrip\n pdfDoc={pdfDoc}\n pageNumber={n}\n isActive={n === pageNumber}\n rotation={rotation}\n onSelect={scrollToPage}\n width={thumbnailWidth}\n annotations={annotations}\n signatures={signatures}\n signatureFields={signatureFields}\n texts={textsForExport}\n textFields={textFields}\n />\n </div>\n );\n })}\n {numPages > maxThumbnails ? (\n <div className=\"epochs-pdf-viewer__thumb-more\">\n Showing first {maxThumbnails} pages\n </div>\n ) : null}\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__muted\">Thumbnails</div>\n )}\n </div>\n ) : null}\n\n <div ref={containerRef} className=\"epochs-pdf-viewer__body\">\n {status === \"loading\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__muted\">\n Loading PDF…\n <span className=\"epochs-pdf-viewer__spinner\" />\n </div>\n ) : null}\n\n {status === \"error\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__error\">\n Unable to load PDF.\n {resolvedUrl ? (\n <a\n className=\"epochs-pdf-viewer__open-link\"\n href={resolvedUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Open file\n </a>\n ) : null}\n </div>\n ) : null}\n\n {status === \"ready\" && pdfDoc ? (\n <div>\n {Array.from({ length: numPages }).map((_, idx) => {\n const p = idx + 1;\n return (\n <PageCanvas\n key={p}\n pdfDoc={pdfDoc}\n pageNumber={p}\n scale={scale}\n rotation={rotation}\n markupTool={enableMarkup ? markupTool : \"none\"}\n markupColor={activeMarkupColor}\n annotations={annotations}\n onAddAnnotation={handleAddAnnotation}\n onRemoveAnnotation={handleRemoveAnnotation}\n signatures={signatures}\n pendingSignature={pendingSignature}\n onAddSignature={handleAddSignature}\n onUpdateSignature={handleUpdateSignature}\n onRemoveSignature={handleRemoveSignature}\n onEditSignature={handleEditSignature}\n onDuplicateSignature={handleDuplicateSignature}\n selectedSignatureId={selectedSignatureId}\n onSelectSignature={setSelectedSignatureId}\n signatureFields={signatureFields}\n selectedSignatureFieldId={selectedSignatureFieldId}\n onSelectSignatureField={setSelectedSignatureFieldId}\n hasFixedSignatureFields={hasFixedSignatureFields}\n onOpenSignaturePad={handleOpenSignaturePad}\n fieldValues={fieldValues}\n onFieldValueChange={handleFieldValueChange}\n onFieldValueCommit={handleFieldValueCommit}\n texts={texts}\n onAddText={handleAddText}\n onUpdateText={handleUpdateText}\n onRemoveText={handleRemoveText}\n selectedTextId={selectedTextId}\n onSelectText={setSelectedTextId}\n textFields={textFields}\n selectedTextFieldId={selectedTextFieldId}\n onSelectTextField={setSelectedTextFieldId}\n hasFixedTextFields={hasFixedTextFields}\n editingTextId={editingTextId}\n onEditingTextIdChange={setEditingTextId}\n pageRef={(el) => {\n if (el) pageRefsRef.current.set(p, el);\n }}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n\n {hasFixedSignatureFields || onSubmit ? (\n <div className=\"epochs-pdf-viewer__footer\" role=\"navigation\" aria-label=\"Viewer actions\">\n {hasFixedSignatureFields ? (\n <>\n <div className=\"epochs-pdf-viewer__footer-nav\">\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={signatureFields.length <= 1 || currentFieldIndex <= 0}\n onClick={() => goToSignatureField(-1)}\n >\n Prev\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={\n signatureFields.length <= 1 ||\n currentFieldIndex >= signatureFields.length - 1\n }\n onClick={() => goToSignatureField(1)}\n >\n Next\n </button>\n </div>\n <div className=\"epochs-pdf-viewer__footer-center\">\n <span className=\"epochs-pdf-viewer__footer-label\">\n Field {Math.max(1, currentFieldIndex + 1)} of {signatureFields.length}\n </span>\n <div\n className=\"epochs-pdf-viewer__footer-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={fieldProgressPercent}\n aria-label=\"Signature progress\"\n >\n <div\n className=\"epochs-pdf-viewer__footer-progress-bar\"\n style={{ width: `${fieldProgressPercent}%` }}\n />\n </div>\n <span className=\"epochs-pdf-viewer__footer-percent\">\n {fieldProgressPercent}%\n </span>\n </div>\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__footer-center\" />\n )}\n {onSubmit ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={onSubmit}\n disabled={submitLoading}\n aria-busy={submitLoading || undefined}\n >\n {submitLoading ? (\n <span\n className=\"epochs-pdf-viewer__spinner epochs-pdf-viewer__spinner--btn\"\n aria-hidden=\"true\"\n />\n ) : null}\n {submitLabel}\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default PdfViewer;\n","import type {\n DocumentProps,\n ImageProps,\n LinkProps,\n PageProps,\n TextProps,\n ViewProps,\n} from \"./types\";\n\n/** Root document container. Must wrap one or more `<Page>` elements. */\nexport function Document(_props: DocumentProps): null {\n return null;\n}\nDocument.displayName = \"Document\";\n\n/** A single PDF page. */\nexport function Page(_props: PageProps): null {\n return null;\n}\nPage.displayName = \"Page\";\n\n/** Flexbox layout container. */\nexport function View(_props: ViewProps): null {\n return null;\n}\nView.displayName = \"View\";\n\n/** Text content. Children are flattened to a string. */\nexport function Text(_props: TextProps): null {\n return null;\n}\nText.displayName = \"Text\";\n\n/** Image placeholder (binary embedding planned). */\nexport function Image(_props: ImageProps): null {\n return null;\n}\nImage.displayName = \"Image\";\n\n/** Linked text. */\nexport function Link(_props: LinkProps): null {\n return null;\n}\nLink.displayName = \"Link\";\n","import { createElement, type ReactElement, type ReactNode } from \"react\";\nimport type { PdfNode, NodeType } from \"./types\";\n\nconst TYPE_MAP: Record<string, NodeType> = {\n Document: \"DOCUMENT\",\n Page: \"PAGE\",\n View: \"VIEW\",\n Text: \"TEXT\",\n Image: \"IMAGE\",\n Link: \"LINK\",\n};\n\nfunction getDisplayName(type: unknown): string | null {\n if (typeof type === \"string\") return type;\n if (typeof type === \"function\") {\n const fn = type as { displayName?: string; name?: string };\n return fn.displayName || fn.name || null;\n }\n return null;\n}\n\nfunction flattenChildren(children: ReactNode): ReactNode[] {\n const result: ReactNode[] = [];\n const visit = (node: ReactNode) => {\n if (node == null || typeof node === \"boolean\") return;\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n result.push(node);\n };\n visit(children);\n return result;\n}\n\nfunction collectText(children: ReactNode): string {\n return flattenChildren(children)\n .map((child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return String(child);\n }\n if (\n child &&\n typeof child === \"object\" &&\n \"props\" in (child as ReactElement)\n ) {\n const el = child as ReactElement<{ children?: ReactNode }>;\n return collectText(el.props.children);\n }\n return \"\";\n })\n .join(\"\");\n}\n\nexport function elementToPdfNode(element: ReactElement): PdfNode {\n const name = getDisplayName(element.type);\n const nodeType = name ? TYPE_MAP[name] : undefined;\n\n if (!nodeType) {\n throw new Error(\n `[epochs-pdf] Unsupported element \"${name ?? \"unknown\"}\". Use Document, Page, View, Text, Image, or Link.`,\n );\n }\n\n const props = { ...(element.props as Record<string, unknown>) };\n const childrenProp = props.children as ReactNode;\n delete props.children;\n\n if (nodeType === \"TEXT\" || nodeType === \"LINK\") {\n return {\n type: nodeType,\n props,\n children: [],\n text: collectText(childrenProp),\n };\n }\n\n const childNodes = flattenChildren(childrenProp)\n .filter(\n (child): child is ReactElement =>\n !!child && typeof child === \"object\" && \"type\" in (child as object),\n )\n .map(elementToPdfNode);\n\n return {\n type: nodeType,\n props,\n children: childNodes,\n };\n}\n\nexport function createPdfElement(\n type: NodeType,\n props: Record<string, unknown> = {},\n ...children: ReactNode[]\n): ReactElement {\n const name = Object.entries(TYPE_MAP).find(([, v]) => v === type)?.[0];\n if (!name) throw new Error(`Unknown node type: ${type}`);\n return createElement(name, props, ...children);\n}\n","import type { PageSize, Style } from \"./types\";\n\nexport const PAGE_SIZES: Record<Exclude<PageSize, [number, number]>, [number, number]> = {\n A4: [595.28, 841.89],\n LETTER: [612, 792],\n LEGAL: [612, 1008],\n};\n\nexport function resolvePageSize(\n size: PageSize = \"A4\",\n orientation: \"portrait\" | \"landscape\" = \"portrait\",\n): [number, number] {\n const [w, h] = Array.isArray(size) ? size : PAGE_SIZES[size];\n return orientation === \"landscape\" ? [h, w] : [w, h];\n}\n\nexport function expandPadding(style: Style = {}) {\n const base = style.padding ?? 0;\n return {\n top: style.paddingTop ?? base,\n right: style.paddingRight ?? base,\n bottom: style.paddingBottom ?? base,\n left: style.paddingLeft ?? base,\n };\n}\n\nexport function expandMargin(style: Style = {}) {\n const base = style.margin ?? 0;\n return {\n top: style.marginTop ?? base,\n right: style.marginRight ?? base,\n bottom: style.marginBottom ?? base,\n left: style.marginLeft ?? base,\n };\n}\n\n/** Parse #RRGGBB / #RGB / rgb() into 0–1 RGB components. */\nexport function parseColor(input?: string): [number, number, number] | null {\n if (!input) return null;\n\n const hex = input.trim();\n if (hex.startsWith(\"#\")) {\n const raw = hex.slice(1);\n if (raw.length === 3) {\n const r = parseInt(raw[0] + raw[0], 16) / 255;\n const g = parseInt(raw[1] + raw[1], 16) / 255;\n const b = parseInt(raw[2] + raw[2], 16) / 255;\n return [r, g, b];\n }\n if (raw.length === 6) {\n const r = parseInt(raw.slice(0, 2), 16) / 255;\n const g = parseInt(raw.slice(2, 4), 16) / 255;\n const b = parseInt(raw.slice(4, 6), 16) / 255;\n return [r, g, b];\n }\n }\n\n const rgb = input.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (rgb) {\n return [\n Math.min(1, Number(rgb[1]) / 255),\n Math.min(1, Number(rgb[2]) / 255),\n Math.min(1, Number(rgb[3]) / 255),\n ];\n }\n\n return null;\n}\n\nexport function resolveLength(\n value: number | string | undefined,\n parent: number,\n fallback = 0,\n): number {\n if (value == null) return fallback;\n if (typeof value === \"number\") return value;\n if (value.endsWith(\"%\")) {\n const pct = Number.parseFloat(value);\n return Number.isFinite(pct) ? (pct / 100) * parent : fallback;\n }\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function isBold(weight?: Style[\"fontWeight\"]): boolean {\n if (weight === \"bold\") return true;\n if (typeof weight === \"number\") return weight >= 600;\n return false;\n}\n","import type { LayoutBox, PdfNode, ResolvedDocument, ResolvedPage, Style } from \"./types\";\nimport {\n expandMargin,\n expandPadding,\n isBold,\n resolveLength,\n resolvePageSize,\n} from \"./utils\";\n\nconst DEFAULT_FONT_SIZE = 12;\nconst DEFAULT_LINE_HEIGHT = 1.4;\nconst AVG_CHAR_WIDTH = 0.5;\n\nfunction measureText(text: string, style: Style, maxWidth: number): { width: number; height: number; lines: string[] } {\n const fontSize = style.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = (style.lineHeight ?? DEFAULT_LINE_HEIGHT) * fontSize;\n const charWidth = fontSize * (isBold(style.fontWeight) ? 0.55 : AVG_CHAR_WIDTH);\n\n if (!text) {\n return { width: 0, height: lineHeight, lines: [\"\"] };\n }\n\n const words = text.split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n const candidate = current ? `${current} ${word}` : word;\n if (candidate.length * charWidth <= maxWidth || !current) {\n current = candidate;\n } else {\n lines.push(current);\n current = word;\n }\n }\n if (current) lines.push(current);\n\n const widest = Math.max(...lines.map((l) => l.length * charWidth), 0);\n return {\n width: Math.min(widest, maxWidth),\n height: lines.length * lineHeight,\n lines,\n };\n}\n\nfunction layoutNode(\n node: PdfNode,\n x: number,\n y: number,\n availableWidth: number,\n availableHeight: number,\n): LayoutBox {\n const style = (node.props.style as Style | undefined) ?? {};\n const margin = expandMargin(style);\n const padding = expandPadding(style);\n\n const outerX = x + margin.left;\n const outerY = y + margin.top;\n const contentWidth = Math.max(\n 0,\n resolveLength(style.width, availableWidth, availableWidth) - margin.left - margin.right,\n );\n const innerWidth = Math.max(0, contentWidth - padding.left - padding.right);\n\n if (node.type === \"TEXT\" || node.type === \"LINK\") {\n const measured = measureText(node.text ?? \"\", style, innerWidth);\n const height =\n resolveLength(style.height, availableHeight, measured.height + padding.top + padding.bottom);\n return {\n x: outerX,\n y: outerY,\n width: contentWidth,\n height,\n node,\n children: [],\n style,\n text: node.text,\n };\n }\n\n if (node.type === \"IMAGE\") {\n const width = resolveLength(style.width, availableWidth, Math.min(200, availableWidth));\n const height = resolveLength(style.height, availableHeight, 120);\n return {\n x: outerX,\n y: outerY,\n width: width - margin.left - margin.right,\n height,\n node,\n children: [],\n style,\n };\n }\n\n const direction = style.flexDirection ?? \"column\";\n const gap = style.gap ?? 0;\n const childBoxes: LayoutBox[] = [];\n\n let cursorX = outerX + padding.left;\n let cursorY = outerY + padding.top;\n let usedMain = 0;\n let crossSize = 0;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const remainingW =\n direction === \"row\"\n ? Math.max(0, innerWidth - usedMain - (i > 0 ? gap : 0))\n : innerWidth;\n const remainingH =\n direction === \"column\"\n ? Math.max(0, availableHeight - (cursorY - y) - margin.bottom)\n : availableHeight;\n\n const box = layoutNode(child, cursorX, cursorY, remainingW, remainingH);\n childBoxes.push(box);\n\n if (direction === \"row\") {\n usedMain += box.width + expandMargin((child.props.style as Style) ?? {}).left\n + expandMargin((child.props.style as Style) ?? {}).right;\n if (i < node.children.length - 1) usedMain += gap;\n cursorX = outerX + padding.left + usedMain;\n crossSize = Math.max(crossSize, box.height);\n } else {\n usedMain += box.height + expandMargin((child.props.style as Style) ?? {}).top\n + expandMargin((child.props.style as Style) ?? {}).bottom;\n if (i < node.children.length - 1) usedMain += gap;\n cursorY = outerY + padding.top + usedMain;\n crossSize = Math.max(crossSize, box.width);\n }\n }\n\n const contentHeight =\n resolveLength(\n style.height,\n availableHeight,\n direction === \"column\"\n ? usedMain + padding.top + padding.bottom\n : crossSize + padding.top + padding.bottom,\n );\n\n const finalWidth =\n direction === \"row\"\n ? resolveLength(style.width, availableWidth, usedMain + padding.left + padding.right)\n : contentWidth;\n\n const justify = style.justifyContent ?? \"flex-start\";\n const align = style.alignItems ?? \"stretch\";\n\n const innerMain =\n direction === \"column\"\n ? contentHeight - padding.top - padding.bottom\n : finalWidth - padding.left - padding.right;\n const childrenMain = usedMain;\n const freeSpace = Math.max(0, innerMain - childrenMain);\n\n let mainOffset = 0;\n let betweenGap = gap;\n if (justify === \"center\") mainOffset = freeSpace / 2;\n if (justify === \"flex-end\") mainOffset = freeSpace;\n if (justify === \"space-between\" && childBoxes.length > 1) {\n betweenGap = gap + freeSpace / (childBoxes.length - 1);\n }\n if (justify === \"space-around\" && childBoxes.length > 0) {\n betweenGap = gap + freeSpace / childBoxes.length;\n mainOffset = betweenGap / 2;\n }\n\n let running = 0;\n for (const box of childBoxes) {\n if (direction === \"column\") {\n box.y = outerY + padding.top + mainOffset + running;\n if (align === \"center\") {\n box.x = outerX + padding.left + Math.max(0, (innerWidth - box.width) / 2);\n } else if (align === \"flex-end\") {\n box.x = outerX + padding.left + Math.max(0, innerWidth - box.width);\n } else if (align === \"stretch\" && box.style.width == null) {\n box.width = innerWidth;\n }\n running += box.height + betweenGap;\n } else {\n box.x = outerX + padding.left + mainOffset + running;\n if (align === \"center\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, (contentHeight - padding.top - padding.bottom - box.height) / 2);\n } else if (align === \"flex-end\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, contentHeight - padding.top - padding.bottom - box.height);\n } else if (align === \"stretch\" && box.style.height == null) {\n box.height = contentHeight - padding.top - padding.bottom;\n }\n running += box.width + betweenGap;\n }\n }\n\n return {\n x: outerX,\n y: outerY,\n width: finalWidth,\n height: contentHeight,\n node,\n children: childBoxes,\n style,\n };\n}\n\nexport function layoutDocument(root: PdfNode): ResolvedDocument {\n if (root.type !== \"DOCUMENT\") {\n throw new Error(\"[epochs-pdf] Root element must be <Document>.\");\n }\n\n const pages: ResolvedPage[] = [];\n\n for (const pageNode of root.children) {\n if (pageNode.type !== \"PAGE\") {\n throw new Error(\"[epochs-pdf] Direct children of <Document> must be <Page>.\");\n }\n\n const size = pageNode.props.size as Parameters<typeof resolvePageSize>[0];\n const orientation = (pageNode.props.orientation as \"portrait\" | \"landscape\") ?? \"portrait\";\n const [width, height] = resolvePageSize(size, orientation);\n const style = (pageNode.props.style as Style | undefined) ?? {};\n const padding = expandPadding(style);\n\n const contentRoot: PdfNode = {\n type: \"VIEW\",\n props: {\n style: {\n ...style,\n width,\n height,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n },\n },\n children: pageNode.children,\n };\n\n const box = layoutNode(contentRoot, 0, 0, width, height);\n\n pages.push({\n width,\n height,\n boxes: box.children,\n style,\n });\n }\n\n return {\n meta: {\n title: String(root.props.title ?? \"Untitled\"),\n author: String(root.props.author ?? \"\"),\n subject: String(root.props.subject ?? \"\"),\n creator: String(root.props.creator ?? \"epochs-pdf\"),\n },\n pages,\n };\n}\n\nexport { measureText };\n","import type { LayoutBox, ResolvedDocument, Style } from \"./types\";\nimport { isBold, parseColor } from \"./utils\";\nimport { measureText } from \"./layout\";\n\nfunction escapePdfString(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\(/g, \"\\\\(\")\n .replace(/\\)/g, \"\\\\)\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\n/g, \"\\\\n\");\n}\n\nclass PdfWriter {\n private objects: (string | null)[] = [null];\n private offsets: number[] = [0];\n\n addObject(content: string): number {\n this.objects.push(content);\n return this.objects.length - 1;\n }\n\n build(doc: ResolvedDocument): Uint8Array {\n const infoId = this.addObject(\n `<< /Title (${escapePdfString(doc.meta.title)}) /Author (${escapePdfString(doc.meta.author)}) /Subject (${escapePdfString(doc.meta.subject)}) /Creator (${escapePdfString(doc.meta.creator)}) /Producer (epochs-pdf) >>`,\n );\n\n const fontRegular = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n );\n const fontBold = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold >>\",\n );\n\n const pageIds: number[] = [];\n\n for (const page of doc.pages) {\n const contentStream = this.renderPageContent(\n page.boxes,\n page.width,\n page.height,\n page.style,\n );\n const contentId = this.addObject(\n `<< /Length ${contentStream.length} >>\\nstream\\n${contentStream}\\nendstream`,\n );\n\n const pageId = this.addObject(\"\"); // placeholder\n pageIds.push(pageId);\n\n this.objects[pageId] =\n `<< /Type /Page /Parent 0 0 R /MediaBox [0 0 ${page.width.toFixed(2)} ${page.height.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /Font << /F1 ${fontRegular} 0 R /F2 ${fontBold} 0 R >> >> >>`;\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = this.addObject(\n `<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`,\n );\n\n for (const pageId of pageIds) {\n this.objects[pageId] = (this.objects[pageId] as string).replace(\n \"/Parent 0 0 R\",\n `/Parent ${pagesId} 0 R`,\n );\n }\n\n const catalogId = this.addObject(\n `<< /Type /Catalog /Pages ${pagesId} 0 R >>`,\n );\n\n // Serialize\n let body = \"%PDF-1.4\\n\";\n this.offsets = [0];\n\n for (let i = 1; i < this.objects.length; i++) {\n this.offsets[i] = body.length;\n body += `${i} 0 obj\\n${this.objects[i]}\\nendobj\\n`;\n }\n\n const xrefOffset = body.length;\n body += `xref\\n0 ${this.objects.length}\\n`;\n body += \"0000000000 65535 f \\n\";\n for (let i = 1; i < this.objects.length; i++) {\n body += `${String(this.offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n body += `trailer\\n<< /Size ${this.objects.length} /Root ${catalogId} 0 R /Info ${infoId} 0 R >>\\n`;\n body += `startxref\\n${xrefOffset}\\n%%EOF`;\n\n return new TextEncoder().encode(body);\n }\n\n private renderPageContent(\n boxes: LayoutBox[],\n pageWidth: number,\n pageHeight: number,\n pageStyle: Style,\n ): string {\n const ops: string[] = [];\n\n const pageBg = parseColor(pageStyle.backgroundColor);\n if (pageBg) {\n ops.push(`q`);\n ops.push(\n `${pageBg[0].toFixed(3)} ${pageBg[1].toFixed(3)} ${pageBg[2].toFixed(3)} rg`,\n );\n ops.push(\n `0 0 ${pageWidth.toFixed(2)} ${pageHeight.toFixed(2)} re f`,\n );\n ops.push(`Q`);\n }\n\n const drawBox = (box: LayoutBox) => {\n const { x, y, width, height, style, node, text } = box;\n const pdfY = pageHeight - y - height;\n\n const fill = parseColor(style.backgroundColor);\n if (fill) {\n ops.push(`q`);\n ops.push(`${fill[0].toFixed(3)} ${fill[1].toFixed(3)} ${fill[2].toFixed(3)} rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`Q`);\n }\n\n if (style.borderWidth && style.borderWidth > 0) {\n const border = parseColor(style.borderColor) ?? [0, 0, 0];\n ops.push(`q`);\n ops.push(`${style.borderWidth} w`);\n ops.push(`${border[0].toFixed(3)} ${border[1].toFixed(3)} ${border[2].toFixed(3)} RG`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(`Q`);\n }\n\n if ((node.type === \"TEXT\" || node.type === \"LINK\") && text != null) {\n const fontSize = style.fontSize ?? 12;\n const color = parseColor(style.color) ?? [0, 0, 0];\n const font = isBold(style.fontWeight) ? \"F2\" : \"F1\";\n const paddingLeft = style.paddingLeft ?? style.padding ?? 0;\n const paddingTop = style.paddingTop ?? style.padding ?? 0;\n const maxWidth = Math.max(0, width - paddingLeft - (style.paddingRight ?? style.padding ?? 0));\n const measured = measureText(text, style, maxWidth || width);\n const lineHeight = (style.lineHeight ?? 1.4) * fontSize;\n\n ops.push(`q`);\n ops.push(`BT`);\n ops.push(`/${font} ${fontSize} Tf`);\n ops.push(`${color[0].toFixed(3)} ${color[1].toFixed(3)} ${color[2].toFixed(3)} rg`);\n\n measured.lines.forEach((line, index) => {\n let textX = x + paddingLeft;\n const lineWidth = line.length * fontSize * (isBold(style.fontWeight) ? 0.55 : 0.5);\n if (style.textAlign === \"center\") {\n textX = x + (width - lineWidth) / 2;\n } else if (style.textAlign === \"right\") {\n textX = x + width - lineWidth - (style.paddingRight ?? style.padding ?? 0);\n }\n const textY = pageHeight - y - paddingTop - fontSize - index * lineHeight;\n ops.push(`1 0 0 1 ${textX.toFixed(2)} ${textY.toFixed(2)} Tm`);\n ops.push(`(${escapePdfString(line)}) Tj`);\n });\n\n ops.push(`ET`);\n ops.push(`Q`);\n }\n\n if (node.type === \"IMAGE\") {\n // Placeholder rectangle for images (no external deps / binary embedding yet)\n ops.push(`q`);\n ops.push(`0.85 0.85 0.85 rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`0.6 0.6 0.6 RG 1 w`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(\n `BT /F1 10 Tf 0.4 0.4 0.4 rg 1 0 0 1 ${(x + 8).toFixed(2)} ${(pdfY + height / 2 - 4).toFixed(2)} Tm (Image) Tj ET`,\n );\n ops.push(`Q`);\n }\n\n for (const child of box.children) {\n drawBox(child);\n }\n };\n\n for (const box of boxes) {\n drawBox(box);\n }\n\n return ops.join(\"\\n\");\n }\n}\n\nexport function serializePdf(doc: ResolvedDocument): Uint8Array {\n return new PdfWriter().build(doc);\n}\n","import type { ReactElement } from \"react\";\nimport { elementToPdfNode } from \"./reconciler\";\nimport { layoutDocument } from \"./layout\";\nimport { serializePdf } from \"./pdf-writer\";\n\nfunction renderToBytes(element: ReactElement): Uint8Array {\n const tree = elementToPdfNode(element);\n const laidOut = layoutDocument(tree);\n return serializePdf(laidOut);\n}\n\n/** Render a `<Document>` tree to a `Uint8Array` PDF. */\nexport function pdf(element: ReactElement): Uint8Array {\n return renderToBytes(element);\n}\n\n/** Render to a Blob (browser). */\nexport function toBlob(element: ReactElement): Blob {\n const bytes = renderToBytes(element);\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return new Blob([copy], { type: \"application/pdf\" });\n}\n\n/** Render to an object URL for iframes / previews. */\nexport function toUrl(element: ReactElement): string {\n return URL.createObjectURL(toBlob(element));\n}\n\n/** Trigger a browser download of the generated PDF. */\nexport function download(\n element: ReactElement,\n filename = \"document.pdf\",\n): void {\n const url = toUrl(element);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n/** Async-friendly API mirroring common PDF libraries. */\nexport async function renderToBuffer(element: ReactElement): Promise<Uint8Array> {\n return renderToBytes(element);\n}\n\nexport async function renderToBlob(element: ReactElement): Promise<Blob> {\n return toBlob(element);\n}\n"],"names":["REDACT_COLOR","HIGHLIGHT_PRESETS","UNDERLINE_PRESETS","DEFAULT_HIGHLIGHT_HEX","DEFAULT_UNDERLINE_HEX","hexToMarkupColor","createMarkupId","normalizeHex","color","value","r","g","b","hex","kind","alpha","normalized","match","int","selectionRectsForPage","pageSurface","scale","selection","range","pageBox","clientRects","safeScale","layoutW","layoutH","selectionStartPoint","rects","first","a","expandRedactRects","padding","rect","drawMarkupOnCanvas","ctx","annotations","ann","x","y","w","h","thickness","createSignatureId","drawSignaturesOnCanvas","signatures","sig","img","loadImage","drawSignatureFieldsOnCanvas","fields","signedFieldIds","field","isFilled","src","resolve","reject","signatureDisplaySize","sourceWidth","sourceHeight","maxWidth","maxHeight","ratio","clientPointToPage","clientX","clientY","surface","box","pageSizeFromSurface","clientDeltaToPage","deltaX","deltaY","viewportRectToPage","viewport","surfaceRect","pageW","pageH","DEFAULT_TEXT_FONT_SIZE","DEFAULT_TEXT_COLOR","MIN_TEXT_WIDTH","MIN_TEXT_HEIGHT","createTextId","measureInlineText","fontSize","lines","lineHeight","line","resolveInlineTextPoint","textLayer","surfaceBox","toPageX","client","toPageY","toPageSize","clientSize","axis","boxSize","layout","gap","findGapBetweenSpans","doc","_a","inferFontSizeFromNode","caretX","nearest","findNearestSpanOnLine","spans","boxes","span","i","left","right","gapStart","gapEnd","best","midX","dist","node","element","inferFontSizeFromElement","height","computed","parsed","findTextFieldAtPoint","pageNumber","selectWordAtPoint","text","offset","isWordChar","ch","start","end","wordRange","drawTextsOnCanvas","texts","cursorY","drawTextFieldsOnCanvas","filledFieldIds","Icon","size","className","children","jsx","ChevronLeftIcon","props","ChevronRightIcon","DownloadIcon","jsxs","ExternalLinkIcon","GridIcon","MinusIcon","PlusIcon","PrinterIcon","RefreshIcon","RotateIcon","HighlightIcon","UnderlineIcon","EraserIcon","SignatureIcon","PencilIcon","TextIcon","PageCanvas","pdfDoc","rotation","pageRef","onRendered","markupTool","markupColor","onAddAnnotation","onRemoveAnnotation","pendingSignature","onAddSignature","onUpdateSignature","onRemoveSignature","onEditSignature","onDuplicateSignature","selectedSignatureId","onSelectSignature","signatureFields","selectedSignatureFieldId","onSelectSignatureField","hasFixedSignatureFields","onOpenSignaturePad","fieldValues","_onFieldValueChange","_onFieldValueCommit","pendingFieldValue","onPlaceFieldValue","onAddText","onUpdateText","onRemoveText","selectedTextId","onSelectText","textFields","_selectedTextFieldId","onSelectTextField","hasFixedTextFields","editingTextId","onEditingTextIdChange","wrapRef","useRef","canvasRef","textLayerRef","surfaceRef","renderTaskRef","textLayerInstanceRef","dragState","setDragState","useState","inlineEditRef","justOpenedEditorRef","useEffect","cancelled","canvas","textLayerDiv","page","width","task","textContent","TextLayer","applySelectionMarkup","captured","replaceSelectedPdfText","initialValue","created","handleMouseUp","handleKeyDown","event","target","hasPdfSelection","rafId","lastClientX","lastClientY","scrollDir","getScrollContainer","updateResizeAtPoint","s","pageSize","dx","dy","maxW","maxH","newW","newH","updateSignatureAtPoint","pageEl","targetPage","point","nextX","nextY","maxX","maxY","tickScroll","container","maxScroll","edge","distTop","distBottom","speed","prev","handleMove","handleUp","el","current","t","setRefs","pageAnnotations","pageSignatures","pageSignatureFields","f","pageTexts","commitInlineText","trimmed","beginInlineTextAt","fieldId","existing","handleInlineTextClick","handleSurfaceClick","renderInlineText","e","idx","fType","textValue","filled","Fragment","Thumbnail","isActive","onSelect","viewportAt1","pageTextFields","ABSOLUTE_URL_PATTERN","workerConfigured","setPdfWorkerSrc","workerSrc","pdfjsLib","ensurePdfWorker","resolvePdfUrl","file","fileUrl","baseUrl","source","path","urlToPdfArrayBuffer","url","fetchOptions","res","sourceToArrayBuffer","copy","renderPageWithMarkup","options","mimeType","quality","baseViewport","pageMarks","pageSigs","dataUrl","jpegBytes","dataUrlToBytes","renderAllPagesWithMarkup","pages","base64","binary","bytes","enc","concat","parts","total","sum","p","out","part","buildPdfFromJpegPages","objects","add","pageIds","imageStream","imageId","content","contentId","pageId","kids","id","pagesId","catalogId","chunks","offsets","objHeader","objFooter","xrefStart","xref","triggerBlobDownload","blob","filename","anchor","HANDWRITING_FONTS","HANDWRITING_FONTS_HREF","handwritingFontsPromise","ensureHandwritingFonts","link","loadFaces","font","typedSignatureFontSize","typeKind","family","SignaturePad","open","onClose","onSave","onSaveFieldValue","fieldType","showFieldTypeTabs","textPlaceholder","initialFieldValue","rememberedByType","onRememberFill","drawingRef","lastPointRef","pathsRef","currentPathRef","reusedSignatureRef","resolvedFieldType","activeFieldType","setActiveFieldType","dateValue","setDateValue","setTextValue","mode","setMode","typedName","setTypedName","typedInitials","setTypedInitials","initialsTouched","setInitialsTouched","setTypeKind","inkColor","setInkColor","fontId","setFontId","fontsReady","setFontsReady","hasReusedSignature","setHasReusedSignature","selectedFont","previewText","fontPreviewLabel","_b","remembered","nextFont","reused","getPoint","handlePointerDown","pt","handlePointerMove","last","handlePointerUp","clearPad","handleNameChange","deriveInitials","trimAndSave","allPaths","minX","minY","pad","pathData","svg","dpr","measureCtx","metrics","canvasW","canvasH","outCanvas","outCtx","pngDataUrl","cssW","cssH","handleFieldValueSave","showSignPad","name","TOOLBAR_TOOL_ID","createToolbarTool","displayName","Tool","getToolbarToolId","tool","isToolbarTool","Navigation","Zoom","Rotate","Reload","Print","Open","Download","Highlight","Underline","Signature","AddText","Erase","Clear","ALL_TOOLBAR_TOOLS","DEFAULT_TOOLBAR_LAYOUT","MARKUP_TOOLS","isMarkupToolbarTool","renderToolbarTool","nodes","v","next","renderMarkupExtras","enabledIds","activeMarkupHex","setActiveMarkupHex","activePresets","preset","resolveToolbarLayout","enableToolbar","flags","toIds","side","showThumbnailsToggle","filterByFlag","tools","enabled","flagMap","PdfViewer","title","initialScale","withThumbnails","thumbnailWidth","maxThumbnails","enableThumbnails","enableNavigation","enableZoom","enableRotate","enableReload","enablePrint","enableOpen","enableDownload","enableMarkup","enableHighlight","enableUnderline","enableSignature","enableText","enableErase","enableClear","signatureFieldsProp","onSignatureComplete","onSignatureFieldsChange","applySignatureToSameTag","onFieldValueComplete","externalOpenSignaturePad","onSignaturePadClose","onSubmit","submitLabel","submitLoading","containerRef","lastBlobUrlRef","pageRefsRef","isProgrammaticScrollRef","binarySource","useMemo","resolvedUrl","status","setStatus","setPdfDoc","numPages","setNumPages","setPageNumber","setScale","setRotation","displayUrl","setDisplayUrl","showThumbnails","setShowThumbnails","isPrinting","setIsPrinting","isDownloading","setIsDownloading","setMarkupTool","setAnnotations","setSignatures","setTexts","signaturePadOpen","setSignaturePadOpen","signaturePadFieldType","setSignaturePadFieldType","setRememberedByType","setPendingSignature","setSelectedSignatureId","setSelectedSignatureFieldId","editingSignatureId","setEditingSignatureId","setSelectedTextId","selectedTextFieldId","setSelectedTextFieldId","setEditingTextId","highlightHex","setHighlightHex","underlineHex","setUnderlineHex","setFieldValues","setSignatureFields","signatureFieldsRef","isSignatureFieldFilled","useCallback","sigs","values","writeFieldValueToFields","fieldIds","idSet","prevValues","updated","writeSignatureImageToFields","signature","signaturesByFieldId","ids","toolbarSides","enabledToolIds","mq","apply","showHighlight","showUnderline","showSignature","showText","showErase","revokeDisplayUrl","loadDocument","buffer","blobUrl","scrollToPage","clamped","scrollToSignatureField","focusField","fieldEl","observer","entries","canGoPrev","canGoNext","handlePrev","handleNext","handleRotate","handleZoomOut","handleZoomIn","handleFitWidth","pagePadding","nextScale","run","onMq","fieldValueTexts","textsForExport","handlePrint","iframe","body","wrapper","handleDownload","pdfBytes","toggleMarkupTool","activeMarkupColor","selectedSignature","handleAddAnnotation","annotation","handleRemoveAnnotation","handleClearAnnotations","advanceToNextUnsignedField","fromFieldId","filledIds","currentIndex","nextField","handleOpenSignaturePad","handleFieldValueChange","handleFieldValueCommit","val","k","handleSignatureSave","imageDataUrl","targetField","targetFields","newSignatures","targetIds","byFieldId","currentPageEl","scrollContainer","visible","visibleTop","visibleBottom","visibleLeft","visibleRight","handleSaveFieldValue","nextValues","handleAddSignature","handleUpdateSignature","patch","handleRemoveSignature","removed","handleDuplicateSignature","pageWidth","pageHeight","duplicate","handleEditSignature","targetId","item","handleAddText","handleUpdateText","handleRemoveText","goToSignatureField","direction","from","nextIndex","rootStyle","toolbarCtx","visibleToolIds","currentFieldIndex","filledFieldCount","fieldProgressPercent","renderSide","alignEnd","index","showMarkupSep","type","fill","_","n","ThumbnailStrip","Document","_props","Page","View","Text","Image","Link","TYPE_MAP","getDisplayName","fn","flattenChildren","result","visit","collectText","child","elementToPdfNode","nodeType","childrenProp","childNodes","PAGE_SIZES","resolvePageSize","orientation","expandPadding","style","base","expandMargin","parseColor","input","raw","rgb","resolveLength","parent","fallback","pct","isBold","weight","DEFAULT_FONT_SIZE","DEFAULT_LINE_HEIGHT","AVG_CHAR_WIDTH","measureText","charWidth","words","word","candidate","widest","l","layoutNode","availableWidth","availableHeight","margin","outerX","outerY","contentWidth","innerWidth","measured","childBoxes","cursorX","usedMain","crossSize","remainingW","remainingH","contentHeight","finalWidth","justify","align","innerMain","freeSpace","mainOffset","betweenGap","running","layoutDocument","root","pageNode","contentRoot","escapePdfString","PdfWriter","__publicField","infoId","fontRegular","fontBold","contentStream","xrefOffset","pageStyle","ops","pageBg","drawBox","pdfY","border","paddingLeft","paddingTop","textX","lineWidth","textY","serializePdf","renderToBytes","tree","laidOut","pdf","toBlob","toUrl","download","renderToBuffer","renderToBlob"],"mappings":"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"}
1
+ {"version":3,"file":"epochs-pdf.js","sources":["../src/viewer/markup.ts","../src/viewer/signature.ts","../src/viewer/coords.ts","../src/viewer/text.ts","../src/viewer/icons.tsx","../src/viewer/PageCanvas.tsx","../src/viewer/Thumbnail.tsx","../src/viewer/load.ts","../src/viewer/exportPages.ts","../src/viewer/SignaturePad.tsx","../src/viewer/toolbarTools.ts","../src/viewer/ToolbarButtons.tsx","../src/viewer/PdfViewer.tsx","../src/components.tsx","../src/reconciler.ts","../src/utils.ts","../src/layout.ts","../src/pdf-writer.ts","../src/render.ts"],"sourcesContent":["export type MarkupKind = \"highlight\" | \"underline\" | \"redact\";\n\nexport type MarkupTool = \"none\" | MarkupKind | \"erase\" | \"sign\" | \"text\";\n\n/** Opaque cover used when removing existing PDF text. */\nexport const REDACT_COLOR = \"#ffffff\";\n\nexport interface MarkupRect {\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n w: number;\n h: number;\n}\n\nexport interface MarkupAnnotation {\n id: string;\n pageNumber: number;\n kind: MarkupKind;\n color: string;\n rects: MarkupRect[];\n text?: string;\n}\n\nexport interface MarkupColorOption {\n id: string;\n label: string;\n /** Solid hex used by the swatch / color input. */\n hex: string;\n}\n\nexport const HIGHLIGHT_PRESETS: MarkupColorOption[] = [\n { id: \"yellow\", label: \"Yellow\", hex: \"#facc15\" },\n { id: \"green\", label: \"Green\", hex: \"#4ade80\" },\n { id: \"pink\", label: \"Pink\", hex: \"#f472b6\" },\n { id: \"blue\", label: \"Blue\", hex: \"#60a5fa\" },\n { id: \"orange\", label: \"Orange\", hex: \"#fb923c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#c084fc\" },\n];\n\nexport const UNDERLINE_PRESETS: MarkupColorOption[] = [\n { id: \"blue\", label: \"Blue\", hex: \"#2563eb\" },\n { id: \"red\", label: \"Red\", hex: \"#dc2626\" },\n { id: \"green\", label: \"Green\", hex: \"#16a34a\" },\n { id: \"orange\", label: \"Orange\", hex: \"#ea580c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#7c3aed\" },\n { id: \"black\", label: \"Black\", hex: \"#111827\" },\n];\n\nexport const DEFAULT_HIGHLIGHT_HEX = HIGHLIGHT_PRESETS[0].hex;\nexport const DEFAULT_UNDERLINE_HEX = UNDERLINE_PRESETS[0].hex;\n\n/** Legacy defaults kept for callers. */\nexport const HIGHLIGHT_COLOR = hexToMarkupColor(DEFAULT_HIGHLIGHT_HEX, \"highlight\");\nexport const UNDERLINE_COLOR = DEFAULT_UNDERLINE_HEX;\n\nexport function createMarkupId(): string {\n return `m_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function normalizeHex(color: string): string {\n const value = color.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(value)) return value.toLowerCase();\n if (/^#[0-9a-fA-F]{3}$/.test(value)) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n return value;\n}\n\n/** Convert a solid hex into the CSS color used for drawing markup. */\nexport function hexToMarkupColor(hex: string, kind: MarkupKind, alpha = 0.45): string {\n const normalized = normalizeHex(hex);\n if (kind === \"underline\" || kind === \"redact\") return normalized;\n\n const match = /^#([0-9a-f]{6})$/i.exec(normalized);\n if (!match) return `rgba(250, 204, 21, ${alpha})`;\n\n const int = Number.parseInt(match[1], 16);\n const r = (int >> 16) & 255;\n const g = (int >> 8) & 255;\n const b = int & 255;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/** Best-effort extract of a #rrggbb value from a stored markup color. */\nexport function markupColorToHex(color: string, fallback: string): string {\n const normalized = normalizeHex(color);\n if (/^#[0-9a-f]{6}$/i.test(normalized)) return normalized.toLowerCase();\n\n const rgba = color.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (!rgba) return normalizeHex(fallback);\n\n const toHex = (n: string) =>\n Math.max(0, Math.min(255, Math.round(Number(n))))\n .toString(16)\n .padStart(2, \"0\");\n\n return `#${toHex(rgba[1])}${toHex(rgba[2])}${toHex(rgba[3])}`;\n}\n\n/** Collect selection client rects relative to a page surface, normalized to scale=1. */\nexport function selectionRectsForPage(\n pageSurface: HTMLElement,\n scale: number,\n): { rects: MarkupRect[]; text: string } | null {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n if (!pageSurface.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pageBox = pageSurface.getBoundingClientRect();\n const clientRects = Array.from(range.getClientRects()).filter(\n (r) => r.width > 0 && r.height > 0,\n );\n\n if (!clientRects.length) return null;\n\n const safeScale = scale || 1;\n const layoutW = pageSurface.clientWidth || pageBox.width;\n const layoutH = pageSurface.clientHeight || pageBox.height;\n const rects: MarkupRect[] = clientRects.map((r) => ({\n x: pageBox.width > 0 ? ((r.left - pageBox.left) / pageBox.width) * (layoutW / safeScale) : 0,\n y: pageBox.height > 0 ? ((r.top - pageBox.top) / pageBox.height) * (layoutH / safeScale) : 0,\n w: pageBox.width > 0 ? (r.width / pageBox.width) * (layoutW / safeScale) : 0,\n h: pageBox.height > 0 ? (r.height / pageBox.height) * (layoutH / safeScale) : 0,\n }));\n\n return { rects, text: selection.toString() };\n}\n\n/** Pick the top-left anchor for replacement text from selection rects. */\nexport function selectionStartPoint(\n rects: MarkupRect[],\n): { x: number; y: number; fontSize: number } {\n const sorted = [...rects].sort((a, b) => a.y - b.y || a.x - b.x);\n const first = sorted[0] ?? { x: 0, y: 0, w: 0, h: 14 };\n return {\n x: first.x,\n y: first.y,\n fontSize: Math.max(8, Math.round(first.h * 0.9) || 14),\n };\n}\n\n/** Slightly expand rects so redaction fully covers glyph ink. */\nexport function expandRedactRects(\n rects: MarkupRect[],\n padding = 2,\n): MarkupRect[] {\n return rects.map((rect) => ({\n x: Math.max(0, rect.x - padding),\n y: Math.max(0, rect.y - padding),\n w: rect.w + padding * 2,\n h: rect.h + padding * 2,\n }));\n}\n\n/** Draw highlight / underline annotations onto a canvas (rects are stored at scale = 1). */\nexport function drawMarkupOnCanvas(\n ctx: CanvasRenderingContext2D,\n annotations: MarkupAnnotation[],\n scale: number,\n): void {\n for (const ann of annotations) {\n for (const rect of ann.rects) {\n const x = rect.x * scale;\n const y = rect.y * scale;\n const w = rect.w * scale;\n const h = rect.h * scale;\n\n if (ann.kind === \"highlight\") {\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y, w, h);\n ctx.restore();\n } else if (ann.kind === \"redact\") {\n ctx.fillStyle = ann.color || REDACT_COLOR;\n ctx.fillRect(x, y, w, h);\n } else {\n const thickness = Math.max(2, scale * 1.5);\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y + h - thickness, w, thickness);\n }\n }\n }\n}\n\n","export interface SignatureAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Top-left X in page CSS pixels at scale = 1. */\n x: number;\n /** Top-left Y in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n /** PNG data URL of the signature ink. */\n imageDataUrl: string;\n}\n\nexport type SignatureFieldType = \"sign\" | \"date\" | \"text\";\n\nexport interface SignatureField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Field behavior: \"sign\" (default), \"date\" (date picker), or \"text\" (text input). */\n type?: SignatureFieldType;\n /** Placeholder text for \"text\" type fields. */\n placeholder?: string;\n /**\n * Optional group key. When `applySignatureToSameTag` is enabled on the viewer,\n * one signature fills every field that shares this tag.\n */\n signature_tag?: string;\n /** Filled signature image (data URL) after the user signs this field. */\n signatureDataUrl?: string;\n /** Plain text / date string when `type` is `\"text\"` or `\"date\"`. */\n value?: string;\n}\n\nexport function createSignatureId(): string {\n return `s_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport async function drawSignaturesOnCanvas(\n ctx: CanvasRenderingContext2D,\n signatures: SignatureAnnotation[],\n scale: number,\n): Promise<void> {\n for (const sig of signatures) {\n const img = await loadImage(sig.imageDataUrl);\n ctx.drawImage(\n img,\n sig.x * scale,\n sig.y * scale,\n sig.width * scale,\n sig.height * scale,\n );\n }\n}\n\nexport function drawSignatureFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: SignatureField[],\n signedFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = signedFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(29, 78, 216, 0.08)\"\n : \"rgba(29, 78, 216, 0.18)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(29, 78, 216, 0.45)\"\n : \"#1d4ed8\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"Failed to load signature image\"));\n img.src = src;\n });\n}\n\n/** Fit a drawn signature canvas into a target box while keeping aspect ratio. */\nexport function signatureDisplaySize(\n sourceWidth: number,\n sourceHeight: number,\n maxWidth = 180,\n maxHeight = 64,\n): { width: number; height: number } {\n if (sourceWidth <= 0 || sourceHeight <= 0) {\n return { width: maxWidth, height: maxHeight };\n }\n const ratio = Math.min(maxWidth / sourceWidth, maxHeight / sourceHeight);\n return {\n width: Math.max(40, sourceWidth * ratio),\n height: Math.max(20, sourceHeight * ratio),\n };\n}\n","/**\n * Browser zoom changes getBoundingClientRect() but not clientWidth/clientHeight.\n * Convert viewport client coordinates into page CSS pixels at scale = 1.\n */\nexport function clientPointToPage(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n scale: number,\n): { x: number; y: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { x: 0, y: 0 };\n }\n return {\n x: ((clientX - box.left) / box.width) * (layoutW / scale),\n y: ((clientY - box.top) / box.height) * (layoutH / scale),\n };\n}\n\n/** Page size in CSS pixels at scale = 1. */\nexport function pageSizeFromSurface(\n surface: HTMLElement,\n scale: number,\n): { width: number; height: number } {\n return {\n width: surface.clientWidth / scale,\n height: surface.clientHeight / scale,\n };\n}\n\n/**\n * Convert a viewport delta (e.g. drag/resize) into page CSS pixels at scale = 1,\n * compensating for browser zoom.\n */\nexport function clientDeltaToPage(\n deltaX: number,\n deltaY: number,\n surface: HTMLElement,\n scale: number,\n): { dx: number; dy: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { dx: 0, dy: 0 };\n }\n return {\n dx: (deltaX / box.width) * (layoutW / scale),\n dy: (deltaY / box.height) * (layoutH / scale),\n };\n}\n\n/** Map a viewport Y (or rect edge) relative to surface into page coords at scale = 1. */\nexport function viewportRectToPage(\n viewport: DOMRect,\n surface: HTMLElement,\n scale: number,\n): { left: number; top: number; right: number; bottom: number } {\n const surfaceRect = surface.getBoundingClientRect();\n const { width: pageW, height: pageH } = pageSizeFromSurface(surface, scale);\n if (surfaceRect.width <= 0 || surfaceRect.height <= 0) {\n return { left: 0, top: 0, right: pageW, bottom: pageH };\n }\n return {\n left: ((viewport.left - surfaceRect.left) / surfaceRect.width) * pageW,\n top: ((viewport.top - surfaceRect.top) / surfaceRect.height) * pageH,\n right: ((viewport.right - surfaceRect.left) / surfaceRect.width) * pageW,\n bottom: ((viewport.bottom - surfaceRect.top) / surfaceRect.height) * pageH,\n };\n}\n","export interface TextField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Shown when the field is empty. */\n placeholder?: string;\n /** Font size at scale = 1. Default 14. */\n fontSize?: number;\n /** CSS color. Default #111827. */\n color?: string;\n}\n\nexport interface TextAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n value: string;\n fontSize: number;\n color: string;\n}\n\nexport const DEFAULT_TEXT_FONT_SIZE = 14;\nexport const DEFAULT_TEXT_COLOR = \"#111827\";\nexport const MIN_TEXT_WIDTH = 24;\nexport const MIN_TEXT_HEIGHT = 20;\n\nexport function createTextId(): string {\n return `t_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function measureInlineText(\n value: string,\n fontSize: number,\n): { width: number; height: number } {\n if (typeof document === \"undefined\") {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n ctx.font = `${fontSize}px sans-serif`;\n const lines = value.split(\"\\n\");\n const lineHeight = fontSize * 1.25;\n let maxWidth = MIN_TEXT_WIDTH;\n\n for (const line of lines) {\n maxWidth = Math.max(maxWidth, ctx.measureText(line || \" \").width + 4);\n }\n\n return {\n width: maxWidth,\n height: Math.max(MIN_TEXT_HEIGHT, lines.length * lineHeight),\n };\n}\n\n/** Resolve where inline text should start from a click on/near PDF text. */\nexport function resolveInlineTextPoint(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n textLayer: HTMLElement,\n scale: number,\n): { x: number; y: number; fontSize: number } {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || surfaceBox.width;\n const layoutH = surface.clientHeight || surfaceBox.height;\n const toPageX = (client: number) =>\n surfaceBox.width > 0\n ? ((client - surfaceBox.left) / surfaceBox.width) * (layoutW / scale)\n : 0;\n const toPageY = (client: number) =>\n surfaceBox.height > 0\n ? ((client - surfaceBox.top) / surfaceBox.height) * (layoutH / scale)\n : 0;\n const toPageSize = (clientSize: number, axis: \"x\" | \"y\") => {\n const boxSize = axis === \"x\" ? surfaceBox.width : surfaceBox.height;\n const layout = axis === \"x\" ? layoutW : layoutH;\n return boxSize > 0 ? (clientSize / boxSize) * (layout / scale) : 0;\n };\n\n // Default: exact click position (works for gaps between words)\n let x = toPageX(clientX);\n let y = toPageY(clientY);\n let fontSize = DEFAULT_TEXT_FONT_SIZE;\n\n // Prefer a gap between two spans on the same line (e.g. between \"this\" and \"PDF\")\n const gap = findGapBetweenSpans(clientX, clientY, textLayer);\n if (gap) {\n return {\n x: toPageX(gap.x),\n y: toPageY(gap.y),\n fontSize: Math.max(8, Math.round(toPageSize(gap.fontSize, \"y\") * 10) / 10),\n };\n }\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (range && textLayer.contains(range.startContainer)) {\n const rects = range.getClientRects();\n const rect = rects.length > 0 ? rects[0] : range.getBoundingClientRect();\n if (rect.height > 0) {\n // Keep the clicked X (insert point), snap Y/size to the line\n y = toPageY(rect.top);\n fontSize = inferFontSizeFromNode(range.startContainer, scale, surface);\n // If caret snapped to a glyph edge, use that X for cleaner alignment\n const caretX = toPageX(rect.left);\n if (Math.abs(caretX - x) < toPageSize(8, \"x\")) {\n x = caretX;\n }\n return { x, y, fontSize };\n }\n }\n\n const nearest = findNearestSpanOnLine(clientX, clientY, textLayer);\n if (nearest) {\n y = toPageY(nearest.top);\n fontSize = Math.max(8, Math.round(toPageSize(nearest.height, \"y\") * 10) / 10);\n }\n\n return { x, y, fontSize };\n}\n\n/** Find a click that lands in the horizontal gap between two word spans. */\nfunction findGapBetweenSpans(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { x: number; y: number; fontSize: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n if (spans.length < 2) return null;\n\n type SpanBox = { left: number; right: number; top: number; bottom: number; height: number };\n const boxes: SpanBox[] = [];\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n // Same visual line as the click\n if (clientY < box.top - 4 || clientY > box.bottom + 4) continue;\n boxes.push({\n left: box.left,\n right: box.right,\n top: box.top,\n bottom: box.bottom,\n height: box.height,\n });\n }\n\n boxes.sort((a, b) => a.left - b.left);\n\n for (let i = 0; i < boxes.length - 1; i += 1) {\n const left = boxes[i];\n const right = boxes[i + 1];\n const gapStart = left.right;\n const gapEnd = right.left;\n if (gapEnd - gapStart < 1) continue;\n if (clientX >= gapStart - 2 && clientX <= gapEnd + 2) {\n return {\n x: clientX,\n y: Math.min(left.top, right.top),\n fontSize: Math.min(left.height, right.height),\n };\n }\n }\n\n return null;\n}\n\nfunction findNearestSpanOnLine(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { top: number; height: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n\n let best: { top: number; height: number; dist: number } | null = null;\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n if (clientY < box.top - 6 || clientY > box.bottom + 6) continue;\n\n const midX = (box.left + box.right) / 2;\n const dist = Math.abs(clientX - midX);\n if (!best || dist < best.dist) {\n best = { top: box.top, height: box.height, dist };\n }\n }\n\n return best ? { top: best.top, height: best.height } : null;\n}\n\nfunction inferFontSizeFromNode(\n node: Node,\n scale: number,\n surface?: HTMLElement,\n): number {\n const element =\n node.nodeType === Node.ELEMENT_NODE\n ? (node as HTMLElement)\n : node.parentElement;\n if (element) return inferFontSizeFromElement(element, scale, surface);\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nfunction inferFontSizeFromElement(\n element: HTMLElement,\n scale: number,\n surface?: HTMLElement,\n): number {\n const height = element.getBoundingClientRect().height;\n if (height > 0) {\n if (surface) {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutH = surface.clientHeight || surfaceBox.height;\n if (surfaceBox.height > 0) {\n return Math.max(\n 8,\n Math.round(((height / surfaceBox.height) * (layoutH / scale)) * 10) / 10,\n );\n }\n }\n return Math.max(8, Math.round((height / scale) * 10) / 10);\n }\n\n const computed = window.getComputedStyle(element).fontSize;\n const parsed = Number.parseFloat(computed);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.max(8, Math.round((parsed / scale) * 10) / 10);\n }\n\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nexport function findTextFieldAtPoint(\n x: number,\n y: number,\n fields: TextField[],\n pageNumber: number,\n): TextField | null {\n for (const field of fields) {\n if (field.pageNumber !== pageNumber) continue;\n if (\n x >= field.x &&\n x <= field.x + field.width &&\n y >= field.y &&\n y <= field.y + field.height\n ) {\n return field;\n }\n }\n return null;\n}\n\n/** Select the word under a point in the PDF text layer (browser selection). */\nexport function selectWordAtPoint(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement | null,\n): string | null {\n if (!textLayer) return null;\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (!range || !textLayer.contains(range.startContainer)) return null;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE || !node.textContent) return null;\n\n const text = node.textContent;\n let offset = range.startOffset;\n offset = Math.min(Math.max(0, offset), text.length);\n\n const isWordChar = (ch: string) => /[\\p{L}\\p{N}_'-]/u.test(ch);\n let start = offset;\n let end = offset;\n\n while (start > 0 && isWordChar(text[start - 1]!)) start -= 1;\n while (end < text.length && isWordChar(text[end]!)) end += 1;\n\n if (start === end) return null;\n\n const wordRange = document.createRange();\n wordRange.setStart(node, start);\n wordRange.setEnd(node, end);\n\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(wordRange);\n\n return text.slice(start, end);\n}\n\nexport function drawTextsOnCanvas(\n ctx: CanvasRenderingContext2D,\n texts: TextAnnotation[],\n scale: number,\n): void {\n ctx.save();\n for (const text of texts) {\n if (!text.value.trim()) continue;\n\n const x = text.x * scale;\n const y = text.y * scale;\n const fontSize = Math.max(8, text.fontSize * scale);\n\n ctx.fillStyle = text.color;\n ctx.font = `${fontSize}px sans-serif`;\n ctx.textBaseline = \"top\";\n\n const lineHeight = fontSize * 1.25;\n const lines = text.value.split(\"\\n\");\n let cursorY = y;\n\n for (const line of lines) {\n ctx.fillText(line, x, cursorY);\n cursorY += lineHeight;\n }\n }\n ctx.restore();\n}\n\nexport function drawTextFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: TextField[],\n filledFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = filledFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(5, 150, 105, 0.08)\"\n : \"rgba(5, 150, 105, 0.16)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(5, 150, 105, 0.45)\"\n : \"#059669\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n","import type { ReactNode } from \"react\";\n\ntype IconProps = {\n size?: number;\n className?: string;\n};\n\nfunction Icon({\n size = 14,\n className,\n children,\n}: IconProps & { children: ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"15 18 9 12 15 6\" />\n </Icon>\n );\n}\n\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"9 18 15 12 9 6\" />\n </Icon>\n );\n}\n\nexport function DownloadIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function GridIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </Icon>\n );\n}\n\nexport function MinusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PlusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PrinterIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"6 9 6 2 18 2 18 9\" />\n <path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\" />\n <rect x=\"6\" y=\"14\" width=\"12\" height=\"8\" />\n </Icon>\n );\n}\n\nexport function RefreshIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </Icon>\n );\n}\n\nexport function RotateIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </Icon>\n );\n}\n\nexport function HighlightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function UnderlineIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M6 3v7a6 6 0 0 0 12 0V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </Icon>\n );\n}\n\nexport function EraserIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\" />\n <path d=\"M22 21H7\" />\n <path d=\"m5 11 9 9\" />\n </Icon>\n );\n}\n\nexport function SignatureIcon({ size = 16, className }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"12\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M232,172H57.32c4-7.83,8.18-16.11,12.21-24.56,15.14,3.55,34.13-8.06,56.54-34.59,3.67,12.5,12.53,34.83,29.08,35.15h.35c8.71,0,17.64-6.25,27.16-19.06C187.17,137.14,199.31,148,232,148a4,4,0,0,0,0-8c-42.88,0-44-19.24-44-20a4,4,0,0,0-7.35-2.18C168.74,136.1,160.42,140,155.48,140h-.18c-13-.25-21.29-26.52-23.38-36.61a4,4,0,0,0-7-1.69c-20.94,26.27-39.06,39.55-51.8,38.2C97.31,87.5,105.19,53.16,96.49,37.77,94,33.31,88.7,28,77.91,28,64.09,28,52.54,42.41,47,66.54A122.7,122.7,0,0,0,45.46,113c2.64,15.29,8.39,26.05,16.69,31.35-4.58,9.6-9.3,19-13.84,27.68H24a4,4,0,0,0,0,8H44.1c-12.87,24.17-23.37,41.68-23.53,41.94a4,4,0,0,0,1.37,5.49A3.93,3.93,0,0,0,24,228a4,4,0,0,0,3.43-1.94c.16-.27,11.85-19.75,25.72-46.06H232a4,4,0,0,0,0-8ZM53.34,111.61a114.81,114.81,0,0,1,1.49-43.29C58.4,52.7,66.34,36,77.91,36c7.52,0,10.23,3.26,11.61,5.7C99,58.4,79.92,106,65.6,137,59.76,132.69,55.46,123.83,53.34,111.61Z\" />\n </svg>\n );\n}\n\nexport function PencilIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function TextIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\n </Icon>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { TextLayer } from \"pdfjs-dist\";\nimport type { PdfDoc } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport { createMarkupId, expandRedactRects, REDACT_COLOR, selectionRectsForPage, selectionStartPoint } from \"./markup\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId } from \"./signature\";\nimport {\n clientDeltaToPage,\n clientPointToPage,\n pageSizeFromSurface,\n} from \"./coords\";\nimport type { TextAnnotation, TextField } from \"./text\";\nimport {\n createTextId,\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n findTextFieldAtPoint,\n measureInlineText,\n resolveInlineTextPoint,\n selectWordAtPoint,\n} from \"./text\";\nimport { PencilIcon } from \"./icons\";\n\ninterface PageCanvasProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n scale: number;\n rotation: number;\n pageRef?: (el: HTMLDivElement | null) => void;\n onRendered?: (pageNumber: number) => void;\n markupTool?: MarkupTool;\n markupColor?: string;\n annotations?: MarkupAnnotation[];\n onAddAnnotation?: (annotation: MarkupAnnotation) => void;\n onRemoveAnnotation?: (id: string) => void;\n signatures?: SignatureAnnotation[];\n pendingSignature?: { imageDataUrl: string; width: number; height: number } | null;\n onAddSignature?: (signature: SignatureAnnotation) => void;\n onUpdateSignature?: (id: string, patch: Partial<SignatureAnnotation>) => void;\n onRemoveSignature?: (id: string) => void;\n onEditSignature?: (id: string) => void;\n onDuplicateSignature?: (id: string) => void;\n selectedSignatureId?: string | null;\n onSelectSignature?: (id: string | null) => void;\n signatureFields?: SignatureField[];\n selectedSignatureFieldId?: string | null;\n onSelectSignatureField?: (id: string | null) => void;\n hasFixedSignatureFields?: boolean;\n onOpenSignaturePad?: (fieldType?: import(\"./signature\").SignatureFieldType) => void;\n /** Values for date/text fixed fields, keyed by field id. */\n fieldValues?: Record<string, string>;\n onFieldValueChange?: (fieldId: string, value: string) => void;\n onFieldValueCommit?: (fieldId: string) => void;\n pendingFieldValue?: { type: \"date\" | \"text\"; value: string } | null;\n onPlaceFieldValue?: (pageNumber: number, x: number, y: number) => void;\n texts?: TextAnnotation[];\n onAddText?: (text: TextAnnotation) => void;\n onUpdateText?: (id: string, patch: Partial<TextAnnotation>) => void;\n onRemoveText?: (id: string) => void;\n selectedTextId?: string | null;\n onSelectText?: (id: string | null) => void;\n textFields?: TextField[];\n selectedTextFieldId?: string | null;\n onSelectTextField?: (id: string | null) => void;\n hasFixedTextFields?: boolean;\n editingTextId?: string | null;\n onEditingTextIdChange?: (id: string | null) => void;\n}\n\nexport function PageCanvas({\n pdfDoc,\n pageNumber,\n scale,\n rotation,\n pageRef,\n onRendered,\n markupTool = \"none\",\n markupColor,\n annotations = [],\n onAddAnnotation,\n onRemoveAnnotation,\n signatures = [],\n pendingSignature = null,\n onAddSignature,\n onUpdateSignature,\n onRemoveSignature,\n onEditSignature,\n onDuplicateSignature,\n selectedSignatureId = null,\n onSelectSignature,\n signatureFields = [],\n selectedSignatureFieldId = null,\n onSelectSignatureField,\n hasFixedSignatureFields = false,\n onOpenSignaturePad,\n fieldValues = {},\n onFieldValueChange: _onFieldValueChange,\n onFieldValueCommit: _onFieldValueCommit,\n pendingFieldValue = null,\n onPlaceFieldValue,\n texts = [],\n onAddText,\n onUpdateText,\n onRemoveText,\n selectedTextId = null,\n onSelectText,\n textFields = [],\n selectedTextFieldId: _selectedTextFieldId = null,\n onSelectTextField,\n hasFixedTextFields = false,\n editingTextId = null,\n onEditingTextIdChange,\n}: PageCanvasProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const renderTaskRef = useRef<RenderTask | null>(null);\n const textLayerInstanceRef = useRef<TextLayer | null>(null);\n const [dragState, setDragState] = useState<\n | { kind: \"signature\"; id: string; offsetX: number; offsetY: number }\n | { kind: \"resize\"; id: string; startX: number; startY: number; startW: number; startH: number }\n | null\n >(null);\n const inlineEditRef = useRef<HTMLSpanElement>(null);\n const justOpenedEditorRef = useRef(false);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current || !textLayerRef.current || !surfaceRef.current) {\n return;\n }\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const textLayerDiv = textLayerRef.current;\n const surface = surfaceRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const render = async () => {\n try {\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewport = page.getViewport({ scale, rotation });\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n\n canvas.width = width;\n canvas.height = height;\n surface.style.width = `${width}px`;\n surface.style.height = `${height}px`;\n\n const task = page.render({ canvasContext: ctx, viewport });\n renderTaskRef.current = task;\n await task.promise;\n if (cancelled) return;\n\n textLayerDiv.replaceChildren();\n textLayerDiv.style.setProperty(\"--scale-factor\", String(viewport.scale));\n\n const textContent = await page.getTextContent();\n if (cancelled) return;\n\n const textLayer = new TextLayer({\n textContentSource: textContent,\n container: textLayerDiv,\n viewport,\n });\n textLayerInstanceRef.current = textLayer;\n await textLayer.render();\n if (cancelled) return;\n\n onRendered?.(pageNumber);\n } catch {\n // ignore (often cancellation)\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n };\n }, [pdfDoc, pageNumber, scale, rotation, onRendered]);\n\n useEffect(() => {\n const surface = surfaceRef.current;\n if (!surface) return;\n\n const applySelectionMarkup = (kind: \"highlight\" | \"underline\" | \"redact\") => {\n if (!onAddAnnotation) return false;\n\n const color =\n kind === \"redact\"\n ? REDACT_COLOR\n : markupColor;\n if (!color) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects =\n kind === \"redact\"\n ? expandRedactRects(captured.rects)\n : captured.rects;\n\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind,\n color,\n rects,\n text: captured.text,\n });\n\n window.getSelection()?.removeAllRanges();\n return true;\n };\n\n const replaceSelectedPdfText = (initialValue: string) => {\n if (!onAddAnnotation || !onAddText) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects = expandRedactRects(captured.rects);\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects,\n text: captured.text,\n });\n\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(initialValue || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: initialValue,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n window.setTimeout(() => {\n justOpenedEditorRef.current = false;\n }, 0);\n return true;\n };\n\n const handleMouseUp = () => {\n if (markupTool === \"highlight\" || markupTool === \"underline\") {\n applySelectionMarkup(markupTool);\n return;\n }\n // Erase tool: select PDF words to cover/remove them\n if (markupTool === \"erase\") {\n applySelectionMarkup(\"redact\");\n return;\n }\n // Text tool: select existing PDF text → open it for editing\n if (markupTool === \"text\") {\n const selection = window.getSelection();\n if (\n selection &&\n !selection.isCollapsed &&\n selection.toString().trim() &&\n selection.anchorNode &&\n surface.contains(selection.anchorNode)\n ) {\n replaceSelectedPdfText(selection.toString());\n }\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target?.closest(\"[contenteditable='true']\") ||\n target?.closest(\"[contenteditable='']\") ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const selection = window.getSelection();\n const hasPdfSelection =\n selection != null &&\n !selection.isCollapsed &&\n selection.toString().trim().length > 0 &&\n selection.anchorNode != null &&\n surface.contains(selection.anchorNode);\n\n if (markupTool === \"text\" && hasPdfSelection) {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n replaceSelectedPdfText(selection!.toString());\n return;\n }\n\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n event.preventDefault();\n replaceSelectedPdfText(event.key);\n return;\n }\n }\n\n if (markupTool !== \"text\" && markupTool !== \"erase\") return;\n if (event.key !== \"Backspace\" && event.key !== \"Delete\") return;\n\n if (!hasPdfSelection) return;\n\n event.preventDefault();\n applySelectionMarkup(\"redact\");\n };\n\n surface.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n surface.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n markupTool,\n markupColor,\n onAddAnnotation,\n onAddText,\n onEditingTextIdChange,\n onSelectText,\n pageNumber,\n scale,\n ]);\n\n useEffect(() => {\n if (!dragState) return;\n\n let rafId = 0;\n let lastClientX = 0;\n let lastClientY = 0;\n let scrollDir = 0; // -1 up, 1 down, 0 none\n\n const getScrollContainer = (): HTMLElement | null => {\n return (\n wrapRef.current?.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null\n );\n };\n\n const updateResizeAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"resize\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n const surface = surfaceRef.current;\n const pageSize = surface\n ? pageSizeFromSurface(surface, scale)\n : { width: Infinity, height: Infinity };\n const { dx, dy } = surface\n ? clientDeltaToPage(\n clientX - dragState.startX,\n clientY - dragState.startY,\n surface,\n scale,\n )\n : { dx: 0, dy: 0 };\n\n const maxW = pageSize.width - sig.x;\n const maxH = pageSize.height - sig.y;\n const newW = Math.min(maxW, Math.max(40, dragState.startW + dx));\n const newH = Math.min(maxH, Math.max(20, dragState.startH + dy));\n onUpdateSignature(dragState.id, { width: newW, height: newH });\n };\n\n const updateSignatureAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"signature\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n // Prefer element under cursor; fall back to previous page when over empty gutter\n let pageEl = document\n .elementFromPoint(clientX, clientY)\n ?.closest(\"[data-page-number]\") as HTMLElement | null;\n\n if (!pageEl) {\n const pages = Array.from(\n document.querySelectorAll(\".epochs-pdf-viewer__page[data-page-number]\"),\n ) as HTMLElement[];\n pageEl =\n pages.find((page) => {\n const box = page.getBoundingClientRect();\n return clientY >= box.top && clientY <= box.bottom;\n }) ?? null;\n }\n\n if (!pageEl) {\n pageEl = wrapRef.current;\n }\n if (!pageEl) return;\n\n const surface = pageEl.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n if (!surface) return;\n\n const targetPage = Number.parseInt(\n pageEl.getAttribute(\"data-page-number\") || String(sig.pageNumber),\n 10,\n );\n\n const point = clientPointToPage(clientX, clientY, surface, scale);\n const pageSize = pageSizeFromSurface(surface, scale);\n let nextX = point.x - dragState.offsetX;\n let nextY = point.y - dragState.offsetY;\n const maxX = Math.max(0, pageSize.width - sig.width);\n const maxY = Math.max(0, pageSize.height - sig.height);\n nextX = Math.min(Math.max(0, nextX), maxX);\n nextY = Math.min(Math.max(0, nextY), maxY);\n\n onUpdateSignature(dragState.id, {\n pageNumber: targetPage,\n x: nextX,\n y: nextY,\n });\n };\n\n const tickScroll = () => {\n rafId = 0;\n if (!scrollDir) return;\n\n const container = getScrollContainer();\n if (!container) return;\n\n const maxScroll = container.scrollHeight - container.clientHeight;\n if (maxScroll <= 0) return;\n\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = lastClientY - box.top;\n const distBottom = box.bottom - lastClientY;\n\n let speed = 0;\n if (scrollDir < 0 && distTop < edge) {\n speed = -Math.max(6, ((edge - distTop) / edge) * 28);\n } else if (scrollDir > 0 && distBottom < edge) {\n speed = Math.max(6, ((edge - distBottom) / edge) * 28);\n } else {\n scrollDir = 0;\n return;\n }\n\n const prev = container.scrollTop;\n container.scrollTop = Math.min(maxScroll, Math.max(0, prev + speed));\n\n if (container.scrollTop !== prev) {\n updateSignatureAtPoint(lastClientX, lastClientY);\n }\n\n if (\n (speed < 0 && container.scrollTop > 0) ||\n (speed > 0 && container.scrollTop < maxScroll)\n ) {\n rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n };\n\n const handleMove = (event: PointerEvent) => {\n lastClientX = event.clientX;\n lastClientY = event.clientY;\n\n const container = getScrollContainer();\n if (container) {\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = event.clientY - box.top;\n const distBottom = box.bottom - event.clientY;\n\n if (distTop < edge) {\n scrollDir = -1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else if (distBottom < edge) {\n scrollDir = 1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n }\n\n if (dragState.kind === \"resize\") {\n updateResizeAtPoint(event.clientX, event.clientY);\n } else {\n updateSignatureAtPoint(event.clientX, event.clientY);\n }\n };\n\n const handleUp = () => {\n scrollDir = 0;\n if (rafId) {\n window.cancelAnimationFrame(rafId);\n rafId = 0;\n }\n setDragState(null);\n };\n\n window.addEventListener(\"pointermove\", handleMove);\n window.addEventListener(\"pointerup\", handleUp);\n window.addEventListener(\"pointercancel\", handleUp);\n return () => {\n scrollDir = 0;\n if (rafId) window.cancelAnimationFrame(rafId);\n window.removeEventListener(\"pointermove\", handleMove);\n window.removeEventListener(\"pointerup\", handleUp);\n window.removeEventListener(\"pointercancel\", handleUp);\n };\n }, [\n dragState,\n hasFixedSignatureFields,\n onUpdateSignature,\n scale,\n signatures,\n ]);\n\n useEffect(() => {\n if (!editingTextId || !inlineEditRef.current) return;\n const el = inlineEditRef.current;\n const current = texts.find((t) => t.id === editingTextId);\n // Uncontrolled while editing — set DOM text once so React won't reset the caret\n el.textContent = current?.value ?? \"\";\n el.focus();\n\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n // Only re-run when the edit session starts, not on every keystroke\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editingTextId]);\n\n const setRefs = (el: HTMLDivElement | null) => {\n wrapRef.current = el;\n pageRef?.(el);\n };\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter((f) => f.pageNumber === pageNumber);\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n\n const commitInlineText = (text: TextAnnotation, value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n onRemoveText?.(text.id);\n onEditingTextIdChange?.(null);\n return;\n }\n\n const size = measureInlineText(trimmed, text.fontSize);\n onUpdateText?.(text.id, {\n value: trimmed,\n width: size.width,\n height: size.height,\n });\n onEditingTextIdChange?.(null);\n };\n\n const beginInlineTextAt = (clientX: number, clientY: number) => {\n if (!onAddText) return;\n\n const surface = surfaceRef.current;\n const textLayer = textLayerRef.current;\n if (!surface || !textLayer) return;\n\n let point = resolveInlineTextPoint(\n clientX,\n clientY,\n surface,\n textLayer,\n scale,\n );\n\n let fieldId: string | undefined;\n let color = DEFAULT_TEXT_COLOR;\n\n if (hasFixedTextFields) {\n const field = findTextFieldAtPoint(\n point.x,\n point.y,\n textFields,\n pageNumber,\n );\n if (!field) return;\n\n const existing = texts.find((t) => t.fieldId === field.id);\n if (existing) {\n onSelectText?.(existing.id);\n onSelectTextField?.(field.id);\n onEditingTextIdChange?.(existing.id);\n return;\n }\n\n fieldId = field.id;\n point = {\n x: field.x,\n y: field.y,\n fontSize: field.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n };\n color = field.color ?? DEFAULT_TEXT_COLOR;\n onSelectTextField?.(field.id);\n }\n\n const size = measureInlineText(\"\", point.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n fieldId,\n pageNumber,\n x: point.x,\n y: point.y,\n width: size.width,\n height: size.height,\n value: \"\",\n fontSize: point.fontSize,\n color,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n };\n\n const handleInlineTextClick = (event: React.MouseEvent<HTMLElement>) => {\n if (markupTool !== \"text\") return;\n if ((event.target as HTMLElement).closest(\".epochs-pdf-viewer__inline-text\")) {\n return;\n }\n // Skip the click that follows a select-to-edit mouseup\n if (justOpenedEditorRef.current) {\n justOpenedEditorRef.current = false;\n return;\n }\n\n // Selecting existing PDF words opens the editor on mouseup — don't insert here\n const selection = window.getSelection();\n if (selection && !selection.isCollapsed && selection.toString().trim()) {\n return;\n }\n\n // Double-click: select the word under the cursor and edit it\n if (event.detail >= 2) {\n const word = selectWordAtPoint(event.clientX, event.clientY, textLayerRef.current);\n if (word) {\n // mouseup already ran; open editor from the new word selection\n const surface = surfaceRef.current;\n if (surface && onAddAnnotation && onAddText) {\n const captured = selectionRectsForPage(surface, scale);\n if (captured) {\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects: expandRedactRects(captured.rects),\n text: captured.text,\n });\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(captured.text || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: captured.text,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n }\n }\n return;\n }\n }\n\n event.stopPropagation();\n beginInlineTextAt(event.clientX, event.clientY);\n };\n\n const handleSurfaceClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\".epochs-pdf-viewer__signature\") ||\n target.closest(\".epochs-pdf-viewer__signature-field\") ||\n target.closest(\".epochs-pdf-viewer__inline-text\")\n ) {\n return;\n }\n\n if (markupTool === \"text\") {\n beginInlineTextAt(event.clientX, event.clientY);\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingFieldValue &&\n onPlaceFieldValue\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n onPlaceFieldValue(pageNumber, Math.max(0, point.x - 75), Math.max(0, point.y - 12));\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingSignature &&\n onAddSignature\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const pageSize = pageSizeFromSurface(surface, scale);\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n\n let x = point.x - pendingSignature.width / 2;\n let y = point.y - pendingSignature.height / 2;\n\n const maxX = Math.max(0, pageSize.width - pendingSignature.width);\n const maxY = Math.max(0, pageSize.height - pendingSignature.height);\n x = Math.min(Math.max(0, x), maxX);\n y = Math.min(Math.max(0, y), maxY);\n\n onAddSignature({\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: pendingSignature.width,\n height: pendingSignature.height,\n imageDataUrl: pendingSignature.imageDataUrl,\n });\n return;\n }\n };\n\n const renderInlineText = (text: TextAnnotation) => {\n const isEditing = editingTextId === text.id;\n\n if (isEditing) {\n return (\n <span\n key={text.id}\n ref={inlineEditRef}\n contentEditable\n suppressContentEditableWarning\n role=\"textbox\"\n aria-label=\"Edit text\"\n className=\"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--editing\"\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n minWidth: Math.max(12, text.fontSize * scale * 0.5),\n width: Math.max(text.width * scale, text.fontSize * scale * 0.5),\n }}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onInput={(e) => {\n const value = e.currentTarget.textContent ?? \"\";\n const size = measureInlineText(value || \" \", text.fontSize);\n // Update metrics only — do not write value back into the DOM\n onUpdateText?.(text.id, {\n value,\n width: size.width,\n height: size.height,\n });\n }}\n onBlur={(e) => {\n commitInlineText(text, e.currentTarget.textContent ?? \"\");\n }}\n onKeyDown={(e) => {\n // Keep spaces / typing local to this editor\n e.stopPropagation();\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n }}\n />\n );\n }\n\n if (!text.value.trim()) return null;\n\n return (\n <span\n key={text.id}\n className={\n selectedTextId === text.id\n ? \"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--selected\"\n : \"epochs-pdf-viewer__inline-text\"\n }\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (markupTool === \"erase\") {\n onRemoveText?.(text.id);\n return;\n }\n if (markupTool === \"text\") {\n onSelectText?.(text.id);\n onEditingTextIdChange?.(text.id);\n }\n }}\n >\n {text.value}\n </span>\n );\n };\n\n return (\n <div\n ref={setRefs}\n data-page-number={pageNumber}\n className=\"epochs-pdf-viewer__page\"\n >\n <div\n ref={surfaceRef}\n className={`epochs-pdf-viewer__surface epochs-pdf-viewer__surface--tool-${markupTool}`}\n onClick={handleSurfaceClick}\n >\n <canvas ref={canvasRef} className=\"epochs-pdf-viewer__canvas\" />\n\n <div className=\"epochs-pdf-viewer__markup-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? null\n : ann.rects.map((rect, idx) => {\n if (ann.kind === \"highlight\") {\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--highlight\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }\n\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--underline\"\n style={{\n left: rect.x * scale,\n top: (rect.y + rect.h) * scale - Math.max(2, scale * 1.5),\n width: rect.w * scale,\n height: Math.max(2, scale * 1.5),\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }),\n )}\n </div>\n\n <div className=\"epochs-pdf-viewer__signature-layer\">\n {pageSignatureFields.map((field) => {\n const fType = field.type ?? \"sign\";\n const textValue =\n fieldValues[field.id] ?? field.value ?? \"\";\n const filled =\n fType === \"date\" || fType === \"text\"\n ? Boolean(textValue.trim())\n : pageSignatures.some((sig) => sig.fieldId === field.id);\n return (\n <button\n key={field.id}\n type=\"button\"\n data-signature-field-id={field.id}\n className={\n selectedSignatureFieldId === field.id\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--selected\"\n : filled\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--filled\"\n : \"epochs-pdf-viewer__signature-field\"\n }\n style={{\n left: field.x * scale,\n top: field.y * scale,\n width: field.width * scale,\n height: field.height * scale,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignatureField?.(field.id);\n if (fType === \"date\" || fType === \"text\") {\n onSelectSignature?.(null);\n onOpenSignaturePad?.(fType);\n return;\n }\n const existing = pageSignatures.find((sig) => sig.fieldId === field.id);\n onSelectSignature?.(existing?.id ?? null);\n if (existing) {\n onEditSignature?.(existing.id);\n } else {\n onOpenSignaturePad?.(fType);\n }\n }}\n title={\n filled\n ? \"Completed field\"\n : fType === \"date\"\n ? \"Date field\"\n : fType === \"text\"\n ? \"Text field\"\n : \"Signature field\"\n }\n >\n {(() => {\n if (fType === \"date\" || fType === \"text\") {\n if (textValue.trim()) {\n return (\n <span className=\"epochs-pdf-viewer__signature-field-value\">\n {textValue}\n </span>\n );\n }\n if (fType === \"date\") return <span>Date here</span>;\n return <span>{field.placeholder ?? \"Enter text\"}</span>;\n }\n return filled ? null : <span>Sign here</span>;\n })()}\n </button>\n );\n })}\n {pageSignatures.map((sig) => (\n <div\n key={sig.id}\n className={\n selectedSignatureId === sig.id\n ? \"epochs-pdf-viewer__signature epochs-pdf-viewer__signature--selected\"\n : \"epochs-pdf-viewer__signature\"\n }\n style={{\n left: sig.x * scale,\n top: sig.y * scale,\n width: sig.width * scale,\n height: sig.height * scale,\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n\n if (markupTool === \"erase\" && !hasFixedSignatureFields) {\n onRemoveSignature?.(sig.id);\n return;\n }\n\n if (hasFixedSignatureFields) {\n onSelectSignatureField?.(sig.fieldId ?? null);\n onEditSignature?.(sig.id);\n return;\n }\n\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(e.clientX, e.clientY, surface, scale);\n setDragState({\n kind: \"signature\",\n id: sig.id,\n offsetX: point.x - sig.x,\n offsetY: point.y - sig.y,\n });\n }}\n >\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-edit\"\n title=\"Edit signature\"\n aria-label=\"Edit signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onEditSignature?.(sig.id);\n }}\n >\n <PencilIcon size={12} />\n </button>\n {!hasFixedSignatureFields ? (\n <>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-duplicate\"\n title=\"Duplicate signature\"\n aria-label=\"Duplicate signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onDuplicateSignature?.(sig.id);\n }}\n >\n ⧉\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-remove\"\n title=\"Remove signature\"\n aria-label=\"Remove signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onRemoveSignature?.(sig.id);\n }}\n >\n ×\n </button>\n </>\n ) : null}\n <img src={sig.imageDataUrl} alt=\"Signature\" draggable={false} />\n {!hasFixedSignatureFields ? (\n <div\n className=\"epochs-pdf-viewer__signature-resize\"\n title=\"Resize\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n setDragState({\n kind: \"resize\",\n id: sig.id,\n startX: e.clientX,\n startY: e.clientY,\n startW: sig.width,\n startH: sig.height,\n });\n }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 1L1 7M7 4L4 7\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n </svg>\n </div>\n ) : null}\n </div>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__text-layer-overlay\">\n {pageTexts.map((text) => renderInlineText(text))}\n </div>\n\n <div\n ref={textLayerRef}\n className=\"textLayer epochs-pdf-viewer__text-layer\"\n onClick={handleInlineTextClick}\n />\n\n <div className=\"epochs-pdf-viewer__redact-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? ann.rects.map((rect, idx) => (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--redact\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color || REDACT_COLOR,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n ))\n : null,\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { drawMarkupOnCanvas, type MarkupAnnotation } from \"./markup\";\nimport {\n drawSignatureFieldsOnCanvas,\n drawSignaturesOnCanvas,\n type SignatureAnnotation,\n type SignatureField,\n} from \"./signature\";\nimport {\n drawTextFieldsOnCanvas,\n drawTextsOnCanvas,\n type TextAnnotation,\n type TextField,\n} from \"./text\";\nimport type { PdfDoc } from \"./types\";\n\ninterface ThumbnailProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n isActive?: boolean;\n rotation: number;\n onSelect: (pageNumber: number) => void;\n width?: number;\n annotations?: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n signatureFields?: SignatureField[];\n texts?: TextAnnotation[];\n textFields?: TextField[];\n}\n\nexport function Thumbnail({\n pdfDoc,\n pageNumber,\n isActive,\n rotation,\n onSelect,\n width = 140,\n annotations = [],\n signatures = [],\n signatureFields = [],\n texts = [],\n textFields = [],\n}: ThumbnailProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current) return;\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n let task: RenderTask | null = null;\n\n const render = async () => {\n try {\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n const scale = width / viewportAt1.width;\n const viewport = page.getViewport({ scale, rotation });\n\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n\n task = page.render({ canvasContext: ctx, viewport });\n await task.promise;\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageAnnotations.length > 0) {\n drawMarkupOnCanvas(ctx, pageAnnotations, scale);\n }\n\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageSignatureFields.length > 0) {\n drawSignatureFieldsOnCanvas(\n ctx,\n pageSignatureFields,\n new Set(pageSignatures.map((sig) => sig.fieldId).filter(Boolean) as string[]),\n scale,\n );\n }\n if (pageSignatures.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSignatures, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n const pageTextFields = textFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageTextFields.length > 0) {\n drawTextFieldsOnCanvas(\n ctx,\n pageTextFields,\n new Set(\n pageTexts\n .filter((t) => t.fieldId && t.value.trim())\n .map((t) => t.fieldId as string),\n ),\n scale,\n );\n }\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n } catch {\n // ignore\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (task) {\n try {\n task.cancel();\n } catch {\n // ignore\n }\n }\n };\n }, [\n annotations,\n pdfDoc,\n pageNumber,\n rotation,\n signatureFields,\n signatures,\n textFields,\n texts,\n width,\n ]);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(pageNumber)}\n className={\n isActive\n ? \"epochs-pdf-viewer__thumb epochs-pdf-viewer__thumb--active\"\n : \"epochs-pdf-viewer__thumb\"\n }\n title={`Page ${pageNumber}`}\n >\n <div className=\"epochs-pdf-viewer__thumb-frame\">\n <canvas ref={canvasRef} />\n </div>\n <span className=\"epochs-pdf-viewer__thumb-label\">{pageNumber}</span>\n </button>\n );\n}\n","import * as pdfjsLib from \"pdfjs-dist\";\n\nconst ABSOLUTE_URL_PATTERN = /^(blob:|https?:|data:)/i;\n\nlet workerConfigured = false;\n\n/** Configure pdf.js worker. Call once, or pass `workerSrc` to `<PdfViewer>`. */\nexport function setPdfWorkerSrc(workerSrc: string): void {\n pdfjsLib.GlobalWorkerOptions.workerSrc = workerSrc;\n workerConfigured = true;\n}\n\nexport function ensurePdfWorker(workerSrc?: string): void {\n if (workerSrc) {\n setPdfWorkerSrc(workerSrc);\n return;\n }\n if (workerConfigured || pdfjsLib.GlobalWorkerOptions.workerSrc) return;\n\n setPdfWorkerSrc(\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`,\n );\n}\n\nexport function resolvePdfUrl(\n file?: string,\n fileUrl?: string,\n baseUrl = \"\",\n): string {\n const source = fileUrl || file;\n if (!source) return \"\";\n\n if (ABSOLUTE_URL_PATTERN.test(source)) return source;\n\n const path = source.startsWith(\"/\") ? source : `/${source}`;\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n}\n\nexport async function urlToPdfArrayBuffer(\n url: string,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n const res = await fetch(url, fetchOptions);\n\n if (!res.ok) {\n throw new Error(`Failed to fetch PDF (${res.status})`);\n }\n\n return res.arrayBuffer();\n}\n\nexport async function sourceToArrayBuffer(\n source: string | ArrayBuffer | Uint8Array | Blob,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n if (typeof source === \"string\") {\n return urlToPdfArrayBuffer(source, fetchOptions);\n }\n if (source instanceof ArrayBuffer) return source.slice(0);\n if (source instanceof Uint8Array) {\n const copy = new Uint8Array(source.byteLength);\n copy.set(source);\n return copy.buffer;\n }\n return source.arrayBuffer();\n}\n\nexport { pdfjsLib };\n","import type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport type { MarkupAnnotation } from \"./markup\";\nimport { drawMarkupOnCanvas } from \"./markup\";\nimport type { SignatureAnnotation } from \"./signature\";\nimport { drawSignaturesOnCanvas } from \"./signature\";\nimport type { TextAnnotation } from \"./text\";\nimport { drawTextsOnCanvas } from \"./text\";\n\nexport interface RenderedPageImage {\n pageNumber: number;\n /** Canvas pixel size */\n width: number;\n height: number;\n /** PDF page size at scale 1 (points) */\n pageWidth: number;\n pageHeight: number;\n dataUrl: string;\n jpegBytes: Uint8Array;\n}\n\n/** Render a page in the *main* document (iframe canvases break pdf.js fonts). */\nexport async function renderPageWithMarkup(\n pdfDoc: PDFDocumentProxy,\n pageNumber: number,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage> {\n const {\n scale,\n rotation,\n annotations,\n signatures = [],\n texts = [],\n mimeType = \"image/jpeg\",\n quality = 0.92,\n } = options;\n\n const page = await pdfDoc.getPage(pageNumber);\n const viewport = page.getViewport({ scale, rotation });\n const baseViewport = page.getViewport({ scale: 1, rotation });\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n if (!ctx) {\n throw new Error(\"Could not create canvas context\");\n }\n\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n canvas.width = width;\n canvas.height = height;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, width, height);\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n const pageMarks = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageMarks.length > 0) {\n drawMarkupOnCanvas(ctx, pageMarks, scale);\n }\n\n const pageSigs = signatures.filter((s) => s.pageNumber === pageNumber);\n if (pageSigs.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSigs, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n\n const dataUrl = canvas.toDataURL(mimeType, quality);\n const jpegBytes = dataUrlToBytes(dataUrl);\n\n canvas.width = 0;\n canvas.height = 0;\n\n return {\n pageNumber,\n width,\n height,\n pageWidth: baseViewport.width,\n pageHeight: baseViewport.height,\n dataUrl,\n jpegBytes,\n };\n}\n\nexport async function renderAllPagesWithMarkup(\n pdfDoc: PDFDocumentProxy,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage[]> {\n const pages: RenderedPageImage[] = [];\n for (let i = 1; i <= pdfDoc.numPages; i += 1) {\n pages.push(await renderPageWithMarkup(pdfDoc, i, options));\n }\n return pages;\n}\n\nfunction dataUrlToBytes(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1] ?? \"\";\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction enc(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n}\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((sum, p) => sum + p.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.byteLength;\n }\n return out;\n}\n\n/**\n * Build a multi-page PDF embedding each page as a JPEG (includes baked markup).\n */\nexport function buildPdfFromJpegPages(pages: RenderedPageImage[]): Uint8Array {\n type PdfObject = Uint8Array;\n const objects: PdfObject[] = [];\n\n const add = (bytes: Uint8Array): number => {\n objects.push(bytes);\n return objects.length; // 1-indexed id\n };\n\n const pageIds: number[] = [];\n\n for (const page of pages) {\n const imageStream = concat(\n enc(\n `<< /Type /XObject /Subtype /Image /Width ${page.width} /Height ${page.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpegBytes.byteLength} >>\\nstream\\n`,\n ),\n page.jpegBytes,\n enc(`\\nendstream`),\n );\n const imageId = add(imageStream);\n\n const content = `q\\n${page.pageWidth.toFixed(2)} 0 0 ${page.pageHeight.toFixed(2)} 0 0 cm\\n/Im0 Do\\nQ`;\n const contentId = add(\n enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`),\n );\n\n // Parent placeholder replaced after pages object exists\n const pageId = add(\n enc(\n `<< /Type /Page /Parent __PAGES__ 0 R /MediaBox [0 0 ${page.pageWidth.toFixed(2)} ${page.pageHeight.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /XObject << /Im0 ${imageId} 0 R >> >> >>`,\n ),\n );\n pageIds.push(pageId);\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = add(\n enc(`<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`),\n );\n\n for (const pageId of pageIds) {\n const text = new TextDecoder().decode(objects[pageId - 1]);\n objects[pageId - 1] = enc(\n text.replace(\"/Parent __PAGES__ 0 R\", `/Parent ${pagesId} 0 R`),\n );\n }\n\n const catalogId = add(enc(`<< /Type /Catalog /Pages ${pagesId} 0 R >>`));\n\n const chunks: Uint8Array[] = [enc(\"%PDF-1.4\\n\")];\n const offsets: number[] = [0];\n let offset = chunks[0].byteLength;\n\n for (let i = 0; i < objects.length; i += 1) {\n offsets.push(offset);\n const objHeader = enc(`${i + 1} 0 obj\\n`);\n const objFooter = enc(`\\nendobj\\n`);\n chunks.push(objHeader, objects[i], objFooter);\n offset += objHeader.byteLength + objects[i].byteLength + objFooter.byteLength;\n }\n\n const xrefStart = offset;\n let xref = `xref\\n0 ${objects.length + 1}\\n`;\n xref += \"0000000000 65535 f \\n\";\n for (let i = 1; i <= objects.length; i += 1) {\n xref += `${String(offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n xref += `trailer\\n<< /Size ${objects.length + 1} /Root ${catalogId} 0 R >>\\n`;\n xref += `startxref\\n${xrefStart}\\n%%EOF`;\n chunks.push(enc(xref));\n\n return concat(...chunks);\n}\n\nexport function triggerBlobDownload(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { SignatureFieldType } from \"./signature\";\n\ninterface SignaturePadProps {\n open: boolean;\n onClose: () => void;\n onSave: (imageDataUrl: string, width: number, height: number) => void;\n /** Saves plain text for date/text fields (not converted to an image). */\n onSaveFieldValue?: (value: string, fieldType: \"date\" | \"text\") => void;\n /** When set, locks the modal to this field type (from a fixed field). */\n fieldType?: SignatureFieldType;\n /** Show Sign/Date/Text tabs when no fixed field type is provided. */\n showFieldTypeTabs?: boolean;\n /** Placeholder for text-type fields. */\n textPlaceholder?: string;\n /** Prefill when reopening an already-filled date/text field. */\n initialFieldValue?: string;\n /** Fixed signature field box size — typed/draw output is fit to this. */\n targetSize?: { width: number; height: number };\n /** Last submitted values by field type — used to prefill the modal. */\n rememberedByType?: RememberedFieldFills;\n /** Persist the values the user just submitted for this field type. */\n onRememberFill?: (\n type: SignatureFieldType,\n fill: RememberedSignFill | { value: string },\n ) => void;\n}\n\ntype PadMode = \"draw\" | \"type\";\n\nexport type RememberedSignFill = {\n mode: PadMode;\n imageDataUrl: string;\n width: number;\n height: number;\n typedName?: string;\n typedInitials?: string;\n fontId?: string;\n inkColor?: string;\n typeKind?: \"signature\" | \"initials\";\n};\n\nexport type RememberedFieldFills = {\n sign?: RememberedSignFill;\n date?: { value: string };\n text?: { value: string };\n};\n\nconst SVG_SAFE_FONTS = [\n { id: \"cursive\", label: \"Cursive\", family: \"cursive\" },\n { id: \"serif\", label: \"Serif\", family: \"serif\" },\n { id: \"sans\", label: \"Sans\", family: \"sans-serif\" },\n { id: \"mono\", label: \"Mono\", family: \"monospace\" },\n { id: \"fantasy\", label: \"Fantasy\", family: \"fantasy\" },\n] as const;\n\ntype SvgSafeFontId = (typeof SVG_SAFE_FONTS)[number][\"id\"];\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\nfunction svgToBase64DataUrl(svg: string): string {\n const bytes = new TextEncoder().encode(svg);\n let binary = \"\";\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return `data:image/svg+xml;base64,${btoa(binary)}`;\n}\n\nfunction typedSignatureFontSize(typeKind: \"signature\" | \"initials\"): number {\n return typeKind === \"initials\" ? 64 : 48;\n}\n\nexport function SignaturePad({\n open,\n onClose,\n onSave,\n onSaveFieldValue,\n fieldType,\n showFieldTypeTabs = false,\n textPlaceholder,\n initialFieldValue,\n targetSize,\n rememberedByType,\n onRememberFill,\n}: SignaturePadProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const drawingRef = useRef(false);\n const lastPointRef = useRef<{ x: number; y: number } | null>(null);\n const pathsRef = useRef<{ x: number; y: number }[][]>([]);\n const currentPathRef = useRef<{ x: number; y: number }[]>([]);\n const reusedSignatureRef = useRef<{\n imageDataUrl: string;\n width: number;\n height: number;\n } | null>(null);\n\n const resolvedFieldType: SignatureFieldType = fieldType ?? \"sign\";\n const [activeFieldType, setActiveFieldType] = useState<SignatureFieldType>(resolvedFieldType);\n const [dateValue, setDateValue] = useState(\"\");\n const [textValue, setTextValue] = useState(\"\");\n\n const [mode, setMode] = useState<PadMode>(\"draw\");\n const [typedName, setTypedName] = useState(\"\");\n const [typedInitials, setTypedInitials] = useState(\"\");\n const [initialsTouched, setInitialsTouched] = useState(false);\n const [typeKind, setTypeKind] = useState<\"signature\" | \"initials\">(\"signature\");\n const [inkColor, setInkColor] = useState(\"#111827\");\n const [fontId, setFontId] = useState<SvgSafeFontId>(\"cursive\");\n const [hasReusedSignature, setHasReusedSignature] = useState(false);\n\n const selectedFont =\n SVG_SAFE_FONTS.find((font) => font.id === fontId) ?? SVG_SAFE_FONTS[0];\n\n const previewText =\n typeKind === \"initials\" ? typedInitials.trim() : typedName.trim();\n const fontPreviewLabel =\n previewText || (typeKind === \"initials\" ? \"AB\" : \"Signature\");\n\n useEffect(() => {\n if (!open) return;\n setActiveFieldType(resolvedFieldType);\n\n if (resolvedFieldType === \"date\") {\n setDateValue(\n initialFieldValue ||\n rememberedByType?.date?.value ||\n new Date().toISOString().slice(0, 10),\n );\n return;\n }\n\n if (resolvedFieldType === \"text\") {\n setTextValue(initialFieldValue || rememberedByType?.text?.value || \"\");\n return;\n }\n\n const remembered = rememberedByType?.sign;\n if (!remembered) {\n setMode(\"draw\");\n setTypedName(\"\");\n setTypedInitials(\"\");\n setInitialsTouched(false);\n setTypeKind(\"signature\");\n setInkColor(\"#111827\");\n setFontId(\"cursive\");\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n return;\n }\n\n setMode(remembered.mode);\n setTypedName(remembered.typedName ?? \"\");\n setTypedInitials(remembered.typedInitials ?? \"\");\n setInitialsTouched(Boolean(remembered.typedInitials));\n setTypeKind(remembered.typeKind ?? \"signature\");\n setInkColor(remembered.inkColor ?? \"#111827\");\n const nextFont = SVG_SAFE_FONTS.find((font) => font.id === remembered.fontId);\n if (nextFont) setFontId(nextFont.id);\n if (remembered.mode === \"draw\") {\n reusedSignatureRef.current = {\n imageDataUrl: remembered.imageDataUrl,\n width: remembered.width,\n height: remembered.height,\n };\n setHasReusedSignature(true);\n } else {\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n }\n }, [open, resolvedFieldType, rememberedByType, initialFieldValue]);\n\n useEffect(() => {\n if (!open || activeFieldType !== \"sign\") return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = 560;\n canvas.height = 200;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = inkColor;\n ctx.lineWidth = 2.5;\n lastPointRef.current = null;\n drawingRef.current = false;\n pathsRef.current = [];\n currentPathRef.current = [];\n\n if (mode !== \"draw\") return;\n\n const reused = reusedSignatureRef.current;\n if (!reused?.imageDataUrl) return;\n\n const img = new Image();\n img.onload = () => {\n const scale = Math.min(\n canvas.width / Math.max(1, reused.width),\n canvas.height / Math.max(1, reused.height),\n 1,\n );\n const w = reused.width * scale;\n const h = reused.height * scale;\n ctx.drawImage(img, (canvas.width - w) / 2, (canvas.height - h) / 2, w, h);\n };\n img.src = reused.imageDataUrl;\n }, [open, activeFieldType, mode]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) return;\n ctx.strokeStyle = inkColor;\n ctx.fillStyle = inkColor;\n }, [inkColor]);\n\n useEffect(() => {\n if (!open || mode !== \"type\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (!previewText) return;\n\n const size = typedSignatureFontSize(typeKind);\n\n ctx.fillStyle = inkColor;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${size}px ${selectedFont.family}`;\n ctx.fillText(previewText, canvas.width / 2, canvas.height / 2);\n }, [\n previewText,\n typeKind,\n mode,\n inkColor,\n open,\n selectedFont,\n ]);\n\n if (!open) return null;\n\n const getPoint = (event: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n return {\n x: ((event.clientX - rect.left) / rect.width) * canvas.width,\n y: ((event.clientY - rect.top) / rect.height) * canvas.height,\n };\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (mode !== \"draw\") return;\n if (reusedSignatureRef.current) {\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.strokeStyle = inkColor;\n ctx.lineWidth = 2.5;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n }\n pathsRef.current = [];\n }\n event.currentTarget.setPointerCapture(event.pointerId);\n drawingRef.current = true;\n const pt = getPoint(event);\n lastPointRef.current = pt;\n currentPathRef.current = [pt];\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (!drawingRef.current || mode !== \"draw\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n const last = lastPointRef.current;\n if (!ctx || !last) return;\n\n const point = getPoint(event);\n ctx.beginPath();\n ctx.moveTo(last.x, last.y);\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n lastPointRef.current = point;\n currentPathRef.current.push(point);\n };\n\n const handlePointerUp = () => {\n if (currentPathRef.current.length > 1) {\n pathsRef.current.push([...currentPathRef.current]);\n }\n currentPathRef.current = [];\n drawingRef.current = false;\n lastPointRef.current = null;\n };\n\n const clearPad = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n pathsRef.current = [];\n currentPathRef.current = [];\n reusedSignatureRef.current = null;\n setHasReusedSignature(false);\n setTypedName(\"\");\n setTypedInitials(\"\");\n setInitialsTouched(false);\n };\n\n const handleNameChange = (value: string) => {\n setTypedName(value);\n if (!initialsTouched) {\n setTypedInitials(deriveInitials(value));\n }\n };\n\n const trimAndSave = () => {\n if (mode === \"draw\") {\n const allPaths = pathsRef.current;\n const reused = reusedSignatureRef.current;\n if (allPaths.length === 0) {\n if (!reused) return;\n onRememberFill?.(\"sign\", {\n mode: \"draw\",\n imageDataUrl: reused.imageDataUrl,\n width: reused.width,\n height: reused.height,\n inkColor,\n });\n onSave(reused.imageDataUrl, reused.width, reused.height);\n return;\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const path of allPaths) {\n for (const pt of path) {\n if (pt.x < minX) minX = pt.x;\n if (pt.y < minY) minY = pt.y;\n if (pt.x > maxX) maxX = pt.x;\n if (pt.y > maxY) maxY = pt.y;\n }\n }\n\n const pad = 8;\n minX = Math.max(0, minX - pad);\n minY = Math.max(0, minY - pad);\n maxX += pad;\n maxY += pad;\n const w = maxX - minX;\n const h = maxY - minY;\n\n const pathData = allPaths\n .map((path) => {\n const pts = path.map((pt) => ({ x: pt.x - minX, y: pt.y - minY }));\n return \"M\" + pts.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(\"L\");\n })\n .join(\" \");\n\n const boxW = Math.max(1, targetSize?.width ?? w);\n const boxH = Math.max(1, targetSize?.height ?? h);\n const scale = Math.min(boxW / w, boxH / h);\n const drawnW = w * scale;\n const drawnH = h * scale;\n const ox = (boxW - drawnW) / 2;\n const oy = (boxH - drawnH) / 2;\n\n const svg =\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 ${boxW} ${boxH}\">` +\n `<g transform=\"translate(${ox.toFixed(2)} ${oy.toFixed(2)}) scale(${scale.toFixed(4)})\">` +\n `<path d=\"${pathData}\" fill=\"none\" stroke=\"${inkColor}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</g></svg>`;\n const dataUrl = `data:image/svg+xml;base64,${btoa(svg)}`;\n onRememberFill?.(\"sign\", {\n mode: \"draw\",\n imageDataUrl: dataUrl,\n width: boxW,\n height: boxH,\n inkColor,\n });\n onSave(dataUrl, boxW, boxH);\n return;\n }\n\n if (!previewText) return;\n\n const baseSize = typedSignatureFontSize(typeKind);\n const measureCanvas = document.createElement(\"canvas\");\n const measureCtx = measureCanvas.getContext(\"2d\")!;\n measureCtx.font = `${baseSize}px ${selectedFont.family}`;\n const baseMetrics = measureCtx.measureText(previewText);\n const basePad = 8;\n const naturalW = Math.ceil(baseMetrics.width) + basePad * 2;\n const naturalH = baseSize + basePad * 2;\n\n const boxW = Math.max(1, targetSize?.width ?? naturalW);\n const boxH = Math.max(1, targetSize?.height ?? naturalH);\n const fit = Math.min(boxW / naturalW, boxH / naturalH);\n const fontSize = Math.max(8, baseSize * fit);\n\n // Transparent SVG text — centered in the sign block.\n const cx = (boxW / 2).toFixed(1);\n const cy = (boxH / 2).toFixed(1);\n const svg =\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 ${boxW} ${boxH}\">` +\n `<text x=\"${cx}\" y=\"${cy}\" ` +\n `text-anchor=\"middle\" dominant-baseline=\"central\" alignment-baseline=\"middle\" ` +\n `font-family=\"${selectedFont.family}\" font-size=\"${fontSize.toFixed(1)}\" ` +\n `fill=\"${inkColor}\">${escapeXml(previewText)}</text>` +\n `</svg>`;\n const dataUrl = svgToBase64DataUrl(svg);\n\n onRememberFill?.(\"sign\", {\n mode: \"type\",\n imageDataUrl: dataUrl,\n width: boxW,\n height: boxH,\n typedName,\n typedInitials,\n fontId,\n inkColor,\n typeKind,\n });\n onSave(dataUrl, boxW, boxH);\n };\n\n const handleFieldValueSave = () => {\n if (activeFieldType !== \"date\" && activeFieldType !== \"text\") return;\n const text =\n activeFieldType === \"date\" ? dateValue : textValue.trim();\n if (!text) return;\n\n onRememberFill?.(activeFieldType, { value: text });\n onSaveFieldValue?.(text, activeFieldType);\n };\n\n const showSignPad = activeFieldType === \"sign\";\n const modalTitle =\n activeFieldType === \"date\"\n ? \"Pick a date\"\n : activeFieldType === \"text\"\n ? \"Enter text\"\n : \"Create e-signature\";\n\n return (\n <div className=\"epochs-pdf-viewer__modal\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"epochs-pdf-viewer__modal-backdrop\" onClick={onClose} />\n <div className=\"epochs-pdf-viewer__modal-card\">\n <div className=\"epochs-pdf-viewer__modal-header\">\n <h3>{modalTitle}</h3>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={onClose}\n title=\"Close\"\n >\n ×\n </button>\n </div>\n\n {showFieldTypeTabs && !fieldType ? (\n <div className=\"epochs-pdf-viewer__field-type-tabs\" role=\"tablist\">\n {([\"sign\", \"date\", \"text\"] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeFieldType === t}\n className={\n activeFieldType === t\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setActiveFieldType(t)}\n >\n {t === \"sign\" ? \"Sign\" : t === \"date\" ? \"Date\" : \"Text\"}\n </button>\n ))}\n </div>\n ) : null}\n\n {showSignPad ? (\n <>\n <div className=\"epochs-pdf-viewer__sign-modes\">\n <button\n type=\"button\"\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => {\n setMode(\"draw\");\n clearPad();\n }}\n >\n Draw\n </button>\n <button\n type=\"button\"\n className={\n mode === \"type\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setMode(\"type\")}\n >\n Type\n </button>\n <label className=\"epochs-pdf-viewer__sign-ink\">\n Ink\n <input\n type=\"color\"\n value={inkColor}\n onChange={(e) => setInkColor(e.target.value)}\n />\n </label>\n </div>\n\n {mode === \"type\" ? (\n <>\n <div\n className=\"epochs-pdf-viewer__sign-fonts\"\n role=\"group\"\n aria-label=\"Handwriting style\"\n >\n {SVG_SAFE_FONTS.map((font) => (\n <button\n key={font.id}\n type=\"button\"\n className={\n fontId === font.id\n ? \"epochs-pdf-viewer__sign-font epochs-pdf-viewer__sign-font--active\"\n : \"epochs-pdf-viewer__sign-font\"\n }\n style={{ fontFamily: font.family }}\n onClick={() => setFontId(font.id)}\n title={font.label}\n >\n {fontPreviewLabel}\n </button>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__sign-type-fields\">\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Full name</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedName}\n onChange={(e) => handleNameChange(e.target.value)}\n onFocus={() => setTypeKind(\"signature\")}\n placeholder=\"Type your full name\"\n style={{ fontFamily: selectedFont.family }}\n autoFocus\n />\n </label>\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Initials</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedInitials}\n onChange={(e) => {\n setInitialsTouched(true);\n setTypedInitials(e.target.value.toUpperCase());\n }}\n onFocus={() => setTypeKind(\"initials\")}\n placeholder=\"e.g. JD\"\n maxLength={4}\n style={{ fontFamily: selectedFont.family }}\n />\n </label>\n </div>\n\n <div\n className=\"epochs-pdf-viewer__sign-type-kind\"\n role=\"group\"\n aria-label=\"Preview type\"\n >\n <button\n type=\"button\"\n className={\n typeKind === \"signature\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"signature\")}\n >\n Use full name\n </button>\n <button\n type=\"button\"\n className={\n typeKind === \"initials\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"initials\")}\n >\n Use initials\n </button>\n </div>\n </>\n ) : (\n <p className=\"epochs-pdf-viewer__sign-hint\">\n {hasReusedSignature\n ? \"Previous signature loaded — submit to reuse, or draw a new one\"\n : \"Draw your signature below\"}\n </p>\n )}\n\n <canvas\n ref={canvasRef}\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__sign-canvas\"\n : \"epochs-pdf-viewer__sign-canvas epochs-pdf-viewer__sign-canvas--preview\"\n }\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n />\n </>\n ) : activeFieldType === \"date\" ? (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Date</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"date\"\n value={dateValue}\n onChange={(e) => setDateValue(e.target.value)}\n autoFocus\n />\n </label>\n ) : (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Text</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n placeholder={textPlaceholder ?? \"Enter text\"}\n autoFocus\n />\n </label>\n )}\n\n <div className=\"epochs-pdf-viewer__modal-actions\">\n {showSignPad ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={clearPad}\n >\n Clear\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={showSignPad ? trimAndSave : handleFieldValueSave}\n disabled={\n activeFieldType === \"date\" ? !dateValue\n : activeFieldType === \"text\" ? !textValue.trim()\n : false\n }\n >\n {showSignPad ? \"Use signature\" : \"Place on page\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction deriveInitials(name: string): string {\n const parts = name\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return parts\n .slice(0, 3)\n .map((part) => part[0]?.toUpperCase() ?? \"\")\n .join(\"\");\n}\n\n","/** Brand key used to identify toolbar tool components. */\nexport const TOOLBAR_TOOL_ID = \"__epochsToolbarToolId\" as const;\n\nexport type ToolbarToolId =\n | \"thumbnail\"\n | \"navigation\"\n | \"zoom\"\n | \"rotate\"\n | \"reload\"\n | \"print\"\n | \"open\"\n | \"download\"\n | \"highlight\"\n | \"underline\"\n | \"signature\"\n | \"text\"\n | \"erase\"\n | \"clear\";\n\nexport type ToolbarToolComponent = {\n (props?: Record<string, never>): null;\n displayName: string;\n readonly [TOOLBAR_TOOL_ID]: ToolbarToolId;\n};\n\nfunction createToolbarTool(\n id: ToolbarToolId,\n displayName: string,\n): ToolbarToolComponent {\n const Tool = (() => null) as ToolbarToolComponent;\n Tool.displayName = displayName;\n Object.defineProperty(Tool, TOOLBAR_TOOL_ID, {\n value: id,\n enumerable: true,\n });\n return Tool;\n}\n\nexport function getToolbarToolId(\n tool: ToolbarToolComponent,\n): ToolbarToolId {\n return tool[TOOLBAR_TOOL_ID];\n}\n\nexport function isToolbarTool(\n value: unknown,\n): value is ToolbarToolComponent {\n return (\n typeof value === \"function\" &&\n TOOLBAR_TOOL_ID in value &&\n typeof (value as ToolbarToolComponent)[TOOLBAR_TOOL_ID] === \"string\"\n );\n}\n\n/** Toggle thumbnails sidebar. */\nexport const Thumbnail = createToolbarTool(\"thumbnail\", \"Thumbnail\");\n/** Previous / next page and page number. */\nexport const Navigation = createToolbarTool(\"navigation\", \"Navigation\");\n/** Zoom out, zoom %, zoom in, and fit width. */\nexport const Zoom = createToolbarTool(\"zoom\", \"Zoom\");\n/** Rotate pages. */\nexport const Rotate = createToolbarTool(\"rotate\", \"Rotate\");\n/** Reload the PDF. */\nexport const Reload = createToolbarTool(\"reload\", \"Reload\");\n/** Print (includes markup). */\nexport const Print = createToolbarTool(\"print\", \"Print\");\n/** Open PDF in a new tab. */\nexport const Open = createToolbarTool(\"open\", \"Open\");\n/** Download PDF (with markup when present). */\nexport const Download = createToolbarTool(\"download\", \"Download\");\n/** Highlight text markup tool. */\nexport const Highlight = createToolbarTool(\"highlight\", \"Highlight\");\n/** Underline text markup tool. */\nexport const Underline = createToolbarTool(\"underline\", \"Underline\");\n/** E-signature tool. */\nexport const Signature = createToolbarTool(\"signature\", \"Signature\");\n/** Add / edit free text on the page. */\nexport const AddText = createToolbarTool(\"text\", \"AddText\");\n/** Erase markup annotations. */\nexport const Erase = createToolbarTool(\"erase\", \"Erase\");\n/** Clear all markup. */\nexport const Clear = createToolbarTool(\"clear\", \"Clear\");\n\nexport const ALL_TOOLBAR_TOOLS = [\n Thumbnail,\n Navigation,\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n] as const;\n\n/** Default left / right toolbar layout. */\nexport const DEFAULT_TOOLBAR_LAYOUT: [\n ToolbarToolComponent[],\n ToolbarToolComponent[],\n] = [\n [Thumbnail, Navigation],\n [\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n ],\n];\n","import type { ReactNode } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n EraserIcon,\n ExternalLinkIcon,\n GridIcon,\n HighlightIcon,\n MinusIcon,\n PlusIcon,\n PrinterIcon,\n RefreshIcon,\n RotateIcon,\n SignatureIcon,\n TextIcon,\n UnderlineIcon,\n} from \"./icons\";\nimport type { MarkupTool } from \"./markup\";\nimport {\n HIGHLIGHT_PRESETS,\n UNDERLINE_PRESETS,\n normalizeHex,\n} from \"./markup\";\nimport type { ToolbarToolId } from \"./toolbarTools\";\n\nexport type ToolbarRenderContext = {\n status: string;\n showThumbnails: boolean;\n setShowThumbnails: (updater: (v: boolean) => boolean) => void;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n pageNumber: number;\n numPages: number;\n scrollToPage: (page: number) => void;\n scale: number;\n handleZoomOut: () => void;\n handleZoomIn: () => void;\n handleFitWidth: () => void | Promise<void>;\n handleRotate: () => void;\n markupTool: MarkupTool;\n toggleMarkupTool: (tool: Exclude<MarkupTool, \"none\">) => void;\n hasFixedSignatureFields: boolean;\n hasFixedTextFields: boolean;\n pendingSignature: { imageDataUrl: string; width: number; height: number } | null;\n setMarkupTool: (tool: MarkupTool) => void;\n setSignaturePadOpen: (open: boolean) => void;\n annotationsLength: number;\n signaturesLength: number;\n textsLength: number;\n handleClearAnnotations: () => void;\n highlightHex: string;\n underlineHex: string;\n setHighlightHex: (hex: string) => void;\n setUnderlineHex: (hex: string) => void;\n loadDocument: () => void | Promise<void>;\n handlePrint: () => void | Promise<void>;\n isPrinting: boolean;\n pdfDoc: unknown;\n displayUrl: string | null;\n resolvedUrl: string;\n handleDownload: () => void | Promise<void>;\n isDownloading: boolean;\n};\n\nconst MARKUP_TOOLS: ToolbarToolId[] = [\n \"highlight\",\n \"underline\",\n \"signature\",\n \"text\",\n \"erase\",\n \"clear\",\n];\n\nexport function isMarkupToolbarTool(id: ToolbarToolId): boolean {\n return MARKUP_TOOLS.includes(id);\n}\n\nexport function renderToolbarTool(\n id: ToolbarToolId,\n ctx: ToolbarRenderContext,\n options?: { showMarkupSep?: boolean },\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (options?.showMarkupSep) {\n nodes.push(\n <span\n key={`${id}-sep`}\n className=\"epochs-pdf-viewer__toolbar-sep\"\n aria-hidden=\"true\"\n />,\n );\n }\n\n switch (id) {\n case \"thumbnail\":\n nodes.push(\n <button\n key=\"thumbnail\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => ctx.setShowThumbnails((v) => !v)}\n title={ctx.showThumbnails ? \"Hide thumbnails\" : \"Show thumbnails\"}\n >\n <GridIcon />\n </button>,\n );\n break;\n\n case \"navigation\":\n nodes.push(\n <button\n key=\"nav-prev\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handlePrev}\n disabled={!ctx.canGoPrev || ctx.status !== \"ready\"}\n title=\"Previous page\"\n >\n <ChevronLeftIcon />\n </button>,\n <div key=\"nav-page\" className=\"epochs-pdf-viewer__page-input\">\n <input\n type=\"number\"\n value={ctx.pageNumber}\n min={1}\n max={ctx.numPages || 1}\n onChange={(e) => {\n const next = Number.parseInt(e.target.value, 10);\n if (!Number.isFinite(next)) return;\n ctx.scrollToPage(\n Math.max(1, Math.min(ctx.numPages || 1, next)),\n );\n }}\n disabled={ctx.status !== \"ready\"}\n aria-label=\"Page number\"\n />\n <span>/ {ctx.numPages || \"-\"}</span>\n </div>,\n <button\n key=\"nav-next\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleNext}\n disabled={!ctx.canGoNext || ctx.status !== \"ready\"}\n title=\"Next page\"\n >\n <ChevronRightIcon />\n </button>,\n );\n break;\n\n case \"zoom\":\n nodes.push(\n <button\n key=\"zoom-out\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomOut}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom out\"\n >\n <MinusIcon />\n </button>,\n <span key=\"zoom-label\" className=\"epochs-pdf-viewer__zoom-label\">\n {Math.round(ctx.scale * 100)}%\n </span>,\n <button\n key=\"zoom-in\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomIn}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom in\"\n >\n <PlusIcon />\n </button>,\n <button\n key=\"zoom-fit\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={() => void ctx.handleFitWidth()}\n disabled={ctx.status !== \"ready\"}\n title=\"Fit to width\"\n >\n Fit\n </button>,\n );\n break;\n\n case \"rotate\":\n nodes.push(\n <button\n key=\"rotate\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleRotate}\n disabled={ctx.status !== \"ready\"}\n title=\"Rotate\"\n >\n <RotateIcon />\n </button>,\n );\n break;\n\n case \"highlight\":\n nodes.push(\n <button\n key=\"highlight\"\n type=\"button\"\n className={\n ctx.markupTool === \"highlight\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"highlight\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Highlight text — select text to highlight\"\n >\n <HighlightIcon />\n </button>,\n );\n break;\n\n case \"underline\":\n nodes.push(\n <button\n key=\"underline\"\n type=\"button\"\n className={\n ctx.markupTool === \"underline\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"underline\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Underline text — select text to underline\"\n >\n <UnderlineIcon />\n </button>,\n );\n break;\n\n case \"signature\":\n nodes.push(\n <button\n key=\"signature\"\n type=\"button\"\n className={\n ctx.markupTool === \"sign\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => {\n if (\n !ctx.hasFixedSignatureFields &&\n ctx.pendingSignature &&\n ctx.markupTool !== \"sign\"\n ) {\n ctx.setMarkupTool(\"sign\");\n return;\n }\n ctx.setSignaturePadOpen(true);\n }}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedSignatureFields\n ? \"Create e-signature for a fixed field\"\n : ctx.pendingSignature\n ? \"Place signature — click on the page, then drag to move\"\n : \"Create e-signature\"\n }\n >\n <SignatureIcon />\n </button>,\n );\n break;\n\n case \"text\":\n nodes.push(\n <button\n key=\"text\"\n type=\"button\"\n className={\n ctx.markupTool === \"text\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"text\")}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedTextFields\n ? \"Edit text in predefined areas — click to type\"\n : \"Edit PDF text — select words, then change them\"\n }\n >\n <TextIcon />\n </button>,\n );\n break;\n\n case \"erase\":\n nodes.push(\n <button\n key=\"erase\"\n type=\"button\"\n className={\n ctx.markupTool === \"erase\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"erase\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Remove text — select PDF words to cover them, or click added markup\"\n >\n <EraserIcon />\n </button>,\n );\n break;\n\n case \"clear\":\n nodes.push(\n <button\n key=\"clear\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={ctx.handleClearAnnotations}\n disabled={\n ctx.status !== \"ready\" ||\n (ctx.annotationsLength === 0 &&\n ctx.signaturesLength === 0 &&\n ctx.textsLength === 0)\n }\n title=\"Clear all markup\"\n >\n Clear\n </button>,\n );\n break;\n\n case \"reload\":\n nodes.push(\n <button\n key=\"reload\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.loadDocument()}\n title=\"Reload\"\n >\n <RefreshIcon />\n </button>,\n );\n break;\n\n case \"print\":\n nodes.push(\n <button\n key=\"print\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handlePrint()}\n disabled={ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isPrinting}\n title={\n ctx.isPrinting\n ? \"Preparing print…\"\n : \"Print (includes highlights & underlines)\"\n }\n >\n <PrinterIcon />\n </button>,\n );\n break;\n\n case \"open\":\n nodes.push(\n <a\n key=\"open\"\n className=\"epochs-pdf-viewer__btn\"\n href={ctx.displayUrl || ctx.resolvedUrl || undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"Open in new tab\"\n >\n <ExternalLinkIcon />\n </a>,\n );\n break;\n\n case \"download\":\n nodes.push(\n <button\n key=\"download\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handleDownload()}\n disabled={\n ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isDownloading\n }\n title={\n ctx.isDownloading\n ? \"Preparing download…\"\n : ctx.annotationsLength > 0 ||\n ctx.signaturesLength > 0 ||\n ctx.textsLength > 0\n ? \"Download PDF with markup\"\n : \"Download PDF\"\n }\n >\n <DownloadIcon />\n </button>,\n );\n break;\n\n default:\n break;\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n\nexport function renderMarkupExtras(\n ctx: ToolbarRenderContext,\n enabledIds: Set<ToolbarToolId>,\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (\n ctx.markupTool === \"sign\" &&\n ctx.pendingSignature &&\n !ctx.hasFixedSignatureFields &&\n enabledIds.has(\"signature\")\n ) {\n nodes.push(\n <span key=\"sign-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Click page to place duplicate/new signature\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"text\" &&\n enabledIds.has(\"text\")\n ) {\n nodes.push(\n <span key=\"text-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n {ctx.hasFixedTextFields\n ? \"Click in a predefined text area to type\"\n : \"Select text to edit it — e.g. change this PDF to this is PDF\"}\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"erase\" &&\n enabledIds.has(\"erase\")\n ) {\n nodes.push(\n <span key=\"erase-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Select PDF words to remove · click added text/markup to erase\n </span>,\n );\n }\n\n if (\n (ctx.markupTool === \"highlight\" && enabledIds.has(\"highlight\")) ||\n (ctx.markupTool === \"underline\" && enabledIds.has(\"underline\"))\n ) {\n const activeMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.highlightHex : ctx.underlineHex;\n const setActiveMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.setHighlightHex : ctx.setUnderlineHex;\n const activePresets =\n ctx.markupTool === \"highlight\" ? HIGHLIGHT_PRESETS : UNDERLINE_PRESETS;\n\n nodes.push(\n <div\n key=\"color-picker\"\n className=\"epochs-pdf-viewer__color-picker\"\n role=\"group\"\n aria-label={`${ctx.markupTool} color`}\n >\n {activePresets.map((preset) => (\n <button\n key={preset.id}\n type=\"button\"\n className={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n ? \"epochs-pdf-viewer__swatch epochs-pdf-viewer__swatch--active\"\n : \"epochs-pdf-viewer__swatch\"\n }\n style={{ background: preset.hex }}\n title={preset.label}\n aria-label={preset.label}\n aria-pressed={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n }\n onClick={() => setActiveMarkupHex(normalizeHex(preset.hex))}\n />\n ))}\n <label\n className=\"epochs-pdf-viewer__custom-color\"\n title=\"Custom color\"\n >\n <span\n className=\"epochs-pdf-viewer__custom-color-chip\"\n style={{ background: activeMarkupHex }}\n />\n <input\n type=\"color\"\n value={normalizeHex(activeMarkupHex)}\n onChange={(e) =>\n setActiveMarkupHex(normalizeHex(e.target.value))\n }\n aria-label=\"Custom color\"\n />\n </label>\n </div>,\n );\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport { PageCanvas } from \"./PageCanvas\";\nimport { Thumbnail as ThumbnailStrip } from \"./Thumbnail\";\nimport {\n ensurePdfWorker,\n pdfjsLib,\n resolvePdfUrl,\n sourceToArrayBuffer,\n} from \"./load\";\nimport type { PdfDoc, PdfViewerProps, ToolbarLayout, ViewerStatus } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport {\n DEFAULT_HIGHLIGHT_HEX,\n DEFAULT_UNDERLINE_HEX,\n hexToMarkupColor,\n} from \"./markup\";\nimport {\n buildPdfFromJpegPages,\n renderAllPagesWithMarkup,\n triggerBlobDownload,\n} from \"./exportPages\";\nimport { SignaturePad } from \"./SignaturePad\";\nimport type { RememberedFieldFills, RememberedSignFill } from \"./SignaturePad\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId, signatureDisplaySize } from \"./signature\";\nimport { pageSizeFromSurface, viewportRectToPage } from \"./coords\";\nimport type { TextAnnotation } from \"./text\";\nimport {\n createTextId,\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n} from \"./text\";\nimport {\n DEFAULT_TOOLBAR_LAYOUT,\n getToolbarToolId,\n isToolbarTool,\n type ToolbarToolComponent,\n type ToolbarToolId,\n} from \"./toolbarTools\";\nimport {\n isMarkupToolbarTool,\n renderMarkupExtras,\n renderToolbarTool,\n type ToolbarRenderContext,\n} from \"./ToolbarButtons\";\nimport \"./PdfViewer.css\";\n\nfunction resolveToolbarLayout(\n enableToolbar: boolean | ToolbarLayout | undefined,\n flags: {\n enableThumbnails?: boolean;\n enableNavigation: boolean;\n enableZoom: boolean;\n enableRotate: boolean;\n enableReload: boolean;\n enablePrint: boolean;\n enableOpen: boolean;\n enableDownload: boolean;\n enableHighlight: boolean;\n enableUnderline: boolean;\n enableSignature: boolean;\n enableText: boolean;\n enableErase: boolean;\n enableClear: boolean;\n },\n): { left: ToolbarToolId[]; right: ToolbarToolId[] } | null {\n if (!enableToolbar) return null;\n\n if (Array.isArray(enableToolbar)) {\n const toIds = (side: ToolbarToolComponent[] | undefined) =>\n (side ?? [])\n .filter(isToolbarTool)\n .map(getToolbarToolId);\n\n return {\n left: toIds(enableToolbar[0]),\n right: toIds(enableToolbar[1]),\n };\n }\n\n const showThumbnailsToggle = flags.enableThumbnails;\n const filterByFlag = (\n tools: readonly ToolbarToolComponent[],\n enabled: Partial<Record<ToolbarToolId, boolean>>,\n ) =>\n tools\n .map(getToolbarToolId)\n .filter((id) => enabled[id] !== false);\n\n const flagMap: Partial<Record<ToolbarToolId, boolean>> = {\n thumbnail: showThumbnailsToggle,\n navigation: flags.enableNavigation,\n zoom: flags.enableZoom,\n rotate: flags.enableRotate,\n reload: flags.enableReload,\n print: flags.enablePrint,\n open: flags.enableOpen,\n download: flags.enableDownload,\n highlight: flags.enableHighlight,\n underline: flags.enableUnderline,\n signature: flags.enableSignature,\n text: flags.enableText,\n erase: flags.enableErase,\n clear: flags.enableClear,\n };\n\n return {\n left: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[0], flagMap),\n right: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[1], flagMap),\n };\n}\n\nexport function PdfViewer({\n file,\n fileUrl,\n baseUrl = \"\",\n fetchOptions,\n height = \"80vh\",\n title = \"PDF document\",\n initialScale = 1,\n withThumbnails = false,\n thumbnailWidth = 140,\n maxThumbnails = 60,\n className,\n workerSrc,\n enableToolbar = false,\n enableThumbnails,\n enableNavigation = true,\n enableZoom = true,\n enableRotate = true,\n enableReload = true,\n enablePrint = true,\n enableOpen = true,\n enableDownload = true,\n enableMarkup = true,\n enableHighlight = true,\n enableUnderline = true,\n enableSignature = true,\n enableText = true,\n enableErase = true,\n enableClear = true,\n signatureFields: signatureFieldsProp = [],\n textFields = [],\n onSignatureComplete,\n onSignatureFieldsChange,\n applySignatureToSameTag = false,\n onFieldValueComplete,\n openSignaturePad: externalOpenSignaturePad = false,\n onSignaturePadClose,\n onSubmit,\n submitLabel = \"Submit\",\n submitLoading = false,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const lastBlobUrlRef = useRef<string | null>(null);\n const pageRefsRef = useRef(new Map<number, HTMLDivElement | null>());\n const isProgrammaticScrollRef = useRef(false);\n\n const binarySource = useMemo(() => {\n if (file && typeof file !== \"string\") return file;\n return null;\n }, [file]);\n\n const resolvedUrl = useMemo(() => {\n if (binarySource) return \"\";\n const asString =\n typeof file === \"string\" ? file : undefined;\n return resolvePdfUrl(asString, fileUrl, baseUrl);\n }, [binarySource, file, fileUrl, baseUrl]);\n\n const [status, setStatus] = useState<ViewerStatus>(\"idle\");\n const [pdfDoc, setPdfDoc] = useState<PdfDoc | null>(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [scale, setScale] = useState(initialScale);\n const [rotation, setRotation] = useState(0);\n const [displayUrl, setDisplayUrl] = useState<string | null>(null);\n const [showThumbnails, setShowThumbnails] = useState(false);\n const [isPrinting, setIsPrinting] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const [markupTool, setMarkupTool] = useState<MarkupTool>(\"none\");\n const [annotations, setAnnotations] = useState<MarkupAnnotation[]>([]);\n const [signatures, setSignatures] = useState<SignatureAnnotation[]>([]);\n const [texts, setTexts] = useState<TextAnnotation[]>([]);\n const [signaturePadOpen, setSignaturePadOpen] = useState(false);\n const [signaturePadFieldType, setSignaturePadFieldType] = useState<\n import(\"./signature\").SignatureFieldType | undefined\n >(undefined);\n const [rememberedByType, setRememberedByType] = useState<RememberedFieldFills>({});\n const [pendingSignature, setPendingSignature] = useState<{\n imageDataUrl: string;\n width: number;\n height: number;\n } | null>(null);\n const [selectedSignatureId, setSelectedSignatureId] = useState<string | null>(\n null,\n );\n const [selectedSignatureFieldId, setSelectedSignatureFieldId] = useState<string | null>(\n null,\n );\n const [editingSignatureId, setEditingSignatureId] = useState<string | null>(null);\n const [selectedTextId, setSelectedTextId] = useState<string | null>(null);\n const [selectedTextFieldId, setSelectedTextFieldId] = useState<string | null>(null);\n const [editingTextId, setEditingTextId] = useState<string | null>(null);\n const [highlightHex, setHighlightHex] = useState(DEFAULT_HIGHLIGHT_HEX);\n const [underlineHex, setUnderlineHex] = useState(DEFAULT_UNDERLINE_HEX);\n const hasFixedTextFields = textFields.length > 0;\n const [fieldValues, setFieldValues] = useState<Record<string, string>>({});\n const [signatureFields, setSignatureFields] =\n useState<SignatureField[]>(signatureFieldsProp);\n const signatureFieldsRef = useRef(signatureFields);\n signatureFieldsRef.current = signatureFields;\n\n useEffect(() => {\n signatureFieldsRef.current = signatureFieldsProp;\n setSignatureFields(signatureFieldsProp);\n setFieldValues((prev) => {\n const next = { ...prev };\n for (const field of signatureFieldsProp) {\n const fieldType = field.type ?? \"sign\";\n if (\n (fieldType === \"date\" || fieldType === \"text\") &&\n field.value != null &&\n field.value !== \"\"\n ) {\n next[field.id] = field.value;\n }\n }\n return next;\n });\n }, [signatureFieldsProp]);\n\n const hasFixedSignatureFields = signatureFields.length > 0;\n\n const isSignatureFieldFilled = useCallback(\n (\n field: SignatureField,\n sigs: SignatureAnnotation[],\n values: Record<string, string>,\n ) => {\n const fieldType = field.type ?? \"sign\";\n if (fieldType === \"date\" || fieldType === \"text\") {\n return Boolean((values[field.id] ?? field.value)?.trim());\n }\n return (\n sigs.some((sig) => sig.fieldId === field.id) ||\n Boolean(field.signatureDataUrl)\n );\n },\n [],\n );\n\n const writeFieldValueToFields = useCallback(\n (fieldIds: string[], value: string) => {\n const idSet = new Set(fieldIds);\n const prev = signatureFieldsRef.current;\n const next = prev.map((field) =>\n idSet.has(field.id) ? { ...field, value } : field,\n );\n signatureFieldsRef.current = next;\n setSignatureFields(next);\n onSignatureFieldsChange?.(next);\n\n setFieldValues((prevValues) => {\n const updated = { ...prevValues };\n for (const id of fieldIds) updated[id] = value;\n return updated;\n });\n\n for (const id of fieldIds) {\n onFieldValueComplete?.(id, value);\n }\n },\n [onFieldValueComplete, onSignatureFieldsChange],\n );\n\n const writeSignatureImageToFields = useCallback(\n (\n fieldIds: string | string[] | undefined,\n signature: SignatureAnnotation,\n signaturesByFieldId?: Map<string, SignatureAnnotation>,\n ) => {\n const prev = signatureFieldsRef.current;\n const ids = fieldIds == null ? null : Array.isArray(fieldIds) ? fieldIds : [fieldIds];\n const idSet = ids ? new Set(ids) : null;\n\n const next: SignatureField[] = idSet\n ? prev.map((field) =>\n idSet.has(field.id)\n ? { ...field, signatureDataUrl: signature.imageDataUrl }\n : field,\n )\n : [\n ...prev,\n {\n id: signature.id,\n pageNumber: signature.pageNumber,\n x: signature.x,\n y: signature.y,\n width: signature.width,\n height: signature.height,\n type: \"sign\",\n signatureDataUrl: signature.imageDataUrl,\n },\n ];\n signatureFieldsRef.current = next;\n setSignatureFields(next);\n onSignatureFieldsChange?.(next);\n\n if (!ids || ids.length === 0) {\n onSignatureComplete?.(undefined, signature);\n return;\n }\n for (const id of ids) {\n onSignatureComplete?.(\n id,\n signaturesByFieldId?.get(id) ?? signature,\n );\n }\n },\n [onSignatureComplete, onSignatureFieldsChange],\n );\n\n useEffect(() => {\n if (externalOpenSignaturePad) {\n setSignaturePadOpen(true);\n }\n }, [externalOpenSignaturePad]);\n\n const toolbarSides = useMemo(\n () =>\n resolveToolbarLayout(enableToolbar, {\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n }),\n [\n enableToolbar,\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n ],\n );\n\n const enabledToolIds = useMemo(() => {\n if (!toolbarSides) return new Set<ToolbarToolId>();\n return new Set([...toolbarSides.left, ...toolbarSides.right]);\n }, [toolbarSides]);\n\n useEffect(() => {\n const hasThumbTool = enabledToolIds.has(\"thumbnail\");\n if (!hasThumbTool) {\n setShowThumbnails(false);\n return;\n }\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const apply = () => {\n // Mobile: hide thumbnails by default. Desktop: respect withThumbnails.\n setShowThumbnails(mq.matches ? false : withThumbnails);\n };\n apply();\n mq.addEventListener(\"change\", apply);\n return () => mq.removeEventListener(\"change\", apply);\n }, [enabledToolIds, withThumbnails]);\n\n const showHighlight =\n !hasFixedSignatureFields && enabledToolIds.has(\"highlight\");\n const showUnderline =\n !hasFixedSignatureFields && enabledToolIds.has(\"underline\");\n const showSignature =\n enabledToolIds.has(\"signature\") || hasFixedSignatureFields;\n const showText = enabledToolIds.has(\"text\") || hasFixedTextFields;\n const showErase = !hasFixedSignatureFields && enabledToolIds.has(\"erase\");\n\n const revokeDisplayUrl = useCallback(() => {\n if (lastBlobUrlRef.current) {\n URL.revokeObjectURL(lastBlobUrlRef.current);\n lastBlobUrlRef.current = null;\n }\n }, []);\n\n const loadDocument = useCallback(async () => {\n if (!binarySource && !resolvedUrl) return;\n\n ensurePdfWorker(workerSrc);\n setStatus(\"loading\");\n setPdfDoc(null);\n setNumPages(0);\n setPageNumber(1);\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setPendingSignature(null);\n setSelectedSignatureId(null);\n setSelectedSignatureFieldId(null);\n setEditingSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n setMarkupTool(\"none\");\n\n try {\n const buffer = binarySource\n ? await sourceToArrayBuffer(binarySource, fetchOptions)\n : await sourceToArrayBuffer(resolvedUrl, fetchOptions);\n\n const blob = new Blob([buffer], { type: \"application/pdf\" });\n const blobUrl = URL.createObjectURL(blob);\n revokeDisplayUrl();\n lastBlobUrlRef.current = blobUrl;\n setDisplayUrl(blobUrl);\n\n const loadingTask = pdfjsLib.getDocument({\n data: buffer,\n cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/cmaps/`,\n cMapPacked: true,\n standardFontDataUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/standard_fonts/`,\n });\n const doc = await loadingTask.promise;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setStatus(\"ready\");\n } catch {\n setStatus(\"error\");\n }\n }, [\n binarySource,\n resolvedUrl,\n fetchOptions,\n revokeDisplayUrl,\n workerSrc,\n ]);\n\n useEffect(() => {\n if (!binarySource && !resolvedUrl) {\n setStatus(\"idle\");\n setPdfDoc(null);\n setNumPages(0);\n setDisplayUrl(null);\n revokeDisplayUrl();\n return;\n }\n\n void loadDocument();\n\n return () => {\n revokeDisplayUrl();\n };\n }, [binarySource, resolvedUrl, loadDocument, revokeDisplayUrl]);\n\n useEffect(() => {\n if (markupTool === \"highlight\" && !showHighlight) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"underline\" && !showUnderline) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"sign\" && !showSignature) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"text\" && !showText) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"erase\" && !showErase) {\n setMarkupTool(\"none\");\n }\n }, [showHighlight, showUnderline, showSignature, showText, showErase, markupTool]);\n\n const scrollToPage = useCallback(\n (targetPage: number) => {\n const clamped = Math.max(1, Math.min(numPages || 1, targetPage));\n const el = pageRefsRef.current.get(clamped);\n if (!el) {\n setPageNumber(clamped);\n return;\n }\n\n isProgrammaticScrollRef.current = true;\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n setPageNumber(clamped);\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n },\n [numPages],\n );\n\n const scrollToSignatureField = useCallback(\n (field: SignatureField) => {\n const pageEl = pageRefsRef.current.get(field.pageNumber);\n if (pageEl) {\n isProgrammaticScrollRef.current = true;\n setPageNumber(field.pageNumber);\n }\n\n const focusField = () => {\n const fieldEl = containerRef.current?.querySelector(\n `[data-signature-field-id=\"${CSS.escape(field.id)}\"]`,\n ) as HTMLElement | null;\n\n if (fieldEl) {\n fieldEl.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n } else if (pageEl) {\n pageEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n };\n\n window.requestAnimationFrame(() => {\n window.setTimeout(focusField, 40);\n });\n },\n [],\n );\n\n useEffect(() => {\n if (status !== \"ready\" || !containerRef.current || !numPages) return;\n\n const container = containerRef.current;\n const observer = new IntersectionObserver(\n (entries) => {\n if (isProgrammaticScrollRef.current) return;\n\n let best: { page: number; ratio: number } | null = null;\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n const page = Number.parseInt(\n (e.target as HTMLElement).dataset.pageNumber || \"0\",\n 10,\n );\n if (!page) continue;\n if (!best || e.intersectionRatio > best.ratio) {\n best = { page, ratio: e.intersectionRatio };\n }\n }\n if (best) setPageNumber(best.page);\n },\n {\n root: container,\n threshold: [0.25, 0.5, 0.75],\n },\n );\n\n for (let p = 1; p <= numPages; p += 1) {\n const el = pageRefsRef.current.get(p);\n if (el) observer.observe(el);\n }\n\n return () => observer.disconnect();\n }, [status, numPages]);\n\n const canGoPrev = pageNumber > 1;\n const canGoNext = numPages ? pageNumber < numPages : false;\n\n const handlePrev = useCallback(() => {\n if (!canGoPrev) return;\n scrollToPage(pageNumber - 1);\n }, [canGoPrev, pageNumber, scrollToPage]);\n\n const handleNext = useCallback(() => {\n if (!canGoNext) return;\n scrollToPage(pageNumber + 1);\n }, [canGoNext, pageNumber, scrollToPage]);\n\n const handleRotate = useCallback(() => {\n setRotation((r) => (r + 90) % 360);\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((s) => Math.max(0.25, Math.round((s - 0.1) * 100) / 100));\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setScale((s) => Math.min(5, Math.round((s + 0.1) * 100) / 100));\n }, []);\n\n const handleFitWidth = useCallback(async () => {\n if (!pdfDoc || !containerRef.current) return;\n try {\n const page = await pdfDoc.getPage(pageNumber);\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n // Body already excludes the thumbnail rail; subtract page padding only.\n const isMobile = window.matchMedia(\"(max-width: 720px)\").matches;\n const pagePadding = isMobile ? 16 : 24;\n const containerWidth = Math.max(\n 0,\n containerRef.current.clientWidth - pagePadding,\n );\n const nextScale = containerWidth / viewportAt1.width;\n setScale(Math.max(0.25, Math.min(5, Math.round(nextScale * 100) / 100)));\n } catch {\n // ignore\n }\n }, [pdfDoc, pageNumber, rotation]);\n\n // On mobile, auto-fit so fixed-field coordinates/dimensions stay aligned.\n useEffect(() => {\n if (status !== \"ready\" || !pdfDoc) return;\n if (!window.matchMedia(\"(max-width: 720px)\").matches) return;\n\n let cancelled = false;\n const run = () => {\n if (!cancelled) void handleFitWidth();\n };\n run();\n\n const container = containerRef.current;\n const observer =\n typeof ResizeObserver !== \"undefined\" && container\n ? new ResizeObserver(() => run())\n : null;\n observer?.observe(container!);\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const onMq = () => {\n if (mq.matches) run();\n };\n mq.addEventListener(\"change\", onMq);\n\n return () => {\n cancelled = true;\n observer?.disconnect();\n mq.removeEventListener(\"change\", onMq);\n };\n }, [status, pdfDoc, showThumbnails, rotation, handleFitWidth]);\n\n const fieldValueTexts = useMemo((): TextAnnotation[] => {\n return signatureFields.flatMap((field) => {\n const fieldType = field.type ?? \"sign\";\n if (fieldType !== \"date\" && fieldType !== \"text\") return [];\n const value = (fieldValues[field.id] ?? field.value ?? \"\").trim();\n if (!value) return [];\n const fontSize = Math.max(\n 10,\n Math.min(DEFAULT_TEXT_FONT_SIZE, field.height * 0.55),\n );\n return [\n {\n id: `fv_${field.id}`,\n pageNumber: field.pageNumber,\n fieldId: field.id,\n x: field.x + 4,\n y: field.y + Math.max(2, (field.height - fontSize) / 2),\n width: Math.max(12, field.width - 8),\n height: Math.max(fontSize * 1.2, field.height - 4),\n value,\n fontSize,\n color: DEFAULT_TEXT_COLOR,\n },\n ];\n });\n }, [signatureFields, fieldValues]);\n\n const textsForExport = useMemo(\n () => [...texts, ...fieldValueTexts],\n [texts, fieldValueTexts],\n );\n\n const handlePrint = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n setIsPrinting(true);\n try {\n // Render in the main document — pdf.js fonts break on iframe canvases.\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 1.5,\n rotation,\n annotations,\n signatures,\n texts: textsForExport,\n mimeType: \"image/png\",\n });\n\n const iframe = document.createElement(\"iframe\");\n iframe.style.position = \"fixed\";\n iframe.style.right = \"0\";\n iframe.style.bottom = \"0\";\n iframe.style.width = \"0\";\n iframe.style.height = \"0\";\n iframe.style.border = \"0\";\n iframe.setAttribute(\"aria-hidden\", \"true\");\n document.body.appendChild(iframe);\n\n const doc = iframe.contentWindow?.document;\n if (!doc) throw new Error(\"print iframe not available\");\n\n doc.open();\n doc.write(`<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <title>${title.replace(/</g, \"&lt;\")}</title>\n <style>\n html, body { margin: 0; padding: 0; }\n img { width: 100%; display: block; }\n .page { page-break-after: always; }\n .page:last-child { page-break-after: auto; }\n @page { margin: 10mm; }\n </style>\n </head>\n <body></body>\n</html>`);\n doc.close();\n\n const body = doc.body;\n for (const page of pages) {\n const img = doc.createElement(\"img\");\n img.src = page.dataUrl;\n const wrapper = doc.createElement(\"div\");\n wrapper.className = \"page\";\n wrapper.appendChild(img);\n body.appendChild(wrapper);\n }\n\n // Wait for images to decode before printing\n await Promise.all(\n Array.from(body.querySelectorAll(\"img\")).map(\n (img) =>\n img.decode?.().catch(() => undefined) ?? Promise.resolve(),\n ),\n );\n\n setTimeout(() => {\n try {\n iframe.contentWindow?.focus();\n iframe.contentWindow?.print();\n } finally {\n setTimeout(() => {\n try {\n document.body.removeChild(iframe);\n } catch {\n // ignore\n }\n }, 1000);\n }\n }, 50);\n } catch {\n try {\n if (displayUrl) {\n window.open(displayUrl, \"_blank\", \"noopener,noreferrer\");\n } else if (resolvedUrl) {\n window.open(resolvedUrl, \"_blank\", \"noopener,noreferrer\");\n }\n } catch {\n // ignore\n }\n } finally {\n setIsPrinting(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, resolvedUrl, annotations, signatures, textsForExport]);\n\n const handleDownload = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n const filename = `${title.replace(/[^\\w.-]+/g, \"_\") || \"document\"}.pdf`;\n const hasLayers =\n annotations.length > 0 ||\n signatures.length > 0 ||\n textsForExport.length > 0;\n\n // No markup → keep original PDF bytes\n if (!hasLayers && displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n return;\n }\n\n setIsDownloading(true);\n try {\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 2,\n rotation,\n annotations,\n signatures,\n texts: textsForExport,\n mimeType: \"image/jpeg\",\n quality: 0.92,\n });\n const pdfBytes = buildPdfFromJpegPages(pages);\n const copy = new Uint8Array(pdfBytes.byteLength);\n copy.set(pdfBytes);\n triggerBlobDownload(\n new Blob([copy], { type: \"application/pdf\" }),\n filename,\n );\n } catch {\n if (displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n }\n } finally {\n setIsDownloading(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, annotations, signatures, textsForExport]);\n\n const toggleMarkupTool = useCallback((tool: MarkupTool) => {\n setMarkupTool((current) => (current === tool ? \"none\" : tool));\n }, []);\n\n const activeMarkupHex =\n markupTool === \"highlight\"\n ? highlightHex\n : markupTool === \"underline\"\n ? underlineHex\n : null;\n\n const activeMarkupColor =\n markupTool === \"highlight\" || markupTool === \"underline\"\n ? hexToMarkupColor(activeMarkupHex!, markupTool)\n : undefined;\n\n const selectedSignature =\n selectedSignatureId != null\n ? signatures.find((sig) => sig.id === selectedSignatureId) ?? null\n : null;\n\n const handleAddAnnotation = useCallback((annotation: MarkupAnnotation) => {\n setAnnotations((prev) => [...prev, annotation]);\n }, []);\n\n const handleRemoveAnnotation = useCallback((id: string) => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const handleClearAnnotations = useCallback(() => {\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setSelectedSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n }, []);\n\n const advanceToNextUnsignedField = useCallback(\n (fromFieldId: string, filledIds: Set<string>) => {\n const currentIndex = signatureFields.findIndex(\n (field) => field.id === fromFieldId,\n );\n const nextField =\n signatureFields\n .slice(currentIndex + 1)\n .find((field) => !filledIds.has(field.id)) ??\n signatureFields\n .slice(0, Math.max(0, currentIndex))\n .find((field) => !filledIds.has(field.id));\n\n if (!nextField) {\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n return;\n }\n\n setSelectedSignatureFieldId(nextField.id);\n setSelectedSignatureId(null);\n setEditingSignatureId(null);\n setSignaturePadFieldType(nextField.type ?? \"sign\");\n scrollToSignatureField(nextField);\n window.setTimeout(() => {\n setSignaturePadOpen(true);\n }, 350);\n },\n [scrollToSignatureField, signatureFields],\n );\n\n const handleOpenSignaturePad = useCallback(\n (fieldType?: import(\"./signature\").SignatureFieldType) => {\n setSignaturePadFieldType(fieldType);\n setSignaturePadOpen(true);\n },\n [],\n );\n\n const handleFieldValueChange = useCallback((fieldId: string, value: string) => {\n setFieldValues((prev) => ({ ...prev, [fieldId]: value }));\n }, []);\n\n const handleFieldValueCommit = useCallback(\n (fieldId: string) => {\n const val = fieldValues[fieldId];\n if (val) onFieldValueComplete?.(fieldId, val);\n\n const currentIndex = signatureFields.findIndex((f) => f.id === fieldId);\n const filledIds = new Set(\n Object.keys(fieldValues).filter((k) => fieldValues[k]?.trim()),\n );\n filledIds.add(fieldId);\n const nextField =\n signatureFields.slice(currentIndex + 1).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n ) ??\n signatureFields.slice(0, Math.max(0, currentIndex)).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n );\n if (nextField) {\n setSelectedSignatureFieldId(nextField.id);\n scrollToSignatureField(nextField);\n }\n },\n [signatureFields, fieldValues, signatures, scrollToSignatureField, onFieldValueComplete],\n );\n\n const handleSignatureSave = useCallback(\n (imageDataUrl: string, sourceWidth: number, sourceHeight: number) => {\n const size = signatureDisplaySize(sourceWidth, sourceHeight);\n\n if (editingSignatureId) {\n setSignatures((prev) =>\n prev.map((sig) =>\n sig.id === editingSignatureId\n ? {\n ...sig,\n imageDataUrl,\n width: sig.fieldId ? sig.width : size.width,\n height: sig.fieldId ? sig.height : size.height,\n }\n : sig,\n ),\n );\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n return;\n }\n\n if (hasFixedSignatureFields) {\n const targetField =\n signatureFields.find(\n (field) =>\n field.id === selectedSignatureFieldId &&\n (field.type ?? \"sign\") === \"sign\" &&\n !signatures.some((sig) => sig.fieldId === field.id),\n ) ??\n signatureFields.find(\n (field) =>\n (field.type ?? \"sign\") === \"sign\" &&\n !signatures.some((sig) => sig.fieldId === field.id),\n );\n\n if (!targetField) {\n setSignaturePadOpen(false);\n return;\n }\n\n const targetFields =\n applySignatureToSameTag && targetField.signature_tag\n ? signatureFields.filter(\n (field) =>\n (field.type ?? \"sign\") === \"sign\" &&\n field.signature_tag === targetField.signature_tag &&\n !signatures.some((sig) => sig.fieldId === field.id),\n )\n : [targetField];\n\n const newSignatures: SignatureAnnotation[] = targetFields.map((field) => ({\n id: createSignatureId(),\n fieldId: field.id,\n pageNumber: field.pageNumber,\n x: field.x,\n y: field.y,\n width: field.width,\n height: field.height,\n imageDataUrl,\n }));\n\n const targetIds = new Set(targetFields.map((field) => field.id));\n setSignatures((prev) => [\n ...prev.filter((sig) => !sig.fieldId || !targetIds.has(sig.fieldId)),\n ...newSignatures,\n ]);\n\n const byFieldId = new Map(\n newSignatures.map((sig) => [sig.fieldId as string, sig]),\n );\n writeSignatureImageToFields(\n targetFields.map((field) => field.id),\n newSignatures[0],\n byFieldId,\n );\n\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSelectedSignatureId(newSignatures[0]?.id ?? null);\n\n const filledIds = new Set(\n signatureFields\n .filter((field) =>\n isSignatureFieldFilled(\n field,\n [...signatures, ...newSignatures],\n fieldValues,\n ),\n )\n .map((field) => field.id),\n );\n for (const id of targetIds) filledIds.add(id);\n\n advanceToNextUnsignedField(targetField.id, filledIds);\n return;\n }\n\n const currentPageEl = pageRefsRef.current.get(pageNumber);\n const surface = currentPageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n let x = 24;\n let y = 24;\n if (surface) {\n const pageSize = pageSizeFromSurface(surface, scale);\n const scrollContainer = surface.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null;\n\n if (scrollContainer) {\n const visible = viewportRectToPage(\n scrollContainer.getBoundingClientRect(),\n surface,\n scale,\n );\n const visibleTop = Math.max(0, visible.top);\n const visibleBottom = Math.min(pageSize.height, visible.bottom);\n const visibleLeft = Math.max(0, visible.left);\n const visibleRight = Math.min(pageSize.width, visible.right);\n x = Math.max(0, (visibleLeft + visibleRight) / 2 - size.width / 2);\n y = Math.max(0, (visibleTop + visibleBottom) / 2 - size.height / 2);\n x = Math.min(x, Math.max(0, pageSize.width - size.width));\n y = Math.min(y, Math.max(0, pageSize.height - size.height));\n } else {\n x = Math.max(0, (pageSize.width - size.width) / 2);\n y = Math.max(0, (pageSize.height - size.height) / 2);\n }\n }\n\n const signature: SignatureAnnotation = {\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: size.width,\n height: size.height,\n imageDataUrl,\n };\n\n setSignatures((prev) => [...prev, signature]);\n writeSignatureImageToFields(undefined, signature);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n },\n [\n advanceToNextUnsignedField,\n applySignatureToSameTag,\n editingSignatureId,\n fieldValues,\n hasFixedSignatureFields,\n isSignatureFieldFilled,\n pageNumber,\n scale,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n writeSignatureImageToFields,\n ],\n );\n\n const handleSaveFieldValue = useCallback(\n (value: string, fieldType: \"date\" | \"text\") => {\n if (hasFixedSignatureFields) {\n const targetField =\n signatureFields.find(\n (field) =>\n field.id === selectedSignatureFieldId &&\n (field.type ?? \"sign\") === fieldType,\n ) ??\n signatureFields.find((field) => (field.type ?? \"sign\") === fieldType);\n\n if (!targetField) {\n setSignaturePadOpen(false);\n return;\n }\n\n const targetFields =\n applySignatureToSameTag && targetField.signature_tag\n ? signatureFields.filter(\n (field) =>\n (field.type ?? \"sign\") === fieldType &&\n field.signature_tag === targetField.signature_tag,\n )\n : [targetField];\n\n const targetIds = targetFields.map((field) => field.id);\n writeFieldValueToFields(targetIds, value);\n\n const nextValues = { ...fieldValues };\n for (const id of targetIds) nextValues[id] = value;\n\n const filledIds = new Set(\n signatureFields\n .filter((field) =>\n isSignatureFieldFilled(field, signatures, nextValues),\n )\n .map((field) => field.id),\n );\n\n advanceToNextUnsignedField(targetField.id, filledIds);\n return;\n }\n\n const fontSize = DEFAULT_TEXT_FONT_SIZE;\n const width = Math.max(80, value.length * fontSize * 0.55);\n const height = fontSize * 1.25;\n let x = 24;\n let y = 24;\n\n const currentPageEl = pageRefsRef.current.get(pageNumber);\n const surface = currentPageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n if (surface) {\n const pageSize = pageSizeFromSurface(surface, scale);\n const scrollContainer = surface.closest(\n \".epochs-pdf-viewer__body\",\n ) as HTMLElement | null;\n if (scrollContainer) {\n const visible = viewportRectToPage(\n scrollContainer.getBoundingClientRect(),\n surface,\n scale,\n );\n const visibleTop = Math.max(0, visible.top);\n const visibleBottom = Math.min(pageSize.height, visible.bottom);\n const visibleLeft = Math.max(0, visible.left);\n const visibleRight = Math.min(pageSize.width, visible.right);\n x = Math.max(0, (visibleLeft + visibleRight) / 2 - width / 2);\n y = Math.max(0, (visibleTop + visibleBottom) / 2 - height / 2);\n x = Math.min(x, Math.max(0, pageSize.width - width));\n y = Math.min(y, Math.max(0, pageSize.height - height));\n }\n }\n\n const text: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x,\n y,\n width,\n height,\n value,\n fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n setTexts((prev) => [...prev, text]);\n setSelectedTextId(text.id);\n setSignaturePadOpen(false);\n setMarkupTool(\"none\");\n },\n [\n advanceToNextUnsignedField,\n applySignatureToSameTag,\n fieldValues,\n hasFixedSignatureFields,\n isSignatureFieldFilled,\n pageNumber,\n scale,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n writeFieldValueToFields,\n ],\n );\n\n const handleAddSignature = useCallback((signature: SignatureAnnotation) => {\n setSignatures((prev) => [...prev, signature]);\n writeSignatureImageToFields(undefined, signature);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, [writeSignatureImageToFields]);\n\n const handleUpdateSignature = useCallback(\n (id: string, patch: Partial<SignatureAnnotation>) => {\n setSignatures((prev) =>\n prev.map((sig) => (sig.id === id ? { ...sig, ...patch } : sig)),\n );\n },\n [],\n );\n\n const handleRemoveSignature = useCallback((id: string) => {\n const removed = signatures.find((sig) => sig.id === id);\n setSignatures((prev) => prev.filter((sig) => sig.id !== id));\n setSelectedSignatureId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedSignatureFieldId(removed.fieldId);\n }\n }, [signatures]);\n\n const handleDuplicateSignature = useCallback((id?: string) => {\n const target = id\n ? signatures.find((sig) => sig.id === id) ?? null\n : selectedSignature;\n if (!target) return;\n\n const pageEl = pageRefsRef.current.get(target.pageNumber);\n const surface = pageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n const offset = 18;\n let x = target.x + offset;\n let y = target.y + offset;\n\n if (surface) {\n const pageWidth = surface.clientWidth / scale;\n const pageHeight = surface.clientHeight / scale;\n x = Math.min(\n Math.max(0, x),\n Math.max(0, pageWidth - target.width),\n );\n y = Math.min(\n Math.max(0, y),\n Math.max(0, pageHeight - target.height),\n );\n }\n\n const duplicate: SignatureAnnotation = {\n ...target,\n id: createSignatureId(),\n x,\n y,\n };\n\n setSignatures((prev) => [...prev, duplicate]);\n setSelectedSignatureId(duplicate.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, [scale, selectedSignature, signatures]);\n\n const handleEditSignature = useCallback((id?: string) => {\n const targetId = id ?? selectedSignature?.id;\n if (!targetId) return;\n const existing = signatures.find((sig) => sig.id === targetId);\n const field = existing?.fieldId\n ? signatureFields.find((item) => item.id === existing.fieldId)\n : undefined;\n setSignaturePadFieldType(field?.type ?? \"sign\");\n setSelectedSignatureId(targetId);\n setEditingSignatureId(targetId);\n setSignaturePadOpen(true);\n }, [selectedSignature, signatures, signatureFields]);\n\n const handleAddText = useCallback((text: TextAnnotation) => {\n setTexts((prev) => {\n if (text.fieldId) {\n return [...prev.filter((item) => item.fieldId !== text.fieldId), text];\n }\n return [...prev, text];\n });\n setSelectedTextId(text.id);\n if (text.fieldId) setSelectedTextFieldId(text.fieldId);\n }, []);\n\n const handleUpdateText = useCallback(\n (id: string, patch: Partial<TextAnnotation>) => {\n setTexts((prev) =>\n prev.map((text) => (text.id === id ? { ...text, ...patch } : text)),\n );\n },\n [],\n );\n\n const handleRemoveText = useCallback((id: string) => {\n const removed = texts.find((text) => text.id === id);\n setTexts((prev) => prev.filter((text) => text.id !== id));\n setSelectedTextId((current) => (current === id ? null : current));\n setEditingTextId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedTextFieldId(removed.fieldId);\n }\n }, [texts]);\n\n // Sync fixed text field geometry if the prop changes\n useEffect(() => {\n if (!hasFixedTextFields) return;\n setTexts((prev) =>\n prev.map((text) => {\n if (!text.fieldId) return text;\n const field = textFields.find((item) => item.id === text.fieldId);\n if (!field) return text;\n return {\n ...text,\n pageNumber: field.pageNumber,\n x: field.x,\n y: field.y,\n width: field.width,\n height: field.height,\n fontSize: field.fontSize ?? text.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n color: field.color ?? text.color ?? DEFAULT_TEXT_COLOR,\n };\n }),\n );\n }, [hasFixedTextFields, textFields]);\n\n const goToSignatureField = useCallback(\n (direction: -1 | 1) => {\n if (!signatureFields.length) return;\n const from =\n selectedSignatureFieldId != null\n ? signatureFields.findIndex((f) => f.id === selectedSignatureFieldId)\n : -1;\n const nextIndex = Math.min(\n signatureFields.length - 1,\n Math.max(0, (from < 0 ? 0 : from) + direction),\n );\n const field = signatureFields[nextIndex];\n if (!field) return;\n setSelectedSignatureFieldId(field.id);\n setSelectedSignatureId(\n signatures.find((sig) => sig.fieldId === field.id)?.id ?? null,\n );\n scrollToSignatureField(field);\n },\n [\n scrollToSignatureField,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n ],\n );\n\n if (!binarySource && !resolvedUrl) {\n return (\n <div\n data-testid=\"pdf-viewer\"\n className={`epochs-pdf-viewer epochs-pdf-viewer--empty ${className ?? \"\"}`.trim()}\n >\n No PDF file provided.\n </div>\n );\n }\n\n const rootStyle: CSSProperties = {\n height,\n };\n\n const toolbarCtx: ToolbarRenderContext = {\n status,\n showThumbnails,\n setShowThumbnails,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n pageNumber,\n numPages,\n scrollToPage,\n scale,\n handleZoomOut,\n handleZoomIn,\n handleFitWidth,\n handleRotate,\n markupTool,\n toggleMarkupTool: (tool) => toggleMarkupTool(tool),\n hasFixedSignatureFields,\n hasFixedTextFields,\n pendingSignature,\n setMarkupTool,\n setSignaturePadOpen,\n annotationsLength: annotations.length,\n signaturesLength: signatures.length,\n textsLength: texts.length,\n handleClearAnnotations,\n highlightHex,\n underlineHex,\n setHighlightHex,\n setUnderlineHex,\n loadDocument,\n handlePrint,\n isPrinting,\n pdfDoc,\n displayUrl,\n resolvedUrl,\n handleDownload,\n isDownloading,\n };\n\n const visibleToolIds = (ids: ToolbarToolId[]) =>\n ids.filter((id) => {\n if (\n hasFixedSignatureFields &&\n (id === \"highlight\" || id === \"underline\" || id === \"erase\")\n ) {\n return false;\n }\n return true;\n });\n\n const currentFieldIndex = selectedSignatureFieldId\n ? signatureFields.findIndex((field) => field.id === selectedSignatureFieldId)\n : 0;\n\n const filledFieldCount = signatureFields.filter((field) =>\n isSignatureFieldFilled(field, signatures, fieldValues),\n ).length;\n\n const fieldProgressPercent =\n signatureFields.length > 0\n ? Math.round((filledFieldCount / signatureFields.length) * 100)\n : 0;\n\n const renderSide = (ids: ToolbarToolId[], alignEnd = false) => {\n const visible = visibleToolIds(ids);\n if (visible.length === 0 && !alignEnd) {\n return <div className=\"epochs-pdf-viewer__toolbar-group\" />;\n }\n if (visible.length === 0) {\n return (\n <div className=\"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\" />\n );\n }\n\n const nodes = visible.map((id, index) => {\n const prev = visible[index - 1];\n const showMarkupSep =\n isMarkupToolbarTool(id) && (!prev || !isMarkupToolbarTool(prev));\n return (\n <Fragment key={id}>\n {renderToolbarTool(id, toolbarCtx, { showMarkupSep })}\n </Fragment>\n );\n });\n\n return (\n <div\n className={\n alignEnd\n ? \"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\"\n : \"epochs-pdf-viewer__toolbar-group\"\n }\n >\n {nodes}\n {renderMarkupExtras(toolbarCtx, new Set(visible))}\n </div>\n );\n };\n\n return (\n <div\n data-testid=\"pdf-viewer\"\n data-file-url={resolvedUrl || undefined}\n className={`epochs-pdf-viewer ${className ?? \"\"}`.trim()}\n style={rootStyle}\n >\n {toolbarSides ? (\n <div className=\"epochs-pdf-viewer__toolbar\">\n {renderSide(toolbarSides.left)}\n {renderSide(toolbarSides.right, true)}\n </div>\n ) : null}\n\n {(showSignature || externalOpenSignaturePad || hasFixedSignatureFields) ? (\n <SignaturePad\n open={signaturePadOpen}\n onClose={() => {\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n setSignaturePadFieldType(undefined);\n onSignaturePadClose?.();\n }}\n onSave={handleSignatureSave}\n onSaveFieldValue={handleSaveFieldValue}\n fieldType={signaturePadFieldType}\n showFieldTypeTabs={!hasFixedSignatureFields}\n textPlaceholder={\n signatureFields.find((field) => field.id === selectedSignatureFieldId)\n ?.placeholder\n }\n initialFieldValue={\n selectedSignatureFieldId\n ? fieldValues[selectedSignatureFieldId] ??\n signatureFields.find((field) => field.id === selectedSignatureFieldId)\n ?.value\n : undefined\n }\n targetSize={(() => {\n const field = signatureFields.find(\n (item) => item.id === selectedSignatureFieldId,\n );\n if (!field || (field.type ?? \"sign\") !== \"sign\") return undefined;\n return { width: field.width, height: field.height };\n })()}\n rememberedByType={rememberedByType}\n onRememberFill={(type, fill) => {\n setRememberedByType((prev) => {\n if (type === \"sign\") {\n return { ...prev, sign: fill as RememberedSignFill };\n }\n if (type === \"date\") {\n return { ...prev, date: fill as { value: string } };\n }\n return { ...prev, text: fill as { value: string } };\n });\n }}\n />\n ) : null}\n\n <div className=\"epochs-pdf-viewer__content\">\n {showThumbnails ? (\n <div\n className=\"epochs-pdf-viewer__thumbnails\"\n style={{ width: thumbnailWidth + 24 }}\n >\n {status === \"ready\" && pdfDoc ? (\n <>\n {Array.from({\n length: Math.min(numPages || 0, maxThumbnails),\n }).map((_, idx) => {\n const n = idx + 1;\n return (\n <div key={n} className=\"epochs-pdf-viewer__thumb-wrap\">\n <ThumbnailStrip\n pdfDoc={pdfDoc}\n pageNumber={n}\n isActive={n === pageNumber}\n rotation={rotation}\n onSelect={scrollToPage}\n width={thumbnailWidth}\n annotations={annotations}\n signatures={signatures}\n signatureFields={signatureFields}\n texts={textsForExport}\n textFields={textFields}\n />\n </div>\n );\n })}\n {numPages > maxThumbnails ? (\n <div className=\"epochs-pdf-viewer__thumb-more\">\n Showing first {maxThumbnails} pages\n </div>\n ) : null}\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__muted\">Thumbnails</div>\n )}\n </div>\n ) : null}\n\n <div ref={containerRef} className=\"epochs-pdf-viewer__body\">\n {status === \"loading\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__muted\">\n Loading PDF…\n <span className=\"epochs-pdf-viewer__spinner\" />\n </div>\n ) : null}\n\n {status === \"error\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__error\">\n Unable to load PDF.\n {resolvedUrl ? (\n <a\n className=\"epochs-pdf-viewer__open-link\"\n href={resolvedUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Open file\n </a>\n ) : null}\n </div>\n ) : null}\n\n {status === \"ready\" && pdfDoc ? (\n <div>\n {Array.from({ length: numPages }).map((_, idx) => {\n const p = idx + 1;\n return (\n <PageCanvas\n key={p}\n pdfDoc={pdfDoc}\n pageNumber={p}\n scale={scale}\n rotation={rotation}\n markupTool={enableMarkup ? markupTool : \"none\"}\n markupColor={activeMarkupColor}\n annotations={annotations}\n onAddAnnotation={handleAddAnnotation}\n onRemoveAnnotation={handleRemoveAnnotation}\n signatures={signatures}\n pendingSignature={pendingSignature}\n onAddSignature={handleAddSignature}\n onUpdateSignature={handleUpdateSignature}\n onRemoveSignature={handleRemoveSignature}\n onEditSignature={handleEditSignature}\n onDuplicateSignature={handleDuplicateSignature}\n selectedSignatureId={selectedSignatureId}\n onSelectSignature={setSelectedSignatureId}\n signatureFields={signatureFields}\n selectedSignatureFieldId={selectedSignatureFieldId}\n onSelectSignatureField={setSelectedSignatureFieldId}\n hasFixedSignatureFields={hasFixedSignatureFields}\n onOpenSignaturePad={handleOpenSignaturePad}\n fieldValues={fieldValues}\n onFieldValueChange={handleFieldValueChange}\n onFieldValueCommit={handleFieldValueCommit}\n texts={texts}\n onAddText={handleAddText}\n onUpdateText={handleUpdateText}\n onRemoveText={handleRemoveText}\n selectedTextId={selectedTextId}\n onSelectText={setSelectedTextId}\n textFields={textFields}\n selectedTextFieldId={selectedTextFieldId}\n onSelectTextField={setSelectedTextFieldId}\n hasFixedTextFields={hasFixedTextFields}\n editingTextId={editingTextId}\n onEditingTextIdChange={setEditingTextId}\n pageRef={(el) => {\n if (el) pageRefsRef.current.set(p, el);\n }}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n\n {hasFixedSignatureFields || onSubmit ? (\n <div className=\"epochs-pdf-viewer__footer\" role=\"navigation\" aria-label=\"Viewer actions\">\n {hasFixedSignatureFields ? (\n <>\n <div className=\"epochs-pdf-viewer__footer-nav\">\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={signatureFields.length <= 1 || currentFieldIndex <= 0}\n onClick={() => goToSignatureField(-1)}\n >\n Prev\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={\n signatureFields.length <= 1 ||\n currentFieldIndex >= signatureFields.length - 1\n }\n onClick={() => goToSignatureField(1)}\n >\n Next\n </button>\n </div>\n <div className=\"epochs-pdf-viewer__footer-center\">\n <span className=\"epochs-pdf-viewer__footer-label\">\n Field {Math.max(1, currentFieldIndex + 1)} of {signatureFields.length}\n </span>\n <div\n className=\"epochs-pdf-viewer__footer-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={fieldProgressPercent}\n aria-label=\"Signature progress\"\n >\n <div\n className=\"epochs-pdf-viewer__footer-progress-bar\"\n style={{ width: `${fieldProgressPercent}%` }}\n />\n </div>\n <span className=\"epochs-pdf-viewer__footer-percent\">\n {fieldProgressPercent}%\n </span>\n </div>\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__footer-center\" />\n )}\n {onSubmit ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={onSubmit}\n disabled={submitLoading}\n aria-busy={submitLoading || undefined}\n >\n {submitLoading ? (\n <span\n className=\"epochs-pdf-viewer__spinner epochs-pdf-viewer__spinner--btn\"\n aria-hidden=\"true\"\n />\n ) : null}\n {submitLabel}\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default PdfViewer;\n","import type {\n DocumentProps,\n ImageProps,\n LinkProps,\n PageProps,\n TextProps,\n ViewProps,\n} from \"./types\";\n\n/** Root document container. Must wrap one or more `<Page>` elements. */\nexport function Document(_props: DocumentProps): null {\n return null;\n}\nDocument.displayName = \"Document\";\n\n/** A single PDF page. */\nexport function Page(_props: PageProps): null {\n return null;\n}\nPage.displayName = \"Page\";\n\n/** Flexbox layout container. */\nexport function View(_props: ViewProps): null {\n return null;\n}\nView.displayName = \"View\";\n\n/** Text content. Children are flattened to a string. */\nexport function Text(_props: TextProps): null {\n return null;\n}\nText.displayName = \"Text\";\n\n/** Image placeholder (binary embedding planned). */\nexport function Image(_props: ImageProps): null {\n return null;\n}\nImage.displayName = \"Image\";\n\n/** Linked text. */\nexport function Link(_props: LinkProps): null {\n return null;\n}\nLink.displayName = \"Link\";\n","import { createElement, type ReactElement, type ReactNode } from \"react\";\nimport type { PdfNode, NodeType } from \"./types\";\n\nconst TYPE_MAP: Record<string, NodeType> = {\n Document: \"DOCUMENT\",\n Page: \"PAGE\",\n View: \"VIEW\",\n Text: \"TEXT\",\n Image: \"IMAGE\",\n Link: \"LINK\",\n};\n\nfunction getDisplayName(type: unknown): string | null {\n if (typeof type === \"string\") return type;\n if (typeof type === \"function\") {\n const fn = type as { displayName?: string; name?: string };\n return fn.displayName || fn.name || null;\n }\n return null;\n}\n\nfunction flattenChildren(children: ReactNode): ReactNode[] {\n const result: ReactNode[] = [];\n const visit = (node: ReactNode) => {\n if (node == null || typeof node === \"boolean\") return;\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n result.push(node);\n };\n visit(children);\n return result;\n}\n\nfunction collectText(children: ReactNode): string {\n return flattenChildren(children)\n .map((child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return String(child);\n }\n if (\n child &&\n typeof child === \"object\" &&\n \"props\" in (child as ReactElement)\n ) {\n const el = child as ReactElement<{ children?: ReactNode }>;\n return collectText(el.props.children);\n }\n return \"\";\n })\n .join(\"\");\n}\n\nexport function elementToPdfNode(element: ReactElement): PdfNode {\n const name = getDisplayName(element.type);\n const nodeType = name ? TYPE_MAP[name] : undefined;\n\n if (!nodeType) {\n throw new Error(\n `[epochs-pdf] Unsupported element \"${name ?? \"unknown\"}\". Use Document, Page, View, Text, Image, or Link.`,\n );\n }\n\n const props = { ...(element.props as Record<string, unknown>) };\n const childrenProp = props.children as ReactNode;\n delete props.children;\n\n if (nodeType === \"TEXT\" || nodeType === \"LINK\") {\n return {\n type: nodeType,\n props,\n children: [],\n text: collectText(childrenProp),\n };\n }\n\n const childNodes = flattenChildren(childrenProp)\n .filter(\n (child): child is ReactElement =>\n !!child && typeof child === \"object\" && \"type\" in (child as object),\n )\n .map(elementToPdfNode);\n\n return {\n type: nodeType,\n props,\n children: childNodes,\n };\n}\n\nexport function createPdfElement(\n type: NodeType,\n props: Record<string, unknown> = {},\n ...children: ReactNode[]\n): ReactElement {\n const name = Object.entries(TYPE_MAP).find(([, v]) => v === type)?.[0];\n if (!name) throw new Error(`Unknown node type: ${type}`);\n return createElement(name, props, ...children);\n}\n","import type { PageSize, Style } from \"./types\";\n\nexport const PAGE_SIZES: Record<Exclude<PageSize, [number, number]>, [number, number]> = {\n A4: [595.28, 841.89],\n LETTER: [612, 792],\n LEGAL: [612, 1008],\n};\n\nexport function resolvePageSize(\n size: PageSize = \"A4\",\n orientation: \"portrait\" | \"landscape\" = \"portrait\",\n): [number, number] {\n const [w, h] = Array.isArray(size) ? size : PAGE_SIZES[size];\n return orientation === \"landscape\" ? [h, w] : [w, h];\n}\n\nexport function expandPadding(style: Style = {}) {\n const base = style.padding ?? 0;\n return {\n top: style.paddingTop ?? base,\n right: style.paddingRight ?? base,\n bottom: style.paddingBottom ?? base,\n left: style.paddingLeft ?? base,\n };\n}\n\nexport function expandMargin(style: Style = {}) {\n const base = style.margin ?? 0;\n return {\n top: style.marginTop ?? base,\n right: style.marginRight ?? base,\n bottom: style.marginBottom ?? base,\n left: style.marginLeft ?? base,\n };\n}\n\n/** Parse #RRGGBB / #RGB / rgb() into 0–1 RGB components. */\nexport function parseColor(input?: string): [number, number, number] | null {\n if (!input) return null;\n\n const hex = input.trim();\n if (hex.startsWith(\"#\")) {\n const raw = hex.slice(1);\n if (raw.length === 3) {\n const r = parseInt(raw[0] + raw[0], 16) / 255;\n const g = parseInt(raw[1] + raw[1], 16) / 255;\n const b = parseInt(raw[2] + raw[2], 16) / 255;\n return [r, g, b];\n }\n if (raw.length === 6) {\n const r = parseInt(raw.slice(0, 2), 16) / 255;\n const g = parseInt(raw.slice(2, 4), 16) / 255;\n const b = parseInt(raw.slice(4, 6), 16) / 255;\n return [r, g, b];\n }\n }\n\n const rgb = input.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (rgb) {\n return [\n Math.min(1, Number(rgb[1]) / 255),\n Math.min(1, Number(rgb[2]) / 255),\n Math.min(1, Number(rgb[3]) / 255),\n ];\n }\n\n return null;\n}\n\nexport function resolveLength(\n value: number | string | undefined,\n parent: number,\n fallback = 0,\n): number {\n if (value == null) return fallback;\n if (typeof value === \"number\") return value;\n if (value.endsWith(\"%\")) {\n const pct = Number.parseFloat(value);\n return Number.isFinite(pct) ? (pct / 100) * parent : fallback;\n }\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function isBold(weight?: Style[\"fontWeight\"]): boolean {\n if (weight === \"bold\") return true;\n if (typeof weight === \"number\") return weight >= 600;\n return false;\n}\n","import type { LayoutBox, PdfNode, ResolvedDocument, ResolvedPage, Style } from \"./types\";\nimport {\n expandMargin,\n expandPadding,\n isBold,\n resolveLength,\n resolvePageSize,\n} from \"./utils\";\n\nconst DEFAULT_FONT_SIZE = 12;\nconst DEFAULT_LINE_HEIGHT = 1.4;\nconst AVG_CHAR_WIDTH = 0.5;\n\nfunction measureText(text: string, style: Style, maxWidth: number): { width: number; height: number; lines: string[] } {\n const fontSize = style.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = (style.lineHeight ?? DEFAULT_LINE_HEIGHT) * fontSize;\n const charWidth = fontSize * (isBold(style.fontWeight) ? 0.55 : AVG_CHAR_WIDTH);\n\n if (!text) {\n return { width: 0, height: lineHeight, lines: [\"\"] };\n }\n\n const words = text.split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n const candidate = current ? `${current} ${word}` : word;\n if (candidate.length * charWidth <= maxWidth || !current) {\n current = candidate;\n } else {\n lines.push(current);\n current = word;\n }\n }\n if (current) lines.push(current);\n\n const widest = Math.max(...lines.map((l) => l.length * charWidth), 0);\n return {\n width: Math.min(widest, maxWidth),\n height: lines.length * lineHeight,\n lines,\n };\n}\n\nfunction layoutNode(\n node: PdfNode,\n x: number,\n y: number,\n availableWidth: number,\n availableHeight: number,\n): LayoutBox {\n const style = (node.props.style as Style | undefined) ?? {};\n const margin = expandMargin(style);\n const padding = expandPadding(style);\n\n const outerX = x + margin.left;\n const outerY = y + margin.top;\n const contentWidth = Math.max(\n 0,\n resolveLength(style.width, availableWidth, availableWidth) - margin.left - margin.right,\n );\n const innerWidth = Math.max(0, contentWidth - padding.left - padding.right);\n\n if (node.type === \"TEXT\" || node.type === \"LINK\") {\n const measured = measureText(node.text ?? \"\", style, innerWidth);\n const height =\n resolveLength(style.height, availableHeight, measured.height + padding.top + padding.bottom);\n return {\n x: outerX,\n y: outerY,\n width: contentWidth,\n height,\n node,\n children: [],\n style,\n text: node.text,\n };\n }\n\n if (node.type === \"IMAGE\") {\n const width = resolveLength(style.width, availableWidth, Math.min(200, availableWidth));\n const height = resolveLength(style.height, availableHeight, 120);\n return {\n x: outerX,\n y: outerY,\n width: width - margin.left - margin.right,\n height,\n node,\n children: [],\n style,\n };\n }\n\n const direction = style.flexDirection ?? \"column\";\n const gap = style.gap ?? 0;\n const childBoxes: LayoutBox[] = [];\n\n let cursorX = outerX + padding.left;\n let cursorY = outerY + padding.top;\n let usedMain = 0;\n let crossSize = 0;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const remainingW =\n direction === \"row\"\n ? Math.max(0, innerWidth - usedMain - (i > 0 ? gap : 0))\n : innerWidth;\n const remainingH =\n direction === \"column\"\n ? Math.max(0, availableHeight - (cursorY - y) - margin.bottom)\n : availableHeight;\n\n const box = layoutNode(child, cursorX, cursorY, remainingW, remainingH);\n childBoxes.push(box);\n\n if (direction === \"row\") {\n usedMain += box.width + expandMargin((child.props.style as Style) ?? {}).left\n + expandMargin((child.props.style as Style) ?? {}).right;\n if (i < node.children.length - 1) usedMain += gap;\n cursorX = outerX + padding.left + usedMain;\n crossSize = Math.max(crossSize, box.height);\n } else {\n usedMain += box.height + expandMargin((child.props.style as Style) ?? {}).top\n + expandMargin((child.props.style as Style) ?? {}).bottom;\n if (i < node.children.length - 1) usedMain += gap;\n cursorY = outerY + padding.top + usedMain;\n crossSize = Math.max(crossSize, box.width);\n }\n }\n\n const contentHeight =\n resolveLength(\n style.height,\n availableHeight,\n direction === \"column\"\n ? usedMain + padding.top + padding.bottom\n : crossSize + padding.top + padding.bottom,\n );\n\n const finalWidth =\n direction === \"row\"\n ? resolveLength(style.width, availableWidth, usedMain + padding.left + padding.right)\n : contentWidth;\n\n const justify = style.justifyContent ?? \"flex-start\";\n const align = style.alignItems ?? \"stretch\";\n\n const innerMain =\n direction === \"column\"\n ? contentHeight - padding.top - padding.bottom\n : finalWidth - padding.left - padding.right;\n const childrenMain = usedMain;\n const freeSpace = Math.max(0, innerMain - childrenMain);\n\n let mainOffset = 0;\n let betweenGap = gap;\n if (justify === \"center\") mainOffset = freeSpace / 2;\n if (justify === \"flex-end\") mainOffset = freeSpace;\n if (justify === \"space-between\" && childBoxes.length > 1) {\n betweenGap = gap + freeSpace / (childBoxes.length - 1);\n }\n if (justify === \"space-around\" && childBoxes.length > 0) {\n betweenGap = gap + freeSpace / childBoxes.length;\n mainOffset = betweenGap / 2;\n }\n\n let running = 0;\n for (const box of childBoxes) {\n if (direction === \"column\") {\n box.y = outerY + padding.top + mainOffset + running;\n if (align === \"center\") {\n box.x = outerX + padding.left + Math.max(0, (innerWidth - box.width) / 2);\n } else if (align === \"flex-end\") {\n box.x = outerX + padding.left + Math.max(0, innerWidth - box.width);\n } else if (align === \"stretch\" && box.style.width == null) {\n box.width = innerWidth;\n }\n running += box.height + betweenGap;\n } else {\n box.x = outerX + padding.left + mainOffset + running;\n if (align === \"center\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, (contentHeight - padding.top - padding.bottom - box.height) / 2);\n } else if (align === \"flex-end\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, contentHeight - padding.top - padding.bottom - box.height);\n } else if (align === \"stretch\" && box.style.height == null) {\n box.height = contentHeight - padding.top - padding.bottom;\n }\n running += box.width + betweenGap;\n }\n }\n\n return {\n x: outerX,\n y: outerY,\n width: finalWidth,\n height: contentHeight,\n node,\n children: childBoxes,\n style,\n };\n}\n\nexport function layoutDocument(root: PdfNode): ResolvedDocument {\n if (root.type !== \"DOCUMENT\") {\n throw new Error(\"[epochs-pdf] Root element must be <Document>.\");\n }\n\n const pages: ResolvedPage[] = [];\n\n for (const pageNode of root.children) {\n if (pageNode.type !== \"PAGE\") {\n throw new Error(\"[epochs-pdf] Direct children of <Document> must be <Page>.\");\n }\n\n const size = pageNode.props.size as Parameters<typeof resolvePageSize>[0];\n const orientation = (pageNode.props.orientation as \"portrait\" | \"landscape\") ?? \"portrait\";\n const [width, height] = resolvePageSize(size, orientation);\n const style = (pageNode.props.style as Style | undefined) ?? {};\n const padding = expandPadding(style);\n\n const contentRoot: PdfNode = {\n type: \"VIEW\",\n props: {\n style: {\n ...style,\n width,\n height,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n },\n },\n children: pageNode.children,\n };\n\n const box = layoutNode(contentRoot, 0, 0, width, height);\n\n pages.push({\n width,\n height,\n boxes: box.children,\n style,\n });\n }\n\n return {\n meta: {\n title: String(root.props.title ?? \"Untitled\"),\n author: String(root.props.author ?? \"\"),\n subject: String(root.props.subject ?? \"\"),\n creator: String(root.props.creator ?? \"epochs-pdf\"),\n },\n pages,\n };\n}\n\nexport { measureText };\n","import type { LayoutBox, ResolvedDocument, Style } from \"./types\";\nimport { isBold, parseColor } from \"./utils\";\nimport { measureText } from \"./layout\";\n\nfunction escapePdfString(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\(/g, \"\\\\(\")\n .replace(/\\)/g, \"\\\\)\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\n/g, \"\\\\n\");\n}\n\nclass PdfWriter {\n private objects: (string | null)[] = [null];\n private offsets: number[] = [0];\n\n addObject(content: string): number {\n this.objects.push(content);\n return this.objects.length - 1;\n }\n\n build(doc: ResolvedDocument): Uint8Array {\n const infoId = this.addObject(\n `<< /Title (${escapePdfString(doc.meta.title)}) /Author (${escapePdfString(doc.meta.author)}) /Subject (${escapePdfString(doc.meta.subject)}) /Creator (${escapePdfString(doc.meta.creator)}) /Producer (epochs-pdf) >>`,\n );\n\n const fontRegular = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n );\n const fontBold = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold >>\",\n );\n\n const pageIds: number[] = [];\n\n for (const page of doc.pages) {\n const contentStream = this.renderPageContent(\n page.boxes,\n page.width,\n page.height,\n page.style,\n );\n const contentId = this.addObject(\n `<< /Length ${contentStream.length} >>\\nstream\\n${contentStream}\\nendstream`,\n );\n\n const pageId = this.addObject(\"\"); // placeholder\n pageIds.push(pageId);\n\n this.objects[pageId] =\n `<< /Type /Page /Parent 0 0 R /MediaBox [0 0 ${page.width.toFixed(2)} ${page.height.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /Font << /F1 ${fontRegular} 0 R /F2 ${fontBold} 0 R >> >> >>`;\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = this.addObject(\n `<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`,\n );\n\n for (const pageId of pageIds) {\n this.objects[pageId] = (this.objects[pageId] as string).replace(\n \"/Parent 0 0 R\",\n `/Parent ${pagesId} 0 R`,\n );\n }\n\n const catalogId = this.addObject(\n `<< /Type /Catalog /Pages ${pagesId} 0 R >>`,\n );\n\n // Serialize\n let body = \"%PDF-1.4\\n\";\n this.offsets = [0];\n\n for (let i = 1; i < this.objects.length; i++) {\n this.offsets[i] = body.length;\n body += `${i} 0 obj\\n${this.objects[i]}\\nendobj\\n`;\n }\n\n const xrefOffset = body.length;\n body += `xref\\n0 ${this.objects.length}\\n`;\n body += \"0000000000 65535 f \\n\";\n for (let i = 1; i < this.objects.length; i++) {\n body += `${String(this.offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n body += `trailer\\n<< /Size ${this.objects.length} /Root ${catalogId} 0 R /Info ${infoId} 0 R >>\\n`;\n body += `startxref\\n${xrefOffset}\\n%%EOF`;\n\n return new TextEncoder().encode(body);\n }\n\n private renderPageContent(\n boxes: LayoutBox[],\n pageWidth: number,\n pageHeight: number,\n pageStyle: Style,\n ): string {\n const ops: string[] = [];\n\n const pageBg = parseColor(pageStyle.backgroundColor);\n if (pageBg) {\n ops.push(`q`);\n ops.push(\n `${pageBg[0].toFixed(3)} ${pageBg[1].toFixed(3)} ${pageBg[2].toFixed(3)} rg`,\n );\n ops.push(\n `0 0 ${pageWidth.toFixed(2)} ${pageHeight.toFixed(2)} re f`,\n );\n ops.push(`Q`);\n }\n\n const drawBox = (box: LayoutBox) => {\n const { x, y, width, height, style, node, text } = box;\n const pdfY = pageHeight - y - height;\n\n const fill = parseColor(style.backgroundColor);\n if (fill) {\n ops.push(`q`);\n ops.push(`${fill[0].toFixed(3)} ${fill[1].toFixed(3)} ${fill[2].toFixed(3)} rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`Q`);\n }\n\n if (style.borderWidth && style.borderWidth > 0) {\n const border = parseColor(style.borderColor) ?? [0, 0, 0];\n ops.push(`q`);\n ops.push(`${style.borderWidth} w`);\n ops.push(`${border[0].toFixed(3)} ${border[1].toFixed(3)} ${border[2].toFixed(3)} RG`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(`Q`);\n }\n\n if ((node.type === \"TEXT\" || node.type === \"LINK\") && text != null) {\n const fontSize = style.fontSize ?? 12;\n const color = parseColor(style.color) ?? [0, 0, 0];\n const font = isBold(style.fontWeight) ? \"F2\" : \"F1\";\n const paddingLeft = style.paddingLeft ?? style.padding ?? 0;\n const paddingTop = style.paddingTop ?? style.padding ?? 0;\n const maxWidth = Math.max(0, width - paddingLeft - (style.paddingRight ?? style.padding ?? 0));\n const measured = measureText(text, style, maxWidth || width);\n const lineHeight = (style.lineHeight ?? 1.4) * fontSize;\n\n ops.push(`q`);\n ops.push(`BT`);\n ops.push(`/${font} ${fontSize} Tf`);\n ops.push(`${color[0].toFixed(3)} ${color[1].toFixed(3)} ${color[2].toFixed(3)} rg`);\n\n measured.lines.forEach((line, index) => {\n let textX = x + paddingLeft;\n const lineWidth = line.length * fontSize * (isBold(style.fontWeight) ? 0.55 : 0.5);\n if (style.textAlign === \"center\") {\n textX = x + (width - lineWidth) / 2;\n } else if (style.textAlign === \"right\") {\n textX = x + width - lineWidth - (style.paddingRight ?? style.padding ?? 0);\n }\n const textY = pageHeight - y - paddingTop - fontSize - index * lineHeight;\n ops.push(`1 0 0 1 ${textX.toFixed(2)} ${textY.toFixed(2)} Tm`);\n ops.push(`(${escapePdfString(line)}) Tj`);\n });\n\n ops.push(`ET`);\n ops.push(`Q`);\n }\n\n if (node.type === \"IMAGE\") {\n // Placeholder rectangle for images (no external deps / binary embedding yet)\n ops.push(`q`);\n ops.push(`0.85 0.85 0.85 rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`0.6 0.6 0.6 RG 1 w`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(\n `BT /F1 10 Tf 0.4 0.4 0.4 rg 1 0 0 1 ${(x + 8).toFixed(2)} ${(pdfY + height / 2 - 4).toFixed(2)} Tm (Image) Tj ET`,\n );\n ops.push(`Q`);\n }\n\n for (const child of box.children) {\n drawBox(child);\n }\n };\n\n for (const box of boxes) {\n drawBox(box);\n }\n\n return ops.join(\"\\n\");\n }\n}\n\nexport function serializePdf(doc: ResolvedDocument): Uint8Array {\n return new PdfWriter().build(doc);\n}\n","import type { ReactElement } from \"react\";\nimport { elementToPdfNode } from \"./reconciler\";\nimport { layoutDocument } from \"./layout\";\nimport { serializePdf } from \"./pdf-writer\";\n\nfunction renderToBytes(element: ReactElement): Uint8Array {\n const tree = elementToPdfNode(element);\n const laidOut = layoutDocument(tree);\n return serializePdf(laidOut);\n}\n\n/** Render a `<Document>` tree to a `Uint8Array` PDF. */\nexport function pdf(element: ReactElement): Uint8Array {\n return renderToBytes(element);\n}\n\n/** Render to a Blob (browser). */\nexport function toBlob(element: ReactElement): Blob {\n const bytes = renderToBytes(element);\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return new Blob([copy], { type: \"application/pdf\" });\n}\n\n/** Render to an object URL for iframes / previews. */\nexport function toUrl(element: ReactElement): string {\n return URL.createObjectURL(toBlob(element));\n}\n\n/** Trigger a browser download of the generated PDF. */\nexport function download(\n element: ReactElement,\n filename = \"document.pdf\",\n): void {\n const url = toUrl(element);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n/** Async-friendly API mirroring common PDF libraries. */\nexport async function renderToBuffer(element: ReactElement): Promise<Uint8Array> {\n return renderToBytes(element);\n}\n\nexport async function renderToBlob(element: ReactElement): Promise<Blob> {\n return toBlob(element);\n}\n"],"names":["REDACT_COLOR","HIGHLIGHT_PRESETS","UNDERLINE_PRESETS","DEFAULT_HIGHLIGHT_HEX","DEFAULT_UNDERLINE_HEX","hexToMarkupColor","createMarkupId","normalizeHex","color","value","r","g","b","hex","kind","alpha","normalized","match","int","selectionRectsForPage","pageSurface","scale","selection","range","pageBox","clientRects","safeScale","layoutW","layoutH","selectionStartPoint","rects","first","a","expandRedactRects","padding","rect","drawMarkupOnCanvas","ctx","annotations","ann","x","y","w","h","thickness","createSignatureId","drawSignaturesOnCanvas","signatures","sig","img","loadImage","drawSignatureFieldsOnCanvas","fields","signedFieldIds","field","isFilled","src","resolve","reject","signatureDisplaySize","sourceWidth","sourceHeight","maxWidth","maxHeight","ratio","clientPointToPage","clientX","clientY","surface","box","pageSizeFromSurface","clientDeltaToPage","deltaX","deltaY","viewportRectToPage","viewport","surfaceRect","pageW","pageH","DEFAULT_TEXT_FONT_SIZE","DEFAULT_TEXT_COLOR","MIN_TEXT_WIDTH","MIN_TEXT_HEIGHT","createTextId","measureInlineText","fontSize","lines","lineHeight","line","resolveInlineTextPoint","textLayer","surfaceBox","toPageX","client","toPageY","toPageSize","clientSize","axis","boxSize","layout","gap","findGapBetweenSpans","doc","_a","inferFontSizeFromNode","caretX","nearest","findNearestSpanOnLine","spans","boxes","span","i","left","right","gapStart","gapEnd","best","midX","dist","node","element","inferFontSizeFromElement","height","computed","parsed","findTextFieldAtPoint","pageNumber","selectWordAtPoint","text","offset","isWordChar","ch","start","end","wordRange","drawTextsOnCanvas","texts","cursorY","drawTextFieldsOnCanvas","filledFieldIds","Icon","size","className","children","jsx","ChevronLeftIcon","props","ChevronRightIcon","DownloadIcon","jsxs","ExternalLinkIcon","GridIcon","MinusIcon","PlusIcon","PrinterIcon","RefreshIcon","RotateIcon","HighlightIcon","UnderlineIcon","EraserIcon","SignatureIcon","PencilIcon","TextIcon","PageCanvas","pdfDoc","rotation","pageRef","onRendered","markupTool","markupColor","onAddAnnotation","onRemoveAnnotation","pendingSignature","onAddSignature","onUpdateSignature","onRemoveSignature","onEditSignature","onDuplicateSignature","selectedSignatureId","onSelectSignature","signatureFields","selectedSignatureFieldId","onSelectSignatureField","hasFixedSignatureFields","onOpenSignaturePad","fieldValues","_onFieldValueChange","_onFieldValueCommit","pendingFieldValue","onPlaceFieldValue","onAddText","onUpdateText","onRemoveText","selectedTextId","onSelectText","textFields","_selectedTextFieldId","onSelectTextField","hasFixedTextFields","editingTextId","onEditingTextIdChange","wrapRef","useRef","canvasRef","textLayerRef","surfaceRef","renderTaskRef","textLayerInstanceRef","dragState","setDragState","useState","inlineEditRef","justOpenedEditorRef","useEffect","cancelled","canvas","textLayerDiv","page","width","task","textContent","TextLayer","applySelectionMarkup","captured","replaceSelectedPdfText","initialValue","created","handleMouseUp","handleKeyDown","event","target","hasPdfSelection","rafId","lastClientX","lastClientY","scrollDir","getScrollContainer","updateResizeAtPoint","s","pageSize","dx","dy","maxW","maxH","newW","newH","updateSignatureAtPoint","pageEl","targetPage","point","nextX","nextY","maxX","maxY","tickScroll","container","maxScroll","edge","distTop","distBottom","speed","prev","handleMove","handleUp","el","current","t","setRefs","pageAnnotations","pageSignatures","pageSignatureFields","f","pageTexts","commitInlineText","trimmed","beginInlineTextAt","fieldId","existing","handleInlineTextClick","handleSurfaceClick","renderInlineText","e","idx","fType","textValue","filled","Fragment","Thumbnail","isActive","onSelect","viewportAt1","pageTextFields","ABSOLUTE_URL_PATTERN","workerConfigured","setPdfWorkerSrc","workerSrc","pdfjsLib","ensurePdfWorker","resolvePdfUrl","file","fileUrl","baseUrl","source","path","urlToPdfArrayBuffer","url","fetchOptions","res","sourceToArrayBuffer","copy","renderPageWithMarkup","options","mimeType","quality","baseViewport","pageMarks","pageSigs","dataUrl","jpegBytes","dataUrlToBytes","renderAllPagesWithMarkup","pages","base64","binary","bytes","enc","concat","parts","total","sum","p","out","part","buildPdfFromJpegPages","objects","add","pageIds","imageStream","imageId","content","contentId","pageId","kids","id","pagesId","catalogId","chunks","offsets","objHeader","objFooter","xrefStart","xref","triggerBlobDownload","blob","filename","anchor","SVG_SAFE_FONTS","escapeXml","svgToBase64DataUrl","svg","chunk","typedSignatureFontSize","typeKind","SignaturePad","open","onClose","onSave","onSaveFieldValue","fieldType","showFieldTypeTabs","textPlaceholder","initialFieldValue","targetSize","rememberedByType","onRememberFill","drawingRef","lastPointRef","pathsRef","currentPathRef","reusedSignatureRef","resolvedFieldType","activeFieldType","setActiveFieldType","dateValue","setDateValue","setTextValue","mode","setMode","typedName","setTypedName","typedInitials","setTypedInitials","initialsTouched","setInitialsTouched","setTypeKind","inkColor","setInkColor","fontId","setFontId","hasReusedSignature","setHasReusedSignature","selectedFont","font","previewText","fontPreviewLabel","_b","remembered","nextFont","reused","getPoint","handlePointerDown","pt","handlePointerMove","last","handlePointerUp","clearPad","handleNameChange","deriveInitials","trimAndSave","allPaths","minX","minY","pad","pathData","boxW","boxH","drawnW","drawnH","ox","oy","baseSize","measureCtx","baseMetrics","basePad","naturalW","naturalH","fit","cx","cy","handleFieldValueSave","showSignPad","name","TOOLBAR_TOOL_ID","createToolbarTool","displayName","Tool","getToolbarToolId","tool","isToolbarTool","Navigation","Zoom","Rotate","Reload","Print","Open","Download","Highlight","Underline","Signature","AddText","Erase","Clear","ALL_TOOLBAR_TOOLS","DEFAULT_TOOLBAR_LAYOUT","MARKUP_TOOLS","isMarkupToolbarTool","renderToolbarTool","nodes","v","next","renderMarkupExtras","enabledIds","activeMarkupHex","setActiveMarkupHex","activePresets","preset","resolveToolbarLayout","enableToolbar","flags","toIds","side","showThumbnailsToggle","filterByFlag","tools","enabled","flagMap","PdfViewer","title","initialScale","withThumbnails","thumbnailWidth","maxThumbnails","enableThumbnails","enableNavigation","enableZoom","enableRotate","enableReload","enablePrint","enableOpen","enableDownload","enableMarkup","enableHighlight","enableUnderline","enableSignature","enableText","enableErase","enableClear","signatureFieldsProp","onSignatureComplete","onSignatureFieldsChange","applySignatureToSameTag","onFieldValueComplete","externalOpenSignaturePad","onSignaturePadClose","onSubmit","submitLabel","submitLoading","containerRef","lastBlobUrlRef","pageRefsRef","isProgrammaticScrollRef","binarySource","useMemo","resolvedUrl","status","setStatus","setPdfDoc","numPages","setNumPages","setPageNumber","setScale","setRotation","displayUrl","setDisplayUrl","showThumbnails","setShowThumbnails","isPrinting","setIsPrinting","isDownloading","setIsDownloading","setMarkupTool","setAnnotations","setSignatures","setTexts","signaturePadOpen","setSignaturePadOpen","signaturePadFieldType","setSignaturePadFieldType","setRememberedByType","setPendingSignature","setSelectedSignatureId","setSelectedSignatureFieldId","editingSignatureId","setEditingSignatureId","setSelectedTextId","selectedTextFieldId","setSelectedTextFieldId","setEditingTextId","highlightHex","setHighlightHex","underlineHex","setUnderlineHex","setFieldValues","setSignatureFields","signatureFieldsRef","isSignatureFieldFilled","useCallback","sigs","values","writeFieldValueToFields","fieldIds","idSet","prevValues","updated","writeSignatureImageToFields","signature","signaturesByFieldId","ids","toolbarSides","enabledToolIds","mq","apply","showHighlight","showUnderline","showSignature","showText","showErase","revokeDisplayUrl","loadDocument","buffer","blobUrl","scrollToPage","clamped","scrollToSignatureField","focusField","fieldEl","observer","entries","canGoPrev","canGoNext","handlePrev","handleNext","handleRotate","handleZoomOut","handleZoomIn","handleFitWidth","pagePadding","nextScale","run","onMq","fieldValueTexts","textsForExport","handlePrint","iframe","body","wrapper","handleDownload","pdfBytes","toggleMarkupTool","activeMarkupColor","selectedSignature","handleAddAnnotation","annotation","handleRemoveAnnotation","handleClearAnnotations","advanceToNextUnsignedField","fromFieldId","filledIds","currentIndex","nextField","handleOpenSignaturePad","handleFieldValueChange","handleFieldValueCommit","val","k","handleSignatureSave","imageDataUrl","targetField","targetFields","newSignatures","targetIds","byFieldId","currentPageEl","scrollContainer","visible","visibleTop","visibleBottom","visibleLeft","visibleRight","handleSaveFieldValue","nextValues","handleAddSignature","handleUpdateSignature","patch","handleRemoveSignature","removed","handleDuplicateSignature","pageWidth","pageHeight","duplicate","handleEditSignature","targetId","item","handleAddText","handleUpdateText","handleRemoveText","goToSignatureField","direction","from","nextIndex","rootStyle","toolbarCtx","visibleToolIds","currentFieldIndex","filledFieldCount","fieldProgressPercent","renderSide","alignEnd","index","showMarkupSep","type","fill","_","n","ThumbnailStrip","Document","_props","Page","View","Text","Image","Link","TYPE_MAP","getDisplayName","fn","flattenChildren","result","visit","collectText","child","elementToPdfNode","nodeType","childrenProp","childNodes","PAGE_SIZES","resolvePageSize","orientation","expandPadding","style","base","expandMargin","parseColor","input","raw","rgb","resolveLength","parent","fallback","pct","isBold","weight","DEFAULT_FONT_SIZE","DEFAULT_LINE_HEIGHT","AVG_CHAR_WIDTH","measureText","charWidth","words","word","candidate","widest","l","layoutNode","availableWidth","availableHeight","margin","outerX","outerY","contentWidth","innerWidth","measured","childBoxes","cursorX","usedMain","crossSize","remainingW","remainingH","contentHeight","finalWidth","justify","align","innerMain","freeSpace","mainOffset","betweenGap","running","layoutDocument","root","pageNode","contentRoot","escapePdfString","PdfWriter","__publicField","infoId","fontRegular","fontBold","contentStream","xrefOffset","pageStyle","ops","pageBg","drawBox","pdfY","border","paddingLeft","paddingTop","textX","lineWidth","textY","serializePdf","renderToBytes","tree","laidOut","pdf","toBlob","toUrl","download","renderToBuffer","renderToBlob"],"mappings":";;;;;;;AAKO,MAAMA,KAAe,WA2BfC,KAAyC;AAAA,EACpD,EAAE,IAAI,UAAU,OAAO,UAAU,KAAK,UAAA;AAAA,EACtC,EAAE,IAAI,SAAS,OAAO,SAAS,KAAK,UAAA;AAAA,EACpC,EAAE,IAAI,QAAQ,OAAO,QAAQ,KAAK,UAAA;AAAA,EAClC,EAAE,IAAI,QAAQ,OAAO,QAAQ,KAAK,UAAA;AAAA,EAClC,EAAE,IAAI,UAAU,OAAO,UAAU,KAAK,UAAA;AAAA,EACtC,EAAE,IAAI,UAAU,OAAO,UAAU,KAAK,UAAA;AACxC,GAEaC,KAAyC;AAAA,EACpD,EAAE,IAAI,QAAQ,OAAO,QAAQ,KAAK,UAAA;AAAA,EAClC,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK,UAAA;AAAA,EAChC,EAAE,IAAI,SAAS,OAAO,SAAS,KAAK,UAAA;AAAA,EACpC,EAAE,IAAI,UAAU,OAAO,UAAU,KAAK,UAAA;AAAA,EACtC,EAAE,IAAI,UAAU,OAAO,UAAU,KAAK,UAAA;AAAA,EACtC,EAAE,IAAI,SAAS,OAAO,SAAS,KAAK,UAAA;AACtC,GAEaC,KAAwBF,GAAkB,CAAC,EAAE,KAC7CG,KAAwBF,GAAkB,CAAC,EAAE;AAG3BG,GAAiBF,IAAuB,WAAW;AAG3E,SAASG,KAAyB;AACvC,SAAO,KAAK,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC/E;AAEO,SAASC,GAAaC,GAAuB;AAClD,QAAMC,IAAQD,EAAM,KAAA;AACpB,MAAI,oBAAoB,KAAKC,CAAK,EAAG,QAAOA,EAAM,YAAA;AAClD,MAAI,oBAAoB,KAAKA,CAAK,GAAG;AACnC,UAAMC,IAAID,EAAM,CAAC,GACXE,IAAIF,EAAM,CAAC,GACXG,IAAIH,EAAM,CAAC;AACjB,WAAO,IAAIC,CAAC,GAAGA,CAAC,GAAGC,CAAC,GAAGA,CAAC,GAAGC,CAAC,GAAGA,CAAC,GAAG,YAAA;AAAA,EACrC;AACA,SAAOH;AACT;AAGO,SAASJ,GAAiBQ,GAAaC,GAAkBC,IAAQ,MAAc;AACpF,QAAMC,IAAaT,GAAaM,CAAG;AACnC,MAAIC,MAAS,eAAeA,MAAS,SAAU,QAAOE;AAEtD,QAAMC,IAAQ,oBAAoB,KAAKD,CAAU;AACjD,MAAI,CAACC,EAAO,QAAO,sBAAsBF,CAAK;AAE9C,QAAMG,IAAM,OAAO,SAASD,EAAM,CAAC,GAAG,EAAE,GAClCP,IAAKQ,KAAO,KAAM,KAClBP,IAAKO,KAAO,IAAK,KACjBN,IAAIM,IAAM;AAChB,SAAO,QAAQR,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKG,CAAK;AACxC;AAqBO,SAASI,GACdC,GACAC,GAC8C;AAC9C,QAAMC,IAAY,OAAO,aAAA;AACzB,MAAI,CAACA,KAAaA,EAAU,eAAeA,EAAU,eAAe;AAClE,WAAO;AAGT,QAAMC,IAAQD,EAAU,WAAW,CAAC;AACpC,MAAI,CAACF,EAAY,SAASG,EAAM,uBAAuB;AACrD,WAAO;AAGT,QAAMC,IAAUJ,EAAY,sBAAA,GACtBK,IAAc,MAAM,KAAKF,EAAM,eAAA,CAAgB,EAAE;AAAA,IACrD,CAACb,MAAMA,EAAE,QAAQ,KAAKA,EAAE,SAAS;AAAA,EAAA;AAGnC,MAAI,CAACe,EAAY,OAAQ,QAAO;AAEhC,QAAMC,IAAYL,KAAS,GACrBM,IAAUP,EAAY,eAAeI,EAAQ,OAC7CI,IAAUR,EAAY,gBAAgBI,EAAQ;AAQpD,SAAO,EAAE,OAPmBC,EAAY,IAAI,CAACf,OAAO;AAAA,IAClD,GAAGc,EAAQ,QAAQ,KAAMd,EAAE,OAAOc,EAAQ,QAAQA,EAAQ,SAAUG,IAAUD,KAAa;AAAA,IAC3F,GAAGF,EAAQ,SAAS,KAAMd,EAAE,MAAMc,EAAQ,OAAOA,EAAQ,UAAWI,IAAUF,KAAa;AAAA,IAC3F,GAAGF,EAAQ,QAAQ,IAAKd,EAAE,QAAQc,EAAQ,SAAUG,IAAUD,KAAa;AAAA,IAC3E,GAAGF,EAAQ,SAAS,IAAKd,EAAE,SAASc,EAAQ,UAAWI,IAAUF,KAAa;AAAA,EAAA,EAC9E,GAEc,MAAMJ,EAAU,WAAS;AAC3C;AAGO,SAASO,GACdC,GAC4C;AAE5C,QAAMC,IADS,CAAC,GAAGD,CAAK,EAAE,KAAK,CAACE,GAAGpB,MAAMoB,EAAE,IAAIpB,EAAE,KAAKoB,EAAE,IAAIpB,EAAE,CAAC,EAC1C,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,GAAS,GAAG,GAAA;AAClD,SAAO;AAAA,IACL,GAAGmB,EAAM;AAAA,IACT,GAAGA,EAAM;AAAA,IACT,UAAU,KAAK,IAAI,GAAG,KAAK,MAAMA,EAAM,IAAI,GAAG,KAAK,EAAE;AAAA,EAAA;AAEzD;AAGO,SAASE,GACdH,GACAI,IAAU,GACI;AACd,SAAOJ,EAAM,IAAI,CAACK,OAAU;AAAA,IAC1B,GAAG,KAAK,IAAI,GAAGA,EAAK,IAAID,CAAO;AAAA,IAC/B,GAAG,KAAK,IAAI,GAAGC,EAAK,IAAID,CAAO;AAAA,IAC/B,GAAGC,EAAK,IAAID,IAAU;AAAA,IACtB,GAAGC,EAAK,IAAID,IAAU;AAAA,EAAA,EACtB;AACJ;AAGO,SAASE,GACdC,GACAC,GACAjB,GACM;AACN,aAAWkB,KAAOD;AAChB,eAAWH,KAAQI,EAAI,OAAO;AAC5B,YAAMC,IAAIL,EAAK,IAAId,GACboB,IAAIN,EAAK,IAAId,GACbqB,IAAIP,EAAK,IAAId,GACbsB,IAAIR,EAAK,IAAId;AAEnB,UAAIkB,EAAI,SAAS;AACf,QAAAF,EAAI,KAAA,GACJA,EAAI,2BAA2B,YAC/BA,EAAI,YAAYE,EAAI,OACpBF,EAAI,SAASG,GAAGC,GAAGC,GAAGC,CAAC,GACvBN,EAAI,QAAA;AAAA,eACKE,EAAI,SAAS;AACtB,QAAAF,EAAI,YAAYE,EAAI,SAASvC,IAC7BqC,EAAI,SAASG,GAAGC,GAAGC,GAAGC,CAAC;AAAA,WAClB;AACL,cAAMC,IAAY,KAAK,IAAI,GAAGvB,IAAQ,GAAG;AACzC,QAAAgB,EAAI,YAAYE,EAAI,OACpBF,EAAI,SAASG,GAAGC,IAAIE,IAAIC,GAAWF,GAAGE,CAAS;AAAA,MACjD;AAAA,IACF;AAEJ;AC5JO,SAASC,KAA4B;AAC1C,SAAO,KAAK,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC/E;AAEA,eAAsBC,GACpBT,GACAU,GACA1B,GACe;AACf,aAAW2B,KAAOD,GAAY;AAC5B,UAAME,IAAM,MAAMC,GAAUF,EAAI,YAAY;AAC5C,IAAAX,EAAI;AAAA,MACFY;AAAA,MACAD,EAAI,IAAI3B;AAAA,MACR2B,EAAI,IAAI3B;AAAA,MACR2B,EAAI,QAAQ3B;AAAA,MACZ2B,EAAI,SAAS3B;AAAA,IAAA;AAAA,EAEjB;AACF;AAEO,SAAS8B,GACdd,GACAe,GACAC,GACAhC,GACM;AACN,EAAAgB,EAAI,KAAA;AACJ,aAAWiB,KAASF,GAAQ;AAC1B,UAAMG,IAAWF,EAAe,IAAIC,EAAM,EAAE,GACtCd,IAAIc,EAAM,IAAIjC,GACdoB,IAAIa,EAAM,IAAIjC,GACdqB,IAAIY,EAAM,QAAQjC,GAClBsB,IAAIW,EAAM,SAASjC;AAEzB,IAAAgB,EAAI,YAAYkB,IACZ,4BACA,2BACJlB,EAAI,cAAckB,IACd,4BACA,WACJlB,EAAI,YAAY,KAChBA,EAAI,YAAYkB,IAAW,CAAA,IAAK,CAAC,GAAG,CAAC,CAAC,GACtClB,EAAI,SAASG,GAAGC,GAAGC,GAAGC,CAAC,GACvBN,EAAI,WAAWG,GAAGC,GAAGC,GAAGC,CAAC;AAAA,EAC3B;AACA,EAAAN,EAAI,QAAA;AACN;AAEA,SAASa,GAAUM,GAAwC;AACzD,SAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,UAAMT,IAAM,IAAI,MAAA;AAChB,IAAAA,EAAI,SAAS,MAAMQ,EAAQR,CAAG,GAC9BA,EAAI,UAAU,MAAMS,EAAO,IAAI,MAAM,gCAAgC,CAAC,GACtET,EAAI,MAAMO;AAAA,EACZ,CAAC;AACH;AAGO,SAASG,GACdC,GACAC,GACAC,IAAW,KACXC,IAAY,IACuB;AACnC,MAAIH,KAAe,KAAKC,KAAgB;AACtC,WAAO,EAAE,OAAOC,GAAU,QAAQC,EAAA;AAEpC,QAAMC,IAAQ,KAAK,IAAIF,IAAWF,GAAaG,IAAYF,CAAY;AACvE,SAAO;AAAA,IACL,OAAO,KAAK,IAAI,IAAID,IAAcI,CAAK;AAAA,IACvC,QAAQ,KAAK,IAAI,IAAIH,IAAeG,CAAK;AAAA,EAAA;AAE7C;AC7GO,SAASC,GACdC,GACAC,GACAC,GACA/C,GAC0B;AAC1B,QAAMgD,IAAMD,EAAQ,sBAAA,GACdzC,IAAUyC,EAAQ,eAAeC,EAAI,OACrCzC,IAAUwC,EAAQ,gBAAgBC,EAAI;AAC5C,SAAIA,EAAI,SAAS,KAAKA,EAAI,UAAU,KAAKhD,KAAS,IACzC,EAAE,GAAG,GAAG,GAAG,EAAA,IAEb;AAAA,IACL,IAAK6C,IAAUG,EAAI,QAAQA,EAAI,SAAU1C,IAAUN;AAAA,IACnD,IAAK8C,IAAUE,EAAI,OAAOA,EAAI,UAAWzC,IAAUP;AAAA,EAAA;AAEvD;AAGO,SAASiD,GACdF,GACA/C,GACmC;AACnC,SAAO;AAAA,IACL,OAAO+C,EAAQ,cAAc/C;AAAA,IAC7B,QAAQ+C,EAAQ,eAAe/C;AAAA,EAAA;AAEnC;AAMO,SAASkD,GACdC,GACAC,GACAL,GACA/C,GAC4B;AAC5B,QAAMgD,IAAMD,EAAQ,sBAAA,GACdzC,IAAUyC,EAAQ,eAAeC,EAAI,OACrCzC,IAAUwC,EAAQ,gBAAgBC,EAAI;AAC5C,SAAIA,EAAI,SAAS,KAAKA,EAAI,UAAU,KAAKhD,KAAS,IACzC,EAAE,IAAI,GAAG,IAAI,EAAA,IAEf;AAAA,IACL,IAAKmD,IAASH,EAAI,SAAU1C,IAAUN;AAAA,IACtC,IAAKoD,IAASJ,EAAI,UAAWzC,IAAUP;AAAA,EAAA;AAE3C;AAGO,SAASqD,GACdC,GACAP,GACA/C,GAC8D;AAC9D,QAAMuD,IAAcR,EAAQ,sBAAA,GACtB,EAAE,OAAOS,GAAO,QAAQC,MAAUR,GAAoBF,GAAS/C,CAAK;AAC1E,SAAIuD,EAAY,SAAS,KAAKA,EAAY,UAAU,IAC3C,EAAE,MAAM,GAAG,KAAK,GAAG,OAAOC,GAAO,QAAQC,EAAA,IAE3C;AAAA,IACL,OAAQH,EAAS,OAAOC,EAAY,QAAQA,EAAY,QAASC;AAAA,IACjE,MAAOF,EAAS,MAAMC,EAAY,OAAOA,EAAY,SAAUE;AAAA,IAC/D,QAASH,EAAS,QAAQC,EAAY,QAAQA,EAAY,QAASC;AAAA,IACnE,SAAUF,EAAS,SAASC,EAAY,OAAOA,EAAY,SAAUE;AAAA,EAAA;AAEzE;ACxCO,MAAMC,KAAyB,IACzBC,KAAqB,WACrBC,KAAiB,IACjBC,KAAkB;AAExB,SAASC,KAAuB;AACrC,SAAO,KAAK,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC/E;AAEO,SAASC,GACd3E,GACA4E,GACmC;AACnC,MAAI,OAAO,WAAa;AACtB,WAAO;AAAA,MACL,OAAO,KAAK,IAAIJ,IAAgBxE,EAAM,SAAS4E,IAAW,IAAI;AAAA,MAC9D,QAAQ,KAAK,IAAIH,IAAiBG,IAAW,IAAI;AAAA,IAAA;AAKrD,QAAMhD,IADS,SAAS,cAAc,QAAQ,EAC3B,WAAW,IAAI;AAClC,MAAI,CAACA;AACH,WAAO;AAAA,MACL,OAAO,KAAK,IAAI4C,IAAgBxE,EAAM,SAAS4E,IAAW,IAAI;AAAA,MAC9D,QAAQ,KAAK,IAAIH,IAAiBG,IAAW,IAAI;AAAA,IAAA;AAIrD,EAAAhD,EAAI,OAAO,GAAGgD,CAAQ;AACtB,QAAMC,IAAQ7E,EAAM,MAAM;AAAA,CAAI,GACxB8E,IAAaF,IAAW;AAC9B,MAAIvB,IAAWmB;AAEf,aAAWO,KAAQF;AACjB,IAAAxB,IAAW,KAAK,IAAIA,GAAUzB,EAAI,YAAYmD,KAAQ,GAAG,EAAE,QAAQ,CAAC;AAGtE,SAAO;AAAA,IACL,OAAO1B;AAAA,IACP,QAAQ,KAAK,IAAIoB,IAAiBI,EAAM,SAASC,CAAU;AAAA,EAAA;AAE/D;AAGO,SAASE,GACdvB,GACAC,GACAC,GACAsB,GACArE,GAC4C;;AAC5C,QAAMsE,IAAavB,EAAQ,sBAAA,GACrBzC,IAAUyC,EAAQ,eAAeuB,EAAW,OAC5C/D,IAAUwC,EAAQ,gBAAgBuB,EAAW,QAC7CC,IAAU,CAACC,MACfF,EAAW,QAAQ,KACbE,IAASF,EAAW,QAAQA,EAAW,SAAUhE,IAAUN,KAC7D,GACAyE,IAAU,CAACD,MACfF,EAAW,SAAS,KACdE,IAASF,EAAW,OAAOA,EAAW,UAAW/D,IAAUP,KAC7D,GACA0E,IAAa,CAACC,GAAoBC,OAAoB;AAC1D,UAAMC,KAAUD,OAAS,MAAMN,EAAW,QAAQA,EAAW,QACvDQ,IAASF,OAAS,MAAMtE,IAAUC;AACxC,WAAOsE,KAAU,IAAKF,IAAaE,MAAYC,IAAS9E,KAAS;AAAA,EACnE;AAGA,MAAImB,IAAIoD,EAAQ1B,CAAO,GACnBzB,IAAIqD,EAAQ3B,CAAO,GACnBkB,IAAWN;AAGf,QAAMqB,IAAMC,GAAoBnC,GAASC,GAASuB,CAAS;AAC3D,MAAIU;AACF,WAAO;AAAA,MACL,GAAGR,EAAQQ,EAAI,CAAC;AAAA,MAChB,GAAGN,EAAQM,EAAI,CAAC;AAAA,MAChB,UAAU,KAAK,IAAI,GAAG,KAAK,MAAML,EAAWK,EAAI,UAAU,GAAG,IAAI,EAAE,IAAI,EAAE;AAAA,IAAA;AAI7E,QAAME,IAAM,UAIN/E,KAAQgF,IAAAD,EAAI,wBAAJ,gBAAAC,EAAA,KAAAD,GAA0BpC,GAASC;AACjD,MAAI5C,KAASmE,EAAU,SAASnE,EAAM,cAAc,GAAG;AACrD,UAAMO,IAAQP,EAAM,eAAA,GACdY,KAAOL,EAAM,SAAS,IAAIA,EAAM,CAAC,IAAIP,EAAM,sBAAA;AACjD,QAAIY,GAAK,SAAS,GAAG;AAEnB,MAAAM,IAAIqD,EAAQ3D,GAAK,GAAG,GACpBkD,IAAWmB,GAAsBjF,EAAM,gBAAgBF,GAAO+C,CAAO;AAErE,YAAMqC,KAASb,EAAQzD,GAAK,IAAI;AAChC,aAAI,KAAK,IAAIsE,KAASjE,CAAC,IAAIuD,EAAW,GAAG,GAAG,MAC1CvD,IAAIiE,KAEC,EAAE,GAAAjE,GAAG,GAAAC,GAAG,UAAA4C,EAAA;AAAA,IACjB;AAAA,EACF;AAEA,QAAMqB,IAAUC,GAAsBzC,GAASC,GAASuB,CAAS;AACjE,SAAIgB,MACFjE,IAAIqD,EAAQY,EAAQ,GAAG,GACvBrB,IAAW,KAAK,IAAI,GAAG,KAAK,MAAMU,EAAWW,EAAQ,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,IAGvE,EAAE,GAAAlE,GAAG,GAAAC,GAAG,UAAA4C,EAAA;AACjB;AAGA,SAASgB,GACPnC,GACAC,GACAuB,GACmD;;AACnD,QAAMkB,IAAQ,MAAM;AAAA,IAClBlB,EAAU,iBAAiB,MAAM;AAAA,EAAA;AAEnC,MAAIkB,EAAM,SAAS,EAAG,QAAO;AAG7B,QAAMC,IAAmB,CAAA;AAEzB,aAAWC,KAAQF,GAAO;AACxB,QAAI,GAACL,IAAAO,EAAK,gBAAL,QAAAP,EAAkB,QAAQ;AAC/B,UAAMlC,IAAMyC,EAAK,sBAAA;AACjB,IAAIzC,EAAI,SAAS,KAAKA,EAAI,UAAU,KAEhCF,IAAUE,EAAI,MAAM,KAAKF,IAAUE,EAAI,SAAS,KACpDwC,EAAM,KAAK;AAAA,MACT,MAAMxC,EAAI;AAAA,MACV,OAAOA,EAAI;AAAA,MACX,KAAKA,EAAI;AAAA,MACT,QAAQA,EAAI;AAAA,MACZ,QAAQA,EAAI;AAAA,IAAA,CACb;AAAA,EACH;AAEA,EAAAwC,EAAM,KAAK,CAAC7E,GAAGpB,MAAMoB,EAAE,OAAOpB,EAAE,IAAI;AAEpC,WAASmG,IAAI,GAAGA,IAAIF,EAAM,SAAS,GAAGE,KAAK,GAAG;AAC5C,UAAMC,IAAOH,EAAME,CAAC,GACdE,IAAQJ,EAAME,IAAI,CAAC,GACnBG,IAAWF,EAAK,OAChBG,IAASF,EAAM;AACrB,QAAI,EAAAE,IAASD,IAAW,MACpBhD,KAAWgD,IAAW,KAAKhD,KAAWiD,IAAS;AACjD,aAAO;AAAA,QACL,GAAGjD;AAAA,QACH,GAAG,KAAK,IAAI8C,EAAK,KAAKC,EAAM,GAAG;AAAA,QAC/B,UAAU,KAAK,IAAID,EAAK,QAAQC,EAAM,MAAM;AAAA,MAAA;AAAA,EAGlD;AAEA,SAAO;AACT;AAEA,SAASN,GACPzC,GACAC,GACAuB,GACwC;;AACxC,QAAMkB,IAAQ,MAAM;AAAA,IAClBlB,EAAU,iBAAiB,MAAM;AAAA,EAAA;AAGnC,MAAI0B,IAA6D;AAEjE,aAAWN,KAAQF,GAAO;AACxB,QAAI,GAACL,IAAAO,EAAK,gBAAL,QAAAP,EAAkB,QAAQ;AAC/B,UAAMlC,IAAMyC,EAAK,sBAAA;AAEjB,QADIzC,EAAI,SAAS,KAAKA,EAAI,UAAU,KAChCF,IAAUE,EAAI,MAAM,KAAKF,IAAUE,EAAI,SAAS,EAAG;AAEvD,UAAMgD,KAAQhD,EAAI,OAAOA,EAAI,SAAS,GAChCiD,IAAO,KAAK,IAAIpD,IAAUmD,CAAI;AACpC,KAAI,CAACD,KAAQE,IAAOF,EAAK,UACvBA,IAAO,EAAE,KAAK/C,EAAI,KAAK,QAAQA,EAAI,QAAQ,MAAAiD,EAAA;AAAA,EAE/C;AAEA,SAAOF,IAAO,EAAE,KAAKA,EAAK,KAAK,QAAQA,EAAK,WAAW;AACzD;AAEA,SAASZ,GACPe,GACAlG,GACA+C,GACQ;AACR,QAAMoD,IACJD,EAAK,aAAa,KAAK,eAClBA,IACDA,EAAK;AACX,SAAIC,IAAgBC,GAAyBD,GAASnG,GAAO+C,CAAO,IAC7DW;AACT;AAEA,SAAS0C,GACPD,GACAnG,GACA+C,GACQ;AACR,QAAMsD,IAASF,EAAQ,sBAAA,EAAwB;AAC/C,MAAIE,IAAS,GAAG;AACd,QAAItD,GAAS;AACX,YAAMuB,IAAavB,EAAQ,sBAAA,GACrBxC,IAAUwC,EAAQ,gBAAgBuB,EAAW;AACnD,UAAIA,EAAW,SAAS;AACtB,eAAO,KAAK;AAAA,UACV;AAAA,UACA,KAAK,MAAQ+B,IAAS/B,EAAW,UAAW/D,IAAUP,KAAU,EAAE,IAAI;AAAA,QAAA;AAAA,IAG5E;AACA,WAAO,KAAK,IAAI,GAAG,KAAK,MAAOqG,IAASrG,IAAS,EAAE,IAAI,EAAE;AAAA,EAC3D;AAEA,QAAMsG,IAAW,OAAO,iBAAiBH,CAAO,EAAE,UAC5CI,IAAS,OAAO,WAAWD,CAAQ;AACzC,SAAI,OAAO,SAASC,CAAM,KAAKA,IAAS,IAC/B,KAAK,IAAI,GAAG,KAAK,MAAOA,IAASvG,IAAS,EAAE,IAAI,EAAE,IAGpD0D;AACT;AAEO,SAAS8C,GACdrF,GACAC,GACAW,GACA0E,GACkB;AAClB,aAAWxE,KAASF;AAClB,QAAIE,EAAM,eAAewE,KAEvBtF,KAAKc,EAAM,KACXd,KAAKc,EAAM,IAAIA,EAAM,SACrBb,KAAKa,EAAM,KACXb,KAAKa,EAAM,IAAIA,EAAM;AAErB,aAAOA;AAGX,SAAO;AACT;AAGO,SAASyE,GACd7D,GACAC,GACAuB,GACe;;AACf,MAAI,CAACA,EAAW,QAAO;AAEvB,QAAMY,IAAM,UAGN/E,KAAQgF,IAAAD,EAAI,wBAAJ,gBAAAC,EAAA,KAAAD,GAA0BpC,GAASC;AACjD,MAAI,CAAC5C,KAAS,CAACmE,EAAU,SAASnE,EAAM,cAAc,EAAG,QAAO;AAEhE,QAAMgG,IAAOhG,EAAM;AACnB,MAAIgG,EAAK,aAAa,KAAK,aAAa,CAACA,EAAK,YAAa,QAAO;AAElE,QAAMS,IAAOT,EAAK;AAClB,MAAIU,IAAS1G,EAAM;AACnB,EAAA0G,IAAS,KAAK,IAAI,KAAK,IAAI,GAAGA,CAAM,GAAGD,EAAK,MAAM;AAElD,QAAME,IAAa,CAACC,MAAe,mBAAmB,KAAKA,CAAE;AAC7D,MAAIC,IAAQH,GACRI,IAAMJ;AAEV,SAAOG,IAAQ,KAAKF,EAAWF,EAAKI,IAAQ,CAAC,CAAE,IAAG,CAAAA,KAAS;AAC3D,SAAOC,IAAML,EAAK,UAAUE,EAAWF,EAAKK,CAAG,CAAE,IAAG,CAAAA,KAAO;AAE3D,MAAID,MAAUC,EAAK,QAAO;AAE1B,QAAMC,IAAY,SAAS,YAAA;AAC3B,EAAAA,EAAU,SAASf,GAAMa,CAAK,GAC9BE,EAAU,OAAOf,GAAMc,CAAG;AAE1B,QAAM/G,IAAY,OAAO,aAAA;AACzB,SAAAA,KAAA,QAAAA,EAAW,mBACXA,KAAA,QAAAA,EAAW,SAASgH,IAEbN,EAAK,MAAMI,GAAOC,CAAG;AAC9B;AAEO,SAASE,GACdlG,GACAmG,GACAnH,GACM;AACN,EAAAgB,EAAI,KAAA;AACJ,aAAW2F,KAAQQ,GAAO;AACxB,QAAI,CAACR,EAAK,MAAM,OAAQ;AAExB,UAAMxF,IAAIwF,EAAK,IAAI3G,GACboB,IAAIuF,EAAK,IAAI3G,GACbgE,IAAW,KAAK,IAAI,GAAG2C,EAAK,WAAW3G,CAAK;AAElD,IAAAgB,EAAI,YAAY2F,EAAK,OACrB3F,EAAI,OAAO,GAAGgD,CAAQ,iBACtBhD,EAAI,eAAe;AAEnB,UAAMkD,IAAaF,IAAW,MACxBC,IAAQ0C,EAAK,MAAM,MAAM;AAAA,CAAI;AACnC,QAAIS,IAAUhG;AAEd,eAAW+C,KAAQF;AACjB,MAAAjD,EAAI,SAASmD,GAAMhD,GAAGiG,CAAO,GAC7BA,KAAWlD;AAAA,EAEf;AACA,EAAAlD,EAAI,QAAA;AACN;AAEO,SAASqG,GACdrG,GACAe,GACAuF,GACAtH,GACM;AACN,EAAAgB,EAAI,KAAA;AACJ,aAAWiB,KAASF,GAAQ;AAC1B,UAAMG,IAAWoF,EAAe,IAAIrF,EAAM,EAAE,GACtCd,IAAIc,EAAM,IAAIjC,GACdoB,IAAIa,EAAM,IAAIjC,GACdqB,IAAIY,EAAM,QAAQjC,GAClBsB,IAAIW,EAAM,SAASjC;AAEzB,IAAAgB,EAAI,YAAYkB,IACZ,4BACA,2BACJlB,EAAI,cAAckB,IACd,4BACA,WACJlB,EAAI,YAAY,KAChBA,EAAI,YAAYkB,IAAW,CAAA,IAAK,CAAC,GAAG,CAAC,CAAC,GACtClB,EAAI,SAASG,GAAGC,GAAGC,GAAGC,CAAC,GACvBN,EAAI,WAAWG,GAAGC,GAAGC,GAAGC,CAAC;AAAA,EAC3B;AACA,EAAAN,EAAI,QAAA;AACN;ACrXA,SAASuG,GAAK;AAAA,EACZ,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,UAAAC;AACF,GAAwC;AACtC,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAOH;AAAA,MACP,QAAQA;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAAC;AAAA,MACA,eAAY;AAAA,MAEX,UAAAC;AAAA,IAAA;AAAA,EAAA;AAGP;AAEO,SAASE,GAAgBC,GAAkB;AAChD,SACE,gBAAAF,EAACJ,MAAM,GAAGM,GACR,4BAAC,YAAA,EAAS,QAAO,mBAAkB,EAAA,CACrC;AAEJ;AAEO,SAASC,GAAiBD,GAAkB;AACjD,SACE,gBAAAF,EAACJ,MAAM,GAAGM,GACR,4BAAC,YAAA,EAAS,QAAO,kBAAiB,EAAA,CACpC;AAEJ;AAEO,SAASE,GAAaF,GAAkB;AAC7C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,GAAE,4CAAA,CAA4C;AAAA,IACpD,gBAAAA,EAAC,YAAA,EAAS,QAAO,mBAAA,CAAmB;AAAA,IACpC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,IAAA,CAAI;AAAA,EAAA,GACvC;AAEJ;AAEO,SAASM,GAAiBJ,GAAkB;AACjD,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,GAAE,2DAAA,CAA2D;AAAA,IACnE,gBAAAA,EAAC,YAAA,EAAS,QAAO,iBAAA,CAAiB;AAAA,IAClC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,IAAA,CAAI;AAAA,EAAA,GACvC;AAEJ;AAEO,SAASO,GAASL,GAAkB;AACzC,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,IAAA,CAAI;AAAA,IACvC,gBAAAA,EAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,IAAA,CAAI;AAAA,IACxC,gBAAAA,EAAC,UAAK,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,IAAA,CAAI;AAAA,IACzC,gBAAAA,EAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,KAAI,QAAO,IAAA,CAAI;AAAA,EAAA,GAC1C;AAEJ;AAEO,SAASQ,GAAUN,GAAkB;AAC1C,SACE,gBAAAF,EAACJ,IAAA,EAAM,GAAGM,GACR,4BAAC,QAAA,EAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,GACvC;AAEJ;AAEO,SAASO,GAASP,GAAkB;AACzC,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,IACrC,gBAAAA,EAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,EAAA,GACvC;AAEJ;AAEO,SAASU,GAAYR,GAAkB;AAC5C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,YAAA,EAAS,QAAO,oBAAA,CAAoB;AAAA,IACrC,gBAAAA,EAAC,QAAA,EAAK,GAAE,6EAAA,CAA6E;AAAA,IACrF,gBAAAA,EAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,IAAA,CAAI;AAAA,EAAA,GAC3C;AAEJ;AAEO,SAASW,GAAYT,GAAkB;AAC5C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,YAAA,EAAS,QAAO,mBAAA,CAAmB;AAAA,IACpC,gBAAAA,EAAC,YAAA,EAAS,QAAO,iBAAA,CAAiB;AAAA,IAClC,gBAAAA,EAAC,QAAA,EAAK,GAAE,uEAAA,CAAuE;AAAA,EAAA,GACjF;AAEJ;AAEO,SAASY,GAAWV,GAAkB;AAC3C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,YAAA,EAAS,QAAO,mBAAA,CAAmB;AAAA,IACpC,gBAAAA,EAAC,QAAA,EAAK,GAAE,sCAAA,CAAsC;AAAA,EAAA,GAChD;AAEJ;AAEO,SAASa,GAAcX,GAAkB;AAC9C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,IACnB,gBAAAA,EAAC,QAAA,EAAK,GAAE,+CAAA,CAA+C;AAAA,EAAA,GACzD;AAEJ;AAEO,SAASc,GAAcZ,GAAkB;AAC9C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,GAAE,0BAAA,CAA0B;AAAA,IAClC,gBAAAA,EAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,EAAA,GACvC;AAEJ;AAEO,SAASe,GAAWb,GAAkB;AAC3C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,GAAE,uFAAA,CAAuF;AAAA,IAC/F,gBAAAA,EAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,IACnB,gBAAAA,EAAC,QAAA,EAAK,GAAE,YAAA,CAAY;AAAA,EAAA,GACtB;AAEJ;AAEO,SAASgB,GAAc,EAAE,MAAAnB,IAAO,IAAI,WAAAC,KAAwB;AACjE,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAOH;AAAA,MACP,QAAQA;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,gBAAe;AAAA,MACf,WAAAC;AAAA,MACA,eAAY;AAAA,MAEZ,UAAA,gBAAAE,EAAC,QAAA,EAAK,GAAE,s3BAAA,CAAs3B;AAAA,IAAA;AAAA,EAAA;AAGp4B;AAEO,SAASiB,GAAWf,GAAkB;AAC3C,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,IACnB,gBAAAA,EAAC,QAAA,EAAK,GAAE,+CAAA,CAA+C;AAAA,EAAA,GACzD;AAEJ;AAEO,SAASkB,GAAShB,GAAkB;AACzC,SACE,gBAAAG,EAACT,IAAA,EAAM,GAAGM,GACR,UAAA;AAAA,IAAA,gBAAAF,EAAC,YAAA,EAAS,QAAO,oBAAA,CAAoB;AAAA,IACrC,gBAAAA,EAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,IACrC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,EAAA,GACvC;AAEJ;ACrHO,SAASmB,GAAW;AAAA,EACzB,QAAAC;AAAA,EACA,YAAAtC;AAAA,EACA,OAAAzG;AAAA,EACA,UAAAgJ;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,aAAAC;AAAA,EACA,aAAAnI,IAAc,CAAA;AAAA,EACd,iBAAAoI;AAAA,EACA,oBAAAC;AAAA,EACA,YAAA5H,IAAa,CAAA;AAAA,EACb,kBAAA6H,IAAmB;AAAA,EACnB,gBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,qBAAAC,IAAsB;AAAA,EACtB,mBAAAC;AAAA,EACA,iBAAAC,KAAkB,CAAA;AAAA,EAClB,0BAAAC,KAA2B;AAAA,EAC3B,wBAAAC;AAAA,EACA,yBAAAC,KAA0B;AAAA,EAC1B,oBAAAC;AAAA,EACA,aAAAC,KAAc,CAAA;AAAA,EACd,oBAAoBC;AAAA,EACpB,oBAAoBC;AAAA,EACpB,mBAAAC,KAAoB;AAAA,EACpB,mBAAAC;AAAA,EACA,OAAArD,KAAQ,CAAA;AAAA,EACR,WAAAsD;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,gBAAAC,KAAiB;AAAA,EACjB,cAAAC;AAAA,EACA,YAAAC,KAAa,CAAA;AAAA,EACb,qBAAqBC,KAAuB;AAAA,EAC5C,mBAAAC;AAAA,EACA,oBAAAC,KAAqB;AAAA,EACrB,eAAAC,KAAgB;AAAA,EAChB,uBAAAC;AACF,GAAoB;AAClB,QAAMC,KAAUC,GAAuB,IAAI,GACrCC,KAAYD,GAA0B,IAAI,GAC1CE,KAAeF,GAAuB,IAAI,GAC1CG,KAAaH,GAAuB,IAAI,GACxCI,KAAgBJ,GAA0B,IAAI,GAC9CK,KAAuBL,GAAyB,IAAI,GACpD,CAACM,IAAWC,EAAY,IAAIC,EAIhC,IAAI,GACAC,KAAgBT,GAAwB,IAAI,GAC5CU,KAAsBV,GAAO,EAAK;AAExC,EAAAW,GAAU,MAAM;AACd,QAAI,CAACjD,KAAU,CAACuC,GAAU,WAAW,CAACC,GAAa,WAAW,CAACC,GAAW;AACxE;AAGF,QAAIS,IAAY;AAChB,UAAMC,IAASZ,GAAU,SACnBa,IAAeZ,GAAa,SAC5BxI,IAAUyI,GAAW,SACrBxK,IAAMkL,EAAO,WAAW,IAAI;AAClC,WAAKlL,MAEU,YAAY;AACzB,UAAI;AACF,YAAIyK,GAAc,SAAS;AACzB,cAAI;AACF,YAAAA,GAAc,QAAQ,OAAA;AAAA,UACxB,QAAQ;AAAA,UAER;AACA,UAAAA,GAAc,UAAU;AAAA,QAC1B;AACA,YAAIC,GAAqB,SAAS;AAChC,cAAI;AACF,YAAAA,GAAqB,QAAQ,OAAA;AAAA,UAC/B,QAAQ;AAAA,UAER;AACA,UAAAA,GAAqB,UAAU;AAAA,QACjC;AAEA,cAAMU,IAAO,MAAMrD,EAAO,QAAQtC,CAAU;AAC5C,YAAIwF,EAAW;AAEf,cAAM3I,IAAW8I,EAAK,YAAY,EAAE,OAAApM,GAAO,UAAAgJ,GAAU,GAC/CqD,IAAQ,KAAK,MAAM/I,EAAS,KAAK,GACjC+C,IAAS,KAAK,MAAM/C,EAAS,MAAM;AAEzC,QAAA4I,EAAO,QAAQG,GACfH,EAAO,SAAS7F,GAChBtD,EAAQ,MAAM,QAAQ,GAAGsJ,CAAK,MAC9BtJ,EAAQ,MAAM,SAAS,GAAGsD,CAAM;AAEhC,cAAMiG,IAAOF,EAAK,OAAO,EAAE,eAAepL,GAAK,UAAAsC,GAAU;AAGzD,YAFAmI,GAAc,UAAUa,GACxB,MAAMA,EAAK,SACPL,EAAW;AAEf,QAAAE,EAAa,gBAAA,GACbA,EAAa,MAAM,YAAY,kBAAkB,OAAO7I,EAAS,KAAK,CAAC;AAEvE,cAAMiJ,KAAc,MAAMH,EAAK,eAAA;AAC/B,YAAIH,EAAW;AAEf,cAAM5H,IAAY,IAAImI,GAAU;AAAA,UAC9B,mBAAmBD;AAAA,UACnB,WAAWJ;AAAA,UACX,UAAA7I;AAAA,QAAA,CACD;AAGD,YAFAoI,GAAqB,UAAUrH,GAC/B,MAAMA,EAAU,OAAA,GACZ4H,EAAW;AAEf,QAAA/C,KAAA,QAAAA,EAAazC;AAAA,MACf,QAAQ;AAAA,MAER;AAAA,IACF,GAEK,GAEE,MAAM;AAEX,UADAwF,IAAY,IACRR,GAAc,SAAS;AACzB,YAAI;AACF,UAAAA,GAAc,QAAQ,OAAA;AAAA,QACxB,QAAQ;AAAA,QAER;AACA,QAAAA,GAAc,UAAU;AAAA,MAC1B;AACA,UAAIC,GAAqB,SAAS;AAChC,YAAI;AACF,UAAAA,GAAqB,QAAQ,OAAA;AAAA,QAC/B,QAAQ;AAAA,QAER;AACA,QAAAA,GAAqB,UAAU;AAAA,MACjC;AAAA,IACF,KA/EU;AAAA,EAgFZ,GAAG,CAAC3C,GAAQtC,GAAYzG,GAAOgJ,GAAUE,CAAU,CAAC,GAEpD8C,GAAU,MAAM;AACd,UAAMjJ,IAAUyI,GAAW;AAC3B,QAAI,CAACzI,EAAS;AAEd,UAAM0J,IAAuB,CAAChN,MAA+C;;AAC3E,UAAI,CAAC4J,EAAiB,QAAO;AAE7B,YAAMlK,IACJM,MAAS,WACLd,KACAyK;AACN,UAAI,CAACjK,EAAO,QAAO;AAEnB,YAAMuN,IAAW5M,GAAsBiD,GAAS/C,CAAK;AACrD,UAAI,CAAC0M,EAAU,QAAO;AAEtB,YAAMjM,IACJhB,MAAS,WACLmB,GAAkB8L,EAAS,KAAK,IAChCA,EAAS;AAEf,aAAArD,EAAgB;AAAA,QACd,IAAIpK,GAAA;AAAA,QACJ,YAAAwH;AAAA,QACA,MAAAhH;AAAA,QACA,OAAAN;AAAA,QACA,OAAAsB;AAAA,QACA,MAAMiM,EAAS;AAAA,MAAA,CAChB,IAEDxH,IAAA,OAAO,aAAA,MAAP,QAAAA,EAAuB,mBAChB;AAAA,IACT,GAEMyH,IAAyB,CAACC,MAAyB;;AACvD,UAAI,CAACvD,KAAmB,CAACoB,GAAW,QAAO;AAE3C,YAAMiC,IAAW5M,GAAsBiD,GAAS/C,CAAK;AACrD,UAAI,CAAC0M,EAAU,QAAO;AAEtB,YAAMjM,IAAQG,GAAkB8L,EAAS,KAAK;AAC9C,MAAArD,EAAgB;AAAA,QACd,IAAIpK,GAAA;AAAA,QACJ,YAAAwH;AAAA,QACA,MAAM;AAAA,QACN,OAAO9H;AAAA,QACP,OAAA8B;AAAA,QACA,MAAMiM,EAAS;AAAA,MAAA,CAChB;AAED,YAAM3F,IAAQvG,GAAoBkM,EAAS,KAAK,GAC1ClF,IAAOzD,GAAkB6I,KAAgB,KAAK7F,EAAM,QAAQ,GAC5D8F,IAA0B;AAAA,QAC9B,IAAI/I,GAAA;AAAA,QACJ,YAAA2C;AAAA,QACA,GAAGM,EAAM;AAAA,QACT,GAAGA,EAAM;AAAA,QACT,OAAOS,EAAK;AAAA,QACZ,QAAQA,EAAK;AAAA,QACb,OAAOoF;AAAA,QACP,UAAU7F,EAAM;AAAA,QAChB,OAAOpD;AAAA,MAAA;AAGT,aAAA8G,GAAUoC,CAAO,GACjBhC,MAAA,QAAAA,GAAegC,EAAQ,KACvB1B,KAAA,QAAAA,EAAwB0B,EAAQ,MAChC3H,KAAA,OAAO,aAAA,MAAP,QAAAA,GAAuB,mBACvB6G,GAAoB,UAAU,IAC9B,OAAO,WAAW,MAAM;AACtB,QAAAA,GAAoB,UAAU;AAAA,MAChC,GAAG,CAAC,GACG;AAAA,IACT,GAEMe,IAAgB,MAAM;AAC1B,UAAI3D,MAAe,eAAeA,MAAe,aAAa;AAC5D,QAAAsD,EAAqBtD,CAAU;AAC/B;AAAA,MACF;AAEA,UAAIA,MAAe,SAAS;AAC1B,QAAAsD,EAAqB,QAAQ;AAC7B;AAAA,MACF;AAEA,UAAItD,MAAe,QAAQ;AACzB,cAAMlJ,IAAY,OAAO,aAAA;AACzB,QACEA,KACA,CAACA,EAAU,eACXA,EAAU,SAAA,EAAW,KAAA,KACrBA,EAAU,cACV8C,EAAQ,SAAS9C,EAAU,UAAU,KAErC0M,EAAuB1M,EAAU,UAAU;AAAA,MAE/C;AAAA,IACF,GAEM8M,IAAgB,CAACC,MAAyB;AAC9C,YAAMC,IAASD,EAAM;AACrB,UACEC,KAAA,QAAAA,EAAQ,QAAQ,+BAChBA,KAAA,QAAAA,EAAQ,QAAQ,2BAChBA,KAAA,QAAAA,EAAQ;AAER;AAGF,YAAMhN,IAAY,OAAO,aAAA,GACnBiN,IACJjN,KAAa,QACb,CAACA,EAAU,eACXA,EAAU,WAAW,OAAO,SAAS,KACrCA,EAAU,cAAc,QACxB8C,EAAQ,SAAS9C,EAAU,UAAU;AAEvC,UAAIkJ,MAAe,UAAU+D,GAAiB;AAC5C,YAAIF,EAAM,QAAQ,WAAW,CAACA,EAAM,UAAU;AAC5C,UAAAA,EAAM,eAAA,GACNL,EAAuB1M,EAAW,UAAU;AAC5C;AAAA,QACF;AAEA,YACE+M,EAAM,IAAI,WAAW,KACrB,CAACA,EAAM,WACP,CAACA,EAAM,WACP,CAACA,EAAM,QACP;AACA,UAAAA,EAAM,eAAA,GACNL,EAAuBK,EAAM,GAAG;AAChC;AAAA,QACF;AAAA,MACF;AAEA,MAAI7D,MAAe,UAAUA,MAAe,WACxC6D,EAAM,QAAQ,eAAeA,EAAM,QAAQ,YAE1CE,MAELF,EAAM,eAAA,GACNP,EAAqB,QAAQ;AAAA,IAC/B;AAEA,WAAA1J,EAAQ,iBAAiB,WAAW+J,CAAa,GACjD,OAAO,iBAAiB,WAAWC,CAAa,GACzC,MAAM;AACX,MAAAhK,EAAQ,oBAAoB,WAAW+J,CAAa,GACpD,OAAO,oBAAoB,WAAWC,CAAa;AAAA,IACrD;AAAA,EACF,GAAG;AAAA,IACD5D;AAAA,IACAC;AAAA,IACAC;AAAA,IACAoB;AAAA,IACAU;AAAA,IACAN;AAAA,IACApE;AAAA,IACAzG;AAAA,EAAA,CACD,GAEDgM,GAAU,MAAM;AACd,QAAI,CAACL,GAAW;AAEhB,QAAIwB,IAAQ,GACRC,IAAc,GACdC,IAAc,GACdC,IAAY;AAEhB,UAAMC,IAAqB,MAA0B;;AACnD,cACErI,IAAAkG,GAAQ,YAAR,gBAAAlG,EAAiB,QAAQ;AAAA,IAE7B,GAEMsI,IAAsB,CAAC3K,GAAiBC,OAAoB;AAEhE,UADI6I,GAAU,SAAS,YACnB,CAAClC,KAAqBS,GAAyB;AACnD,YAAMvI,IAAMD,EAAW,KAAK,CAAC+L,OAAMA,GAAE,OAAO9B,GAAU,EAAE;AACxD,UAAI,CAAChK,EAAK;AAEV,YAAMoB,KAAUyI,GAAW,SACrBkC,KAAW3K,KACbE,GAAoBF,IAAS/C,CAAK,IAClC,EAAE,OAAO,OAAU,QAAQ,MAAA,GACzB,EAAE,IAAA2N,IAAI,IAAAC,GAAA,IAAO7K,KACfG;AAAA,QACEL,IAAU8I,GAAU;AAAA,QACpB7I,KAAU6I,GAAU;AAAA,QACpB5I;AAAA,QACA/C;AAAA,MAAA,IAEF,EAAE,IAAI,GAAG,IAAI,EAAA,GAEX6N,KAAOH,GAAS,QAAQ/L,EAAI,GAC5BmM,KAAOJ,GAAS,SAAS/L,EAAI,GAC7BoM,KAAO,KAAK,IAAIF,IAAM,KAAK,IAAI,IAAIlC,GAAU,SAASgC,EAAE,CAAC,GACzDK,KAAO,KAAK,IAAIF,IAAM,KAAK,IAAI,IAAInC,GAAU,SAASiC,EAAE,CAAC;AAC/D,MAAAnE,EAAkBkC,GAAU,IAAI,EAAE,OAAOoC,IAAM,QAAQC,IAAM;AAAA,IAC/D,GAEMC,IAAyB,CAACpL,GAAiBC,OAAoB;;AAEnE,UADI6I,GAAU,SAAS,eACnB,CAAClC,KAAqBS,GAAyB;AAEnD,YAAMvI,IAAMD,EAAW,KAAK,CAAC+L,OAAMA,GAAE,OAAO9B,GAAU,EAAE;AACxD,UAAI,CAAChK,EAAK;AAGV,UAAIuM,MAAShJ,KAAA,SACV,iBAAiBrC,GAASC,EAAO,MADvB,gBAAAoC,GAET,QAAQ;AAgBZ,UAdKgJ,OAIHA,KAHc,MAAM;AAAA,QAClB,SAAS,iBAAiB,4CAA4C;AAAA,MAAA,EAGhE,KAAK,CAAC9B,OAAS;AACnB,cAAMpJ,KAAMoJ,GAAK,sBAAA;AACjB,eAAOtJ,MAAWE,GAAI,OAAOF,MAAWE,GAAI;AAAA,MAC9C,CAAC,KAAK,OAGLkL,OACHA,KAAS9C,GAAQ,UAEf,CAAC8C,GAAQ;AAEb,YAAMnL,KAAUmL,GAAO;AAAA,QACrB;AAAA,MAAA;AAEF,UAAI,CAACnL,GAAS;AAEd,YAAMoL,KAAa,OAAO;AAAA,QACxBD,GAAO,aAAa,kBAAkB,KAAK,OAAOvM,EAAI,UAAU;AAAA,QAChE;AAAA,MAAA,GAGIyM,KAAQxL,GAAkBC,GAASC,IAASC,IAAS/C,CAAK,GAC1D0N,KAAWzK,GAAoBF,IAAS/C,CAAK;AACnD,UAAIqO,KAAQD,GAAM,IAAIzC,GAAU,SAC5B2C,KAAQF,GAAM,IAAIzC,GAAU;AAChC,YAAM4C,KAAO,KAAK,IAAI,GAAGb,GAAS,QAAQ/L,EAAI,KAAK,GAC7C6M,KAAO,KAAK,IAAI,GAAGd,GAAS,SAAS/L,EAAI,MAAM;AACrD,MAAA0M,KAAQ,KAAK,IAAI,KAAK,IAAI,GAAGA,EAAK,GAAGE,EAAI,GACzCD,KAAQ,KAAK,IAAI,KAAK,IAAI,GAAGA,EAAK,GAAGE,EAAI,GAEzC/E,EAAkBkC,GAAU,IAAI;AAAA,QAC9B,YAAYwC;AAAA,QACZ,GAAGE;AAAA,QACH,GAAGC;AAAA,MAAA,CACJ;AAAA,IACH,GAEMG,IAAa,MAAM;AAEvB,UADAtB,IAAQ,GACJ,CAACG,EAAW;AAEhB,YAAMoB,IAAYnB,EAAA;AAClB,UAAI,CAACmB,EAAW;AAEhB,YAAMC,KAAYD,EAAU,eAAeA,EAAU;AACrD,UAAIC,MAAa,EAAG;AAEpB,YAAMC,IAAO,IACP5L,KAAM0L,EAAU,sBAAA,GAChBG,KAAUxB,IAAcrK,GAAI,KAC5B8L,KAAa9L,GAAI,SAASqK;AAEhC,UAAI0B,KAAQ;AACZ,UAAIzB,IAAY,KAAKuB,KAAUD;AAC7B,QAAAG,KAAQ,CAAC,KAAK,IAAI,IAAKH,IAAOC,MAAWD,IAAQ,EAAE;AAAA,eAC1CtB,IAAY,KAAKwB,KAAaF;AACvC,QAAAG,KAAQ,KAAK,IAAI,IAAKH,IAAOE,MAAcF,IAAQ,EAAE;AAAA,WAChD;AACL,QAAAtB,IAAY;AACZ;AAAA,MACF;AAEA,YAAM0B,KAAON,EAAU;AACvB,MAAAA,EAAU,YAAY,KAAK,IAAIC,IAAW,KAAK,IAAI,GAAGK,KAAOD,EAAK,CAAC,GAE/DL,EAAU,cAAcM,MAC1Bf,EAAuBb,GAAaC,CAAW,GAI9C0B,KAAQ,KAAKL,EAAU,YAAY,KACnCK,KAAQ,KAAKL,EAAU,YAAYC,KAEpCxB,IAAQ,OAAO,sBAAsBsB,CAAU,IAE/CnB,IAAY;AAAA,IAEhB,GAEM2B,IAAa,CAACjC,MAAwB;AAC1C,MAAAI,IAAcJ,EAAM,SACpBK,IAAcL,EAAM;AAEpB,YAAM0B,KAAYnB,EAAA;AAClB,UAAImB,IAAW;AAEb,cAAM1L,KAAM0L,GAAU,sBAAA,GAChBG,KAAU7B,EAAM,UAAUhK,GAAI,KAC9B8L,KAAa9L,GAAI,SAASgK,EAAM;AAEtC,QAAI6B,KAAU,MACZvB,IAAY,IACPH,MAAOA,IAAQ,OAAO,sBAAsBsB,CAAU,MAClDK,KAAa,MACtBxB,IAAY,GACPH,MAAOA,IAAQ,OAAO,sBAAsBsB,CAAU,MAE3DnB,IAAY;AAAA,MAEhB;AAEA,MAAI3B,GAAU,SAAS,WACrB6B,EAAoBR,EAAM,SAASA,EAAM,OAAO,IAEhDiB,EAAuBjB,EAAM,SAASA,EAAM,OAAO;AAAA,IAEvD,GAEMkC,IAAW,MAAM;AACrB,MAAA5B,IAAY,GACRH,MACF,OAAO,qBAAqBA,CAAK,GACjCA,IAAQ,IAEVvB,GAAa,IAAI;AAAA,IACnB;AAEA,kBAAO,iBAAiB,eAAeqD,CAAU,GACjD,OAAO,iBAAiB,aAAaC,CAAQ,GAC7C,OAAO,iBAAiB,iBAAiBA,CAAQ,GAC1C,MAAM;AACX,MAAA5B,IAAY,GACRH,KAAO,OAAO,qBAAqBA,CAAK,GAC5C,OAAO,oBAAoB,eAAe8B,CAAU,GACpD,OAAO,oBAAoB,aAAaC,CAAQ,GAChD,OAAO,oBAAoB,iBAAiBA,CAAQ;AAAA,IACtD;AAAA,EACF,GAAG;AAAA,IACDvD;AAAA,IACAzB;AAAA,IACAT;AAAA,IACAzJ;AAAA,IACA0B;AAAA,EAAA,CACD,GAEDsK,GAAU,MAAM;AACd,QAAI,CAACd,MAAiB,CAACY,GAAc,QAAS;AAC9C,UAAMqD,IAAKrD,GAAc,SACnBsD,IAAUjI,GAAM,KAAK,CAACkI,MAAMA,EAAE,OAAOnE,EAAa;AAExD,IAAAiE,EAAG,eAAcC,KAAA,gBAAAA,EAAS,UAAS,IACnCD,EAAG,MAAA;AAEH,UAAMjP,IAAQ,SAAS,YAAA;AACvB,IAAAA,EAAM,mBAAmBiP,CAAE,GAC3BjP,EAAM,SAAS,EAAK;AACpB,UAAMD,IAAY,OAAO,aAAA;AACzB,IAAAA,KAAA,QAAAA,EAAW,mBACXA,KAAA,QAAAA,EAAW,SAASC;AAAA,EAGtB,GAAG,CAACgL,EAAa,CAAC;AAElB,QAAMoE,KAAU,CAACH,MAA8B;AAC7C,IAAA/D,GAAQ,UAAU+D,GAClBlG,KAAA,QAAAA,EAAUkG;AAAA,EACZ,GAEMI,IAAkBtO,EAAY,OAAO,CAAC,MAAM,EAAE,eAAewF,CAAU,GACvE+I,IAAiB9N,EAAW,OAAO,CAAC+L,MAAMA,EAAE,eAAehH,CAAU,GACrEgJ,IAAsB1F,GAAgB,OAAO,CAAC2F,MAAMA,EAAE,eAAejJ,CAAU,GAC/EkJ,KAAYxI,GAAM,OAAO,CAACkI,MAAMA,EAAE,eAAe5I,CAAU,GAE3DmJ,KAAmB,CAACjJ,GAAsBvH,MAAkB;AAChE,UAAMyQ,IAAUzQ,EAAM,KAAA;AACtB,QAAI,CAACyQ,GAAS;AACZ,MAAAlF,MAAA,QAAAA,GAAehE,EAAK,KACpBwE,KAAA,QAAAA,EAAwB;AACxB;AAAA,IACF;AAEA,UAAM3D,IAAOzD,GAAkB8L,GAASlJ,EAAK,QAAQ;AACrD,IAAA+D,MAAA,QAAAA,GAAe/D,EAAK,IAAI;AAAA,MACtB,OAAOkJ;AAAA,MACP,OAAOrI,EAAK;AAAA,MACZ,QAAQA,EAAK;AAAA,IAAA,IAEf2D,KAAA,QAAAA,EAAwB;AAAA,EAC1B,GAEM2E,KAAoB,CAACjN,GAAiBC,MAAoB;AAC9D,QAAI,CAAC2H,GAAW;AAEhB,UAAM1H,IAAUyI,GAAW,SACrBnH,IAAYkH,GAAa;AAC/B,QAAI,CAACxI,KAAW,CAACsB,EAAW;AAE5B,QAAI+J,IAAQhK;AAAA,MACVvB;AAAA,MACAC;AAAA,MACAC;AAAA,MACAsB;AAAA,MACArE;AAAA,IAAA,GAGE+P,GACA5Q,IAAQwE;AAEZ,QAAIsH,IAAoB;AACtB,YAAMhJ,IAAQuE;AAAA,QACZ4H,EAAM;AAAA,QACNA,EAAM;AAAA,QACNtD;AAAA,QACArE;AAAA,MAAA;AAEF,UAAI,CAACxE,EAAO;AAEZ,YAAM+N,IAAW7I,GAAM,KAAK,CAACkI,OAAMA,GAAE,YAAYpN,EAAM,EAAE;AACzD,UAAI+N,GAAU;AACZ,QAAAnF,MAAA,QAAAA,GAAemF,EAAS,KACxBhF,MAAA,QAAAA,GAAoB/I,EAAM,KAC1BkJ,KAAA,QAAAA,EAAwB6E,EAAS;AACjC;AAAA,MACF;AAEA,MAAAD,IAAU9N,EAAM,IAChBmM,IAAQ;AAAA,QACN,GAAGnM,EAAM;AAAA,QACT,GAAGA,EAAM;AAAA,QACT,UAAUA,EAAM,YAAYyB;AAAA,MAAA,GAE9BvE,IAAQ8C,EAAM,SAAS0B,IACvBqH,MAAA,QAAAA,GAAoB/I,EAAM;AAAA,IAC5B;AAEA,UAAMuF,IAAOzD,GAAkB,IAAIqK,EAAM,QAAQ,GAC3CvB,IAA0B;AAAA,MAC9B,IAAI/I,GAAA;AAAA,MACJ,SAAAiM;AAAA,MACA,YAAAtJ;AAAA,MACA,GAAG2H,EAAM;AAAA,MACT,GAAGA,EAAM;AAAA,MACT,OAAO5G,EAAK;AAAA,MACZ,QAAQA,EAAK;AAAA,MACb,OAAO;AAAA,MACP,UAAU4G,EAAM;AAAA,MAChB,OAAAjP;AAAA,IAAA;AAGF,IAAAsL,GAAUoC,CAAO,GACjBhC,MAAA,QAAAA,GAAegC,EAAQ,KACvB1B,KAAA,QAAAA,EAAwB0B,EAAQ;AAAA,EAClC,GAEMoD,KAAwB,CAACjD,MAAyC;;AAEtE,QADI7D,MAAe,UACd6D,EAAM,OAAuB,QAAQ,iCAAiC;AACzE;AAGF,QAAIjB,GAAoB,SAAS;AAC/B,MAAAA,GAAoB,UAAU;AAC9B;AAAA,IACF;AAGA,UAAM9L,IAAY,OAAO,aAAA;AACzB,QAAI,EAAAA,KAAa,CAACA,EAAU,eAAeA,EAAU,SAAA,EAAW,SAKhE;AAAA,UAAI+M,EAAM,UAAU,KACLtG,GAAkBsG,EAAM,SAASA,EAAM,SAASzB,GAAa,OAAO,GACvE;AAER,cAAMxI,IAAUyI,GAAW;AAC3B,YAAIzI,KAAWsG,KAAmBoB,IAAW;AAC3C,gBAAMiC,IAAW5M,GAAsBiD,GAAS/C,CAAK;AACrD,cAAI0M,GAAU;AACZ,YAAArD,EAAgB;AAAA,cACd,IAAIpK,GAAA;AAAA,cACJ,YAAAwH;AAAA,cACA,MAAM;AAAA,cACN,OAAO9H;AAAA,cACP,OAAOiC,GAAkB8L,EAAS,KAAK;AAAA,cACvC,MAAMA,EAAS;AAAA,YAAA,CAChB;AACD,kBAAM3F,IAAQvG,GAAoBkM,EAAS,KAAK,GAC1ClF,IAAOzD,GAAkB2I,EAAS,QAAQ,KAAK3F,EAAM,QAAQ,GAC7D8F,IAA0B;AAAA,cAC9B,IAAI/I,GAAA;AAAA,cACJ,YAAA2C;AAAA,cACA,GAAGM,EAAM;AAAA,cACT,GAAGA,EAAM;AAAA,cACT,OAAOS,EAAK;AAAA,cACZ,QAAQA,EAAK;AAAA,cACb,OAAOkF,EAAS;AAAA,cAChB,UAAU3F,EAAM;AAAA,cAChB,OAAOpD;AAAA,YAAA;AAET,YAAA8G,GAAUoC,CAAO,GACjBhC,MAAA,QAAAA,GAAegC,EAAQ,KACvB1B,KAAA,QAAAA,EAAwB0B,EAAQ,MAChC3H,IAAA,OAAO,aAAA,MAAP,QAAAA,EAAuB,mBACvB6G,GAAoB,UAAU;AAAA,UAChC;AAAA,QACF;AACA;AAAA,MACF;AAGF,MAAAiB,EAAM,gBAAA,GACN8C,GAAkB9C,EAAM,SAASA,EAAM,OAAO;AAAA;AAAA,EAChD,GAEMkD,KAAqB,CAAClD,MAA4C;AACtE,UAAMC,IAASD,EAAM;AACrB,QACE,EAAAC,EAAO,QAAQ,+BAA+B,KAC9CA,EAAO,QAAQ,qCAAqC,KACpDA,EAAO,QAAQ,iCAAiC,IAKlD;AAAA,UAAI9D,MAAe,QAAQ;AACzB,QAAA2G,GAAkB9C,EAAM,SAASA,EAAM,OAAO;AAC9C;AAAA,MACF;AAEA,UACE,CAAC9C,MACDf,MAAe,UACfoB,MACAC,GACA;AACA,cAAMzH,IAAUyI,GAAW;AAC3B,YAAI,CAACzI,EAAS;AACd,cAAMqL,IAAQxL,GAAkBoK,EAAM,SAASA,EAAM,SAASjK,GAAS/C,CAAK;AAC5E,QAAAwK,EAAkB/D,GAAY,KAAK,IAAI,GAAG2H,EAAM,IAAI,EAAE,GAAG,KAAK,IAAI,GAAGA,EAAM,IAAI,EAAE,CAAC;AAClF;AAAA,MACF;AAEA,UACE,CAAClE,MACDf,MAAe,UACfI,KACAC,GACA;AACA,cAAMzG,IAAUyI,GAAW;AAC3B,YAAI,CAACzI,EAAS;AACd,cAAM2K,IAAWzK,GAAoBF,GAAS/C,CAAK,GAC7CoO,IAAQxL,GAAkBoK,EAAM,SAASA,EAAM,SAASjK,GAAS/C,CAAK;AAE5E,YAAImB,IAAIiN,EAAM,IAAI7E,EAAiB,QAAQ,GACvCnI,IAAIgN,EAAM,IAAI7E,EAAiB,SAAS;AAE5C,cAAMgF,IAAO,KAAK,IAAI,GAAGb,EAAS,QAAQnE,EAAiB,KAAK,GAC1DiF,IAAO,KAAK,IAAI,GAAGd,EAAS,SAASnE,EAAiB,MAAM;AAClE,QAAApI,IAAI,KAAK,IAAI,KAAK,IAAI,GAAGA,CAAC,GAAGoN,CAAI,GACjCnN,IAAI,KAAK,IAAI,KAAK,IAAI,GAAGA,CAAC,GAAGoN,CAAI,GAEjChF,EAAe;AAAA,UACb,IAAIhI,GAAA;AAAA,UACJ,YAAAiF;AAAA,UACA,GAAAtF;AAAA,UACA,GAAAC;AAAA,UACA,OAAOmI,EAAiB;AAAA,UACxB,QAAQA,EAAiB;AAAA,UACzB,cAAcA,EAAiB;AAAA,QAAA,CAChC;AACD;AAAA,MACF;AAAA;AAAA,EACF,GAEM4G,KAAmB,CAACxJ,MACNuE,OAAkBvE,EAAK,KAIrC,gBAAAgB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,KAAKmE;AAAA,MACL,iBAAe;AAAA,MACf,gCAA8B;AAAA,MAC9B,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAU;AAAA,MACV,OAAO;AAAA,QACL,MAAMnF,EAAK,IAAI3G;AAAA,QACf,KAAK2G,EAAK,IAAI3G;AAAA,QACd,UAAU2G,EAAK,WAAW3G;AAAA,QAC1B,OAAO2G,EAAK;AAAA,QACZ,UAAU,KAAK,IAAI,IAAIA,EAAK,WAAW3G,IAAQ,GAAG;AAAA,QAClD,OAAO,KAAK,IAAI2G,EAAK,QAAQ3G,GAAO2G,EAAK,WAAW3G,IAAQ,GAAG;AAAA,MAAA;AAAA,MAEjE,SAAS,CAACoQ,MAAMA,EAAE,gBAAA;AAAA,MAClB,eAAe,CAACA,MAAMA,EAAE,gBAAA;AAAA,MACxB,SAAS,CAACA,MAAM;AACd,cAAMhR,IAAQgR,EAAE,cAAc,eAAe,IACvC5I,IAAOzD,GAAkB3E,KAAS,KAAKuH,EAAK,QAAQ;AAE1D,QAAA+D,MAAA,QAAAA,GAAe/D,EAAK,IAAI;AAAA,UACtB,OAAAvH;AAAA,UACA,OAAOoI,EAAK;AAAA,UACZ,QAAQA,EAAK;AAAA,QAAA;AAAA,MAEjB;AAAA,MACA,QAAQ,CAAC4I,MAAM;AACb,QAAAR,GAAiBjJ,GAAMyJ,EAAE,cAAc,eAAe,EAAE;AAAA,MAC1D;AAAA,MACA,WAAW,CAACA,MAAM;AAEhB,QAAAA,EAAE,gBAAA,GACEA,EAAE,QAAQ,aACZA,EAAE,eAAA,GACDA,EAAE,cAA8B,KAAA,IAE/BA,EAAE,QAAQ,WAAW,CAACA,EAAE,aAC1BA,EAAE,eAAA,GACDA,EAAE,cAA8B,KAAA;AAAA,MAErC;AAAA,IAAA;AAAA,IAzCKzJ,EAAK;AAAA,EAAA,IA8CXA,EAAK,MAAM,KAAA,IAGd,gBAAAgB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WACEiD,OAAmBjE,EAAK,KACpB,4EACA;AAAA,MAEN,OAAO;AAAA,QACL,MAAMA,EAAK,IAAI3G;AAAA,QACf,KAAK2G,EAAK,IAAI3G;AAAA,QACd,UAAU2G,EAAK,WAAW3G;AAAA,QAC1B,OAAO2G,EAAK;AAAA,MAAA;AAAA,MAEd,SAAS,CAACyJ,MAAM;AAEd,YADAA,EAAE,gBAAA,GACEjH,MAAe,SAAS;AAC1B,UAAAwB,MAAA,QAAAA,GAAehE,EAAK;AACpB;AAAA,QACF;AACA,QAAIwC,MAAe,WACjB0B,MAAA,QAAAA,GAAelE,EAAK,KACpBwE,KAAA,QAAAA,EAAwBxE,EAAK;AAAA,MAEjC;AAAA,MAEC,UAAAA,EAAK;AAAA,IAAA;AAAA,IAxBDA,EAAK;AAAA,EAAA,IAJiB;AAiCjC,SACE,gBAAAgB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK2H;AAAA,MACL,oBAAkB7I;AAAA,MAClB,WAAU;AAAA,MAEV,UAAA,gBAAAuB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKwD;AAAA,UACL,WAAW,+DAA+DrC,CAAU;AAAA,UACpF,SAAS+G;AAAA,UAET,UAAA;AAAA,YAAA,gBAAAvI,EAAC,UAAA,EAAO,KAAK2D,IAAW,WAAU,6BAA4B;AAAA,8BAE7D,OAAA,EAAI,WAAU,mCAAkC,eAAY,QAC1D,UAAAiE,EAAgB;AAAA,cAAI,CAACrO,MACpBA,EAAI,SAAS,WACT,OACAA,EAAI,MAAM,IAAI,CAACJ,GAAMuP,MACfnP,EAAI,SAAS,cAEb,gBAAAyG;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,MAAM7G,EAAK,IAAId;AAAA,oBACf,KAAKc,EAAK,IAAId;AAAA,oBACd,OAAOc,EAAK,IAAId;AAAA,oBAChB,QAAQc,EAAK,IAAId;AAAA,oBACjB,YAAYkB,EAAI;AAAA,kBAAA;AAAA,kBAElB,SAAS,CAACkP,MAAM;AACd,oBAAIjH,MAAe,YACnBiH,EAAE,gBAAA,GACF9G,KAAA,QAAAA,EAAqBpI,EAAI;AAAA,kBAC3B;AAAA,gBAAA;AAAA,gBAbK,GAAGA,EAAI,EAAE,IAAImP,CAAG;AAAA,cAAA,IAmBzB,gBAAA1I;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,MAAM7G,EAAK,IAAId;AAAA,oBACf,MAAMc,EAAK,IAAIA,EAAK,KAAKd,IAAQ,KAAK,IAAI,GAAGA,IAAQ,GAAG;AAAA,oBACxD,OAAOc,EAAK,IAAId;AAAA,oBAChB,QAAQ,KAAK,IAAI,GAAGA,IAAQ,GAAG;AAAA,oBAC/B,YAAYkB,EAAI;AAAA,kBAAA;AAAA,kBAElB,SAAS,CAACkP,MAAM;AACd,oBAAIjH,MAAe,YACnBiH,EAAE,gBAAA,GACF9G,KAAA,QAAAA,EAAqBpI,EAAI;AAAA,kBAC3B;AAAA,gBAAA;AAAA,gBAbK,GAAGA,EAAI,EAAE,IAAImP,CAAG;AAAA,cAAA,CAgB1B;AAAA,YAAA,GAET;AAAA,YAEA,gBAAArI,EAAC,OAAA,EAAI,WAAU,sCACZ,UAAA;AAAA,cAAAyH,EAAoB,IAAI,CAACxN,MAAU;AAClC,sBAAMqO,IAAQrO,EAAM,QAAQ,QACtBsO,IACJnG,GAAYnI,EAAM,EAAE,KAAKA,EAAM,SAAS,IACpCuO,IACJF,MAAU,UAAUA,MAAU,SAC1B,EAAQC,EAAU,KAAA,IAClBf,EAAe,KAAK,CAAC7N,MAAQA,EAAI,YAAYM,EAAM,EAAE;AAC3D,uBACE,gBAAA0F;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,2BAAyB1F,EAAM;AAAA,oBAC/B,WACE+H,OAA6B/H,EAAM,KAC/B,oFACAuO,IACE,kFACA;AAAA,oBAER,OAAO;AAAA,sBACL,MAAMvO,EAAM,IAAIjC;AAAA,sBAChB,KAAKiC,EAAM,IAAIjC;AAAA,sBACf,OAAOiC,EAAM,QAAQjC;AAAA,sBACrB,QAAQiC,EAAM,SAASjC;AAAA,oBAAA;AAAA,oBAEzB,SAAS,CAACoQ,MAAM;AAGd,0BAFAA,EAAE,gBAAA,GACFnG,KAAA,QAAAA,EAAyBhI,EAAM,KAC3BqO,MAAU,UAAUA,MAAU,QAAQ;AACxC,wBAAAxG,KAAA,QAAAA,EAAoB,OACpBK,KAAA,QAAAA,EAAqBmG;AACrB;AAAA,sBACF;AACA,4BAAMN,IAAWR,EAAe,KAAK,CAAC7N,MAAQA,EAAI,YAAYM,EAAM,EAAE;AACtE,sBAAA6H,KAAA,QAAAA,GAAoBkG,KAAA,gBAAAA,EAAU,OAAM,OAChCA,IACFrG,KAAA,QAAAA,EAAkBqG,EAAS,MAE3B7F,KAAA,QAAAA,EAAqBmG;AAAA,oBAEzB;AAAA,oBACA,OACEE,IACI,oBACAF,MAAU,SACR,eACAA,MAAU,SACR,eACA;AAAA,oBAGR,UACIA,MAAU,UAAUA,MAAU,SAC5BC,EAAU,SAEV,gBAAA5I,EAAC,QAAA,EAAK,WAAU,4CACb,UAAA4I,GACH,IAGAD,MAAU,SAAe,gBAAA3I,EAAC,UAAK,UAAA,aAAS,IACrC,gBAAAA,EAAC,QAAA,EAAM,UAAA1F,EAAM,eAAe,cAAa,IAE3CuO,IAAS,OAAO,gBAAA7I,EAAC,QAAA,EAAK,UAAA,aAAS;AAAA,kBACrC;AAAA,kBAvDE1F,EAAM;AAAA,gBAAA;AAAA,cA0DjB,CAAC;AAAA,cACAuN,EAAe,IAAI,CAAC7N,MACnB,gBAAAqG;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WACE6B,MAAwBlI,EAAI,KACxB,wEACA;AAAA,kBAEN,OAAO;AAAA,oBACL,MAAMA,EAAI,IAAI3B;AAAA,oBACd,KAAK2B,EAAI,IAAI3B;AAAA,oBACb,OAAO2B,EAAI,QAAQ3B;AAAA,oBACnB,QAAQ2B,EAAI,SAAS3B;AAAA,kBAAA;AAAA,kBAEvB,eAAe,CAACoQ,MAAM;AAKpB,wBAJAA,EAAE,gBAAA,GACFA,EAAE,eAAA,GACFtG,KAAA,QAAAA,EAAoBnI,EAAI,KAEpBwH,MAAe,WAAW,CAACe,IAAyB;AACtD,sBAAAR,KAAA,QAAAA,EAAoB/H,EAAI;AACxB;AAAA,oBACF;AAEA,wBAAIuI,IAAyB;AAC3B,sBAAAD,KAAA,QAAAA,EAAyBtI,EAAI,WAAW,OACxCgI,KAAA,QAAAA,EAAkBhI,EAAI;AACtB;AAAA,oBACF;AAEA,0BAAMoB,IAAUyI,GAAW;AAC3B,wBAAI,CAACzI,EAAS;AACd,0BAAMqL,IAAQxL,GAAkBwN,EAAE,SAASA,EAAE,SAASrN,GAAS/C,CAAK;AACpE,oBAAA4L,GAAa;AAAA,sBACX,MAAM;AAAA,sBACN,IAAIjK,EAAI;AAAA,sBACR,SAASyM,EAAM,IAAIzM,EAAI;AAAA,sBACvB,SAASyM,EAAM,IAAIzM,EAAI;AAAA,oBAAA,CACxB;AAAA,kBACH;AAAA,kBAEA,UAAA;AAAA,oBAAA,gBAAAgG;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAU;AAAA,wBACV,OAAM;AAAA,wBACN,cAAW;AAAA,wBACX,eAAe,CAACyI,MAAM;AACpB,0BAAAA,EAAE,gBAAA;AAAA,wBACJ;AAAA,wBACA,SAAS,CAACA,MAAM;AACd,0BAAAA,EAAE,gBAAA,GACFtG,KAAA,QAAAA,EAAoBnI,EAAI,KACxBgI,KAAA,QAAAA,EAAkBhI,EAAI;AAAA,wBACxB;AAAA,wBAEA,UAAA,gBAAAgG,EAACiB,IAAA,EAAW,MAAM,GAAA,CAAI;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAEtBsB,KAkCE,OAjCF,gBAAAlC,EAAAyI,IAAA,EACE,UAAA;AAAA,sBAAA,gBAAA9I;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,OAAM;AAAA,0BACN,cAAW;AAAA,0BACX,eAAe,CAACyI,MAAM;AACpB,4BAAAA,EAAE,gBAAA;AAAA,0BACJ;AAAA,0BACA,SAAS,CAACA,MAAM;AACd,4BAAAA,EAAE,gBAAA,GACFtG,KAAA,QAAAA,EAAoBnI,EAAI,KACxBiI,KAAA,QAAAA,EAAuBjI,EAAI;AAAA,0BAC7B;AAAA,0BACD,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGD,gBAAAgG;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,OAAM;AAAA,0BACN,cAAW;AAAA,0BACX,eAAe,CAACyI,MAAM;AACpB,4BAAAA,EAAE,gBAAA;AAAA,0BACJ;AAAA,0BACA,SAAS,CAACA,MAAM;AACd,4BAAAA,EAAE,gBAAA,GACF1G,KAAA,QAAAA,EAAoB/H,EAAI;AAAA,0BAC1B;AAAA,0BACD,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAED,EAAA,CACF;AAAA,oBAEF,gBAAAgG,EAAC,SAAI,KAAKhG,EAAI,cAAc,KAAI,aAAY,WAAW,IAAO;AAAA,oBAC5DuI,KAsBE,OArBF,gBAAAvC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAM;AAAA,wBACN,eAAe,CAACyI,MAAM;AACpB,0BAAAA,EAAE,gBAAA,GACFA,EAAE,eAAA,GACFtG,KAAA,QAAAA,EAAoBnI,EAAI,KACxBiK,GAAa;AAAA,4BACX,MAAM;AAAA,4BACN,IAAIjK,EAAI;AAAA,4BACR,QAAQyO,EAAE;AAAA,4BACV,QAAQA,EAAE;AAAA,4BACV,QAAQzO,EAAI;AAAA,4BACZ,QAAQA,EAAI;AAAA,0BAAA,CACb;AAAA,wBACH;AAAA,wBAEA,UAAA,gBAAAgG,EAAC,SAAI,OAAM,KAAI,QAAO,KAAI,SAAQ,WAAU,MAAK,QAAO,OAAM,8BAC5D,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,oBAAmB,QAAO,SAAQ,aAAY,OAAM,eAAc,QAAA,CAAO,EAAA,CACnF;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAEA;AAAA,gBAAA;AAAA,gBAjHChG,EAAI;AAAA,cAAA,CAmHZ;AAAA,YAAA,GACH;AAAA,YAEA,gBAAAgG,EAAC,OAAA,EAAI,WAAU,yCACZ,UAAAgI,GAAU,IAAI,CAAChJ,MAASwJ,GAAiBxJ,CAAI,CAAC,EAAA,CACjD;AAAA,YAEA,gBAAAgB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAK4D;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS0E;AAAA,cAAA;AAAA,YAAA;AAAA,8BAGV,OAAA,EAAI,WAAU,mCAAkC,eAAY,QAC1D,UAAAV,EAAgB;AAAA,cAAI,CAACrO,MACpBA,EAAI,SAAS,WACTA,EAAI,MAAM,IAAI,CAACJ,GAAMuP,MACnB,gBAAA1I;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,MAAM7G,EAAK,IAAId;AAAA,oBACf,KAAKc,EAAK,IAAId;AAAA,oBACd,OAAOc,EAAK,IAAId;AAAA,oBAChB,QAAQc,EAAK,IAAId;AAAA,oBACjB,YAAYkB,EAAI,SAASvC;AAAA,kBAAA;AAAA,kBAE3B,SAAS,CAACyR,MAAM;AACd,oBAAIjH,MAAe,YACnBiH,EAAE,gBAAA,GACF9G,KAAA,QAAAA,EAAqBpI,EAAI;AAAA,kBAC3B;AAAA,gBAAA;AAAA,gBAbK,GAAGA,EAAI,EAAE,IAAImP,CAAG;AAAA,cAAA,CAexB,IACD;AAAA,YAAA,EACN,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;AC7nCO,SAASK,GAAU;AAAA,EACxB,QAAA3H;AAAA,EACA,YAAAtC;AAAA,EACA,UAAAkK;AAAA,EACA,UAAA3H;AAAA,EACA,UAAA4H;AAAA,EACA,OAAAvE,IAAQ;AAAA,EACR,aAAApL,IAAc,CAAA;AAAA,EACd,YAAAS,IAAa,CAAA;AAAA,EACb,iBAAAqI,IAAkB,CAAA;AAAA,EAClB,OAAA5C,IAAQ,CAAA;AAAA,EACR,YAAA2D,IAAa,CAAA;AACf,GAAmB;AACjB,QAAMQ,IAAYD,GAA0B,IAAI;AAEhD,SAAAW,GAAU,MAAM;AACd,QAAI,CAACjD,KAAU,CAACuC,EAAU,QAAS;AAEnC,QAAIW,IAAY;AAChB,UAAMC,IAASZ,EAAU,SACnBtK,IAAMkL,EAAO,WAAW,IAAI;AAClC,QAAI,CAAClL,EAAK;AACV,QAAIsL,IAA0B;AA8D9B,YA5De,YAAY;AACzB,UAAI;AACF,cAAMF,IAAO,MAAMrD,EAAO,QAAQtC,CAAU;AAC5C,YAAIwF,EAAW;AAEf,cAAM4E,IAAczE,EAAK,YAAY,EAAE,OAAO,GAAG,UAAApD,GAAU,GACrDhJ,IAAQqM,IAAQwE,EAAY,OAC5BvN,KAAW8I,EAAK,YAAY,EAAE,OAAApM,GAAO,UAAAgJ,GAAU;AAErD,QAAAkD,EAAO,QAAQ,KAAK,MAAM5I,GAAS,KAAK,GACxC4I,EAAO,SAAS,KAAK,MAAM5I,GAAS,MAAM,GAE1CgJ,IAAOF,EAAK,OAAO,EAAE,eAAepL,GAAK,UAAAsC,IAAU,GACnD,MAAMgJ,EAAK;AAEX,cAAMiD,KAAkBtO,EAAY,OAAO,CAACN,MAAMA,EAAE,eAAe8F,CAAU;AAC7E,QAAI8I,GAAgB,SAAS,KAC3BxO,GAAmBC,GAAKuO,IAAiBvP,CAAK;AAGhD,cAAMwP,IAAiB9N,EAAW,OAAO,CAAC+L,MAAMA,EAAE,eAAehH,CAAU,GACrEgJ,KAAsB1F,EAAgB;AAAA,UAC1C,CAAC9H,MAAUA,EAAM,eAAewE;AAAA,QAAA;AAElC,QAAIgJ,GAAoB,SAAS,KAC/B3N;AAAA,UACEd;AAAA,UACAyO;AAAA,UACA,IAAI,IAAID,EAAe,IAAI,CAAC7N,MAAQA,EAAI,OAAO,EAAE,OAAO,OAAO,CAAa;AAAA,UAC5E3B;AAAA,QAAA,GAGAwP,EAAe,SAAS,KAC1B,MAAM/N,GAAuBT,GAAKwO,GAAgBxP,CAAK;AAGzD,cAAM2P,IAAYxI,EAAM,OAAO,CAACkI,MAAMA,EAAE,eAAe5I,CAAU,GAC3DqK,KAAiBhG,EAAW;AAAA,UAChC,CAAC7I,MAAUA,EAAM,eAAewE;AAAA,QAAA;AAElC,QAAIqK,GAAe,SAAS,KAC1BzJ;AAAA,UACErG;AAAA,UACA8P;AAAA,UACA,IAAI;AAAA,YACFnB,EACG,OAAO,CAACN,MAAMA,EAAE,WAAWA,EAAE,MAAM,KAAA,CAAM,EACzC,IAAI,CAACA,MAAMA,EAAE,OAAiB;AAAA,UAAA;AAAA,UAEnCrP;AAAA,QAAA,GAGA2P,EAAU,SAAS,KACrBzI,GAAkBlG,GAAK2O,GAAW3P,CAAK;AAAA,MAE3C,QAAQ;AAAA,MAER;AAAA,IACF,GAEK,GAEE,MAAM;AAEX,UADAiM,IAAY,IACRK;AACF,YAAI;AACF,UAAAA,EAAK,OAAA;AAAA,QACP,QAAQ;AAAA,QAER;AAAA,IAEJ;AAAA,EACF,GAAG;AAAA,IACDrL;AAAA,IACA8H;AAAA,IACAtC;AAAA,IACAuC;AAAA,IACAe;AAAA,IACArI;AAAA,IACAoJ;AAAA,IACA3D;AAAA,IACAkF;AAAA,EAAA,CACD,GAGC,gBAAArE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,MAAM4I,EAASnK,CAAU;AAAA,MAClC,WACEkK,IACI,8DACA;AAAA,MAEN,OAAO,QAAQlK,CAAU;AAAA,MAEzB,UAAA;AAAA,QAAA,gBAAAkB,EAAC,SAAI,WAAU,kCACb,4BAAC,UAAA,EAAO,KAAK2D,GAAW,EAAA,CAC1B;AAAA,QACA,gBAAA3D,EAAC,QAAA,EAAK,WAAU,kCAAkC,UAAAlB,EAAA,CAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGnE;AC1JA,MAAMsK,KAAuB;AAE7B,IAAIC,KAAmB;AAGhB,SAASC,GAAgBC,GAAyB;AACvD,EAAAC,GAAS,oBAAoB,YAAYD,GACzCF,KAAmB;AACrB;AAEO,SAASI,GAAgBF,GAA0B;AACxD,MAAIA,GAAW;AACb,IAAAD,GAAgBC,CAAS;AACzB;AAAA,EACF;AACA,EAAIF,MAAoBG,GAAS,oBAAoB,aAErDF;AAAA,IACE,gCAAgCE,GAAS,OAAO;AAAA,EAAA;AAEpD;AAEO,SAASE,GACdC,GACAC,GACAC,IAAU,IACF;AACR,QAAMC,IAASF,KAAWD;AAC1B,MAAI,CAACG,EAAQ,QAAO;AAEpB,MAAIV,GAAqB,KAAKU,CAAM,EAAG,QAAOA;AAE9C,QAAMC,IAAOD,EAAO,WAAW,GAAG,IAAIA,IAAS,IAAIA,CAAM;AACzD,SAAKD,IACE,GAAGA,EAAQ,QAAQ,OAAO,EAAE,CAAC,GAAGE,CAAI,KADtBA;AAEvB;AAEA,eAAsBC,GACpBC,GACAC,GACsB;AACtB,QAAMC,IAAM,MAAM,MAAMF,GAAKC,CAAY;AAEzC,MAAI,CAACC,EAAI;AACP,UAAM,IAAI,MAAM,wBAAwBA,EAAI,MAAM,GAAG;AAGvD,SAAOA,EAAI,YAAA;AACb;AAEA,eAAsBC,GACpBN,GACAI,GACsB;AACtB,MAAI,OAAOJ,KAAW;AACpB,WAAOE,GAAoBF,GAAQI,CAAY;AAEjD,MAAIJ,aAAkB,YAAa,QAAOA,EAAO,MAAM,CAAC;AACxD,MAAIA,aAAkB,YAAY;AAChC,UAAMO,IAAO,IAAI,WAAWP,EAAO,UAAU;AAC7C,WAAAO,EAAK,IAAIP,CAAM,GACRO,EAAK;AAAA,EACd;AACA,SAAOP,EAAO,YAAA;AAChB;AC7CA,eAAsBQ,GACpBlJ,GACAtC,GACAyL,GAS4B;AAC5B,QAAM;AAAA,IACJ,OAAAlS;AAAA,IACA,UAAAgJ;AAAA,IACA,aAAA/H;AAAA,IACA,YAAAS,IAAa,CAAA;AAAA,IACb,OAAAyF,IAAQ,CAAA;AAAA,IACR,UAAAgL,IAAW;AAAA,IACX,SAAAC,IAAU;AAAA,EAAA,IACRF,GAEE9F,IAAO,MAAMrD,EAAO,QAAQtC,CAAU,GACtCnD,IAAW8I,EAAK,YAAY,EAAE,OAAApM,GAAO,UAAAgJ,GAAU,GAC/CqJ,IAAejG,EAAK,YAAY,EAAE,OAAO,GAAG,UAAApD,GAAU,GAEtDkD,IAAS,SAAS,cAAc,QAAQ,GACxClL,IAAMkL,EAAO,WAAW,MAAM,EAAE,OAAO,IAAO;AACpD,MAAI,CAAClL;AACH,UAAM,IAAI,MAAM,iCAAiC;AAGnD,QAAMqL,IAAQ,KAAK,MAAM/I,EAAS,KAAK,GACjC+C,IAAS,KAAK,MAAM/C,EAAS,MAAM;AACzC,EAAA4I,EAAO,QAAQG,GACfH,EAAO,SAAS7F,GAEhBrF,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAGqL,GAAOhG,CAAM,GAEhC,MAAM+F,EAAK,OAAO,EAAE,eAAepL,GAAK,UAAAsC,EAAA,CAAU,EAAE;AAEpD,QAAMgP,IAAYrR,EAAY,OAAO,CAACN,MAAMA,EAAE,eAAe8F,CAAU;AACvE,EAAI6L,EAAU,SAAS,KACrBvR,GAAmBC,GAAKsR,GAAWtS,CAAK;AAG1C,QAAMuS,IAAW7Q,EAAW,OAAO,CAAC+L,MAAMA,EAAE,eAAehH,CAAU;AACrE,EAAI8L,EAAS,SAAS,KACpB,MAAM9Q,GAAuBT,GAAKuR,GAAUvS,CAAK;AAGnD,QAAM2P,IAAYxI,EAAM,OAAO,CAACkI,MAAMA,EAAE,eAAe5I,CAAU;AACjE,EAAIkJ,EAAU,SAAS,KACrBzI,GAAkBlG,GAAK2O,GAAW3P,CAAK;AAGzC,QAAMwS,KAAUtG,EAAO,UAAUiG,GAAUC,CAAO,GAC5CK,KAAYC,GAAeF,EAAO;AAExC,SAAAtG,EAAO,QAAQ,GACfA,EAAO,SAAS,GAET;AAAA,IACL,YAAAzF;AAAA,IACA,OAAA4F;AAAA,IACA,QAAAhG;AAAA,IACA,WAAWgM,EAAa;AAAA,IACxB,YAAYA,EAAa;AAAA,IACzB,SAAAG;AAAA,IACA,WAAAC;AAAA,EAAA;AAEJ;AAEA,eAAsBE,GACpB5J,GACAmJ,GAS8B;AAC9B,QAAMU,IAA6B,CAAA;AACnC,WAAS,IAAI,GAAG,KAAK7J,EAAO,UAAU,KAAK;AACzC,IAAA6J,EAAM,KAAK,MAAMX,GAAqBlJ,GAAQ,GAAGmJ,CAAO,CAAC;AAE3D,SAAOU;AACT;AAEA,SAASF,GAAeF,GAA6B;AACnD,QAAMK,IAASL,EAAQ,MAAM,GAAG,EAAE,CAAC,KAAK,IAClCM,IAAS,KAAKD,CAAM,GACpBE,IAAQ,IAAI,WAAWD,EAAO,MAAM;AAC1C,WAASpN,IAAI,GAAGA,IAAIoN,EAAO,QAAQpN,KAAK;AACtC,IAAAqN,EAAMrN,CAAC,IAAIoN,EAAO,WAAWpN,CAAC;AAEhC,SAAOqN;AACT;AAEA,SAASC,GAAIrM,GAA0B;AACrC,SAAO,IAAI,YAAA,EAAc,OAAOA,CAAI;AACtC;AAEA,SAASsM,MAAUC,GAAiC;AAClD,QAAMC,IAAQD,EAAM,OAAO,CAACE,GAAKC,MAAMD,IAAMC,EAAE,YAAY,CAAC,GACtDC,IAAM,IAAI,WAAWH,CAAK;AAChC,MAAIvM,IAAS;AACb,aAAW2M,KAAQL;AACjB,IAAAI,EAAI,IAAIC,GAAM3M,CAAM,GACpBA,KAAU2M,EAAK;AAEjB,SAAOD;AACT;AAKO,SAASE,GAAsBZ,GAAwC;AAE5E,QAAMa,IAAuB,CAAA,GAEvBC,IAAM,CAACX,OACXU,EAAQ,KAAKV,CAAK,GACXU,EAAQ,SAGXE,IAAoB,CAAA;AAE1B,aAAWvH,KAAQwG,GAAO;AACxB,UAAMgB,IAAcX;AAAA,MAClBD;AAAA,QACE,4CAA4C5G,EAAK,KAAK,YAAYA,EAAK,MAAM,0EAA0EA,EAAK,UAAU,UAAU;AAAA;AAAA;AAAA,MAAA;AAAA,MAElLA,EAAK;AAAA,MACL4G,GAAI;AAAA,UAAa;AAAA,IAAA,GAEba,IAAUH,EAAIE,CAAW,GAEzBE,IAAU;AAAA,EAAM1H,EAAK,UAAU,QAAQ,CAAC,CAAC,QAAQA,EAAK,WAAW,QAAQ,CAAC,CAAC;AAAA;AAAA,IAC3E2H,IAAYL;AAAA,MAChBV,GAAI,cAAcc,EAAQ,MAAM;AAAA;AAAA,EAAgBA,CAAO;AAAA,UAAa;AAAA,IAAA,GAIhEE,IAASN;AAAA,MACbV;AAAA,QACE,uDAAuD5G,EAAK,UAAU,QAAQ,CAAC,CAAC,IAAIA,EAAK,WAAW,QAAQ,CAAC,CAAC,eAAe2H,CAAS,uCAAuCF,CAAO;AAAA,MAAA;AAAA,IACtL;AAEF,IAAAF,EAAQ,KAAKK,CAAM;AAAA,EACrB;AAEA,QAAMC,IAAON,EAAQ,IAAI,CAACO,MAAO,GAAGA,CAAE,MAAM,EAAE,KAAK,GAAG,GAChDC,IAAUT;AAAA,IACdV,GAAI,0BAA0BiB,CAAI,YAAYN,EAAQ,MAAM,KAAK;AAAA,EAAA;AAGnE,aAAWK,KAAUL,GAAS;AAC5B,UAAMhN,IAAO,IAAI,YAAA,EAAc,OAAO8M,EAAQO,IAAS,CAAC,CAAC;AACzD,IAAAP,EAAQO,IAAS,CAAC,IAAIhB;AAAA,MACpBrM,EAAK,QAAQ,yBAAyB,WAAWwN,CAAO,MAAM;AAAA,IAAA;AAAA,EAElE;AAEA,QAAMC,IAAYV,EAAIV,GAAI,4BAA4BmB,CAAO,SAAS,CAAC,GAEjEE,IAAuB,CAACrB,GAAI;AAAA,CAAY,CAAC,GACzCsB,IAAoB,CAAC,CAAC;AAC5B,MAAI1N,IAASyN,EAAO,CAAC,EAAE;AAEvB,WAAS3O,IAAI,GAAGA,IAAI+N,EAAQ,QAAQ/N,KAAK,GAAG;AAC1C,IAAA4O,EAAQ,KAAK1N,CAAM;AACnB,UAAM2N,IAAYvB,GAAI,GAAGtN,IAAI,CAAC;AAAA,CAAU,GAClC8O,IAAYxB,GAAI;AAAA;AAAA,CAAY;AAClC,IAAAqB,EAAO,KAAKE,GAAWd,EAAQ/N,CAAC,GAAG8O,CAAS,GAC5C5N,KAAU2N,EAAU,aAAad,EAAQ/N,CAAC,EAAE,aAAa8O,EAAU;AAAA,EACrE;AAEA,QAAMC,IAAY7N;AAClB,MAAI8N,IAAO;AAAA,IAAWjB,EAAQ,SAAS,CAAC;AAAA;AACxC,EAAAiB,KAAQ;AAAA;AACR,WAAShP,IAAI,GAAGA,KAAK+N,EAAQ,QAAQ/N,KAAK;AACxC,IAAAgP,KAAQ,GAAG,OAAOJ,EAAQ5O,CAAC,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC;AAAA;AAEjD,SAAAgP,KAAQ;AAAA,WAAqBjB,EAAQ,SAAS,CAAC,UAAUW,CAAS;AAAA,GAClEM,KAAQ;AAAA,EAAcD,CAAS;AAAA,QAC/BJ,EAAO,KAAKrB,GAAI0B,CAAI,CAAC,GAEdzB,GAAO,GAAGoB,CAAM;AACzB;AAEO,SAASM,GAAoBC,GAAYC,GAAwB;AACtE,QAAMjD,IAAM,IAAI,gBAAgBgD,CAAI,GAC9BE,IAAS,SAAS,cAAc,GAAG;AACzC,EAAAA,EAAO,OAAOlD,GACdkD,EAAO,WAAWD,GAClBC,EAAO,MAAA,GACP,IAAI,gBAAgBlD,CAAG;AACzB;AChLA,MAAMmD,KAAiB;AAAA,EACrB,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,UAAA;AAAA,EAC3C,EAAE,IAAI,SAAS,OAAO,SAAS,QAAQ,QAAA;AAAA,EACvC,EAAE,IAAI,QAAQ,OAAO,QAAQ,QAAQ,aAAA;AAAA,EACrC,EAAE,IAAI,QAAQ,OAAO,QAAQ,QAAQ,YAAA;AAAA,EACrC,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,UAAA;AAC7C;AAIA,SAASC,GAAU5V,GAAuB;AACxC,SAAOA,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAEA,SAAS6V,GAAmBC,GAAqB;AAC/C,QAAMnC,IAAQ,IAAI,cAAc,OAAOmC,CAAG;AAC1C,MAAIpC,IAAS;AACb,QAAMqC,IAAQ;AACd,WAASzP,IAAI,GAAGA,IAAIqN,EAAM,QAAQrN,KAAKyP;AACrC,IAAArC,KAAU,OAAO,aAAa,GAAGC,EAAM,SAASrN,GAAGA,IAAIyP,CAAK,CAAC;AAE/D,SAAO,6BAA6B,KAAKrC,CAAM,CAAC;AAClD;AAEA,SAASsC,GAAuBC,GAA4C;AAC1E,SAAOA,MAAa,aAAa,KAAK;AACxC;AAEO,SAASC,GAAa;AAAA,EAC3B,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,iBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,gBAAAC;AACF,GAAsB;AACpB,QAAM3K,IAAYD,GAA0B,IAAI,GAC1C6K,IAAa7K,GAAO,EAAK,GACzB8K,IAAe9K,GAAwC,IAAI,GAC3D+K,IAAW/K,GAAqC,EAAE,GAClDgL,IAAiBhL,GAAmC,EAAE,GACtDiL,IAAqBjL,GAIjB,IAAI,GAERkL,IAAwCZ,KAAa,QACrD,CAACa,GAAiBC,CAAkB,IAAI5K,EAA6B0K,CAAiB,GACtF,CAACG,IAAWC,EAAY,IAAI9K,EAAS,EAAE,GACvC,CAAC0E,GAAWqG,EAAY,IAAI/K,EAAS,EAAE,GAEvC,CAACgL,GAAMC,EAAO,IAAIjL,EAAkB,MAAM,GAC1C,CAACkL,GAAWC,EAAY,IAAInL,EAAS,EAAE,GACvC,CAACoL,IAAeC,CAAgB,IAAIrL,EAAS,EAAE,GAC/C,CAACsL,IAAiBC,EAAkB,IAAIvL,EAAS,EAAK,GACtD,CAACwJ,IAAUgC,EAAW,IAAIxL,EAAmC,WAAW,GACxE,CAACyL,IAAUC,EAAW,IAAI1L,EAAS,SAAS,GAC5C,CAAC2L,IAAQC,EAAS,IAAI5L,EAAwB,SAAS,GACvD,CAAC6L,IAAoBC,EAAqB,IAAI9L,EAAS,EAAK,GAE5D+L,KACJ7C,GAAe,KAAK,CAAC8C,MAASA,EAAK,OAAOL,EAAM,KAAKzC,GAAe,CAAC,GAEjE+C,IACJzC,OAAa,aAAa4B,GAAc,KAAA,IAASF,EAAU,KAAA,GACvDgB,KACJD,MAAgBzC,OAAa,aAAa,OAAO;AAgInD,MA9HArJ,GAAU,MAAM;;AACd,QAAI,CAACuJ,EAAM;AAGX,QAFAkB,EAAmBF,CAAiB,GAEhCA,MAAsB,QAAQ;AAChC,MAAAI;AAAA,QACEb,OACE5Q,IAAA8Q,KAAA,gBAAAA,EAAkB,SAAlB,gBAAA9Q,EAAwB,WACxB,oBAAI,KAAA,GAAO,YAAA,EAAc,MAAM,GAAG,EAAE;AAAA,MAAA;AAExC;AAAA,IACF;AAEA,QAAIqR,MAAsB,QAAQ;AAChC,MAAAK,GAAad,OAAqBkC,KAAAhC,KAAA,gBAAAA,EAAkB,SAAlB,gBAAAgC,GAAwB,UAAS,EAAE;AACrE;AAAA,IACF;AAEA,UAAMC,IAAajC,KAAA,gBAAAA,EAAkB;AACrC,QAAI,CAACiC,GAAY;AACf,MAAAnB,GAAQ,MAAM,GACdE,GAAa,EAAE,GACfE,EAAiB,EAAE,GACnBE,GAAmB,EAAK,GACxBC,GAAY,WAAW,GACvBE,GAAY,SAAS,GACrBE,GAAU,SAAS,GACnBnB,EAAmB,UAAU,MAC7BqB,GAAsB,EAAK;AAC3B;AAAA,IACF;AAEA,IAAAb,GAAQmB,EAAW,IAAI,GACvBjB,GAAaiB,EAAW,aAAa,EAAE,GACvCf,EAAiBe,EAAW,iBAAiB,EAAE,GAC/Cb,GAAmB,EAAQa,EAAW,aAAc,GACpDZ,GAAYY,EAAW,YAAY,WAAW,GAC9CV,GAAYU,EAAW,YAAY,SAAS;AAC5C,UAAMC,IAAWnD,GAAe,KAAK,CAAC8C,OAASA,GAAK,OAAOI,EAAW,MAAM;AAC5E,IAAIC,KAAUT,GAAUS,EAAS,EAAE,GAC/BD,EAAW,SAAS,UACtB3B,EAAmB,UAAU;AAAA,MAC3B,cAAc2B,EAAW;AAAA,MACzB,OAAOA,EAAW;AAAA,MAClB,QAAQA,EAAW;AAAA,IAAA,GAErBN,GAAsB,EAAI,MAE1BrB,EAAmB,UAAU,MAC7BqB,GAAsB,EAAK;AAAA,EAE/B,GAAG,CAACpC,GAAMgB,GAAmBP,GAAkBF,CAAiB,CAAC,GAEjE9J,GAAU,MAAM;AACd,QAAI,CAACuJ,KAAQiB,MAAoB,OAAQ;AACzC,UAAMtK,IAASZ,EAAU;AACzB,QAAI,CAACY,EAAQ;AACb,UAAMlL,IAAMkL,EAAO,WAAW,IAAI;AAgBlC,QAfI,CAAClL,MAELkL,EAAO,QAAQ,KACfA,EAAO,SAAS,KAChBlL,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAGkL,EAAO,OAAOA,EAAO,MAAM,GAC9ClL,EAAI,UAAU,SACdA,EAAI,WAAW,SACfA,EAAI,cAAcsW,IAClBtW,EAAI,YAAY,KAChBmV,EAAa,UAAU,MACvBD,EAAW,UAAU,IACrBE,EAAS,UAAU,CAAA,GACnBC,EAAe,UAAU,CAAA,GAErBQ,MAAS,QAAQ;AAErB,UAAMsB,IAAS7B,EAAmB;AAClC,QAAI,EAAC6B,KAAA,QAAAA,EAAQ,cAAc;AAE3B,UAAMvW,KAAM,IAAI,MAAA;AAChB,IAAAA,GAAI,SAAS,MAAM;AACjB,YAAM5B,KAAQ,KAAK;AAAA,QACjBkM,EAAO,QAAQ,KAAK,IAAI,GAAGiM,EAAO,KAAK;AAAA,QACvCjM,EAAO,SAAS,KAAK,IAAI,GAAGiM,EAAO,MAAM;AAAA,QACzC;AAAA,MAAA,GAEI9W,KAAI8W,EAAO,QAAQnY,IACnBsB,KAAI6W,EAAO,SAASnY;AAC1B,MAAAgB,EAAI,UAAUY,KAAMsK,EAAO,QAAQ7K,MAAK,IAAI6K,EAAO,SAAS5K,MAAK,GAAGD,IAAGC,EAAC;AAAA,IAC1E,GACAM,GAAI,MAAMuW,EAAO;AAAA,EACnB,GAAG,CAAC5C,GAAMiB,GAAiBK,CAAI,CAAC,GAEhC7K,GAAU,MAAM;AACd,UAAME,IAASZ,EAAU,SACnBtK,IAAMkL,KAAA,gBAAAA,EAAQ,WAAW;AAC/B,IAAKlL,MACLA,EAAI,cAAcsW,IAClBtW,EAAI,YAAYsW;AAAA,EAClB,GAAG,CAACA,EAAQ,CAAC,GAEbtL,GAAU,MAAM;AACd,QAAI,CAACuJ,KAAQsB,MAAS,OAAQ;AAC9B,UAAM3K,IAASZ,EAAU,SACnBtK,IAAMkL,KAAA,gBAAAA,EAAQ,WAAW;AAK/B,QAJI,CAACA,KAAU,CAAClL,MAEhBA,EAAI,UAAU,GAAG,GAAGkL,EAAO,OAAOA,EAAO,MAAM,GAE3C,CAAC4L,GAAa;AAElB,UAAMtQ,IAAO4N,GAAuBC,EAAQ;AAE5C,IAAArU,EAAI,YAAYsW,IAChBtW,EAAI,YAAY,UAChBA,EAAI,eAAe,UACnBA,EAAI,OAAO,GAAGwG,CAAI,MAAMoQ,GAAa,MAAM,IAC3C5W,EAAI,SAAS8W,GAAa5L,EAAO,QAAQ,GAAGA,EAAO,SAAS,CAAC;AAAA,EAC/D,GAAG;AAAA,IACD4L;AAAA,IACAzC;AAAA,IACAwB;AAAA,IACAS;AAAA,IACA/B;AAAA,IACAqC;AAAA,EAAA,CACD,GAEG,CAACrC,EAAM,QAAO;AAElB,QAAM6C,KAAW,CAACpL,MAAiD;AACjE,UAAMd,IAASZ,EAAU,SACnBxK,IAAOoL,EAAO,sBAAA;AACpB,WAAO;AAAA,MACL,IAAKc,EAAM,UAAUlM,EAAK,QAAQA,EAAK,QAASoL,EAAO;AAAA,MACvD,IAAKc,EAAM,UAAUlM,EAAK,OAAOA,EAAK,SAAUoL,EAAO;AAAA,IAAA;AAAA,EAE3D,GAEMmM,KAAoB,CAACrL,MAAiD;AAC1E,QAAI6J,MAAS,OAAQ;AACrB,QAAIP,EAAmB,SAAS;AAC9B,MAAAA,EAAmB,UAAU,MAC7BqB,GAAsB,EAAK;AAC3B,YAAMzL,IAASZ,EAAU,SACnBtK,KAAMkL,KAAA,gBAAAA,EAAQ,WAAW;AAC/B,MAAIA,KAAUlL,OACZA,GAAI,YAAY,WAChBA,GAAI,SAAS,GAAG,GAAGkL,EAAO,OAAOA,EAAO,MAAM,GAC9ClL,GAAI,cAAcsW,IAClBtW,GAAI,YAAY,KAChBA,GAAI,UAAU,SACdA,GAAI,WAAW,UAEjBoV,EAAS,UAAU,CAAA;AAAA,IACrB;AACA,IAAApJ,EAAM,cAAc,kBAAkBA,EAAM,SAAS,GACrDkJ,EAAW,UAAU;AACrB,UAAMoC,IAAKF,GAASpL,CAAK;AACzB,IAAAmJ,EAAa,UAAUmC,GACvBjC,EAAe,UAAU,CAACiC,CAAE;AAAA,EAC9B,GAEMC,KAAoB,CAACvL,MAAiD;AAC1E,QAAI,CAACkJ,EAAW,WAAWW,MAAS,OAAQ;AAC5C,UAAM3K,IAASZ,EAAU,SACnBtK,IAAMkL,KAAA,gBAAAA,EAAQ,WAAW,OACzBsM,KAAOrC,EAAa;AAC1B,QAAI,CAACnV,KAAO,CAACwX,GAAM;AAEnB,UAAMpK,KAAQgK,GAASpL,CAAK;AAC5B,IAAAhM,EAAI,UAAA,GACJA,EAAI,OAAOwX,GAAK,GAAGA,GAAK,CAAC,GACzBxX,EAAI,OAAOoN,GAAM,GAAGA,GAAM,CAAC,GAC3BpN,EAAI,OAAA,GACJmV,EAAa,UAAU/H,IACvBiI,EAAe,QAAQ,KAAKjI,EAAK;AAAA,EACnC,GAEMqK,KAAkB,MAAM;AAC5B,IAAIpC,EAAe,QAAQ,SAAS,KAClCD,EAAS,QAAQ,KAAK,CAAC,GAAGC,EAAe,OAAO,CAAC,GAEnDA,EAAe,UAAU,CAAA,GACzBH,EAAW,UAAU,IACrBC,EAAa,UAAU;AAAA,EACzB,GAEMuC,KAAW,MAAM;AACrB,UAAMxM,IAASZ,EAAU,SACnBtK,IAAMkL,KAAA,gBAAAA,EAAQ,WAAW;AAC/B,IAAI,CAACA,KAAU,CAAClL,MAChBA,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAGkL,EAAO,OAAOA,EAAO,MAAM,GAC9CkK,EAAS,UAAU,CAAA,GACnBC,EAAe,UAAU,CAAA,GACzBC,EAAmB,UAAU,MAC7BqB,GAAsB,EAAK,GAC3BX,GAAa,EAAE,GACfE,EAAiB,EAAE,GACnBE,GAAmB,EAAK;AAAA,EAC1B,GAEMuB,KAAmB,CAACvZ,MAAkB;AAC1C,IAAA4X,GAAa5X,CAAK,GACb+X,MACHD,EAAiB0B,GAAexZ,CAAK,CAAC;AAAA,EAE1C,GAEMyZ,KAAc,MAAM;AACxB,QAAIhC,MAAS,QAAQ;AACnB,YAAMiC,IAAW1C,EAAS,SACpB+B,IAAS7B,EAAmB;AAClC,UAAIwC,EAAS,WAAW,GAAG;AACzB,YAAI,CAACX,EAAQ;AACb,QAAAlC,KAAA,QAAAA,EAAiB,QAAQ;AAAA,UACvB,MAAM;AAAA,UACN,cAAckC,EAAO;AAAA,UACrB,OAAOA,EAAO;AAAA,UACd,QAAQA,EAAO;AAAA,UACf,UAAAb;AAAA,QAAA,IAEF7B,EAAO0C,EAAO,cAAcA,EAAO,OAAOA,EAAO,MAAM;AACvD;AAAA,MACF;AAEA,UAAIY,IAAO,OAAUC,IAAO,OAAUzK,IAAO,QAAWC,KAAO;AAC/D,iBAAWkD,MAAQoH;AACjB,mBAAWR,MAAM5G;AACf,UAAI4G,GAAG,IAAIS,MAAMA,IAAOT,GAAG,IACvBA,GAAG,IAAIU,MAAMA,IAAOV,GAAG,IACvBA,GAAG,IAAI/J,MAAMA,IAAO+J,GAAG,IACvBA,GAAG,IAAI9J,OAAMA,KAAO8J,GAAG;AAI/B,YAAMW,IAAM;AACZ,MAAAF,IAAO,KAAK,IAAI,GAAGA,IAAOE,CAAG,GAC7BD,IAAO,KAAK,IAAI,GAAGA,IAAOC,CAAG,GAC7B1K,KAAQ0K,GACRzK,MAAQyK;AACR,YAAM5X,KAAIkN,IAAOwK,GACXzX,KAAIkN,KAAOwK,GAEXE,KAAWJ,EACd,IAAI,CAACpH,OAEG,MADKA,GAAK,IAAI,CAAC4G,QAAQ,EAAE,GAAGA,GAAG,IAAIS,GAAM,GAAGT,GAAG,IAAIU,IAAO,EAChD,IAAI,CAAC3F,OAAM,GAAGA,GAAE,EAAE,QAAQ,CAAC,CAAC,IAAIA,GAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAC5E,EACA,KAAK,GAAG,GAEL8F,KAAO,KAAK,IAAI,IAAGpD,KAAA,gBAAAA,EAAY,UAAS1U,EAAC,GACzC+X,KAAO,KAAK,IAAI,IAAGrD,KAAA,gBAAAA,EAAY,WAAUzU,EAAC,GAC1CtB,KAAQ,KAAK,IAAImZ,KAAO9X,IAAG+X,KAAO9X,EAAC,GACnC+X,KAAShY,KAAIrB,IACbsZ,KAAShY,KAAItB,IACbuZ,MAAMJ,KAAOE,MAAU,GACvBG,MAAMJ,KAAOE,MAAU,GAEvBpE,KACJ,yHACmFiE,EAAI,IAAIC,EAAI,6BACpEG,GAAG,QAAQ,CAAC,CAAC,IAAIC,GAAG,QAAQ,CAAC,CAAC,WAAWxZ,GAAM,QAAQ,CAAC,CAAC,eACxEkZ,EAAQ,yBAAyB5B,EAAQ,mFAEjD9E,KAAU,6BAA6B,KAAK0C,EAAG,CAAC;AACtD,MAAAe,KAAA,QAAAA,EAAiB,QAAQ;AAAA,QACvB,MAAM;AAAA,QACN,cAAczD;AAAAA,QACd,OAAO2G;AAAAA,QACP,QAAQC;AAAAA,QACR,UAAA9B;AAAA,MAAA,IAEF7B,EAAOjD,IAAS2G,IAAMC,EAAI;AAC1B;AAAA,IACF;AAEA,QAAI,CAACtB,EAAa;AAElB,UAAM2B,IAAWrE,GAAuBC,EAAQ,GAE1CqE,IADgB,SAAS,cAAc,QAAQ,EACpB,WAAW,IAAI;AAChD,IAAAA,EAAW,OAAO,GAAGD,CAAQ,MAAM7B,GAAa,MAAM;AACtD,UAAM+B,KAAcD,EAAW,YAAY5B,CAAW,GAChD8B,KAAU,GACVC,KAAW,KAAK,KAAKF,GAAY,KAAK,IAAIC,KAAU,GACpDE,KAAWL,IAAWG,KAAU,GAEhCT,KAAO,KAAK,IAAI,IAAGpD,KAAA,gBAAAA,EAAY,UAAS8D,EAAQ,GAChDT,KAAO,KAAK,IAAI,IAAGrD,KAAA,gBAAAA,EAAY,WAAU+D,EAAQ,GACjDC,IAAM,KAAK,IAAIZ,KAAOU,IAAUT,KAAOU,EAAQ,GAC/C9V,IAAW,KAAK,IAAI,GAAGyV,IAAWM,CAAG,GAGrCC,KAAMb,KAAO,GAAG,QAAQ,CAAC,GACzBc,KAAMb,KAAO,GAAG,QAAQ,CAAC,GACzBlE,IACJ,yHACmFiE,EAAI,IAAIC,EAAI,cACnFY,CAAE,QAAQC,CAAE,+FAERrC,GAAa,MAAM,gBAAgB5T,EAAS,QAAQ,CAAC,CAAC,WAC7DsT,EAAQ,KAAKtC,GAAU8C,CAAW,CAAC,iBAExCtF,IAAUyC,GAAmBC,CAAG;AAEtC,IAAAe,KAAA,QAAAA,EAAiB,QAAQ;AAAA,MACvB,MAAM;AAAA,MACN,cAAczD;AAAA,MACd,OAAO2G;AAAA,MACP,QAAQC;AAAA,MACR,WAAArC;AAAA,MACA,eAAAE;AAAA,MACA,QAAAO;AAAA,MACA,UAAAF;AAAA,MACA,UAAAjC;AAAA,IAAA,IAEFI,EAAOjD,GAAS2G,IAAMC,EAAI;AAAA,EAC5B,GAEMc,KAAuB,MAAM;AACjC,QAAI1D,MAAoB,UAAUA,MAAoB,OAAQ;AAC9D,UAAM7P,IACJ6P,MAAoB,SAASE,KAAYnG,EAAU,KAAA;AACrD,IAAK5J,MAELsP,KAAA,QAAAA,EAAiBO,GAAiB,EAAE,OAAO7P,EAAA,IAC3C+O,KAAA,QAAAA,EAAmB/O,GAAM6P;AAAA,EAC3B,GAEM2D,KAAc3D,MAAoB;AAQxC,2BACG,OAAA,EAAI,WAAU,4BAA2B,MAAK,UAAS,cAAW,QACjE,UAAA;AAAA,IAAA,gBAAA7O,EAAC,OAAA,EAAI,WAAU,qCAAoC,SAAS6N,GAAS;AAAA,IACrE,gBAAAxN,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAI,UAXX6O,MAAoB,SAChB,gBACAA,MAAoB,SAClB,eACA,qBAOK,CAAW;AAAA,QAChB,gBAAA7O;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS6N;AAAA,YACT,OAAM;AAAA,YACP,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MAECI,KAAqB,CAACD,IACrB,gBAAAhO,EAAC,OAAA,EAAI,WAAU,sCAAqC,MAAK,WACrD,UAAA,CAAC,QAAQ,QAAQ,MAAM,EAAY,IAAI,CAAC0H,MACxC,gBAAA1H;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,iBAAe6O,MAAoBnH;AAAA,UACnC,WACEmH,MAAoBnH,IAChB,uFACA;AAAA,UAEN,SAAS,MAAMoH,EAAmBpH,CAAC;AAAA,UAElC,UAAAA,MAAM,SAAS,SAASA,MAAM,SAAS,SAAS;AAAA,QAAA;AAAA,QAX5CA;AAAA,MAAA,CAaR,GACH,IACE;AAAA,MAEH8K,KACC,gBAAAnS,EAAAyI,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAzI,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,UAAA,gBAAAL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WACEkP,MAAS,SACL,uFACA;AAAA,cAEN,SAAS,MAAM;AACb,gBAAAC,GAAQ,MAAM,GACd4B,GAAA;AAAA,cACF;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAA/Q;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WACEkP,MAAS,SACL,uFACA;AAAA,cAEN,SAAS,MAAMC,GAAQ,MAAM;AAAA,cAC9B,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAA9O,EAAC,SAAA,EAAM,WAAU,+BAA8B,UAAA;AAAA,YAAA;AAAA,YAE7C,gBAAAL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO2P;AAAA,gBACP,UAAU,CAAClH,MAAMmH,GAAYnH,EAAE,OAAO,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UAC7C,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAECyG,MAAS,SACR,gBAAA7O,EAAAyI,IAAA,EACE,UAAA;AAAA,UAAA,gBAAA9I;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,cAAW;AAAA,cAEV,UAAAoN,GAAe,IAAI,CAAC8C,MACnB,gBAAAlQ;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WACE6P,OAAWK,EAAK,KACZ,sEACA;AAAA,kBAEN,OAAO,EAAE,YAAYA,EAAK,OAAA;AAAA,kBAC1B,SAAS,MAAMJ,GAAUI,EAAK,EAAE;AAAA,kBAChC,OAAOA,EAAK;AAAA,kBAEX,UAAAE;AAAA,gBAAA;AAAA,gBAXIF,EAAK;AAAA,cAAA,CAab;AAAA,YAAA;AAAA,UAAA;AAAA,UAGH,gBAAA7P,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,sCACf,UAAA;AAAA,cAAA,gBAAAL,EAAC,UAAK,UAAA,YAAA,CAAS;AAAA,cACf,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,OAAOoP;AAAA,kBACP,UAAU,CAAC3G,MAAMuI,GAAiBvI,EAAE,OAAO,KAAK;AAAA,kBAChD,SAAS,MAAMiH,GAAY,WAAW;AAAA,kBACtC,aAAY;AAAA,kBACZ,OAAO,EAAE,YAAYO,GAAa,OAAA;AAAA,kBAClC,WAAS;AAAA,gBAAA;AAAA,cAAA;AAAA,YACX,GACF;AAAA,YACA,gBAAA5P,EAAC,SAAA,EAAM,WAAU,sCACf,UAAA;AAAA,cAAA,gBAAAL,EAAC,UAAK,UAAA,WAAA,CAAQ;AAAA,cACd,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,OAAOsP;AAAA,kBACP,UAAU,CAAC7G,MAAM;AACf,oBAAAgH,GAAmB,EAAI,GACvBF,EAAiB9G,EAAE,OAAO,MAAM,YAAA,CAAa;AAAA,kBAC/C;AAAA,kBACA,SAAS,MAAMiH,GAAY,UAAU;AAAA,kBACrC,aAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,OAAO,EAAE,YAAYO,GAAa,OAAA;AAAA,gBAAO;AAAA,cAAA;AAAA,YAC3C,EAAA,CACF;AAAA,UAAA,GACF;AAAA,UAEA,gBAAA5P;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,cAAW;AAAA,cAEX,UAAA;AAAA,gBAAA,gBAAAL;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WACE0N,OAAa,cACT,uFACA;AAAA,oBAEN,SAAS,MAAMgC,GAAY,WAAW;AAAA,oBACvC,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGD,gBAAA1P;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WACE0N,OAAa,aACT,uFACA;AAAA,oBAEN,SAAS,MAAMgC,GAAY,UAAU;AAAA,oBACtC,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CACF,IAEA,gBAAA1P,EAAC,KAAA,EAAE,WAAU,gCACV,UAAA+P,KACG,mEACA,6BACN;AAAA,QAGF,gBAAA/P;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK2D;AAAA,YACL,WACEuL,MAAS,SACL,mCACA;AAAA,YAEN,eAAewB;AAAA,YACf,eAAeE;AAAA,YACf,aAAaE;AAAA,YACb,gBAAgBA;AAAA,UAAA;AAAA,QAAA;AAAA,MAClB,EAAA,CACF,IACEjC,MAAoB,SACtB,gBAAAxO,EAAC,SAAA,EAAM,WAAU,sCAAqC,OAAO,EAAE,SAAS,OAAA,GACtE,UAAA;AAAA,QAAA,gBAAAL,EAAC,UAAK,UAAA,OAAA,CAAI;AAAA,QACV,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO+O;AAAA,YACP,UAAU,CAACtG,MAAMuG,GAAavG,EAAE,OAAO,KAAK;AAAA,YAC5C,WAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACX,EAAA,CACF,sBAEC,SAAA,EAAM,WAAU,sCAAqC,OAAO,EAAE,SAAS,OAAA,GACtE,UAAA;AAAA,QAAA,gBAAAzI,EAAC,UAAK,UAAA,OAAA,CAAI;AAAA,QACV,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO4I;AAAA,YACP,UAAU,CAACH,MAAMwG,GAAaxG,EAAE,OAAO,KAAK;AAAA,YAC5C,aAAayF,KAAmB;AAAA,YAChC,WAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACX,GACF;AAAA,MAGF,gBAAA7N,EAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,QAAAmS,KACC,gBAAAxS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS+Q;AAAA,YACV,UAAA;AAAA,UAAA;AAAA,QAAA,IAGC;AAAA,QACJ,gBAAA/Q;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS6N;AAAA,YACV,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAA7N;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAASwS,KAActB,KAAcqB;AAAA,YACrC,UACE1D,MAAoB,SAAS,CAACE,KAC1BF,MAAoB,SAAS,CAACjG,EAAU,KAAA,IACxC;AAAA,YAGL,eAAc,kBAAkB;AAAA,UAAA;AAAA,QAAA;AAAA,MACnC,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAEA,SAASqI,GAAewB,GAAsB;AAC5C,QAAMlH,IAAQkH,EACX,KAAA,EACA,MAAM,KAAK,EACX,OAAO,OAAO;AACjB,SAAIlH,EAAM,WAAW,IAAU,KAC3BA,EAAM,WAAW,IACZA,EAAM,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,YAAA,IAEvBA,EACJ,MAAM,GAAG,CAAC,EACV,IAAI,CAACK,MAAA;;AAAS,aAAArO,IAAAqO,EAAK,CAAC,MAAN,gBAAArO,EAAS,kBAAiB;AAAA,GAAE,EAC1C,KAAK,EAAE;AACZ;AC9sBO,MAAMmV,KAAkB;AAwB/B,SAASC,GACPpG,GACAqG,GACsB;AACtB,QAAMC,KAAQ,MAAM;AACpB,SAAAA,EAAK,cAAcD,GACnB,OAAO,eAAeC,GAAMH,IAAiB;AAAA,IAC3C,OAAOnG;AAAA,IACP,YAAY;AAAA,EAAA,CACb,GACMsG;AACT;AAEO,SAASC,GACdC,GACe;AACf,SAAOA,EAAKL,EAAe;AAC7B;AAEO,SAASM,GACdvb,GAC+B;AAC/B,SACE,OAAOA,KAAU,cACjBib,MAAmBjb,KACnB,OAAQA,EAA+Bib,EAAe,KAAM;AAEhE;AAGO,MAAM3J,KAAY4J,GAAkB,aAAa,WAAW,GAEtDM,KAAaN,GAAkB,cAAc,YAAY,GAEzDO,KAAOP,GAAkB,QAAQ,MAAM,GAEvCQ,KAASR,GAAkB,UAAU,QAAQ,GAE7CS,KAAST,GAAkB,UAAU,QAAQ,GAE7CU,KAAQV,GAAkB,SAAS,OAAO,GAE1CW,KAAOX,GAAkB,QAAQ,MAAM,GAEvCY,KAAWZ,GAAkB,YAAY,UAAU,GAEnDa,KAAYb,GAAkB,aAAa,WAAW,GAEtDc,KAAYd,GAAkB,aAAa,WAAW,GAEtDe,KAAYf,GAAkB,aAAa,WAAW,GAEtDgB,KAAUhB,GAAkB,QAAQ,SAAS,GAE7CiB,KAAQjB,GAAkB,SAAS,OAAO,GAE1CkB,KAAQlB,GAAkB,SAAS,OAAO,GAE1CmB,KAAoB;AAAA,EAC/B/K;AAAA,EACAkK;AAAA,EACAC;AAAA,EACAC;AAAA,EACAK;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAT;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,GAGaQ,KAGT;AAAA,EACF,CAAChL,IAAWkK,EAAU;AAAA,EACtB;AAAA,IACEC;AAAA,IACAC;AAAA,IACAK;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAT;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,EAAA;AAEJ,GCrDMS,KAAgC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAASC,GAAoB1H,GAA4B;AAC9D,SAAOyH,GAAa,SAASzH,CAAE;AACjC;AAEO,SAAS2H,GACd3H,GACAlT,GACAkR,GACW;AACX,QAAM4J,IAAqB,CAAA;AAY3B,UAVI5J,KAAA,QAAAA,EAAS,iBACX4J,EAAM;AAAA,IACJ,gBAAAnU;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QACV,eAAY;AAAA,MAAA;AAAA,MAFP,GAAGuM,CAAE;AAAA,IAAA;AAAA,EAGZ,GAIIA,GAAA;AAAA,IACN,KAAK;AACH,MAAA4H,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM3G,EAAI,kBAAkB,CAAC+a,MAAM,CAACA,CAAC;AAAA,YAC9C,OAAO/a,EAAI,iBAAiB,oBAAoB;AAAA,YAEhD,4BAACkH,IAAA,CAAA,CAAS;AAAA,UAAA;AAAA,UANN;AAAA,QAAA;AAAA,MAON;AAEF;AAAA,IAEF,KAAK;AACH,MAAA4T,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS3G,EAAI;AAAA,YACb,UAAU,CAACA,EAAI,aAAaA,EAAI,WAAW;AAAA,YAC3C,OAAM;AAAA,YAEN,4BAAC4G,IAAA,CAAA,CAAgB;AAAA,UAAA;AAAA,UAPb;AAAA,QAAA;AAAA,QASN,gBAAAI,EAAC,OAAA,EAAmB,WAAU,iCAC5B,UAAA;AAAA,UAAA,gBAAAL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO3G,EAAI;AAAA,cACX,KAAK;AAAA,cACL,KAAKA,EAAI,YAAY;AAAA,cACrB,UAAU,CAACoP,MAAM;AACf,sBAAM4L,IAAO,OAAO,SAAS5L,EAAE,OAAO,OAAO,EAAE;AAC/C,gBAAK,OAAO,SAAS4L,CAAI,KACzBhb,EAAI;AAAA,kBACF,KAAK,IAAI,GAAG,KAAK,IAAIA,EAAI,YAAY,GAAGgb,CAAI,CAAC;AAAA,gBAAA;AAAA,cAEjD;AAAA,cACA,UAAUhb,EAAI,WAAW;AAAA,cACzB,cAAW;AAAA,YAAA;AAAA,UAAA;AAAA,4BAEZ,QAAA,EAAK,UAAA;AAAA,YAAA;AAAA,YAAGA,EAAI,YAAY;AAAA,UAAA,EAAA,CAAI;AAAA,QAAA,EAAA,GAhBtB,UAiBT;AAAA,QACA,gBAAA2G;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS3G,EAAI;AAAA,YACb,UAAU,CAACA,EAAI,aAAaA,EAAI,WAAW;AAAA,YAC3C,OAAM;AAAA,YAEN,4BAAC8G,IAAA,CAAA,CAAiB;AAAA,UAAA;AAAA,UAPd;AAAA,QAAA;AAAA,MAQN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAgU,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS3G,EAAI;AAAA,YACb,UAAUA,EAAI,WAAW;AAAA,YACzB,OAAM;AAAA,YAEN,4BAACmH,IAAA,CAAA,CAAU;AAAA,UAAA;AAAA,UAPP;AAAA,QAAA;AAAA,QASN,gBAAAH,EAAC,QAAA,EAAsB,WAAU,iCAC9B,UAAA;AAAA,UAAA,KAAK,MAAMhH,EAAI,QAAQ,GAAG;AAAA,UAAE;AAAA,QAAA,EAAA,GADrB,YAEV;AAAA,QACA,gBAAA2G;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS3G,EAAI;AAAA,YACb,UAAUA,EAAI,WAAW;AAAA,YACzB,OAAM;AAAA,YAEN,4BAACoH,IAAA,CAAA,CAAS;AAAA,UAAA;AAAA,UAPN;AAAA,QAAA;AAAA,QASN,gBAAAT;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,KAAK3G,EAAI,eAAA;AAAA,YACxB,UAAUA,EAAI,WAAW;AAAA,YACzB,OAAM;AAAA,YACP,UAAA;AAAA,UAAA;AAAA,UANK;AAAA,QAAA;AAAA,MAQN;AAEF;AAAA,IAEF,KAAK;AACH,MAAA8a,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS3G,EAAI;AAAA,YACb,UAAUA,EAAI,WAAW;AAAA,YACzB,OAAM;AAAA,YAEN,4BAACuH,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,UAPR;AAAA,QAAA;AAAA,MAQN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAuT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WACE3G,EAAI,eAAe,cACf,0DACA;AAAA,YAEN,SAAS,MAAMA,EAAI,iBAAiB,WAAW;AAAA,YAC/C,UAAUA,EAAI,WAAW;AAAA,YACzB,OAAM;AAAA,YAEN,4BAACwH,IAAA,CAAA,CAAc;AAAA,UAAA;AAAA,UAXX;AAAA,QAAA;AAAA,MAYN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAsT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WACE3G,EAAI,eAAe,cACf,0DACA;AAAA,YAEN,SAAS,MAAMA,EAAI,iBAAiB,WAAW;AAAA,YAC/C,UAAUA,EAAI,WAAW;AAAA,YACzB,OAAM;AAAA,YAEN,4BAACyH,IAAA,CAAA,CAAc;AAAA,UAAA;AAAA,UAXX;AAAA,QAAA;AAAA,MAYN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAqT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WACE3G,EAAI,eAAe,SACf,0DACA;AAAA,YAEN,SAAS,MAAM;AACb,kBACE,CAACA,EAAI,2BACLA,EAAI,oBACJA,EAAI,eAAe,QACnB;AACA,gBAAAA,EAAI,cAAc,MAAM;AACxB;AAAA,cACF;AACA,cAAAA,EAAI,oBAAoB,EAAI;AAAA,YAC9B;AAAA,YACA,UAAUA,EAAI,WAAW;AAAA,YACzB,OACEA,EAAI,0BACA,yCACAA,EAAI,mBACF,2DACA;AAAA,YAGR,4BAAC2H,IAAA,CAAA,CAAc;AAAA,UAAA;AAAA,UA3BX;AAAA,QAAA;AAAA,MA4BN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAmT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WACE3G,EAAI,eAAe,SACf,0DACA;AAAA,YAEN,SAAS,MAAMA,EAAI,iBAAiB,MAAM;AAAA,YAC1C,UAAUA,EAAI,WAAW;AAAA,YACzB,OACEA,EAAI,qBACA,kDACA;AAAA,YAGN,4BAAC6H,IAAA,CAAA,CAAS;AAAA,UAAA;AAAA,UAfN;AAAA,QAAA;AAAA,MAgBN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAiT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WACE3G,EAAI,eAAe,UACf,0DACA;AAAA,YAEN,SAAS,MAAMA,EAAI,iBAAiB,OAAO;AAAA,YAC3C,UAAUA,EAAI,WAAW;AAAA,YACzB,OAAM;AAAA,YAEN,4BAAC0H,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,UAXR;AAAA,QAAA;AAAA,MAYN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAoT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS3G,EAAI;AAAA,YACb,UACEA,EAAI,WAAW,WACdA,EAAI,sBAAsB,KACzBA,EAAI,qBAAqB,KACzBA,EAAI,gBAAgB;AAAA,YAExB,OAAM;AAAA,YACP,UAAA;AAAA,UAAA;AAAA,UAXK;AAAA,QAAA;AAAA,MAaN;AAEF;AAAA,IAEF,KAAK;AACH,MAAA8a,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,KAAK3G,EAAI,aAAA;AAAA,YACxB,OAAM;AAAA,YAEN,4BAACsH,IAAA,CAAA,CAAY;AAAA,UAAA;AAAA,UANT;AAAA,QAAA;AAAA,MAON;AAEF;AAAA,IAEF,KAAK;AACH,MAAAwT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,KAAK3G,EAAI,YAAA;AAAA,YACxB,UAAUA,EAAI,WAAW,WAAW,CAACA,EAAI,UAAUA,EAAI;AAAA,YACvD,OACEA,EAAI,aACA,qBACA;AAAA,YAGN,4BAACqH,IAAA,CAAA,CAAY;AAAA,UAAA;AAAA,UAXT;AAAA,QAAA;AAAA,MAYN;AAEF;AAAA,IAEF,KAAK;AACH,MAAAyT,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YACV,MAAM3G,EAAI,cAAcA,EAAI,eAAe;AAAA,YAC3C,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,OAAM;AAAA,YAEN,4BAACiH,IAAA,CAAA,CAAiB;AAAA,UAAA;AAAA,UAPd;AAAA,QAAA;AAAA,MAQN;AAEF;AAAA,IAEF,KAAK;AACH,MAAA6T,EAAM;AAAA,QACJ,gBAAAnU;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,KAAK3G,EAAI,eAAA;AAAA,YACxB,UACEA,EAAI,WAAW,WAAW,CAACA,EAAI,UAAUA,EAAI;AAAA,YAE/C,OACEA,EAAI,gBACA,wBACAA,EAAI,oBAAoB,KACtBA,EAAI,mBAAmB,KACvBA,EAAI,cAAc,IAClB,6BACA;AAAA,YAGR,4BAAC+G,IAAA,CAAA,CAAa;AAAA,UAAA;AAAA,UAjBV;AAAA,QAAA;AAAA,MAkBN;AAEF;AAAA,EAGA;AAGJ,SAAO+T,EAAM,SAAS,IAAIA,IAAQ;AACpC;AAEO,SAASG,GACdjb,GACAkb,GACW;AACX,QAAMJ,IAAqB,CAAA;AAuC3B,MApCE9a,EAAI,eAAe,UACnBA,EAAI,oBACJ,CAACA,EAAI,2BACLkb,EAAW,IAAI,WAAW,KAE1BJ,EAAM;AAAA,IACJ,gBAAAnU,EAAC,QAAA,EAAqB,WAAU,kCAAiC,2DAAvD,WAEV;AAAA,EAAA,GAKF3G,EAAI,eAAe,UACnBkb,EAAW,IAAI,MAAM,KAErBJ,EAAM;AAAA,IACJ,gBAAAnU,EAAC,UAAqB,WAAU,kCAC7B,YAAI,qBACD,4CACA,kEAHI,WAIV;AAAA,EAAA,GAKF3G,EAAI,eAAe,WACnBkb,EAAW,IAAI,OAAO,KAEtBJ,EAAM;AAAA,IACJ,gBAAAnU,EAAC,QAAA,EAAsB,WAAU,kCAAiC,6EAAxD,YAEV;AAAA,EAAA,GAKD3G,EAAI,eAAe,eAAekb,EAAW,IAAI,WAAW,KAC5Dlb,EAAI,eAAe,eAAekb,EAAW,IAAI,WAAW,GAC7D;AACA,UAAMC,IACJnb,EAAI,eAAe,cAAcA,EAAI,eAAeA,EAAI,cACpDob,IACJpb,EAAI,eAAe,cAAcA,EAAI,kBAAkBA,EAAI,iBACvDqb,IACJrb,EAAI,eAAe,cAAcpC,KAAoBC;AAEvD,IAAAid,EAAM;AAAA,MACJ,gBAAA9T;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAY,GAAGhH,EAAI,UAAU;AAAA,UAE5B,UAAA;AAAA,YAAAqb,EAAc,IAAI,CAACC,MAClB,gBAAA3U;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WACEzI,GAAaid,CAAe,MAAMjd,GAAaod,EAAO,GAAG,IACrD,gEACA;AAAA,gBAEN,OAAO,EAAE,YAAYA,EAAO,IAAA;AAAA,gBAC5B,OAAOA,EAAO;AAAA,gBACd,cAAYA,EAAO;AAAA,gBACnB,gBACEpd,GAAaid,CAAe,MAAMjd,GAAaod,EAAO,GAAG;AAAA,gBAE3D,SAAS,MAAMF,EAAmBld,GAAaod,EAAO,GAAG,CAAC;AAAA,cAAA;AAAA,cAbrDA,EAAO;AAAA,YAAA,CAef;AAAA,YACD,gBAAAtU;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN,UAAA;AAAA,kBAAA,gBAAAL;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,YAAYwU,EAAA;AAAA,oBAAgB;AAAA,kBAAA;AAAA,kBAEvC,gBAAAxU;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,OAAOzI,GAAaid,CAAe;AAAA,sBACnC,UAAU,CAAC/L,MACTgM,EAAmBld,GAAakR,EAAE,OAAO,KAAK,CAAC;AAAA,sBAEjD,cAAW;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACb;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,QAvCI;AAAA,MAAA;AAAA,IAwCN;AAAA,EAEJ;AAEA,SAAO0L,EAAM,SAAS,IAAIA,IAAQ;AACpC;ACrdA,SAASS,GACPC,GACAC,GAgB0D;AAC1D,MAAI,CAACD,EAAe,QAAO;AAE3B,MAAI,MAAM,QAAQA,CAAa,GAAG;AAChC,UAAME,IAAQ,CAACC,OACZA,KAAQ,IACN,OAAOhC,EAAa,EACpB,IAAIF,EAAgB;AAEzB,WAAO;AAAA,MACL,MAAMiC,EAAMF,EAAc,CAAC,CAAC;AAAA,MAC5B,OAAOE,EAAMF,EAAc,CAAC,CAAC;AAAA,IAAA;AAAA,EAEjC;AAEA,QAAMI,IAAuBH,EAAM,kBAC7BI,IAAe,CACnBC,GACAC,MAEAD,EACG,IAAIrC,EAAgB,EACpB,OAAO,CAACvG,MAAO6I,EAAQ7I,CAAE,MAAM,EAAK,GAEnC8I,IAAmD;AAAA,IACvD,WAAWJ;AAAA,IACX,YAAYH,EAAM;AAAA,IAClB,MAAMA,EAAM;AAAA,IACZ,QAAQA,EAAM;AAAA,IACd,QAAQA,EAAM;AAAA,IACd,OAAOA,EAAM;AAAA,IACb,MAAMA,EAAM;AAAA,IACZ,UAAUA,EAAM;AAAA,IAChB,WAAWA,EAAM;AAAA,IACjB,WAAWA,EAAM;AAAA,IACjB,WAAWA,EAAM;AAAA,IACjB,MAAMA,EAAM;AAAA,IACZ,OAAOA,EAAM;AAAA,IACb,OAAOA,EAAM;AAAA,EAAA;AAGf,SAAO;AAAA,IACL,MAAMI,EAAanB,GAAuB,CAAC,GAAGsB,CAAO;AAAA,IACrD,OAAOH,EAAanB,GAAuB,CAAC,GAAGsB,CAAO;AAAA,EAAA;AAE1D;AAEO,SAASC,GAAU;AAAA,EACxB,MAAA3L;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,cAAAK;AAAA,EACA,QAAAxL,IAAS;AAAA,EACT,OAAA6W,IAAQ;AAAA,EACR,cAAAC,IAAe;AAAA,EACf,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,WAAA7V;AAAA,EACA,WAAAyJ;AAAA,EACA,eAAAsL,IAAgB;AAAA,EAChB,kBAAAe;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,YAAAC,IAAa;AAAA,EACb,cAAAC,IAAe;AAAA,EACf,cAAAC,IAAe;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,YAAAC,IAAa;AAAA,EACb,gBAAAC,KAAiB;AAAA,EACjB,cAAAC,KAAe;AAAA,EACf,iBAAAC,IAAkB;AAAA,EAClB,iBAAAC,KAAkB;AAAA,EAClB,iBAAAC,IAAkB;AAAA,EAClB,YAAAC,KAAa;AAAA,EACb,aAAAC,IAAc;AAAA,EACd,aAAAC,KAAc;AAAA,EACd,iBAAiBC,KAAsB,CAAA;AAAA,EACvC,YAAAxT,IAAa,CAAA;AAAA,EACb,qBAAAyT;AAAA,EACA,yBAAAC;AAAA,EACA,yBAAAC,KAA0B;AAAA,EAC1B,sBAAAC;AAAA,EACA,kBAAkBC,KAA2B;AAAA,EAC7C,qBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,KAAc;AAAA,EACd,eAAAC,KAAgB;AAClB,GAAmB;;AACjB,QAAMC,KAAe3T,GAAuB,IAAI,GAC1C4T,KAAiB5T,GAAsB,IAAI,GAC3C6T,IAAc7T,GAAO,oBAAI,KAAoC,GAC7D8T,KAA0B9T,GAAO,EAAK,GAEtC+T,KAAeC,GAAQ,MACvB/N,KAAQ,OAAOA,KAAS,WAAiBA,IACtC,MACN,CAACA,CAAI,CAAC,GAEHgO,KAAcD,GAAQ,MACtBD,KAAqB,KAGlB/N,GADL,OAAOC,KAAS,WAAWA,IAAO,QACLC,GAASC,CAAO,GAC9C,CAAC4N,IAAc9N,GAAMC,GAASC,CAAO,CAAC,GAEnC,CAAC+N,IAAQC,EAAS,IAAI3T,EAAuB,MAAM,GACnD,CAAC9C,IAAQ0W,EAAS,IAAI5T,EAAwB,IAAI,GAClD,CAAC6T,IAAUC,EAAW,IAAI9T,EAAS,CAAC,GACpC,CAACpF,IAAYmZ,EAAa,IAAI/T,EAAS,CAAC,GACxC,CAAC7L,GAAO6f,CAAQ,IAAIhU,EAASsR,CAAY,GACzC,CAACnU,GAAU8W,EAAW,IAAIjU,EAAS,CAAC,GACpC,CAACkU,IAAYC,EAAa,IAAInU,EAAwB,IAAI,GAC1D,CAACoU,IAAgBC,EAAiB,IAAIrU,EAAS,EAAK,GACpD,CAACsU,IAAYC,CAAa,IAAIvU,EAAS,EAAK,GAC5C,CAACwU,GAAeC,CAAgB,IAAIzU,EAAS,EAAK,GAClD,CAAC1C,GAAYoX,CAAa,IAAI1U,EAAqB,MAAM,GACzD,CAAC5K,GAAauf,CAAc,IAAI3U,EAA6B,CAAA,CAAE,GAC/D,CAACnK,GAAY+e,CAAa,IAAI5U,EAAgC,CAAA,CAAE,GAChE,CAAC1E,GAAOuZ,CAAQ,IAAI7U,EAA2B,CAAA,CAAE,GACjD,CAAC8U,IAAkBC,CAAmB,IAAI/U,EAAS,EAAK,GACxD,CAACgV,IAAuBC,EAAwB,IAAIjV,EAExD,MAAS,GACL,CAACmK,IAAkB+K,EAAmB,IAAIlV,EAA+B,CAAA,CAAE,GAC3E,CAACtC,IAAkByX,EAAmB,IAAInV,EAItC,IAAI,GACR,CAAChC,IAAqBoX,EAAsB,IAAIpV;AAAA,IACpD;AAAA,EAAA,GAEI,CAAC7B,IAA0BkX,EAA2B,IAAIrV;AAAA,IAC9D;AAAA,EAAA,GAEI,CAACsV,IAAoBC,EAAqB,IAAIvV,EAAwB,IAAI,GAC1E,CAACjB,IAAgByW,EAAiB,IAAIxV,EAAwB,IAAI,GAClE,CAACyV,IAAqBC,EAAsB,IAAI1V,EAAwB,IAAI,GAC5E,CAACX,IAAesW,EAAgB,IAAI3V,EAAwB,IAAI,GAChE,CAAC4V,IAAcC,EAAe,IAAI7V,EAAS/M,EAAqB,GAChE,CAAC6iB,IAAcC,EAAe,IAAI/V,EAAS9M,EAAqB,GAChEkM,KAAqBH,EAAW,SAAS,GACzC,CAACV,IAAayX,EAAc,IAAIhW,EAAiC,CAAA,CAAE,GACnE,CAAC9B,GAAiB+X,EAAkB,IACxCjW,EAA2ByS,EAAmB,GAC1CyD,KAAqB1W,GAAOtB,CAAe;AACjD,EAAAgY,GAAmB,UAAUhY,GAE7BiC,GAAU,MAAM;AACd,IAAA+V,GAAmB,UAAUzD,IAC7BwD,GAAmBxD,EAAmB,GACtCuD,GAAe,CAAC7S,MAAS;AACvB,YAAMgN,IAAO,EAAE,GAAGhN,EAAA;AAClB,iBAAW/M,KAASqc,IAAqB;AACvC,cAAM3I,IAAY1T,EAAM,QAAQ;AAChC,SACG0T,MAAc,UAAUA,MAAc,WACvC1T,EAAM,SAAS,QACfA,EAAM,UAAU,OAEhB+Z,EAAK/Z,EAAM,EAAE,IAAIA,EAAM;AAAA,MAE3B;AACA,aAAO+Z;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAACsC,EAAmB,CAAC;AAExB,QAAMpU,KAA0BH,EAAgB,SAAS,GAEnDiY,KAAyBC;AAAA,IAC7B,CACEhgB,GACAigB,GACAC,MACG;;AACH,YAAMxM,IAAY1T,EAAM,QAAQ;AAChC,aAAI0T,MAAc,UAAUA,MAAc,SACjC,IAASzQ,IAAAid,EAAOlgB,EAAM,EAAE,KAAKA,EAAM,UAA1B,QAAAiD,EAAkC,UAGlDgd,EAAK,KAAK,CAACvgB,MAAQA,EAAI,YAAYM,EAAM,EAAE,KAC3C,EAAQA,EAAM;AAAA,IAElB;AAAA,IACA,CAAA;AAAA,EAAC,GAGGmgB,KAA0BH;AAAA,IAC9B,CAACI,GAAoBjjB,MAAkB;AACrC,YAAMkjB,IAAQ,IAAI,IAAID,CAAQ,GAExBrG,IADO+F,GAAmB,QACd;AAAA,QAAI,CAAC9f,MACrBqgB,EAAM,IAAIrgB,EAAM,EAAE,IAAI,EAAE,GAAGA,GAAO,OAAA7C,MAAU6C;AAAA,MAAA;AAE9C,MAAA8f,GAAmB,UAAU/F,GAC7B8F,GAAmB9F,CAAI,GACvBwC,MAAA,QAAAA,GAA0BxC,IAE1B6F,GAAe,CAACU,MAAe;AAC7B,cAAMC,IAAU,EAAE,GAAGD,EAAA;AACrB,mBAAWrO,MAAMmO,EAAU,CAAAG,EAAQtO,EAAE,IAAI9U;AACzC,eAAOojB;AAAA,MACT,CAAC;AAED,iBAAWtO,KAAMmO;AACf,QAAA3D,MAAA,QAAAA,GAAuBxK,GAAI9U;AAAA,IAE/B;AAAA,IACA,CAACsf,IAAsBF,EAAuB;AAAA,EAAA,GAG1CiE,KAA8BR;AAAA,IAClC,CACEI,GACAK,GACAC,MACG;AACH,YAAM3T,IAAO+S,GAAmB,SAC1Ba,IAAMP,KAAY,OAAO,OAAO,MAAM,QAAQA,CAAQ,IAAIA,IAAW,CAACA,CAAQ,GAC9EC,IAAQM,IAAM,IAAI,IAAIA,CAAG,IAAI,MAE7B5G,IAAyBsG,IAC3BtT,EAAK;AAAA,QAAI,CAAC/M,OACRqgB,EAAM,IAAIrgB,GAAM,EAAE,IACd,EAAE,GAAGA,IAAO,kBAAkBygB,EAAU,iBACxCzgB;AAAA,MAAA,IAEN;AAAA,QACE,GAAG+M;AAAA,QACH;AAAA,UACE,IAAI0T,EAAU;AAAA,UACd,YAAYA,EAAU;AAAA,UACtB,GAAGA,EAAU;AAAA,UACb,GAAGA,EAAU;AAAA,UACb,OAAOA,EAAU;AAAA,UACjB,QAAQA,EAAU;AAAA,UAClB,MAAM;AAAA,UACN,kBAAkBA,EAAU;AAAA,QAAA;AAAA,MAC9B;AAMN,UAJAX,GAAmB,UAAU/F,GAC7B8F,GAAmB9F,CAAI,GACvBwC,MAAA,QAAAA,GAA0BxC,IAEtB,CAAC4G,KAAOA,EAAI,WAAW,GAAG;AAC5B,QAAArE,MAAA,QAAAA,GAAsB,QAAWmE;AACjC;AAAA,MACF;AACA,iBAAWxO,MAAM0O;AACf,QAAArE,MAAA,QAAAA;AAAA,UACErK;AAAA,WACAyO,KAAA,gBAAAA,EAAqB,IAAIzO,QAAOwO;AAAA;AAAA,IAGtC;AAAA,IACA,CAACnE,IAAqBC,EAAuB;AAAA,EAAA;AAG/C,EAAAxS,GAAU,MAAM;AACd,IAAI2S,MACFiC,EAAoB,EAAI;AAAA,EAE5B,GAAG,CAACjC,EAAwB,CAAC;AAE7B,QAAMkE,KAAexD;AAAA,IACnB,MACE9C,GAAqBC,GAAe;AAAA,MAClC,kBAAAe;AAAA,MACA,kBAAAC;AAAA,MACA,YAAAC;AAAA,MACA,cAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,MACA,YAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,iBAAAE;AAAA,MACA,iBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,YAAAC;AAAA,MACA,aAAAC;AAAA,MACA,aAAAC;AAAA,IAAA,CACD;AAAA,IACH;AAAA,MACE7B;AAAA,MACAe;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAE;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,EACF,GAGIyE,KAAiBzD,GAAQ,MACxBwD,KACE,oBAAI,IAAI,CAAC,GAAGA,GAAa,MAAM,GAAGA,GAAa,KAAK,CAAC,IADlC,oBAAI,IAAA,GAE7B,CAACA,EAAY,CAAC;AAEjB,EAAA7W,GAAU,MAAM;AAEd,QAAI,CADiB8W,GAAe,IAAI,WAAW,GAChC;AACjB,MAAA5C,GAAkB,EAAK;AACvB;AAAA,IACF;AAEA,UAAM6C,IAAK,OAAO,WAAW,oBAAoB,GAC3CC,IAAQ,MAAM;AAElB,MAAA9C,GAAkB6C,EAAG,UAAU,KAAQ3F,CAAc;AAAA,IACvD;AACA,WAAA4F,EAAA,GACAD,EAAG,iBAAiB,UAAUC,CAAK,GAC5B,MAAMD,EAAG,oBAAoB,UAAUC,CAAK;AAAA,EACrD,GAAG,CAACF,IAAgB1F,CAAc,CAAC;AAEnC,QAAM6F,KACJ,CAAC/Y,MAA2B4Y,GAAe,IAAI,WAAW,GACtDI,KACJ,CAAChZ,MAA2B4Y,GAAe,IAAI,WAAW,GACtDK,KACJL,GAAe,IAAI,WAAW,KAAK5Y,IAC/BkZ,KAAWN,GAAe,IAAI,MAAM,KAAK7X,IACzCoY,KAAY,CAACnZ,MAA2B4Y,GAAe,IAAI,OAAO,GAElEQ,KAAmBrB,EAAY,MAAM;AACzC,IAAIhD,GAAe,YACjB,IAAI,gBAAgBA,GAAe,OAAO,GAC1CA,GAAe,UAAU;AAAA,EAE7B,GAAG,CAAA,CAAE,GAECsE,KAAetB,EAAY,YAAY;AAC3C,QAAI,GAAC7C,MAAgB,CAACE,KAEtB;AAAA,MAAAlO,GAAgBF,CAAS,GACzBsO,GAAU,SAAS,GACnBC,GAAU,IAAI,GACdE,GAAY,CAAC,GACbC,GAAc,CAAC,GACfY,EAAe,CAAA,CAAE,GACjBC,EAAc,CAAA,CAAE,GAChBC,EAAS,CAAA,CAAE,GACXM,GAAoB,IAAI,GACxBC,GAAuB,IAAI,GAC3BC,GAA4B,IAAI,GAChCE,GAAsB,IAAI,GAC1BC,GAAkB,IAAI,GACtBE,GAAuB,IAAI,GAC3BC,GAAiB,IAAI,GACrBjB,EAAc,MAAM;AAEpB,UAAI;AACF,cAAMiD,IAASpE,KACX,MAAMrN,GAAoBqN,IAAcvN,CAAY,IACpD,MAAME,GAAoBuN,IAAazN,CAAY,GAEjD+C,IAAO,IAAI,KAAK,CAAC4O,CAAM,GAAG,EAAE,MAAM,mBAAmB,GACrDC,IAAU,IAAI,gBAAgB7O,CAAI;AACxC,QAAA0O,GAAA,GACArE,GAAe,UAAUwE,GACzBzD,GAAcyD,CAAO;AAQzB,cAAMxe,IAAM,MANQkM,GAAS,YAAY;AAAA,UACvC,MAAMqS;AAAA,UACN,SAAS,gCAAgCrS,GAAS,OAAO;AAAA,UACzD,YAAY;AAAA,UACZ,qBAAqB,gCAAgCA,GAAS,OAAO;AAAA,QAAA,CACtE,EAC6B;AAC1B,QAAAsO,GAAUxa,CAAG,GACb0a,GAAY1a,EAAI,QAAQ,GACxBua,GAAU,OAAO;AAAA,MACnB,QAAQ;AACN,QAAAA,GAAU,OAAO;AAAA,MACnB;AAAA;AAAA,EACF,GAAG;AAAA,IACDJ;AAAA,IACAE;AAAA,IACAzN;AAAA,IACAyR;AAAA,IACApS;AAAA,EAAA,CACD;AAED,EAAAlF,GAAU,MAAM;AACd,QAAI,CAACoT,MAAgB,CAACE,IAAa;AACjC,MAAAE,GAAU,MAAM,GAChBC,GAAU,IAAI,GACdE,GAAY,CAAC,GACbK,GAAc,IAAI,GAClBsD,GAAA;AACA;AAAA,IACF;AAEA,WAAKC,GAAA,GAEE,MAAM;AACX,MAAAD,GAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAClE,IAAcE,IAAaiE,IAAcD,EAAgB,CAAC,GAE9DtX,GAAU,MAAM;AACd,KAAI7C,MAAe,eAAe,CAAC8Z,MAExB9Z,MAAe,eAAe,CAAC+Z,MAE/B/Z,MAAe,UAAU,CAACga,MAE1Bha,MAAe,UAAU,CAACia,MAE1Bja,MAAe,WAAW,CAACka,OACpC9C,EAAc,MAAM;AAAA,EAExB,GAAG,CAAC0C,IAAeC,IAAeC,IAAeC,IAAUC,IAAWla,CAAU,CAAC;AAEjF,QAAMua,KAAezB;AAAA,IACnB,CAAC9T,MAAuB;AACtB,YAAMwV,IAAU,KAAK,IAAI,GAAG,KAAK,IAAIjE,MAAY,GAAGvR,CAAU,CAAC,GACzDgB,IAAK+P,EAAY,QAAQ,IAAIyE,CAAO;AAC1C,UAAI,CAACxU,GAAI;AACP,QAAAyQ,GAAc+D,CAAO;AACrB;AAAA,MACF;AAEA,MAAAxE,GAAwB,UAAU,IAClChQ,EAAG,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,GACxDyQ,GAAc+D,CAAO,GACrB,OAAO,WAAW,MAAM;AACtB,QAAAxE,GAAwB,UAAU;AAAA,MACpC,GAAG,GAAG;AAAA,IACR;AAAA,IACA,CAACO,EAAQ;AAAA,EAAA,GAGLkE,KAAyB3B;AAAA,IAC7B,CAAChgB,MAA0B;AACzB,YAAMiM,IAASgR,EAAY,QAAQ,IAAIjd,EAAM,UAAU;AACvD,MAAIiM,MACFiR,GAAwB,UAAU,IAClCS,GAAc3d,EAAM,UAAU;AAGhC,YAAM4hB,IAAa,MAAM;;AACvB,cAAMC,KAAU5e,IAAA8Z,GAAa,YAAb,gBAAA9Z,EAAsB;AAAA,UACpC,6BAA6B,IAAI,OAAOjD,EAAM,EAAE,CAAC;AAAA;AAGnD,QAAI6hB,IACFA,EAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU,IACrD5V,KACTA,EAAO,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,GAG9D,OAAO,WAAW,MAAM;AACtB,UAAAiR,GAAwB,UAAU;AAAA,QACpC,GAAG,GAAG;AAAA,MACR;AAEA,aAAO,sBAAsB,MAAM;AACjC,eAAO,WAAW0E,GAAY,EAAE;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,EAAA7X,GAAU,MAAM;AACd,QAAIuT,OAAW,WAAW,CAACP,GAAa,WAAW,CAACU,GAAU;AAE9D,UAAMhR,IAAYsQ,GAAa,SACzB+E,IAAW,IAAI;AAAA,MACnB,CAACC,MAAY;AACX,YAAI7E,GAAwB,QAAS;AAErC,YAAIpZ,IAA+C;AACnD,mBAAWqK,KAAK4T,GAAS;AACvB,cAAI,CAAC5T,EAAE,eAAgB;AACvB,gBAAMhE,IAAO,OAAO;AAAA,YACjBgE,EAAE,OAAuB,QAAQ,cAAc;AAAA,YAChD;AAAA,UAAA;AAEF,UAAKhE,MACD,CAACrG,KAAQqK,EAAE,oBAAoBrK,EAAK,WACtCA,IAAO,EAAE,MAAAqG,GAAM,OAAOgE,EAAE,kBAAA;AAAA,QAE5B;AACA,QAAIrK,KAAM6Z,GAAc7Z,EAAK,IAAI;AAAA,MACnC;AAAA,MACA;AAAA,QACE,MAAM2I;AAAA,QACN,WAAW,CAAC,MAAM,KAAK,IAAI;AAAA,MAAA;AAAA,IAC7B;AAGF,aAAS2E,IAAI,GAAGA,KAAKqM,IAAUrM,KAAK,GAAG;AACrC,YAAMlE,IAAK+P,EAAY,QAAQ,IAAI7L,CAAC;AACpC,MAAIlE,KAAI4U,EAAS,QAAQ5U,CAAE;AAAA,IAC7B;AAEA,WAAO,MAAM4U,EAAS,WAAA;AAAA,EACxB,GAAG,CAACxE,IAAQG,EAAQ,CAAC;AAErB,QAAMuE,KAAYxd,KAAa,GACzByd,KAAYxE,KAAWjZ,KAAaiZ,KAAW,IAE/CyE,KAAalC,EAAY,MAAM;AACnC,IAAKgC,MACLP,GAAajd,KAAa,CAAC;AAAA,EAC7B,GAAG,CAACwd,IAAWxd,IAAYid,EAAY,CAAC,GAElCU,KAAanC,EAAY,MAAM;AACnC,IAAKiC,MACLR,GAAajd,KAAa,CAAC;AAAA,EAC7B,GAAG,CAACyd,IAAWzd,IAAYid,EAAY,CAAC,GAElCW,KAAepC,EAAY,MAAM;AACrC,IAAAnC,GAAY,CAACzgB,OAAOA,IAAI,MAAM,GAAG;AAAA,EACnC,GAAG,CAAA,CAAE,GAECilB,KAAgBrC,EAAY,MAAM;AACtC,IAAApC,EAAS,CAACpS,MAAM,KAAK,IAAI,MAAM,KAAK,OAAOA,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC;AAAA,EACnE,GAAG,CAAA,CAAE,GAEC8W,KAAetC,EAAY,MAAM;AACrC,IAAApC,EAAS,CAACpS,MAAM,KAAK,IAAI,GAAG,KAAK,OAAOA,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC;AAAA,EAChE,GAAG,CAAA,CAAE,GAEC+W,KAAiBvC,EAAY,YAAY;AAC7C,QAAI,GAAClZ,MAAU,CAACiW,GAAa;AAC7B,UAAI;AAEF,cAAMnO,KADO,MAAM9H,GAAO,QAAQtC,EAAU,GACnB,YAAY,EAAE,OAAO,GAAG,UAAAuC,GAAU,GAGrDyb,IADW,OAAO,WAAW,oBAAoB,EAAE,UAC1B,KAAK,IAK9BC,IAJiB,KAAK;AAAA,UAC1B;AAAA,UACA1F,GAAa,QAAQ,cAAcyF;AAAA,QAAA,IAEF5T,EAAY;AAC/C,QAAAgP,EAAS,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,KAAK,MAAM6E,IAAY,GAAG,IAAI,GAAG,CAAC,CAAC;AAAA,MACzE,QAAQ;AAAA,MAER;AAAA,EACF,GAAG,CAAC3b,IAAQtC,IAAYuC,CAAQ,CAAC;AAGjC,EAAAgD,GAAU,MAAM;AAEd,QADIuT,OAAW,WAAW,CAACxW,MACvB,CAAC,OAAO,WAAW,oBAAoB,EAAE,QAAS;AAEtD,QAAIkD,IAAY;AAChB,UAAM0Y,IAAM,MAAM;AAChB,MAAK1Y,KAAgBuY,GAAA;AAAA,IACvB;AACA,IAAAG,EAAA;AAEA,UAAMjW,IAAYsQ,GAAa,SACzB+E,IACJ,OAAO,iBAAmB,OAAerV,IACrC,IAAI,eAAe,MAAMiW,EAAA,CAAK,IAC9B;AACN,IAAAZ,KAAA,QAAAA,EAAU,QAAQrV;AAElB,UAAMqU,IAAK,OAAO,WAAW,oBAAoB,GAC3C6B,IAAO,MAAM;AACjB,MAAI7B,EAAG,WAAS4B,EAAA;AAAA,IAClB;AACA,WAAA5B,EAAG,iBAAiB,UAAU6B,CAAI,GAE3B,MAAM;AACX,MAAA3Y,IAAY,IACZ8X,KAAA,QAAAA,EAAU,cACVhB,EAAG,oBAAoB,UAAU6B,CAAI;AAAA,IACvC;AAAA,EACF,GAAG,CAACrF,IAAQxW,IAAQkX,IAAgBjX,GAAUwb,EAAc,CAAC;AAE7D,QAAMK,KAAkBxF,GAAQ,MACvBtV,EAAgB,QAAQ,CAAC9H,MAAU;AACxC,UAAM0T,IAAY1T,EAAM,QAAQ;AAChC,QAAI0T,MAAc,UAAUA,MAAc,eAAe,CAAA;AACzD,UAAMvW,KAASgL,GAAYnI,EAAM,EAAE,KAAKA,EAAM,SAAS,IAAI,KAAA;AAC3D,QAAI,CAAC7C,EAAO,QAAO,CAAA;AACnB,UAAM4E,IAAW,KAAK;AAAA,MACpB;AAAA,MACA,KAAK,IAAIN,IAAwBzB,EAAM,SAAS,IAAI;AAAA,IAAA;AAEtD,WAAO;AAAA,MACL;AAAA,QACE,IAAI,MAAMA,EAAM,EAAE;AAAA,QAClB,YAAYA,EAAM;AAAA,QAClB,SAASA,EAAM;AAAA,QACf,GAAGA,EAAM,IAAI;AAAA,QACb,GAAGA,EAAM,IAAI,KAAK,IAAI,IAAIA,EAAM,SAAS+B,KAAY,CAAC;AAAA,QACtD,OAAO,KAAK,IAAI,IAAI/B,EAAM,QAAQ,CAAC;AAAA,QACnC,QAAQ,KAAK,IAAI+B,IAAW,KAAK/B,EAAM,SAAS,CAAC;AAAA,QACjD,OAAA7C;AAAA,QACA,UAAA4E;AAAA,QACA,OAAOL;AAAA,MAAA;AAAA,IACT;AAAA,EAEJ,CAAC,GACA,CAACoG,GAAiBK,EAAW,CAAC,GAE3B0a,KAAiBzF;AAAA,IACrB,MAAM,CAAC,GAAGlY,GAAO,GAAG0d,EAAe;AAAA,IACnC,CAAC1d,GAAO0d,EAAe;AAAA,EAAA,GAGnBE,KAAc9C,EAAY,YAAY;;AAC1C,QAAI,GAAClZ,MAAUwW,OAAW,UAE1B;AAAA,MAAAa,EAAc,EAAI;AAClB,UAAI;AAEF,cAAMxN,IAAQ,MAAMD,GAAyB5J,IAAQ;AAAA,UACnD,OAAO;AAAA,UACP,UAAAC;AAAA,UACA,aAAA/H;AAAA,UACA,YAAAS;AAAA,UACA,OAAOojB;AAAA,UACP,UAAU;AAAA,QAAA,CACX,GAEKE,IAAS,SAAS,cAAc,QAAQ;AAC9C,QAAAA,EAAO,MAAM,WAAW,SACxBA,EAAO,MAAM,QAAQ,KACrBA,EAAO,MAAM,SAAS,KACtBA,EAAO,MAAM,QAAQ,KACrBA,EAAO,MAAM,SAAS,KACtBA,EAAO,MAAM,SAAS,KACtBA,EAAO,aAAa,eAAe,MAAM,GACzC,SAAS,KAAK,YAAYA,CAAM;AAEhC,cAAM/f,KAAMC,IAAA8f,EAAO,kBAAP,gBAAA9f,EAAsB;AAClC,YAAI,CAACD,EAAK,OAAM,IAAI,MAAM,4BAA4B;AAEtD,QAAAA,EAAI,KAAA,GACJA,EAAI,MAAM;AAAA;AAAA;AAAA;AAAA,aAIHiY,EAAM,QAAQ,MAAM,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUhC,GACFjY,EAAI,MAAA;AAEJ,cAAMggB,IAAOhgB,EAAI;AACjB,mBAAWmH,KAAQwG,GAAO;AACxB,gBAAMhR,IAAMqD,EAAI,cAAc,KAAK;AACnC,UAAArD,EAAI,MAAMwK,EAAK;AACf,gBAAM8Y,KAAUjgB,EAAI,cAAc,KAAK;AACvC,UAAAigB,GAAQ,YAAY,QACpBA,GAAQ,YAAYtjB,CAAG,GACvBqjB,EAAK,YAAYC,EAAO;AAAA,QAC1B;AAGA,cAAM,QAAQ;AAAA,UACZ,MAAM,KAAKD,EAAK,iBAAiB,KAAK,CAAC,EAAE;AAAA,YACvC,CAACrjB,MAAA;;AACC,uBAAAsD,IAAAtD,EAAI,WAAJ,gBAAAsD,EAAA,KAAAtD,GAAe,MAAM;qBAAoB,QAAQ,QAAA;AAAA;AAAA,UAAQ;AAAA,QAC7D,GAGF,WAAW,MAAM;;AACf,cAAI;AACF,aAAAsD,IAAA8f,EAAO,kBAAP,QAAA9f,EAAsB,UACtB8S,IAAAgN,EAAO,kBAAP,QAAAhN,EAAsB;AAAA,UACxB,UAAA;AACE,uBAAW,MAAM;AACf,kBAAI;AACF,yBAAS,KAAK,YAAYgN,CAAM;AAAA,cAClC,QAAQ;AAAA,cAER;AAAA,YACF,GAAG,GAAI;AAAA,UACT;AAAA,QACF,GAAG,EAAE;AAAA,MACP,QAAQ;AACN,YAAI;AACF,UAAIjF,KACF,OAAO,KAAKA,IAAY,UAAU,qBAAqB,IAC9CT,MACT,OAAO,KAAKA,IAAa,UAAU,qBAAqB;AAAA,QAE5D,QAAQ;AAAA,QAER;AAAA,MACF,UAAA;AACE,QAAAc,EAAc,EAAK;AAAA,MACrB;AAAA;AAAA,EACF,GAAG,CAACrX,IAAQwW,IAAQvW,GAAUkU,GAAO6C,IAAYT,IAAare,GAAaS,GAAYojB,EAAc,CAAC,GAEhGK,KAAiBlD,EAAY,YAAY;AAC7C,QAAI,CAAClZ,MAAUwW,OAAW,QAAS;AAEnC,UAAM1K,IAAW,GAAGqI,EAAM,QAAQ,aAAa,GAAG,KAAK,UAAU;AAOjE,QAAI,EALFjc,EAAY,SAAS,KACrBS,EAAW,SAAS,KACpBojB,GAAe,SAAS,MAGR/E,IAAY;AAC5B,MAAApL;AAAA,QACE,MAAM,MAAMoL,EAAU,EAAE,KAAK,CAAC1gB,MAAMA,EAAE,MAAM;AAAA,QAC5CwV;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,IAAAyL,EAAiB,EAAI;AACrB,QAAI;AACF,YAAM1N,IAAQ,MAAMD,GAAyB5J,IAAQ;AAAA,QACnD,OAAO;AAAA,QACP,UAAAC;AAAA,QACA,aAAA/H;AAAA,QACA,YAAAS;AAAA,QACA,OAAOojB;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,MAAA,CACV,GACKM,IAAW5R,GAAsBZ,CAAK,GACtCZ,IAAO,IAAI,WAAWoT,EAAS,UAAU;AAC/C,MAAApT,EAAK,IAAIoT,CAAQ,GACjBzQ;AAAA,QACE,IAAI,KAAK,CAAC3C,CAAI,GAAG,EAAE,MAAM,mBAAmB;AAAA,QAC5C6C;AAAA,MAAA;AAAA,IAEJ,QAAQ;AACN,MAAIkL,MACFpL;AAAA,QACE,MAAM,MAAMoL,EAAU,EAAE,KAAK,CAAC1gB,MAAMA,EAAE,MAAM;AAAA,QAC5CwV;AAAA,MAAA;AAAA,IAGN,UAAA;AACE,MAAAyL,EAAiB,EAAK;AAAA,IACxB;AAAA,EACF,GAAG,CAACvX,IAAQwW,IAAQvW,GAAUkU,GAAO6C,IAAY9e,GAAaS,GAAYojB,EAAc,CAAC,GAEnFO,KAAmBpD,EAAY,CAACvH,MAAqB;AACzD,IAAA6F,EAAc,CAACnR,MAAaA,MAAYsL,IAAO,SAASA,CAAK;AAAA,EAC/D,GAAG,CAAA,CAAE,GASC4K,KACJnc,MAAe,eAAeA,MAAe,cACzCnK,GARJmK,MAAe,cACXsY,KACAtY,MAAe,cACbwY,KACA,MAIiCxY,CAAU,IAC7C,QAEAoc,KACJ1b,MAAuB,OACnBnI,EAAW,KAAK,CAACC,MAAQA,EAAI,OAAOkI,EAAmB,KAAK,OAC5D,MAEA2b,KAAsBvD,EAAY,CAACwD,MAAiC;AACxE,IAAAjF,EAAe,CAACxR,MAAS,CAAC,GAAGA,GAAMyW,CAAU,CAAC;AAAA,EAChD,GAAG,CAAA,CAAE,GAECC,KAAyBzD,EAAY,CAAC/N,MAAe;AACzD,IAAAsM,EAAe,CAACxR,MAASA,EAAK,OAAO,CAACrO,MAAMA,EAAE,OAAOuT,CAAE,CAAC;AAAA,EAC1D,GAAG,CAAA,CAAE,GAECyR,KAAyB1D,EAAY,MAAM;AAC/C,IAAAzB,EAAe,CAAA,CAAE,GACjBC,EAAc,CAAA,CAAE,GAChBC,EAAS,CAAA,CAAE,GACXO,GAAuB,IAAI,GAC3BI,GAAkB,IAAI,GACtBE,GAAuB,IAAI,GAC3BC,GAAiB,IAAI;AAAA,EACvB,GAAG,CAAA,CAAE,GAECoE,KAA6B3D;AAAA,IACjC,CAAC4D,GAAqBC,MAA2B;AAC/C,YAAMC,IAAehc,EAAgB;AAAA,QACnC,CAAC9H,MAAUA,EAAM,OAAO4jB;AAAA,MAAA,GAEpBG,IACJjc,EACG,MAAMgc,IAAe,CAAC,EACtB,KAAK,CAAC9jB,MAAU,CAAC6jB,EAAU,IAAI7jB,EAAM,EAAE,CAAC,KAC3C8H,EACG,MAAM,GAAG,KAAK,IAAI,GAAGgc,CAAY,CAAC,EAClC,KAAK,CAAC9jB,MAAU,CAAC6jB,EAAU,IAAI7jB,EAAM,EAAE,CAAC;AAE7C,UAAI,CAAC+jB,GAAW;AACd,QAAApF,EAAoB,EAAK,GACzBQ,GAAsB,IAAI;AAC1B;AAAA,MACF;AAEA,MAAAF,GAA4B8E,EAAU,EAAE,GACxC/E,GAAuB,IAAI,GAC3BG,GAAsB,IAAI,GAC1BN,GAAyBkF,EAAU,QAAQ,MAAM,GACjDpC,GAAuBoC,CAAS,GAChC,OAAO,WAAW,MAAM;AACtB,QAAApF,EAAoB,EAAI;AAAA,MAC1B,GAAG,GAAG;AAAA,IACR;AAAA,IACA,CAACgD,IAAwB7Z,CAAe;AAAA,EAAA,GAGpCkc,KAAyBhE;AAAA,IAC7B,CAACtM,MAAyD;AACxD,MAAAmL,GAAyBnL,CAAS,GAClCiL,EAAoB,EAAI;AAAA,IAC1B;AAAA,IACA,CAAA;AAAA,EAAC,GAGGsF,KAAyBjE,EAAY,CAAClS,GAAiB3Q,MAAkB;AAC7E,IAAAyiB,GAAe,CAAC7S,OAAU,EAAE,GAAGA,GAAM,CAACe,CAAO,GAAG3Q,EAAA,EAAQ;AAAA,EAC1D,GAAG,CAAA,CAAE,GAEC+mB,KAAyBlE;AAAA,IAC7B,CAAClS,MAAoB;AACnB,YAAMqW,IAAMhc,GAAY2F,CAAO;AAC/B,MAAIqW,MAAK1H,MAAA,QAAAA,GAAuB3O,GAASqW;AAEzC,YAAML,IAAehc,EAAgB,UAAU,CAAC2F,MAAMA,EAAE,OAAOK,CAAO,GAChE+V,IAAY,IAAI;AAAA,QACpB,OAAO,KAAK1b,EAAW,EAAE,OAAO,CAACic;;AAAM,kBAAAnhB,IAAAkF,GAAYic,CAAC,MAAb,gBAAAnhB,EAAgB;AAAA,SAAM;AAAA,MAAA;AAE/D,MAAA4gB,EAAU,IAAI/V,CAAO;AACrB,YAAMiW,IACJjc,EAAgB,MAAMgc,IAAe,CAAC,EAAE;AAAA,QACtC,CAACrW,MAAM,CAACoW,EAAU,IAAIpW,EAAE,EAAE,KAAK,CAAChO,EAAW,KAAK,CAACC,MAAQA,EAAI,YAAY+N,EAAE,EAAE;AAAA,MAAA,KAE/E3F,EAAgB,MAAM,GAAG,KAAK,IAAI,GAAGgc,CAAY,CAAC,EAAE;AAAA,QAClD,CAACrW,MAAM,CAACoW,EAAU,IAAIpW,EAAE,EAAE,KAAK,CAAChO,EAAW,KAAK,CAACC,MAAQA,EAAI,YAAY+N,EAAE,EAAE;AAAA,MAAA;AAEjF,MAAIsW,MACF9E,GAA4B8E,EAAU,EAAE,GACxCpC,GAAuBoC,CAAS;AAAA,IAEpC;AAAA,IACA,CAACjc,GAAiBK,IAAa1I,GAAYkiB,IAAwBlF,EAAoB;AAAA,EAAA,GAGnF4H,KAAsBrE;AAAA,IAC1B,CAACsE,GAAsBhkB,GAAqBC,MAAyB;;AACnE,YAAMgF,IAAOlF,GAAqBC,GAAaC,CAAY;AAE3D,UAAI2e,IAAoB;AACtB,QAAAV;AAAA,UAAc,CAACzR,MACbA,EAAK;AAAA,YAAI,CAACrN,OACRA,GAAI,OAAOwf,KACP;AAAA,cACE,GAAGxf;AAAA,cACH,cAAA4kB;AAAA,cACA,OAAO5kB,GAAI,UAAUA,GAAI,QAAQ6F,EAAK;AAAA,cACtC,QAAQ7F,GAAI,UAAUA,GAAI,SAAS6F,EAAK;AAAA,YAAA,IAE1C7F;AAAA,UAAA;AAAA,QACN,GAEFqf,GAAoB,IAAI,GACxBT,EAAc,MAAM,GACpBK,EAAoB,EAAK,GACzBQ,GAAsB,IAAI;AAC1B;AAAA,MACF;AAEA,UAAIlX,IAAyB;AAC3B,cAAMsc,IACJzc,EAAgB;AAAA,UACd,CAAC9H,MACCA,EAAM,OAAO+H,OACZ/H,EAAM,QAAQ,YAAY,UAC3B,CAACP,EAAW,KAAK,CAACC,OAAQA,GAAI,YAAYM,EAAM,EAAE;AAAA,QAAA,KAEtD8H,EAAgB;AAAA,UACd,CAAC9H,OACEA,EAAM,QAAQ,YAAY,UAC3B,CAACP,EAAW,KAAK,CAACC,OAAQA,GAAI,YAAYM,EAAM,EAAE;AAAA,QAAA;AAGxD,YAAI,CAACukB,GAAa;AAChB,UAAA5F,EAAoB,EAAK;AACzB;AAAA,QACF;AAEA,cAAM6F,KACJhI,MAA2B+H,EAAY,gBACnCzc,EAAgB;AAAA,UACd,CAAC9H,OACEA,EAAM,QAAQ,YAAY,UAC3BA,EAAM,kBAAkBukB,EAAY,iBACpC,CAAC9kB,EAAW,KAAK,CAACC,OAAQA,GAAI,YAAYM,EAAM,EAAE;AAAA,QAAA,IAEtD,CAACukB,CAAW,GAEZE,KAAuCD,GAAa,IAAI,CAACxkB,OAAW;AAAA,UACxE,IAAIT,GAAA;AAAA,UACJ,SAASS,EAAM;AAAA,UACf,YAAYA,EAAM;AAAA,UAClB,GAAGA,EAAM;AAAA,UACT,GAAGA,EAAM;AAAA,UACT,OAAOA,EAAM;AAAA,UACb,QAAQA,EAAM;AAAA,UACd,cAAAskB;AAAA,QAAA,EACA,GAEII,KAAY,IAAI,IAAIF,GAAa,IAAI,CAACxkB,MAAUA,EAAM,EAAE,CAAC;AAC/D,QAAAwe,EAAc,CAACzR,MAAS;AAAA,UACtB,GAAGA,EAAK,OAAO,CAACrN,OAAQ,CAACA,GAAI,WAAW,CAACglB,GAAU,IAAIhlB,GAAI,OAAO,CAAC;AAAA,UACnE,GAAG+kB;AAAA,QAAA,CACJ;AAED,cAAME,KAAY,IAAI;AAAA,UACpBF,GAAc,IAAI,CAAC/kB,MAAQ,CAACA,EAAI,SAAmBA,CAAG,CAAC;AAAA,QAAA;AAEzD,QAAA8gB;AAAA,UACEgE,GAAa,IAAI,CAACxkB,MAAUA,EAAM,EAAE;AAAA,UACpCykB,GAAc,CAAC;AAAA,UACfE;AAAA,QAAA,GAGF5F,GAAoB,IAAI,GACxBT,EAAc,MAAM,GACpBU,KAAuB/b,KAAAwhB,GAAc,CAAC,MAAf,gBAAAxhB,GAAkB,OAAM,IAAI;AAEnD,cAAM4gB,KAAY,IAAI;AAAA,UACpB/b,EACG;AAAA,YAAO,CAAC9H,MACP+f;AAAA,cACE/f;AAAA,cACA,CAAC,GAAGP,GAAY,GAAGglB,EAAa;AAAA,cAChCtc;AAAA,YAAA;AAAA,UACF,EAED,IAAI,CAACnI,MAAUA,EAAM,EAAE;AAAA,QAAA;AAE5B,mBAAWiS,KAAMyS,GAAW,CAAAb,GAAU,IAAI5R,CAAE;AAE5C,QAAA0R,GAA2BY,EAAY,IAAIV,EAAS;AACpD;AAAA,MACF;AAEA,YAAMe,IAAgB3H,EAAY,QAAQ,IAAIzY,EAAU,GAClD1D,IAAU8jB,KAAA,gBAAAA,EAAe;AAAA,QAC7B;AAAA;AAGF,UAAI1lB,IAAI,IACJC,KAAI;AACR,UAAI2B,GAAS;AACX,cAAM2K,IAAWzK,GAAoBF,GAAS/C,CAAK,GAC7C8mB,KAAkB/jB,EAAQ,QAAQ,0BAA0B;AAElE,YAAI+jB,IAAiB;AACnB,gBAAMC,KAAU1jB;AAAA,YACdyjB,GAAgB,sBAAA;AAAA,YAChB/jB;AAAA,YACA/C;AAAA,UAAA,GAEIgnB,KAAa,KAAK,IAAI,GAAGD,GAAQ,GAAG,GACpCE,KAAgB,KAAK,IAAIvZ,EAAS,QAAQqZ,GAAQ,MAAM,GACxDG,KAAc,KAAK,IAAI,GAAGH,GAAQ,IAAI,GACtCI,IAAe,KAAK,IAAIzZ,EAAS,OAAOqZ,GAAQ,KAAK;AAC3D,UAAA5lB,IAAI,KAAK,IAAI,IAAI+lB,KAAcC,KAAgB,IAAI3f,EAAK,QAAQ,CAAC,GACjEpG,KAAI,KAAK,IAAI,IAAI4lB,KAAaC,MAAiB,IAAIzf,EAAK,SAAS,CAAC,GAClErG,IAAI,KAAK,IAAIA,GAAG,KAAK,IAAI,GAAGuM,EAAS,QAAQlG,EAAK,KAAK,CAAC,GACxDpG,KAAI,KAAK,IAAIA,IAAG,KAAK,IAAI,GAAGsM,EAAS,SAASlG,EAAK,MAAM,CAAC;AAAA,QAC5D;AACE,UAAArG,IAAI,KAAK,IAAI,IAAIuM,EAAS,QAAQlG,EAAK,SAAS,CAAC,GACjDpG,KAAI,KAAK,IAAI,IAAIsM,EAAS,SAASlG,EAAK,UAAU,CAAC;AAAA,MAEvD;AAEA,YAAMkb,KAAiC;AAAA,QACrC,IAAIlhB,GAAA;AAAA,QACJ,YAAAiF;AAAA,QACA,GAAAtF;AAAA,QACA,GAAAC;AAAA,QACA,OAAOoG,EAAK;AAAA,QACZ,QAAQA,EAAK;AAAA,QACb,cAAA+e;AAAA,MAAA;AAGF,MAAA9F,EAAc,CAACzR,MAAS,CAAC,GAAGA,GAAM0T,EAAS,CAAC,GAC5CD,GAA4B,QAAWC,EAAS,GAChDzB,GAAuByB,GAAU,EAAE,GACnC1B,GAAoB,IAAI,GACxBT,EAAc,MAAM,GACpBK,EAAoB,EAAK,GACzBQ,GAAsB,IAAI;AAAA,IAC5B;AAAA,IACA;AAAA,MACEwE;AAAA,MACAnH;AAAA,MACA0C;AAAA,MACA/W;AAAA,MACAF;AAAA,MACA8X;AAAA,MACAvb;AAAA,MACAzG;AAAA,MACAgK;AAAA,MACAD;AAAA,MACArI;AAAA,MACA+gB;AAAA,IAAA;AAAA,EACF,GAGI2E,KAAuBnF;AAAA,IAC3B,CAAC7iB,GAAeuW,MAA+B;AAC7C,UAAIzL,IAAyB;AAC3B,cAAMsc,IACJzc,EAAgB;AAAA,UACd,CAAC9H,OACCA,GAAM,OAAO+H,OACZ/H,GAAM,QAAQ,YAAY0T;AAAA,QAAA,KAE/B5L,EAAgB,KAAK,CAAC9H,QAAWA,GAAM,QAAQ,YAAY0T,CAAS;AAEtE,YAAI,CAAC6Q,GAAa;AAChB,UAAA5F,EAAoB,EAAK;AACzB;AAAA,QACF;AAWA,cAAM+F,MARJlI,MAA2B+H,EAAY,gBACnCzc,EAAgB;AAAA,UACd,CAAC9H,QACEA,GAAM,QAAQ,YAAY0T,KAC3B1T,GAAM,kBAAkBukB,EAAY;AAAA,QAAA,IAExC,CAACA,CAAW,GAEa,IAAI,CAACvkB,OAAUA,GAAM,EAAE;AACtD,QAAAmgB,GAAwBuE,IAAWvnB,CAAK;AAExC,cAAMioB,KAAa,EAAE,GAAGjd,GAAA;AACxB,mBAAW8J,MAAMyS,GAAW,CAAAU,GAAWnT,EAAE,IAAI9U;AAE7C,cAAM0mB,KAAY,IAAI;AAAA,UACpB/b,EACG;AAAA,YAAO,CAAC9H,OACP+f,GAAuB/f,IAAOP,GAAY2lB,EAAU;AAAA,UAAA,EAErD,IAAI,CAACplB,OAAUA,GAAM,EAAE;AAAA,QAAA;AAG5B,QAAA2jB,GAA2BY,EAAY,IAAIV,EAAS;AACpD;AAAA,MACF;AAEA,YAAM9hB,IAAWN,IACX2I,IAAQ,KAAK,IAAI,IAAIjN,EAAM,SAAS4E,IAAW,IAAI,GACnDqC,IAASrC,IAAW;AAC1B,UAAI7C,IAAI,IACJC,IAAI;AAER,YAAMylB,KAAgB3H,EAAY,QAAQ,IAAIzY,EAAU,GAClD1D,KAAU8jB,MAAA,gBAAAA,GAAe;AAAA,QAC7B;AAAA;AAEF,UAAI9jB,IAAS;AACX,cAAM2K,IAAWzK,GAAoBF,IAAS/C,CAAK,GAC7C8mB,KAAkB/jB,GAAQ;AAAA,UAC9B;AAAA,QAAA;AAEF,YAAI+jB,IAAiB;AACnB,gBAAMC,KAAU1jB;AAAA,YACdyjB,GAAgB,sBAAA;AAAA,YAChB/jB;AAAA,YACA/C;AAAA,UAAA,GAEIgnB,KAAa,KAAK,IAAI,GAAGD,GAAQ,GAAG,GACpCE,KAAgB,KAAK,IAAIvZ,EAAS,QAAQqZ,GAAQ,MAAM,GACxDG,KAAc,KAAK,IAAI,GAAGH,GAAQ,IAAI,GACtCI,IAAe,KAAK,IAAIzZ,EAAS,OAAOqZ,GAAQ,KAAK;AAC3D,UAAA5lB,IAAI,KAAK,IAAI,IAAI+lB,KAAcC,KAAgB,IAAI9a,IAAQ,CAAC,GAC5DjL,IAAI,KAAK,IAAI,IAAI4lB,KAAaC,MAAiB,IAAI5gB,IAAS,CAAC,GAC7DlF,IAAI,KAAK,IAAIA,GAAG,KAAK,IAAI,GAAGuM,EAAS,QAAQrB,CAAK,CAAC,GACnDjL,IAAI,KAAK,IAAIA,GAAG,KAAK,IAAI,GAAGsM,EAAS,SAASrH,CAAM,CAAC;AAAA,QACvD;AAAA,MACF;AAEA,YAAMM,KAAuB;AAAA,QAC3B,IAAI7C,GAAA;AAAA,QACJ,YAAA2C;AAAA,QACA,GAAAtF;AAAA,QACA,GAAAC;AAAA,QACA,OAAAiL;AAAA,QACA,QAAAhG;AAAAA,QACA,OAAAjH;AAAA,QACA,UAAA4E;AAAA,QACA,OAAOL;AAAA,MAAA;AAET,MAAA+c,EAAS,CAAC1R,MAAS,CAAC,GAAGA,GAAMrI,EAAI,CAAC,GAClC0a,GAAkB1a,GAAK,EAAE,GACzBia,EAAoB,EAAK,GACzBL,EAAc,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,MACEqF;AAAA,MACAnH;AAAA,MACArU;AAAA,MACAF;AAAA,MACA8X;AAAA,MACAvb;AAAA,MACAzG;AAAA,MACAgK;AAAA,MACAD;AAAA,MACArI;AAAA,MACA0gB;AAAA,IAAA;AAAA,EACF,GAGIkF,KAAqBrF,EAAY,CAACS,MAAmC;AACzE,IAAAjC,EAAc,CAACzR,MAAS,CAAC,GAAGA,GAAM0T,CAAS,CAAC,GAC5CD,GAA4B,QAAWC,CAAS,GAChDzB,GAAuByB,EAAU,EAAE,GACnC1B,GAAoB,IAAI,GACxBT,EAAc,MAAM;AAAA,EACtB,GAAG,CAACkC,EAA2B,CAAC,GAE1B8E,KAAwBtF;AAAA,IAC5B,CAAC/N,GAAYsT,MAAwC;AACnD,MAAA/G;AAAA,QAAc,CAACzR,MACbA,EAAK,IAAI,CAACrN,MAASA,EAAI,OAAOuS,IAAK,EAAE,GAAGvS,GAAK,GAAG6lB,EAAA,IAAU7lB,CAAI;AAAA,MAAA;AAAA,IAElE;AAAA,IACA,CAAA;AAAA,EAAC,GAGG8lB,KAAwBxF,EAAY,CAAC/N,MAAe;AACxD,UAAMwT,IAAUhmB,EAAW,KAAK,CAACC,MAAQA,EAAI,OAAOuS,CAAE;AACtD,IAAAuM,EAAc,CAACzR,MAASA,EAAK,OAAO,CAACrN,MAAQA,EAAI,OAAOuS,CAAE,CAAC,GAC3D+M,GAAuB,CAAC7R,MAAaA,MAAY8E,IAAK,OAAO9E,CAAQ,GACjEsY,KAAA,QAAAA,EAAS,WACXxG,GAA4BwG,EAAQ,OAAO;AAAA,EAE/C,GAAG,CAAChmB,CAAU,CAAC,GAETimB,KAA2B1F,EAAY,CAAC/N,MAAgB;AAC5D,UAAMjH,IAASiH,IACXxS,EAAW,KAAK,CAACC,OAAQA,GAAI,OAAOuS,CAAE,KAAK,OAC3CqR;AACJ,QAAI,CAACtY,EAAQ;AAEb,UAAMiB,IAASgR,EAAY,QAAQ,IAAIjS,EAAO,UAAU,GAClDlK,IAAUmL,KAAA,gBAAAA,EAAQ;AAAA,MACtB;AAAA,OAGItH,IAAS;AACf,QAAIzF,IAAI8L,EAAO,IAAIrG,GACfxF,IAAI6L,EAAO,IAAIrG;AAEnB,QAAI7D,GAAS;AACX,YAAM6kB,KAAY7kB,EAAQ,cAAc/C,GAClC6nB,KAAa9kB,EAAQ,eAAe/C;AAC1C,MAAAmB,IAAI,KAAK;AAAA,QACP,KAAK,IAAI,GAAGA,CAAC;AAAA,QACb,KAAK,IAAI,GAAGymB,KAAY3a,EAAO,KAAK;AAAA,MAAA,GAEtC7L,IAAI,KAAK;AAAA,QACP,KAAK,IAAI,GAAGA,CAAC;AAAA,QACb,KAAK,IAAI,GAAGymB,KAAa5a,EAAO,MAAM;AAAA,MAAA;AAAA,IAE1C;AAEA,UAAM6a,KAAiC;AAAA,MACrC,GAAG7a;AAAA,MACH,IAAIzL,GAAA;AAAA,MACJ,GAAAL;AAAA,MACA,GAAAC;AAAA,IAAA;AAGF,IAAAqf,EAAc,CAACzR,OAAS,CAAC,GAAGA,IAAM8Y,EAAS,CAAC,GAC5C7G,GAAuB6G,GAAU,EAAE,GACnC9G,GAAoB,IAAI,GACxBT,EAAc,MAAM;AAAA,EACtB,GAAG,CAACvgB,GAAOulB,IAAmB7jB,CAAU,CAAC,GAEnCqmB,KAAsB9F,EAAY,CAAC/N,MAAgB;AACvD,UAAM8T,IAAW9T,MAAMqR,MAAA,gBAAAA,GAAmB;AAC1C,QAAI,CAACyC,EAAU;AACf,UAAMhY,IAAWtO,EAAW,KAAK,CAACC,MAAQA,EAAI,OAAOqmB,CAAQ,GACvD/lB,IAAQ+N,KAAA,QAAAA,EAAU,UACpBjG,EAAgB,KAAK,CAACke,MAASA,EAAK,OAAOjY,EAAS,OAAO,IAC3D;AACJ,IAAA8Q,IAAyB7e,KAAA,gBAAAA,EAAO,SAAQ,MAAM,GAC9Cgf,GAAuB+G,CAAQ,GAC/B5G,GAAsB4G,CAAQ,GAC9BpH,EAAoB,EAAI;AAAA,EAC1B,GAAG,CAAC2E,IAAmB7jB,GAAYqI,CAAe,CAAC,GAE7Cme,KAAgBjG,EAAY,CAACtb,MAAyB;AAC1D,IAAA+Z,EAAS,CAAC1R,MACJrI,EAAK,UACA,CAAC,GAAGqI,EAAK,OAAO,CAACiZ,MAASA,EAAK,YAAYthB,EAAK,OAAO,GAAGA,CAAI,IAEhE,CAAC,GAAGqI,GAAMrI,CAAI,CACtB,GACD0a,GAAkB1a,EAAK,EAAE,GACrBA,EAAK,WAAS4a,GAAuB5a,EAAK,OAAO;AAAA,EACvD,GAAG,CAAA,CAAE,GAECwhB,KAAmBlG;AAAA,IACvB,CAAC/N,GAAYsT,MAAmC;AAC9C,MAAA9G;AAAA,QAAS,CAAC1R,MACRA,EAAK,IAAI,CAACrI,MAAUA,EAAK,OAAOuN,IAAK,EAAE,GAAGvN,GAAM,GAAG6gB,EAAA,IAAU7gB,CAAK;AAAA,MAAA;AAAA,IAEtE;AAAA,IACA,CAAA;AAAA,EAAC,GAGGyhB,KAAmBnG,EAAY,CAAC/N,MAAe;AACnD,UAAMwT,IAAUvgB,EAAM,KAAK,CAACR,MAASA,EAAK,OAAOuN,CAAE;AACnD,IAAAwM,EAAS,CAAC1R,MAASA,EAAK,OAAO,CAACrI,MAASA,EAAK,OAAOuN,CAAE,CAAC,GACxDmN,GAAkB,CAACjS,MAAaA,MAAY8E,IAAK,OAAO9E,CAAQ,GAChEoS,GAAiB,CAACpS,MAAaA,MAAY8E,IAAK,OAAO9E,CAAQ,GAC3DsY,KAAA,QAAAA,EAAS,WACXnG,GAAuBmG,EAAQ,OAAO;AAAA,EAE1C,GAAG,CAACvgB,CAAK,CAAC;AAGV,EAAA6E,GAAU,MAAM;AACd,IAAKf,MACLyV;AAAA,MAAS,CAAC1R,MACRA,EAAK,IAAI,CAACrI,MAAS;AACjB,YAAI,CAACA,EAAK,QAAS,QAAOA;AAC1B,cAAM1E,IAAQ6I,EAAW,KAAK,CAACmd,MAASA,EAAK,OAAOthB,EAAK,OAAO;AAChE,eAAK1E,IACE;AAAA,UACL,GAAG0E;AAAA,UACH,YAAY1E,EAAM;AAAA,UAClB,GAAGA,EAAM;AAAA,UACT,GAAGA,EAAM;AAAA,UACT,OAAOA,EAAM;AAAA,UACb,QAAQA,EAAM;AAAA,UACd,UAAUA,EAAM,YAAY0E,EAAK,YAAYjD;AAAA,UAC7C,OAAOzB,EAAM,SAAS0E,EAAK,SAAShD;AAAA,QAAA,IATnBgD;AAAA,MAWrB,CAAC;AAAA,IAAA;AAAA,EAEL,GAAG,CAACsE,IAAoBH,CAAU,CAAC;AAEnC,QAAMud,KAAqBpG;AAAA,IACzB,CAACqG,MAAsB;;AACrB,UAAI,CAACve,EAAgB,OAAQ;AAC7B,YAAMwe,IACJve,MAA4B,OACxBD,EAAgB,UAAU,CAAC2F,MAAMA,EAAE,OAAO1F,EAAwB,IAClE,IACAwe,IAAY,KAAK;AAAA,QACrBze,EAAgB,SAAS;AAAA,QACzB,KAAK,IAAI,IAAIwe,IAAO,IAAI,IAAIA,KAAQD,CAAS;AAAA,MAAA,GAEzCrmB,IAAQ8H,EAAgBye,CAAS;AACvC,MAAKvmB,MACLif,GAA4Bjf,EAAM,EAAE,GACpCgf;AAAA,UACE/b,IAAAxD,EAAW,KAAK,CAACC,MAAQA,EAAI,YAAYM,EAAM,EAAE,MAAjD,gBAAAiD,EAAoD,OAAM;AAAA,MAAA,GAE5D0e,GAAuB3hB,CAAK;AAAA,IAC9B;AAAA,IACA;AAAA,MACE2hB;AAAA,MACA5Z;AAAA,MACAD;AAAA,MACArI;AAAA,IAAA;AAAA,EACF;AAGF,MAAI,CAAC0d,MAAgB,CAACE;AACpB,WACE,gBAAA3X;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAW,8CAA8CF,KAAa,EAAE,GAAG,KAAA;AAAA,QAC5E,UAAA;AAAA,MAAA;AAAA,IAAA;AAML,QAAMghB,KAA2B;AAAA,IAC/B,QAAApiB;AAAA,EAAA,GAGIqiB,KAAmC;AAAA,IACvC,QAAAnJ;AAAA,IACA,gBAAAU;AAAA,IACA,mBAAAC;AAAA,IACA,WAAA+D;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAA3d;AAAA,IACA,UAAAiZ;AAAA,IACA,cAAAgE;AAAA,IACA,OAAA1jB;AAAA,IACA,eAAAskB;AAAA,IACA,cAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,cAAAH;AAAA,IACA,YAAAlb;AAAA,IACA,kBAAkB,CAACuR,MAAS2K,GAAiB3K,CAAI;AAAA,IACjD,yBAAAxQ;AAAA,IACA,oBAAAe;AAAA,IACA,kBAAA1B;AAAA,IACA,eAAAgX;AAAA,IACA,qBAAAK;AAAA,IACA,mBAAmB3f,EAAY;AAAA,IAC/B,kBAAkBS,EAAW;AAAA,IAC7B,aAAayF,EAAM;AAAA,IACnB,wBAAAwe;AAAA,IACA,cAAAlE;AAAA,IACA,cAAAE;AAAA,IACA,iBAAAD;AAAA,IACA,iBAAAE;AAAA,IACA,cAAA2B;AAAA,IACA,aAAAwB;AAAA,IACA,YAAA5E;AAAA,IACA,QAAApX;AAAA,IACA,YAAAgX;AAAA,IACA,aAAAT;AAAA,IACA,gBAAA6F;AAAA,IACA,eAAA9E;AAAA,EAAA,GAGIsI,KAAiB,CAAC/F,MACtBA,EAAI,OAAO,CAAC1O,MAER,EAAAhK,OACCgK,MAAO,eAAeA,MAAO,eAAeA,MAAO,SAKvD,GAEG0U,KAAoB5e,KACtBD,EAAgB,UAAU,CAAC9H,MAAUA,EAAM,OAAO+H,EAAwB,IAC1E,GAEE6e,KAAmB9e,EAAgB;AAAA,IAAO,CAAC9H,MAC/C+f,GAAuB/f,GAAOP,GAAY0I,EAAW;AAAA,EAAA,EACrD,QAEI0e,KACJ/e,EAAgB,SAAS,IACrB,KAAK,MAAO8e,KAAmB9e,EAAgB,SAAU,GAAG,IAC5D,GAEAgf,KAAa,CAACnG,GAAsBoG,IAAW,OAAU;AAC7D,UAAMjC,IAAU4B,GAAe/F,CAAG;AAClC,QAAImE,EAAQ,WAAW,KAAK,CAACiC;AAC3B,aAAO,gBAAArhB,EAAC,OAAA,EAAI,WAAU,mCAAA,CAAmC;AAE3D,QAAIof,EAAQ,WAAW;AACrB,aACE,gBAAApf,EAAC,OAAA,EAAI,WAAU,yEAAA,CAAyE;AAI5F,UAAMmU,IAAQiL,EAAQ,IAAI,CAAC7S,GAAI+U,MAAU;AACvC,YAAMja,IAAO+X,EAAQkC,IAAQ,CAAC,GACxBC,KACJtN,GAAoB1H,CAAE,MAAM,CAAClF,KAAQ,CAAC4M,GAAoB5M,CAAI;AAChE,aACE,gBAAArH,EAAC8I,IAAA,EACE,UAAAoL,GAAkB3H,GAAIwU,IAAY,EAAE,eAAAQ,IAAe,EAAA,GADvChV,CAEf;AAAA,IAEJ,CAAC;AAED,WACE,gBAAAlM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WACEghB,IACI,2EACA;AAAA,QAGL,UAAA;AAAA,UAAAlN;AAAA,UACAG,GAAmByM,IAAY,IAAI,IAAI3B,CAAO,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtD;AAEA,SACE,gBAAA/e;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,iBAAesX,MAAe;AAAA,MAC9B,WAAW,qBAAqB7X,KAAa,EAAE,GAAG,KAAA;AAAA,MAClD,OAAOghB;AAAA,MAEN,UAAA;AAAA,QAAA5F,KACC,gBAAA7a,EAAC,OAAA,EAAI,WAAU,8BACZ,UAAA;AAAA,UAAA+gB,GAAWlG,GAAa,IAAI;AAAA,UAC5BkG,GAAWlG,GAAa,OAAO,EAAI;AAAA,QAAA,EAAA,CACtC,IACE;AAAA,QAEFM,MAAiBxE,MAA4BzU,KAC7C,gBAAAvC;AAAA,UAAC2N;AAAA,UAAA;AAAA,YACC,MAAMqL;AAAA,YACN,SAAS,MAAM;AACb,cAAAC,EAAoB,EAAK,GACzBQ,GAAsB,IAAI,GAC1BN,GAAyB,MAAS,GAClClC,MAAA,QAAAA;AAAA,YACF;AAAA,YACA,QAAQ0H;AAAA,YACR,kBAAkBc;AAAA,YAClB,WAAWvG;AAAA,YACX,mBAAmB,CAAC3W;AAAA,YACpB,kBACEhF,KAAA6E,EAAgB,KAAK,CAAC9H,MAAUA,EAAM,OAAO+H,EAAwB,MAArE,gBAAA9E,GACI;AAAA,YAEN,mBACE8E,KACII,GAAYJ,EAAwB,OACpCgO,KAAAjO,EAAgB,KAAK,CAAC9H,MAAUA,EAAM,OAAO+H,EAAwB,MAArE,gBAAAgO,GACI,SACJ;AAAA,YAEN,aAAa,MAAM;AACjB,oBAAM/V,IAAQ8H,EAAgB;AAAA,gBAC5B,CAACke,MAASA,EAAK,OAAOje;AAAA,cAAA;AAExB,kBAAI,GAAC/H,MAAUA,EAAM,QAAQ,YAAY;AACzC,uBAAO,EAAE,OAAOA,EAAM,OAAO,QAAQA,EAAM,OAAA;AAAA,YAC7C,GAAA;AAAA,YACA,kBAAA+T;AAAA,YACA,gBAAgB,CAACmT,GAAMC,MAAS;AAC9B,cAAArI,GAAoB,CAAC/R,MACfma,MAAS,SACJ,EAAE,GAAGna,GAAM,MAAMoa,EAAA,IAEtBD,MAAS,SACJ,EAAE,GAAGna,GAAM,MAAMoa,EAAA,IAEnB,EAAE,GAAGpa,GAAM,MAAMoa,EAAA,CACzB;AAAA,YACH;AAAA,UAAA;AAAA,QAAA,IAEA;AAAA,QAEJ,gBAAAphB,EAAC,OAAA,EAAI,WAAU,8BACZ,UAAA;AAAA,UAAAiY,KACC,gBAAAtY;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO0V,IAAiB,GAAA;AAAA,cAEhC,UAAAkC,OAAW,WAAWxW,KACrB,gBAAAf,EAAAyI,IAAA,EACG,UAAA;AAAA,gBAAA,MAAM,KAAK;AAAA,kBACV,QAAQ,KAAK,IAAIiP,MAAY,GAAGpC,CAAa;AAAA,gBAAA,CAC9C,EAAE,IAAI,CAAC+L,GAAGhZ,MAAQ;AACjB,wBAAMiZ,IAAIjZ,IAAM;AAChB,yBACE,gBAAA1I,EAAC,OAAA,EAAY,WAAU,iCACrB,UAAA,gBAAAA;AAAA,oBAAC4hB;AAAAA,oBAAA;AAAA,sBACC,QAAAxgB;AAAA,sBACA,YAAYugB;AAAA,sBACZ,UAAUA,MAAM7iB;AAAA,sBAChB,UAAAuC;AAAA,sBACA,UAAU0a;AAAA,sBACV,OAAOrG;AAAA,sBACP,aAAApc;AAAA,sBACA,YAAAS;AAAA,sBACA,iBAAAqI;AAAA,sBACA,OAAO+a;AAAA,sBACP,YAAAha;AAAA,oBAAA;AAAA,kBAAA,KAZMwe,CAcV;AAAA,gBAEJ,CAAC;AAAA,gBACA5J,KAAWpC,IACV,gBAAAtV,EAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,kBAAA;AAAA,kBAC9BsV;AAAA,kBAAc;AAAA,gBAAA,EAAA,CAC/B,IACE;AAAA,cAAA,EAAA,CACN,IAEA,gBAAA3V,EAAC,OAAA,EAAI,WAAU,4BAA2B,UAAA,aAAA,CAAU;AAAA,YAAA;AAAA,UAAA,IAGtD;AAAA,UAEJ,gBAAAK,EAAC,OAAA,EAAI,KAAKgX,IAAc,WAAU,2BAC/B,UAAA;AAAA,YAAAO,OAAW,YACV,gBAAAvX,EAAC,OAAA,EAAI,WAAU,uDAAsD,UAAA;AAAA,cAAA;AAAA,cAEnE,gBAAAL,EAAC,QAAA,EAAK,WAAU,6BAAA,CAA6B;AAAA,YAAA,EAAA,CAC/C,IACE;AAAA,YAEH4X,OAAW,UACV,gBAAAvX,EAAC,OAAA,EAAI,WAAU,uDAAsD,UAAA;AAAA,cAAA;AAAA,cAElEsX,KACC,gBAAA3X;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAM2X;AAAA,kBACN,QAAO;AAAA,kBACP,KAAI;AAAA,kBACL,UAAA;AAAA,gBAAA;AAAA,cAAA,IAGC;AAAA,YAAA,EAAA,CACN,IACE;AAAA,YAEHC,OAAW,WAAWxW,KACrB,gBAAApB,EAAC,SACE,UAAA,MAAM,KAAK,EAAE,QAAQ+X,IAAU,EAAE,IAAI,CAAC2J,GAAGhZ,MAAQ;AAChD,oBAAMgD,IAAIhD,IAAM;AAChB,qBACE,gBAAA1I;AAAA,gBAACmB;AAAA,gBAAA;AAAA,kBAEC,QAAAC;AAAA,kBACA,YAAYsK;AAAA,kBACZ,OAAArT;AAAA,kBACA,UAAAgJ;AAAA,kBACA,YAAY+U,KAAe5U,IAAa;AAAA,kBACxC,aAAamc;AAAA,kBACb,aAAArkB;AAAA,kBACA,iBAAiBukB;AAAA,kBACjB,oBAAoBE;AAAA,kBACpB,YAAAhkB;AAAA,kBACA,kBAAA6H;AAAA,kBACA,gBAAgB+d;AAAA,kBAChB,mBAAmBC;AAAA,kBACnB,mBAAmBE;AAAA,kBACnB,iBAAiBM;AAAA,kBACjB,sBAAsBJ;AAAA,kBACtB,qBAAA9d;AAAA,kBACA,mBAAmBoX;AAAA,kBACnB,iBAAAlX;AAAA,kBACA,0BAAAC;AAAA,kBACA,wBAAwBkX;AAAA,kBACxB,yBAAAhX;AAAA,kBACA,oBAAoB+b;AAAA,kBACpB,aAAA7b;AAAA,kBACA,oBAAoB8b;AAAA,kBACpB,oBAAoBC;AAAA,kBACpB,OAAAhf;AAAA,kBACA,WAAW+gB;AAAA,kBACX,cAAcC;AAAA,kBACd,cAAcC;AAAA,kBACd,gBAAAxd;AAAA,kBACA,cAAcyW;AAAA,kBACd,YAAAvW;AAAA,kBACA,qBAAAwW;AAAA,kBACA,mBAAmBC;AAAA,kBACnB,oBAAAtW;AAAA,kBACA,eAAAC;AAAA,kBACA,uBAAuBsW;AAAA,kBACvB,SAAS,CAACrS,MAAO;AACf,oBAAIA,KAAI+P,EAAY,QAAQ,IAAI7L,GAAGlE,CAAE;AAAA,kBACvC;AAAA,gBAAA;AAAA,gBAzCKkE;AAAA,cAAA;AAAA,YA4CX,CAAC,GACH,IACE;AAAA,UAAA,EAAA,CACN;AAAA,QAAA,GACF;AAAA,QAECnJ,MAA2B2U,KAC1B,gBAAA7W,EAAC,OAAA,EAAI,WAAU,6BAA4B,MAAK,cAAa,cAAW,kBACrE,UAAA;AAAA,UAAAkC,KACC,gBAAAlC,EAAAyI,IAAA,EACE,UAAA;AAAA,YAAA,gBAAAzI,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,cAAA,gBAAAL;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAUoC,EAAgB,UAAU,KAAK6e,MAAqB;AAAA,kBAC9D,SAAS,MAAMP,GAAmB,EAAE;AAAA,kBACrC,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGD,gBAAA1gB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UACEoC,EAAgB,UAAU,KAC1B6e,MAAqB7e,EAAgB,SAAS;AAAA,kBAEhD,SAAS,MAAMse,GAAmB,CAAC;AAAA,kBACpC,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED,GACF;AAAA,YACA,gBAAArgB,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,cAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,mCAAkC,UAAA;AAAA,gBAAA;AAAA,gBACzC,KAAK,IAAI,GAAG4gB,KAAoB,CAAC;AAAA,gBAAE;AAAA,gBAAK7e,EAAgB;AAAA,cAAA,GACjE;AAAA,cACA,gBAAApC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,iBAAe;AAAA,kBACf,iBAAe;AAAA,kBACf,iBAAemhB;AAAA,kBACf,cAAW;AAAA,kBAEX,UAAA,gBAAAnhB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,OAAO,GAAGmhB,EAAoB,IAAA;AAAA,oBAAI;AAAA,kBAAA;AAAA,gBAC7C;AAAA,cAAA;AAAA,cAEF,gBAAA9gB,EAAC,QAAA,EAAK,WAAU,qCACb,UAAA;AAAA,gBAAA8gB;AAAA,gBAAqB;AAAA,cAAA,EAAA,CACxB;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CACF,IAEA,gBAAAnhB,EAAC,OAAA,EAAI,WAAU,mCAAA,CAAmC;AAAA,UAEnDkX,KACC,gBAAA7W;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS6W;AAAA,cACT,UAAUE;AAAA,cACV,aAAWA,MAAiB;AAAA,cAE3B,UAAA;AAAA,gBAAAA,KACC,gBAAApX;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,eAAY;AAAA,kBAAA;AAAA,gBAAA,IAEZ;AAAA,gBACHmX;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,QAAA,EAAA,CACN,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AC7rDO,SAAS0K,GAASC,GAA6B;AACpD,SAAO;AACT;AACAD,GAAS,cAAc;AAGhB,SAASE,GAAKD,GAAyB;AAC5C,SAAO;AACT;AACAC,GAAK,cAAc;AAGZ,SAASC,GAAKF,GAAyB;AAC5C,SAAO;AACT;AACAE,GAAK,cAAc;AAGZ,SAASC,GAAKH,GAAyB;AAC5C,SAAO;AACT;AACAG,GAAK,cAAc;AAGZ,SAASC,GAAMJ,GAA0B;AAC9C,SAAO;AACT;AACAI,GAAM,cAAc;AAGb,SAASC,GAAKL,GAAyB;AAC5C,SAAO;AACT;AACAK,GAAK,cAAc;ACxCnB,MAAMC,KAAqC;AAAA,EACzC,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AACR;AAEA,SAASC,GAAeb,GAA8B;AACpD,MAAI,OAAOA,KAAS,SAAU,QAAOA;AACrC,MAAI,OAAOA,KAAS,YAAY;AAC9B,UAAMc,IAAKd;AACX,WAAOc,EAAG,eAAeA,EAAG,QAAQ;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAASC,GAAgBxiB,GAAkC;AACzD,QAAMyiB,IAAsB,CAAA,GACtBC,IAAQ,CAAClkB,MAAoB;AACjC,QAAI,EAAAA,KAAQ,QAAQ,OAAOA,KAAS,YACpC;AAAA,UAAI,MAAM,QAAQA,CAAI,GAAG;AACvB,QAAAA,EAAK,QAAQkkB,CAAK;AAClB;AAAA,MACF;AACA,MAAAD,EAAO,KAAKjkB,CAAI;AAAA;AAAA,EAClB;AACA,SAAAkkB,EAAM1iB,CAAQ,GACPyiB;AACT;AAEA,SAASE,GAAY3iB,GAA6B;AAChD,SAAOwiB,GAAgBxiB,CAAQ,EAC5B,IAAI,CAAC4iB,MACA,OAAOA,KAAU,YAAY,OAAOA,KAAU,WACzC,OAAOA,CAAK,IAGnBA,KACA,OAAOA,KAAU,YACjB,WAAYA,IAGLD,GADIC,EACW,MAAM,QAAQ,IAE/B,EACR,EACA,KAAK,EAAE;AACZ;AAEO,SAASC,GAAiBpkB,GAAgC;AAC/D,QAAMiU,IAAO4P,GAAe7jB,EAAQ,IAAI,GAClCqkB,IAAWpQ,IAAO2P,GAAS3P,CAAI,IAAI;AAEzC,MAAI,CAACoQ;AACH,UAAM,IAAI;AAAA,MACR,qCAAqCpQ,KAAQ,SAAS;AAAA,IAAA;AAI1D,QAAMvS,IAAQ,EAAE,GAAI1B,EAAQ,MAAA,GACtBskB,IAAe5iB,EAAM;AAG3B,MAFA,OAAOA,EAAM,UAET2iB,MAAa,UAAUA,MAAa;AACtC,WAAO;AAAA,MACL,MAAMA;AAAA,MACN,OAAA3iB;AAAA,MACA,UAAU,CAAA;AAAA,MACV,MAAMwiB,GAAYI,CAAY;AAAA,IAAA;AAIlC,QAAMC,IAAaR,GAAgBO,CAAY,EAC5C;AAAA,IACC,CAACH,MACC,CAAC,CAACA,KAAS,OAAOA,KAAU,YAAY,UAAWA;AAAA,EAAA,EAEtD,IAAIC,EAAgB;AAEvB,SAAO;AAAA,IACL,MAAMC;AAAA,IACN,OAAA3iB;AAAA,IACA,UAAU6iB;AAAA,EAAA;AAEd;ACvFO,MAAMC,KAA4E;AAAA,EACvF,IAAI,CAAC,QAAQ,MAAM;AAAA,EACnB,QAAQ,CAAC,KAAK,GAAG;AAAA,EACjB,OAAO,CAAC,KAAK,IAAI;AACnB;AAEO,SAASC,GACdpjB,IAAiB,MACjBqjB,IAAwC,YACtB;AAClB,QAAM,CAACxpB,GAAGC,CAAC,IAAI,MAAM,QAAQkG,CAAI,IAAIA,IAAOmjB,GAAWnjB,CAAI;AAC3D,SAAOqjB,MAAgB,cAAc,CAACvpB,GAAGD,CAAC,IAAI,CAACA,GAAGC,CAAC;AACrD;AAEO,SAASwpB,GAAcC,IAAe,IAAI;AAC/C,QAAMC,IAAOD,EAAM,WAAW;AAC9B,SAAO;AAAA,IACL,KAAKA,EAAM,cAAcC;AAAA,IACzB,OAAOD,EAAM,gBAAgBC;AAAA,IAC7B,QAAQD,EAAM,iBAAiBC;AAAA,IAC/B,MAAMD,EAAM,eAAeC;AAAA,EAAA;AAE/B;AAEO,SAASC,GAAaF,IAAe,IAAI;AAC9C,QAAMC,IAAOD,EAAM,UAAU;AAC7B,SAAO;AAAA,IACL,KAAKA,EAAM,aAAaC;AAAA,IACxB,OAAOD,EAAM,eAAeC;AAAA,IAC5B,QAAQD,EAAM,gBAAgBC;AAAA,IAC9B,MAAMD,EAAM,cAAcC;AAAA,EAAA;AAE9B;AAGO,SAASE,GAAWC,GAAiD;AAC1E,MAAI,CAACA,EAAO,QAAO;AAEnB,QAAM3rB,IAAM2rB,EAAM,KAAA;AAClB,MAAI3rB,EAAI,WAAW,GAAG,GAAG;AACvB,UAAM4rB,IAAM5rB,EAAI,MAAM,CAAC;AACvB,QAAI4rB,EAAI,WAAW,GAAG;AACpB,YAAM,IAAI,SAASA,EAAI,CAAC,IAAIA,EAAI,CAAC,GAAG,EAAE,IAAI,KACpC9rB,IAAI,SAAS8rB,EAAI,CAAC,IAAIA,EAAI,CAAC,GAAG,EAAE,IAAI,KACpC7rB,IAAI,SAAS6rB,EAAI,CAAC,IAAIA,EAAI,CAAC,GAAG,EAAE,IAAI;AAC1C,aAAO,CAAC,GAAG9rB,GAAGC,CAAC;AAAA,IACjB;AACA,QAAI6rB,EAAI,WAAW,GAAG;AACpB,YAAM,IAAI,SAASA,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACpC9rB,IAAI,SAAS8rB,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACpC7rB,IAAI,SAAS6rB,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC1C,aAAO,CAAC,GAAG9rB,GAAGC,CAAC;AAAA,IACjB;AAAA,EACF;AAEA,QAAM8rB,IAAMF,EAAM;AAAA,IAChB;AAAA,EAAA;AAEF,SAAIE,IACK;AAAA,IACL,KAAK,IAAI,GAAG,OAAOA,EAAI,CAAC,CAAC,IAAI,GAAG;AAAA,IAChC,KAAK,IAAI,GAAG,OAAOA,EAAI,CAAC,CAAC,IAAI,GAAG;AAAA,IAChC,KAAK,IAAI,GAAG,OAAOA,EAAI,CAAC,CAAC,IAAI,GAAG;AAAA,EAAA,IAI7B;AACT;AAEO,SAASC,GACdlsB,GACAmsB,GACAC,IAAW,GACH;AACR,MAAIpsB,KAAS,KAAM,QAAOosB;AAC1B,MAAI,OAAOpsB,KAAU,SAAU,QAAOA;AACtC,MAAIA,EAAM,SAAS,GAAG,GAAG;AACvB,UAAMqsB,IAAM,OAAO,WAAWrsB,CAAK;AACnC,WAAO,OAAO,SAASqsB,CAAG,IAAKA,IAAM,MAAOF,IAASC;AAAA,EACvD;AACA,QAAMlC,IAAI,OAAO,WAAWlqB,CAAK;AACjC,SAAO,OAAO,SAASkqB,CAAC,IAAIA,IAAIkC;AAClC;AAEO,SAASE,GAAOC,GAAuC;AAC5D,SAAIA,MAAW,SAAe,KAC1B,OAAOA,KAAW,WAAiBA,KAAU,MAC1C;AACT;ACjFA,MAAMC,KAAoB,IACpBC,KAAsB,KACtBC,KAAiB;AAEvB,SAASC,GAAYplB,GAAcokB,GAActoB,GAAsE;AACrH,QAAMuB,IAAW+mB,EAAM,YAAYa,IAC7B1nB,KAAc6mB,EAAM,cAAcc,MAAuB7nB,GACzDgoB,IAAYhoB,KAAY0nB,GAAOX,EAAM,UAAU,IAAI,OAAOe;AAEhE,MAAI,CAACnlB;AACH,WAAO,EAAE,OAAO,GAAG,QAAQzC,GAAY,OAAO,CAAC,EAAE,EAAA;AAGnD,QAAM+nB,IAAQtlB,EAAK,MAAM,KAAK,GACxB1C,IAAkB,CAAA;AACxB,MAAImL,IAAU;AAEd,aAAW8c,KAAQD,GAAO;AACxB,UAAME,IAAY/c,IAAU,GAAGA,CAAO,IAAI8c,CAAI,KAAKA;AACnD,IAAIC,EAAU,SAASH,KAAavpB,KAAY,CAAC2M,IAC/CA,IAAU+c,KAEVloB,EAAM,KAAKmL,CAAO,GAClBA,IAAU8c;AAAA,EAEd;AACA,EAAI9c,KAASnL,EAAM,KAAKmL,CAAO;AAE/B,QAAMgd,IAAS,KAAK,IAAI,GAAGnoB,EAAM,IAAI,CAACooB,MAAMA,EAAE,SAASL,CAAS,GAAG,CAAC;AACpE,SAAO;AAAA,IACL,OAAO,KAAK,IAAII,GAAQ3pB,CAAQ;AAAA,IAChC,QAAQwB,EAAM,SAASC;AAAA,IACvB,OAAAD;AAAA,EAAA;AAEJ;AAEA,SAASqoB,GACPpmB,GACA/E,GACAC,GACAmrB,GACAC,GACW;AACX,QAAMzB,IAAS7kB,EAAK,MAAM,SAA+B,CAAA,GACnDumB,IAASxB,GAAaF,CAAK,GAC3BlqB,IAAUiqB,GAAcC,CAAK,GAE7B2B,IAASvrB,IAAIsrB,EAAO,MACpBE,IAASvrB,IAAIqrB,EAAO,KACpBG,IAAe,KAAK;AAAA,IACxB;AAAA,IACAtB,GAAcP,EAAM,OAAOwB,GAAgBA,CAAc,IAAIE,EAAO,OAAOA,EAAO;AAAA,EAAA,GAE9EI,IAAa,KAAK,IAAI,GAAGD,IAAe/rB,EAAQ,OAAOA,EAAQ,KAAK;AAE1E,MAAIqF,EAAK,SAAS,UAAUA,EAAK,SAAS,QAAQ;AAChD,UAAM4mB,IAAWf,GAAY7lB,EAAK,QAAQ,IAAI6kB,GAAO8B,CAAU,GACzDxmB,KACJilB,GAAcP,EAAM,QAAQyB,GAAiBM,EAAS,SAASjsB,EAAQ,MAAMA,EAAQ,MAAM;AAC7F,WAAO;AAAA,MACL,GAAG6rB;AAAA,MACH,GAAGC;AAAA,MACH,OAAOC;AAAA,MACP,QAAAvmB;AAAA,MACA,MAAAH;AAAA,MACA,UAAU,CAAA;AAAA,MACV,OAAA6kB;AAAA,MACA,MAAM7kB,EAAK;AAAA,IAAA;AAAA,EAEf;AAEA,MAAIA,EAAK,SAAS,SAAS;AACzB,UAAMmG,IAAQif,GAAcP,EAAM,OAAOwB,GAAgB,KAAK,IAAI,KAAKA,CAAc,CAAC,GAChFlmB,KAASilB,GAAcP,EAAM,QAAQyB,GAAiB,GAAG;AAC/D,WAAO;AAAA,MACL,GAAGE;AAAA,MACH,GAAGC;AAAA,MACH,OAAOtgB,IAAQogB,EAAO,OAAOA,EAAO;AAAA,MACpC,QAAApmB;AAAA,MACA,MAAAH;AAAA,MACA,UAAU,CAAA;AAAA,MACV,OAAA6kB;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAMzC,IAAYyC,EAAM,iBAAiB,UACnChmB,IAAMgmB,EAAM,OAAO,GACnBgC,IAA0B,CAAA;AAEhC,MAAIC,IAAUN,IAAS7rB,EAAQ,MAC3BuG,IAAUulB,IAAS9rB,EAAQ,KAC3BosB,IAAW,GACXC,IAAY;AAEhB,WAASxnB,IAAI,GAAGA,IAAIQ,EAAK,SAAS,QAAQR,KAAK;AAC7C,UAAM4kB,KAAQpkB,EAAK,SAASR,CAAC,GACvBynB,KACJ7E,MAAc,QACV,KAAK,IAAI,GAAGuE,IAAaI,KAAYvnB,IAAI,IAAIX,IAAM,EAAE,IACrD8nB,GACAO,KACJ9E,MAAc,WACV,KAAK,IAAI,GAAGkE,KAAmBplB,IAAUhG,KAAKqrB,EAAO,MAAM,IAC3DD,GAEAxpB,KAAMspB,GAAWhC,IAAO0C,GAAS5lB,GAAS+lB,IAAYC,EAAU;AACtE,IAAAL,EAAW,KAAK/pB,EAAG,GAEfslB,MAAc,SAChB2E,KAAYjqB,GAAI,QAAQioB,GAAcX,GAAM,MAAM,SAAmB,CAAA,CAAE,EAAE,OACrEW,GAAcX,GAAM,MAAM,SAAmB,CAAA,CAAE,EAAE,OACjD5kB,IAAIQ,EAAK,SAAS,SAAS,MAAG+mB,KAAYloB,IAC9CioB,IAAUN,IAAS7rB,EAAQ,OAAOosB,GAClCC,IAAY,KAAK,IAAIA,GAAWlqB,GAAI,MAAM,MAE1CiqB,KAAYjqB,GAAI,SAASioB,GAAcX,GAAM,MAAM,SAAmB,CAAA,CAAE,EAAE,MACtEW,GAAcX,GAAM,MAAM,SAAmB,CAAA,CAAE,EAAE,QACjD5kB,IAAIQ,EAAK,SAAS,SAAS,MAAG+mB,KAAYloB,IAC9CqC,IAAUulB,IAAS9rB,EAAQ,MAAMosB,GACjCC,IAAY,KAAK,IAAIA,GAAWlqB,GAAI,KAAK;AAAA,EAE7C;AAEA,QAAMqqB,IACJ/B;AAAA,IACEP,EAAM;AAAA,IACNyB;AAAA,IACAlE,MAAc,WACV2E,IAAWpsB,EAAQ,MAAMA,EAAQ,SACjCqsB,IAAYrsB,EAAQ,MAAMA,EAAQ;AAAA,EAAA,GAGpCysB,KACJhF,MAAc,QACVgD,GAAcP,EAAM,OAAOwB,GAAgBU,IAAWpsB,EAAQ,OAAOA,EAAQ,KAAK,IAClF+rB,GAEAW,KAAUxC,EAAM,kBAAkB,cAClCyC,IAAQzC,EAAM,cAAc,WAE5B0C,KACJnF,MAAc,WACV+E,IAAgBxsB,EAAQ,MAAMA,EAAQ,SACtCysB,KAAazsB,EAAQ,OAAOA,EAAQ,OAEpC6sB,KAAY,KAAK,IAAI,GAAGD,KADTR,CACiC;AAEtD,MAAIU,IAAa,GACbC,KAAa7oB;AACjB,EAAIwoB,OAAY,aAAUI,IAAaD,KAAY,IAC/CH,OAAY,eAAYI,IAAaD,KACrCH,OAAY,mBAAmBR,EAAW,SAAS,MACrDa,KAAa7oB,IAAM2oB,MAAaX,EAAW,SAAS,KAElDQ,OAAY,kBAAkBR,EAAW,SAAS,MACpDa,KAAa7oB,IAAM2oB,KAAYX,EAAW,QAC1CY,IAAaC,KAAa;AAG5B,MAAIC,KAAU;AACd,aAAW7qB,KAAO+pB;AAChB,IAAIzE,MAAc,YAChBtlB,EAAI,IAAI2pB,IAAS9rB,EAAQ,MAAM8sB,IAAaE,IACxCL,MAAU,WACZxqB,EAAI,IAAI0pB,IAAS7rB,EAAQ,OAAO,KAAK,IAAI,IAAIgsB,IAAa7pB,EAAI,SAAS,CAAC,IAC/DwqB,MAAU,aACnBxqB,EAAI,IAAI0pB,IAAS7rB,EAAQ,OAAO,KAAK,IAAI,GAAGgsB,IAAa7pB,EAAI,KAAK,IACzDwqB,MAAU,aAAaxqB,EAAI,MAAM,SAAS,SACnDA,EAAI,QAAQ6pB,IAEdgB,MAAW7qB,EAAI,SAAS4qB,OAExB5qB,EAAI,IAAI0pB,IAAS7rB,EAAQ,OAAO8sB,IAAaE,IACzCL,MAAU,WACZxqB,EAAI,IACF2pB,IACA9rB,EAAQ,MACR,KAAK,IAAI,IAAIwsB,IAAgBxsB,EAAQ,MAAMA,EAAQ,SAASmC,EAAI,UAAU,CAAC,IACpEwqB,MAAU,aACnBxqB,EAAI,IACF2pB,IACA9rB,EAAQ,MACR,KAAK,IAAI,GAAGwsB,IAAgBxsB,EAAQ,MAAMA,EAAQ,SAASmC,EAAI,MAAM,IAC9DwqB,MAAU,aAAaxqB,EAAI,MAAM,UAAU,SACpDA,EAAI,SAASqqB,IAAgBxsB,EAAQ,MAAMA,EAAQ,SAErDgtB,MAAW7qB,EAAI,QAAQ4qB;AAI3B,SAAO;AAAA,IACL,GAAGlB;AAAA,IACH,GAAGC;AAAA,IACH,OAAOW;AAAA,IACP,QAAQD;AAAA,IACR,MAAAnnB;AAAA,IACA,UAAU6mB;AAAA,IACV,OAAAhC;AAAA,EAAA;AAEJ;AAEO,SAAS+C,GAAeC,GAAiC;AAC9D,MAAIA,EAAK,SAAS;AAChB,UAAM,IAAI,MAAM,+CAA+C;AAGjE,QAAMnb,IAAwB,CAAA;AAE9B,aAAWob,KAAYD,EAAK,UAAU;AACpC,QAAIC,EAAS,SAAS;AACpB,YAAM,IAAI,MAAM,4DAA4D;AAG9E,UAAMxmB,IAAOwmB,EAAS,MAAM,MACtBnD,IAAemD,EAAS,MAAM,eAA4C,YAC1E,CAAC3hB,GAAOhG,CAAM,IAAIukB,GAAgBpjB,GAAMqjB,CAAW,GACnDE,IAASiD,EAAS,MAAM,SAA+B,CAAA,GACvDntB,IAAUiqB,GAAcC,CAAK,GAE7BkD,IAAuB;AAAA,MAC3B,MAAM;AAAA,MACN,OAAO;AAAA,QACL,OAAO;AAAA,UACL,GAAGlD;AAAA,UACH,OAAA1e;AAAA,UACA,QAAAhG;AAAA,UACA,YAAYxF,EAAQ;AAAA,UACpB,cAAcA,EAAQ;AAAA,UACtB,eAAeA,EAAQ;AAAA,UACvB,aAAaA,EAAQ;AAAA,QAAA;AAAA,MACvB;AAAA,MAEF,UAAUmtB,EAAS;AAAA,IAAA,GAGfhrB,IAAMspB,GAAW2B,GAAa,GAAG,GAAG5hB,GAAOhG,CAAM;AAEvD,IAAAuM,EAAM,KAAK;AAAA,MACT,OAAAvG;AAAA,MACA,QAAAhG;AAAA,MACA,OAAOrD,EAAI;AAAA,MACX,OAAA+nB;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,OAAO,OAAOgD,EAAK,MAAM,SAAS,UAAU;AAAA,MAC5C,QAAQ,OAAOA,EAAK,MAAM,UAAU,EAAE;AAAA,MACtC,SAAS,OAAOA,EAAK,MAAM,WAAW,EAAE;AAAA,MACxC,SAAS,OAAOA,EAAK,MAAM,WAAW,YAAY;AAAA,IAAA;AAAA,IAEpD,OAAAnb;AAAA,EAAA;AAEJ;ACnQA,SAASsb,GAAgB9uB,GAAuB;AAC9C,SAAOA,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK;AACzB;AAEA,MAAM+uB,GAAU;AAAA,EAAhB;AACU,IAAAC,GAAA,iBAA6B,CAAC,IAAI;AAClC,IAAAA,GAAA,iBAAoB,CAAC,CAAC;AAAA;AAAA,EAE9B,UAAUta,GAAyB;AACjC,gBAAK,QAAQ,KAAKA,CAAO,GAClB,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM7O,GAAmC;AACvC,UAAMopB,IAAS,KAAK;AAAA,MAClB,cAAcH,GAAgBjpB,EAAI,KAAK,KAAK,CAAC,cAAcipB,GAAgBjpB,EAAI,KAAK,MAAM,CAAC,eAAeipB,GAAgBjpB,EAAI,KAAK,OAAO,CAAC,eAAeipB,GAAgBjpB,EAAI,KAAK,OAAO,CAAC;AAAA,IAAA,GAGvLqpB,IAAc,KAAK;AAAA,MACvB;AAAA,IAAA,GAEIC,IAAW,KAAK;AAAA,MACpB;AAAA,IAAA,GAGI5a,IAAoB,CAAA;AAE1B,eAAWvH,KAAQnH,EAAI,OAAO;AAC5B,YAAMupB,IAAgB,KAAK;AAAA,QACzBpiB,EAAK;AAAA,QACLA,EAAK;AAAA,QACLA,EAAK;AAAA,QACLA,EAAK;AAAA,MAAA,GAED2H,IAAY,KAAK;AAAA,QACrB,cAAcya,EAAc,MAAM;AAAA;AAAA,EAAgBA,CAAa;AAAA;AAAA,MAAA,GAG3Dxa,IAAS,KAAK,UAAU,EAAE;AAChC,MAAAL,EAAQ,KAAKK,CAAM,GAEnB,KAAK,QAAQA,CAAM,IACjB,+CAA+C5H,EAAK,MAAM,QAAQ,CAAC,CAAC,IAAIA,EAAK,OAAO,QAAQ,CAAC,CAAC,eAAe2H,CAAS,mCAAmCua,CAAW,YAAYC,CAAQ;AAAA,IAC5L;AAEA,UAAMta,IAAON,EAAQ,IAAI,CAACO,MAAO,GAAGA,CAAE,MAAM,EAAE,KAAK,GAAG,GAChDC,IAAU,KAAK;AAAA,MACnB,0BAA0BF,CAAI,YAAYN,EAAQ,MAAM;AAAA,IAAA;AAG1D,eAAWK,KAAUL;AACnB,WAAK,QAAQK,CAAM,IAAK,KAAK,QAAQA,CAAM,EAAa;AAAA,QACtD;AAAA,QACA,WAAWG,CAAO;AAAA,MAAA;AAItB,UAAMC,IAAY,KAAK;AAAA,MACrB,4BAA4BD,CAAO;AAAA,IAAA;AAIrC,QAAI8Q,IAAO;AAAA;AACX,SAAK,UAAU,CAAC,CAAC;AAEjB,aAASvf,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA;AACvC,WAAK,QAAQA,CAAC,IAAIuf,EAAK,QACvBA,KAAQ,GAAGvf,CAAC;AAAA,EAAW,KAAK,QAAQA,CAAC,CAAC;AAAA;AAAA;AAGxC,UAAM+oB,IAAaxJ,EAAK;AACxB,IAAAA,KAAQ;AAAA,IAAW,KAAK,QAAQ,MAAM;AAAA,GACtCA,KAAQ;AAAA;AACR,aAASvf,IAAI,GAAGA,IAAI,KAAK,QAAQ,QAAQA;AACvC,MAAAuf,KAAQ,GAAG,OAAO,KAAK,QAAQvf,CAAC,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC;AAAA;AAEtD,WAAAuf,KAAQ;AAAA,WAAqB,KAAK,QAAQ,MAAM,UAAU7Q,CAAS,cAAcia,CAAM;AAAA,GACvFpJ,KAAQ;AAAA,EAAcwJ,CAAU;AAAA,QAEzB,IAAI,YAAA,EAAc,OAAOxJ,CAAI;AAAA,EACtC;AAAA,EAEQ,kBACNzf,GACAoiB,GACAC,GACA6G,GACQ;AACR,UAAMC,IAAgB,CAAA,GAEhBC,IAAS1D,GAAWwD,EAAU,eAAe;AACnD,IAAIE,MACFD,EAAI,KAAK,GAAG,GACZA,EAAI;AAAA,MACF,GAAGC,EAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IAAA,GAEzED,EAAI;AAAA,MACF,OAAO/G,EAAU,QAAQ,CAAC,CAAC,IAAIC,EAAW,QAAQ,CAAC,CAAC;AAAA,IAAA,GAEtD8G,EAAI,KAAK,GAAG;AAGd,UAAME,IAAU,CAAC7rB,MAAmB;AAClC,YAAM,EAAE,GAAA7B,GAAG,GAAAC,GAAG,OAAAiL,GAAO,QAAAhG,GAAQ,OAAA0kB,GAAO,MAAA7kB,GAAM,MAAAS,MAAS3D,GAC7C8rB,IAAOjH,IAAazmB,IAAIiF,GAExB+iB,IAAO8B,GAAWH,EAAM,eAAe;AAQ7C,UAPI3B,MACFuF,EAAI,KAAK,GAAG,GACZA,EAAI,KAAK,GAAGvF,EAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,GAC/EuF,EAAI,KAAK,GAAGxtB,EAAE,QAAQ,CAAC,CAAC,IAAI2tB,EAAK,QAAQ,CAAC,CAAC,IAAIziB,EAAM,QAAQ,CAAC,CAAC,IAAIhG,EAAO,QAAQ,CAAC,CAAC,OAAO,GAC3FsoB,EAAI,KAAK,GAAG,IAGV5D,EAAM,eAAeA,EAAM,cAAc,GAAG;AAC9C,cAAMgE,IAAS7D,GAAWH,EAAM,WAAW,KAAK,CAAC,GAAG,GAAG,CAAC;AACxD,QAAA4D,EAAI,KAAK,GAAG,GACZA,EAAI,KAAK,GAAG5D,EAAM,WAAW,IAAI,GACjC4D,EAAI,KAAK,GAAGI,EAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,GACrFJ,EAAI,KAAK,GAAGxtB,EAAE,QAAQ,CAAC,CAAC,IAAI2tB,EAAK,QAAQ,CAAC,CAAC,IAAIziB,EAAM,QAAQ,CAAC,CAAC,IAAIhG,EAAO,QAAQ,CAAC,CAAC,OAAO,GAC3FsoB,EAAI,KAAK,GAAG;AAAA,MACd;AAEA,WAAKzoB,EAAK,SAAS,UAAUA,EAAK,SAAS,WAAWS,KAAQ,MAAM;AAClE,cAAM3C,IAAW+mB,EAAM,YAAY,IAC7B5rB,IAAQ+rB,GAAWH,EAAM,KAAK,KAAK,CAAC,GAAG,GAAG,CAAC,GAC3ClT,KAAO6T,GAAOX,EAAM,UAAU,IAAI,OAAO,MACzCiE,KAAcjE,EAAM,eAAeA,EAAM,WAAW,GACpDkE,IAAalE,EAAM,cAAcA,EAAM,WAAW,GAClDtoB,KAAW,KAAK,IAAI,GAAG4J,IAAQ2iB,MAAejE,EAAM,gBAAgBA,EAAM,WAAW,EAAE,GACvF+B,IAAWf,GAAYplB,GAAMokB,GAAOtoB,MAAY4J,CAAK,GACrDnI,MAAc6mB,EAAM,cAAc,OAAO/mB;AAE/C,QAAA2qB,EAAI,KAAK,GAAG,GACZA,EAAI,KAAK,IAAI,GACbA,EAAI,KAAK,IAAI9W,EAAI,IAAI7T,CAAQ,KAAK,GAClC2qB,EAAI,KAAK,GAAGxvB,EAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,GAElF2tB,EAAS,MAAM,QAAQ,CAAC3oB,GAAM8kB,OAAU;AACtC,cAAIiG,KAAQ/tB,IAAI6tB;AAChB,gBAAMG,IAAYhrB,EAAK,SAASH,KAAY0nB,GAAOX,EAAM,UAAU,IAAI,OAAO;AAC9E,UAAIA,EAAM,cAAc,WACtBmE,KAAQ/tB,KAAKkL,IAAQ8iB,KAAa,IACzBpE,EAAM,cAAc,YAC7BmE,KAAQ/tB,IAAIkL,IAAQ8iB,KAAapE,EAAM,gBAAgBA,EAAM,WAAW;AAE1E,gBAAMqE,KAAQvH,IAAazmB,IAAI6tB,IAAajrB,IAAWilB,KAAQ/kB;AAC/D,UAAAyqB,EAAI,KAAK,WAAWO,GAAM,QAAQ,CAAC,CAAC,IAAIE,GAAM,QAAQ,CAAC,CAAC,KAAK,GAC7DT,EAAI,KAAK,IAAIT,GAAgB/pB,CAAI,CAAC,MAAM;AAAA,QAC1C,CAAC,GAEDwqB,EAAI,KAAK,IAAI,GACbA,EAAI,KAAK,GAAG;AAAA,MACd;AAEA,MAAIzoB,EAAK,SAAS,YAEhByoB,EAAI,KAAK,GAAG,GACZA,EAAI,KAAK,mBAAmB,GAC5BA,EAAI,KAAK,GAAGxtB,EAAE,QAAQ,CAAC,CAAC,IAAI2tB,EAAK,QAAQ,CAAC,CAAC,IAAIziB,EAAM,QAAQ,CAAC,CAAC,IAAIhG,EAAO,QAAQ,CAAC,CAAC,OAAO,GAC3FsoB,EAAI,KAAK,oBAAoB,GAC7BA,EAAI,KAAK,GAAGxtB,EAAE,QAAQ,CAAC,CAAC,IAAI2tB,EAAK,QAAQ,CAAC,CAAC,IAAIziB,EAAM,QAAQ,CAAC,CAAC,IAAIhG,EAAO,QAAQ,CAAC,CAAC,OAAO,GAC3FsoB,EAAI;AAAA,QACF,wCAAwCxtB,IAAI,GAAG,QAAQ,CAAC,CAAC,KAAK2tB,IAAOzoB,IAAS,IAAI,GAAG,QAAQ,CAAC,CAAC;AAAA,MAAA,GAEjGsoB,EAAI,KAAK,GAAG;AAGd,iBAAWrE,KAAStnB,EAAI;AACtB,QAAA6rB,EAAQvE,CAAK;AAAA,IAEjB;AAEA,eAAWtnB,KAAOwC;AAChB,MAAAqpB,EAAQ7rB,CAAG;AAGb,WAAO2rB,EAAI,KAAK;AAAA,CAAI;AAAA,EACtB;AACF;AAEO,SAASU,GAAapqB,GAAmC;AAC9D,SAAO,IAAIkpB,GAAA,EAAY,MAAMlpB,CAAG;AAClC;AC3LA,SAASqqB,GAAcnpB,GAAmC;AACxD,QAAMopB,IAAOhF,GAAiBpkB,CAAO,GAC/BqpB,IAAU1B,GAAeyB,CAAI;AACnC,SAAOF,GAAaG,CAAO;AAC7B;AAGO,SAASC,GAAItpB,GAAmC;AACrD,SAAOmpB,GAAcnpB,CAAO;AAC9B;AAGO,SAASupB,GAAOvpB,GAA6B;AAClD,QAAM4M,IAAQuc,GAAcnpB,CAAO,GAC7B6L,IAAO,IAAI,WAAWe,EAAM,UAAU;AAC5C,SAAAf,EAAK,IAAIe,CAAK,GACP,IAAI,KAAK,CAACf,CAAI,GAAG,EAAE,MAAM,mBAAmB;AACrD;AAGO,SAAS2d,GAAMxpB,GAA+B;AACnD,SAAO,IAAI,gBAAgBupB,GAAOvpB,CAAO,CAAC;AAC5C;AAGO,SAASypB,GACdzpB,GACA0O,IAAW,gBACL;AACN,QAAMjD,IAAM+d,GAAMxpB,CAAO,GACnB2O,IAAS,SAAS,cAAc,GAAG;AACzC,EAAAA,EAAO,OAAOlD,GACdkD,EAAO,WAAWD,GAClBC,EAAO,MAAA,GACP,IAAI,gBAAgBlD,CAAG;AACzB;AAGA,eAAsBie,GAAe1pB,GAA4C;AAC/E,SAAOmpB,GAAcnpB,CAAO;AAC9B;AAEA,eAAsB2pB,GAAa3pB,GAAsC;AACvE,SAAOupB,GAAOvpB,CAAO;AACvB;"}