@unlev/exeq 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +6 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +146 -63
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +146 -63
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/utils/apiKey.ts","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx","../src/utils/formulaResolver.ts","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, FIELD_DEFAULTS, createField, getSignerColor, uniqueLabel, generateId } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel } from './FieldPropertyPanel';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport '@/styles/pdf-builder.css';\n\nexport interface DesignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** URL to a PDF to pre-load */\n initialPdfUrl?: string;\n /** Existing template to load (fields, signer roles, and PDF URL) */\n initialTemplate?: Template;\n /** Called when the user clicks \"Export Template\" */\n onSave?: (template: Template) => void;\n /** When true, the built-in header bar is hidden (use headerPortalRef to place buttons externally) */\n hideHeader?: boolean;\n /** Ref to an element where the header action buttons should be portalled into */\n headerPortalRef?: React.RefObject<HTMLElement | null>;\n}\n\nconst FIELD_TYPE_META: { type: FieldType; label: string; icon: string; group?: string }[] = [\n { type: 'text', label: 'Text', icon: 'T' },\n { type: 'signature', label: 'Signature', icon: '✍' },\n { type: 'signed-date', label: 'Date', icon: '📅' },\n { type: 'checkbox', label: 'Checkbox', icon: '☑' },\n { type: 'initials', label: 'Initials', icon: 'IN' },\n { type: 'blackout', label: 'Blackout', icon: '■', group: 'redact' },\n { type: 'whiteout', label: 'Whiteout', icon: '□', group: 'redact' },\n];\n\nexport function DesignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n onSave,\n hideHeader,\n headerPortalRef,\n}: DesignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"designer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>(initialTemplate?.fields ?? []);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>(initialTemplate?.signerRoles ?? [...DEFAULT_SIGNER_ROLES]);\n const [activeRole, setActiveRole] = useState('Sender');\n const [activeFieldType, setActiveFieldType] = useState<FieldType>('text');\n const [loading, setLoading] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [rightTab, setRightTab] = useState<'properties' | 'fields'>('properties');\n const [isAddingRole, setIsAddingRole] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n const [draggingFieldType, setDraggingFieldType] = useState<FieldType | null>(null);\n const [panelWidth, setPanelWidth] = useState(380);\n const [clipboardField, setClipboardField] = useState<FormField | null>(null);\n const dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\n const lastStylesRef = useRef<Partial<Record<FieldType, { width: number; height: number; fontSize: number; inkColor?: string }>>>({});\n\n // Load PDF from props, URL params, or postMessage\n useEffect(() => {\n const pdfUrl = initialPdfUrl || initialTemplate?.pdfUrl;\n if (pdfUrl) {\n loadPdf(pdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const paramPdf = params.get('pdf');\n if (paramPdf) {\n loadPdf(paramPdf);\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-pdf' && e.data.url) {\n loadPdf(e.data.url);\n }\n if (e.data?.type === 'load-template') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.signerRoles) setSignerRoles(e.data.signerRoles);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialPdfUrl, initialTemplate]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const handleFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result) loadPdf(reader.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(file);\n }, [loadPdf]);\n\n const handlePageClick = useCallback((page: number, x: number, y: number) => {\n const field = createField(activeFieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[activeFieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldId(styledField.id);\n setRightTab('properties');\n }, [activeFieldType, activeRole, fields]);\n\n const handleFieldMove = useCallback((id: string, page: number, x: number, y: number) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, page, x, y } : f));\n }, []);\n\n const handleFieldResize = useCallback((id: string, width: number, height: number) => {\n setFields(prev => {\n const field = prev.find(f => f.id === id);\n if (field) {\n const existing = lastStylesRef.current[field.type] || {};\n lastStylesRef.current[field.type] = { ...existing, width, height, fontSize: field.fontSize };\n }\n return prev.map(f => f.id === id ? { ...f, width, height } : f);\n });\n }, []);\n\n const handleFieldUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => {\n if (updates.label !== undefined) {\n const otherLabels = prev.filter(f => f.id !== id).map(f => f.label);\n updates.label = uniqueLabel(updates.label, otherLabels);\n }\n const updated = prev.map(f => f.id === id ? { ...f, ...updates } : f);\n\n // Track style changes as sticky defaults for new fields of the same type\n const field = prev.find(f => f.id === id);\n if (field && (updates.fontSize !== undefined || updates.width !== undefined || updates.height !== undefined || updates.inkColor !== undefined)) {\n const merged = { ...field, ...updates };\n lastStylesRef.current[field.type] = {\n width: merged.width,\n height: merged.height,\n fontSize: merged.fontSize,\n inkColor: merged.inkColor,\n };\n }\n\n return updated;\n });\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n if (selectedFieldId === id) setSelectedFieldId(null);\n }, [selectedFieldId]);\n\n const handleAddRole = useCallback(() => {\n const name = newRoleName.trim();\n if (name && !signerRoles.includes(name)) {\n setSignerRoles(prev => [...prev, name]);\n }\n setNewRoleName('');\n setIsAddingRole(false);\n }, [newRoleName, signerRoles]);\n\n const handleRemoveRole = useCallback((role: string) => {\n setSignerRoles(prev => prev.filter(r => r !== role));\n setFields(prev => prev.map(f => f.assignee === role ? { ...f, assignee: signerRoles[0] } : f));\n if (activeRole === role) setActiveRole(signerRoles[0]);\n }, [signerRoles, activeRole]);\n\n const handleExport = useCallback(() => {\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n\n if (onSave) {\n onSave(template);\n } else {\n const json = JSON.stringify(template, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'template.json';\n a.click();\n URL.revokeObjectURL(url);\n }\n\n window.parent?.postMessage({ type: 'template-saved', template }, '*');\n }, [fields, signerRoles, pdfSource, onSave]);\n\n // Drag from palette\n const handlePaletteDragStart = useCallback((e: React.DragEvent, type: FieldType) => {\n setDraggingFieldType(type);\n e.dataTransfer.setData('application/exeq-field-type', type);\n e.dataTransfer.effectAllowed = 'copy';\n\n // Create a styled drag ghost\n const ghost = document.createElement('div');\n ghost.className = 'palette-drag-ghost';\n ghost.textContent = FIELD_TYPE_META.find(f => f.type === type)?.label || type;\n ghost.style.cssText = `\n position: fixed; top: -200px; left: -200px;\n padding: 6px 16px; background: ${getSignerColor(activeRole)};\n color: #fff; border-radius: 4px; font-size: 12px;\n font-family: system-ui; pointer-events: none; white-space: nowrap;\n `;\n document.body.appendChild(ghost);\n e.dataTransfer.setDragImage(ghost, 40, 16);\n dragGhostRef.current = ghost;\n }, [activeRole]);\n\n const handlePaletteDragEnd = useCallback(() => {\n setDraggingFieldType(null);\n if (dragGhostRef.current) {\n document.body.removeChild(dragGhostRef.current);\n dragGhostRef.current = null;\n }\n }, []);\n\n const handleDropOnPage = useCallback((page: number, x: number, y: number, fieldType: FieldType) => {\n const field = createField(fieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[fieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldId(styledField.id);\n setRightTab('properties');\n }, [activeRole, fields]);\n\n // Delete key handler — only when no input/textarea/select is focused\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Delete' && e.key !== 'Backspace') return;\n if (!selectedFieldId) return;\n\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n e.preventDefault();\n if (window.confirm('Delete this field?')) {\n handleFieldDelete(selectedFieldId);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldId, handleFieldDelete]);\n\n // Copy/paste handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n const isMod = e.metaKey || e.ctrlKey;\n\n // Copy (Cmd/Ctrl+C)\n if (isMod && e.key === 'c' && selectedFieldId) {\n const field = fields.find(f => f.id === selectedFieldId);\n if (field) {\n e.preventDefault();\n setClipboardField(field);\n }\n }\n\n // Paste (Cmd/Ctrl+V)\n if (isMod && e.key === 'v' && clipboardField) {\n e.preventDefault();\n const existingLabels = fields.map(f => f.label);\n const newField: FormField = {\n ...clipboardField,\n id: generateId(),\n label: uniqueLabel(clipboardField.label, existingLabels),\n x: clipboardField.x + 2,\n y: clipboardField.y + 2,\n value: '',\n };\n setFields(prev => [...prev, newField]);\n setSelectedFieldId(newField.id);\n setRightTab('properties');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldId, fields, clipboardField]);\n\n // Resize handle for right panel\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n resizingRef.current = true;\n const startX = e.clientX;\n const startWidth = panelWidth;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizingRef.current) return;\n const delta = startX - e.clientX;\n setPanelWidth(Math.max(280, Math.min(600, startWidth + delta)));\n };\n\n const handleMouseUp = () => {\n resizingRef.current = false;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [panelWidth]);\n\n // Sort fields by document position: page, then top-to-bottom, then left-to-right\n const sortedFields = [...fields].sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n // Fields within ~2% vertical distance are in the same \"band\"\n const bandThreshold = 2;\n if (Math.abs(a.y - b.y) > bandThreshold) return a.y - b.y;\n return a.x - b.x;\n });\n\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n\n const renderFieldContent = useCallback((field: FormField) => {\n if (field.type === 'blackout' || field.type === 'whiteout') {\n return null; // Rendered purely via background color on the overlay\n }\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return <img src={field.value} alt={field.label} className=\"field-signature-preview\" />;\n }\n }\n const inkColor = field.inkColor || '#000000';\n return (\n <div\n className=\"field-overlay-placeholder\"\n style={{ color: field.value ? inkColor : undefined, fontSize: `${field.fontSize * 0.6}px` }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, []);\n\n const headerButtons = pages.length > 0 ? (\n <>\n <label className=\"header-btn header-btn-outline\">\n Change PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n <button onClick={handleExport} className=\"header-btn header-btn-primary\">\n Export Template\n </button>\n </>\n ) : null;\n\n return (\n <div className=\"designer-layout\">\n {/* Portal header buttons into external container if provided */}\n {headerPortalRef?.current && headerButtons && createPortal(headerButtons, headerPortalRef.current)}\n\n {/* Built-in header (hidden when hideHeader or headerPortalRef is used) */}\n {!hideHeader && !headerPortalRef && (\n <div className=\"designer-header\">\n <div className=\"designer-header-right\">\n {headerButtons}\n </div>\n </div>\n )}\n\n <div className=\"designer-body\">\n {/* ── Left palette ──────────────────────── */}\n {pages.length > 0 && (\n <div className=\"designer-palette\">\n {/* Role selector first */}\n <div className=\"palette-heading\">New Field Role</div>\n <div className=\"palette-role-section\">\n <select\n className=\"palette-role-select\"\n value={activeRole}\n onChange={e => setActiveRole(e.target.value)}\n style={{ borderColor: getSignerColor(activeRole), color: getSignerColor(activeRole) }}\n >\n {signerRoles.map(role => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n {isAddingRole ? (\n <div className=\"palette-role-add-inline\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAddRole()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAddRole}>Add</button>\n <button onClick={() => { setIsAddingRole(false); setNewRoleName(''); }}>Cancel</button>\n </div>\n ) : (\n <button className=\"palette-role-add-link\" onClick={() => setIsAddingRole(true)}>\n + Add Role\n </button>\n )}\n </div>\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Fields</div>\n {FIELD_TYPE_META.filter(f => !f.group).map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Redact</div>\n {FIELD_TYPE_META.filter(f => f.group === 'redact').map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* ── Center: PDF area ─────────────────── */}\n <div className=\"designer-pdf-area\">\n {loading && <div className=\"loading-indicator\">Loading PDF...</div>}\n {!pages.length && !loading && (\n <div className=\"empty-state\">\n <h2>Open a PDF to get started</h2>\n <p>Select a PDF from your device to begin. Your file stays on your computer — nothing is uploaded.</p>\n <label className=\"upload-btn upload-btn-large\">\n Select PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n </div>\n )}\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={(id) => { setSelectedFieldId(id); if (id) setRightTab('properties'); }}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\n onPageClick={handlePageClick}\n onDropField={handleDropOnPage}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n {/* ── Right panel ──────────────────────── */}\n {pages.length > 0 && (\n <>\n <div className=\"panel-resize-handle\" onMouseDown={handleResizeStart} />\n <div className=\"designer-panel\" style={{ width: panelWidth }}>\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Editing as</span>\n <strong>{activeRole}</strong>\n </div>\n {/* Tabs */}\n <div className=\"panel-tabs\">\n <button\n className={`panel-tab ${rightTab === 'properties' ? 'active' : ''}`}\n onClick={() => setRightTab('properties')}\n >\n Properties\n </button>\n <button\n className={`panel-tab ${rightTab === 'fields' ? 'active' : ''}`}\n onClick={() => setRightTab('fields')}\n >\n All Fields{fields.length > 0 ? ` (${fields.length})` : ''}\n </button>\n </div>\n\n {/* Tab content */}\n <div className=\"panel-tab-content\">\n {rightTab === 'properties' && (\n <>\n {selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n />\n {/* Pre-fill area (not for redact fields) */}\n {selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' && (\n <div className=\"prefill-section\">\n <h4>Pre-fill Value</h4>\n {(selectedField.type === 'signature' || selectedField.type === 'initials') ? (\n <SignatureCanvas\n width={panelWidth - 40}\n height={selectedField.type === 'initials' ? 100 : 150}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, { value: dataUrl })}\n initialValue={selectedField.value}\n inkColor={selectedField.inkColor}\n />\n ) : selectedField.type === 'checkbox' ? (\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.checked ? 'true' : '' })}\n />\n Checked\n </label>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.value })}\n placeholder={`Pre-fill ${selectedField.label}`}\n className=\"prefill-input\"\n style={{ color: selectedField.inkColor || '#000000' }}\n />\n )}\n </div>\n )}\n </>\n ) : (\n <div className=\"panel-empty\">\n Click on the PDF to place a field, or select an existing field to edit its properties.\n </div>\n )}\n </>\n )}\n\n {rightTab === 'fields' && (\n <>\n {fields.length === 0 ? (\n <div className=\"panel-empty\">\n No fields yet. Drag a field from the left palette onto the PDF, or click on the PDF to place one.\n </div>\n ) : (\n <div className=\"field-list\">\n {sortedFields.map(f => (\n <div\n key={f.id}\n className={`field-list-item ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => { setSelectedFieldId(f.id); setRightTab('properties'); }}\n >\n <span\n className=\"field-list-dot\"\n style={{ backgroundColor: getSignerColor(f.assignee) }}\n />\n <span className=\"field-list-name\">{f.label}</span>\n <span className=\"field-list-page\">p{f.page + 1}</span>\n {f.required && <span className=\"field-list-required\">*</span>}\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","export function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport type FieldType = 'text' | 'signature' | 'signed-date' | 'checkbox' | 'initials' | 'blackout' | 'whiteout';\n\nexport type TextSubtype = 'freeform' | 'number' | 'date' | 'email' | 'phone';\n\nexport interface FormField {\n id: string;\n type: FieldType;\n textSubtype?: TextSubtype;\n label: string;\n placeholder: string;\n required: boolean;\n assignee: string; // signer role e.g. \"Sender\", \"Signer 1\"\n page: number; // 0-indexed page number\n x: number; // percentage of page width (0-100)\n y: number; // percentage of page height (0-100)\n width: number; // percentage of page width\n height: number; // percentage of page height\n fontSize: number; // in points\n value: string; // pre-filled value or current value\n inkColor?: string; // ink color for text/signature fields (default: '#000000')\n letterSpacing?: number; // extra spacing between characters in points (default: 0)\n lineHeight?: number; // line height multiplier (default: 1.2)\n maxLength?: number; // max character count (0 = unlimited)\n fontFamily?: string; // font family (default: 'Helvetica')\n options?: string[]; // predefined options for dropdown/radio selection\n formula?: string; // template expression e.g. \"{{Date Field | month}}\" — auto-computed from other fields\n}\n\nexport interface Template {\n fields: FormField[];\n signerRoles: string[];\n pdfUrl: string;\n}\n\nexport const DEFAULT_SIGNER_ROLES = ['Sender', 'Signer 1'];\n\nexport const SIGNER_ROLE_COLORS: Record<string, string> = {\n 'Sender': '#6366f1',\n 'Signer 1': '#22c55e',\n 'Signer 2': '#f59e0b',\n 'Signer 3': '#ef4444',\n 'Signer 4': '#06b6d4',\n 'Signer 5': '#d946ef',\n};\n\nexport function getSignerColor(role: string): string {\n return SIGNER_ROLE_COLORS[role] || '#888888';\n}\n\nexport const FONT_FAMILIES = [\n { value: 'Helvetica', label: 'Helvetica' },\n { value: 'Courier', label: 'Courier New' },\n { value: 'TimesRoman', label: 'Times New Roman' },\n] as const;\n\nexport const FIELD_DEFAULTS: Record<FieldType, Partial<FormField>> = {\n text: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Enter text',\n textSubtype: 'freeform',\n },\n signature: {\n width: 20,\n height: 6,\n fontSize: 12,\n placeholder: 'Sign here',\n },\n 'signed-date': {\n width: 15,\n height: 3,\n fontSize: 12,\n placeholder: 'Date',\n },\n checkbox: {\n width: 2.5,\n height: 2.5,\n fontSize: 12,\n placeholder: '',\n },\n initials: {\n width: 8,\n height: 5,\n fontSize: 12,\n placeholder: 'Initials',\n },\n blackout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n whiteout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n};\n\nconst TYPE_LABELS: Record<FieldType, string> = {\n text: 'Text Field',\n signature: 'Signature',\n 'signed-date': 'Signed Date',\n checkbox: 'Checkbox',\n initials: 'Initials',\n blackout: 'Blackout',\n whiteout: 'Whiteout',\n};\n\n/** Given a desired label and a list of existing labels, return a unique label by appending a number if needed. */\nexport function uniqueLabel(desired: string, existingLabels: string[]): string {\n const lower = desired.toLowerCase();\n if (!existingLabels.some(l => l.toLowerCase() === lower)) return desired;\n let i = 2;\n while (existingLabels.some(l => l.toLowerCase() === `${lower} ${i}`)) i++;\n return `${desired} ${i}`;\n}\n\nexport function createField(\n type: FieldType,\n assignee: string,\n page: number,\n x: number,\n y: number,\n existingFields?: FormField[],\n): FormField {\n const defaults = FIELD_DEFAULTS[type];\n const baseLabel = TYPE_LABELS[type];\n const existingLabels = existingFields?.map(f => f.label) ?? [];\n return {\n id: generateId(),\n type,\n label: uniqueLabel(baseLabel, existingLabels),\n placeholder: defaults.placeholder || '',\n required: type === 'checkbox' || type === 'blackout' || type === 'whiteout' ? false : true,\n assignee,\n page,\n x,\n y,\n width: defaults.width || 20,\n height: defaults.height || 3,\n fontSize: defaults.fontSize || 12,\n value: '',\n ...(type === 'text' ? { textSubtype: defaults.textSubtype as TextSubtype } : {}),\n };\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\n// Configure the worker\nif (typeof window !== 'undefined') {\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.mjs`;\n}\n\nexport interface RenderedPage {\n pageNumber: number;\n dataUrl: string;\n width: number;\n height: number;\n}\n\nexport async function renderPdfPages(\n source: string | ArrayBuffer,\n scale: number = 2,\n): Promise<RenderedPage[]> {\n const loadingTask = pdfjsLib.getDocument(\n typeof source === 'string' ? { url: source } : { data: source }\n );\n const pdf = await loadingTask.promise;\n const pages: RenderedPage[] = [];\n\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n pages.push({\n pageNumber: i,\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n });\n }\n\n return pages;\n}\n","'use client';\n\nimport { useRef, useCallback } from 'react';\nimport type { FormField, FieldType } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface PdfViewerProps {\n pages: RenderedPage[];\n fields: FormField[];\n selectedFieldId: string | null;\n onSelectField: (id: string | null) => void;\n onFieldMove?: (id: string, page: number, x: number, y: number) => void;\n onFieldResize?: (id: string, width: number, height: number) => void;\n onPageClick?: (page: number, x: number, y: number) => void;\n onDropField?: (page: number, x: number, y: number, fieldType: FieldType) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldId,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\n mode,\n currentSigner,\n renderFieldContent,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handlePageClick = useCallback((e: React.MouseEvent<HTMLDivElement>, pageIndex: number) => {\n const target = e.target as HTMLElement;\n if (target.closest('.field-overlay')) return;\n\n if (onPageClick) {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onPageClick(pageIndex, x, y);\n } else {\n onSelectField(null);\n }\n }, [onPageClick, onSelectField]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n if (e.dataTransfer.types.includes('application/exeq-field-type')) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n }\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, pageIndex: number) => {\n const fieldType = e.dataTransfer.getData('application/exeq-field-type') as FieldType;\n if (!fieldType || !onDropField) return;\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onDropField(pageIndex, x, y, fieldType);\n }, [onDropField]);\n\n return (\n <div className=\"pdf-viewer\" ref={containerRef}>\n {pages.map((page, pageIndex) => {\n const pageFields = fields.filter(f => f.page === pageIndex);\n return (\n <div\n key={pageIndex}\n className=\"pdf-page\"\n style={{ aspectRatio: `${page.width} / ${page.height}` }}\n onClick={(e) => handlePageClick(e, pageIndex)}\n onDragOver={handleDragOver}\n onDrop={(e) => handleDrop(e, pageIndex)}\n data-page={pageIndex}\n >\n <img\n src={page.dataUrl}\n alt={`Page ${pageIndex + 1}`}\n className=\"pdf-page-image\"\n draggable={false}\n />\n {pageFields.map(field => (\n <FieldOverlayItem\n key={field.id}\n field={field}\n isSelected={field.id === selectedFieldId}\n onSelect={() => onSelectField(field.id)}\n onMove={onFieldMove}\n onResize={onFieldResize}\n mode={mode}\n currentSigner={currentSigner}\n renderContent={renderFieldContent}\n />\n ))}\n </div>\n );\n })}\n </div>\n );\n}\n\ninterface FieldOverlayItemProps {\n field: FormField;\n isSelected: boolean;\n onSelect: () => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n onSelect,\n onMove,\n onResize,\n mode,\n currentSigner,\n renderContent,\n}: FieldOverlayItemProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dragStartRef = useRef<{ startX: number; startY: number; fieldX: number; fieldY: number } | null>(null);\n const resizeStartRef = useRef<{ startX: number; startY: number; fieldW: number; fieldH: number } | null>(null);\n\n const isRedact = field.type === 'blackout' || field.type === 'whiteout';\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\n const isInactiveSigner = mode === 'signer' && !isRedact && field.assignee !== currentSigner;\n const color = isInactiveSigner ? '#cccccc' : getSignerColor(field.assignee);\n const isPreFilled = !isEditable && !!field.value;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onMove) return;\n e.preventDefault();\n e.stopPropagation();\n onSelect();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldX: field.x,\n fieldY: field.y,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((e.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((e.clientY - dragStartRef.current.startY) / rect.height) * 100;\n const newX = Math.max(0, Math.min(100 - field.width, dragStartRef.current.fieldX + dx));\n const newY = Math.max(0, Math.min(100 - field.height, dragStartRef.current.fieldY + dy));\n onMove(field.id, field.page, newX, newY);\n };\n\n const handleMouseUp = () => {\n dragStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onMove, onSelect]);\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onResize) return;\n e.preventDefault();\n e.stopPropagation();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n resizeStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldW: field.width,\n fieldH: field.height,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dw = ((e.clientX - resizeStartRef.current.startX) / rect.width) * 100;\n const dh = ((e.clientY - resizeStartRef.current.startY) / rect.height) * 100;\n const newW = Math.max(2, Math.min(100 - field.x, resizeStartRef.current.fieldW + dw));\n const newH = Math.max(1.5, Math.min(100 - field.y, resizeStartRef.current.fieldH + dh));\n onResize(field.id, newW, newH);\n };\n\n const handleMouseUp = () => {\n resizeStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onResize]);\n\n return (\n <div\n ref={overlayRef}\n className={`field-overlay ${isSelected ? 'selected' : ''} ${isEditable ? 'editable' : 'readonly'} ${isPreFilled ? 'prefilled' : ''} ${isRedact ? 'redact' : ''} ${isInactiveSigner ? 'inactive-signer' : ''}`}\n style={{\n left: `${field.x}%`,\n top: `${field.y}%`,\n width: `${field.width}%`,\n height: `${field.height}%`,\n borderColor: isRedact ? (field.type === 'blackout' ? '#666' : '#bbb') : color,\n borderStyle: isRedact ? 'dashed' : 'solid',\n backgroundColor: isRedact\n ? (field.type === 'blackout' ? '#000000' : '#ffffff')\n : isInactiveSigner ? '#f5f5f5' : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? 'move' : (isInactiveSigner ? 'default' : 'default'),\n pointerEvents: (mode === 'signer' && (isRedact || isInactiveSigner)) ? 'none' : undefined,\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\n onMouseDown={handleMouseDown}\n >\n {mode === 'designer' && !isRedact && (\n <div className=\"field-overlay-label\" style={{ backgroundColor: color }}>\n {field.label}\n </div>\n )}\n\n {renderContent ? renderContent(field) : (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n )}\n\n {mode === 'designer' && isSelected && (\n <div\n className=\"field-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor, FONT_FAMILIES } from '@/types/pdf-builder';\n\nconst INK_COLORS = [\n { value: '#000000', label: 'Black' },\n { value: '#1a56db', label: 'Blue' },\n];\n\ninterface FieldPropertyPanelProps {\n field: FormField;\n signerRoles: string[];\n onUpdate: (id: string, updates: Partial<FormField>) => void;\n onDelete: (id: string) => void;\n}\n\nexport function FieldPropertyPanel({ field, signerRoles, onUpdate, onDelete }: FieldPropertyPanelProps) {\n const color = getSignerColor(field.assignee);\n const isRedactField = field.type === 'blackout' || field.type === 'whiteout';\n const isTextField = field.type === 'text' || field.type === 'signed-date';\n const showInkColor = field.type === 'text' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\n const [newOption, setNewOption] = useState('');\n\n return (\n <div className=\"field-property-panel\">\n <div className=\"panel-header\">\n <h3 style={{ color }}>\n {field.label}\n </h3>\n <button onClick={() => onDelete(field.id)} className=\"panel-delete-btn\">\n Delete\n </button>\n </div>\n\n <div className=\"panel-field\">\n <label>Label</label>\n <input\n type=\"text\"\n value={field.label}\n onChange={e => onUpdate(field.id, { label: e.target.value })}\n />\n </div>\n\n {!isRedactField && (\n <div className=\"panel-field\">\n <label>Field Type</label>\n <select\n value={field.type}\n onChange={e => onUpdate(field.id, { type: e.target.value as FieldType })}\n >\n <option value=\"text\">Text</option>\n <option value=\"signature\">Signature</option>\n <option value=\"signed-date\">Signed Date</option>\n <option value=\"checkbox\">Checkbox</option>\n <option value=\"initials\">Initials</option>\n </select>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Text Type</label>\n <select\n value={field.textSubtype || 'freeform'}\n onChange={e => onUpdate(field.id, { textSubtype: e.target.value as TextSubtype })}\n >\n <option value=\"freeform\">Freeform</option>\n <option value=\"number\">Number</option>\n <option value=\"date\">Date</option>\n <option value=\"email\">Email</option>\n <option value=\"phone\">Phone</option>\n </select>\n </div>\n )}\n\n {!isRedactField && (\n <div className=\"panel-field\">\n <label>Assigned To</label>\n <select\n value={field.assignee}\n onChange={e => onUpdate(field.id, { assignee: e.target.value })}\n >\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>\n {role}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!isRedactField && (\n <div className=\"panel-field\">\n <label>Placeholder</label>\n <input\n type=\"text\"\n value={field.placeholder}\n onChange={e => onUpdate(field.id, { placeholder: e.target.value })}\n />\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Formula</label>\n <input\n type=\"text\"\n value={field.formula || ''}\n onChange={e => onUpdate(field.id, { formula: e.target.value || undefined })}\n placeholder='e.g. {{Date Field | month}}'\n />\n {field.formula && (\n <span className=\"panel-hint\">This field auto-computes from other fields. Signer cannot edit it.</span>\n )}\n </div>\n )}\n\n {!isRedactField && field.type !== 'checkbox' && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={e => onUpdate(field.id, { required: e.target.checked })}\n />\n Required\n </label>\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Font</label>\n <select\n value={field.fontFamily || 'Helvetica'}\n onChange={e => onUpdate(field.id, { fontFamily: e.target.value })}\n >\n {FONT_FAMILIES.map(f => (\n <option key={f.value} value={f.value}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={field.fontSize}\n onChange={e => onUpdate(field.id, { fontSize: Number(e.target.value) })}\n />\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Letter Spacing</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"20\"\n step=\"0.5\"\n value={field.letterSpacing || 0}\n onChange={e => onUpdate(field.id, { letterSpacing: Number(e.target.value) })}\n />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Line Height</label>\n <input\n type=\"number\"\n min=\"0.8\"\n max=\"3\"\n step=\"0.1\"\n value={field.lineHeight || 1.2}\n onChange={e => onUpdate(field.id, { lineHeight: Number(e.target.value) })}\n />\n </div>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Max Characters (0 = unlimited)</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"9999\"\n value={field.maxLength || 0}\n onChange={e => onUpdate(field.id, { maxLength: Number(e.target.value) })}\n />\n </div>\n )}\n\n {showInkColor && (\n <div className=\"panel-field\">\n <label>Ink Color</label>\n <div className=\"ink-color-picker\">\n {INK_COLORS.map(c => (\n <button\n key={c.value}\n className={`ink-color-swatch ${(field.inkColor || '#000000') === c.value ? 'active' : ''}`}\n style={{ backgroundColor: c.value }}\n onClick={() => onUpdate(field.id, { inkColor: c.value })}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Predefined Options</label>\n <div className=\"panel-options-list\">\n {(field.options || []).map((opt, i) => (\n <div key={i} className=\"panel-option-item\">\n <span>{opt}</span>\n <button\n className=\"panel-option-remove\"\n onClick={() => {\n const updated = (field.options || []).filter((_, j) => j !== i);\n onUpdate(field.id, { options: updated.length > 0 ? updated : undefined });\n }}\n >\n ×\n </button>\n </div>\n ))}\n <div className=\"panel-option-add\">\n <input\n type=\"text\"\n value={newOption}\n onChange={e => setNewOption(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter' && newOption.trim()) {\n onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] });\n setNewOption('');\n }\n }}\n placeholder=\"Add option...\"\n />\n <button\n onClick={() => {\n if (newOption.trim()) {\n onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] });\n setNewOption('');\n }\n }}\n >\n +\n </button>\n </div>\n </div>\n {(field.options?.length ?? 0) > 0 && (\n <span className=\"panel-hint\">Signer will choose from these options via dropdown</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport { getStroke } from 'perfect-freehand';\n\ninterface SignatureCanvasProps {\n width?: number;\n height?: number;\n onSign: (dataUrl: string) => void;\n initialValue?: string;\n className?: string;\n inkColor?: string;\n}\n\nfunction getSvgPathFromStroke(stroke: number[][]) {\n if (!stroke.length) return '';\n\n const d = stroke.reduce(\n (acc, [x0, y0], i, arr) => {\n const [x1, y1] = arr[(i + 1) % arr.length];\n acc.push(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2);\n return acc;\n },\n ['M', ...stroke[0], 'Q'],\n );\n\n d.push('Z');\n return d.join(' ');\n}\n\nexport function SignatureCanvas({\n width = 400,\n height = 150,\n onSign,\n initialValue,\n className,\n inkColor = '#000000',\n}: SignatureCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [paths, setPaths] = useState<number[][][]>([]);\n const [currentPath, setCurrentPath] = useState<number[][] | null>(null);\n const [isEmpty, setIsEmpty] = useState(!initialValue);\n\n // Draw initial value if provided\n useEffect(() => {\n if (initialValue && canvasRef.current) {\n const ctx = canvasRef.current.getContext('2d')!;\n const img = new Image();\n img.onload = () => {\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n };\n img.src = initialValue;\n }\n }, [initialValue, width, height]);\n\n // Redraw all paths whenever they change\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n\n const allPaths = currentPath ? [...paths, currentPath] : paths;\n\n for (const path of allPaths) {\n const stroke = getStroke(path, {\n size: 3,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n });\n const pathStr = getSvgPathFromStroke(stroke);\n const path2d = new Path2D(pathStr);\n ctx.fillStyle = inkColor;\n ctx.fill(path2d);\n }\n }, [paths, currentPath, width, height]);\n\n const getPoint = useCallback((e: React.PointerEvent) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n const style = getComputedStyle(canvas);\n const borderL = parseFloat(style.borderLeftWidth) || 0;\n const borderT = parseFloat(style.borderTopWidth) || 0;\n const borderR = parseFloat(style.borderRightWidth) || 0;\n const borderB = parseFloat(style.borderBottomWidth) || 0;\n // Content area excludes borders\n const contentW = rect.width - borderL - borderR;\n const contentH = rect.height - borderT - borderB;\n const scaleX = canvas.width / contentW;\n const scaleY = canvas.height / contentH;\n return [\n (e.clientX - rect.left - borderL) * scaleX,\n (e.clientY - rect.top - borderT) * scaleY,\n e.pressure,\n ];\n }, []);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n setCurrentPath([getPoint(e)]);\n }, [getPoint]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!currentPath) return;\n e.preventDefault();\n setCurrentPath([...currentPath, getPoint(e)]);\n }, [currentPath, getPoint]);\n\n const handlePointerUp = useCallback(() => {\n if (!currentPath) return;\n setPaths(prev => [...prev, currentPath]);\n setCurrentPath(null);\n setIsEmpty(false);\n\n // Export after state updates\n requestAnimationFrame(() => {\n if (canvasRef.current) {\n onSign(canvasRef.current.toDataURL('image/png'));\n }\n });\n }, [currentPath, onSign]);\n\n const handleClear = useCallback(() => {\n setPaths([]);\n setCurrentPath(null);\n setIsEmpty(true);\n const canvas = canvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n onSign('');\n }\n }, [width, height, onSign]);\n\n return (\n <div className={`signature-canvas-wrapper ${className || ''}`}>\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n className=\"signature-canvas\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{ touchAction: 'none' }}\n />\n <div className=\"signature-canvas-actions\">\n {!isEmpty && (\n <button type=\"button\" onClick={handleClear} className=\"signature-clear-btn\">\n Clear\n </button>\n )}\n {isEmpty && <span className=\"signature-hint\">Draw your signature above</span>}\n </div>\n </div>\n );\n}\n","// Valid API keys. In the future this will validate against a server.\nconst VALID_KEYS = new Set([\n 'exeq_live_2024',\n process.env.NEXT_PUBLIC_EXEQ_API_KEY,\n].filter(Boolean));\n\nexport function isValidApiKey(key: string | undefined): boolean {\n if (!key) return false;\n return VALID_KEYS.has(key);\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { FormField, Template } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { generateFilledPdf, downloadPdf, postPdfToCallback } from '@/utils/pdfFiller';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldNavigator } from './FieldNavigator';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport { resolveAllFormulas } from '@/utils/formulaResolver';\nimport type { TransformMap } from '@/utils/formulaResolver';\nimport '@/styles/pdf-builder.css';\n\nexport interface SignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** If provided, use these instead of URL params / postMessage */\n initialPdfUrl?: string;\n initialTemplate?: Template;\n initialSigner?: string;\n callbackUrl?: string;\n onComplete?: (pdfBlob: Blob) => void;\n /** Pre-fill field values by label or ID. Keys are matched against field labels (case-insensitive) first, then field IDs. */\n initialValues?: Record<string, string>;\n /** Label for the final submit button (default: \"Complete\") */\n submitLabel?: string;\n /** Signing order for multi-party documents. Signers complete sequentially; only the current signer's fields are active. If omitted, non-Sender roles go first, then Sender last. */\n signerOrder?: string[];\n /** Custom transform functions for formula fields. Keys are transform names referenced in formulas like {{Field | name}}. Merges with built-in transforms. */\n transforms?: TransformMap;\n}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\n submitLabel,\n signerOrder: signerOrderProp,\n transforms,\n}: SignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"signer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>([]);\n const [currentSignerIndex, setCurrentSignerIndex] = useState(() => {\n if (initialSigner && signerOrderProp) {\n const idx = signerOrderProp.indexOf(initialSigner);\n return idx >= 0 ? idx : 0;\n }\n return 0;\n });\n const initializedRef = useRef(false);\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [callbackUrl, setCallbackUrl] = useState(initialCallbackUrl || '');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Derive the signing order: use explicit prop, or default to non-Sender roles first, Sender last\n const signerOrder = signerOrderProp\n || (signerRoles.length > 0\n ? [...signerRoles.filter(r => r !== 'Sender'), ...signerRoles.filter(r => r === 'Sender')]\n : [initialSigner || 'Signer 1']);\n const signer = signerOrder[currentSignerIndex] || signerOrder[0] || 'Signer 1';\n const isLastSigner = currentSignerIndex >= signerOrder.length - 1;\n const isMultiSigner = signerOrder.length > 1;\n\n // Skip signers whose fields are all already filled (e.g. via initialValues/pre-fill)\n useEffect(() => {\n if (fields.length === 0 || !isMultiSigner) return;\n const signerFields = fields.filter(f =>\n f.assignee === signer && f.type !== 'blackout' && f.type !== 'whiteout'\n );\n const allFilled = signerFields.length > 0 && signerFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n });\n if (allFilled && !isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n }\n }, [currentSignerIndex, fields, signer, isLastSigner, isMultiSigner]);\n\n // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\n if (initialTemplate.signerRoles) setSignerRoles(initialTemplate.signerRoles);\n\n // Apply initialValues by matching label (case-insensitive) or ID\n if (initialValues) {\n templateFields = templateFields.map(f => {\n const byLabel = Object.entries(initialValues).find(\n ([key]) => key.toLowerCase() === f.label.toLowerCase()\n );\n const byId = initialValues[f.id];\n const value = byLabel?.[1] ?? byId;\n return value !== undefined ? { ...f, value } : f;\n });\n }\n\n // On re-init (e.g. remount), preserve values already filled by any signer\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return templateFields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(templateFields);\n initializedRef.current = true;\n }\n\n if (initialPdfUrl) loadPdf(initialPdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n const fieldsUrl = params.get('fields');\n const cbUrl = params.get('callbackUrl');\n\n if (cbUrl) setCallbackUrl(cbUrl);\n\n if (pdfUrl) loadPdf(pdfUrl);\n if (fieldsUrl) {\n fetch(fieldsUrl)\n .then(r => r.json())\n .then((template: Template) => {\n if (template.signerRoles) setSignerRoles(template.signerRoles);\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return template.fields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(template.fields);\n initializedRef.current = true;\n }\n })\n .catch(err => console.error('Failed to load fields:', err));\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-signing') {\n if (e.data.fields) {\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return e.data.fields.map((f: FormField) => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(e.data.fields);\n initializedRef.current = true;\n }\n }\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) {\n const idx = signerOrder.indexOf(e.data.signer);\n if (idx >= 0) setCurrentSignerIndex(idx);\n }\n if (e.data.callbackUrl) setCallbackUrl(e.data.callbackUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialTemplate, initialPdfUrl]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fields this signer needs to fill, sorted by document position (excludes redact fields)\n const editableFields = fields.filter(f => f.assignee === signer && f.type !== 'blackout' && f.type !== 'whiteout' && !f.formula).sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n const bandThreshold = 2;\n if (Math.abs(a.y - b.y) > bandThreshold) return a.y - b.y;\n return a.x - b.x;\n });\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField\n ? selectedField.assignee === signer && selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' && !selectedField.formula\n : false;\n\n const handleFieldUpdate = useCallback((id: string, value: string) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, value } : f));\n }, []);\n\n const handleFieldPropertyUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, ...updates } : f));\n }, []);\n\n const handleNavigate = useCallback((fieldId: string) => {\n setSelectedFieldId(fieldId);\n // Scroll to that field's page\n const field = fields.find(f => f.id === fieldId);\n if (field && containerRef.current) {\n const pageEl = containerRef.current.querySelector(`[data-page=\"${field.page}\"]`);\n if (pageEl) {\n pageEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [fields]);\n\n const allRequiredFilled = editableFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true; // checkbox is always \"filled\"\n return !!f.value;\n });\n\n const handleAdvanceOrSubmit = useCallback(async () => {\n if (!allRequiredFilled) return;\n\n // Intermediate signer: advance to next\n if (!isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n // Scroll PDF area to top\n const pdfArea = containerRef.current?.querySelector('.signer-pdf-area');\n if (pdfArea) {\n pdfArea.scrollTo({ top: 0, behavior: 'smooth' });\n }\n return;\n }\n\n // Final signer: generate PDF\n if (!pdfSource) return;\n setSubmitting(true);\n try {\n const finalFields = resolveAllFormulas(fields, transforms);\n const pdfBytes = await generateFilledPdf(pdfSource, finalFields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n if (onComplete) {\n onComplete(blob);\n }\n\n if (!callbackUrl && !onComplete) {\n downloadPdf(pdfBytes, 'signed-document.pdf');\n }\n\n window.parent?.postMessage({ type: 'signing-complete' }, '*');\n } catch (err) {\n console.error('Failed to generate PDF:', err);\n } finally {\n setSubmitting(false);\n }\n }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete, isLastSigner]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n // Redact fields are visual-only — no interaction in signer mode\n if (field.type === 'blackout' || field.type === 'whiteout') {\n return null;\n }\n\n // Formula fields are always read-only (auto-computed)\n if (field.formula) {\n return (\n <div className=\"field-overlay-value formula\">\n {field.value || '...'}\n </div>\n );\n }\n\n const editable = field.assignee === signer;\n\n if (!editable) {\n // Show pre-filled content as read-only\n if (field.type === 'signature' || field.type === 'initials') {\n return field.value ? (\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n ) : (\n <div className=\"field-overlay-placeholder readonly\">{field.placeholder}</div>\n );\n }\n if (field.type === 'checkbox') {\n return (\n <div className=\"field-checkbox-display readonly\">\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder readonly\">\n {field.value || field.placeholder}\n </div>\n );\n }\n\n // Editable fields\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return (\n <div className=\"field-signature-filled\" onClick={() => handleFieldUpdate(field.id, '')}>\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder editable\">\n {field.placeholder}\n </div>\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <div\n className=\"field-checkbox-display editable\"\n onClick={(e) => {\n e.stopPropagation();\n handleFieldUpdate(field.id, field.value === 'true' ? '' : 'true');\n }}\n >\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n\n if (field.type === 'signed-date') {\n return (\n <div className=\"field-overlay-value\">\n {field.value || new Date().toLocaleDateString()}\n </div>\n );\n }\n\n // Text field — dropdown if options are defined, otherwise input\n const fontStyle = {\n fontSize: `${field.fontSize * 0.6}px`,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing * 0.6}px` : undefined,\n fontFamily: field.fontFamily === 'Courier' ? 'monospace' :\n field.fontFamily === 'TimesRoman' ? 'serif' : undefined,\n };\n\n if (field.options && field.options.length > 0) {\n return (\n <select\n className=\"field-inline-input\"\n value={field.value}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n >\n <option value=\"\">{field.placeholder || 'Select...'}</option>\n {field.options.map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n );\n }\n\n return (\n <input\n type={field.textSubtype === 'email' ? 'email' :\n field.textSubtype === 'number' ? 'number' :\n field.textSubtype === 'phone' ? 'tel' :\n field.textSubtype === 'date' ? 'date' : 'text'}\n className=\"field-inline-input\"\n value={field.value}\n placeholder={field.placeholder}\n maxLength={field.maxLength || undefined}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n />\n );\n }, [signer, handleFieldUpdate, setSelectedFieldId]);\n\n // Auto-fill signed-date fields when signature is filled\n useEffect(() => {\n const sigFields = fields.filter(f => f.assignee === signer && f.type === 'signature' && f.value);\n if (sigFields.length > 0) {\n const dateStr = new Date().toLocaleDateString();\n setFields(prev => prev.map(f => {\n if (f.assignee === signer && f.type === 'signed-date' && !f.value) {\n return { ...f, value: dateStr };\n }\n return f;\n }));\n }\n }, [fields.filter(f => f.type === 'signature' && f.value).length]);\n\n // Resolve formula fields whenever any field value changes\n useEffect(() => {\n const hasFormulas = fields.some(f => f.formula);\n if (!hasFormulas) return;\n const resolved = resolveAllFormulas(fields, transforms);\n // Only update if any computed values actually changed\n const changed = resolved.some((f, i) => f.value !== fields[i].value);\n if (changed) setFields(resolved);\n }, [fields, transforms]);\n\n return (\n <div className=\"signer-layout\" ref={containerRef}>\n {loading && <div className=\"loading-indicator\">Loading document...</div>}\n\n <div className=\"signer-content\">\n <div className=\"signer-pdf-area\">\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\n <div className=\"signer-panel-header\">\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Signing as</span>\n <strong>{signer}</strong>\n </div>\n {isMultiSigner && (\n <div className=\"signer-step-badge\">\n Step {currentSignerIndex + 1} of {signerOrder.length}\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-body\">\n {selectedField && isFieldEditable && (\n <div className=\"signer-field-input\">\n <h3>{selectedField.label}</h3>\n {selectedField.required && <span className=\"required-badge\">Required</span>}\n\n {(selectedField.type === 'signature' || selectedField.type === 'initials') && (\n <SignatureCanvas\n width={280}\n height={selectedField.type === 'initials' ? 80 : 120}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, dataUrl)}\n initialValue={selectedField.value}\n />\n )}\n\n {selectedField.type === 'text' && (\n <>\n {selectedField.options && selectedField.options.length > 0 ? (\n <select\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n className=\"signer-text-input\"\n >\n <option value=\"\">{selectedField.placeholder || 'Select...'}</option>\n {selectedField.options.map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n placeholder={selectedField.placeholder}\n maxLength={selectedField.maxLength || undefined}\n className=\"signer-text-input\"\n />\n )}\n <div className=\"signer-font-size\">\n <label>Font Size</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={selectedField.fontSize}\n onChange={e => handleFieldPropertyUpdate(selectedField.id, { fontSize: Number(e.target.value) })}\n />\n <span>pt</span>\n </div>\n </>\n )}\n\n {selectedField.type === 'checkbox' && (\n <label className=\"signer-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.checked ? 'true' : '')}\n />\n {selectedField.placeholder || 'Check this box'}\n </label>\n )}\n\n {selectedField.type === 'signed-date' && (\n <div className=\"signer-date-display\">\n {selectedField.value || 'Will auto-fill when you sign'}\n </div>\n )}\n </div>\n )}\n\n {selectedField && !isFieldEditable && (\n <div className=\"signer-field-readonly\">\n <h3>{selectedField.label}</h3>\n <p>This field belongs to another signer.</p>\n </div>\n )}\n\n {!selectedField && editableFields.length > 0 && (\n <div className=\"panel-empty\">\n Select a field to fill it in, or use the navigation below.\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-footer\">\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onComplete={handleAdvanceOrSubmit}\n completeLabel={isLastSigner ? (submitLabel || 'Complete') : `Next: ${signerOrder[currentSignerIndex + 1]}`}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\n\nconst FONT_MAP: Record<string, string> = {\n 'Helvetica': StandardFonts.Helvetica,\n 'Courier': StandardFonts.Courier,\n 'TimesRoman': StandardFonts.TimesRoman,\n};\n\nexport async function generateFilledPdf(\n pdfSource: string | ArrayBuffer,\n fields: FormField[],\n): Promise<Uint8Array> {\n let pdfBytes: ArrayBuffer;\n if (typeof pdfSource === 'string') {\n const res = await fetch(pdfSource);\n pdfBytes = await res.arrayBuffer();\n } else {\n pdfBytes = pdfSource;\n }\n\n const pdfDoc = await PDFDocument.load(pdfBytes);\n\n // Embed all needed fonts upfront\n const fontCache = new Map<string, PDFFont>();\n const usedFontKeys = new Set(fields.map(f => f.fontFamily || 'Helvetica'));\n for (const key of usedFontKeys) {\n const stdFont = FONT_MAP[key] || StandardFonts.Helvetica;\n fontCache.set(key, await pdfDoc.embedFont(stdFont));\n }\n\n const pages = pdfDoc.getPages();\n\n function hexToRgb(hex: string) {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n return rgb(r, g, b);\n }\n\n for (const field of fields) {\n const page = pages[field.page];\n if (!page) continue;\n\n const pageWidth = page.getWidth();\n const pageHeight = page.getHeight();\n\n // Convert percentage coordinates to PDF points\n const x = (field.x / 100) * pageWidth;\n const y = pageHeight - ((field.y / 100) * pageHeight) - ((field.height / 100) * pageHeight);\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n // Redact fields always render (no value needed)\n if (field.type === 'blackout' || field.type === 'whiteout') {\n page.drawRectangle({\n x, y, width: w, height: h,\n color: field.type === 'blackout' ? rgb(0, 0, 0) : rgb(1, 1, 1),\n });\n continue;\n }\n\n if (!field.value) continue;\n\n const inkColor = field.inkColor ? hexToRgb(field.inkColor) : rgb(0, 0, 0);\n\n if (field.type === 'checkbox') {\n if (field.value === 'true') {\n // Draw an X checkmark (WinAnsi-safe, no unicode)\n const inset = Math.min(w, h) * 0.2;\n const lineWidth = Math.min(w, h) * 0.08;\n page.drawLine({\n start: { x: x + inset, y: y + inset },\n end: { x: x + w - inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n page.drawLine({\n start: { x: x + w - inset, y: y + inset },\n end: { x: x + inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n }\n } else if (field.type === 'signature' || field.type === 'initials') {\n // Value is a data URL from the canvas\n if (field.value.startsWith('data:image/png')) {\n const pngBytes = Uint8Array.from(\n atob(field.value.split(',')[1]),\n c => c.charCodeAt(0),\n );\n const pngImage = await pdfDoc.embedPng(pngBytes);\n page.drawImage(pngImage, {\n x,\n y,\n width: w,\n height: h,\n });\n }\n } else {\n // Text fields (including signed-date)\n const font = fontCache.get(field.fontFamily || 'Helvetica')!;\n const spacing = field.letterSpacing || 0;\n\n // Calculate text width including letter spacing\n const textWidthAtSize = (text: string, size: number) => {\n const baseWidth = font.widthOfTextAtSize(text, size);\n return baseWidth + spacing * (text.length - 1);\n };\n\n // Auto-shrink font to fit within the field width (single line)\n const maxFontSize = Math.min(field.fontSize, h * 0.7);\n let fontSize = maxFontSize;\n const padding = 4;\n while (fontSize > 4) {\n if (textWidthAtSize(field.value, fontSize) <= w - padding) break;\n fontSize -= 0.5;\n }\n\n if (spacing > 0) {\n // Draw each character individually with custom spacing\n let cx = x + 2;\n const cy = y + h * 0.3;\n for (const char of field.value) {\n page.drawText(char, { x: cx, y: cy, size: fontSize, font, color: inkColor });\n cx += font.widthOfTextAtSize(char, fontSize) + spacing;\n }\n } else {\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n });\n }\n }\n }\n\n return pdfDoc.save();\n}\n\nexport function downloadPdf(bytes: Uint8Array, filename: string) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport async function postPdfToCallback(\n bytes: Uint8Array,\n callbackUrl: string,\n filename: string,\n) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const formData = new FormData();\n formData.append('file', blob, filename);\n\n await fetch(callbackUrl, {\n method: 'POST',\n body: formData,\n });\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField } from '@/types/pdf-builder';\n\ninterface FieldNavigatorProps {\n fields: FormField[];\n currentFieldId: string | null;\n onNavigate: (fieldId: string) => void;\n allRequiredFilled: boolean;\n onComplete: () => void;\n completeLabel?: string;\n}\n\nfunction isFieldFilled(f: FormField): boolean {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onComplete,\n completeLabel = 'Complete',\n}: FieldNavigatorProps) {\n const [showIncomplete, setShowIncomplete] = useState(false);\n const currentIndex = fields.findIndex(f => f.id === currentFieldId);\n const hasPrev = currentIndex > 0;\n const hasNext = currentIndex < fields.length - 1;\n\n const handlePrev = () => {\n if (hasPrev) {\n onNavigate(fields[currentIndex - 1].id);\n }\n };\n\n const handleNext = () => {\n if (hasNext) {\n onNavigate(fields[currentIndex + 1].id);\n }\n };\n\n const filledCount = fields.filter(isFieldFilled).length;\n const incompleteFields = fields.filter(f => !isFieldFilled(f));\n\n // When on the last field (or none selected) and all filled, the forward action is complete/advance\n const showCompleteAsNext = !hasNext && allRequiredFilled;\n\n return (\n <div className=\"field-navigator\">\n <div\n className={`field-navigator-progress ${incompleteFields.length > 0 ? 'clickable' : ''}`}\n onClick={() => incompleteFields.length > 0 && setShowIncomplete(!showIncomplete)}\n >\n {filledCount} of {fields.length} fields completed\n {incompleteFields.length > 0 && (\n <span className=\"field-navigator-toggle\">{showIncomplete ? '\\u25B2' : '\\u25BC'}</span>\n )}\n </div>\n\n {showIncomplete && incompleteFields.length > 0 && (\n <div className=\"incomplete-fields-list\">\n {incompleteFields.map(f => (\n <button\n key={f.id}\n className=\"incomplete-field-item\"\n onClick={() => {\n onNavigate(f.id);\n setShowIncomplete(false);\n }}\n >\n {f.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"field-navigator-controls\">\n <button\n onClick={handlePrev}\n disabled={!hasPrev}\n className=\"nav-btn\"\n >\n Prev\n </button>\n <span className=\"field-navigator-position\">\n {currentIndex >= 0 ? `${currentIndex + 1} / ${fields.length}` : '-'}\n </span>\n {showCompleteAsNext ? (\n <button\n onClick={onComplete}\n className=\"nav-btn nav-btn-complete\"\n >\n {completeLabel}\n </button>\n ) : (\n <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n );\n}\n","import type { FormField } from '@/types/pdf-builder';\n\nexport type TransformFn = (value: string) => string;\nexport type TransformMap = Record<string, TransformFn>;\n\n/** Built-in transforms that ship with exeq. */\nexport const BUILTIN_TRANSFORMS: TransformMap = {\n // Date transforms (expects a parseable date string)\n month: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1); },\n month2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1).padStart(2, '0'); },\n monthname: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'long' }); },\n monthshort: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'short' }); },\n day: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()); },\n day2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()).padStart(2, '0'); },\n year: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()); },\n year2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()).slice(-2); },\n\n // String transforms\n upper: (v) => v.toUpperCase(),\n lower: (v) => v.toLowerCase(),\n trim: (v) => v.trim(),\n first: (v) => v.split(/\\s+/)[0] || '',\n last: (v) => { const parts = v.split(/\\s+/); return parts[parts.length - 1] || ''; },\n initials: (v) => v.split(/\\s+/).map(w => w[0] || '').join('').toUpperCase(),\n\n // Numeric / substring\n last4: (v) => v.slice(-4),\n last2: (v) => v.slice(-2),\n first4: (v) => v.slice(0, 4),\n first2: (v) => v.slice(0, 2),\n digits: (v) => v.replace(/\\D/g, ''),\n number: (v) => { const n = parseFloat(v); return isNaN(n) ? '' : String(n); },\n currency: (v) => { const n = parseFloat(v.replace(/[^0-9.-]/g, '')); return isNaN(n) ? '' : `$${n.toFixed(2)}`; },\n};\n\nconst FORMULA_RE = /\\{\\{(.+?)\\}\\}/g;\nconst PIPE_RE = /^(.+?)\\s*\\|\\s*(.+)$/;\n\n/**\n * Resolve a single formula string against a set of fields and transforms.\n * Formula format: \"{{Source Field Label | transform}}\" or \"{{Source Field Label}}\" (no transform = raw value).\n * Multiple expressions can appear in one formula: \"{{First}} {{Last}}\" → \"Jane Smith\"\n */\nexport function resolveFormula(\n formula: string,\n fields: FormField[],\n customTransforms?: TransformMap,\n): string {\n const transforms = { ...BUILTIN_TRANSFORMS, ...customTransforms };\n\n return formula.replace(FORMULA_RE, (_match, expr: string) => {\n const pipeMatch = expr.match(PIPE_RE);\n const sourceLabel = (pipeMatch ? pipeMatch[1] : expr).trim();\n const transformName = pipeMatch ? pipeMatch[2].trim() : null;\n\n // Find source field by label (case-insensitive) or ID\n const sourceField = fields.find(f => f.label.toLowerCase() === sourceLabel.toLowerCase())\n || fields.find(f => f.id === sourceLabel);\n\n if (!sourceField) return '';\n\n const rawValue = sourceField.value || '';\n if (!transformName) return rawValue;\n\n const fn = transforms[transformName];\n if (!fn) return rawValue; // unknown transform → return raw value\n\n try {\n return fn(rawValue);\n } catch {\n return rawValue;\n }\n });\n}\n\n/**\n * Resolve all formula fields in a fields array.\n * Returns a new array with computed values filled in.\n */\nexport function resolveAllFormulas(\n fields: FormField[],\n customTransforms?: TransformMap,\n): FormField[] {\n return fields.map(f => {\n if (!f.formula) return f;\n const computed = resolveFormula(f.formula, fields, customTransforms);\n return computed !== f.value ? { ...f, value: computed } : f;\n });\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n ×\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useState","useCallback","useEffect","useRef","e","jsx","jsxs","useRef","useState","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","e","useState","useCallback","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","jsx","jsxs","useState"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/utils/apiKey.ts","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx","../src/utils/formulaResolver.ts","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, FIELD_DEFAULTS, createField, getSignerColor, uniqueLabel, generateId } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel } from './FieldPropertyPanel';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport '@/styles/pdf-builder.css';\n\nexport interface DesignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** URL to a PDF to pre-load */\n initialPdfUrl?: string;\n /** Existing template to load (fields, signer roles, and PDF URL) */\n initialTemplate?: Template;\n /** Called when the user clicks \"Export Template\" */\n onSave?: (template: Template) => void;\n /** When true, the built-in header bar is hidden (use headerPortalRef to place buttons externally) */\n hideHeader?: boolean;\n /** Ref to an element where the header action buttons should be portalled into */\n headerPortalRef?: React.RefObject<HTMLElement | null>;\n}\n\nconst FIELD_TYPE_META: { type: FieldType; label: string; icon: string; group?: string }[] = [\n { type: 'text', label: 'Text', icon: 'T' },\n { type: 'dropdown', label: 'Dropdown', icon: '▾' },\n { type: 'signature', label: 'Signature', icon: '✍' },\n { type: 'signed-date', label: 'Date', icon: '📅' },\n { type: 'checkbox', label: 'Checkbox', icon: '☑' },\n { type: 'initials', label: 'Initials', icon: 'IN' },\n { type: 'blackout', label: 'Blackout', icon: '■', group: 'redact' },\n { type: 'whiteout', label: 'Whiteout', icon: '□', group: 'redact' },\n];\n\nexport function DesignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n onSave,\n hideHeader,\n headerPortalRef,\n}: DesignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"designer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>(initialTemplate?.fields ?? []);\n const [selectedFieldIds, setSelectedFieldIds] = useState<Set<string>>(new Set());\n const [signerRoles, setSignerRoles] = useState<string[]>(initialTemplate?.signerRoles ?? [...DEFAULT_SIGNER_ROLES]);\n const [activeRole, setActiveRole] = useState('Sender');\n const [activeFieldType, setActiveFieldType] = useState<FieldType>('text');\n const [loading, setLoading] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [rightTab, setRightTab] = useState<'properties' | 'fields'>('properties');\n const [isAddingRole, setIsAddingRole] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n const [draggingFieldType, setDraggingFieldType] = useState<FieldType | null>(null);\n const [panelWidth, setPanelWidth] = useState(380);\n const [clipboardFields, setClipboardFields] = useState<FormField[]>([]);\n const dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\n const lastStylesRef = useRef<Partial<Record<FieldType, { width: number; height: number; fontSize: number; inkColor?: string }>>>({});\n\n // Load PDF from props, URL params, or postMessage\n useEffect(() => {\n const pdfUrl = initialPdfUrl || initialTemplate?.pdfUrl;\n if (pdfUrl) {\n loadPdf(pdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const paramPdf = params.get('pdf');\n if (paramPdf) {\n loadPdf(paramPdf);\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-pdf' && e.data.url) {\n loadPdf(e.data.url);\n }\n if (e.data?.type === 'load-template') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.signerRoles) setSignerRoles(e.data.signerRoles);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialPdfUrl, initialTemplate]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const handleFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result) loadPdf(reader.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(file);\n }, [loadPdf]);\n\n const handlePageClick = useCallback((page: number, x: number, y: number) => {\n const field = createField(activeFieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[activeFieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldIds(new Set([styledField.id]));\n setRightTab('properties');\n }, [activeFieldType, activeRole, fields]);\n\n const handleFieldMove = useCallback((id: string, page: number, x: number, y: number) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, page, x, y } : f));\n }, []);\n\n const handleFieldResize = useCallback((id: string, width: number, height: number) => {\n setFields(prev => {\n const field = prev.find(f => f.id === id);\n if (field) {\n const existing = lastStylesRef.current[field.type] || {};\n lastStylesRef.current[field.type] = { ...existing, width, height, fontSize: field.fontSize };\n }\n return prev.map(f => f.id === id ? { ...f, width, height } : f);\n });\n }, []);\n\n const handleFieldUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => {\n if (updates.label !== undefined) {\n const otherLabels = prev.filter(f => f.id !== id).map(f => f.label);\n updates.label = uniqueLabel(updates.label, otherLabels);\n }\n const updated = prev.map(f => f.id === id ? { ...f, ...updates } : f);\n\n // Track style changes as sticky defaults for new fields of the same type\n const field = prev.find(f => f.id === id);\n if (field && (updates.fontSize !== undefined || updates.width !== undefined || updates.height !== undefined || updates.inkColor !== undefined)) {\n const merged = { ...field, ...updates };\n lastStylesRef.current[field.type] = {\n width: merged.width,\n height: merged.height,\n fontSize: merged.fontSize,\n inkColor: merged.inkColor,\n };\n }\n\n return updated;\n });\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const handleSelectField = useCallback((id: string | null, e?: React.MouseEvent) => {\n if (!id) {\n setSelectedFieldIds(new Set());\n return;\n }\n if (e && (e.metaKey || e.ctrlKey)) {\n // Cmd/Ctrl+click: toggle in/out of selection\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n } else if (e && e.shiftKey && selectedFieldIds.size > 0) {\n // Shift+click: range select in document order\n const lastId = Array.from(selectedFieldIds).pop()!;\n const sorted = sortedFields.map(f => f.id);\n const a = sorted.indexOf(lastId);\n const b = sorted.indexOf(id);\n if (a >= 0 && b >= 0) {\n const start = Math.min(a, b);\n const end = Math.max(a, b);\n const range = sorted.slice(start, end + 1);\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n range.forEach(fid => next.add(fid));\n return next;\n });\n } else {\n setSelectedFieldIds(new Set([id]));\n }\n } else {\n setSelectedFieldIds(new Set([id]));\n }\n setRightTab('properties');\n }, [selectedFieldIds]);\n\n const handleGroupMove = useCallback((ids: string[], dx: number, dy: number) => {\n setFields(prev => prev.map(f => {\n if (!ids.includes(f.id)) return f;\n const newX = Math.max(0, Math.min(100 - f.width, f.x + dx));\n const newY = Math.max(0, Math.min(100 - f.height, f.y + dy));\n return { ...f, x: newX, y: newY };\n }));\n }, []);\n\n const handleAddRole = useCallback(() => {\n const name = newRoleName.trim();\n if (name && !signerRoles.includes(name)) {\n setSignerRoles(prev => [...prev, name]);\n }\n setNewRoleName('');\n setIsAddingRole(false);\n }, [newRoleName, signerRoles]);\n\n const handleRemoveRole = useCallback((role: string) => {\n setSignerRoles(prev => prev.filter(r => r !== role));\n setFields(prev => prev.map(f => f.assignee === role ? { ...f, assignee: signerRoles[0] } : f));\n if (activeRole === role) setActiveRole(signerRoles[0]);\n }, [signerRoles, activeRole]);\n\n const handleExport = useCallback(() => {\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n\n if (onSave) {\n onSave(template);\n } else {\n const json = JSON.stringify(template, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'template.json';\n a.click();\n URL.revokeObjectURL(url);\n }\n\n window.parent?.postMessage({ type: 'template-saved', template }, '*');\n }, [fields, signerRoles, pdfSource, onSave]);\n\n // Drag from palette\n const handlePaletteDragStart = useCallback((e: React.DragEvent, type: FieldType) => {\n setDraggingFieldType(type);\n e.dataTransfer.setData('application/exeq-field-type', type);\n e.dataTransfer.effectAllowed = 'copy';\n\n // Create a styled drag ghost\n const ghost = document.createElement('div');\n ghost.className = 'palette-drag-ghost';\n ghost.textContent = FIELD_TYPE_META.find(f => f.type === type)?.label || type;\n ghost.style.cssText = `\n position: fixed; top: -200px; left: -200px;\n padding: 6px 16px; background: ${getSignerColor(activeRole)};\n color: #fff; border-radius: 4px; font-size: 12px;\n font-family: system-ui; pointer-events: none; white-space: nowrap;\n `;\n document.body.appendChild(ghost);\n e.dataTransfer.setDragImage(ghost, 40, 16);\n dragGhostRef.current = ghost;\n }, [activeRole]);\n\n const handlePaletteDragEnd = useCallback(() => {\n setDraggingFieldType(null);\n if (dragGhostRef.current) {\n document.body.removeChild(dragGhostRef.current);\n dragGhostRef.current = null;\n }\n }, []);\n\n const handleDropOnPage = useCallback((page: number, x: number, y: number, fieldType: FieldType) => {\n const field = createField(fieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[fieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldIds(new Set([styledField.id]));\n setRightTab('properties');\n }, [activeRole, fields]);\n\n // Delete key handler — only when no input/textarea/select is focused\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Delete' && e.key !== 'Backspace') return;\n if (selectedFieldIds.size === 0) return;\n\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n e.preventDefault();\n const count = selectedFieldIds.size;\n if (window.confirm(`Delete ${count > 1 ? `${count} fields` : 'this field'}?`)) {\n setFields(prev => prev.filter(f => !selectedFieldIds.has(f.id)));\n setSelectedFieldIds(new Set());\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldIds]);\n\n // Copy/paste handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n const isMod = e.metaKey || e.ctrlKey;\n\n // Copy (Cmd/Ctrl+C)\n if (isMod && e.key === 'c' && selectedFieldIds.size > 0) {\n const selected = fields.filter(f => selectedFieldIds.has(f.id));\n if (selected.length > 0) {\n e.preventDefault();\n setClipboardFields(selected);\n }\n }\n\n // Paste (Cmd/Ctrl+V)\n if (isMod && e.key === 'v' && clipboardFields.length > 0) {\n e.preventDefault();\n let existingLabels = fields.map(f => f.label);\n const newIds = new Set<string>();\n const newFields = clipboardFields.map(cf => {\n const label = uniqueLabel(cf.label, existingLabels);\n existingLabels.push(label);\n const id = generateId();\n newIds.add(id);\n return { ...cf, id, label, x: cf.x + 2, y: cf.y + 2, value: '' };\n });\n setFields(prev => [...prev, ...newFields]);\n setSelectedFieldIds(newIds);\n setRightTab('properties');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldIds, fields, clipboardFields]);\n\n // Resize handle for right panel\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n resizingRef.current = true;\n const startX = e.clientX;\n const startWidth = panelWidth;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizingRef.current) return;\n const delta = startX - e.clientX;\n setPanelWidth(Math.max(280, Math.min(600, startWidth + delta)));\n };\n\n const handleMouseUp = () => {\n resizingRef.current = false;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [panelWidth]);\n\n // Sort fields by document position: page, then top-to-bottom, then left-to-right\n const sortedFields = [...fields].sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n // Fields within ~2% vertical distance are in the same \"band\"\n const bandThreshold = 2;\n if (Math.abs(a.y - b.y) > bandThreshold) return a.y - b.y;\n return a.x - b.x;\n });\n\n // For property panel, show the last selected field (or null if multi/none)\n const selectedField = selectedFieldIds.size === 1\n ? fields.find(f => f.id === Array.from(selectedFieldIds)[0]) || null\n : null;\n\n const renderFieldContent = useCallback((field: FormField) => {\n if (field.type === 'blackout' || field.type === 'whiteout') {\n return null; // Rendered purely via background color on the overlay\n }\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return <img src={field.value} alt={field.label} className=\"field-signature-preview\" />;\n }\n }\n const inkColor = field.inkColor || '#000000';\n const cssFontFamily = field.fontFamily === 'Courier' ? '\"Courier New\", Courier, monospace' :\n field.fontFamily === 'TimesRoman' ? '\"Times New Roman\", Times, serif' :\n field.fontFamily === 'Helvetica' ? 'Helvetica, Arial, sans-serif' : undefined;\n return (\n <div\n className=\"field-overlay-placeholder\"\n style={{\n color: field.value ? inkColor : undefined,\n fontSize: `${field.fontSize * 0.6}px`,\n fontFamily: cssFontFamily,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing * 0.6}px` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, [fields]);\n\n const headerButtons = pages.length > 0 ? (\n <>\n <label className=\"header-btn header-btn-outline\">\n Change PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n <button onClick={handleExport} className=\"header-btn header-btn-primary\">\n Export Template\n </button>\n </>\n ) : null;\n\n return (\n <div className=\"designer-layout\">\n {/* Portal header buttons into external container if provided */}\n {headerPortalRef?.current && headerButtons && createPortal(headerButtons, headerPortalRef.current)}\n\n {/* Built-in header (hidden when hideHeader or headerPortalRef is used) */}\n {!hideHeader && !headerPortalRef && (\n <div className=\"designer-header\">\n <div className=\"designer-header-right\">\n {headerButtons}\n </div>\n </div>\n )}\n\n <div className=\"designer-body\">\n {/* ── Left palette ──────────────────────── */}\n {pages.length > 0 && (\n <div className=\"designer-palette\">\n {/* Role selector first */}\n <div className=\"palette-heading\">New Field Role</div>\n <div className=\"palette-role-section\">\n <select\n className=\"palette-role-select\"\n value={activeRole}\n onChange={e => setActiveRole(e.target.value)}\n style={{ borderColor: getSignerColor(activeRole), color: getSignerColor(activeRole) }}\n >\n {signerRoles.map(role => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n {isAddingRole ? (\n <div className=\"palette-role-add-inline\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAddRole()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAddRole}>Add</button>\n <button onClick={() => { setIsAddingRole(false); setNewRoleName(''); }}>Cancel</button>\n </div>\n ) : (\n <button className=\"palette-role-add-link\" onClick={() => setIsAddingRole(true)}>\n + Add Role\n </button>\n )}\n </div>\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Fields</div>\n {FIELD_TYPE_META.filter(f => !f.group).map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Redact</div>\n {FIELD_TYPE_META.filter(f => f.group === 'redact').map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* ── Center: PDF area ─────────────────── */}\n <div className=\"designer-pdf-area\">\n {loading && <div className=\"loading-indicator\">Loading PDF...</div>}\n {!pages.length && !loading && (\n <div className=\"empty-state\">\n <h2>Open a PDF to get started</h2>\n <p>Select a PDF from your device to begin. Your file stays on your computer — nothing is uploaded.</p>\n <label className=\"upload-btn upload-btn-large\">\n Select PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n </div>\n )}\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldIds={selectedFieldIds}\n onSelectField={handleSelectField}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\n onGroupMove={handleGroupMove}\n onPageClick={handlePageClick}\n onDropField={handleDropOnPage}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n {/* ── Right panel ──────────────────────── */}\n {pages.length > 0 && (\n <>\n <div className=\"panel-resize-handle\" onMouseDown={handleResizeStart} />\n <div className=\"designer-panel\" style={{ width: panelWidth }}>\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Editing as</span>\n <strong>{activeRole}</strong>\n </div>\n {/* Tabs */}\n <div className=\"panel-tabs\">\n <button\n className={`panel-tab ${rightTab === 'properties' ? 'active' : ''}`}\n onClick={() => setRightTab('properties')}\n >\n Properties\n </button>\n <button\n className={`panel-tab ${rightTab === 'fields' ? 'active' : ''}`}\n onClick={() => setRightTab('fields')}\n >\n All Fields{fields.length > 0 ? ` (${fields.length})` : ''}\n </button>\n </div>\n\n {/* Tab content */}\n <div className=\"panel-tab-content\">\n {rightTab === 'properties' && (\n <>\n {selectedFieldIds.size > 1 ? (\n <div className=\"panel-empty\">\n <strong>{selectedFieldIds.size} fields selected</strong>\n <p>Drag to move as a group. Press Delete to remove all. Cmd/Ctrl+C to copy.</p>\n </div>\n ) : selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n />\n {/* Pre-fill area (not for redact fields) */}\n {selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' && (\n <div className=\"prefill-section\">\n <h4>Pre-fill Value</h4>\n {(selectedField.type === 'signature' || selectedField.type === 'initials') ? (\n <SignatureCanvas\n width={panelWidth - 40}\n height={selectedField.type === 'initials' ? 100 : 150}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, { value: dataUrl })}\n initialValue={selectedField.value}\n inkColor={selectedField.inkColor}\n />\n ) : selectedField.type === 'checkbox' ? (\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.checked ? 'true' : '' })}\n />\n Checked\n </label>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.value })}\n placeholder={`Pre-fill ${selectedField.label}`}\n className=\"prefill-input\"\n style={{ color: selectedField.inkColor || '#000000' }}\n />\n )}\n </div>\n )}\n </>\n ) : (\n <div className=\"panel-empty\">\n Click on the PDF to place a field, or select an existing field to edit its properties.\n </div>\n )}\n </>\n )}\n\n {rightTab === 'fields' && (\n <>\n {fields.length === 0 ? (\n <div className=\"panel-empty\">\n No fields yet. Drag a field from the left palette onto the PDF, or click on the PDF to place one.\n </div>\n ) : (\n <div className=\"field-list\">\n {sortedFields.map(f => (\n <div\n key={f.id}\n className={`field-list-item ${selectedFieldIds.has(f.id) ? 'active' : ''}`}\n onClick={() => { setSelectedFieldIds(new Set([f.id])); setRightTab('properties'); }}\n >\n <span\n className=\"field-list-dot\"\n style={{ backgroundColor: getSignerColor(f.assignee) }}\n />\n <span className=\"field-list-name\">{f.label}</span>\n <span className=\"field-list-page\">p{f.page + 1}</span>\n {f.required && <span className=\"field-list-required\">*</span>}\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","export function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport type FieldType = 'text' | 'dropdown' | 'signature' | 'signed-date' | 'checkbox' | 'initials' | 'blackout' | 'whiteout';\n\nexport type TextSubtype = 'freeform' | 'number' | 'date' | 'email' | 'phone';\n\nexport interface FormField {\n id: string;\n type: FieldType;\n textSubtype?: TextSubtype;\n label: string;\n placeholder: string;\n required: boolean;\n assignee: string; // signer role e.g. \"Sender\", \"Signer 1\"\n page: number; // 0-indexed page number\n x: number; // percentage of page width (0-100)\n y: number; // percentage of page height (0-100)\n width: number; // percentage of page width\n height: number; // percentage of page height\n fontSize: number; // in points\n value: string; // pre-filled value or current value\n inkColor?: string; // ink color for text/signature fields (default: '#000000')\n letterSpacing?: number; // extra spacing between characters in points (default: 0)\n lineHeight?: number; // line height multiplier (default: 1.2)\n maxLength?: number; // max character count (0 = unlimited)\n fontFamily?: string; // font family (default: 'Helvetica')\n options?: string[]; // predefined options for dropdown/radio selection\n formula?: string; // template expression e.g. \"{{Date Field | month}}\" — auto-computed from other fields\n}\n\nexport interface Template {\n fields: FormField[];\n signerRoles: string[];\n pdfUrl: string;\n}\n\nexport const DEFAULT_SIGNER_ROLES = ['Sender', 'Signer 1'];\n\nexport const SIGNER_ROLE_COLORS: Record<string, string> = {\n 'Sender': '#6366f1',\n 'Signer 1': '#22c55e',\n 'Signer 2': '#f59e0b',\n 'Signer 3': '#ef4444',\n 'Signer 4': '#06b6d4',\n 'Signer 5': '#d946ef',\n};\n\nexport function getSignerColor(role: string): string {\n return SIGNER_ROLE_COLORS[role] || '#888888';\n}\n\nexport const FONT_FAMILIES = [\n { value: 'Helvetica', label: 'Helvetica' },\n { value: 'Courier', label: 'Courier New' },\n { value: 'TimesRoman', label: 'Times New Roman' },\n] as const;\n\nexport const FIELD_DEFAULTS: Record<FieldType, Partial<FormField>> = {\n text: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Enter text',\n textSubtype: 'freeform',\n },\n dropdown: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Select...',\n },\n signature: {\n width: 20,\n height: 6,\n fontSize: 12,\n placeholder: 'Sign here',\n },\n 'signed-date': {\n width: 15,\n height: 3,\n fontSize: 12,\n placeholder: 'Date',\n },\n checkbox: {\n width: 2.5,\n height: 2.5,\n fontSize: 12,\n placeholder: '',\n },\n initials: {\n width: 8,\n height: 5,\n fontSize: 12,\n placeholder: 'Initials',\n },\n blackout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n whiteout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n};\n\nconst TYPE_LABELS: Record<FieldType, string> = {\n text: 'Text Field',\n dropdown: 'Dropdown',\n signature: 'Signature',\n 'signed-date': 'Signed Date',\n checkbox: 'Checkbox',\n initials: 'Initials',\n blackout: 'Blackout',\n whiteout: 'Whiteout',\n};\n\n/** Given a desired label and a list of existing labels, return a unique label by appending a number if needed. */\nexport function uniqueLabel(desired: string, existingLabels: string[]): string {\n const lower = desired.toLowerCase();\n if (!existingLabels.some(l => l.toLowerCase() === lower)) return desired;\n let i = 2;\n while (existingLabels.some(l => l.toLowerCase() === `${lower} ${i}`)) i++;\n return `${desired} ${i}`;\n}\n\nexport function createField(\n type: FieldType,\n assignee: string,\n page: number,\n x: number,\n y: number,\n existingFields?: FormField[],\n): FormField {\n const defaults = FIELD_DEFAULTS[type];\n const baseLabel = TYPE_LABELS[type];\n const existingLabels = existingFields?.map(f => f.label) ?? [];\n return {\n id: generateId(),\n type,\n label: uniqueLabel(baseLabel, existingLabels),\n placeholder: defaults.placeholder || '',\n required: type === 'checkbox' || type === 'blackout' || type === 'whiteout' ? false : true,\n assignee,\n page,\n x,\n y,\n width: defaults.width || 20,\n height: defaults.height || 3,\n fontSize: defaults.fontSize || 12,\n value: '',\n ...(type === 'text' ? { textSubtype: defaults.textSubtype as TextSubtype } : {}),\n };\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\n// Configure the worker\nif (typeof window !== 'undefined') {\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.mjs`;\n}\n\nexport interface RenderedPage {\n pageNumber: number;\n dataUrl: string;\n width: number;\n height: number;\n}\n\nexport async function renderPdfPages(\n source: string | ArrayBuffer,\n scale: number = 2,\n): Promise<RenderedPage[]> {\n const loadingTask = pdfjsLib.getDocument(\n typeof source === 'string' ? { url: source } : { data: source }\n );\n const pdf = await loadingTask.promise;\n const pages: RenderedPage[] = [];\n\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n pages.push({\n pageNumber: i,\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n });\n }\n\n return pages;\n}\n","'use client';\n\nimport { useRef, useCallback } from 'react';\nimport type { FormField, FieldType } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface PdfViewerProps {\n pages: RenderedPage[];\n fields: FormField[];\n selectedFieldIds: Set<string>;\n onSelectField: (id: string | null, e?: React.MouseEvent) => void;\n onFieldMove?: (id: string, page: number, x: number, y: number) => void;\n onFieldResize?: (id: string, width: number, height: number) => void;\n onPageClick?: (page: number, x: number, y: number) => void;\n onDropField?: (page: number, x: number, y: number, fieldType: FieldType) => void;\n /** Move multiple fields as a group. Called with dx/dy in percentage units. */\n onGroupMove?: (ids: string[], dx: number, dy: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldIds,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\n onGroupMove,\n mode,\n currentSigner,\n renderFieldContent,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handlePageClick = useCallback((e: React.MouseEvent<HTMLDivElement>, pageIndex: number) => {\n const target = e.target as HTMLElement;\n if (target.closest('.field-overlay')) return;\n\n if (onPageClick) {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onPageClick(pageIndex, x, y);\n } else {\n onSelectField(null);\n }\n }, [onPageClick, onSelectField]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n if (e.dataTransfer.types.includes('application/exeq-field-type')) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n }\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, pageIndex: number) => {\n const fieldType = e.dataTransfer.getData('application/exeq-field-type') as FieldType;\n if (!fieldType || !onDropField) return;\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onDropField(pageIndex, x, y, fieldType);\n }, [onDropField]);\n\n return (\n <div className=\"pdf-viewer\" ref={containerRef}>\n {pages.map((page, pageIndex) => {\n const pageFields = fields.filter(f => f.page === pageIndex);\n return (\n <div\n key={pageIndex}\n className=\"pdf-page\"\n style={{ aspectRatio: `${page.width} / ${page.height}` }}\n onClick={(e) => handlePageClick(e, pageIndex)}\n onDragOver={handleDragOver}\n onDrop={(e) => handleDrop(e, pageIndex)}\n data-page={pageIndex}\n >\n <img\n src={page.dataUrl}\n alt={`Page ${pageIndex + 1}`}\n className=\"pdf-page-image\"\n draggable={false}\n />\n {pageFields.map(field => (\n <FieldOverlayItem\n key={field.id}\n field={field}\n isSelected={selectedFieldIds.has(field.id)}\n isMultiSelected={selectedFieldIds.size > 1 && selectedFieldIds.has(field.id)}\n onSelect={(e) => onSelectField(field.id, e)}\n onMove={onFieldMove}\n onResize={onFieldResize}\n onGroupMove={selectedFieldIds.size > 1 && selectedFieldIds.has(field.id) ? onGroupMove : undefined}\n selectedIds={selectedFieldIds}\n mode={mode}\n currentSigner={currentSigner}\n renderContent={renderFieldContent}\n />\n ))}\n </div>\n );\n })}\n </div>\n );\n}\n\ninterface FieldOverlayItemProps {\n field: FormField;\n isSelected: boolean;\n isMultiSelected: boolean;\n onSelect: (e: React.MouseEvent) => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n onGroupMove?: (ids: string[], dx: number, dy: number) => void;\n selectedIds: Set<string>;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n isMultiSelected,\n onSelect,\n onMove,\n onResize,\n onGroupMove,\n selectedIds,\n mode,\n currentSigner,\n renderContent,\n}: FieldOverlayItemProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dragStartRef = useRef<{ startX: number; startY: number; fieldX: number; fieldY: number } | null>(null);\n const resizeStartRef = useRef<{ startX: number; startY: number; fieldW: number; fieldH: number } | null>(null);\n\n const isRedact = field.type === 'blackout' || field.type === 'whiteout';\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\n const isInactiveSigner = mode === 'signer' && !isRedact && field.assignee !== currentSigner;\n const color = isInactiveSigner ? '#cccccc' : getSignerColor(field.assignee);\n const isPreFilled = !isEditable && !!field.value;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onMove) return;\n e.preventDefault();\n e.stopPropagation();\n onSelect(e);\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldX: field.x,\n fieldY: field.y,\n };\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((ev.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((ev.clientY - dragStartRef.current.startY) / rect.height) * 100;\n\n if (isMultiSelected && onGroupMove) {\n // Move all selected fields as a group\n onGroupMove(Array.from(selectedIds), dx, dy);\n // Reset start so delta stays relative\n dragStartRef.current.startX = ev.clientX;\n dragStartRef.current.startY = ev.clientY;\n } else {\n const newX = Math.max(0, Math.min(100 - field.width, dragStartRef.current.fieldX + dx));\n const newY = Math.max(0, Math.min(100 - field.height, dragStartRef.current.fieldY + dy));\n onMove(field.id, field.page, newX, newY);\n }\n };\n\n const handleMouseUp = () => {\n dragStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onMove, onSelect, isMultiSelected, onGroupMove, selectedIds]);\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onResize) return;\n e.preventDefault();\n e.stopPropagation();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n resizeStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldW: field.width,\n fieldH: field.height,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dw = ((e.clientX - resizeStartRef.current.startX) / rect.width) * 100;\n const dh = ((e.clientY - resizeStartRef.current.startY) / rect.height) * 100;\n const newW = Math.max(2, Math.min(100 - field.x, resizeStartRef.current.fieldW + dw));\n const newH = Math.max(1.5, Math.min(100 - field.y, resizeStartRef.current.fieldH + dh));\n onResize(field.id, newW, newH);\n };\n\n const handleMouseUp = () => {\n resizeStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onResize]);\n\n return (\n <div\n ref={overlayRef}\n className={`field-overlay ${isSelected ? 'selected' : ''} ${isEditable ? 'editable' : 'readonly'} ${isPreFilled ? 'prefilled' : ''} ${isRedact ? 'redact' : ''} ${isInactiveSigner ? 'inactive-signer' : ''}`}\n style={{\n left: `${field.x}%`,\n top: `${field.y}%`,\n width: `${field.width}%`,\n height: `${field.height}%`,\n borderColor: isRedact ? (field.type === 'blackout' ? '#666' : '#bbb') : color,\n borderStyle: isRedact ? 'dashed' : 'solid',\n backgroundColor: isRedact\n ? (field.type === 'blackout' ? '#000000' : '#ffffff')\n : isInactiveSigner ? '#f5f5f5' : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? 'move' : (isInactiveSigner ? 'default' : 'default'),\n pointerEvents: (mode === 'signer' && (isRedact || isInactiveSigner)) ? 'none' : undefined,\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(e); }}\n onMouseDown={handleMouseDown}\n >\n {mode === 'designer' && !isRedact && (\n <div className=\"field-overlay-label\" style={{ backgroundColor: color }}>\n {field.label}\n </div>\n )}\n\n {renderContent ? renderContent(field) : (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n )}\n\n {mode === 'designer' && isSelected && (\n <div\n className=\"field-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor, FONT_FAMILIES } from '@/types/pdf-builder';\n\nconst INK_COLORS = [\n { value: '#000000', label: 'Black' },\n { value: '#1a56db', label: 'Blue' },\n];\n\ninterface FieldPropertyPanelProps {\n field: FormField;\n signerRoles: string[];\n onUpdate: (id: string, updates: Partial<FormField>) => void;\n onDelete: (id: string) => void;\n}\n\nexport function FieldPropertyPanel({ field, signerRoles, onUpdate, onDelete }: FieldPropertyPanelProps) {\n const color = getSignerColor(field.assignee);\n const isRedactField = field.type === 'blackout' || field.type === 'whiteout';\n const isTextField = field.type === 'text' || field.type === 'signed-date' || field.type === 'dropdown';\n const showInkColor = field.type === 'text' || field.type === 'dropdown' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\n const [newOption, setNewOption] = useState('');\n\n return (\n <div className=\"field-property-panel\">\n <div className=\"panel-header\">\n <h3 style={{ color }}>\n {field.label}\n </h3>\n <button onClick={() => onDelete(field.id)} className=\"panel-delete-btn\">\n Delete\n </button>\n </div>\n\n <div className=\"panel-field\">\n <label>Label</label>\n <input\n type=\"text\"\n value={field.label}\n onChange={e => onUpdate(field.id, { label: e.target.value })}\n />\n </div>\n\n {!isRedactField && (\n <div className=\"panel-field\">\n <label>Field Type</label>\n <select\n value={field.type}\n onChange={e => onUpdate(field.id, { type: e.target.value as FieldType })}\n >\n <option value=\"text\">Text</option>\n <option value=\"dropdown\">Dropdown</option>\n <option value=\"signature\">Signature</option>\n <option value=\"signed-date\">Signed Date</option>\n <option value=\"checkbox\">Checkbox</option>\n <option value=\"initials\">Initials</option>\n </select>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Text Type</label>\n <select\n value={field.textSubtype || 'freeform'}\n onChange={e => onUpdate(field.id, { textSubtype: e.target.value as TextSubtype })}\n >\n <option value=\"freeform\">Freeform</option>\n <option value=\"number\">Number</option>\n <option value=\"date\">Date</option>\n <option value=\"email\">Email</option>\n <option value=\"phone\">Phone</option>\n </select>\n </div>\n )}\n\n {!isRedactField && (\n <div className=\"panel-field\">\n <label>Assigned To</label>\n <select\n value={field.assignee}\n onChange={e => onUpdate(field.id, { assignee: e.target.value })}\n >\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>\n {role}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {!isRedactField && (\n <div className=\"panel-field\">\n <label>Placeholder</label>\n <input\n type=\"text\"\n value={field.placeholder}\n onChange={e => onUpdate(field.id, { placeholder: e.target.value })}\n />\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Formula</label>\n <input\n type=\"text\"\n value={field.formula || ''}\n onChange={e => onUpdate(field.id, { formula: e.target.value || undefined })}\n placeholder='e.g. {{Date Field | month}}'\n />\n {field.formula && (\n <span className=\"panel-hint\">This field auto-computes from other fields. Signer cannot edit it.</span>\n )}\n </div>\n )}\n\n {!isRedactField && field.type !== 'checkbox' && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={e => onUpdate(field.id, { required: e.target.checked })}\n />\n Required\n </label>\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Font</label>\n <select\n value={field.fontFamily || 'Helvetica'}\n onChange={e => onUpdate(field.id, { fontFamily: e.target.value })}\n >\n {FONT_FAMILIES.map(f => (\n <option key={f.value} value={f.value}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={field.fontSize}\n onChange={e => onUpdate(field.id, { fontSize: Number(e.target.value) })}\n />\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Letter Spacing</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"20\"\n step=\"0.5\"\n value={field.letterSpacing || 0}\n onChange={e => onUpdate(field.id, { letterSpacing: Number(e.target.value) })}\n />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Line Height</label>\n <input\n type=\"number\"\n min=\"0.8\"\n max=\"3\"\n step=\"0.1\"\n value={field.lineHeight || 1.2}\n onChange={e => onUpdate(field.id, { lineHeight: Number(e.target.value) })}\n />\n </div>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Max Characters (0 = unlimited)</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"9999\"\n value={field.maxLength || 0}\n onChange={e => onUpdate(field.id, { maxLength: Number(e.target.value) })}\n />\n </div>\n )}\n\n {showInkColor && (\n <div className=\"panel-field\">\n <label>Ink Color</label>\n <div className=\"ink-color-picker\">\n {INK_COLORS.map(c => (\n <button\n key={c.value}\n className={`ink-color-swatch ${(field.inkColor || '#000000') === c.value ? 'active' : ''}`}\n style={{ backgroundColor: c.value }}\n onClick={() => onUpdate(field.id, { inkColor: c.value })}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n\n {(field.type === 'text' || field.type === 'dropdown') && (\n <div className=\"panel-field\">\n <label>{field.type === 'dropdown' ? 'Options' : 'Predefined Options'}</label>\n <div className=\"panel-options-list\">\n {(field.options || []).map((opt, i) => (\n <div key={i} className=\"panel-option-item\">\n <span>{opt}</span>\n <button\n className=\"panel-option-remove\"\n onClick={() => {\n const updated = (field.options || []).filter((_, j) => j !== i);\n onUpdate(field.id, { options: updated.length > 0 ? updated : undefined });\n }}\n >\n ×\n </button>\n </div>\n ))}\n <div className=\"panel-option-add\">\n <input\n type=\"text\"\n value={newOption}\n onChange={e => setNewOption(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter' && newOption.trim()) {\n onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] });\n setNewOption('');\n }\n }}\n placeholder=\"Add option...\"\n />\n <button\n onClick={() => {\n if (newOption.trim()) {\n onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] });\n setNewOption('');\n }\n }}\n >\n +\n </button>\n </div>\n </div>\n {field.type === 'dropdown' && (field.options?.length ?? 0) === 0 && (\n <span className=\"panel-hint\" style={{ color: '#c44' }}>Add at least one option</span>\n )}\n {field.type === 'text' && (field.options?.length ?? 0) > 0 && (\n <span className=\"panel-hint\">Signer will choose from these options via dropdown</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport { getStroke } from 'perfect-freehand';\n\ninterface SignatureCanvasProps {\n width?: number;\n height?: number;\n onSign: (dataUrl: string) => void;\n initialValue?: string;\n className?: string;\n inkColor?: string;\n}\n\nfunction getSvgPathFromStroke(stroke: number[][]) {\n if (!stroke.length) return '';\n\n const d = stroke.reduce(\n (acc, [x0, y0], i, arr) => {\n const [x1, y1] = arr[(i + 1) % arr.length];\n acc.push(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2);\n return acc;\n },\n ['M', ...stroke[0], 'Q'],\n );\n\n d.push('Z');\n return d.join(' ');\n}\n\nexport function SignatureCanvas({\n width = 400,\n height = 150,\n onSign,\n initialValue,\n className,\n inkColor = '#000000',\n}: SignatureCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [paths, setPaths] = useState<number[][][]>([]);\n const [currentPath, setCurrentPath] = useState<number[][] | null>(null);\n const [isEmpty, setIsEmpty] = useState(!initialValue);\n\n // Draw initial value if provided\n useEffect(() => {\n if (initialValue && canvasRef.current) {\n const ctx = canvasRef.current.getContext('2d')!;\n const img = new Image();\n img.onload = () => {\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n };\n img.src = initialValue;\n }\n }, [initialValue, width, height]);\n\n // Redraw all paths whenever they change\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n\n const allPaths = currentPath ? [...paths, currentPath] : paths;\n\n for (const path of allPaths) {\n const stroke = getStroke(path, {\n size: 3,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n });\n const pathStr = getSvgPathFromStroke(stroke);\n const path2d = new Path2D(pathStr);\n ctx.fillStyle = inkColor;\n ctx.fill(path2d);\n }\n }, [paths, currentPath, width, height]);\n\n const getPoint = useCallback((e: React.PointerEvent) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n const style = getComputedStyle(canvas);\n const borderL = parseFloat(style.borderLeftWidth) || 0;\n const borderT = parseFloat(style.borderTopWidth) || 0;\n const borderR = parseFloat(style.borderRightWidth) || 0;\n const borderB = parseFloat(style.borderBottomWidth) || 0;\n // Content area excludes borders\n const contentW = rect.width - borderL - borderR;\n const contentH = rect.height - borderT - borderB;\n const scaleX = canvas.width / contentW;\n const scaleY = canvas.height / contentH;\n return [\n (e.clientX - rect.left - borderL) * scaleX,\n (e.clientY - rect.top - borderT) * scaleY,\n e.pressure,\n ];\n }, []);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n setCurrentPath([getPoint(e)]);\n }, [getPoint]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!currentPath) return;\n e.preventDefault();\n setCurrentPath([...currentPath, getPoint(e)]);\n }, [currentPath, getPoint]);\n\n const handlePointerUp = useCallback(() => {\n if (!currentPath) return;\n setPaths(prev => [...prev, currentPath]);\n setCurrentPath(null);\n setIsEmpty(false);\n\n // Export after state updates\n requestAnimationFrame(() => {\n if (canvasRef.current) {\n onSign(canvasRef.current.toDataURL('image/png'));\n }\n });\n }, [currentPath, onSign]);\n\n const handleClear = useCallback(() => {\n setPaths([]);\n setCurrentPath(null);\n setIsEmpty(true);\n const canvas = canvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n onSign('');\n }\n }, [width, height, onSign]);\n\n return (\n <div className={`signature-canvas-wrapper ${className || ''}`}>\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n className=\"signature-canvas\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{ touchAction: 'none' }}\n />\n <div className=\"signature-canvas-actions\">\n {!isEmpty && (\n <button type=\"button\" onClick={handleClear} className=\"signature-clear-btn\">\n Clear\n </button>\n )}\n {isEmpty && <span className=\"signature-hint\">Draw your signature above</span>}\n </div>\n </div>\n );\n}\n","// Valid API keys. In the future this will validate against a server.\nconst VALID_KEYS = new Set([\n 'exeq_live_2024',\n process.env.NEXT_PUBLIC_EXEQ_API_KEY,\n].filter(Boolean));\n\nexport function isValidApiKey(key: string | undefined): boolean {\n if (!key) return false;\n return VALID_KEYS.has(key);\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { FormField, Template } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { generateFilledPdf, downloadPdf, postPdfToCallback } from '@/utils/pdfFiller';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldNavigator } from './FieldNavigator';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport { resolveAllFormulas } from '@/utils/formulaResolver';\nimport type { TransformMap } from '@/utils/formulaResolver';\nimport '@/styles/pdf-builder.css';\n\nexport interface SignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** If provided, use these instead of URL params / postMessage */\n initialPdfUrl?: string;\n initialTemplate?: Template;\n initialSigner?: string;\n callbackUrl?: string;\n onComplete?: (pdfBlob: Blob) => void;\n /** Pre-fill field values by label or ID. Keys are matched against field labels (case-insensitive) first, then field IDs. */\n initialValues?: Record<string, string>;\n /** Label for the final submit button (default: \"Complete\") */\n submitLabel?: string;\n /** Signing order for multi-party documents. Signers complete sequentially; only the current signer's fields are active. If omitted, non-Sender roles go first, then Sender last. */\n signerOrder?: string[];\n /** Custom transform functions for formula fields. Keys are transform names referenced in formulas like {{Field | name}}. Merges with built-in transforms. */\n transforms?: TransformMap;\n}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\n submitLabel,\n signerOrder: signerOrderProp,\n transforms,\n}: SignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"signer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>([]);\n const [currentSignerIndex, setCurrentSignerIndex] = useState(() => {\n if (initialSigner && signerOrderProp) {\n const idx = signerOrderProp.indexOf(initialSigner);\n return idx >= 0 ? idx : 0;\n }\n return 0;\n });\n const initializedRef = useRef(false);\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [callbackUrl, setCallbackUrl] = useState(initialCallbackUrl || '');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Derive the signing order: use explicit prop, or default to non-Sender roles first, Sender last\n const signerOrder = signerOrderProp\n || (signerRoles.length > 0\n ? [...signerRoles.filter(r => r !== 'Sender'), ...signerRoles.filter(r => r === 'Sender')]\n : [initialSigner || 'Signer 1']);\n const signer = signerOrder[currentSignerIndex] || signerOrder[0] || 'Signer 1';\n const isLastSigner = currentSignerIndex >= signerOrder.length - 1;\n const isMultiSigner = signerOrder.length > 1;\n\n // Skip signers whose fields are all already filled (e.g. via initialValues/pre-fill)\n useEffect(() => {\n if (fields.length === 0 || !isMultiSigner) return;\n const signerFields = fields.filter(f =>\n f.assignee === signer && f.type !== 'blackout' && f.type !== 'whiteout'\n );\n const allFilled = signerFields.length > 0 && signerFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n });\n if (allFilled && !isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n }\n }, [currentSignerIndex, fields, signer, isLastSigner, isMultiSigner]);\n\n // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\n if (initialTemplate.signerRoles) setSignerRoles(initialTemplate.signerRoles);\n\n // Apply initialValues by matching label (case-insensitive) or ID\n if (initialValues) {\n templateFields = templateFields.map(f => {\n const byLabel = Object.entries(initialValues).find(\n ([key]) => key.toLowerCase() === f.label.toLowerCase()\n );\n const byId = initialValues[f.id];\n const value = byLabel?.[1] ?? byId;\n return value !== undefined ? { ...f, value } : f;\n });\n }\n\n // On re-init (e.g. remount), preserve values already filled by any signer\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return templateFields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(templateFields);\n initializedRef.current = true;\n }\n\n if (initialPdfUrl) loadPdf(initialPdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n const fieldsUrl = params.get('fields');\n const cbUrl = params.get('callbackUrl');\n\n if (cbUrl) setCallbackUrl(cbUrl);\n\n if (pdfUrl) loadPdf(pdfUrl);\n if (fieldsUrl) {\n fetch(fieldsUrl)\n .then(r => r.json())\n .then((template: Template) => {\n if (template.signerRoles) setSignerRoles(template.signerRoles);\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return template.fields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(template.fields);\n initializedRef.current = true;\n }\n })\n .catch(err => console.error('Failed to load fields:', err));\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-signing') {\n if (e.data.fields) {\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return e.data.fields.map((f: FormField) => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(e.data.fields);\n initializedRef.current = true;\n }\n }\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) {\n const idx = signerOrder.indexOf(e.data.signer);\n if (idx >= 0) setCurrentSignerIndex(idx);\n }\n if (e.data.callbackUrl) setCallbackUrl(e.data.callbackUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialTemplate, initialPdfUrl]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fields this signer needs to fill, sorted by document position (excludes redact fields)\n const editableFields = fields.filter(f => f.assignee === signer && f.type !== 'blackout' && f.type !== 'whiteout' && !f.formula).sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n const bandThreshold = 2;\n if (Math.abs(a.y - b.y) > bandThreshold) return a.y - b.y;\n return a.x - b.x;\n });\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField\n ? selectedField.assignee === signer && selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' && !selectedField.formula\n : false;\n\n const handleFieldUpdate = useCallback((id: string, value: string) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, value } : f));\n }, []);\n\n const handleFieldPropertyUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, ...updates } : f));\n }, []);\n\n const handleNavigate = useCallback((fieldId: string) => {\n setSelectedFieldId(fieldId);\n // Scroll to that field's page\n const field = fields.find(f => f.id === fieldId);\n if (field && containerRef.current) {\n const pageEl = containerRef.current.querySelector(`[data-page=\"${field.page}\"]`);\n if (pageEl) {\n pageEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [fields]);\n\n const allRequiredFilled = editableFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true; // checkbox is always \"filled\"\n return !!f.value;\n });\n\n const handleAdvanceOrSubmit = useCallback(async () => {\n if (!allRequiredFilled) return;\n\n // Intermediate signer: advance to next\n if (!isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n // Scroll PDF area to top\n const pdfArea = containerRef.current?.querySelector('.signer-pdf-area');\n if (pdfArea) {\n pdfArea.scrollTo({ top: 0, behavior: 'smooth' });\n }\n return;\n }\n\n // Final signer: generate PDF\n if (!pdfSource) return;\n setSubmitting(true);\n try {\n const finalFields = resolveAllFormulas(fields, transforms);\n const pdfBytes = await generateFilledPdf(pdfSource, finalFields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n if (onComplete) {\n onComplete(blob);\n }\n\n if (!callbackUrl && !onComplete) {\n downloadPdf(pdfBytes, 'signed-document.pdf');\n }\n\n window.parent?.postMessage({ type: 'signing-complete' }, '*');\n } catch (err) {\n console.error('Failed to generate PDF:', err);\n } finally {\n setSubmitting(false);\n }\n }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete, isLastSigner]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n // Redact fields are visual-only — no interaction in signer mode\n if (field.type === 'blackout' || field.type === 'whiteout') {\n return null;\n }\n\n // Formula fields are always read-only (auto-computed)\n if (field.formula) {\n return (\n <div className=\"field-overlay-value formula\">\n {field.value || '...'}\n </div>\n );\n }\n\n const editable = field.assignee === signer;\n\n if (!editable) {\n // Show pre-filled content as read-only\n if (field.type === 'signature' || field.type === 'initials') {\n return field.value ? (\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n ) : (\n <div className=\"field-overlay-placeholder readonly\">{field.placeholder}</div>\n );\n }\n if (field.type === 'checkbox') {\n return (\n <div className=\"field-checkbox-display readonly\">\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder readonly\">\n {field.value || field.placeholder}\n </div>\n );\n }\n\n // Editable fields\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return (\n <div className=\"field-signature-filled\" onClick={() => handleFieldUpdate(field.id, '')}>\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder editable\">\n {field.placeholder}\n </div>\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <div\n className=\"field-checkbox-display editable\"\n onClick={(e) => {\n e.stopPropagation();\n handleFieldUpdate(field.id, field.value === 'true' ? '' : 'true');\n }}\n >\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n\n if (field.type === 'signed-date') {\n return (\n <div className=\"field-overlay-value\">\n {field.value || new Date().toLocaleDateString()}\n </div>\n );\n }\n\n // Text field — dropdown if options are defined, otherwise input\n const fontStyle = {\n fontSize: `${field.fontSize * 0.6}px`,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing * 0.6}px` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n fontFamily: field.fontFamily === 'Courier' ? '\"Courier New\", Courier, monospace' :\n field.fontFamily === 'TimesRoman' ? '\"Times New Roman\", Times, serif' :\n field.fontFamily === 'Helvetica' ? 'Helvetica, Arial, sans-serif' : undefined,\n };\n\n if (field.type === 'dropdown' || (field.options && field.options.length > 0)) {\n return (\n <select\n className=\"field-inline-input\"\n value={field.value}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n >\n <option value=\"\">{field.placeholder || 'Select...'}</option>\n {(field.options || []).map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n );\n }\n\n return (\n <input\n type={field.textSubtype === 'email' ? 'email' :\n field.textSubtype === 'number' ? 'number' :\n field.textSubtype === 'phone' ? 'tel' :\n field.textSubtype === 'date' ? 'date' : 'text'}\n className=\"field-inline-input\"\n value={field.value}\n placeholder={field.placeholder}\n maxLength={field.maxLength || undefined}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n />\n );\n }, [signer, handleFieldUpdate, setSelectedFieldId]);\n\n // Auto-fill signed-date fields when signature is filled\n useEffect(() => {\n const sigFields = fields.filter(f => f.assignee === signer && f.type === 'signature' && f.value);\n if (sigFields.length > 0) {\n const dateStr = new Date().toLocaleDateString();\n setFields(prev => prev.map(f => {\n if (f.assignee === signer && f.type === 'signed-date' && !f.value) {\n return { ...f, value: dateStr };\n }\n return f;\n }));\n }\n }, [fields.filter(f => f.type === 'signature' && f.value).length]);\n\n // Resolve formula fields whenever any field value changes\n useEffect(() => {\n const hasFormulas = fields.some(f => f.formula);\n if (!hasFormulas) return;\n const resolved = resolveAllFormulas(fields, transforms);\n // Only update if any computed values actually changed\n const changed = resolved.some((f, i) => f.value !== fields[i].value);\n if (changed) setFields(resolved);\n }, [fields, transforms]);\n\n return (\n <div className=\"signer-layout\" ref={containerRef}>\n {loading && <div className=\"loading-indicator\">Loading document...</div>}\n\n <div className=\"signer-content\">\n <div className=\"signer-pdf-area\">\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldIds={new Set(selectedFieldId ? [selectedFieldId] : [])}\n onSelectField={(id) => setSelectedFieldId(id)}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\n <div className=\"signer-panel-header\">\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Signing as</span>\n <strong>{signer}</strong>\n </div>\n {isMultiSigner && (\n <div className=\"signer-step-badge\">\n Step {currentSignerIndex + 1} of {signerOrder.length}\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-body\">\n {selectedField && isFieldEditable && (\n <div className=\"signer-field-input\">\n <h3>{selectedField.label}</h3>\n {selectedField.required && <span className=\"required-badge\">Required</span>}\n\n {(selectedField.type === 'signature' || selectedField.type === 'initials') && (\n <SignatureCanvas\n width={280}\n height={selectedField.type === 'initials' ? 80 : 120}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, dataUrl)}\n initialValue={selectedField.value}\n />\n )}\n\n {(selectedField.type === 'text' || selectedField.type === 'dropdown') && (\n <>\n {selectedField.type === 'dropdown' || (selectedField.options && selectedField.options.length > 0) ? (\n <select\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n className=\"signer-text-input\"\n >\n <option value=\"\">{selectedField.placeholder || 'Select...'}</option>\n {(selectedField.options || []).map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n placeholder={selectedField.placeholder}\n maxLength={selectedField.maxLength || undefined}\n className=\"signer-text-input\"\n />\n )}\n <div className=\"signer-font-size\">\n <label>Font Size</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={selectedField.fontSize}\n onChange={e => handleFieldPropertyUpdate(selectedField.id, { fontSize: Number(e.target.value) })}\n />\n <span>pt</span>\n </div>\n </>\n )}\n\n {selectedField.type === 'checkbox' && (\n <label className=\"signer-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.checked ? 'true' : '')}\n />\n {selectedField.placeholder || 'Check this box'}\n </label>\n )}\n\n {selectedField.type === 'signed-date' && (\n <div className=\"signer-date-display\">\n {selectedField.value || 'Will auto-fill when you sign'}\n </div>\n )}\n </div>\n )}\n\n {selectedField && !isFieldEditable && (\n <div className=\"signer-field-readonly\">\n <h3>{selectedField.label}</h3>\n <p>This field belongs to another signer.</p>\n </div>\n )}\n\n {!selectedField && editableFields.length > 0 && (\n <div className=\"panel-empty\">\n Select a field to fill it in, or use the navigation below.\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-footer\">\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onComplete={handleAdvanceOrSubmit}\n completeLabel={isLastSigner ? (submitLabel || 'Complete') : `Next: ${signerOrder[currentSignerIndex + 1]}`}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\n\nconst FONT_MAP: Record<string, string> = {\n 'Helvetica': StandardFonts.Helvetica,\n 'Courier': StandardFonts.Courier,\n 'TimesRoman': StandardFonts.TimesRoman,\n};\n\nexport async function generateFilledPdf(\n pdfSource: string | ArrayBuffer,\n fields: FormField[],\n): Promise<Uint8Array> {\n let pdfBytes: ArrayBuffer;\n if (typeof pdfSource === 'string') {\n const res = await fetch(pdfSource);\n pdfBytes = await res.arrayBuffer();\n } else {\n pdfBytes = pdfSource;\n }\n\n const pdfDoc = await PDFDocument.load(pdfBytes);\n\n // Embed all needed fonts upfront\n const fontCache = new Map<string, PDFFont>();\n const usedFontKeys = new Set(fields.map(f => f.fontFamily || 'Helvetica'));\n for (const key of usedFontKeys) {\n const stdFont = FONT_MAP[key] || StandardFonts.Helvetica;\n fontCache.set(key, await pdfDoc.embedFont(stdFont));\n }\n\n const pages = pdfDoc.getPages();\n\n function hexToRgb(hex: string) {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n return rgb(r, g, b);\n }\n\n for (const field of fields) {\n const page = pages[field.page];\n if (!page) continue;\n\n const pageWidth = page.getWidth();\n const pageHeight = page.getHeight();\n\n // Convert percentage coordinates to PDF points\n const x = (field.x / 100) * pageWidth;\n const y = pageHeight - ((field.y / 100) * pageHeight) - ((field.height / 100) * pageHeight);\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n // Redact fields always render (no value needed)\n if (field.type === 'blackout' || field.type === 'whiteout') {\n page.drawRectangle({\n x, y, width: w, height: h,\n color: field.type === 'blackout' ? rgb(0, 0, 0) : rgb(1, 1, 1),\n });\n continue;\n }\n\n if (!field.value) continue;\n\n const inkColor = field.inkColor ? hexToRgb(field.inkColor) : rgb(0, 0, 0);\n\n if (field.type === 'checkbox') {\n if (field.value === 'true') {\n // Draw an X checkmark (WinAnsi-safe, no unicode)\n const inset = Math.min(w, h) * 0.2;\n const lineWidth = Math.min(w, h) * 0.08;\n page.drawLine({\n start: { x: x + inset, y: y + inset },\n end: { x: x + w - inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n page.drawLine({\n start: { x: x + w - inset, y: y + inset },\n end: { x: x + inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n }\n } else if (field.type === 'signature' || field.type === 'initials') {\n // Value is a data URL from the canvas\n if (field.value.startsWith('data:image/png')) {\n const pngBytes = Uint8Array.from(\n atob(field.value.split(',')[1]),\n c => c.charCodeAt(0),\n );\n const pngImage = await pdfDoc.embedPng(pngBytes);\n page.drawImage(pngImage, {\n x,\n y,\n width: w,\n height: h,\n });\n }\n } else {\n // Text fields (including signed-date)\n const font = fontCache.get(field.fontFamily || 'Helvetica')!;\n const spacing = field.letterSpacing || 0;\n\n // Calculate text width including letter spacing\n const textWidthAtSize = (text: string, size: number) => {\n const baseWidth = font.widthOfTextAtSize(text, size);\n return baseWidth + spacing * (text.length - 1);\n };\n\n // Auto-shrink font to fit within the field width (single line)\n const maxFontSize = Math.min(field.fontSize, h * 0.7);\n let fontSize = maxFontSize;\n const padding = 4;\n while (fontSize > 4) {\n if (textWidthAtSize(field.value, fontSize) <= w - padding) break;\n fontSize -= 0.5;\n }\n\n if (spacing > 0) {\n // Draw each character individually with custom spacing\n let cx = x + 2;\n const cy = y + h * 0.3;\n for (const char of field.value) {\n page.drawText(char, { x: cx, y: cy, size: fontSize, font, color: inkColor });\n cx += font.widthOfTextAtSize(char, fontSize) + spacing;\n }\n } else {\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n });\n }\n }\n }\n\n return pdfDoc.save();\n}\n\nexport function downloadPdf(bytes: Uint8Array, filename: string) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport async function postPdfToCallback(\n bytes: Uint8Array,\n callbackUrl: string,\n filename: string,\n) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const formData = new FormData();\n formData.append('file', blob, filename);\n\n await fetch(callbackUrl, {\n method: 'POST',\n body: formData,\n });\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField } from '@/types/pdf-builder';\n\ninterface FieldNavigatorProps {\n fields: FormField[];\n currentFieldId: string | null;\n onNavigate: (fieldId: string) => void;\n allRequiredFilled: boolean;\n onComplete: () => void;\n completeLabel?: string;\n}\n\nfunction isFieldFilled(f: FormField): boolean {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onComplete,\n completeLabel = 'Complete',\n}: FieldNavigatorProps) {\n const [showIncomplete, setShowIncomplete] = useState(false);\n const currentIndex = fields.findIndex(f => f.id === currentFieldId);\n const hasPrev = currentIndex > 0;\n const hasNext = currentIndex < fields.length - 1;\n\n const handlePrev = () => {\n if (hasPrev) {\n onNavigate(fields[currentIndex - 1].id);\n }\n };\n\n const handleNext = () => {\n if (hasNext) {\n onNavigate(fields[currentIndex + 1].id);\n }\n };\n\n const filledCount = fields.filter(isFieldFilled).length;\n const incompleteFields = fields.filter(f => !isFieldFilled(f));\n\n // When on the last field (or none selected) and all filled, the forward action is complete/advance\n const showCompleteAsNext = !hasNext && allRequiredFilled;\n\n return (\n <div className=\"field-navigator\">\n <div\n className={`field-navigator-progress ${incompleteFields.length > 0 ? 'clickable' : ''}`}\n onClick={() => incompleteFields.length > 0 && setShowIncomplete(!showIncomplete)}\n >\n {filledCount} of {fields.length} fields completed\n {incompleteFields.length > 0 && (\n <span className=\"field-navigator-toggle\">{showIncomplete ? '\\u25B2' : '\\u25BC'}</span>\n )}\n </div>\n\n {showIncomplete && incompleteFields.length > 0 && (\n <div className=\"incomplete-fields-list\">\n {incompleteFields.map(f => (\n <button\n key={f.id}\n className=\"incomplete-field-item\"\n onClick={() => {\n onNavigate(f.id);\n setShowIncomplete(false);\n }}\n >\n {f.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"field-navigator-controls\">\n <button\n onClick={handlePrev}\n disabled={!hasPrev}\n className=\"nav-btn\"\n >\n Prev\n </button>\n <span className=\"field-navigator-position\">\n {currentIndex >= 0 ? `${currentIndex + 1} / ${fields.length}` : '-'}\n </span>\n {showCompleteAsNext ? (\n <button\n onClick={onComplete}\n className=\"nav-btn nav-btn-complete\"\n >\n {completeLabel}\n </button>\n ) : (\n <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n );\n}\n","import type { FormField } from '@/types/pdf-builder';\n\nexport type TransformFn = (value: string) => string;\nexport type TransformMap = Record<string, TransformFn>;\n\n/** Built-in transforms that ship with exeq. */\nexport const BUILTIN_TRANSFORMS: TransformMap = {\n // Date transforms (expects a parseable date string)\n month: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1); },\n month2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1).padStart(2, '0'); },\n monthname: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'long' }); },\n monthshort: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'short' }); },\n day: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()); },\n day2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()).padStart(2, '0'); },\n year: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()); },\n year2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()).slice(-2); },\n\n // String transforms\n upper: (v) => v.toUpperCase(),\n lower: (v) => v.toLowerCase(),\n trim: (v) => v.trim(),\n first: (v) => v.split(/\\s+/)[0] || '',\n last: (v) => { const parts = v.split(/\\s+/); return parts[parts.length - 1] || ''; },\n initials: (v) => v.split(/\\s+/).map(w => w[0] || '').join('').toUpperCase(),\n\n // Numeric / substring\n last4: (v) => v.slice(-4),\n last2: (v) => v.slice(-2),\n first4: (v) => v.slice(0, 4),\n first2: (v) => v.slice(0, 2),\n digits: (v) => v.replace(/\\D/g, ''),\n number: (v) => { const n = parseFloat(v); return isNaN(n) ? '' : String(n); },\n currency: (v) => { const n = parseFloat(v.replace(/[^0-9.-]/g, '')); return isNaN(n) ? '' : `$${n.toFixed(2)}`; },\n};\n\nconst FORMULA_RE = /\\{\\{(.+?)\\}\\}/g;\nconst PIPE_RE = /^(.+?)\\s*\\|\\s*(.+)$/;\n\n/**\n * Resolve a single formula string against a set of fields and transforms.\n * Formula format: \"{{Source Field Label | transform}}\" or \"{{Source Field Label}}\" (no transform = raw value).\n * Multiple expressions can appear in one formula: \"{{First}} {{Last}}\" → \"Jane Smith\"\n */\nexport function resolveFormula(\n formula: string,\n fields: FormField[],\n customTransforms?: TransformMap,\n): string {\n const transforms = { ...BUILTIN_TRANSFORMS, ...customTransforms };\n\n return formula.replace(FORMULA_RE, (_match, expr: string) => {\n const pipeMatch = expr.match(PIPE_RE);\n const sourceLabel = (pipeMatch ? pipeMatch[1] : expr).trim();\n const transformName = pipeMatch ? pipeMatch[2].trim() : null;\n\n // Find source field by label (case-insensitive) or ID\n const sourceField = fields.find(f => f.label.toLowerCase() === sourceLabel.toLowerCase())\n || fields.find(f => f.id === sourceLabel);\n\n if (!sourceField) return '';\n\n const rawValue = sourceField.value || '';\n if (!transformName) return rawValue;\n\n const fn = transforms[transformName];\n if (!fn) return rawValue; // unknown transform → return raw value\n\n try {\n return fn(rawValue);\n } catch {\n return rawValue;\n }\n });\n}\n\n/**\n * Resolve all formula fields in a fields array.\n * Returns a new array with computed values filled in.\n */\nexport function resolveAllFormulas(\n fields: FormField[],\n customTransforms?: TransformMap,\n): FormField[] {\n return fields.map(f => {\n if (!f.formula) return f;\n const computed = resolveFormula(f.formula, fields, customTransforms);\n return computed !== f.value ? { ...f, value: computed } : f;\n });\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n ×\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";AAEA,SAAS,YAAAA,WAAU,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAAc;AACzD,SAAS,oBAAoB;;;ACHtB,SAAS,aAAqB;AACnC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAW;AAAA,EAC3B;AACA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAO,IAAI,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;AAoCO,IAAM,uBAAuB,CAAC,UAAU,UAAU;AAElD,IAAM,qBAA6C;AAAA,EACxD,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,SAAS,eAAe,MAAsB;AACnD,SAAO,mBAAmB,IAAI,KAAK;AACrC;AAEO,IAAM,gBAAgB;AAAA,EAC3B,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,EACzC,EAAE,OAAO,WAAW,OAAO,cAAc;AAAA,EACzC,EAAE,OAAO,cAAc,OAAO,kBAAkB;AAClD;AAEO,IAAM,iBAAwD;AAAA,EACnE,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AACF;AAEA,IAAM,cAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAGO,SAAS,YAAY,SAAiB,gBAAkC;AAC7E,QAAM,QAAQ,QAAQ,YAAY;AAClC,MAAI,CAAC,eAAe,KAAK,OAAK,EAAE,YAAY,MAAM,KAAK,EAAG,QAAO;AACjE,MAAI,IAAI;AACR,SAAO,eAAe,KAAK,OAAK,EAAE,YAAY,MAAM,GAAG,KAAK,IAAI,CAAC,EAAE,EAAG;AACtE,SAAO,GAAG,OAAO,IAAI,CAAC;AACxB;AAEO,SAAS,YACd,MACA,UACA,MACA,GACA,GACA,gBACW;AACX,QAAM,WAAW,eAAe,IAAI;AACpC,QAAM,YAAY,YAAY,IAAI;AAClC,QAAM,iBAAiB,gBAAgB,IAAI,OAAK,EAAE,KAAK,KAAK,CAAC;AAC7D,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf;AAAA,IACA,OAAO,YAAY,WAAW,cAAc;AAAA,IAC5C,aAAa,SAAS,eAAe;AAAA,IACrC,UAAU,SAAS,cAAc,SAAS,cAAc,SAAS,aAAa,QAAQ;AAAA,IACtF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,SAAS;AAAA,IACzB,QAAQ,SAAS,UAAU;AAAA,IAC3B,UAAU,SAAS,YAAY;AAAA,IAC/B,OAAO;AAAA,IACP,GAAI,SAAS,SAAS,EAAE,aAAa,SAAS,YAA2B,IAAI,CAAC;AAAA,EAChF;AACF;;;ACrKA,YAAY,cAAc;AAG1B,IAAI,OAAO,WAAW,aAAa;AACjC,EAAS,6BAAoB,YAAY,iDAA0D,gBAAO;AAC5G;AASA,eAAsB,eACpB,QACA,QAAgB,GACS;AACzB,QAAM,cAAuB;AAAA,IAC3B,OAAO,WAAW,WAAW,EAAE,KAAK,OAAO,IAAI,EAAE,MAAM,OAAO;AAAA,EAChE;AACA,QAAM,MAAM,MAAM,YAAY;AAC9B,QAAM,QAAwB,CAAC;AAE/B,WAAS,IAAI,GAAG,KAAK,IAAI,UAAU,KAAK;AACtC,UAAM,OAAO,MAAM,IAAI,QAAQ,CAAC;AAChC,UAAM,WAAW,KAAK,YAAY,EAAE,MAAM,CAAC;AAC3C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,SAAS;AACxB,WAAO,SAAS,SAAS;AACzB,UAAM,MAAM,OAAO,WAAW,IAAI;AAElC,UAAM,KAAK,OAAO,EAAE,eAAe,KAAK,SAAS,CAAC,EAAE;AAEpD,UAAM,KAAK;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,OAAO,UAAU,WAAW;AAAA,MACrC,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACzCA,SAAS,QAAQ,mBAAmB;AAyE1B,SASE,KATF;AApDH,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,eAAe,OAAuB,IAAI;AAEhD,QAAM,kBAAkB,YAAY,CAAC,GAAqC,cAAsB;AAC9F,UAAM,SAAS,EAAE;AACjB,QAAI,OAAO,QAAQ,gBAAgB,EAAG;AAEtC,QAAI,aAAa;AACf,YAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,YAAM,KAAM,EAAE,UAAU,KAAK,QAAQ,KAAK,QAAS;AACnD,YAAM,KAAM,EAAE,UAAU,KAAK,OAAO,KAAK,SAAU;AACnD,kBAAY,WAAW,GAAG,CAAC;AAAA,IAC7B,OAAO;AACL,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,CAAC;AAE/B,QAAM,iBAAiB,YAAY,CAAC,MAAuB;AACzD,QAAI,EAAE,aAAa,MAAM,SAAS,6BAA6B,GAAG;AAChE,QAAE,eAAe;AACjB,QAAE,aAAa,aAAa;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,YAAY,CAAC,GAAoB,cAAsB;AACxE,UAAM,YAAY,EAAE,aAAa,QAAQ,6BAA6B;AACtE,QAAI,CAAC,aAAa,CAAC,YAAa;AAChC,MAAE,eAAe;AACjB,UAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,UAAM,KAAM,EAAE,UAAU,KAAK,QAAQ,KAAK,QAAS;AACnD,UAAM,KAAM,EAAE,UAAU,KAAK,OAAO,KAAK,SAAU;AACnD,gBAAY,WAAW,GAAG,GAAG,SAAS;AAAA,EACxC,GAAG,CAAC,WAAW,CAAC;AAEhB,SACE,oBAAC,SAAI,WAAU,cAAa,KAAK,cAC9B,gBAAM,IAAI,CAAC,MAAM,cAAc;AAC9B,UAAM,aAAa,OAAO,OAAO,OAAK,EAAE,SAAS,SAAS;AAC1D,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,GAAG,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG;AAAA,QACvD,SAAS,CAAC,MAAM,gBAAgB,GAAG,SAAS;AAAA,QAC5C,YAAY;AAAA,QACZ,QAAQ,CAAC,MAAM,WAAW,GAAG,SAAS;AAAA,QACtC,aAAW;AAAA,QAEX;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,KAAK;AAAA,cACV,KAAK,QAAQ,YAAY,CAAC;AAAA,cAC1B,WAAU;AAAA,cACV,WAAW;AAAA;AAAA,UACb;AAAA,UACC,WAAW,IAAI,WACd;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,YAAY,iBAAiB,IAAI,MAAM,EAAE;AAAA,cACzC,iBAAiB,iBAAiB,OAAO,KAAK,iBAAiB,IAAI,MAAM,EAAE;AAAA,cAC3E,UAAU,CAAC,MAAM,cAAc,MAAM,IAAI,CAAC;AAAA,cAC1C,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,aAAa,iBAAiB,OAAO,KAAK,iBAAiB,IAAI,MAAM,EAAE,IAAI,cAAc;AAAA,cACzF,aAAa;AAAA,cACb;AAAA,cACA;AAAA,cACA,eAAe;AAAA;AAAA,YAXV,MAAM;AAAA,UAYb,CACD;AAAA;AAAA;AAAA,MA7BI;AAAA,IA8BP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAgBA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,eAAe,OAAkF,IAAI;AAC3G,QAAM,iBAAiB,OAAkF,IAAI;AAE7G,QAAM,WAAW,MAAM,SAAS,cAAc,MAAM,SAAS;AAC7D,QAAM,aAAa,SAAS,cAAe,SAAS,YAAY,MAAM,aAAa;AACnF,QAAM,mBAAmB,SAAS,YAAY,CAAC,YAAY,MAAM,aAAa;AAC9E,QAAM,QAAQ,mBAAmB,YAAY,eAAe,MAAM,QAAQ;AAC1E,QAAM,cAAc,CAAC,cAAc,CAAC,CAAC,MAAM;AAE3C,QAAM,kBAAkB,YAAY,CAAC,MAAwB;AAC3D,QAAI,SAAS,cAAc,CAAC,OAAQ;AACpC,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,aAAS,CAAC;AAEV,UAAM,SAAS,WAAW,SAAS,QAAQ,WAAW;AACtD,QAAI,CAAC,OAAQ;AAEb,iBAAa,UAAU;AAAA,MACrB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,IAChB;AAEA,UAAM,kBAAkB,CAAC,OAAmB;AAC1C,UAAI,CAAC,aAAa,QAAS;AAC3B,YAAM,OAAO,OAAO,sBAAsB;AAC1C,YAAM,MAAO,GAAG,UAAU,aAAa,QAAQ,UAAU,KAAK,QAAS;AACvE,YAAM,MAAO,GAAG,UAAU,aAAa,QAAQ,UAAU,KAAK,SAAU;AAExE,UAAI,mBAAmB,aAAa;AAElC,oBAAY,MAAM,KAAK,WAAW,GAAG,IAAI,EAAE;AAE3C,qBAAa,QAAQ,SAAS,GAAG;AACjC,qBAAa,QAAQ,SAAS,GAAG;AAAA,MACnC,OAAO;AACL,cAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,OAAO,aAAa,QAAQ,SAAS,EAAE,CAAC;AACtF,cAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,QAAQ,aAAa,QAAQ,SAAS,EAAE,CAAC;AACvF,eAAO,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM;AAC1B,mBAAa,UAAU;AACvB,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAEA,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAAA,EAClD,GAAG,CAAC,OAAO,MAAM,QAAQ,UAAU,iBAAiB,aAAa,WAAW,CAAC;AAE7E,QAAM,wBAAwB,YAAY,CAAC,MAAwB;AACjE,QAAI,SAAS,cAAc,CAAC,SAAU;AACtC,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAElB,UAAM,SAAS,WAAW,SAAS,QAAQ,WAAW;AACtD,QAAI,CAAC,OAAQ;AAEb,mBAAe,UAAU;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,IAChB;AAEA,UAAM,kBAAkB,CAACC,OAAkB;AACzC,UAAI,CAAC,eAAe,QAAS;AAC7B,YAAM,OAAO,OAAO,sBAAsB;AAC1C,YAAM,MAAOA,GAAE,UAAU,eAAe,QAAQ,UAAU,KAAK,QAAS;AACxE,YAAM,MAAOA,GAAE,UAAU,eAAe,QAAQ,UAAU,KAAK,SAAU;AACzE,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,GAAG,eAAe,QAAQ,SAAS,EAAE,CAAC;AACpF,YAAM,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,GAAG,eAAe,QAAQ,SAAS,EAAE,CAAC;AACtF,eAAS,MAAM,IAAI,MAAM,IAAI;AAAA,IAC/B;AAEA,UAAM,gBAAgB,MAAM;AAC1B,qBAAe,UAAU;AACzB,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAEA,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAAA,EAClD,GAAG,CAAC,OAAO,MAAM,QAAQ,CAAC;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,iBAAiB,aAAa,aAAa,EAAE,IAAI,aAAa,aAAa,UAAU,IAAI,cAAc,cAAc,EAAE,IAAI,WAAW,WAAW,EAAE,IAAI,mBAAmB,oBAAoB,EAAE;AAAA,MAC3M,OAAO;AAAA,QACL,MAAM,GAAG,MAAM,CAAC;AAAA,QAChB,KAAK,GAAG,MAAM,CAAC;AAAA,QACf,OAAO,GAAG,MAAM,KAAK;AAAA,QACrB,QAAQ,GAAG,MAAM,MAAM;AAAA,QACvB,aAAa,WAAY,MAAM,SAAS,aAAa,SAAS,SAAU;AAAA,QACxE,aAAa,WAAW,WAAW;AAAA,QACnC,iBAAiB,WACZ,MAAM,SAAS,aAAa,YAAY,YACzC,mBAAmB,YAAa,aAAa,GAAG,KAAK,OAAO,GAAG,KAAK;AAAA,QACxE,QAAQ,SAAS,aAAa,SAAU,mBAAmB,YAAY;AAAA,QACvE,eAAgB,SAAS,aAAa,YAAY,oBAAqB,SAAS;AAAA,MAClF;AAAA,MACA,SAAS,CAAC,MAAM;AAAE,UAAE,gBAAgB;AAAG,iBAAS,CAAC;AAAA,MAAG;AAAA,MACpD,aAAa;AAAA,MAEZ;AAAA,iBAAS,cAAc,CAAC,YACvB,oBAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,iBAAiB,MAAM,GAClE,gBAAM,OACT;AAAA,QAGD,gBAAgB,cAAc,KAAK,IAClC,oBAAC,SAAI,WAAU,6BACZ,gBAAM,SAAS,MAAM,aACxB;AAAA,QAGD,SAAS,cAAc,cACtB;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,aAAa;AAAA;AAAA,QACf;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AC5QA,SAAS,gBAAgB;AAyBnB,SACE,OAAAC,MADF,QAAAC,aAAA;AArBN,IAAM,aAAa;AAAA,EACjB,EAAE,OAAO,WAAW,OAAO,QAAQ;AAAA,EACnC,EAAE,OAAO,WAAW,OAAO,OAAO;AACpC;AASO,SAAS,mBAAmB,EAAE,OAAO,aAAa,UAAU,SAAS,GAA4B;AACtG,QAAM,QAAQ,eAAe,MAAM,QAAQ;AAC3C,QAAM,gBAAgB,MAAM,SAAS,cAAc,MAAM,SAAS;AAClE,QAAM,cAAc,MAAM,SAAS,UAAU,MAAM,SAAS,iBAAiB,MAAM,SAAS;AAC5F,QAAM,eAAe,MAAM,SAAS,UAAU,MAAM,SAAS,cAAc,MAAM,SAAS,eAAe,MAAM,SAAS,cAAc,MAAM,SAAS;AACrJ,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE;AAE7C,SACE,gBAAAA,MAAC,SAAI,WAAU,wBACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,gBACb;AAAA,sBAAAD,KAAC,QAAG,OAAO,EAAE,MAAM,GAChB,gBAAM,OACT;AAAA,MACA,gBAAAA,KAAC,YAAO,SAAS,MAAM,SAAS,MAAM,EAAE,GAAG,WAAU,oBAAmB,oBAExE;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,mBAAK;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA;AAAA,MAC7D;AAAA,OACF;AAAA,IAEC,CAAC,iBACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,wBAAU;AAAA,MACjB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,MAAmB,CAAC;AAAA,UAEvE;AAAA,4BAAAD,KAAC,YAAO,OAAM,QAAO,kBAAI;AAAA,YACzB,gBAAAA,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,YACjC,gBAAAA,KAAC,YAAO,OAAM,aAAY,uBAAS;AAAA,YACnC,gBAAAA,KAAC,YAAO,OAAM,eAAc,yBAAW;AAAA,YACvC,gBAAAA,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,YACjC,gBAAAA,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA;AAAA;AAAA,MACnC;AAAA,OACF;AAAA,IAGD,MAAM,SAAS,UACd,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,uBAAS;AAAA,MAChB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM,eAAe;AAAA,UAC5B,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,aAAa,EAAE,OAAO,MAAqB,CAAC;AAAA,UAEhF;AAAA,4BAAAD,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,YACjC,gBAAAA,KAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,YAC7B,gBAAAA,KAAC,YAAO,OAAM,QAAO,kBAAI;AAAA,YACzB,gBAAAA,KAAC,YAAO,OAAM,SAAQ,mBAAK;AAAA,YAC3B,gBAAAA,KAAC,YAAO,OAAM,SAAQ,mBAAK;AAAA;AAAA;AAAA,MAC7B;AAAA,OACF;AAAA,IAGD,CAAC,iBACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,yBAAW;AAAA,MAClB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,UAAU,EAAE,OAAO,MAAM,CAAC;AAAA,UAE7D,sBAAY,IAAI,UACf,gBAAAA,KAAC,YAAkB,OAAO,MAAM,OAAO,EAAE,OAAO,eAAe,IAAI,EAAE,GAClE,kBADU,IAEb,CACD;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAGD,CAAC,iBACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,yBAAW;AAAA,MAClB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,aAAa,EAAE,OAAO,MAAM,CAAC;AAAA;AAAA,MACnE;AAAA,OACF;AAAA,IAGD,eACC,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,qBAAO;AAAA,MACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,MAAM,WAAW;AAAA,UACxB,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,SAAS,EAAE,OAAO,SAAS,OAAU,CAAC;AAAA,UAC1E,aAAY;AAAA;AAAA,MACd;AAAA,MACC,MAAM,WACL,gBAAAA,KAAC,UAAK,WAAU,cAAa,gFAAkE;AAAA,OAEnG;AAAA,IAGD,CAAC,iBAAiB,MAAM,SAAS,cAChC,gBAAAA,KAAC,SAAI,WAAU,eACb,0BAAAC,MAAC,WAAM,WAAU,wBACf;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM;AAAA,UACf,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,UAAU,EAAE,OAAO,QAAQ,CAAC;AAAA;AAAA,MAClE;AAAA,MAAE;AAAA,OAEJ,GACF;AAAA,IAGD,eACC,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,kBAAI;AAAA,MACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM,cAAc;AAAA,UAC3B,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC;AAAA,UAE/D,wBAAc,IAAI,OACjB,gBAAAA,KAAC,YAAqB,OAAO,EAAE,OAAQ,YAAE,SAA5B,EAAE,KAAgC,CAChD;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAGD,eACC,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,4BAAc;AAAA,MACrB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAI;AAAA,UACJ,KAAI;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,UAAU,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,MACxE;AAAA,OACF;AAAA,IAGD,eACC,gBAAAC,MAAC,SAAI,WAAU,mBACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,gCACb;AAAA,wBAAAD,KAAC,WAAM,4BAAc;AAAA,QACrB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAI;AAAA,YACJ,KAAI;AAAA,YACJ,MAAK;AAAA,YACL,OAAO,MAAM,iBAAiB;AAAA,YAC9B,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,eAAe,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,QAC7E;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,SAAI,WAAU,gCACb;AAAA,wBAAAD,KAAC,WAAM,yBAAW;AAAA,QAClB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAI;AAAA,YACJ,KAAI;AAAA,YACJ,MAAK;AAAA,YACL,OAAO,MAAM,cAAc;AAAA,YAC3B,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,YAAY,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,QAC1E;AAAA,SACF;AAAA,OACF;AAAA,IAGD,MAAM,SAAS,UACd,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,4CAA8B;AAAA,MACrC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAI;AAAA,UACJ,KAAI;AAAA,UACJ,OAAO,MAAM,aAAa;AAAA,UAC1B,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,WAAW,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,MACzE;AAAA,OACF;AAAA,IAGD,gBACC,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,uBAAS;AAAA,MAChB,gBAAAA,KAAC,SAAI,WAAU,oBACZ,qBAAW,IAAI,OACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,qBAAqB,MAAM,YAAY,eAAe,EAAE,QAAQ,WAAW,EAAE;AAAA,UACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM;AAAA,UAClC,SAAS,MAAM,SAAS,MAAM,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC;AAAA,UACvD,OAAO,EAAE;AAAA;AAAA,QAJJ,EAAE;AAAA,MAKT,CACD,GACH;AAAA,OACF;AAAA,KAGA,MAAM,SAAS,UAAU,MAAM,SAAS,eACxC,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAO,gBAAM,SAAS,aAAa,YAAY,sBAAqB;AAAA,MACrE,gBAAAC,MAAC,SAAI,WAAU,sBACX;AAAA,eAAM,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,MAC/B,gBAAAA,MAAC,SAAY,WAAU,qBACrB;AAAA,0BAAAD,KAAC,UAAM,eAAI;AAAA,UACX,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAM;AACb,sBAAM,WAAW,MAAM,WAAW,CAAC,GAAG,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;AAC9D,yBAAS,MAAM,IAAI,EAAE,SAAS,QAAQ,SAAS,IAAI,UAAU,OAAU,CAAC;AAAA,cAC1E;AAAA,cACD;AAAA;AAAA,UAED;AAAA,aAVQ,CAWV,CACD;AAAA,QACD,gBAAAC,MAAC,SAAI,WAAU,oBACb;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,OAAK,aAAa,EAAE,OAAO,KAAK;AAAA,cAC1C,WAAW,OAAK;AACd,oBAAI,EAAE,QAAQ,WAAW,UAAU,KAAK,GAAG;AACzC,2BAAS,MAAM,IAAI,EAAE,SAAS,CAAC,GAAI,MAAM,WAAW,CAAC,GAAI,UAAU,KAAK,CAAC,EAAE,CAAC;AAC5E,+BAAa,EAAE;AAAA,gBACjB;AAAA,cACF;AAAA,cACA,aAAY;AAAA;AAAA,UACd;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM;AACb,oBAAI,UAAU,KAAK,GAAG;AACpB,2BAAS,MAAM,IAAI,EAAE,SAAS,CAAC,GAAI,MAAM,WAAW,CAAC,GAAI,UAAU,KAAK,CAAC,EAAE,CAAC;AAC5E,+BAAa,EAAE;AAAA,gBACjB;AAAA,cACF;AAAA,cACD;AAAA;AAAA,UAED;AAAA,WACF;AAAA,SACF;AAAA,MACC,MAAM,SAAS,eAAe,MAAM,SAAS,UAAU,OAAO,KAC7D,gBAAAA,KAAC,UAAK,WAAU,cAAa,OAAO,EAAE,OAAO,OAAO,GAAG,qCAAuB;AAAA,MAE/E,MAAM,SAAS,WAAW,MAAM,SAAS,UAAU,KAAK,KACvD,gBAAAA,KAAC,UAAK,WAAU,cAAa,gEAAkD;AAAA,OAEnF;AAAA,KAEJ;AAEJ;;;AC5QA,SAAS,UAAAE,SAAQ,YAAAC,WAAU,eAAAC,cAAa,iBAAiB;AACzD,SAAS,iBAAiB;AAwIpB,gBAAAC,MAUA,QAAAC,aAVA;AA7HN,SAAS,qBAAqB,QAAoB;AAChD,MAAI,CAAC,OAAO,OAAQ,QAAO;AAE3B,QAAM,IAAI,OAAO;AAAA,IACf,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,QAAQ;AACzB,YAAM,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM;AACzC,UAAI,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,CAAC;AAC7C,aAAO;AAAA,IACT;AAAA,IACA,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG;AAAA,EACzB;AAEA,IAAE,KAAK,GAAG;AACV,SAAO,EAAE,KAAK,GAAG;AACnB;AAEO,SAAS,gBAAgB;AAAA,EAC9B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAyB;AACvB,QAAM,YAAYJ,QAA0B,IAAI;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA4B,IAAI;AACtE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,CAAC,YAAY;AAGpD,YAAU,MAAM;AACd,QAAI,gBAAgB,UAAU,SAAS;AACrC,YAAM,MAAM,UAAU,QAAQ,WAAW,IAAI;AAC7C,YAAM,MAAM,IAAI,MAAM;AACtB,UAAI,SAAS,MAAM;AACjB,YAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,YAAI,UAAU,KAAK,GAAG,GAAG,OAAO,MAAM;AAAA,MACxC;AACA,UAAI,MAAM;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,MAAM,CAAC;AAGhC,YAAU,MAAM;AACd,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AAEjC,UAAM,WAAW,cAAc,CAAC,GAAG,OAAO,WAAW,IAAI;AAEzD,eAAW,QAAQ,UAAU;AAC3B,YAAM,SAAS,UAAU,MAAM;AAAA,QAC7B,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,QACX,YAAY;AAAA,MACd,CAAC;AACD,YAAM,UAAU,qBAAqB,MAAM;AAC3C,YAAM,SAAS,IAAI,OAAO,OAAO;AACjC,UAAI,YAAY;AAChB,UAAI,KAAK,MAAM;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,OAAO,MAAM,CAAC;AAEtC,QAAM,WAAWC,aAAY,CAAC,MAA0B;AACtD,UAAM,SAAS,UAAU;AACzB,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,QAAQ,iBAAiB,MAAM;AACrC,UAAM,UAAU,WAAW,MAAM,eAAe,KAAK;AACrD,UAAM,UAAU,WAAW,MAAM,cAAc,KAAK;AACpD,UAAM,UAAU,WAAW,MAAM,gBAAgB,KAAK;AACtD,UAAM,UAAU,WAAW,MAAM,iBAAiB,KAAK;AAEvD,UAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,UAAM,WAAW,KAAK,SAAS,UAAU;AACzC,UAAM,SAAS,OAAO,QAAQ;AAC9B,UAAM,SAAS,OAAO,SAAS;AAC/B,WAAO;AAAA,OACJ,EAAE,UAAU,KAAK,OAAO,WAAW;AAAA,OACnC,EAAE,UAAU,KAAK,MAAM,WAAW;AAAA,MACnC,EAAE;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,MAA0B;AAC/D,MAAE,eAAe;AACjB,IAAC,EAAE,OAAuB,kBAAkB,EAAE,SAAS;AACvD,mBAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AAAA,EAC9B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,oBAAoBA,aAAY,CAAC,MAA0B;AAC/D,QAAI,CAAC,YAAa;AAClB,MAAE,eAAe;AACjB,mBAAe,CAAC,GAAG,aAAa,SAAS,CAAC,CAAC,CAAC;AAAA,EAC9C,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,QAAM,kBAAkBA,aAAY,MAAM;AACxC,QAAI,CAAC,YAAa;AAClB,aAAS,UAAQ,CAAC,GAAG,MAAM,WAAW,CAAC;AACvC,mBAAe,IAAI;AACnB,eAAW,KAAK;AAGhB,0BAAsB,MAAM;AAC1B,UAAI,UAAU,SAAS;AACrB,eAAO,UAAU,QAAQ,UAAU,WAAW,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,cAAcA,aAAY,MAAM;AACpC,aAAS,CAAC,CAAC;AACX,mBAAe,IAAI;AACnB,eAAW,IAAI;AACf,UAAM,SAAS,UAAU;AACzB,QAAI,QAAQ;AACV,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,aAAO,EAAE;AAAA,IACX;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,MAAM,CAAC;AAE1B,SACE,gBAAAE,MAAC,SAAI,WAAW,4BAA4B,aAAa,EAAE,IACzD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QACV,eAAe;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA,QACb,OAAO,EAAE,aAAa,OAAO;AAAA;AAAA,IAC/B;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,4BACZ;AAAA,OAAC,WACA,gBAAAD,KAAC,YAAO,MAAK,UAAS,SAAS,aAAa,WAAU,uBAAsB,mBAE5E;AAAA,MAED,WAAW,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,uCAAyB;AAAA,OACxE;AAAA,KACF;AAEJ;;;AC9JA,IAAM,aAAa,IAAI,IAAI;AAAA,EACzB;AAAA,EACA,QAAQ,IAAI;AACd,EAAE,OAAO,OAAO,CAAC;AAEV,SAAS,cAAc,KAAkC;AAC9D,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,WAAW,IAAI,GAAG;AAC3B;;;AN2CU,SA+XN,UA/XM,OAAAE,MACA,QAAAC,aADA;AAvBV,IAAM,kBAAsF;AAAA,EAC1F,EAAE,MAAM,QAAQ,OAAO,QAAQ,MAAM,IAAI;AAAA,EACzC,EAAE,MAAM,YAAY,OAAO,YAAY,MAAM,SAAI;AAAA,EACjD,EAAE,MAAM,aAAa,OAAO,aAAa,MAAM,SAAI;AAAA,EACnD,EAAE,MAAM,eAAe,OAAO,QAAQ,MAAM,YAAK;AAAA,EACjD,EAAE,MAAM,YAAY,OAAO,YAAY,MAAM,SAAI;AAAA,EACjD,EAAE,MAAM,YAAY,OAAO,YAAY,MAAM,KAAK;AAAA,EAClD,EAAE,MAAM,YAAY,OAAO,YAAY,MAAM,UAAK,OAAO,SAAS;AAAA,EAClE,EAAE,MAAM,YAAY,OAAO,YAAY,MAAM,UAAK,OAAO,SAAS;AACpE;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAuB,CAAC,GAAG;AACzB,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WACE,gBAAAD,KAAC,SAAI,WAAU,mBACb,0BAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,QAAG,6BAAe;AAAA,MACnB,gBAAAC,MAAC,OAAE;AAAA;AAAA,QAA+C,gBAAAD,KAAC,OAAE,MAAK,oBAAmB,sBAAQ;AAAA,QAAI;AAAA,SAAY;AAAA,OACvG,GACF;AAAA,EAEJ;AACA,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAyB,CAAC,CAAC;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAsB,iBAAiB,UAAU,CAAC,CAAC;AAC/E,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AAC/E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAmB,iBAAiB,eAAe,CAAC,GAAG,oBAAoB,CAAC;AAClH,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,QAAQ;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAoB,MAAM;AACxE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAsC,IAAI;AAC5E,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAkC,YAAY;AAC9E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAA2B,IAAI;AACjF,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,GAAG;AAChD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAsB,CAAC,CAAC;AACtE,QAAM,eAAeC,QAA8B,IAAI;AACvD,QAAM,cAAcA,QAAO,KAAK;AAChC,QAAM,gBAAgBA,QAA2G,CAAC,CAAC;AAGnI,EAAAC,WAAU,MAAM;AACd,UAAM,SAAS,iBAAiB,iBAAiB;AACjD,QAAI,QAAQ;AACV,cAAQ,MAAM;AACd;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,UAAM,WAAW,OAAO,IAAI,KAAK;AACjC,QAAI,UAAU;AACZ,cAAQ,QAAQ;AAAA,IAClB;AAEA,UAAM,gBAAgB,CAAC,MAAoB;AACzC,UAAI,EAAE,MAAM,SAAS,cAAc,EAAE,KAAK,KAAK;AAC7C,gBAAQ,EAAE,KAAK,GAAG;AAAA,MACpB;AACA,UAAI,EAAE,MAAM,SAAS,iBAAiB;AACpC,YAAI,EAAE,KAAK,OAAQ,WAAU,EAAE,KAAK,MAAM;AAC1C,YAAI,EAAE,KAAK,YAAa,gBAAe,EAAE,KAAK,WAAW;AACzD,YAAI,EAAE,KAAK,OAAQ,SAAQ,EAAE,KAAK,MAAM;AAAA,MAC1C;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,eAAe,eAAe,CAAC;AAEnC,QAAM,UAAUC,aAAY,OAAO,WAAiC;AAClE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,MAAM;AAC5C,eAAS,QAAQ;AACjB,mBAAa,MAAM;AAAA,IACrB,SAAS,KAAK;AACZ,cAAQ,MAAM,uBAAuB,GAAG;AAAA,IAC1C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,CAAC,MAA2C;AAC/E,UAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MAAM;AACpB,UAAI,OAAO,OAAQ,SAAQ,OAAO,MAAqB;AAAA,IACzD;AACA,WAAO,kBAAkB,IAAI;AAAA,EAC/B,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,kBAAkBA,aAAY,CAAC,MAAc,GAAW,MAAc;AAC1E,UAAM,QAAQ,YAAY,iBAAiB,YAAY,MAAM,GAAG,GAAG,MAAM;AACzE,UAAM,SAAS,cAAc,QAAQ,eAAe;AACpD,UAAM,cAAc,SAAS,EAAE,GAAG,OAAO,GAAG,OAAO,IAAI;AACvD,cAAU,UAAQ,CAAC,GAAG,MAAM,WAAW,CAAC;AACxC,wBAAoB,oBAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AAC7C,gBAAY,YAAY;AAAA,EAC1B,GAAG,CAAC,iBAAiB,YAAY,MAAM,CAAC;AAExC,QAAM,kBAAkBA,aAAY,CAAC,IAAY,MAAc,GAAW,MAAc;AACtF,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC;AAAA,EACzE,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,IAAY,OAAe,WAAmB;AACnF,cAAU,UAAQ;AAChB,YAAM,QAAQ,KAAK,KAAK,OAAK,EAAE,OAAO,EAAE;AACxC,UAAI,OAAO;AACT,cAAM,WAAW,cAAc,QAAQ,MAAM,IAAI,KAAK,CAAC;AACvD,sBAAc,QAAQ,MAAM,IAAI,IAAI,EAAE,GAAG,UAAU,OAAO,QAAQ,UAAU,MAAM,SAAS;AAAA,MAC7F;AACA,aAAO,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,CAAC;AAAA,IAChE,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,IAAY,YAAgC;AACjF,cAAU,UAAQ;AAChB,UAAI,QAAQ,UAAU,QAAW;AAC/B,cAAM,cAAc,KAAK,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE,IAAI,OAAK,EAAE,KAAK;AAClE,gBAAQ,QAAQ,YAAY,QAAQ,OAAO,WAAW;AAAA,MACxD;AACA,YAAM,UAAU,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAC;AAGpE,YAAM,QAAQ,KAAK,KAAK,OAAK,EAAE,OAAO,EAAE;AACxC,UAAI,UAAU,QAAQ,aAAa,UAAa,QAAQ,UAAU,UAAa,QAAQ,WAAW,UAAa,QAAQ,aAAa,SAAY;AAC9I,cAAM,SAAS,EAAE,GAAG,OAAO,GAAG,QAAQ;AACtC,sBAAc,QAAQ,MAAM,IAAI,IAAI;AAAA,UAClC,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,OAAe;AACpD,cAAU,UAAQ,KAAK,OAAO,OAAK,EAAE,OAAO,EAAE,CAAC;AAC/C,wBAAoB,UAAQ;AAC1B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,EAAE;AACd,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,IAAmB,MAAyB;AACjF,QAAI,CAAC,IAAI;AACP,0BAAoB,oBAAI,IAAI,CAAC;AAC7B;AAAA,IACF;AACA,QAAI,MAAM,EAAE,WAAW,EAAE,UAAU;AAEjC,0BAAoB,UAAQ;AAC1B,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,YAC3B,MAAK,IAAI,EAAE;AAChB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,WAAW,KAAK,EAAE,YAAY,iBAAiB,OAAO,GAAG;AAEvD,YAAM,SAAS,MAAM,KAAK,gBAAgB,EAAE,IAAI;AAChD,YAAM,SAAS,aAAa,IAAI,OAAK,EAAE,EAAE;AACzC,YAAM,IAAI,OAAO,QAAQ,MAAM;AAC/B,YAAM,IAAI,OAAO,QAAQ,EAAE;AAC3B,UAAI,KAAK,KAAK,KAAK,GAAG;AACpB,cAAM,QAAQ,KAAK,IAAI,GAAG,CAAC;AAC3B,cAAM,MAAM,KAAK,IAAI,GAAG,CAAC;AACzB,cAAM,QAAQ,OAAO,MAAM,OAAO,MAAM,CAAC;AACzC,4BAAoB,UAAQ;AAC1B,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,gBAAM,QAAQ,SAAO,KAAK,IAAI,GAAG,CAAC;AAClC,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,OAAO;AACL,4BAAoB,oBAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,MACnC;AAAA,IACF,OAAO;AACL,0BAAoB,oBAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,IACnC;AACA,gBAAY,YAAY;AAAA,EAC1B,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,kBAAkBA,aAAY,CAAC,KAAe,IAAY,OAAe;AAC7E,cAAU,UAAQ,KAAK,IAAI,OAAK;AAC9B,UAAI,CAAC,IAAI,SAAS,EAAE,EAAE,EAAG,QAAO;AAChC,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1D,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC3D,aAAO,EAAE,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK;AAAA,IAClC,CAAC,CAAC;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA,aAAY,MAAM;AACtC,UAAM,OAAO,YAAY,KAAK;AAC9B,QAAI,QAAQ,CAAC,YAAY,SAAS,IAAI,GAAG;AACvC,qBAAe,UAAQ,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IACxC;AACA,mBAAe,EAAE;AACjB,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,aAAa,WAAW,CAAC;AAE7B,QAAM,mBAAmBA,aAAY,CAAC,SAAiB;AACrD,mBAAe,UAAQ,KAAK,OAAO,OAAK,MAAM,IAAI,CAAC;AACnD,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,aAAa,OAAO,EAAE,GAAG,GAAG,UAAU,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7F,QAAI,eAAe,KAAM,eAAc,YAAY,CAAC,CAAC;AAAA,EACvD,GAAG,CAAC,aAAa,UAAU,CAAC;AAE5B,QAAM,eAAeA,aAAY,MAAM;AACrC,UAAM,WAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,cAAc,WAAW,YAAY;AAAA,IACtD;AAEA,QAAI,QAAQ;AACV,aAAO,QAAQ;AAAA,IACjB,OAAO;AACL,YAAM,OAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAC7C,YAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,WAAW;AACb,QAAE,MAAM;AACR,UAAI,gBAAgB,GAAG;AAAA,IACzB;AAEA,WAAO,QAAQ,YAAY,EAAE,MAAM,kBAAkB,SAAS,GAAG,GAAG;AAAA,EACtE,GAAG,CAAC,QAAQ,aAAa,WAAW,MAAM,CAAC;AAG3C,QAAM,yBAAyBA,aAAY,CAAC,GAAoB,SAAoB;AAClF,yBAAqB,IAAI;AACzB,MAAE,aAAa,QAAQ,+BAA+B,IAAI;AAC1D,MAAE,aAAa,gBAAgB;AAG/B,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,cAAc,gBAAgB,KAAK,OAAK,EAAE,SAAS,IAAI,GAAG,SAAS;AACzE,UAAM,MAAM,UAAU;AAAA;AAAA,uCAEa,eAAe,UAAU,CAAC;AAAA;AAAA;AAAA;AAI7D,aAAS,KAAK,YAAY,KAAK;AAC/B,MAAE,aAAa,aAAa,OAAO,IAAI,EAAE;AACzC,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,uBAAuBA,aAAY,MAAM;AAC7C,yBAAqB,IAAI;AACzB,QAAI,aAAa,SAAS;AACxB,eAAS,KAAK,YAAY,aAAa,OAAO;AAC9C,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,CAAC,MAAc,GAAW,GAAW,cAAyB;AACjG,UAAM,QAAQ,YAAY,WAAW,YAAY,MAAM,GAAG,GAAG,MAAM;AACnE,UAAM,SAAS,cAAc,QAAQ,SAAS;AAC9C,UAAM,cAAc,SAAS,EAAE,GAAG,OAAO,GAAG,OAAO,IAAI;AACvD,cAAU,UAAQ,CAAC,GAAG,MAAM,WAAW,CAAC;AACxC,wBAAoB,oBAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AAC7C,gBAAY,YAAY;AAAA,EAC1B,GAAG,CAAC,YAAY,MAAM,CAAC;AAGvB,EAAAD,WAAU,MAAM;AACd,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAI,EAAE,QAAQ,YAAY,EAAE,QAAQ,YAAa;AACjD,UAAI,iBAAiB,SAAS,EAAG;AAEjC,YAAM,OAAO,SAAS,eAAe,WAAW,IAAI,YAAY;AAChE,UAAI,QAAQ,WAAW,QAAQ,cAAc,QAAQ,SAAU;AAC/D,UAAK,SAAS,eAA+B,kBAAmB;AAEhE,QAAE,eAAe;AACjB,YAAM,QAAQ,iBAAiB;AAC/B,UAAI,OAAO,QAAQ,UAAU,QAAQ,IAAI,GAAG,KAAK,YAAY,YAAY,GAAG,GAAG;AAC7E,kBAAU,UAAQ,KAAK,OAAO,OAAK,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/D,4BAAoB,oBAAI,IAAI,CAAC;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,gBAAgB,CAAC;AAGrB,EAAAA,WAAU,MAAM;AACd,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,YAAM,OAAO,SAAS,eAAe,WAAW,IAAI,YAAY;AAChE,UAAI,QAAQ,WAAW,QAAQ,cAAc,QAAQ,SAAU;AAC/D,UAAK,SAAS,eAA+B,kBAAmB;AAEhE,YAAM,QAAQ,EAAE,WAAW,EAAE;AAG7B,UAAI,SAAS,EAAE,QAAQ,OAAO,iBAAiB,OAAO,GAAG;AACvD,cAAM,WAAW,OAAO,OAAO,OAAK,iBAAiB,IAAI,EAAE,EAAE,CAAC;AAC9D,YAAI,SAAS,SAAS,GAAG;AACvB,YAAE,eAAe;AACjB,6BAAmB,QAAQ;AAAA,QAC7B;AAAA,MACF;AAGA,UAAI,SAAS,EAAE,QAAQ,OAAO,gBAAgB,SAAS,GAAG;AACxD,UAAE,eAAe;AACjB,YAAI,iBAAiB,OAAO,IAAI,OAAK,EAAE,KAAK;AAC5C,cAAM,SAAS,oBAAI,IAAY;AAC/B,cAAM,YAAY,gBAAgB,IAAI,QAAM;AAC1C,gBAAM,QAAQ,YAAY,GAAG,OAAO,cAAc;AAClD,yBAAe,KAAK,KAAK;AACzB,gBAAM,KAAK,WAAW;AACtB,iBAAO,IAAI,EAAE;AACb,iBAAO,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG;AAAA,QACjE,CAAC;AACD,kBAAU,UAAQ,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;AACzC,4BAAoB,MAAM;AAC1B,oBAAY,YAAY;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,kBAAkB,QAAQ,eAAe,CAAC;AAG9C,QAAM,oBAAoBC,aAAY,CAAC,MAAwB;AAC7D,MAAE,eAAe;AACjB,gBAAY,UAAU;AACtB,UAAM,SAAS,EAAE;AACjB,UAAM,aAAa;AAEnB,UAAM,kBAAkB,CAACC,OAAkB;AACzC,UAAI,CAAC,YAAY,QAAS;AAC1B,YAAM,QAAQ,SAASA,GAAE;AACzB,oBAAc,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,IAChE;AAEA,UAAM,gBAAgB,MAAM;AAC1B,kBAAY,UAAU;AACtB,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAEA,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAAA,EAClD,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,eAAe,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9C,QAAI,EAAE,SAAS,EAAE,KAAM,QAAO,EAAE,OAAO,EAAE;AAEzC,UAAM,gBAAgB;AACtB,QAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,cAAe,QAAO,EAAE,IAAI,EAAE;AACxD,WAAO,EAAE,IAAI,EAAE;AAAA,EACjB,CAAC;AAGD,QAAM,gBAAgB,iBAAiB,SAAS,IAC5C,OAAO,KAAK,OAAK,EAAE,OAAO,MAAM,KAAK,gBAAgB,EAAE,CAAC,CAAC,KAAK,OAC9D;AAEJ,QAAM,qBAAqBD,aAAY,CAAC,UAAqB;AAC3D,QAAI,MAAM,SAAS,cAAc,MAAM,SAAS,YAAY;AAC1D,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAC3D,UAAI,MAAM,OAAO;AACf,eAAO,gBAAAL,KAAC,SAAI,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,WAAU,2BAA0B;AAAA,MACtF;AAAA,IACF;AACA,UAAM,WAAW,MAAM,YAAY;AACnC,UAAM,gBAAgB,MAAM,eAAe,YAAY,sCACjC,MAAM,eAAe,eAAe,oCACpC,MAAM,eAAe,cAAc,iCAAiC;AAC1F,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,MAAM,QAAQ,WAAW;AAAA,UAChC,UAAU,GAAG,MAAM,WAAW,GAAG;AAAA,UACjC,YAAY;AAAA,UACZ,eAAe,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,GAAG,OAAO;AAAA,UACxE,YAAY,MAAM,aAAa,GAAG,MAAM,UAAU,KAAK;AAAA,QACzD;AAAA,QAEC,gBAAM,SAAS,MAAM;AAAA;AAAA,IACxB;AAAA,EAEJ,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,gBAAgB,MAAM,SAAS,IACnC,gBAAAC,MAAA,YACE;AAAA,oBAAAA,MAAC,WAAM,WAAU,iCAAgC;AAAA;AAAA,MAE/C,gBAAAD,KAAC,WAAM,MAAK,QAAO,QAAO,QAAO,UAAU,kBAAkB,QAAM,MAAC;AAAA,OACtE;AAAA,IACA,gBAAAA,KAAC,YAAO,SAAS,cAAc,WAAU,iCAAgC,6BAEzE;AAAA,KACF,IACE;AAEJ,SACE,gBAAAC,MAAC,SAAI,WAAU,mBAEZ;AAAA,qBAAiB,WAAW,iBAAiB,aAAa,eAAe,gBAAgB,OAAO;AAAA,IAGhG,CAAC,cAAc,CAAC,mBACf,gBAAAD,KAAC,SAAI,WAAU,mBACb,0BAAAA,KAAC,SAAI,WAAU,yBACZ,yBACH,GACF;AAAA,IAGF,gBAAAC,MAAC,SAAI,WAAU,iBAEZ;AAAA,YAAM,SAAS,KACd,gBAAAA,MAAC,SAAI,WAAU,oBAEb;AAAA,wBAAAD,KAAC,SAAI,WAAU,mBAAkB,4BAAc;AAAA,QAC/C,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU,OAAK,cAAc,EAAE,OAAO,KAAK;AAAA,cAC3C,OAAO,EAAE,aAAa,eAAe,UAAU,GAAG,OAAO,eAAe,UAAU,EAAE;AAAA,cAEnF,sBAAY,IAAI,UACf,gBAAAA,KAAC,YAAkB,OAAO,MAAO,kBAApB,IAAyB,CACvC;AAAA;AAAA,UACH;AAAA,UACC,eACC,gBAAAC,MAAC,SAAI,WAAU,2BACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA,gBAC5C,WAAW,OAAK,EAAE,QAAQ,WAAW,cAAc;AAAA,gBACnD,aAAY;AAAA,gBACZ,WAAS;AAAA;AAAA,YACX;AAAA,YACA,gBAAAA,KAAC,YAAO,SAAS,eAAe,iBAAG;AAAA,YACnC,gBAAAA,KAAC,YAAO,SAAS,MAAM;AAAE,8BAAgB,KAAK;AAAG,6BAAe,EAAE;AAAA,YAAG,GAAG,oBAAM;AAAA,aAChF,IAEA,gBAAAA,KAAC,YAAO,WAAU,yBAAwB,SAAS,MAAM,gBAAgB,IAAI,GAAG,wBAEhF;AAAA,WAEJ;AAAA,QAEA,gBAAAA,KAAC,SAAI,WAAU,mBAAkB;AAAA,QACjC,gBAAAA,KAAC,SAAI,WAAU,mBAAkB,oBAAM;AAAA,QACtC,gBAAgB,OAAO,OAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,OAAO,KAAK,MAC9D,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,gBAAgB,oBAAoB,OAAO,WAAW,EAAE;AAAA,YACnE,WAAS;AAAA,YACT,SAAS,MAAM,mBAAmB,IAAI;AAAA,YACtC,aAAa,CAAC,MAAM,uBAAuB,GAAG,IAAI;AAAA,YAClD,WAAW;AAAA,YAEX;AAAA,8BAAAD,KAAC,UAAK,WAAU,qBAAqB,gBAAK;AAAA,cAC1C,gBAAAA,KAAC,UAAK,WAAU,sBAAsB,iBAAM;AAAA;AAAA;AAAA,UARvC;AAAA,QASP,CACD;AAAA,QAED,gBAAAA,KAAC,SAAI,WAAU,mBAAkB;AAAA,QACjC,gBAAAA,KAAC,SAAI,WAAU,mBAAkB,oBAAM;AAAA,QACtC,gBAAgB,OAAO,OAAK,EAAE,UAAU,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,OAAO,KAAK,MAC1E,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,gBAAgB,oBAAoB,OAAO,WAAW,EAAE;AAAA,YACnE,WAAS;AAAA,YACT,SAAS,MAAM,mBAAmB,IAAI;AAAA,YACtC,aAAa,CAAC,MAAM,uBAAuB,GAAG,IAAI;AAAA,YAClD,WAAW;AAAA,YAEX;AAAA,8BAAAD,KAAC,UAAK,WAAU,qBAAqB,gBAAK;AAAA,cAC1C,gBAAAA,KAAC,UAAK,WAAU,sBAAsB,iBAAM;AAAA;AAAA;AAAA,UARvC;AAAA,QASP,CACD;AAAA,SACH;AAAA,MAIF,gBAAAC,MAAC,SAAI,WAAU,qBACZ;AAAA,mBAAW,gBAAAD,KAAC,SAAI,WAAU,qBAAoB,4BAAc;AAAA,QAC5D,CAAC,MAAM,UAAU,CAAC,WACjB,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,KAAC,QAAG,uCAAyB;AAAA,UAC7B,gBAAAA,KAAC,OAAE,kHAA+F;AAAA,UAClG,gBAAAC,MAAC,WAAM,WAAU,+BAA8B;AAAA;AAAA,YAE7C,gBAAAD,KAAC,WAAM,MAAK,QAAO,QAAO,QAAO,UAAU,kBAAkB,QAAM,MAAC;AAAA,aACtE;AAAA,WACF;AAAA,QAED,MAAM,SAAS,KACd,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe;AAAA,YACf,aAAa;AAAA,YACb,eAAe;AAAA,YACf,aAAa;AAAA,YACb,aAAa;AAAA,YACb,aAAa;AAAA,YACb,MAAK;AAAA,YACL;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA,MAGC,MAAM,SAAS,KACd,gBAAAC,MAAA,YACA;AAAA,wBAAAD,KAAC,SAAI,WAAU,uBAAsB,aAAa,mBAAmB;AAAA,QACrE,gBAAAC,MAAC,SAAI,WAAU,kBAAiB,OAAO,EAAE,OAAO,WAAW,GACzD;AAAA,0BAAAA,MAAC,SAAI,WAAU,yBACb;AAAA,4BAAAD,KAAC,UAAK,WAAU,+BAA8B,wBAAU;AAAA,YACxD,gBAAAA,KAAC,YAAQ,sBAAW;AAAA,aACtB;AAAA,UAEA,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,aAAa,aAAa,eAAe,WAAW,EAAE;AAAA,gBACjE,SAAS,MAAM,YAAY,YAAY;AAAA,gBACxC;AAAA;AAAA,YAED;AAAA,YACA,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,aAAa,aAAa,WAAW,WAAW,EAAE;AAAA,gBAC7D,SAAS,MAAM,YAAY,QAAQ;AAAA,gBACpC;AAAA;AAAA,kBACY,OAAO,SAAS,IAAI,KAAK,OAAO,MAAM,MAAM;AAAA;AAAA;AAAA,YACzD;AAAA,aACF;AAAA,UAGA,gBAAAA,MAAC,SAAI,WAAU,qBACZ;AAAA,yBAAa,gBACZ,gBAAAD,KAAA,YACG,2BAAiB,OAAO,IACvB,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,8BAAAA,MAAC,YAAQ;AAAA,iCAAiB;AAAA,gBAAK;AAAA,iBAAgB;AAAA,cAC/C,gBAAAD,KAAC,OAAE,sFAAwE;AAAA,eAC7E,IACE,gBACF,gBAAAC,MAAA,YACE;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP;AAAA,kBACA,UAAU;AAAA,kBACV,UAAU;AAAA;AAAA,cACZ;AAAA,cAEC,cAAc,SAAS,cAAc,cAAc,SAAS,cAC3D,gBAAAC,MAAC,SAAI,WAAU,mBACb;AAAA,gCAAAD,KAAC,QAAG,4BAAc;AAAA,gBAChB,cAAc,SAAS,eAAe,cAAc,SAAS,aAC7D,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,aAAa;AAAA,oBACpB,QAAQ,cAAc,SAAS,aAAa,MAAM;AAAA,oBAClD,QAAQ,CAAC,YAAY,kBAAkB,cAAc,IAAI,EAAE,OAAO,QAAQ,CAAC;AAAA,oBAC3E,cAAc,cAAc;AAAA,oBAC5B,UAAU,cAAc;AAAA;AAAA,gBAC1B,IACE,cAAc,SAAS,aACzB,gBAAAC,MAAC,WAAM,WAAU,wBACf;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,cAAc,UAAU;AAAA,sBACjC,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,EAAE,OAAO,UAAU,SAAS,GAAG,CAAC;AAAA;AAAA,kBAC9F;AAAA,kBAAE;AAAA,mBAEJ,IAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,cAAc,gBAAgB,UAAU,UACxC,cAAc,gBAAgB,WAAW,WACzC,cAAc,gBAAgB,UAAU,QACxC,cAAc,gBAAgB,SAAS,SAAS;AAAA,oBACtD,OAAO,cAAc;AAAA,oBACrB,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA,oBAC5E,aAAa,YAAY,cAAc,KAAK;AAAA,oBAC5C,WAAU;AAAA,oBACV,OAAO,EAAE,OAAO,cAAc,YAAY,UAAU;AAAA;AAAA,gBACtD;AAAA,iBAEJ;AAAA,eAEJ,IAEA,gBAAAA,KAAC,SAAI,WAAU,eAAc,oGAE7B,GAEJ;AAAA,YAGD,aAAa,YACZ,gBAAAA,KAAA,YACG,iBAAO,WAAW,IACjB,gBAAAA,KAAC,SAAI,WAAU,eAAc,+GAE7B,IAEA,gBAAAA,KAAC,SAAI,WAAU,cACZ,uBAAa,IAAI,OAChB,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAW,mBAAmB,iBAAiB,IAAI,EAAE,EAAE,IAAI,WAAW,EAAE;AAAA,gBACxE,SAAS,MAAM;AAAE,sCAAoB,oBAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAAG,8BAAY,YAAY;AAAA,gBAAG;AAAA,gBAElF;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,iBAAiB,eAAe,EAAE,QAAQ,EAAE;AAAA;AAAA,kBACvD;AAAA,kBACA,gBAAAA,KAAC,UAAK,WAAU,mBAAmB,YAAE,OAAM;AAAA,kBAC3C,gBAAAC,MAAC,UAAK,WAAU,mBAAkB;AAAA;AAAA,oBAAE,EAAE,OAAO;AAAA,qBAAE;AAAA,kBAC9C,EAAE,YAAY,gBAAAD,KAAC,UAAK,WAAU,uBAAsB,eAAC;AAAA;AAAA;AAAA,cAVjD,EAAE;AAAA,YAWT,CACD,GACH,GAEJ;AAAA,aAEJ;AAAA,UAEA,gBAAAC,MAAC,SAAI,WAAU,cAAa;AAAA;AAAA,YAAW,gBAAAD,KAAC,OAAE,MAAK,oBAAmB,QAAO,UAAS,KAAI,uBAAsB,sBAAQ;AAAA,aAAI;AAAA,WAC1H;AAAA,SACA;AAAA,OAEJ;AAAA,KACF;AAEJ;;;AO1qBA,SAAS,YAAAO,WAAU,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAAc;;;ACFzD,SAAS,aAAsB,KAAK,qBAAqB;AAGzD,IAAM,WAAmC;AAAA,EACvC,aAAa,cAAc;AAAA,EAC3B,WAAW,cAAc;AAAA,EACzB,cAAc,cAAc;AAC9B;AAEA,eAAsB,kBACpB,WACA,QACqB;AACrB,MAAI;AACJ,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,MAAM,MAAM,MAAM,SAAS;AACjC,eAAW,MAAM,IAAI,YAAY;AAAA,EACnC,OAAO;AACL,eAAW;AAAA,EACb;AAEA,QAAM,SAAS,MAAM,YAAY,KAAK,QAAQ;AAG9C,QAAM,YAAY,oBAAI,IAAqB;AAC3C,QAAM,eAAe,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,cAAc,WAAW,CAAC;AACzE,aAAW,OAAO,cAAc;AAC9B,UAAM,UAAU,SAAS,GAAG,KAAK,cAAc;AAC/C,cAAU,IAAI,KAAK,MAAM,OAAO,UAAU,OAAO,CAAC;AAAA,EACpD;AAEA,QAAM,QAAQ,OAAO,SAAS;AAE9B,WAAS,SAAS,KAAa;AAC7B,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC1C,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC1C,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC1C,WAAO,IAAI,GAAG,GAAG,CAAC;AAAA,EACpB;AAEA,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,QAAI,CAAC,KAAM;AAEX,UAAM,YAAY,KAAK,SAAS;AAChC,UAAM,aAAa,KAAK,UAAU;AAGlC,UAAM,IAAK,MAAM,IAAI,MAAO;AAC5B,UAAM,IAAI,aAAe,MAAM,IAAI,MAAO,aAAgB,MAAM,SAAS,MAAO;AAChF,UAAM,IAAK,MAAM,QAAQ,MAAO;AAChC,UAAM,IAAK,MAAM,SAAS,MAAO;AAGjC,QAAI,MAAM,SAAS,cAAc,MAAM,SAAS,YAAY;AAC1D,WAAK,cAAc;AAAA,QACjB;AAAA,QAAG;AAAA,QAAG,OAAO;AAAA,QAAG,QAAQ;AAAA,QACxB,OAAO,MAAM,SAAS,aAAa,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC;AAAA,MAC/D,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,MAAO;AAElB,UAAM,WAAW,MAAM,WAAW,SAAS,MAAM,QAAQ,IAAI,IAAI,GAAG,GAAG,CAAC;AAExE,QAAI,MAAM,SAAS,YAAY;AAC7B,UAAI,MAAM,UAAU,QAAQ;AAE1B,cAAM,QAAQ,KAAK,IAAI,GAAG,CAAC,IAAI;AAC/B,cAAM,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI;AACnC,aAAK,SAAS;AAAA,UACZ,OAAO,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,MAAM;AAAA,UACpC,KAAK,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,MAAM;AAAA,UAC1C,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AACD,aAAK,SAAS;AAAA,UACZ,OAAO,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,MAAM;AAAA,UACxC,KAAK,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,MAAM;AAAA,UACtC,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAElE,UAAI,MAAM,MAAM,WAAW,gBAAgB,GAAG;AAC5C,cAAM,WAAW,WAAW;AAAA,UAC1B,KAAK,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,UAC9B,OAAK,EAAE,WAAW,CAAC;AAAA,QACrB;AACA,cAAM,WAAW,MAAM,OAAO,SAAS,QAAQ;AAC/C,aAAK,UAAU,UAAU;AAAA,UACvB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,YAAM,OAAO,UAAU,IAAI,MAAM,cAAc,WAAW;AAC1D,YAAM,UAAU,MAAM,iBAAiB;AAGvC,YAAM,kBAAkB,CAAC,MAAc,SAAiB;AACtD,cAAM,YAAY,KAAK,kBAAkB,MAAM,IAAI;AACnD,eAAO,YAAY,WAAW,KAAK,SAAS;AAAA,MAC9C;AAGA,YAAM,cAAc,KAAK,IAAI,MAAM,UAAU,IAAI,GAAG;AACpD,UAAI,WAAW;AACf,YAAM,UAAU;AAChB,aAAO,WAAW,GAAG;AACnB,YAAI,gBAAgB,MAAM,OAAO,QAAQ,KAAK,IAAI,QAAS;AAC3D,oBAAY;AAAA,MACd;AAEA,UAAI,UAAU,GAAG;AAEf,YAAI,KAAK,IAAI;AACb,cAAM,KAAK,IAAI,IAAI;AACnB,mBAAW,QAAQ,MAAM,OAAO;AAC9B,eAAK,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,MAAM,UAAU,MAAM,OAAO,SAAS,CAAC;AAC3E,gBAAM,KAAK,kBAAkB,MAAM,QAAQ,IAAI;AAAA,QACjD;AAAA,MACF,OAAO;AACL,aAAK,SAAS,MAAM,OAAO;AAAA,UACzB,GAAG,IAAI;AAAA,UACP,GAAG,IAAI,IAAI;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,YAAY,OAAmB,UAAkB;AAC/D,QAAM,OAAO,IAAI,KAAK,CAAC,MAAM,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACzE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW;AACb,IAAE,MAAM;AACR,MAAI,gBAAgB,GAAG;AACzB;AAEA,eAAsB,kBACpB,OACA,aACA,UACA;AACA,QAAM,OAAO,IAAI,KAAK,CAAC,MAAM,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACzE,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,QAAQ,MAAM,QAAQ;AAEtC,QAAM,MAAM,aAAa;AAAA,IACvB,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACH;;;ACnKA,SAAS,YAAAC,iBAAgB;AAmDnB,SAMI,OAAAC,MANJ,QAAAC,aAAA;AAvCN,SAAS,cAAc,GAAuB;AAC5C,MAAI,CAAC,EAAE,SAAU,QAAO;AACxB,MAAI,EAAE,SAAS,WAAY,QAAO;AAClC,SAAO,CAAC,CAAC,EAAE;AACb;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,GAAwB;AACtB,QAAM,CAAC,gBAAgB,iBAAiB,IAAIF,UAAS,KAAK;AAC1D,QAAM,eAAe,OAAO,UAAU,OAAK,EAAE,OAAO,cAAc;AAClE,QAAM,UAAU,eAAe;AAC/B,QAAM,UAAU,eAAe,OAAO,SAAS;AAE/C,QAAM,aAAa,MAAM;AACvB,QAAI,SAAS;AACX,iBAAW,OAAO,eAAe,CAAC,EAAE,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,SAAS;AACX,iBAAW,OAAO,eAAe,CAAC,EAAE,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,OAAO,aAAa,EAAE;AACjD,QAAM,mBAAmB,OAAO,OAAO,OAAK,CAAC,cAAc,CAAC,CAAC;AAG7D,QAAM,qBAAqB,CAAC,WAAW;AAEvC,SACE,gBAAAE,MAAC,SAAI,WAAU,mBACb;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,4BAA4B,iBAAiB,SAAS,IAAI,cAAc,EAAE;AAAA,QACrF,SAAS,MAAM,iBAAiB,SAAS,KAAK,kBAAkB,CAAC,cAAc;AAAA,QAE9E;AAAA;AAAA,UAAY;AAAA,UAAK,OAAO;AAAA,UAAO;AAAA,UAC/B,iBAAiB,SAAS,KACzB,gBAAAD,KAAC,UAAK,WAAU,0BAA0B,2BAAiB,WAAW,UAAS;AAAA;AAAA;AAAA,IAEnF;AAAA,IAEC,kBAAkB,iBAAiB,SAAS,KAC3C,gBAAAA,KAAC,SAAI,WAAU,0BACZ,2BAAiB,IAAI,OACpB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,SAAS,MAAM;AACb,qBAAW,EAAE,EAAE;AACf,4BAAkB,KAAK;AAAA,QACzB;AAAA,QAEC,YAAE;AAAA;AAAA,MAPE,EAAE;AAAA,IAQT,CACD,GACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,WAAU,4BACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU,CAAC;AAAA,UACX,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA,KAAC,UAAK,WAAU,4BACb,0BAAgB,IAAI,GAAG,eAAe,CAAC,MAAM,OAAO,MAAM,KAAK,KAClE;AAAA,MACC,qBACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UAET;AAAA;AAAA,MACH,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU,CAAC;AAAA,UACX,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,KACF;AAEJ;;;ACxGO,IAAM,qBAAmC;AAAA;AAAA,EAE9C,OAAO,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,IAAI,CAAC;AAAA,EAAG;AAAA,EAClG,QAAQ,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,EAAG;AAAA,EACpH,WAAW,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,EAAE,eAAe,MAAM,EAAE,OAAO,OAAO,CAAC;AAAA,EAAG;AAAA,EACvH,YAAY,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,EAAE,eAAe,MAAM,EAAE,OAAO,QAAQ,CAAC;AAAA,EAAG;AAAA,EACzH,KAAK,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG;AAAA,EAC3F,MAAM,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,EAAG;AAAA,EAC7G,MAAM,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,YAAY,CAAC;AAAA,EAAG;AAAA,EAChG,OAAO,CAAC,MAAM;AAAE,UAAM,IAAI,IAAI,KAAK,CAAC;AAAG,WAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE;AAAA,EAAG;AAAA;AAAA,EAG3G,OAAO,CAAC,MAAM,EAAE,YAAY;AAAA,EAC5B,OAAO,CAAC,MAAM,EAAE,YAAY;AAAA,EAC5B,MAAM,CAAC,MAAM,EAAE,KAAK;AAAA,EACpB,OAAO,CAAC,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC,KAAK;AAAA,EACnC,MAAM,CAAC,MAAM;AAAE,UAAM,QAAQ,EAAE,MAAM,KAAK;AAAG,WAAO,MAAM,MAAM,SAAS,CAAC,KAAK;AAAA,EAAI;AAAA,EACnF,UAAU,CAAC,MAAM,EAAE,MAAM,KAAK,EAAE,IAAI,OAAK,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,YAAY;AAAA;AAAA,EAG1E,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAAA,EACxB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAAA,EACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;AAAA,EAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;AAAA,EAC3B,QAAQ,CAAC,MAAM,EAAE,QAAQ,OAAO,EAAE;AAAA,EAClC,QAAQ,CAAC,MAAM;AAAE,UAAM,IAAI,WAAW,CAAC;AAAG,WAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;AAAA,EAAG;AAAA,EAC5E,UAAU,CAAC,MAAM;AAAE,UAAM,IAAI,WAAW,EAAE,QAAQ,aAAa,EAAE,CAAC;AAAG,WAAO,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EAAI;AAClH;AAEA,IAAM,aAAa;AACnB,IAAM,UAAU;AAOT,SAAS,eACd,SACA,QACA,kBACQ;AACR,QAAM,aAAa,EAAE,GAAG,oBAAoB,GAAG,iBAAiB;AAEhE,SAAO,QAAQ,QAAQ,YAAY,CAAC,QAAQ,SAAiB;AAC3D,UAAM,YAAY,KAAK,MAAM,OAAO;AACpC,UAAM,eAAe,YAAY,UAAU,CAAC,IAAI,MAAM,KAAK;AAC3D,UAAM,gBAAgB,YAAY,UAAU,CAAC,EAAE,KAAK,IAAI;AAGxD,UAAM,cAAc,OAAO,KAAK,OAAK,EAAE,MAAM,YAAY,MAAM,YAAY,YAAY,CAAC,KACnF,OAAO,KAAK,OAAK,EAAE,OAAO,WAAW;AAE1C,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,WAAW,YAAY,SAAS;AACtC,QAAI,CAAC,cAAe,QAAO;AAE3B,UAAM,KAAK,WAAW,aAAa;AACnC,QAAI,CAAC,GAAI,QAAO;AAEhB,QAAI;AACF,aAAO,GAAG,QAAQ;AAAA,IACpB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAMO,SAAS,mBACd,QACA,kBACa;AACb,SAAO,OAAO,IAAI,OAAK;AACrB,QAAI,CAAC,EAAE,QAAS,QAAO;AACvB,UAAM,WAAW,eAAe,EAAE,SAAS,QAAQ,gBAAgB;AACnE,WAAO,aAAa,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,SAAS,IAAI;AAAA,EAC5D,CAAC;AACH;;;AHtCU,SAwaQ,YAAAE,WAxaR,OAAAC,MACA,QAAAC,aADA;AAhBH,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AACF,IAAqB,CAAC,GAAG;AACvB,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WACE,gBAAAD,KAAC,SAAI,WAAU,iBACb,0BAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,QAAG,6BAAe;AAAA,MACnB,gBAAAC,MAAC,OAAE;AAAA;AAAA,QAA+C,gBAAAD,KAAC,OAAE,MAAK,oBAAmB,sBAAQ;AAAA,QAAI;AAAA,SAAY;AAAA,OACvG,GACF;AAAA,EAEJ;AACA,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAyB,CAAC,CAAC;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAsB,CAAC,CAAC;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAwB,IAAI;AAC1E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAmB,CAAC,CAAC;AAC3D,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,MAAM;AACjE,QAAI,iBAAiB,iBAAiB;AACpC,YAAM,MAAM,gBAAgB,QAAQ,aAAa;AACjD,aAAO,OAAO,IAAI,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACT,CAAC;AACD,QAAM,iBAAiBC,QAAO,KAAK;AACnC,QAAM,CAAC,SAAS,UAAU,IAAID,UAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAsC,IAAI;AAC5E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,sBAAsB,EAAE;AACvE,QAAM,eAAeC,QAAuB,IAAI;AAGhD,QAAM,cAAc,oBACd,YAAY,SAAS,IACrB,CAAC,GAAG,YAAY,OAAO,OAAK,MAAM,QAAQ,GAAG,GAAG,YAAY,OAAO,OAAK,MAAM,QAAQ,CAAC,IACvF,CAAC,iBAAiB,UAAU;AAClC,QAAM,SAAS,YAAY,kBAAkB,KAAK,YAAY,CAAC,KAAK;AACpE,QAAM,eAAe,sBAAsB,YAAY,SAAS;AAChE,QAAM,gBAAgB,YAAY,SAAS;AAG3C,EAAAC,WAAU,MAAM;AACd,QAAI,OAAO,WAAW,KAAK,CAAC,cAAe;AAC3C,UAAM,eAAe,OAAO;AAAA,MAAO,OACjC,EAAE,aAAa,UAAU,EAAE,SAAS,cAAc,EAAE,SAAS;AAAA,IAC/D;AACA,UAAM,YAAY,aAAa,SAAS,KAAK,aAAa,MAAM,OAAK;AACnE,UAAI,CAAC,EAAE,SAAU,QAAO;AACxB,UAAI,EAAE,SAAS,WAAY,QAAO;AAClC,aAAO,CAAC,CAAC,EAAE;AAAA,IACb,CAAC;AACD,QAAI,aAAa,CAAC,cAAc;AAC9B,4BAAsB,UAAQ,OAAO,CAAC;AACtC,yBAAmB,IAAI;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,oBAAoB,QAAQ,QAAQ,cAAc,aAAa,CAAC;AAGpE,EAAAA,WAAU,MAAM;AACd,QAAI,iBAAiB;AACnB,UAAI,iBAAiB,gBAAgB;AACrC,UAAI,gBAAgB,YAAa,gBAAe,gBAAgB,WAAW;AAG3E,UAAI,eAAe;AACjB,yBAAiB,eAAe,IAAI,OAAK;AACvC,gBAAM,UAAU,OAAO,QAAQ,aAAa,EAAE;AAAA,YAC5C,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,MAAM,EAAE,MAAM,YAAY;AAAA,UACvD;AACA,gBAAM,OAAO,cAAc,EAAE,EAAE;AAC/B,gBAAM,QAAQ,UAAU,CAAC,KAAK;AAC9B,iBAAO,UAAU,SAAY,EAAE,GAAG,GAAG,MAAM,IAAI;AAAA,QACjD,CAAC;AAAA,MACH;AAGA,UAAI,eAAe,SAAS;AAC1B,kBAAU,UAAQ;AAChB,gBAAM,WAAW,IAAI,IAAI,KAAK,OAAO,OAAK,EAAE,KAAK,EAAE,IAAI,OAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC5E,iBAAO,eAAe,IAAI,OAAK,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,SAAS,IAAI,EAAE,EAAE,EAAG,IAAI,CAAC;AAAA,QAC9F,CAAC;AAAA,MACH,OAAO;AACL,kBAAU,cAAc;AACxB,uBAAe,UAAU;AAAA,MAC3B;AAEA,UAAI,cAAe,SAAQ,aAAa;AACxC;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,UAAM,SAAS,OAAO,IAAI,KAAK;AAC/B,UAAM,YAAY,OAAO,IAAI,QAAQ;AACrC,UAAM,QAAQ,OAAO,IAAI,aAAa;AAEtC,QAAI,MAAO,gBAAe,KAAK;AAE/B,QAAI,OAAQ,SAAQ,MAAM;AAC1B,QAAI,WAAW;AACb,YAAM,SAAS,EACZ,KAAK,OAAK,EAAE,KAAK,CAAC,EAClB,KAAK,CAAC,aAAuB;AAC5B,YAAI,SAAS,YAAa,gBAAe,SAAS,WAAW;AAC7D,YAAI,eAAe,SAAS;AAC1B,oBAAU,UAAQ;AAChB,kBAAM,WAAW,IAAI,IAAI,KAAK,OAAO,OAAK,EAAE,KAAK,EAAE,IAAI,OAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC5E,mBAAO,SAAS,OAAO,IAAI,OAAK,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,SAAS,IAAI,EAAE,EAAE,EAAG,IAAI,CAAC;AAAA,UAC/F,CAAC;AAAA,QACH,OAAO;AACL,oBAAU,SAAS,MAAM;AACzB,yBAAe,UAAU;AAAA,QAC3B;AAAA,MACF,CAAC,EACA,MAAM,SAAO,QAAQ,MAAM,0BAA0B,GAAG,CAAC;AAAA,IAC9D;AAEA,UAAM,gBAAgB,CAAC,MAAoB;AACzC,UAAI,EAAE,MAAM,SAAS,gBAAgB;AACnC,YAAI,EAAE,KAAK,QAAQ;AACjB,cAAI,eAAe,SAAS;AAC1B,sBAAU,UAAQ;AAChB,oBAAM,WAAW,IAAI,IAAI,KAAK,OAAO,OAAK,EAAE,KAAK,EAAE,IAAI,OAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC5E,qBAAO,EAAE,KAAK,OAAO,IAAI,CAAC,MAAiB,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,SAAS,IAAI,EAAE,EAAE,EAAG,IAAI,CAAC;AAAA,YAC1G,CAAC;AAAA,UACH,OAAO;AACL,sBAAU,EAAE,KAAK,MAAM;AACvB,2BAAe,UAAU;AAAA,UAC3B;AAAA,QACF;AACA,YAAI,EAAE,KAAK,OAAQ,SAAQ,EAAE,KAAK,MAAM;AACxC,YAAI,EAAE,KAAK,QAAQ;AACjB,gBAAM,MAAM,YAAY,QAAQ,EAAE,KAAK,MAAM;AAC7C,cAAI,OAAO,EAAG,uBAAsB,GAAG;AAAA,QACzC;AACA,YAAI,EAAE,KAAK,YAAa,gBAAe,EAAE,KAAK,WAAW;AAAA,MAC3D;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAEnC,QAAM,UAAUC,aAAY,OAAO,WAAiC;AAClE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,MAAM;AAC5C,eAAS,QAAQ;AACjB,mBAAa,MAAM;AAAA,IACrB,SAAS,KAAK;AACZ,cAAQ,MAAM,uBAAuB,GAAG;AAAA,IAC1C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,iBAAiB,OAAO,OAAO,OAAK,EAAE,aAAa,UAAU,EAAE,SAAS,cAAc,EAAE,SAAS,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9I,QAAI,EAAE,SAAS,EAAE,KAAM,QAAO,EAAE,OAAO,EAAE;AACzC,UAAM,gBAAgB;AACtB,QAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,cAAe,QAAO,EAAE,IAAI,EAAE;AACxD,WAAO,EAAE,IAAI,EAAE;AAAA,EACjB,CAAC;AACD,QAAM,gBAAgB,OAAO,KAAK,OAAK,EAAE,OAAO,eAAe,KAAK;AACpE,QAAM,kBAAkB,gBACpB,cAAc,aAAa,UAAU,cAAc,SAAS,cAAc,cAAc,SAAS,cAAc,CAAC,cAAc,UAC9H;AAEJ,QAAM,oBAAoBA,aAAY,CAAC,IAAY,UAAkB;AACnE,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,EACpE,GAAG,CAAC,CAAC;AAEL,QAAM,4BAA4BA,aAAY,CAAC,IAAY,YAAgC;AACzF,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC;AAAA,EACzE,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA,aAAY,CAAC,YAAoB;AACtD,uBAAmB,OAAO;AAE1B,UAAM,QAAQ,OAAO,KAAK,OAAK,EAAE,OAAO,OAAO;AAC/C,QAAI,SAAS,aAAa,SAAS;AACjC,YAAM,SAAS,aAAa,QAAQ,cAAc,eAAe,MAAM,IAAI,IAAI;AAC/E,UAAI,QAAQ;AACV,eAAO,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,oBAAoB,eAAe,MAAM,OAAK;AAClD,QAAI,CAAC,EAAE,SAAU,QAAO;AACxB,QAAI,EAAE,SAAS,WAAY,QAAO;AAClC,WAAO,CAAC,CAAC,EAAE;AAAA,EACb,CAAC;AAED,QAAM,wBAAwBA,aAAY,YAAY;AACpD,QAAI,CAAC,kBAAmB;AAGxB,QAAI,CAAC,cAAc;AACjB,4BAAsB,UAAQ,OAAO,CAAC;AACtC,yBAAmB,IAAI;AAEvB,YAAM,UAAU,aAAa,SAAS,cAAc,kBAAkB;AACtE,UAAI,SAAS;AACX,gBAAQ,SAAS,EAAE,KAAK,GAAG,UAAU,SAAS,CAAC;AAAA,MACjD;AACA;AAAA,IACF;AAGA,QAAI,CAAC,UAAW;AAChB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,cAAc,mBAAmB,QAAQ,UAAU;AACzD,YAAM,WAAW,MAAM,kBAAkB,WAAW,WAAW;AAC/D,YAAM,OAAO,IAAI,KAAK,CAAC,SAAS,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE5E,UAAI,aAAa;AACf,cAAM,kBAAkB,UAAU,aAAa,qBAAqB;AAAA,MACtE;AAEA,UAAI,YAAY;AACd,mBAAW,IAAI;AAAA,MACjB;AAEA,UAAI,CAAC,eAAe,CAAC,YAAY;AAC/B,oBAAY,UAAU,qBAAqB;AAAA,MAC7C;AAEA,aAAO,QAAQ,YAAY,EAAE,MAAM,mBAAmB,GAAG,GAAG;AAAA,IAC9D,SAAS,KAAK;AACZ,cAAQ,MAAM,2BAA2B,GAAG;AAAA,IAC9C,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,WAAW,QAAQ,aAAa,mBAAmB,YAAY,YAAY,CAAC;AAEhF,QAAM,qBAAqBA,aAAY,CAAC,UAAqB;AAE3D,QAAI,MAAM,SAAS,cAAc,MAAM,SAAS,YAAY;AAC1D,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,SAAS;AACjB,aACE,gBAAAL,KAAC,SAAI,WAAU,+BACZ,gBAAM,SAAS,OAClB;AAAA,IAEJ;AAEA,UAAM,WAAW,MAAM,aAAa;AAEpC,QAAI,CAAC,UAAU;AAEb,UAAI,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAC3D,eAAO,MAAM,QACX,gBAAAA,KAAC,SAAI,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,WAAU,2BAA0B,IAE7E,gBAAAA,KAAC,SAAI,WAAU,sCAAsC,gBAAM,aAAY;AAAA,MAE3E;AACA,UAAI,MAAM,SAAS,YAAY;AAC7B,eACE,gBAAAA,KAAC,SAAI,WAAU,mCACZ,gBAAM,UAAU,SAAS,WAAW,IACvC;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,WAAU,sCACZ,gBAAM,SAAS,MAAM,aACxB;AAAA,IAEJ;AAGA,QAAI,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAC3D,UAAI,MAAM,OAAO;AACf,eACE,gBAAAA,KAAC,SAAI,WAAU,0BAAyB,SAAS,MAAM,kBAAkB,MAAM,IAAI,EAAE,GACnF,0BAAAA,KAAC,SAAI,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,WAAU,2BAA0B,GAC/E;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,WAAU,sCACZ,gBAAM,aACT;AAAA,IAEJ;AAEA,QAAI,MAAM,SAAS,YAAY;AAC7B,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,8BAAkB,MAAM,IAAI,MAAM,UAAU,SAAS,KAAK,MAAM;AAAA,UAClE;AAAA,UAEC,gBAAM,UAAU,SAAS,WAAW;AAAA;AAAA,MACvC;AAAA,IAEJ;AAEA,QAAI,MAAM,SAAS,eAAe;AAChC,aACE,gBAAAA,KAAC,SAAI,WAAU,uBACZ,gBAAM,UAAS,oBAAI,KAAK,GAAE,mBAAmB,GAChD;AAAA,IAEJ;AAGA,UAAM,YAAY;AAAA,MAChB,UAAU,GAAG,MAAM,WAAW,GAAG;AAAA,MACjC,eAAe,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,GAAG,OAAO;AAAA,MACxE,YAAY,MAAM,aAAa,GAAG,MAAM,UAAU,KAAK;AAAA,MACvD,YAAY,MAAM,eAAe,YAAY,sCACjC,MAAM,eAAe,eAAe,oCACpC,MAAM,eAAe,cAAc,iCAAiC;AAAA,IAClF;AAEA,QAAI,MAAM,SAAS,cAAe,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAI;AAC5E,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,MAAM;AAAA,UACb,UAAU,CAAC,MAAM,kBAAkB,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA,UAC3D,SAAS,MAAM,mBAAmB,MAAM,EAAE;AAAA,UAC1C,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,UAClC,OAAO;AAAA,UAEP;AAAA,4BAAAD,KAAC,YAAO,OAAM,IAAI,gBAAM,eAAe,aAAY;AAAA,aACjD,MAAM,WAAW,CAAC,GAAG,IAAI,SACzB,gBAAAA,KAAC,YAAiB,OAAO,KAAM,iBAAlB,GAAsB,CACpC;AAAA;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM,gBAAgB,UAAU,UAChC,MAAM,gBAAgB,WAAW,WACjC,MAAM,gBAAgB,UAAU,QAChC,MAAM,gBAAgB,SAAS,SAAS;AAAA,QAC9C,WAAU;AAAA,QACV,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,WAAW,MAAM,aAAa;AAAA,QAC9B,UAAU,CAAC,MAAM,kBAAkB,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA,QAC3D,SAAS,MAAM,mBAAmB,MAAM,EAAE;AAAA,QAC1C,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAClC,OAAO;AAAA;AAAA,IACT;AAAA,EAEJ,GAAG,CAAC,QAAQ,mBAAmB,kBAAkB,CAAC;AAGlD,EAAAI,WAAU,MAAM;AACd,UAAM,YAAY,OAAO,OAAO,OAAK,EAAE,aAAa,UAAU,EAAE,SAAS,eAAe,EAAE,KAAK;AAC/F,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,WAAU,oBAAI,KAAK,GAAE,mBAAmB;AAC9C,gBAAU,UAAQ,KAAK,IAAI,OAAK;AAC9B,YAAI,EAAE,aAAa,UAAU,EAAE,SAAS,iBAAiB,CAAC,EAAE,OAAO;AACjE,iBAAO,EAAE,GAAG,GAAG,OAAO,QAAQ;AAAA,QAChC;AACA,eAAO;AAAA,MACT,CAAC,CAAC;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,OAAK,EAAE,SAAS,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC;AAGjE,EAAAA,WAAU,MAAM;AACd,UAAM,cAAc,OAAO,KAAK,OAAK,EAAE,OAAO;AAC9C,QAAI,CAAC,YAAa;AAClB,UAAM,WAAW,mBAAmB,QAAQ,UAAU;AAEtD,UAAM,UAAU,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AACnE,QAAI,QAAS,WAAU,QAAQ;AAAA,EACjC,GAAG,CAAC,QAAQ,UAAU,CAAC;AAEvB,SACE,gBAAAH,MAAC,SAAI,WAAU,iBAAgB,KAAK,cACjC;AAAA,eAAW,gBAAAD,KAAC,SAAI,WAAU,qBAAoB,iCAAmB;AAAA,IAElE,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,sBAAAD,KAAC,SAAI,WAAU,mBACZ,gBAAM,SAAS,KACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,kBAAkB,IAAI,IAAI,kBAAkB,CAAC,eAAe,IAAI,CAAC,CAAC;AAAA,UAClE,eAAe,CAAC,OAAO,mBAAmB,EAAE;AAAA,UAC5C,MAAK;AAAA,UACL,eAAe;AAAA,UACf;AAAA;AAAA,MACF,GAEJ;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,gBACb;AAAA,wBAAAA,MAAC,SAAI,WAAU,uBACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,yBACb;AAAA,4BAAAD,KAAC,UAAK,WAAU,+BAA8B,wBAAU;AAAA,YACxD,gBAAAA,KAAC,YAAQ,kBAAO;AAAA,aAClB;AAAA,UACC,iBACC,gBAAAC,MAAC,SAAI,WAAU,qBAAoB;AAAA;AAAA,YAC3B,qBAAqB;AAAA,YAAE;AAAA,YAAK,YAAY;AAAA,aAChD;AAAA,WAEJ;AAAA,QAEA,gBAAAA,MAAC,SAAI,WAAU,qBACZ;AAAA,2BAAiB,mBAChB,gBAAAA,MAAC,SAAI,WAAU,sBACb;AAAA,4BAAAD,KAAC,QAAI,wBAAc,OAAM;AAAA,YACxB,cAAc,YAAY,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,sBAAQ;AAAA,aAElE,cAAc,SAAS,eAAe,cAAc,SAAS,eAC7D,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,QAAQ,cAAc,SAAS,aAAa,KAAK;AAAA,gBACjD,QAAQ,CAAC,YAAY,kBAAkB,cAAc,IAAI,OAAO;AAAA,gBAChE,cAAc,cAAc;AAAA;AAAA,YAC9B;AAAA,aAGA,cAAc,SAAS,UAAU,cAAc,SAAS,eACxD,gBAAAC,MAAAF,WAAA,EACG;AAAA,4BAAc,SAAS,cAAe,cAAc,WAAW,cAAc,QAAQ,SAAS,IAC7F,gBAAAE;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,cAAc;AAAA,kBACrB,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,KAAK;AAAA,kBACjE,WAAU;AAAA,kBAEV;AAAA,oCAAAD,KAAC,YAAO,OAAM,IAAI,wBAAc,eAAe,aAAY;AAAA,qBACzD,cAAc,WAAW,CAAC,GAAG,IAAI,SACjC,gBAAAA,KAAC,YAAiB,OAAO,KAAM,iBAAlB,GAAsB,CACpC;AAAA;AAAA;AAAA,cACH,IAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,cAAc,gBAAgB,UAAU,UACxC,cAAc,gBAAgB,WAAW,WACzC,cAAc,gBAAgB,UAAU,QACxC,cAAc,gBAAgB,SAAS,SAAS;AAAA,kBACtD,OAAO,cAAc;AAAA,kBACrB,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,KAAK;AAAA,kBACjE,aAAa,cAAc;AAAA,kBAC3B,WAAW,cAAc,aAAa;AAAA,kBACtC,WAAU;AAAA;AAAA,cACZ;AAAA,cAEF,gBAAAC,MAAC,SAAI,WAAU,oBACb;AAAA,gCAAAD,KAAC,WAAM,uBAAS;AAAA,gBAChB,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,KAAI;AAAA,oBACJ,OAAO,cAAc;AAAA,oBACrB,UAAU,OAAK,0BAA0B,cAAc,IAAI,EAAE,UAAU,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,gBACjG;AAAA,gBACA,gBAAAA,KAAC,UAAK,gBAAE;AAAA,iBACV;AAAA,eACF;AAAA,YAGD,cAAc,SAAS,cACtB,gBAAAC,MAAC,WAAM,WAAU,yBACf;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,cAAc,UAAU;AAAA,kBACjC,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,UAAU,SAAS,EAAE;AAAA;AAAA,cACnF;AAAA,cACC,cAAc,eAAe;AAAA,eAChC;AAAA,YAGD,cAAc,SAAS,iBACtB,gBAAAA,KAAC,SAAI,WAAU,uBACZ,wBAAc,SAAS,gCAC1B;AAAA,aAEJ;AAAA,UAGD,iBAAiB,CAAC,mBACjB,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,4BAAAD,KAAC,QAAI,wBAAc,OAAM;AAAA,YACzB,gBAAAA,KAAC,OAAE,mDAAqC;AAAA,aAC1C;AAAA,UAGD,CAAC,iBAAiB,eAAe,SAAS,KACzC,gBAAAA,KAAC,SAAI,WAAU,eAAc,wEAE7B;AAAA,WAEJ;AAAA,QAEA,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ;AAAA,cACR,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ;AAAA,cACA,YAAY;AAAA,cACZ,eAAe,eAAgB,eAAe,aAAc,SAAS,YAAY,qBAAqB,CAAC,CAAC;AAAA;AAAA,UAC1G;AAAA,UAEC,cAAc,gBAAAA,KAAC,SAAI,WAAU,qBAAoB,+BAAiB;AAAA,UAEnE,gBAAAC,MAAC,SAAI,WAAU,cAAa;AAAA;AAAA,YAAW,gBAAAD,KAAC,OAAE,MAAK,oBAAmB,QAAO,UAAS,KAAI,uBAAsB,sBAAQ;AAAA,aAAI;AAAA,WAC1H;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;;;AIljBA,SAAS,YAAAM,iBAAgB;AA+BnB,gBAAAC,MAGI,QAAAC,aAHJ;AApBC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,KAAK;AAC9C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AAEjD,QAAM,YAAY,MAAM;AACtB,QAAI,YAAY,KAAK,GAAG;AACtB,gBAAU,YAAY,KAAK,CAAC;AAC5B,qBAAe,EAAE;AACjB,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SACE,gBAAAD,MAAC,SAAI,WAAU,wBACb;AAAA,oBAAAD,KAAC,SAAI,WAAU,qBAAoB,0BAAY;AAAA,IAC/C,gBAAAC,MAAC,SAAI,WAAU,oBACZ;AAAA,YAAM,IAAI,UACT,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,oBAAoB,SAAS,aAAa,WAAW,EAAE;AAAA,UAClE,OAAO;AAAA,YACL,aAAa,eAAe,IAAI;AAAA,YAChC,iBAAiB,SAAS,aAAa,eAAe,IAAI,IAAI;AAAA,YAC9D,OAAO,SAAS,aAAa,SAAS,eAAe,IAAI;AAAA,UAC3D;AAAA,UACA,SAAS,MAAM,gBAAgB,IAAI;AAAA,UAElC;AAAA;AAAA,YACA,MAAM,SAAS,KAAK,SAAS,YAC5B,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AAAE,oBAAE,gBAAgB;AAAG,+BAAa,IAAI;AAAA,gBAAG;AAAA,gBAC5D;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,QAhBG;AAAA,MAkBP,CACD;AAAA,MACA,WACC,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA,YAC5C,WAAW,OAAK,EAAE,QAAQ,WAAW,UAAU;AAAA,YAC/C,aAAY;AAAA,YACZ,WAAS;AAAA;AAAA,QACX;AAAA,QACA,gBAAAA,KAAC,YAAO,SAAS,WAAW,iBAAG;AAAA,QAC/B,gBAAAA,KAAC,YAAO,SAAS,MAAM,YAAY,KAAK,GAAG,oBAAM;AAAA,SACnD,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,YAAY,IAAI;AAAA,UAChC;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,KACF;AAEJ;","names":["useState","useCallback","useEffect","useRef","e","jsx","jsxs","useRef","useState","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","e","useState","useCallback","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","jsx","jsxs","useState"]}
|