@josephomills/esign 0.4.0 → 0.5.0
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/{ports-DtICqgEf.d.cts → ports-DM0-2hQd.d.cts} +65 -3
- package/dist/{ports-DtICqgEf.d.ts → ports-DM0-2hQd.d.ts} +65 -3
- package/dist/prisma/index.cjs +9 -2
- package/dist/prisma/index.cjs.map +1 -1
- package/dist/prisma/index.d.cts +1 -1
- package/dist/prisma/index.d.ts +1 -1
- package/dist/prisma/index.js +9 -2
- package/dist/prisma/index.js.map +1 -1
- package/dist/server/index.cjs +37 -29
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +8 -7
- package/dist/server/index.d.ts +8 -7
- package/dist/server/index.js +36 -30
- package/dist/server/index.js.map +1 -1
- package/dist/ui/index.cjs +305 -71
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.d.cts +12 -9
- package/dist/ui/index.d.ts +12 -9
- package/dist/ui/index.js +306 -72
- package/dist/ui/index.js.map +1 -1
- package/package.json +1 -1
package/dist/ui/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/SignaturePad.tsx","../../src/ui/ConsentBlock.tsx","../../src/ui/PdfViewer.tsx","../../src/ui/FieldDesigner.tsx","../../src/ui/SigningExperience.tsx"],"names":["useState","useRef","useEffect","SignaturePadLib","jsx","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import SignaturePadLib from \"signature_pad\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport interface SignaturePadProps {\n primaryColor?: string;\n /** Emits a PNG data URL of the current signature, or null when empty. */\n onChange: (pngDataUrl: string | null) => void;\n}\n\n/**\n * Capture a signature by drawing (signature_pad, touch + mouse, DPI-aware) or by\n * typing a name rendered in a script font. Both yield the same PNG data URL that\n * the seal step stamps onto the document.\n */\nexport function SignaturePad({ primaryColor = \"#4f46e5\", onChange }: SignaturePadProps) {\n const [mode, setMode] = useState<\"draw\" | \"type\">(\"draw\");\n const [typed, setTyped] = useState(\"\");\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const padRef = useRef<SignaturePadLib | null>(null);\n\n useEffect(() => {\n if (mode !== \"draw\") return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const pad = new SignaturePadLib(canvas, { penColor: \"#111827\", minWidth: 0.8, maxWidth: 2.2 });\n padRef.current = pad;\n const resize = () => {\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n const rect = canvas.getBoundingClientRect();\n canvas.width = Math.floor(rect.width * ratio);\n canvas.height = Math.floor(rect.height * ratio);\n canvas.getContext(\"2d\")?.scale(ratio, ratio);\n pad.clear();\n onChange(null);\n };\n pad.addEventListener(\"endStroke\", () =>\n onChange(pad.isEmpty() ? null : pad.toDataURL(\"image/png\")),\n );\n resize();\n window.addEventListener(\"resize\", resize);\n return () => {\n window.removeEventListener(\"resize\", resize);\n pad.off();\n padRef.current = null;\n };\n }, [mode, onChange]);\n\n useEffect(() => {\n if (mode !== \"type\") return;\n const name = typed.trim();\n if (!name) {\n onChange(null);\n return;\n }\n const c = document.createElement(\"canvas\");\n c.width = 720;\n c.height = 200;\n const ctx = c.getContext(\"2d\");\n if (!ctx) return;\n ctx.fillStyle = \"#111827\";\n ctx.font = \"72px 'Segoe Script', 'Brush Script MT', cursive\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(name, 24, 110);\n onChange(c.toDataURL(\"image/png\"));\n }, [mode, typed, onChange]);\n\n const tab = (m: \"draw\" | \"type\", label: string) => (\n <button\n type=\"button\"\n onClick={() => {\n setMode(m);\n onChange(null);\n }}\n style={{\n flex: 1,\n padding: \"8px 12px\",\n border: \"none\",\n borderBottom: mode === m ? `2px solid ${primaryColor}` : \"2px solid transparent\",\n background: \"transparent\",\n fontWeight: mode === m ? 600 : 400,\n color: mode === m ? primaryColor : \"#6b7280\",\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n\n return (\n <div style={{ border: \"1px solid #e5e7eb\", borderRadius: 12, overflow: \"hidden\" }}>\n <div style={{ display: \"flex\", borderBottom: \"1px solid #f3f4f6\" }}>\n {tab(\"draw\", \"Draw\")}\n {tab(\"type\", \"Type\")}\n </div>\n <div style={{ position: \"relative\", background: \"#fff\" }}>\n {mode === \"draw\" ? (\n <canvas\n ref={canvasRef}\n style={{ width: \"100%\", height: 180, touchAction: \"none\", display: \"block\" }}\n />\n ) : (\n <div style={{ padding: 16 }}>\n <input\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n placeholder=\"Type your name\"\n style={{\n width: \"100%\",\n fontSize: 40,\n fontFamily: \"'Segoe Script', 'Brush Script MT', cursive\",\n border: \"none\",\n borderBottom: \"1px solid #e5e7eb\",\n outline: \"none\",\n padding: \"8px 0\",\n }}\n />\n </div>\n )}\n <button\n type=\"button\"\n onClick={() => {\n padRef.current?.clear();\n setTyped(\"\");\n onChange(null);\n }}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n fontSize: 12,\n color: \"#6b7280\",\n background: \"rgba(255,255,255,0.8)\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n padding: \"2px 8px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n </div>\n </div>\n );\n}\n","export interface ConsentValue {\n signerName: string;\n consent: boolean;\n}\n\nexport interface ConsentBlockProps {\n value: ConsentValue;\n onChange: (value: ConsentValue) => void;\n primaryColor?: string;\n}\n\n/**\n * The electronic-signature intent record: a typed full legal name + an explicit\n * consent checkbox. Together with the audit trail this is what makes the simple\n * e-signature legally valid.\n */\nexport function ConsentBlock({ value, onChange, primaryColor = \"#4f46e5\" }: ConsentBlockProps) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 13, fontWeight: 600, color: \"#374151\" }}>Full legal name</span>\n <input\n value={value.signerName}\n onChange={(e) => onChange({ ...value, signerName: e.target.value })}\n placeholder=\"e.g. Ada Lovelace\"\n style={{\n padding: \"10px 12px\",\n border: \"1px solid #d1d5db\",\n borderRadius: 8,\n fontSize: 15,\n outline: \"none\",\n }}\n />\n </label>\n <label style={{ display: \"flex\", gap: 10, alignItems: \"flex-start\", cursor: \"pointer\" }}>\n <input\n type=\"checkbox\"\n checked={value.consent}\n onChange={(e) => onChange({ ...value, consent: e.target.checked })}\n style={{ marginTop: 3, accentColor: primaryColor, width: 16, height: 16 }}\n />\n <span style={{ fontSize: 13, color: \"#4b5563\", lineHeight: 1.5 }}>\n I agree to sign this document electronically. I understand my electronic\n signature is legally binding and that an audit record (time, IP, and a\n tamper-evident hash) is kept with the signed document.\n </span>\n </label>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface ViewerPlacement {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface PdfViewerProps {\n /** Token-gated source PDF URL. */\n url: string;\n /** Optional signature-box hint, drawn on its page at normalized coords. */\n placement?: ViewerPlacement;\n /** Override the pdf.js worker (defaults to the unpkg .mjs for the bundled version). */\n workerSrc?: string;\n primaryColor?: string;\n}\n\n/**\n * Render the PDF to canvases (pdf.js, responsive, DPI-aware) with the signature\n * box overlaid where the manager placed it. Falls back to an <iframe> + download\n * link if pdf.js fails to load — so the document is always readable.\n */\nexport function PdfViewer({ url, placement, workerSrc, primaryColor = \"#4f46e5\" }: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n try {\n const pdfjs = await import(\"pdfjs-dist\");\n pdfjs.GlobalWorkerOptions.workerSrc =\n workerSrc ?? `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\n const doc = await pdfjs.getDocument({ url }).promise;\n const container = containerRef.current;\n if (!container || cancelled) return;\n container.innerHTML = \"\";\n const width = container.clientWidth || 640;\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n\n for (let p = 1; p <= doc.numPages; p++) {\n const page = await doc.getPage(p);\n if (cancelled) return;\n const base = page.getViewport({ scale: 1 });\n const viewport = page.getViewport({ scale: width / base.width });\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.floor(viewport.width * ratio);\n canvas.height = Math.floor(viewport.height * ratio);\n canvas.style.width = \"100%\";\n canvas.style.display = \"block\";\n canvas.style.borderRadius = \"4px\";\n\n const wrap = document.createElement(\"div\");\n wrap.style.position = \"relative\";\n wrap.style.marginBottom = \"14px\";\n wrap.style.boxShadow = \"0 1px 4px rgba(0,0,0,0.12)\";\n wrap.appendChild(canvas);\n\n if (placement && placement.page === p) {\n const box = document.createElement(\"div\");\n box.style.cssText = `position:absolute;left:${placement.x * 100}%;top:${\n placement.y * 100\n }%;width:${placement.w * 100}%;height:${placement.h * 100}%;border:2px dashed ${primaryColor};background:${primaryColor}1a;border-radius:4px;pointer-events:none;`;\n const label = document.createElement(\"span\");\n label.textContent = \"Signature\";\n label.style.cssText = `position:absolute;top:-18px;left:0;font-size:11px;font-weight:600;color:${primaryColor};`;\n box.appendChild(label);\n wrap.appendChild(box);\n }\n\n container.appendChild(wrap);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) continue;\n ctx.scale(ratio, ratio);\n await page.render({ canvasContext: ctx, viewport, canvas }).promise;\n }\n } catch {\n if (!cancelled) setFailed(true);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [url, placement, workerSrc, primaryColor]);\n\n if (failed) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <iframe\n src={`${url}#toolbar=0`}\n title=\"Document\"\n style={{ width: \"100%\", height: 520, border: \"1px solid #e5e7eb\", borderRadius: 8 }}\n />\n <a href={url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 13, color: primaryColor }}>\n Download to read\n </a>\n </div>\n );\n }\n\n return <div ref={containerRef} style={{ width: \"100%\" }} />;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface DesignerPlacement {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface FieldDesignerProps {\n /** The chosen PDF's bytes (read client-side before upload). */\n pdfData: Uint8Array;\n value: DesignerPlacement | null;\n onChange: (placement: DesignerPlacement) => void;\n workerSrc?: string;\n primaryColor?: string;\n}\n\ninterface DragBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/**\n * Drag a signature box onto a pdf.js-rendered page. Emits a normalized\n * placement `{ page, x, y, w, h }` (0–1 fractions, top-left origin) that the seal\n * step converts to pdf coordinates — so it stays accurate at any size.\n */\nexport function FieldDesigner({\n pdfData,\n value,\n onChange,\n workerSrc,\n primaryColor = \"#4f46e5\",\n}: FieldDesignerProps) {\n const [numPages, setNumPages] = useState(0);\n const [page, setPage] = useState(value?.page ?? 1);\n const [failed, setFailed] = useState(false);\n const stageRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const docRef = useRef<any>(null);\n const [drag, setDrag] = useState<DragBox | null>(null);\n const startRef = useRef<{ x: number; y: number } | null>(null);\n\n // Load the document once.\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n try {\n const pdfjs = await import(\"pdfjs-dist\");\n pdfjs.GlobalWorkerOptions.workerSrc =\n workerSrc ?? `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\n const doc = await pdfjs.getDocument({ data: pdfData.slice() }).promise;\n if (cancelled) return;\n docRef.current = doc;\n setNumPages(doc.numPages);\n setPage((p) => Math.min(p, doc.numPages));\n } catch {\n if (!cancelled) setFailed(true);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [pdfData, workerSrc]);\n\n // Render the current page.\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n const doc = docRef.current;\n const canvas = canvasRef.current;\n if (!doc || !canvas) return;\n const pageObj = await doc.getPage(page);\n if (cancelled) return;\n const width = stageRef.current?.clientWidth || 640;\n const base = pageObj.getViewport({ scale: 1 });\n const viewport = pageObj.getViewport({ scale: width / base.width });\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n canvas.width = Math.floor(viewport.width * ratio);\n canvas.height = Math.floor(viewport.height * ratio);\n canvas.style.width = \"100%\";\n canvas.style.display = \"block\";\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.scale(ratio, ratio);\n await pageObj.render({ canvasContext: ctx, viewport, canvas }).promise;\n })();\n return () => {\n cancelled = true;\n };\n }, [page, numPages]);\n\n function rel(e: React.MouseEvent): { x: number; y: number } {\n const rect = stageRef.current!.getBoundingClientRect();\n return {\n x: Math.min(Math.max((e.clientX - rect.left) / rect.width, 0), 1),\n y: Math.min(Math.max((e.clientY - rect.top) / rect.height, 0), 1),\n };\n }\n\n function onDown(e: React.MouseEvent) {\n startRef.current = rel(e);\n setDrag({ ...startRef.current, w: 0, h: 0 });\n }\n function onMove(e: React.MouseEvent) {\n if (!startRef.current) return;\n const p = rel(e);\n const s = startRef.current;\n setDrag({ x: Math.min(s.x, p.x), y: Math.min(s.y, p.y), w: Math.abs(p.x - s.x), h: Math.abs(p.y - s.y) });\n }\n function onUp() {\n if (drag && drag.w > 0.02 && drag.h > 0.01) {\n onChange({ page, x: drag.x, y: drag.y, w: drag.w, h: drag.h });\n }\n startRef.current = null;\n setDrag(null);\n }\n\n const box = drag ?? (value?.page === page ? value : null);\n\n if (failed) {\n return (\n <div style={{ color: \"#b91c1c\", fontSize: 14 }}>\n Could not render this PDF for placement. Please check the file is a valid, unencrypted PDF.\n </div>\n );\n }\n\n return (\n <div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 8 }}>\n <span style={{ fontSize: 13, color: \"#6b7280\" }}>Drag a box where the signature goes.</span>\n {numPages > 1 ? (\n <label style={{ marginLeft: \"auto\", fontSize: 13, color: \"#374151\" }}>\n Page{\" \"}\n <select value={page} onChange={(e) => setPage(Number(e.target.value))}>\n {Array.from({ length: numPages }, (_, i) => (\n <option key={i} value={i + 1}>\n {i + 1}\n </option>\n ))}\n </select>\n </label>\n ) : null}\n </div>\n <div\n ref={stageRef}\n onMouseDown={onDown}\n onMouseMove={onMove}\n onMouseUp={onUp}\n onMouseLeave={onUp}\n style={{\n position: \"relative\",\n cursor: \"crosshair\",\n userSelect: \"none\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n overflow: \"hidden\",\n }}\n >\n <canvas ref={canvasRef} />\n {box ? (\n <div\n style={{\n position: \"absolute\",\n left: `${box.x * 100}%`,\n top: `${box.y * 100}%`,\n width: `${box.w * 100}%`,\n height: `${box.h * 100}%`,\n border: `2px solid ${primaryColor}`,\n background: `${primaryColor}22`,\n borderRadius: 3,\n pointerEvents: \"none\",\n }}\n />\n ) : null}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\n\nimport { ConsentBlock, type ConsentValue } from \"./ConsentBlock\";\nimport { PdfViewer, type ViewerPlacement } from \"./PdfViewer\";\nimport { SignaturePad } from \"./SignaturePad\";\n\nexport interface SigningBranding {\n appName?: string;\n logoUrl?: string;\n primaryColor?: string;\n}\n\nexport interface SigningExperienceProps {\n /** Token-gated source PDF URL (GET /api/esign/source/<token>). */\n sourceUrl: string;\n /** Submit endpoint (POST /sign/<token>/submit). */\n submitUrl: string;\n documentTitle: string;\n placement?: ViewerPlacement;\n branding?: SigningBranding;\n /** Called after a successful signature submit (host navigates to /done). */\n onSigned?: () => void;\n workerSrc?: string;\n}\n\n/**\n * The full host-branded signer page body: read the PDF (placement highlighted),\n * draw/type a signature, consent, and submit. Self-contained styling so it sits\n * cleanly inside any host shell.\n */\nexport function SigningExperience(props: SigningExperienceProps) {\n const primary = props.branding?.primaryColor ?? \"#4f46e5\";\n const [signaturePng, setSignaturePng] = useState<string | null>(null);\n const [consent, setConsent] = useState<ConsentValue>({ signerName: \"\", consent: false });\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const canSubmit =\n !!signaturePng && consent.consent && consent.signerName.trim().length > 0 && !submitting;\n\n async function submit() {\n if (!canSubmit) return;\n setSubmitting(true);\n setError(null);\n try {\n const res = await fetch(props.submitUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n signaturePng,\n signerName: consent.signerName.trim(),\n consent: true,\n }),\n });\n if (!res.ok) {\n const body = (await res.json().catch(() => null)) as {\n error?: { message?: string };\n } | null;\n throw new Error(body?.error?.message ?? \"Could not submit your signature.\");\n }\n props.onSigned?.();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Something went wrong.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <div\n style={{\n maxWidth: 760,\n margin: \"0 auto\",\n padding: \"24px 16px 64px\",\n fontFamily:\n \"system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif\",\n color: \"#111827\",\n }}\n >\n <header style={{ display: \"flex\", alignItems: \"center\", gap: 12, marginBottom: 8 }}>\n {props.branding?.logoUrl ? (\n <img src={props.branding.logoUrl} alt=\"\" style={{ height: 32 }} />\n ) : null}\n {props.branding?.appName ? (\n <span style={{ fontWeight: 600, color: \"#374151\" }}>{props.branding.appName}</span>\n ) : null}\n </header>\n\n <h1 style={{ fontSize: 22, margin: \"8px 0 4px\" }}>{props.documentTitle}</h1>\n <p style={{ color: \"#6b7280\", fontSize: 14, marginTop: 0 }}>\n Review the document below, then sign — no account or login needed.\n </p>\n\n <section style={{ margin: \"16px 0\" }}>\n <PdfViewer\n url={props.sourceUrl}\n placement={props.placement}\n workerSrc={props.workerSrc}\n primaryColor={primary}\n />\n </section>\n\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <div>\n <label style={{ fontSize: 13, fontWeight: 600, color: \"#374151\" }}>Your signature</label>\n <div style={{ marginTop: 6 }}>\n <SignaturePad primaryColor={primary} onChange={setSignaturePng} />\n </div>\n </div>\n\n <ConsentBlock value={consent} onChange={setConsent} primaryColor={primary} />\n\n {error ? (\n <div\n style={{\n background: \"#fef2f2\",\n border: \"1px solid #fecaca\",\n color: \"#b91c1c\",\n borderRadius: 8,\n padding: \"10px 12px\",\n fontSize: 14,\n }}\n >\n {error}\n </div>\n ) : null}\n\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n style={{\n padding: \"14px 16px\",\n borderRadius: 10,\n border: \"none\",\n background: canSubmit ? primary : \"#c7c9d1\",\n color: \"#fff\",\n fontSize: 16,\n fontWeight: 600,\n cursor: canSubmit ? \"pointer\" : \"not-allowed\",\n }}\n >\n {submitting ? \"Signing…\" : \"Sign document\"}\n </button>\n </section>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/SignaturePad.tsx","../../src/ui/ConsentBlock.tsx","../../src/ui/PdfViewer.tsx","../../src/ui/FieldDesigner.tsx","../../src/ui/SigningExperience.tsx"],"names":["useState","useRef","useEffect","SignaturePadLib","jsx","jsxs","Fragment"],"mappings":";;;;;;;;;;;AAcO,SAAS,YAAA,CAAa,EAAE,YAAA,GAAe,SAAA,EAAW,UAAS,EAAsB;AACtF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAA0B,MAAM,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,SAAA,GAAYC,aAA0B,IAAI,CAAA;AAChD,EAAA,MAAM,MAAA,GAASA,aAA+B,IAAI,CAAA;AAElD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,GAAA,GAAM,IAAIC,gCAAA,CAAgB,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,CAAA;AAC7F,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AACjB,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,IAAoB,GAAG,CAAC,CAAA;AACtD,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC5C,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AAC9C,MAAA,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,EAAG,KAAA,CAAM,OAAO,KAAK,CAAA;AAC3C,MAAA,GAAA,CAAI,KAAA,EAAM;AACV,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA;AACA,IAAA,GAAA,CAAI,gBAAA;AAAA,MAAiB,WAAA;AAAA,MAAa,MAChC,SAAS,GAAA,CAAI,OAAA,KAAY,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,WAAW,CAAC;AAAA,KAC5D;AACA,IAAA,MAAA,EAAO;AACP,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACxC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAC3C,MAAA,GAAA,CAAI,GAAA,EAAI;AACR,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,CAAA,CAAE,KAAA,GAAQ,GAAA;AACV,IAAA,CAAA,CAAE,MAAA,GAAS,GAAA;AACX,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,IAAA,GAAO,iDAAA;AACX,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAC1B,IAAA,QAAA,CAAS,CAAA,CAAE,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE1B,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAoB,KAAA,qBAC/BE,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAS,MAAM;AACb,QAAA,OAAA,CAAQ,CAAC,CAAA;AACT,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,CAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS,UAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,YAAA,EAAc,IAAA,KAAS,CAAA,GAAI,CAAA,UAAA,EAAa,YAAY,CAAA,CAAA,GAAK,uBAAA;AAAA,QACzD,UAAA,EAAY,aAAA;AAAA,QACZ,UAAA,EAAY,IAAA,KAAS,CAAA,GAAI,GAAA,GAAM,GAAA;AAAA,QAC/B,KAAA,EAAO,IAAA,KAAS,CAAA,GAAI,YAAA,GAAe,SAAA;AAAA,QACnC,MAAA,EAAQ;AAAA,OACV;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,qBAAqB,YAAA,EAAc,EAAA,EAAI,QAAA,EAAU,QAAA,EAAS,EAC9E,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,YAAA,EAAc,qBAAoB,EAC9D,QAAA,EAAA;AAAA,MAAA,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,MAClB,GAAA,CAAI,QAAQ,MAAM;AAAA,KAAA,EACrB,CAAA;AAAA,oBACAA,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,UAAA,EAAY,QAAO,EACpD,QAAA,EAAA;AAAA,MAAA,IAAA,KAAS,MAAA,mBACRD,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,GAAA,EAAK,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,OAAA;AAAQ;AAAA,0BAG7EA,cAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,IAAG,EACxB,QAAA,kBAAAA,cAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA,EAAY,gBAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,EAAA;AAAA,YACV,UAAA,EAAY,4CAAA;AAAA,YACZ,MAAA,EAAQ,MAAA;AAAA,YACR,YAAA,EAAc,mBAAA;AAAA,YACd,OAAA,EAAS,MAAA;AAAA,YACT,OAAA,EAAS;AAAA;AACX;AAAA,OACF,EACF,CAAA;AAAA,sBAEFA,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AACb,YAAA,MAAA,CAAO,SAAS,KAAA,EAAM;AACtB,YAAA,QAAA,CAAS,EAAE,CAAA;AACX,YAAA,QAAA,CAAS,IAAI,CAAA;AAAA,UACf,CAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,UAAA;AAAA,YACV,GAAA,EAAK,CAAA;AAAA,YACL,KAAA,EAAO,CAAA;AAAA,YACP,QAAA,EAAU,EAAA;AAAA,YACV,KAAA,EAAO,SAAA;AAAA,YACP,UAAA,EAAY,uBAAA;AAAA,YACZ,MAAA,EAAQ,mBAAA;AAAA,YACR,YAAA,EAAc,CAAA;AAAA,YACd,OAAA,EAAS,SAAA;AAAA,YACT,MAAA,EAAQ;AAAA,WACV;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/HO,SAAS,aAAa,EAAE,KAAA,EAAO,QAAA,EAAU,YAAA,GAAe,WAAU,EAAsB;AAC7F,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,EAAA,EAAG,EAC9D,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC/D,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,sBACjFA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAO,KAAA,CAAM,UAAA;AAAA,UACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UAClE,WAAA,EAAY,mBAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,WAAA;AAAA,YACT,MAAA,EAAQ,mBAAA;AAAA,YACR,YAAA,EAAc,CAAA;AAAA,YACd,QAAA,EAAU,EAAA;AAAA,YACV,OAAA,EAAS;AAAA;AACX;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBACAC,eAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,EAAA,EAAI,UAAA,EAAY,YAAA,EAAc,MAAA,EAAQ,WAAU,EACpF,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,UAAA;AAAA,UACL,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,UACjE,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,aAAa,YAAA,EAAc,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA;AAAG;AAAA,OAC1E;AAAA,sBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,GAAA,EAAI,EAAG,QAAA,EAAA,wMAAA,EAIlE;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACxBO,SAAS,UAAU,EAAE,GAAA,EAAK,YAAY,SAAA,EAAW,YAAA,GAAe,WAAU,EAAmB;AAClG,EAAA,MAAM,YAAA,GAAeH,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAAS,KAAK,CAAA;AAE1C,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAO,YAAY,CAAA;AACvC,QAAA,KAAA,CAAM,mBAAA,CAAoB,SAAA,GACxB,SAAA,IAAa,CAAA,6BAAA,EAAgC,MAAM,OAAO,CAAA,yBAAA,CAAA;AAC5D,QAAA,MAAM,MAAM,MAAM,KAAA,CAAM,YAAY,EAAE,GAAA,EAAK,CAAA,CAAE,OAAA;AAC7C,QAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,QAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC7B,QAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AACtB,QAAA,MAAM,KAAA,GAAQ,UAAU,WAAA,IAAe,GAAA;AACvC,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,IAAoB,GAAG,CAAC,CAAA;AAEtD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,UAAU,CAAA,EAAA,EAAK;AACtC,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA;AAChC,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAC1C,UAAA,MAAM,QAAA,GAAW,KAAK,WAAA,CAAY,EAAE,OAAO,KAAA,GAAQ,IAAA,CAAK,OAAO,CAAA;AAE/D,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,UAAA,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,KAAK,CAAA;AAChD,UAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,KAAK,CAAA;AAClD,UAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,MAAA;AACrB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,UAAA,MAAA,CAAO,MAAM,YAAA,GAAe,KAAA;AAE5B,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,UAAA,IAAA,CAAK,MAAM,QAAA,GAAW,UAAA;AACtB,UAAA,IAAA,CAAK,MAAM,YAAA,GAAe,MAAA;AAC1B,UAAA,IAAA,CAAK,MAAM,SAAA,GAAY,4BAAA;AACvB,UAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,UAAA,KAAA,MAAW,EAAA,IAAM,UAAA,IAAc,EAAC,EAAG;AACjC,YAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AACnB,YAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,YAAA,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,uBAAA,EAA0B,EAAA,CAAG,IAAI,GAAG,CAAA,MAAA,EAAS,GAAG,CAAA,GAAI,GAAG,WAAW,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,EAAA,CAAG,IAAI,GAAG,CAAA,oBAAA,EAAuB,YAAY,CAAA,YAAA,EAAe,YAAY,CAAA,gHAAA,CAAA;AACpL,YAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,YAAA,KAAA,CAAM,WAAA,GAAc,kBAAA;AACpB,YAAA,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,CAAA,qCAAA,EAAwC,YAAY,CAAA,iCAAA,CAAA;AAC1E,YAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AACrB,YAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,UACtB;AAEA,UAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAC1B,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,GAAA,CAAI,KAAA,CAAM,OAAO,KAAK,CAAA;AACtB,UAAA,MAAM,IAAA,CAAK,OAAO,EAAE,aAAA,EAAe,KAAK,QAAA,EAAU,MAAA,EAAQ,CAAA,CAAE,OAAA;AAAA,QAC9D;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,MAChC;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,GAAA,EAAK,UAAA,EAAY,SAAA,EAAW,YAAY,CAAC,CAAA;AAE7C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC7D,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,GAAG,GAAG,CAAA,UAAA,CAAA;AAAA,UACX,KAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,GAAA,EAAK,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,CAAA;AAAE;AAAA,OACpF;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,GAAA,EAAK,QAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EAAa,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,YAAA,IAAgB,QAAA,EAAA,kBAAA,EAE7F;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBAAOA,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO,EAAG,CAAA;AAC3D;ACvEA,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,GAAA,EAAa,GAAA,KAAgB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,CAAA;AACrF,IAAM,KAAA,GAAQ,IAAA;AACd,IAAM,KAAA,GAAQ,IAAA;AACd,IAAM,QAAQ,MACZ,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,UAAA,GACpC,MAAA,CAAO,UAAA,EAAW,GAClB,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAQjC,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIJ,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIA,eAAS,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,IAAQ,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAIA,eAAwB,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,IAAM,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAqB,IAAI,CAAA;AACjD,EAAA,MAAM,QAAA,GAAWC,aAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAYA,aAA0B,IAAI,CAAA;AAEhD,EAAA,MAAM,MAAA,GAASA,aAAY,IAAI,CAAA;AAE/B,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAO,YAAY,CAAA;AACvC,QAAA,KAAA,CAAM,mBAAA,CAAoB,SAAA,GACxB,SAAA,IAAa,CAAA,6BAAA,EAAgC,MAAM,OAAO,CAAA,yBAAA,CAAA;AAC5D,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,WAAA,CAAY,EAAE,MAAM,OAAA,CAAQ,KAAA,EAAM,EAAG,CAAA,CAAE,OAAA;AAC/D,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AACjB,QAAA,WAAA,CAAY,IAAI,QAAQ,CAAA;AACxB,QAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,MAC1C,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,MAChC;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAA,EAAQ;AACrB,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACtC,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,EAAS,WAAA,IAAe,GAAA;AAC/C,MAAA,MAAM,OAAO,OAAA,CAAQ,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,CAAY,EAAE,OAAO,KAAA,GAAQ,IAAA,CAAK,OAAO,CAAA;AAClE,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,IAAoB,GAAG,CAAC,CAAA;AACtD,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,KAAK,CAAA;AAChD,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,KAAK,CAAA;AAClD,MAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,MAAA;AACrB,MAAA,MAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,KAAA,CAAM,OAAO,KAAK,CAAA;AACtB,MAAA,MAAM,OAAA,CAAQ,OAAO,EAAE,aAAA,EAAe,KAAK,QAAA,EAAU,MAAA,EAAQ,CAAA,CAAE,OAAA;AAAA,IACjE,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,EAAA,SAAS,IAAI,CAAA,EAAmE;AAC9E,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,OAAA,CAAS,qBAAA,EAAsB;AAClD,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,OAAO,CAAA,CAAE,OAAA,GAAU,EAAE,IAAA,IAAQ,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAAA,MAC7C,CAAA,EAAG,OAAO,CAAA,CAAE,OAAA,GAAU,EAAE,GAAA,IAAO,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAG,CAAC;AAAA,KAC/C;AAAA,EACF;AAEA,EAAA,SAAS,cAAc,CAAA,EAAuB;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,MAAA,CAAA,GAAI;AAAA,QACF,GAAG,IAAA,CAAK,GAAA,CAAI,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,QAC7B,GAAG,IAAA,CAAK,GAAA,CAAI,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,QAC7B,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,QAC9B,GAAG,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,CAAC;AAAA,OAChC;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA;AAC5B,MAAA,CAAA,GAAI;AAAA,QACF,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,QAC7C,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,QAC7C,CAAA,EAAG,KAAK,IAAA,CAAK,CAAA;AAAA,QACb,CAAA,EAAG,KAAK,IAAA,CAAK;AAAA,OACf;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,EAAA,GAAK,KAAK,IAAA,CAAK,CAAA;AACnB,MAAA,IAAI,EAAA,GAAK,KAAK,IAAA,CAAK,CAAA;AACnB,MAAA,IAAI,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA;AACjC,MAAA,IAAI,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA;AACjC,MAAA,IAAI,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,OAAU,CAAA,CAAE,CAAA;AAAA,gBACzB,CAAA,CAAE,CAAA;AACZ,MAAA,IAAI,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,OAAU,CAAA,CAAE,CAAA;AAAA,gBACzB,CAAA,CAAE,CAAA;AACZ,MAAA,CAAA,GAAI,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,GAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,EAAE;AAAA,IAC7F;AACA,IAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,EACX;AAEA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,IAAI,QAAQ,IAAA,IAAQ,IAAA,CAAK,KAAK,KAAA,IAAS,IAAA,CAAK,KAAK,KAAA,EAAO;AACtD,MAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,QAAA,MAAM,CAAA,GAAuB;AAAA,UAC3B,IAAI,KAAA,EAAM;AAAA,UACV,KAAA,EAAO,MAAM,MAAA,KAAW,CAAA,GAAI,cAAc,CAAA,UAAA,EAAa,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,UACvE,IAAA;AAAA,UACA,GAAG;AAAA,SACL;AACA,QAAA,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,CAAC,CAAC,CAAA;AACtB,QAAA,aAAA,CAAc,EAAE,EAAE,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,EAAE,EAAA,KAAO,IAAA,CAAK,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,GAAG,IAAA,EAAK,GAAI,CAAE,CAAC,CAAA;AAAA,MACvE;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd;AAEA,EAAA,SAAS,YAAY,EAAA,EAAY;AAC/B,IAAA,QAAA,CAAS,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AACzC,IAAA,IAAI,UAAA,KAAe,EAAA,EAAI,aAAA,CAAc,IAAI,CAAA;AAAA,EAC3C;AACA,EAAA,SAAS,MAAA,CAAO,IAAY,KAAA,EAAe;AACzC,IAAA,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,KAAA,EAAM,GAAI,CAAE,CAAC,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAY,IAAA,EAAW,CAAA,KAAc;AACnD,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AACjD,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,OAAO,aAAA,GAAgB,aAAA;AAC1D,IAAA,uBACEE,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,aAAA,EAAe,CAAC,CAAA,KAAM;AACpB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,OAAA,CAAQ,EAAE,MAAM,QAAA,EAAU,EAAA,EAAI,QAAQ,CAAA,EAAG,IAAA,EAAM,MAAM,CAAA;AAAA,QACvD,CAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,IAAA,EAAM,CAAA,EAAG,EAAA,GAAK,GAAG,CAAA,CAAA,CAAA;AAAA,UACjB,GAAA,EAAK,CAAA,EAAG,EAAA,GAAK,GAAG,CAAA,CAAA,CAAA;AAAA,UAChB,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,UAAA,EAAY,EAAA;AAAA,UACZ,SAAA,EAAW,EAAA;AAAA,UACX,UAAA,EAAY,MAAA;AAAA,UACZ,MAAA,EAAQ,aAAa,YAAY,CAAA,CAAA;AAAA,UACjC,YAAA,EAAc,CAAA;AAAA,UACd,MAAA;AAAA,UACA,WAAA,EAAa;AAAA;AACf,OAAA;AAAA,MAlBK;AAAA,KAmBP;AAAA,EAEJ,CAAA;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,QAAA,EAAU,EAAA,EAAG,EAAG,QAAA,EAAA,6FAAA,EAEhD,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,EAAA,EAAI,UAAA,EAAY,cAAa,EACjF,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,MAAM,WAAA,EAAa,QAAA,EAAU,KAAI,EAC7C,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,YAAA,EAAc,CAAA,EAAE,EAC3E,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,oCAAA,EAAkC,CAAA;AAAA,QAClF,QAAA,GAAW,CAAA,mBACVC,eAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,WAAU,EAAG,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,UAC/D,GAAA;AAAA,0BACLD,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,MAAM,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,GACjE,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAG,CAAC,CAAA,EAAG,sBACpCA,cAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,IAAI,CAAA,EACxB,QAAA,EAAA,CAAA,GAAI,CAAA,EAAA,EADM,CAEb,CACD,CAAA,EACH;AAAA,SAAA,EACF,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,sBACAC,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,aAAA,EAAe,CAAC,CAAA,KAAM,OAAA,CAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA;AAAA,UAC5D,aAAA;AAAA,UACA,WAAA;AAAA,UACA,cAAA,EAAgB,WAAA;AAAA,UAChB,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,UAAA;AAAA,YACV,MAAA,EAAQ,WAAA;AAAA,YACR,UAAA,EAAY,MAAA;AAAA,YACZ,WAAA,EAAa,MAAA;AAAA,YACb,MAAA,EAAQ,mBAAA;AAAA,YACR,YAAA,EAAc,CAAA;AAAA,YACd,QAAA,EAAU;AAAA,WACZ;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,YACvB,KAAA,CACE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA,CAC7B,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,cAAA,MAAM,WAAW,IAAA,IAAQ,IAAA,CAAK,SAAS,KAAA,IAAS,IAAA,CAAK,OAAO,CAAA,CAAE,EAAA;AAC9D,cAAA,MAAM,IAAA,GAAY,QAAA,IAAY,IAAA,GAAO,IAAA,GAAO,CAAA;AAC5C,cAAA,MAAM,KAAA,GAAQ,EAAE,EAAA,KAAO,UAAA;AACvB,cAAA,uBACEC,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAD,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAe,CAAC,CAAA,KAAM;AACpB,sBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,sBAAA,aAAA,CAAc,EAAE,EAAE,CAAA;AAClB,sBAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,oBAC/D,CAAA;AAAA,oBACA,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,sBACrB,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,sBACpB,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,sBACtB,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,sBACvB,QAAQ,CAAA,IAAA,EAAO,KAAA,GAAQ,OAAA,GAAU,QAAQ,IAAI,YAAY,CAAA,CAAA;AAAA,sBACzD,YAAY,CAAA,EAAG,YAAY,CAAA,EAAG,KAAA,GAAQ,OAAO,IAAI,CAAA,CAAA;AAAA,sBACjD,YAAA,EAAc,CAAA;AAAA,sBACd,MAAA,EAAQ,MAAA;AAAA,sBACR,OAAA,EAAS,MAAA;AAAA,sBACT,UAAA,EAAY,QAAA;AAAA,sBACZ,cAAA,EAAgB,QAAA;AAAA,sBAChB,QAAA,EAAU,QAAA;AAAA,sBACV,WAAA,EAAa;AAAA,qBACf;AAAA,oBAEA,QAAA,kBAAAC,eAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,QAAA,EAAU,EAAA;AAAA,0BACV,UAAA,EAAY,GAAA;AAAA,0BACZ,KAAA,EAAO,YAAA;AAAA,0BACP,OAAA,EAAS,IAAA;AAAA,0BACT,UAAA,EAAY,QAAA;AAAA,0BACZ,OAAA,EAAS;AAAA,yBACX;AAAA,wBACD,QAAA,EAAA;AAAA,0BAAA,SAAA;AAAA,0BACI,EAAE,KAAA,IAAS;AAAA;AAAA;AAAA;AAChB;AAAA,iBACF;AAAA,gBACC,KAAA,mBACCA,eAAAA,CAAAC,mBAAA,EAAA,EACI,QAAA,EAAA;AAAA,kBAAA,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,kCACxEF,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,YAAA,EAAY,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,sBAC7B,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,sBACxC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,wBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,wBAAA,WAAA,CAAY,EAAE,EAAE,CAAA;AAAA,sBAClB,CAAA;AAAA,sBACA,KAAA,EAAO;AAAA,wBACL,QAAA,EAAU,UAAA;AAAA,wBACV,MAAM,CAAA,EAAA,CAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAK,GAAG,CAAA,CAAA,CAAA;AAAA,wBAChC,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,wBACpB,SAAA,EAAW,uBAAA;AAAA,wBACX,SAAA,EAAW,GAAA;AAAA,wBACX,KAAA,EAAO,EAAA;AAAA,wBACP,MAAA,EAAQ,EAAA;AAAA,wBACR,YAAA,EAAc,KAAA;AAAA,wBACd,UAAA,EAAY,YAAA;AAAA,wBACZ,KAAA,EAAO,MAAA;AAAA,wBACP,MAAA,EAAQ,gBAAA;AAAA,wBACR,SAAA,EAAW,2BAAA;AAAA,wBACX,QAAA,EAAU,EAAA;AAAA,wBACV,UAAA,EAAY,MAAA;AAAA,wBACZ,MAAA,EAAQ,SAAA;AAAA,wBACR,OAAA,EAAS,CAAA;AAAA,wBACT,WAAA,EAAa;AAAA,uBACf;AAAA,sBACD,QAAA,EAAA;AAAA;AAAA;AAED,iBAAA,EACF,CAAA,GACE;AAAA,eAAA,EAAA,EAvEI,EAAE,EAwEZ,CAAA;AAAA,YAEJ,CAAC,CAAA;AAAA,YACF,IAAA,EAAM,IAAA,KAAS,KAAA,IAAS,IAAA,mBACvBA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,UAAA;AAAA,kBACV,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,kBACrB,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,kBACpB,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,kBACtB,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAAA,kBACvB,MAAA,EAAQ,cAAc,YAAY,CAAA,CAAA;AAAA,kBAClC,UAAA,EAAY,GAAG,YAAY,CAAA,EAAA,CAAA;AAAA,kBAC3B,YAAA,EAAc,CAAA;AAAA,kBACd,aAAA,EAAe;AAAA;AACjB;AAAA,aACF,GACE;AAAA;AAAA;AAAA;AACN,KAAA,EACF,CAAA;AAAA,oBAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,GAAA,EAAK,QAAA,EAAU,GAAA,EAAI,EAC5D,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAU,EAAG,QAAA,EAAA;AAAA,QAAA,oBAAA;AAAA,QAC7D,KAAA,CAAM,MAAA;AAAA,QAAO;AAAA,OAAA,EAClC,CAAA;AAAA,MACC,KAAA,CAAM,MAAA,KAAW,CAAA,mBAChBD,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,IAAa,QAAA,EAAA,iEAAA,EAE9C,CAAA,mBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC5D,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,sBACVC,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAS,MAAM;AACb,YAAA,aAAA,CAAc,EAAE,EAAE,CAAA;AAClB,YAAA,OAAA,CAAQ,EAAE,IAAI,CAAA;AAAA,UAChB,CAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,UAAA,EAAY,QAAA;AAAA,YACZ,GAAA,EAAK,CAAA;AAAA,YACL,OAAA,EAAS,SAAA;AAAA,YACT,YAAA,EAAc,CAAA;AAAA,YACd,QAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,EAAA,KAAO,UAAA,GAAa,eAAe,SAAS,CAAA,CAAA;AAAA,YACnE,YAAY,CAAA,CAAE,EAAA,KAAO,UAAA,GAAa,CAAA,EAAG,YAAY,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,YACxD,MAAA,EAAQ;AAAA,WACV;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAD,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,OAAO,CAAA,CAAE,KAAA;AAAA,gBACT,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,gBAClC,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC5C,WAAA,EAAY,YAAA;AAAA,gBACZ,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM,CAAA;AAAA,kBACN,QAAA,EAAU,CAAA;AAAA,kBACV,MAAA,EAAQ,MAAA;AAAA,kBACR,OAAA,EAAS,MAAA;AAAA,kBACT,UAAA,EAAY,aAAA;AAAA,kBACZ,QAAA,EAAU;AAAA;AACZ;AAAA,aACF;AAAA,4BACAC,gBAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,CAAA,CAAE;AAAA,aAAA,EAAK,CAAA;AAAA,4BAC1DD,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,YAAA,EAAY,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,gBAC7B,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,WAAA,CAAY,EAAE,EAAE,CAAA;AAAA,gBAClB,CAAA;AAAA,gBACA,KAAA,EAAO;AAAA,kBACL,MAAA,EAAQ,MAAA;AAAA,kBACR,UAAA,EAAY,aAAA;AAAA,kBACZ,KAAA,EAAO,SAAA;AAAA,kBACP,MAAA,EAAQ,SAAA;AAAA,kBACR,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY,CAAA;AAAA,kBACZ,OAAA,EAAS;AAAA,iBACX;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,SAAA;AAAA,QAjDK,CAAA,CAAE;AAAA,OAmDV,CAAA,EACH;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACxYO,SAAS,kBAAkB,KAAA,EAA+B;AAC/D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,YAAA,IAAgB,SAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIJ,eAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAAuB,EAAE,UAAA,EAAY,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,CAAA;AACvF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,SAAA,GACJ,CAAC,CAAC,YAAA,IAAgB,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,UAAA;AAEhF,EAAA,eAAe,MAAA,GAAS;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,KAAA,CAAM,SAAA,EAAW;AAAA,QACvC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,YAAA;AAAA,UACA,UAAA,EAAY,OAAA,CAAQ,UAAA,CAAW,IAAA,EAAK;AAAA,UACpC,OAAA,EAAS;AAAA,SACV;AAAA,OACF,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,OAAQ,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAG/C,QAAA,MAAM,IAAI,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,WAAW,kCAAkC,CAAA;AAAA,MAC5E;AACA,MAAA,KAAA,CAAM,QAAA,IAAW;AAAA,IACnB,SAAS,CAAA,EAAG;AACV,MAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,uBAAuB,CAAA;AAAA,IACnE,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,uBACEK,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,gBAAA;AAAA,QACT,UAAA,EACE,0EAAA;AAAA,QACF,KAAA,EAAO;AAAA,OACT;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,EAAA,EAAI,YAAA,EAAc,CAAA,EAAE,EAC9E,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,UAAU,OAAA,mBACfD,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,GAAA,EAAI,IAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,EAAA,IAAM,CAAA,GAC9D,IAAA;AAAA,UACH,MAAM,QAAA,EAAU,OAAA,mBACfA,cAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,OAAO,SAAA,EAAU,EAAI,QAAA,EAAA,KAAA,CAAM,QAAA,CAAS,SAAQ,CAAA,GAC1E;AAAA,SAAA,EACN,CAAA;AAAA,wBAEAA,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,MAAA,EAAQ,WAAA,EAAY,EAAI,QAAA,EAAA,KAAA,CAAM,aAAA,EAAc,CAAA;AAAA,wBACvEA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,CAAA,EAAE,EAAG,QAAA,EAAA,yEAAA,EAE5D,CAAA;AAAA,wBAEAA,eAAC,SAAA,EAAA,EAAQ,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,IACxB,QAAA,kBAAAA,cAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAK,KAAA,CAAM,SAAA;AAAA,YACX,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,YAAA,EAAc;AAAA;AAAA,SAChB,EACF,CAAA;AAAA,wBAEAC,eAAAA,CAAC,SAAA,EAAA,EAAQ,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,EAAA,EAAG,EAClE,QAAA,EAAA;AAAA,0BAAAA,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,4BACjFA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE,EACzB,QAAA,kBAAAA,eAAC,YAAA,EAAA,EAAa,YAAA,EAAc,OAAA,EAAS,QAAA,EAAU,iBAAiB,CAAA,EAClE;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAA,eAAC,YAAA,EAAA,EAAa,KAAA,EAAO,SAAS,QAAA,EAAU,UAAA,EAAY,cAAc,OAAA,EAAS,CAAA;AAAA,UAE1E,wBACCA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY,SAAA;AAAA,gBACZ,MAAA,EAAQ,mBAAA;AAAA,gBACR,KAAA,EAAO,SAAA;AAAA,gBACP,YAAA,EAAc,CAAA;AAAA,gBACd,OAAA,EAAS,WAAA;AAAA,gBACT,QAAA,EAAU;AAAA,eACZ;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH,GACE,IAAA;AAAA,0BAEJA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,UAAU,CAAC,SAAA;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,WAAA;AAAA,gBACT,YAAA,EAAc,EAAA;AAAA,gBACd,MAAA,EAAQ,MAAA;AAAA,gBACR,UAAA,EAAY,YAAY,OAAA,GAAU,SAAA;AAAA,gBAClC,KAAA,EAAO,MAAA;AAAA,gBACP,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,GAAA;AAAA,gBACZ,MAAA,EAAQ,YAAY,SAAA,GAAY;AAAA,eAClC;AAAA,cAEC,uBAAa,eAAA,GAAa;AAAA;AAAA;AAC7B,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"index.cjs","sourcesContent":["import SignaturePadLib from \"signature_pad\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport interface SignaturePadProps {\n primaryColor?: string;\n /** Emits a PNG data URL of the current signature, or null when empty. */\n onChange: (pngDataUrl: string | null) => void;\n}\n\n/**\n * Capture a signature by drawing (signature_pad, touch + mouse, DPI-aware) or by\n * typing a name rendered in a script font. Both yield the same PNG data URL that\n * the seal step stamps onto the document.\n */\nexport function SignaturePad({ primaryColor = \"#4f46e5\", onChange }: SignaturePadProps) {\n const [mode, setMode] = useState<\"draw\" | \"type\">(\"draw\");\n const [typed, setTyped] = useState(\"\");\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const padRef = useRef<SignaturePadLib | null>(null);\n\n useEffect(() => {\n if (mode !== \"draw\") return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const pad = new SignaturePadLib(canvas, { penColor: \"#111827\", minWidth: 0.8, maxWidth: 2.2 });\n padRef.current = pad;\n const resize = () => {\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n const rect = canvas.getBoundingClientRect();\n canvas.width = Math.floor(rect.width * ratio);\n canvas.height = Math.floor(rect.height * ratio);\n canvas.getContext(\"2d\")?.scale(ratio, ratio);\n pad.clear();\n onChange(null);\n };\n pad.addEventListener(\"endStroke\", () =>\n onChange(pad.isEmpty() ? null : pad.toDataURL(\"image/png\")),\n );\n resize();\n window.addEventListener(\"resize\", resize);\n return () => {\n window.removeEventListener(\"resize\", resize);\n pad.off();\n padRef.current = null;\n };\n }, [mode, onChange]);\n\n useEffect(() => {\n if (mode !== \"type\") return;\n const name = typed.trim();\n if (!name) {\n onChange(null);\n return;\n }\n const c = document.createElement(\"canvas\");\n c.width = 720;\n c.height = 200;\n const ctx = c.getContext(\"2d\");\n if (!ctx) return;\n ctx.fillStyle = \"#111827\";\n ctx.font = \"72px 'Segoe Script', 'Brush Script MT', cursive\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(name, 24, 110);\n onChange(c.toDataURL(\"image/png\"));\n }, [mode, typed, onChange]);\n\n const tab = (m: \"draw\" | \"type\", label: string) => (\n <button\n type=\"button\"\n onClick={() => {\n setMode(m);\n onChange(null);\n }}\n style={{\n flex: 1,\n padding: \"8px 12px\",\n border: \"none\",\n borderBottom: mode === m ? `2px solid ${primaryColor}` : \"2px solid transparent\",\n background: \"transparent\",\n fontWeight: mode === m ? 600 : 400,\n color: mode === m ? primaryColor : \"#6b7280\",\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n\n return (\n <div style={{ border: \"1px solid #e5e7eb\", borderRadius: 12, overflow: \"hidden\" }}>\n <div style={{ display: \"flex\", borderBottom: \"1px solid #f3f4f6\" }}>\n {tab(\"draw\", \"Draw\")}\n {tab(\"type\", \"Type\")}\n </div>\n <div style={{ position: \"relative\", background: \"#fff\" }}>\n {mode === \"draw\" ? (\n <canvas\n ref={canvasRef}\n style={{ width: \"100%\", height: 180, touchAction: \"none\", display: \"block\" }}\n />\n ) : (\n <div style={{ padding: 16 }}>\n <input\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n placeholder=\"Type your name\"\n style={{\n width: \"100%\",\n fontSize: 40,\n fontFamily: \"'Segoe Script', 'Brush Script MT', cursive\",\n border: \"none\",\n borderBottom: \"1px solid #e5e7eb\",\n outline: \"none\",\n padding: \"8px 0\",\n }}\n />\n </div>\n )}\n <button\n type=\"button\"\n onClick={() => {\n padRef.current?.clear();\n setTyped(\"\");\n onChange(null);\n }}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n fontSize: 12,\n color: \"#6b7280\",\n background: \"rgba(255,255,255,0.8)\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n padding: \"2px 8px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n </div>\n </div>\n );\n}\n","export interface ConsentValue {\n signerName: string;\n consent: boolean;\n}\n\nexport interface ConsentBlockProps {\n value: ConsentValue;\n onChange: (value: ConsentValue) => void;\n primaryColor?: string;\n}\n\n/**\n * The electronic-signature intent record: a typed full legal name + an explicit\n * consent checkbox. Together with the audit trail this is what makes the simple\n * e-signature legally valid.\n */\nexport function ConsentBlock({ value, onChange, primaryColor = \"#4f46e5\" }: ConsentBlockProps) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 13, fontWeight: 600, color: \"#374151\" }}>Full legal name</span>\n <input\n value={value.signerName}\n onChange={(e) => onChange({ ...value, signerName: e.target.value })}\n placeholder=\"e.g. Ada Lovelace\"\n style={{\n padding: \"10px 12px\",\n border: \"1px solid #d1d5db\",\n borderRadius: 8,\n fontSize: 15,\n outline: \"none\",\n }}\n />\n </label>\n <label style={{ display: \"flex\", gap: 10, alignItems: \"flex-start\", cursor: \"pointer\" }}>\n <input\n type=\"checkbox\"\n checked={value.consent}\n onChange={(e) => onChange({ ...value, consent: e.target.checked })}\n style={{ marginTop: 3, accentColor: primaryColor, width: 16, height: 16 }}\n />\n <span style={{ fontSize: 13, color: \"#4b5563\", lineHeight: 1.5 }}>\n I agree to sign this document electronically. I understand my electronic\n signature is legally binding and that an audit record (time, IP, and a\n tamper-evident hash) is kept with the signed document.\n </span>\n </label>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface ViewerPlacement {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface PdfViewerProps {\n /** Token-gated source PDF URL. */\n url: string;\n /** Signature-box hints, each drawn on its page at normalized coords. */\n placements?: ViewerPlacement[];\n /** Override the pdf.js worker (defaults to the unpkg .mjs for the bundled version). */\n workerSrc?: string;\n primaryColor?: string;\n}\n\n/**\n * Render the PDF to canvases (pdf.js, responsive, DPI-aware) with the signature\n * box overlaid where the manager placed it. Falls back to an <iframe> + download\n * link if pdf.js fails to load — so the document is always readable.\n */\nexport function PdfViewer({ url, placements, workerSrc, primaryColor = \"#4f46e5\" }: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n try {\n const pdfjs = await import(\"pdfjs-dist\");\n pdfjs.GlobalWorkerOptions.workerSrc =\n workerSrc ?? `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\n const doc = await pdfjs.getDocument({ url }).promise;\n const container = containerRef.current;\n if (!container || cancelled) return;\n container.innerHTML = \"\";\n const width = container.clientWidth || 640;\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n\n for (let p = 1; p <= doc.numPages; p++) {\n const page = await doc.getPage(p);\n if (cancelled) return;\n const base = page.getViewport({ scale: 1 });\n const viewport = page.getViewport({ scale: width / base.width });\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.floor(viewport.width * ratio);\n canvas.height = Math.floor(viewport.height * ratio);\n canvas.style.width = \"100%\";\n canvas.style.display = \"block\";\n canvas.style.borderRadius = \"4px\";\n\n const wrap = document.createElement(\"div\");\n wrap.style.position = \"relative\";\n wrap.style.marginBottom = \"14px\";\n wrap.style.boxShadow = \"0 1px 4px rgba(0,0,0,0.12)\";\n wrap.appendChild(canvas);\n\n for (const pl of placements ?? []) {\n if (pl.page !== p) continue;\n const box = document.createElement(\"div\");\n box.style.cssText = `position:absolute;left:${pl.x * 100}%;top:${pl.y * 100}%;width:${pl.w * 100}%;height:${pl.h * 100}%;border:2px dashed ${primaryColor};background:${primaryColor}1a;border-radius:4px;pointer-events:none;display:flex;align-items:center;justify-content:center;overflow:hidden;`;\n const label = document.createElement(\"span\");\n label.textContent = \"✍ Sign here\";\n label.style.cssText = `font-size:11px;font-weight:600;color:${primaryColor};opacity:0.85;white-space:nowrap;`;\n box.appendChild(label);\n wrap.appendChild(box);\n }\n\n container.appendChild(wrap);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) continue;\n ctx.scale(ratio, ratio);\n await page.render({ canvasContext: ctx, viewport, canvas }).promise;\n }\n } catch {\n if (!cancelled) setFailed(true);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [url, placements, workerSrc, primaryColor]);\n\n if (failed) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <iframe\n src={`${url}#toolbar=0`}\n title=\"Document\"\n style={{ width: \"100%\", height: 520, border: \"1px solid #e5e7eb\", borderRadius: 8 }}\n />\n <a href={url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 13, color: primaryColor }}>\n Download to read\n </a>\n </div>\n );\n }\n\n return <div ref={containerRef} style={{ width: \"100%\" }} />;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface DesignerPlacement {\n id: string;\n label: string;\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface FieldDesignerProps {\n /** The chosen PDF's bytes (read client-side before upload). */\n pdfData: Uint8Array;\n value: DesignerPlacement[];\n onChange: (fields: DesignerPlacement[]) => void;\n workerSrc?: string;\n primaryColor?: string;\n}\n\ninterface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\ntype Corner = \"nw\" | \"ne\" | \"sw\" | \"se\";\ntype Drag =\n | { mode: \"new\"; start: { x: number; y: number } }\n | { mode: \"move\"; id: string; start: { x: number; y: number }; orig: Box }\n | { mode: \"resize\"; id: string; handle: Corner; orig: Box };\n\nconst clamp = (v: number, min: number, max: number) => Math.min(Math.max(v, min), max);\nconst MIN_W = 0.04;\nconst MIN_H = 0.02;\nconst newId = () =>\n typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2);\n\n/**\n * Place + edit one or more named signature fields on a pdf.js-rendered page.\n * Touch + mouse (Pointer Events): drag empty space to add a field, drag a field\n * to move, drag a corner to resize, × to remove. Fields are listed and renameable\n * on the side (and wrap below on narrow screens). Each box shows its name.\n */\nexport function FieldDesigner({\n pdfData,\n value,\n onChange,\n workerSrc,\n primaryColor = \"#4f46e5\",\n}: FieldDesignerProps) {\n const [numPages, setNumPages] = useState(0);\n const [page, setPage] = useState(value[0]?.page ?? 1);\n const [failed, setFailed] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(value[0]?.id ?? null);\n const [drag, setDrag] = useState<Drag | null>(null);\n const [live, setLive] = useState<Box | null>(null);\n const stageRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const docRef = useRef<any>(null);\n\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n try {\n const pdfjs = await import(\"pdfjs-dist\");\n pdfjs.GlobalWorkerOptions.workerSrc =\n workerSrc ?? `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\n const doc = await pdfjs.getDocument({ data: pdfData.slice() }).promise;\n if (cancelled) return;\n docRef.current = doc;\n setNumPages(doc.numPages);\n setPage((p) => Math.min(p, doc.numPages));\n } catch {\n if (!cancelled) setFailed(true);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [pdfData, workerSrc]);\n\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n const doc = docRef.current;\n const canvas = canvasRef.current;\n if (!doc || !canvas) return;\n const pageObj = await doc.getPage(page);\n if (cancelled) return;\n const width = stageRef.current?.clientWidth || 480;\n const base = pageObj.getViewport({ scale: 1 });\n const viewport = pageObj.getViewport({ scale: width / base.width });\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n canvas.width = Math.floor(viewport.width * ratio);\n canvas.height = Math.floor(viewport.height * ratio);\n canvas.style.width = \"100%\";\n canvas.style.display = \"block\";\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.scale(ratio, ratio);\n await pageObj.render({ canvasContext: ctx, viewport, canvas }).promise;\n })();\n return () => {\n cancelled = true;\n };\n }, [page, numPages]);\n\n function rel(e: { clientX: number; clientY: number }): { x: number; y: number } {\n const r = stageRef.current!.getBoundingClientRect();\n return {\n x: clamp((e.clientX - r.left) / r.width, 0, 1),\n y: clamp((e.clientY - r.top) / r.height, 0, 1),\n };\n }\n\n function onPointerMove(e: React.PointerEvent) {\n if (!drag) return;\n const p = rel(e);\n let b: Box;\n if (drag.mode === \"new\") {\n b = {\n x: Math.min(drag.start.x, p.x),\n y: Math.min(drag.start.y, p.y),\n w: Math.abs(p.x - drag.start.x),\n h: Math.abs(p.y - drag.start.y),\n };\n } else if (drag.mode === \"move\") {\n const dx = p.x - drag.start.x;\n const dy = p.y - drag.start.y;\n b = {\n x: clamp(drag.orig.x + dx, 0, 1 - drag.orig.w),\n y: clamp(drag.orig.y + dy, 0, 1 - drag.orig.h),\n w: drag.orig.w,\n h: drag.orig.h,\n };\n } else {\n let x1 = drag.orig.x;\n let y1 = drag.orig.y;\n let x2 = drag.orig.x + drag.orig.w;\n let y2 = drag.orig.y + drag.orig.h;\n if (drag.handle[0] === \"n\") y1 = p.y;\n else y2 = p.y;\n if (drag.handle[1] === \"w\") x1 = p.x;\n else x2 = p.x;\n b = { x: Math.min(x1, x2), y: Math.min(y1, y2), w: Math.abs(x2 - x1), h: Math.abs(y2 - y1) };\n }\n setLive(b);\n }\n\n function onPointerUp() {\n if (drag && live && live.w >= MIN_W && live.h >= MIN_H) {\n if (drag.mode === \"new\") {\n const f: DesignerPlacement = {\n id: newId(),\n label: value.length === 0 ? \"Signature\" : `Signature ${value.length + 1}`,\n page,\n ...live,\n };\n onChange([...value, f]);\n setSelectedId(f.id);\n } else {\n onChange(value.map((x) => (x.id === drag.id ? { ...x, ...live } : x)));\n }\n }\n setDrag(null);\n setLive(null);\n }\n\n function removeField(id: string) {\n onChange(value.filter((f) => f.id !== id));\n if (selectedId === id) setSelectedId(null);\n }\n function rename(id: string, label: string) {\n onChange(value.map((f) => (f.id === id ? { ...f, label } : f)));\n }\n\n const handle = (id: string, geom: Box, c: Corner) => {\n const cx = c[1] === \"w\" ? geom.x : geom.x + geom.w;\n const cy = c[0] === \"n\" ? geom.y : geom.y + geom.h;\n const cursor = c === \"nw\" || c === \"se\" ? \"nwse-resize\" : \"nesw-resize\";\n return (\n <div\n key={c}\n onPointerDown={(e) => {\n e.stopPropagation();\n setDrag({ mode: \"resize\", id, handle: c, orig: geom });\n }}\n style={{\n position: \"absolute\",\n left: `${cx * 100}%`,\n top: `${cy * 100}%`,\n width: 13,\n height: 13,\n marginLeft: -7,\n marginTop: -7,\n background: \"#fff\",\n border: `2px solid ${primaryColor}`,\n borderRadius: 2,\n cursor,\n touchAction: \"none\",\n }}\n />\n );\n };\n\n if (failed) {\n return (\n <div style={{ color: \"#b91c1c\", fontSize: 14 }}>\n Could not render this PDF for placement. Please check the file is a valid, unencrypted PDF.\n </div>\n );\n }\n\n return (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 16, alignItems: \"flex-start\" }}>\n <div style={{ flex: \"1 1 340px\", minWidth: 260 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 8 }}>\n <span style={{ fontSize: 13, color: \"#6b7280\" }}>Drag a box where a signature goes.</span>\n {numPages > 1 ? (\n <label style={{ marginLeft: \"auto\", fontSize: 13, color: \"#374151\" }}>\n Page{\" \"}\n <select value={page} onChange={(e) => setPage(Number(e.target.value))}>\n {Array.from({ length: numPages }, (_, i) => (\n <option key={i} value={i + 1}>\n {i + 1}\n </option>\n ))}\n </select>\n </label>\n ) : null}\n </div>\n <div\n ref={stageRef}\n onPointerDown={(e) => setDrag({ mode: \"new\", start: rel(e) })}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerLeave={onPointerUp}\n style={{\n position: \"relative\",\n cursor: \"crosshair\",\n userSelect: \"none\",\n touchAction: \"none\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n overflow: \"hidden\",\n }}\n >\n <canvas ref={canvasRef} />\n {value\n .filter((f) => f.page === page)\n .map((f) => {\n const dragging = drag && drag.mode !== \"new\" && drag.id === f.id;\n const geom: Box = dragging && live ? live : f;\n const isSel = f.id === selectedId;\n return (\n <div key={f.id}>\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n setSelectedId(f.id);\n setDrag({ mode: \"move\", id: f.id, start: rel(e), orig: geom });\n }}\n style={{\n position: \"absolute\",\n left: `${geom.x * 100}%`,\n top: `${geom.y * 100}%`,\n width: `${geom.w * 100}%`,\n height: `${geom.h * 100}%`,\n border: `2px ${isSel ? \"solid\" : \"dashed\"} ${primaryColor}`,\n background: `${primaryColor}${isSel ? \"22\" : \"14\"}`,\n borderRadius: 3,\n cursor: \"move\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n touchAction: \"none\",\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: primaryColor,\n opacity: 0.85,\n whiteSpace: \"nowrap\",\n padding: \"0 4px\",\n }}\n >\n ✍ {f.label || \"Signature\"}\n </span>\n </div>\n {isSel ? (\n <>\n {([\"nw\", \"ne\", \"sw\", \"se\"] as Corner[]).map((c) => handle(f.id, geom, c))}\n <button\n type=\"button\"\n aria-label={`Remove ${f.label}`}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation();\n removeField(f.id);\n }}\n style={{\n position: \"absolute\",\n left: `${(geom.x + geom.w) * 100}%`,\n top: `${geom.y * 100}%`,\n transform: \"translate(-50%, -50%)\",\n marginTop: -18,\n width: 22,\n height: 22,\n borderRadius: \"50%\",\n background: primaryColor,\n color: \"#fff\",\n border: \"2px solid #fff\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.3)\",\n fontSize: 14,\n lineHeight: \"16px\",\n cursor: \"pointer\",\n padding: 0,\n touchAction: \"none\",\n }}\n >\n ×\n </button>\n </>\n ) : null}\n </div>\n );\n })}\n {drag?.mode === \"new\" && live ? (\n <div\n style={{\n position: \"absolute\",\n left: `${live.x * 100}%`,\n top: `${live.y * 100}%`,\n width: `${live.w * 100}%`,\n height: `${live.h * 100}%`,\n border: `2px dashed ${primaryColor}`,\n background: `${primaryColor}22`,\n borderRadius: 3,\n pointerEvents: \"none\",\n }}\n />\n ) : null}\n </div>\n </div>\n\n <div style={{ flex: \"1 1 200px\", minWidth: 180, maxWidth: 300 }}>\n <p style={{ fontSize: 13, fontWeight: 600, color: \"#374151\", margin: \"0 0 8px\" }}>\n Signature fields ({value.length})\n </p>\n {value.length === 0 ? (\n <p style={{ fontSize: 13, color: \"#6b7280\" }}>\n Draw a box on the page to add a field. Add as many as you need.\n </p>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {value.map((f) => (\n <div\n key={f.id}\n onClick={() => {\n setSelectedId(f.id);\n setPage(f.page);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 8px\",\n borderRadius: 8,\n border: `1px solid ${f.id === selectedId ? primaryColor : \"#e5e7eb\"}`,\n background: f.id === selectedId ? `${primaryColor}0f` : \"#fff\",\n cursor: \"pointer\",\n }}\n >\n <input\n value={f.label}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => rename(f.id, e.target.value)}\n placeholder=\"Field name\"\n style={{\n flex: 1,\n minWidth: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontSize: 13,\n }}\n />\n <span style={{ fontSize: 11, color: \"#9ca3af\" }}>p{f.page}</span>\n <button\n type=\"button\"\n aria-label={`Remove ${f.label}`}\n onClick={(e) => {\n e.stopPropagation();\n removeField(f.id);\n }}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"#9ca3af\",\n cursor: \"pointer\",\n fontSize: 16,\n lineHeight: 1,\n padding: 0,\n }}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\n\nimport { ConsentBlock, type ConsentValue } from \"./ConsentBlock\";\nimport { PdfViewer, type ViewerPlacement } from \"./PdfViewer\";\nimport { SignaturePad } from \"./SignaturePad\";\n\nexport interface SigningBranding {\n appName?: string;\n logoUrl?: string;\n primaryColor?: string;\n}\n\nexport interface SigningExperienceProps {\n /** Token-gated source PDF URL (GET /api/esign/source/<token>). */\n sourceUrl: string;\n /** Submit endpoint (POST /sign/<token>/submit). */\n submitUrl: string;\n documentTitle: string;\n placements?: ViewerPlacement[];\n branding?: SigningBranding;\n /** Called after a successful signature submit (host navigates to /done). */\n onSigned?: () => void;\n workerSrc?: string;\n}\n\n/**\n * The full host-branded signer page body: read the PDF (placement highlighted),\n * draw/type a signature, consent, and submit. Self-contained styling so it sits\n * cleanly inside any host shell.\n */\nexport function SigningExperience(props: SigningExperienceProps) {\n const primary = props.branding?.primaryColor ?? \"#4f46e5\";\n const [signaturePng, setSignaturePng] = useState<string | null>(null);\n const [consent, setConsent] = useState<ConsentValue>({ signerName: \"\", consent: false });\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const canSubmit =\n !!signaturePng && consent.consent && consent.signerName.trim().length > 0 && !submitting;\n\n async function submit() {\n if (!canSubmit) return;\n setSubmitting(true);\n setError(null);\n try {\n const res = await fetch(props.submitUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n signaturePng,\n signerName: consent.signerName.trim(),\n consent: true,\n }),\n });\n if (!res.ok) {\n const body = (await res.json().catch(() => null)) as {\n error?: { message?: string };\n } | null;\n throw new Error(body?.error?.message ?? \"Could not submit your signature.\");\n }\n props.onSigned?.();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Something went wrong.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <div\n style={{\n maxWidth: 760,\n margin: \"0 auto\",\n padding: \"24px 16px 64px\",\n fontFamily:\n \"system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif\",\n color: \"#111827\",\n }}\n >\n <header style={{ display: \"flex\", alignItems: \"center\", gap: 12, marginBottom: 8 }}>\n {props.branding?.logoUrl ? (\n <img src={props.branding.logoUrl} alt=\"\" style={{ height: 32 }} />\n ) : null}\n {props.branding?.appName ? (\n <span style={{ fontWeight: 600, color: \"#374151\" }}>{props.branding.appName}</span>\n ) : null}\n </header>\n\n <h1 style={{ fontSize: 22, margin: \"8px 0 4px\" }}>{props.documentTitle}</h1>\n <p style={{ color: \"#6b7280\", fontSize: 14, marginTop: 0 }}>\n Review the document below, then sign — no account or login needed.\n </p>\n\n <section style={{ margin: \"16px 0\" }}>\n <PdfViewer\n url={props.sourceUrl}\n placements={props.placements}\n workerSrc={props.workerSrc}\n primaryColor={primary}\n />\n </section>\n\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <div>\n <label style={{ fontSize: 13, fontWeight: 600, color: \"#374151\" }}>Your signature</label>\n <div style={{ marginTop: 6 }}>\n <SignaturePad primaryColor={primary} onChange={setSignaturePng} />\n </div>\n </div>\n\n <ConsentBlock value={consent} onChange={setConsent} primaryColor={primary} />\n\n {error ? (\n <div\n style={{\n background: \"#fef2f2\",\n border: \"1px solid #fecaca\",\n color: \"#b91c1c\",\n borderRadius: 8,\n padding: \"10px 12px\",\n fontSize: 14,\n }}\n >\n {error}\n </div>\n ) : null}\n\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n style={{\n padding: \"14px 16px\",\n borderRadius: 10,\n border: \"none\",\n background: canSubmit ? primary : \"#c7c9d1\",\n color: \"#fff\",\n fontSize: 16,\n fontWeight: 600,\n cursor: canSubmit ? \"pointer\" : \"not-allowed\",\n }}\n >\n {submitting ? \"Signing…\" : \"Sign document\"}\n </button>\n </section>\n </div>\n );\n}\n"]}
|
package/dist/ui/index.d.cts
CHANGED
|
@@ -38,8 +38,8 @@ interface ViewerPlacement {
|
|
|
38
38
|
interface PdfViewerProps {
|
|
39
39
|
/** Token-gated source PDF URL. */
|
|
40
40
|
url: string;
|
|
41
|
-
/**
|
|
42
|
-
|
|
41
|
+
/** Signature-box hints, each drawn on its page at normalized coords. */
|
|
42
|
+
placements?: ViewerPlacement[];
|
|
43
43
|
/** Override the pdf.js worker (defaults to the unpkg .mjs for the bundled version). */
|
|
44
44
|
workerSrc?: string;
|
|
45
45
|
primaryColor?: string;
|
|
@@ -49,9 +49,11 @@ interface PdfViewerProps {
|
|
|
49
49
|
* box overlaid where the manager placed it. Falls back to an <iframe> + download
|
|
50
50
|
* link if pdf.js fails to load — so the document is always readable.
|
|
51
51
|
*/
|
|
52
|
-
declare function PdfViewer({ url,
|
|
52
|
+
declare function PdfViewer({ url, placements, workerSrc, primaryColor }: PdfViewerProps): react.JSX.Element;
|
|
53
53
|
|
|
54
54
|
interface DesignerPlacement {
|
|
55
|
+
id: string;
|
|
56
|
+
label: string;
|
|
55
57
|
page: number;
|
|
56
58
|
x: number;
|
|
57
59
|
y: number;
|
|
@@ -61,15 +63,16 @@ interface DesignerPlacement {
|
|
|
61
63
|
interface FieldDesignerProps {
|
|
62
64
|
/** The chosen PDF's bytes (read client-side before upload). */
|
|
63
65
|
pdfData: Uint8Array;
|
|
64
|
-
value: DesignerPlacement
|
|
65
|
-
onChange: (
|
|
66
|
+
value: DesignerPlacement[];
|
|
67
|
+
onChange: (fields: DesignerPlacement[]) => void;
|
|
66
68
|
workerSrc?: string;
|
|
67
69
|
primaryColor?: string;
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
72
|
+
* Place + edit one or more named signature fields on a pdf.js-rendered page.
|
|
73
|
+
* Touch + mouse (Pointer Events): drag empty space to add a field, drag a field
|
|
74
|
+
* to move, drag a corner to resize, × to remove. Fields are listed and renameable
|
|
75
|
+
* on the side (and wrap below on narrow screens). Each box shows its name.
|
|
73
76
|
*/
|
|
74
77
|
declare function FieldDesigner({ pdfData, value, onChange, workerSrc, primaryColor, }: FieldDesignerProps): react.JSX.Element;
|
|
75
78
|
|
|
@@ -84,7 +87,7 @@ interface SigningExperienceProps {
|
|
|
84
87
|
/** Submit endpoint (POST /sign/<token>/submit). */
|
|
85
88
|
submitUrl: string;
|
|
86
89
|
documentTitle: string;
|
|
87
|
-
|
|
90
|
+
placements?: ViewerPlacement[];
|
|
88
91
|
branding?: SigningBranding;
|
|
89
92
|
/** Called after a successful signature submit (host navigates to /done). */
|
|
90
93
|
onSigned?: () => void;
|
package/dist/ui/index.d.ts
CHANGED
|
@@ -38,8 +38,8 @@ interface ViewerPlacement {
|
|
|
38
38
|
interface PdfViewerProps {
|
|
39
39
|
/** Token-gated source PDF URL. */
|
|
40
40
|
url: string;
|
|
41
|
-
/**
|
|
42
|
-
|
|
41
|
+
/** Signature-box hints, each drawn on its page at normalized coords. */
|
|
42
|
+
placements?: ViewerPlacement[];
|
|
43
43
|
/** Override the pdf.js worker (defaults to the unpkg .mjs for the bundled version). */
|
|
44
44
|
workerSrc?: string;
|
|
45
45
|
primaryColor?: string;
|
|
@@ -49,9 +49,11 @@ interface PdfViewerProps {
|
|
|
49
49
|
* box overlaid where the manager placed it. Falls back to an <iframe> + download
|
|
50
50
|
* link if pdf.js fails to load — so the document is always readable.
|
|
51
51
|
*/
|
|
52
|
-
declare function PdfViewer({ url,
|
|
52
|
+
declare function PdfViewer({ url, placements, workerSrc, primaryColor }: PdfViewerProps): react.JSX.Element;
|
|
53
53
|
|
|
54
54
|
interface DesignerPlacement {
|
|
55
|
+
id: string;
|
|
56
|
+
label: string;
|
|
55
57
|
page: number;
|
|
56
58
|
x: number;
|
|
57
59
|
y: number;
|
|
@@ -61,15 +63,16 @@ interface DesignerPlacement {
|
|
|
61
63
|
interface FieldDesignerProps {
|
|
62
64
|
/** The chosen PDF's bytes (read client-side before upload). */
|
|
63
65
|
pdfData: Uint8Array;
|
|
64
|
-
value: DesignerPlacement
|
|
65
|
-
onChange: (
|
|
66
|
+
value: DesignerPlacement[];
|
|
67
|
+
onChange: (fields: DesignerPlacement[]) => void;
|
|
66
68
|
workerSrc?: string;
|
|
67
69
|
primaryColor?: string;
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
72
|
+
* Place + edit one or more named signature fields on a pdf.js-rendered page.
|
|
73
|
+
* Touch + mouse (Pointer Events): drag empty space to add a field, drag a field
|
|
74
|
+
* to move, drag a corner to resize, × to remove. Fields are listed and renameable
|
|
75
|
+
* on the side (and wrap below on narrow screens). Each box shows its name.
|
|
73
76
|
*/
|
|
74
77
|
declare function FieldDesigner({ pdfData, value, onChange, workerSrc, primaryColor, }: FieldDesignerProps): react.JSX.Element;
|
|
75
78
|
|
|
@@ -84,7 +87,7 @@ interface SigningExperienceProps {
|
|
|
84
87
|
/** Submit endpoint (POST /sign/<token>/submit). */
|
|
85
88
|
submitUrl: string;
|
|
86
89
|
documentTitle: string;
|
|
87
|
-
|
|
90
|
+
placements?: ViewerPlacement[];
|
|
88
91
|
branding?: SigningBranding;
|
|
89
92
|
/** Called after a successful signature submit (host navigates to /done). */
|
|
90
93
|
onSigned?: () => void;
|