@embedpdf/engine-services 3.0.0-next.11 → 3.0.0-next.13
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.cjs +3524 -351
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +671 -63
- package/dist/index.d.ts +671 -63
- package/dist/index.js +3514 -353
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["AbortError","FPDF_ERR_PASSWORD","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","UNKNOWN_WEAK_ANNOTATION_STATE","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","TRAPPED_TRUE","TRAPPED_FALSE","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","FPDF_NO_INCREMENTAL","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","PAGE_INSERT_BLANK_MAX_COUNT","NO_ANNOTATION_FLAGS","NULL_PTR","readLine","KEY_ROTATION","KEY_UNROTATED_RECT","DEFAULT_CARET_COLOR","NULL_PTR","EngineError","EngineErrorCode","DEFAULT_FILE_ATTACHMENT_COLOR","DEFAULT_COLOR","DEFAULT_FREETEXT_COLOR","DEFAULT_FONT_SIZE","readLinePoints","DEFAULT_REDACT_COLOR","DEFAULT_LABEL_COLOR","DEFAULT_FONT_SIZE","DEFAULT_NOTE_COLOR","DEFAULT_HIGHLIGHT_COLOR","DEFAULT_TEXT_MARKUP_COLOR","MK_BORDER_COLOR","MK_BACKGROUND_COLOR","cache","NULL_PTR","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","DEFAULT_OPACITY","DEFAULT_OPACITY","EngineError","EngineErrorCode","EngineError","EngineErrorCode","DEFAULT_OPACITY","DEFAULT_LINE_ENDINGS","EngineError","EngineErrorCode","NULL_PTR","DEFAULT_OPACITY","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","PDF_SUBTYPE_TO_CODE","EngineError","EngineErrorCode","PdfAnnotationSubtypeCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","CHANGED_WIDGETS_CAPACITY","EMPTY_META","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EMPTY_TRANSFER"],"sources":["../src/runtime/lifecycle/bootstrap.ts","../src/shared/abort.ts","../src/shared/uuid.ts","../src/shared/pdf-date.ts","../src/runtime/memory/bits.ts","../src/shared/securityPermissions.ts","../src/events/EventHub.ts","../src/document-session/lifecycle/PdfDocumentOpener.ts","../src/document-session/pages/PagePtrPool.ts","../src/document-session/revisions/RevisionAuthority.ts","../src/document-session/DocumentSession.ts","../src/document-session/lifecycle/BaseDocumentRegistry.ts","../src/runtime/memory/scratch.ts","../src/runtime/memory/strings.ts","../src/features/metadata/internal/readMetadataText.ts","../src/features/metadata/internal/readCustomMetadata.ts","../src/features/metadata/internal/readTrappedStatus.ts","../src/features/metadata/MetadataReader.ts","../src/features/metadata/internal/write/writeMetaText.ts","../src/features/metadata/internal/write/writeMetaTrapped.ts","../src/features/metadata/internal/write/applyMetadataPatch.ts","../src/features/metadata/MetadataMutator.ts","../src/runtime/memory/structs.ts","../src/features/destinations/destinationViewCodes.ts","../src/features/destinations/readDestination.ts","../src/features/actions/ActionModelReader.ts","../src/features/pages/PagesReader.ts","../src/features/pages/PagesMutator.ts","../src/features/pages/PagesExtractor.ts","../src/features/pages/PagesInserter.ts","../src/features/annotations/internal/read/annotationReadContext.ts","../src/features/annotations/internal/annotationFlagBits.ts","../src/features/annotations/internal/lineEnding.ts","../src/features/annotations/internal/read/annotationReadPrimitives.ts","../src/features/annotations/internal/read/readAnnotationTransformMetadata.ts","../src/features/annotations/internal/textEditIntent.ts","../src/features/annotations/internal/read/readCaretAnnotation.ts","../src/features/attachments/internal/attachmentPrimitives.ts","../src/features/annotations/internal/annotationIcon.ts","../src/features/annotations/internal/read/readFileAttachmentAnnotation.ts","../src/features/annotations/internal/colorType.ts","../src/features/annotations/internal/freeTextIntent.ts","../src/features/annotations/internal/standardFont.ts","../src/features/annotations/internal/textAlignment.ts","../src/features/annotations/internal/shapeBorderStyle.ts","../src/features/annotations/internal/read/readStyle.ts","../src/features/annotations/internal/read/readFreeTextAnnotation.ts","../src/features/annotations/internal/inkIntent.ts","../src/features/annotations/internal/read/readInkAnnotation.ts","../src/features/annotations/internal/read/readLineAnnotation.ts","../src/features/annotations/internal/read/readLinkAnnotation.ts","../src/features/annotations/internal/read/readRedactAnnotation.ts","../src/features/annotations/internal/read/readShapeAnnotation.ts","../src/features/annotations/internal/stampName.ts","../src/features/annotations/internal/read/readStampAnnotation.ts","../src/features/annotations/internal/annotationState.ts","../src/features/annotations/internal/read/readTextAnnotation.ts","../src/features/annotations/internal/read/readTextMarkupAnnotation.ts","../src/features/annotations/internal/read/readUnsupportedAnnotation.ts","../src/features/annotations/internal/read/readVertexAnnotation.ts","../src/features/annotations/internal/read/readWidgetAnnotation.ts","../src/features/annotations/internal/read/annotationReaderRegistry.ts","../src/features/forms/internal/formModelCache.ts","../src/features/forms/internal/readFormSnapshot.ts","../src/features/annotations/internal/read/joinWidgetField.ts","../src/features/annotations/internal/read/readAnnotationIdentity.ts","../src/features/annotations/internal/replyType.ts","../src/features/annotations/internal/read/readAnnotationRelationship.ts","../src/features/annotations/internal/read/readEmbedMetadata.ts","../src/features/annotations/internal/blendMode.ts","../src/features/annotations/internal/read/readAnnotationBase.ts","../src/features/annotations/internal/read/collectPageAnnotations.ts","../src/features/annotations/AnnotationReader.ts","../src/features/render/deviceRaster.ts","../src/features/annotations/AnnotationAppearanceReader.ts","../src/features/annotations/RawAnnotationReader.ts","../src/features/annotations/internal/write/annotationWritePrimitives.ts","../src/features/annotations/internal/write/writeAnnotationBase.ts","../src/features/annotations/internal/identity/captureOrStampStableId.ts","../src/features/annotations/internal/identity/resolveAnnotationPointer.ts","../src/features/annotations/internal/mutations/computeMutationImpact.ts","../src/features/annotations/internal/read/readAnnotationFromPtr.ts","../src/features/annotations/internal/write/writeEmbedMetadata.ts","../src/features/annotations/internal/write/writeAnnotationTransformMetadata.ts","../src/features/annotations/internal/write/writeCaretAnnotation.ts","../src/features/annotations/internal/write/writeFileAttachmentAnnotation.ts","../src/features/annotations/internal/write/writeDefaultAppearance.ts","../src/features/annotations/internal/write/writeStyle.ts","../src/features/annotations/internal/write/writeFreeTextAnnotation.ts","../src/features/annotations/internal/write/writeInkAnnotation.ts","../src/features/annotations/internal/write/writeLineAnnotation.ts","../src/features/annotations/internal/write/writeLinkAnnotation.ts","../src/features/annotations/internal/write/writeTextMarkupAnnotation.ts","../src/features/annotations/internal/write/writeRedactAnnotation.ts","../src/features/annotations/internal/write/writeShapeAnnotation.ts","../src/features/annotations/internal/write/writeStampAnnotation.ts","../src/features/annotations/internal/write/writeTextAnnotation.ts","../src/features/annotations/internal/write/writeVertexAnnotation.ts","../src/features/annotations/internal/write/writeWidgetAnnotation.ts","../src/features/annotations/internal/write/annotationWriterRegistry.ts","../src/features/annotations/internal/write/writeAnnotationRelationship.ts","../src/features/annotations/AnnotationMutator.ts","../src/features/pages/PagesFlattener.ts","../src/features/redaction/RedactionApplier.ts","../src/features/text/PageTextReader.ts","../src/features/geometry/PageGeometryReader.ts","../src/features/render/PageRenderReader.ts","../src/features/attachments/AttachmentReader.ts","../src/features/attachments/AttachmentMutator.ts","../src/features/security/internal/buildSecurityInfo.ts","../src/features/security/SecurityReader.ts","../src/features/save/internal/pdfSaveMode.ts","../src/features/save/DocumentSaver.ts","../src/features/fonts/FontRegistrar.ts","../src/features/forms/internal/resolveFieldRef.ts","../src/features/forms/FormReader.ts","../src/features/forms/internal/authorWidget.ts","../src/features/forms/internal/fieldFlagBits.ts","../src/features/forms/internal/wideStringArray.ts","../src/features/forms/FormMutator.ts","../src/features/forms/FormsEffectsApplier.ts","../src/features/search/internal/pageCorpusCache.ts","../src/features/search/internal/searchCursor.ts","../src/features/search/SearchReader.ts","../src/features/actions/DocumentActionsReader.ts","../src/features/pieceinfo/PieceInfoAccessor.ts","../src/worker-host/WorkerHost.ts"],"sourcesContent":["import type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nconst initialized = new WeakSet<PdfRuntimeModule>();\n\n/**\n * Initialize the thread-confined PDFium runtime for the calling thread. Each\n * worker thread owns its own PDFium state, so this must run on every thread\n * that uses the runtime. Safe to call multiple times.\n */\nexport function ensureInitialized(runtime: PdfRuntimeModule): void {\n if (initialized.has(runtime)) return;\n runtime.fn.EPDF_InitThread();\n initialized.add(runtime);\n}\n\n/**\n * Tear down PDFium for the calling thread. Lifecycle-strict: every PDFium\n * handle created on this thread must already be closed.\n */\nexport function destroyLibrary(runtime: PdfRuntimeModule): void {\n if (!initialized.has(runtime)) return;\n runtime.fn.EPDF_ShutdownThread();\n initialized.delete(runtime);\n}\n","import { AbortError } from '@embedpdf/engine-core/runtime';\n\n/**\n * Throw if the AbortSignal has been aborted. Service code peppers calls to\n * this between PDFium calls so cooperative cancellation works without\n * needing async/await.\n */\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n const reason = signal.reason;\n if (reason instanceof Error) throw reason;\n throw new AbortError(reason);\n }\n}\n","/**\n * Generate an RFC 4122 v4 UUID using the Web Crypto API surface that's\n * available in every realm we ship to: Node 19+ (global), Web Workers,\n * browsers (https), browsers (http/intranet/file:), and Edge runtimes.\n *\n * Why this implementation, exactly:\n * - `crypto.randomUUID()` was historically gated to *secure contexts*\n * in older browsers and we shipped that bug to production once.\n * `getRandomValues()` has no such restriction.\n * - `import { randomUUID } from 'crypto'` makes Vite externalize the\n * `crypto` module for browser builds and emit a build-time warning;\n * we then crash at runtime in the rare path that hits it.\n * - 16 bytes + RFC 4122 bit-twiddling is six lines and correct.\n *\n * Output is the canonical hex form: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`,\n * where `y` is one of `8/9/a/b` (variant nibble = 10xx).\n */\nexport function generateUuid(): string {\n const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16));\n // RFC 4122 §4.4: version nibble = 4, variant nibble = 10xx.\n bytes[6] = (bytes[6]! & 0x0f) | 0x40;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * PDF date string format conversion utilities.\n *\n * PDF stores timestamps as ASCII strings shaped like\n * `D:YYYYMMDDHHmmSSOHH'mm'`, where `O` is `+` / `-` / `Z` (Z means\n * UTC and omits the offset). See ISO 32000 §7.9.4.\n *\n * The wire format used by the engine DTOs is always ISO 8601;\n * readers convert PDF → ISO via {@link pdfDateToIso}, writers convert\n * the other way via {@link formatPdfDate}.\n */\n\n/**\n * Parse a PDF date string `D:YYYYMMDDHHmmSSOHH'mm'` to an ISO 8601\n * string. Returns null if the input is malformed.\n *\n * When the timezone is omitted, PDF defines the relationship to UTC as\n * unknown. Since the engine DTO wire format requires an absolute ISO 8601\n * timestamp, this converter retains the pre-existing fallback of treating\n * an omitted timezone as UTC.\n */\nexport function pdfDateToIso(pdf: string): string | null {\n const match =\n /^D:(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(?:(Z)|([+-])(\\d{2})'(\\d{2})')?$/.exec(pdf);\n if (!match) return null;\n\n const [, yText, moText, dText, HText, MText, SText, , sign, tzHText, tzMText] = match;\n const y = Number(yText);\n const mo = Number(moText) - 1;\n const d = Number(dText);\n const H = Number(HText);\n const M = Number(MText);\n const S = Number(SText);\n\n // Construct the local wall-clock fields in UTC space. setUTCFullYear is\n // intentional: Date.UTC maps years 0-99 to 1900-1999.\n const wallClock = new Date(0);\n wallClock.setUTCFullYear(y, mo, d);\n wallClock.setUTCHours(H, M, S, 0);\n\n // JavaScript normalizes invalid fields (for example February 31), so\n // compare them after construction rather than accepting the rollover.\n if (\n wallClock.getUTCFullYear() !== y ||\n wallClock.getUTCMonth() !== mo ||\n wallClock.getUTCDate() !== d ||\n wallClock.getUTCHours() !== H ||\n wallClock.getUTCMinutes() !== M ||\n wallClock.getUTCSeconds() !== S\n ) {\n return null;\n }\n\n let offsetMinutes = 0;\n if (sign) {\n const tzH = Number(tzHText);\n const tzM = Number(tzMText);\n if (tzH > 23 || tzM > 59) return null;\n\n offsetMinutes = (tzH * 60 + tzM) * (sign === '+' ? 1 : -1);\n }\n\n return new Date(wallClock.getTime() - offsetMinutes * 60_000).toISOString();\n}\n\n/**\n * Format a JS Date as a PDF date string `D:YYYYMMDDHHmmSSOHH'mm'`.\n *\n * Emits the offset in PDF's funny `OHH'mm'` form, where the apostrophe\n * after the hour is literal and the offset always carries a sign. UTC\n * is emitted as `+00'00'` (not `Z`) for maximum reader compatibility —\n * the `Z` shorthand is allowed by the spec but not universally\n * supported.\n *\n * Always uses the supplied Date's local fields and offset. For\n * server-side stamps callers typically pass `new Date()` (default).\n */\nexport function formatPdfDate(d: Date = new Date()): string {\n if (Number.isNaN(d.getTime())) throw new RangeError('Cannot format an invalid Date');\n\n const pad = (n: number, w = 2) => String(n).padStart(w, '0');\n const year = d.getFullYear();\n if (year < 0 || year > 9999) throw new RangeError('PDF dates require a four-digit year');\n\n const tzMinutes = -d.getTimezoneOffset();\n const sign = tzMinutes >= 0 ? '+' : '-';\n const tzH = pad(Math.floor(Math.abs(tzMinutes) / 60));\n const tzM = pad(Math.abs(tzMinutes) % 60);\n return (\n `D:${pad(year, 4)}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +\n `${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}` +\n `${sign}${tzH}'${tzM}'`\n );\n}\n","/**\n * Coerce a value to an unsigned 32-bit integer. PDFium permission words\n * arrive as signed JS numbers (the high bit makes them negative); reading\n * them as `u32` restores the bit pattern the PDF spec describes.\n */\nexport function u32(value: number): number {\n return value >>> 0;\n}\n","import { u32 } from '../runtime/memory/bits';\n\n/**\n * PDF Standard security handlers reserve bits 1-2 as 0, and PDFium masks\n * even owner permissions through that convention — so \"all permissions\"\n * for an encrypted document is `0xFFFFFFFC`, not `0xFFFFFFFF`.\n */\nexport const ALL_STANDARD_SECURITY_PERMISSIONS = 0xfffffffc;\n\n/** Coerce PDFium's signed permission word to its unsigned 32-bit value. */\nexport const normalizeU32 = u32;\n\n/** True when `bits` grants every standard security permission. */\nexport function hasAllStandardSecurityPermissions(bits: number): boolean {\n return (\n (u32(bits) & ALL_STANDARD_SECURITY_PERMISSIONS) >>> 0 === ALL_STANDARD_SECURITY_PERMISSIONS\n );\n}\n","import type {\n DocumentEvent,\n DocumentEventInit,\n DocumentEventStream,\n} from '@embedpdf/engine-core/runtime';\n\n/**\n * The in-process implementation of `DocumentEventStream`, shared by both\n * engine shells (one hub per open `DocumentHandle`). The engine that\n * performs a mutation publishes here at confirmation time; the cloud\n * engine's remote channel will also publish here for OTHER sessions'\n * mutations — listeners never learn which transport delivered an event.\n *\n * Delivery contract:\n * - synchronous fan-out in subscription order;\n * - error isolation: a throwing listener is re-thrown on a microtask\n * (so it surfaces to the host's unhandled-error reporting) without\n * blocking other listeners or failing the mutation path;\n * - `lastServerId` tracks the highest remote cursor seen, for the\n * remote channel's reconnect/backfill.\n */\nexport class EventHub implements DocumentEventStream {\n private readonly listeners = new Set<(event: DocumentEvent) => void>();\n private serverId: number | null = null;\n\n constructor(\n /** Where a throwing listener's error goes. Defaults to an async\n * rethrow so it reaches the host's unhandled-error reporting. */\n private readonly onListenerError: (err: unknown) => void = (err) => {\n queueMicrotask(() => {\n throw err;\n });\n },\n ) {}\n\n subscribe(listener: (event: DocumentEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n publish(event: DocumentEvent): void {\n // Transport notices (`stream.desynced`) carry no origin; only mutation\n // events advance the server cursor.\n if ('origin' in event) {\n const { serverId } = event.origin;\n if (serverId !== null) {\n this.serverId = this.serverId === null ? serverId : Math.max(this.serverId, serverId);\n }\n }\n // Snapshot so a listener that (un)subscribes mid-fan-out cannot skew\n // delivery for this event.\n for (const listener of [...this.listeners]) {\n try {\n listener(event);\n } catch (err) {\n this.onListenerError(err);\n }\n }\n }\n\n lastServerId(): number | null {\n return this.serverId;\n }\n\n /** Drop every listener (handle close). Idempotent. */\n clear(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * Stamps provenance onto events a mutation path produces. One per open\n * handle: the engine shell constructs it with the instance's `sessionId`\n * (and, on cloud, the authenticated `sub` when known) and hands it to the\n * mutation services — they publish results, never build origins.\n */\nexport class SessionEventPublisher {\n constructor(\n private readonly hub: EventHub,\n private readonly sessionId: string,\n private readonly sub: string | null = null,\n ) {}\n\n /** Publish a mutation THIS engine instance just confirmed. */\n publishLocal(event: DocumentEventInit): void {\n this.hub.publish({\n ...event,\n origin: {\n kind: 'local',\n sessionId: this.sessionId,\n sub: this.sub,\n ts: Date.now(),\n serverId: null,\n },\n } as DocumentEvent);\n }\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFileAccessHandle, PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\nexport type OpenedPdfDocumentKind = 'fat-memory' | 'layer';\n\nconst FPDF_ERR_PASSWORD = 4;\n\nexport interface OpenedPdfDocument {\n readonly kind: OpenedPdfDocumentKind;\n readonly docPtr: Ptr;\n close(): void;\n}\n\nexport interface AcquiredBaseDocument {\n readonly key: string;\n readonly basePtr: Ptr;\n release(): void;\n}\n\nexport type LayerSource =\n | { readonly kind: 'fresh' }\n | { readonly kind: 'raw-delta'; readonly bytes: Uint8Array | ArrayBuffer }\n | { readonly kind: 'artifact'; readonly bytes: Uint8Array | ArrayBuffer }\n | { readonly kind: 'artifact-file'; readonly path: string };\n\nexport class CloseStack {\n private readonly actions: Array<() => void> = [];\n private closed = false;\n\n push(action: () => void): void {\n if (this.closed) {\n action();\n return;\n }\n this.actions.push(action);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n let firstError: unknown = null;\n for (let i = this.actions.length - 1; i >= 0; i--) {\n try {\n this.actions[i]?.();\n } catch (error) {\n firstError ??= error;\n }\n }\n this.actions.length = 0;\n if (firstError) throw firstError;\n }\n}\n\nexport function openFatMemoryDocument(\n runtime: PdfRuntimeModule,\n bytes: Uint8Array,\n password: string | null = null,\n): OpenedPdfDocument {\n const { mem, fn } = runtime;\n const stack = new CloseStack();\n const dataPtr = mem.alloc(bytes.byteLength);\n stack.push(() => mem.free(dataPtr));\n\n try {\n mem.writeBytes(dataPtr, bytes);\n const docPtr = fn.FPDF_LoadMemDocument64(dataPtr, bytes.byteLength, password ?? '');\n if (!docPtr) {\n // Distinguish \"locked\" from \"broken\": a password failure is a\n // recoverable state the caller can act on (prompt + unlock), never\n // a generic open failure.\n if (fn.FPDF_GetLastError() === FPDF_ERR_PASSWORD) {\n throw password\n ? new EngineError(EngineErrorCode.DocPasswordIncorrect, 'incorrect document password')\n : new EngineError(EngineErrorCode.DocPasswordRequired, 'document requires a password');\n }\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to open document');\n }\n setRuntimeOwnerPermissionsIfEncrypted(runtime, docPtr);\n stack.push(() => fn.FPDF_CloseDocument(docPtr));\n return { kind: 'fat-memory', docPtr, close: () => stack.close() };\n } catch (error) {\n stack.close();\n throw error;\n }\n}\n\nexport function openLayerDocument(\n runtime: PdfRuntimeModule,\n base: AcquiredBaseDocument,\n layer: LayerSource = { kind: 'fresh' },\n password: string | null = null,\n): OpenedPdfDocument {\n const { mem, fn } = runtime;\n const stack = new CloseStack();\n stack.push(() => base.release());\n\n let layerAccess: PdfFileAccessHandle | null = null;\n const statusPtr = mem.alloc(4);\n try {\n mem.poke(statusPtr, 'i32', -1);\n let docPtr: Ptr;\n if (layer.kind === 'fresh') {\n docPtr = fn.EPDFLayer_OpenLayer(base.basePtr, NULL_PTR, password ?? '', statusPtr);\n } else {\n layerAccess =\n layer.kind === 'artifact-file'\n ? runtime.fileAccess.fromNodeFile(layer.path)\n : runtime.fileAccess.fromMemory(layer.bytes);\n stack.push(() => layerAccess?.close());\n docPtr =\n layer.kind === 'artifact' || layer.kind === 'artifact-file'\n ? fn.EPDFLayer_OpenLayerArtifact(base.basePtr, layerAccess.ptr, password ?? '', statusPtr)\n : fn.EPDFLayer_OpenLayer(base.basePtr, layerAccess.ptr, password ?? '', statusPtr);\n }\n\n const status = Number(mem.peek(statusPtr, 'i32'));\n if (!docPtr || status !== 0) {\n throw layerOpenError(status);\n }\n\n setRuntimeOwnerPermissionsIfEncrypted(runtime, docPtr);\n stack.push(() => fn.FPDF_CloseDocument(docPtr));\n return { kind: 'layer', docPtr, close: () => stack.close() };\n } catch (error) {\n stack.close();\n throw error;\n } finally {\n mem.free(statusPtr);\n }\n}\n\nexport function setRuntimeOwnerPermissionsIfEncrypted(\n runtime: PdfRuntimeModule,\n docPtr: Ptr,\n): void {\n const { fn } = runtime;\n if (fn.EPDF_IsEncrypted && fn.EPDF_SetRuntimeOwnerPermissions && fn.EPDF_IsEncrypted(docPtr)) {\n fn.EPDF_SetRuntimeOwnerPermissions(docPtr, true);\n }\n}\n\nfunction layerOpenError(status: number): EngineError {\n switch (status) {\n case 1:\n return new EngineError(EngineErrorCode.DocPasswordRequired, 'layer requires a password');\n case 2:\n return new EngineError(EngineErrorCode.MalformedPdf, 'layer delta is malformed');\n case 3:\n return new EngineError(\n EngineErrorCode.MalformedPdf,\n 'layer artifact does not match the supplied base document',\n );\n default:\n return new EngineError(EngineErrorCode.DocOpenFailed, 'failed to open layer document');\n }\n}\n","import type { PageObjectNumber } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * Manages pagePtr lifetime for a single open `DocumentSession`.\n *\n * `acquire(pon)` returns a loaded pagePtr for the given PDF object number,\n * loading it via `EPDFDoc_LoadPageByObjectNumberNormalized` (rotation forced\n * to 0deg so render/text/geometry/annotation coordinates all share one\n * normalized space) if not already in the pool. `release(pon)` decrements the\n * refcount and closes when it reaches\n * zero; `closeAll()` is called by `DocumentSession.close()`.\n *\n * While at least one holder is active the pagePtr is shared (refcounted),\n * so overlapping `acquire(pon)` calls for the same page reuse a single\n * load. Once the refcount reaches zero the page is closed; a later\n * `acquire` reloads it — there is no LRU retention across the zero-ref\n * boundary. A future slice could add that without changing callers.\n */\nexport class PagePtrPool {\n private readonly counts = new Map<PageObjectNumber, { ptr: Ptr; refs: number }>();\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly docPtr: Ptr,\n ) {}\n\n acquire(pageObjectNumber: PageObjectNumber): Ptr {\n const { fn } = this.runtime;\n const existing = this.counts.get(pageObjectNumber);\n if (existing) {\n existing.refs++;\n return existing.ptr;\n }\n const ptr = fn.EPDFDoc_LoadPageByObjectNumberNormalized(this.docPtr, pageObjectNumber);\n if (!ptr) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber}`,\n );\n }\n this.counts.set(pageObjectNumber, { ptr, refs: 1 });\n return ptr;\n }\n\n /**\n * True while at least one holder has the page open. Page-STRUCTURE\n * mutations (delete) assert on this: thread confinement means no other\n * job can be mid-flight, so a held pagePtr during a structural mutation\n * is a leaked `acquire` (an internal bug) — the mutator fails loudly\n * instead of mutating under a live handle.\n */\n isHeld(pageObjectNumber: PageObjectNumber): boolean {\n return this.counts.has(pageObjectNumber);\n }\n\n release(pageObjectNumber: PageObjectNumber): void {\n const entry = this.counts.get(pageObjectNumber);\n if (!entry) return;\n entry.refs--;\n if (entry.refs <= 0) {\n this.runtime.fn.FPDF_ClosePage(entry.ptr);\n this.counts.delete(pageObjectNumber);\n }\n }\n\n closeAll(): void {\n const { fn } = this.runtime;\n for (const { ptr } of this.counts.values()) {\n fn.FPDF_ClosePage(ptr);\n }\n this.counts.clear();\n }\n}\n","import type {\n PageObjectNumber,\n RevisionToken,\n WeakAnnotationState,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n UNKNOWN_WEAK_ANNOTATION_STATE,\n revisionTokensEqual,\n} from '@embedpdf/engine-core/runtime';\n\nexport interface RevisionAuthority {\n readonly docSessionId: string;\n token(pageObjectNumber: PageObjectNumber): RevisionToken;\n bump(pageObjectNumber: PageObjectNumber): RevisionToken;\n validate(token: RevisionToken): void;\n weakAnnotationState(pageObjectNumber: PageObjectNumber): WeakAnnotationState;\n recordWeakAnnotationState(pageObjectNumber: PageObjectNumber, state: WeakAnnotationState): void;\n /** Forget a page entirely (generation + weak state). Called when the page\n * is DELETED — its object number is retired, never recycled, so dropping\n * is hygiene, not correctness. */\n drop(pageObjectNumber: PageObjectNumber): void;\n clear(): void;\n}\n\n/**\n * Per-page generation counter. Backs `RevisionToken` so weak\n * `AnnotationRef.kind === 'index'` references can be validated against the\n * exact page state they were minted from.\n *\n * `bump()` is the only mutator; mutation services call it after a\n * structural change to the page (annotation create/delete/reorder).\n * Read paths never mutate the store.\n */\nexport class LocalRevisionAuthority implements RevisionAuthority {\n private readonly generations = new Map<PageObjectNumber, number>();\n private readonly weakAnnotationStates = new Map<PageObjectNumber, WeakAnnotationState>();\n\n constructor(public readonly docSessionId: string) {}\n\n /** Returns the current generation, defaulting to 0 for first read. */\n current(pageObjectNumber: PageObjectNumber): number {\n return this.generations.get(pageObjectNumber) ?? 0;\n }\n\n /** Mints a fresh `RevisionToken` for the page's current generation. */\n token(pageObjectNumber: PageObjectNumber): RevisionToken {\n return {\n docSessionId: this.docSessionId,\n pageObjectNumber,\n generation: this.current(pageObjectNumber),\n };\n }\n\n /**\n * Increments the generation counter for a page. Returns the new token.\n * Called by mutation services after every structural change.\n */\n bump(pageObjectNumber: PageObjectNumber): RevisionToken {\n const next = this.current(pageObjectNumber) + 1;\n this.generations.set(pageObjectNumber, next);\n return this.token(pageObjectNumber);\n }\n\n /**\n * Strict equality check. Throws `EngineError(InvalidReference)` when the\n * caller's token does not match what the store currently holds.\n */\n validate(token: RevisionToken): void {\n if (token.docSessionId !== this.docSessionId) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n 'revision token belongs to a different document session',\n { details: { token } },\n );\n }\n const current = this.token(token.pageObjectNumber);\n if (!revisionTokensEqual(current, token)) {\n throw new EngineError(EngineErrorCode.InvalidReference, 'revision token is stale', {\n details: { provided: token, current },\n });\n }\n }\n\n weakAnnotationState(pageObjectNumber: PageObjectNumber): WeakAnnotationState {\n return this.weakAnnotationStates.get(pageObjectNumber) ?? UNKNOWN_WEAK_ANNOTATION_STATE;\n }\n\n recordWeakAnnotationState(pageObjectNumber: PageObjectNumber, state: WeakAnnotationState): void {\n this.weakAnnotationStates.set(pageObjectNumber, state);\n }\n\n drop(pageObjectNumber: PageObjectNumber): void {\n this.generations.delete(pageObjectNumber);\n this.weakAnnotationStates.delete(pageObjectNumber);\n }\n\n clear(): void {\n this.generations.clear();\n this.weakAnnotationStates.clear();\n }\n}\n","import type {\n PageObjectNumber,\n PageState,\n RevisionToken,\n WeakAnnotationState,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n knownWeakAnnotationState,\n isValidPageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n openFatMemoryDocument,\n type OpenedPdfDocument,\n type OpenedPdfDocumentKind,\n} from './lifecycle/PdfDocumentOpener';\nimport { PagePtrPool } from './pages/PagePtrPool';\nimport type { PageRecord } from './pages/PageRecord';\nimport { LocalRevisionAuthority, type RevisionAuthority } from './revisions/RevisionAuthority';\n\n/**\n * Owns the lifecycle of a single open PDFium document and the v3\n * identity machinery: page registry (pageObjectNumber <-> pageIndex),\n * `RevisionAuthority` (per-page generation counters), and `PagePtrPool`\n * (refcounted pagePtr access).\n *\n * Both the local browser Worker and the server worker_thread instantiate\n * this exactly the same way; the only thing that differs is the\n * underlying PdfRuntimeModule (WASM vs native).\n */\nexport class DocumentSession {\n private docPtr: Ptr | null = null;\n private closeDocument: (() => void) | null = null;\n private _kind: OpenedPdfDocumentKind | null = null;\n private readonly _sessionId: string;\n\n /** pon -> record */\n private readonly recordsByObjectNumber = new Map<PageObjectNumber, PageRecord>();\n /** pageIndex -> record */\n private readonly recordsByIndex = new Map<number, PageRecord>();\n private fullyEnumerated = false;\n\n private revisions: RevisionAuthority | null = null;\n private mutationSeqCounter = 0;\n private pages: PagePtrPool | null = null;\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n sessionId?: string,\n ) {\n this._sessionId = sessionId ?? generateSessionId();\n }\n\n get sessionId(): string {\n return this._sessionId;\n }\n\n get kind(): OpenedPdfDocumentKind | null {\n return this._kind;\n }\n\n isOpen(): boolean {\n return this.docPtr !== null;\n }\n\n open(bytes: Uint8Array, password: string | null = null): void {\n this.openFromHandle(openFatMemoryDocument(this.runtime, bytes, password));\n }\n\n openFromHandle(handle: OpenedPdfDocument): void {\n if (this.docPtr) {\n handle.close();\n throw new EngineError(EngineErrorCode.InvalidArg, 'document already open');\n }\n this.docPtr = handle.docPtr;\n this.closeDocument = () => handle.close();\n this._kind = handle.kind;\n this.revisions = new LocalRevisionAuthority(this._sessionId);\n this.pages = new PagePtrPool(this.runtime, handle.docPtr);\n this.parkedBytes = null;\n }\n\n /**\n * Park this session in the password-locked state: the document could not\n * be loaded because a (correct) password is missing, so the session keeps\n * the already-transferred bytes and waits for an unlock attempt to load\n * them. A locked session occupies its docId key like an open one — every\n * operation except the password check rejects with DocPasswordRequired.\n */\n parkLocked(bytes: Uint8Array): void {\n if (this.docPtr) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'document already open');\n }\n this.parkedBytes = bytes;\n }\n\n isLocked(): boolean {\n return this.docPtr === null && this.parkedBytes !== null;\n }\n\n /** The bytes retained for a later unlock attempt. Locked sessions only. */\n lockedBytes(): Uint8Array {\n if (!this.parkedBytes) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document session is not locked');\n }\n return this.parkedBytes;\n }\n\n private parkedBytes: Uint8Array | null = null;\n\n /** Number of pages in the document. */\n pageCount(): number {\n return this.runtime.fn.FPDF_GetPageCount(this.requireDocPtr());\n }\n\n /**\n * Lazily enumerate every page and cache (pageObjectNumber, pageIndex).\n * Necessary before `listRawAll()` and any pon -> pageIndex resolution.\n */\n ensureFullPageRegistry(): void {\n if (this.fullyEnumerated) return;\n const { fn } = this.runtime;\n const docPtr = this.requireDocPtr();\n const count = fn.FPDF_GetPageCount(docPtr);\n for (let i = 0; i < count; i++) {\n if (this.recordsByIndex.has(i)) continue;\n const pon = fn.EPDFDoc_GetPageObjectNumberByIndex(docPtr, i);\n if (!isValidPageObjectNumber(pon)) {\n // Spec violation: ISO 32000-1 §7.7.3.3 requires every\n // /Page to be referenced indirectly from the /Pages tree.\n // PDFium's loader is permissive enough to surface direct\n // page dicts from broken generators, but the engine's\n // identity model requires a real indirect object number,\n // so we refuse the document here with a clear, actionable\n // error rather than silently routing through a weak\n // identity path.\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n `page at index ${i} is a direct (non-indirect) PDF object; the engine requires every page to have a stable indirect object number`,\n { details: { pageIndex: i, pon } },\n );\n }\n const record: PageRecord = { pageObjectNumber: pon, pageIndex: i };\n this.recordsByIndex.set(i, record);\n this.recordsByObjectNumber.set(pon, record);\n }\n this.fullyEnumerated = true;\n }\n\n /** Lookup; populates the cache for one page only on cache miss. */\n recordByObjectNumber(pageObjectNumber: PageObjectNumber): PageRecord {\n const cached = this.recordsByObjectNumber.get(pageObjectNumber);\n if (cached) return cached;\n\n // Probe the doc by loading the page directly via its object number;\n // walk the index range to find which page index it lives at.\n const { fn } = this.runtime;\n const docPtr = this.requireDocPtr();\n const probePtr = fn.EPDFDoc_LoadPageByObjectNumber(docPtr, pageObjectNumber);\n if (!probePtr) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber}`,\n );\n }\n fn.FPDF_ClosePage(probePtr);\n\n // Now we know the page exists; fall back to a full enumeration to get\n // its display index. This is O(pageCount) once per session.\n this.ensureFullPageRegistry();\n const found = this.recordsByObjectNumber.get(pageObjectNumber);\n if (!found) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `page with object number ${pageObjectNumber} present but unindexable`,\n );\n }\n return found;\n }\n\n /** All page records, in display order. Forces full enumeration. */\n allRecords(): PageRecord[] {\n this.ensureFullPageRegistry();\n return Array.from(this.recordsByIndex.entries())\n .sort(([a], [b]) => a - b)\n .map(([, r]) => r);\n }\n\n /**\n * Drop the cached `pageIndex <-> pageObjectNumber` mapping and force a\n * fresh enumeration on next access. Called by `PagesMutator`\n * after `FPDF_MovePages` shuffles page positions; we keep\n * weak-annotation knowledge and per-page revision counters intact, both of\n * which are keyed by durable `pageObjectNumber` and survive a page reorder.\n */\n refreshPageRegistry(): void {\n this.recordsByIndex.clear();\n this.recordsByObjectNumber.clear();\n this.fullyEnumerated = false;\n this.ensureFullPageRegistry();\n }\n\n /** Per-page liveness envelope used by annotation read/mutation results. */\n pageState(pageObjectNumber: PageObjectNumber): PageState {\n // Validate the page exists (throws NotFound for bad pons); liveness is\n // keyed by pon and carries no display order — that lives in PageLayout.\n this.recordByObjectNumber(pageObjectNumber);\n const weakAnnotationState = this.requireRevisions().weakAnnotationState(pageObjectNumber);\n return {\n pageObjectNumber,\n revision: this.requireRevisions().token(pageObjectNumber),\n weakAnnotationState,\n };\n }\n\n /** Set by readers as they discover whether a page has weak annotations. */\n recordWeakFlag(pageObjectNumber: PageObjectNumber, hasWeak: boolean): void {\n this.recordWeakAnnotationState(pageObjectNumber, knownWeakAnnotationState(hasWeak));\n }\n\n recordWeakAnnotationState(pageObjectNumber: PageObjectNumber, state: WeakAnnotationState): void {\n this.requireRevisions().recordWeakAnnotationState(pageObjectNumber, state);\n }\n\n weakAnnotationState(pageObjectNumber: PageObjectNumber): WeakAnnotationState {\n return this.requireRevisions().weakAnnotationState(pageObjectNumber);\n }\n\n /** Bump and return the new revision token; called by mutation paths. */\n bumpRevision(pageObjectNumber: PageObjectNumber): RevisionToken {\n return this.requireRevisions().bump(pageObjectNumber);\n }\n\n /**\n * Monotonic count of successful document mutations in this session.\n * Version key for detached-snapshot caches (e.g. the forms model):\n * a cache entry built at sequence N is exactly valid while the\n * sequence is still N. Coarse on purpose — widgets are annotations\n * and page ops move widgets, so ANY mutation may affect derived\n * form state; per-domain counters are a later optimization.\n */\n mutationSeq(): number {\n return this.mutationSeqCounter;\n }\n\n /** Record one successful mutation; called by mutation paths. */\n noteMutation(): void {\n this.mutationSeqCounter++;\n }\n\n /**\n * Forget a page's per-session state (revision generation + weak-annotation\n * flag). Called by `pages.delete` after the page object is retired; the\n * PON is never recycled, so this is hygiene, not correctness.\n */\n dropPageState(pageObjectNumber: PageObjectNumber): void {\n this.requireRevisions().drop(pageObjectNumber);\n }\n\n validateRevision(token: RevisionToken): void {\n this.requireRevisions().validate(token);\n }\n\n pagePool(): PagePtrPool {\n if (!this.pages) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document is not open');\n }\n return this.pages;\n }\n\n requireDocPtr(): Ptr {\n if (!this.docPtr) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document is not open');\n }\n return this.docPtr;\n }\n\n /**\n * Park a disposer to run when THIS session closes. Used by operations\n * whose native side leaves the session document referencing another\n * resource — e.g. `pages.insert`: `FPDF_ImportPagesByIndex` does not\n * fully detach imported objects from their source document, so the\n * source doc + its byte buffer must stay alive until the destination\n * can no longer be saved (i.e. until this session closes).\n */\n retainUntilClose(dispose: () => void): void {\n this.retained.push(dispose);\n }\n\n private readonly retained: Array<() => void> = [];\n\n close(): void {\n let firstError: unknown = null;\n try {\n this.pages?.closeAll();\n } catch (error) {\n firstError = error;\n } finally {\n this.pages = null;\n }\n\n try {\n this.closeDocument?.();\n } catch (error) {\n firstError ??= error;\n } finally {\n this.closeDocument = null;\n this.docPtr = null;\n this._kind = null;\n this.parkedBytes = null;\n this.revisions?.clear();\n this.revisions = null;\n this.recordsByIndex.clear();\n this.recordsByObjectNumber.clear();\n this.fullyEnumerated = false;\n }\n\n // Retained resources go LAST (reverse order): the session doc that\n // referenced them is closed above, so they are safe to release now.\n for (let i = this.retained.length - 1; i >= 0; i--) {\n try {\n this.retained[i]();\n } catch (error) {\n firstError ??= error;\n }\n }\n this.retained.length = 0;\n\n if (firstError) throw firstError;\n }\n\n private requireRevisions(): RevisionAuthority {\n if (!this.revisions) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document is not open');\n }\n return this.revisions;\n }\n}\n\n// Monotonic per-realm counter: the docSessionId exists only for the local\n// bleed-over check (a revision token minted by one session must not validate\n// against another), so uniqueness is the whole requirement — a counter makes\n// collisions structurally impossible within a realm, and the timestamp\n// distinguishes ids across realm restarts. Deliberately not random: there is\n// no adversary to hide the id from (anyone in-process can call the engine\n// directly), and pulling in crypto would add runtime constraints for nothing.\nlet sessionCounter = 0;\n\nfunction generateSessionId(): string {\n return `sess_${(++sessionCounter).toString(36)}_${Date.now().toString(36)}`;\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFileAccessHandle, PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AcquiredBaseDocument } from './PdfDocumentOpener';\nimport { CloseStack, setRuntimeOwnerPermissionsIfEncrypted } from './PdfDocumentOpener';\n\ninterface BaseEntry {\n key: string;\n basePtr: Ptr;\n refs: number;\n close: () => void;\n}\n\nexport class BaseDocumentRegistry {\n private readonly entries = new Map<string, BaseEntry>();\n\n constructor(private readonly runtime: PdfRuntimeModule) {}\n\n acquireMemoryBase(opts: {\n key: string;\n bytes: Uint8Array;\n password?: string | null;\n }): AcquiredBaseDocument {\n const existing = this.retain(opts.key);\n if (existing) return existing;\n\n const { mem, fn } = this.runtime;\n const stack = new CloseStack();\n const dataPtr = mem.alloc(opts.bytes.byteLength);\n stack.push(() => mem.free(dataPtr));\n\n try {\n mem.writeBytes(dataPtr, opts.bytes);\n const basePtr = fn.EPDF_LoadMemBaseDocument64(\n dataPtr,\n opts.bytes.byteLength,\n opts.password ?? '',\n );\n if (!basePtr) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to open base document');\n }\n setRuntimeOwnerPermissionsIfEncrypted(this.runtime, basePtr);\n stack.push(() => fn.EPDF_ReleaseBaseDocument(basePtr));\n return this.insert(opts.key, basePtr, () => stack.close());\n } catch (error) {\n stack.close();\n throw error;\n }\n }\n\n acquireFileBase(opts: {\n key: string;\n path: string;\n password?: string | null;\n }): AcquiredBaseDocument {\n const existing = this.retain(opts.key);\n if (existing) return existing;\n\n const { fn } = this.runtime;\n const stack = new CloseStack();\n let access: PdfFileAccessHandle | null = null;\n\n try {\n access = this.runtime.fileAccess.fromNodeFile(opts.path);\n stack.push(() => access?.close());\n const basePtr = fn.EPDF_LoadBaseDocument(access.ptr, opts.password ?? '');\n if (!basePtr) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to open base document');\n }\n setRuntimeOwnerPermissionsIfEncrypted(this.runtime, basePtr);\n stack.push(() => fn.EPDF_ReleaseBaseDocument(basePtr));\n return this.insert(opts.key, basePtr, () => stack.close());\n } catch (error) {\n stack.close();\n throw error;\n }\n }\n\n releaseAll(): void {\n const entries = Array.from(this.entries.values());\n this.entries.clear();\n let firstError: unknown = null;\n for (const entry of entries) {\n try {\n entry.close();\n } catch (error) {\n firstError ??= error;\n }\n }\n if (firstError) throw firstError;\n }\n\n /** @internal Test-only probe of the per-key share refcount. */\n getRefCountForTesting(key: string): number {\n return this.entries.get(key)?.refs ?? 0;\n }\n\n private retain(key: string): AcquiredBaseDocument | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n entry.refs++;\n return this.handleFor(entry);\n }\n\n private insert(key: string, basePtr: Ptr, close: () => void): AcquiredBaseDocument {\n const entry: BaseEntry = { key, basePtr, refs: 1, close };\n this.entries.set(key, entry);\n return this.handleFor(entry);\n }\n\n private handleFor(entry: BaseEntry): AcquiredBaseDocument {\n let released = false;\n return {\n key: entry.key,\n basePtr: entry.basePtr,\n release: () => {\n if (released) return;\n released = true;\n const live = this.entries.get(entry.key);\n if (!live) return;\n live.refs--;\n if (live.refs > 0) return;\n this.entries.delete(entry.key);\n live.close();\n },\n };\n }\n}\n","import type { PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * Allocate a scratch buffer, run `body` with it, and always free it.\n *\n * Every PDFium out-parameter call follows the same shape: malloc a\n * buffer, hand its pointer to the native function, read the result back,\n * free the buffer. Hand-rolling that `try/finally` at each call site is\n * how leaks and copy-paste bugs creep in, so it lives here once.\n */\nexport function withScratch<T>(mem: PdfRuntimeMemory, bytes: number, body: (ptr: Ptr) => T): T {\n const ptr = mem.alloc(bytes);\n try {\n return body(ptr);\n } finally {\n mem.free(ptr);\n }\n}\n\n/**\n * Like {@link withScratch} but for native calls that take several\n * out-parameters at once (e.g. `FPDFAnnot_GetColor` with one pointer per\n * channel). Buffers are freed in reverse allocation order.\n */\nexport function withScratchN<T>(\n mem: PdfRuntimeMemory,\n sizes: ReadonlyArray<number>,\n body: (ptrs: Ptr[]) => T,\n): T {\n const ptrs = sizes.map((size) => mem.alloc(size));\n try {\n return body(ptrs);\n } finally {\n for (let i = ptrs.length - 1; i >= 0; i--) {\n mem.free(ptrs[i]);\n }\n }\n}\n","import type { PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from './scratch';\n\n/**\n * Read a PDFium UTF-16LE string getter that uses the standard\n * (probe length, allocate, read) ABI. `call(buf, capacity)` must invoke\n * the native function and return the length in BYTES including the\n * trailing NUL (the value PDFium reports when `capacity` is 0).\n *\n * `emptyAs` decides what a present-but-empty value (`len === 2`, a lone\n * UTF-16 NUL) decodes to. This is the one knob different callers actually\n * disagree on: document Info strings treat `''` as a real value, whereas\n * a page label of `''` is indistinguishable from \"absent\" and reads as\n * `null`. Making it a parameter keeps that decision explicit instead of\n * forking the buffer dance.\n *\n * Returns `null` when the value is absent (`len <= 0`).\n */\nexport function readUtf16String(\n mem: PdfRuntimeMemory,\n call: (buf: Ptr, capacity: number) => number,\n emptyAs: '' | null = '',\n): string | null {\n const len = call(NULL_PTR, 0);\n if (len <= 0) return null; // absent\n if (len === 2) return emptyAs; // lone UTF-16 NUL\n return withScratch(mem, len, (buf) => {\n const written = call(buf, len);\n if (written <= 0) return null;\n return mem.readU16String(buf);\n });\n}\n\n/**\n * UTF-8 sibling of {@link readUtf16String} for the handful of native\n * getters that return UTF-8 (e.g. `EPDF_GetMetaKeyName`). UTF-8 has no\n * fixed empty-NUL width to special-case, so an empty value decodes to\n * `''`; absent (`len <= 0`) is `null`.\n */\nexport function readUtf8String(\n mem: PdfRuntimeMemory,\n call: (buf: Ptr, capacity: number) => number,\n): string | null {\n const len = call(NULL_PTR, 0);\n if (len <= 0) return null;\n return withScratch(mem, len, (buf) => {\n const written = call(buf, len);\n if (written <= 0) return null;\n return mem.readU8String(buf);\n });\n}\n\n/**\n * Write side of the UTF-16 convention: encode `value` into a scratch\n * buffer, hand the pointer to `set`, and always free it. `set` returns\n * the native call's success flag, which is propagated.\n */\nexport function writeUtf16String(\n mem: PdfRuntimeMemory,\n value: string,\n set: (ptr: Ptr) => boolean,\n): boolean {\n const ptr = mem.writeU16String(value);\n try {\n return set(ptr);\n } finally {\n mem.free(ptr);\n }\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readUtf16String } from '../../../runtime/memory/strings';\n\n/**\n * Read a key from the document's Info dictionary. Returns null if the key\n * does not exist, '' if it exists but is empty, otherwise the UTF-16 string.\n *\n * `EPDF_HasMetaText` distinguishes an absent key (null) from a present\n * empty one (''); the value itself uses the standard UTF-16 getter ABI\n * (see `readUtf16String`, which keeps `''` as a real value here).\n */\nexport function readMetaText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n key: string,\n): string | null {\n if (!fn.EPDF_HasMetaText(docPtr, key)) return null;\n return readUtf16String(\n mem,\n (buf, capacity) => fn.FPDF_GetMetaText(docPtr, key, buf, capacity),\n '',\n );\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readMetaText } from './readMetadataText';\nimport { readUtf8String } from '../../../runtime/memory/strings';\n\n/**\n * Read the name of one key in the document's Info dictionary.\n * customOnly = true returns only non-reserved (custom) keys, matching the\n * behavior of `getMetaKeyName` in the legacy engine. Key names come back\n * as UTF-8.\n */\nfunction readMetaKeyName(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n customOnly: boolean,\n): string | null {\n return readUtf8String(mem, (buf, capacity) =>\n fn.EPDF_GetMetaKeyName(docPtr, index, customOnly, buf, capacity),\n );\n}\n\n/**\n * Read all custom metadata key/value pairs from the document's Info\n * dictionary. The wire format guarantees `string` values, so absent keys\n * are dropped (rather than represented as null).\n *\n * Mirrors the legacy `readAllMeta` (engine.ts:4698) but tightens the type\n * to Record<string, string> for the wire format.\n */\nexport function readAllCustomMeta(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n): Record<string, string> {\n const count = Number(fn.EPDF_GetMetaKeyCount(docPtr, true)) | 0;\n const out: Record<string, string> = {};\n for (let i = 0; i < count; i++) {\n const key = readMetaKeyName(fn, mem, docPtr, i, true);\n if (!key) continue;\n const value = readMetaText(fn, mem, docPtr, key);\n if (value == null) continue;\n out[key] = value;\n }\n return out;\n}\n","import type { DocumentMetadataTrapped } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, Ptr } from '@embedpdf/engine-runtime';\n\n// PDFium /Trapped values:\n// 0 = NotSet, 1 = True, 2 = False, 3 = Unknown.\n// The v3 wire DTO has only true/false/unknown, so NotSet folds into 'unknown'.\nconst TRAPPED_TRUE = 1;\nconst TRAPPED_FALSE = 2;\n\nexport function readTrapped(fn: PdfFunctions, docPtr: Ptr): DocumentMetadataTrapped {\n const raw = Number(fn.EPDF_GetMetaTrapped(docPtr));\n if (raw === TRAPPED_TRUE) return 'true';\n if (raw === TRAPPED_FALSE) return 'false';\n return 'unknown';\n}\n","import type { DocumentMetadata } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { readAllCustomMeta } from './internal/readCustomMetadata';\nimport { readMetaText } from './internal/readMetadataText';\nimport { readTrapped } from './internal/readTrappedStatus';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { pdfDateToIso } from '../../shared/pdf-date';\n\n/**\n * Synchronous, runtime-agnostic implementation of the metadata read.\n *\n * Lives in @embedpdf/engine-services so it can be reused unchanged by:\n * - @embedpdf/engine (inside a browser Worker, WASM runtime)\n * - @cloudpdf/server (inside a Node worker_thread, native runtime)\n *\n * Async-ness lives at the worker boundary, not here.\n */\nexport class MetadataReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(signal: AbortSignal): DocumentMetadata {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const doc = this.session.requireDocPtr();\n\n const title = readMetaText(fn, mem, doc, 'Title');\n throwIfAborted(signal);\n const author = readMetaText(fn, mem, doc, 'Author');\n throwIfAborted(signal);\n const subject = readMetaText(fn, mem, doc, 'Subject');\n throwIfAborted(signal);\n const keywords = readMetaText(fn, mem, doc, 'Keywords');\n throwIfAborted(signal);\n const producer = readMetaText(fn, mem, doc, 'Producer');\n throwIfAborted(signal);\n const creator = readMetaText(fn, mem, doc, 'Creator');\n throwIfAborted(signal);\n const creationRaw = readMetaText(fn, mem, doc, 'CreationDate');\n throwIfAborted(signal);\n const modRaw = readMetaText(fn, mem, doc, 'ModDate');\n throwIfAborted(signal);\n const trapped = readTrapped(fn, doc);\n throwIfAborted(signal);\n const custom = readAllCustomMeta(fn, mem, doc);\n\n return {\n title,\n author,\n subject,\n keywords,\n producer,\n creator,\n created: creationRaw ? pdfDateToIso(creationRaw) : null,\n modified: modRaw ? pdfDateToIso(modRaw) : null,\n trapped,\n custom,\n };\n }\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\nimport { writeUtf16String } from '../../../../runtime/memory/strings';\n\n/**\n * Write (or clear) one key in the document's Info dictionary.\n *\n * value = null -> remove the key (pass NULL_PTR; the fork's\n * `EPDF_SetMetaText` deletes the entry on a null value)\n * value = \"...\" -> set the key to the UTF-16 string (an empty string is\n * a real, present-but-empty value, matching the reader's\n * `emptyAs = ''` decode)\n *\n * Returns the native success flag. Mirrors v2 `setMetaText` (engine.ts),\n * minus v2's \"empty string removes\" quirk — three-state patch semantics\n * keep `null` (clear) and `''` (set empty) distinct.\n */\nexport function writeMetaText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n key: string,\n value: string | null,\n): boolean {\n if (value === null) {\n return fn.EPDF_SetMetaText(docPtr, key, NULL_PTR);\n }\n return writeUtf16String(mem, value, (ptr) => fn.EPDF_SetMetaText(docPtr, key, ptr));\n}\n","import type { DocumentMetadataTrapped } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, Ptr } from '@embedpdf/engine-runtime';\n\n// PDFium /Trapped values mirror `readTrappedStatus`:\n// 0 = NotSet, 1 = True, 2 = False, 3 = Unknown.\nconst TRAPPED_TRUE = 1;\nconst TRAPPED_FALSE = 2;\nconst TRAPPED_UNKNOWN = 3;\n\n/**\n * Set the document's /Trapped Info entry from the wire enum. The v3 DTO\n * only carries `true | false | unknown`, so there is no \"clear\" form here\n * (unlike v2, which folded null into NotSet/removal); omit `trapped` from\n * the patch to leave it untouched.\n */\nexport function writeMetaTrapped(\n fn: PdfFunctions,\n docPtr: Ptr,\n status: DocumentMetadataTrapped,\n): boolean {\n const code =\n status === 'true' ? TRAPPED_TRUE : status === 'false' ? TRAPPED_FALSE : TRAPPED_UNKNOWN;\n return fn.EPDF_SetMetaTrapped(docPtr, code);\n}\n","import { EngineError, EngineErrorCode, type MetadataPatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { writeMetaText } from './writeMetaText';\nimport { writeMetaTrapped } from './writeMetaTrapped';\nimport { formatPdfDate } from '../../../../shared/pdf-date';\n\n/**\n * Standard Info-dict keys the patch maps to explicitly. Custom keys may\n * not collide with these (a custom write to `Title` would shadow the\n * structured field), so they are skipped with the date keys and /Trapped.\n */\nconst RESERVED_INFO_KEYS = new Set([\n 'Title',\n 'Author',\n 'Subject',\n 'Keywords',\n 'Producer',\n 'Creator',\n 'CreationDate',\n 'ModDate',\n 'Trapped',\n]);\n\n/**\n * Standard string field -> PDF Info key. Date fields and /Trapped are\n * handled separately because they need format conversion / a dedicated\n * native setter.\n */\nconst STRING_FIELDS: ReadonlyArray<[keyof MetadataPatch, string]> = [\n ['title', 'Title'],\n ['author', 'Author'],\n ['subject', 'Subject'],\n ['keywords', 'Keywords'],\n ['producer', 'Producer'],\n ['creator', 'Creator'],\n];\n\n/**\n * A custom key must be writable as a PDF Name and must not shadow a\n * reserved standard key. Mirrors v2 `isValidCustomKey` (helper.ts):\n * non-empty ASCII printable, <= 127 chars, no leading slash.\n */\nfunction isValidCustomKey(key: string): boolean {\n if (!key || key.length > 127) return false;\n if (RESERVED_INFO_KEYS.has(key)) return false;\n if (key[0] === '/') return false;\n for (let i = 0; i < key.length; i++) {\n const c = key.charCodeAt(i);\n if (c < 0x20 || c > 0x7e) return false;\n }\n return true;\n}\n\n/**\n * Apply a three-state {@link MetadataPatch} to the document's Info dict\n * in place. `undefined` leaves a field, `null` clears it, a value sets\n * it (dates are formatted to PDF date syntax). Custom keys are set/cleared\n * per-key; reserved or malformed keys are skipped.\n *\n * Throws {@link EngineError} `Unknown` if any native write fails, so the\n * caller never reports a partially-applied edit as success.\n */\nexport function applyMetadataPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n patch: MetadataPatch,\n): void {\n const fail = (what: string): never => {\n throw new EngineError(EngineErrorCode.Unknown, `failed to write metadata ${what}`);\n };\n\n for (const [field, key] of STRING_FIELDS) {\n const value = patch[field] as string | null | undefined;\n if (value === undefined) continue;\n if (!writeMetaText(fn, mem, docPtr, key, value)) fail(key);\n }\n\n if (patch.created !== undefined) {\n const value = patch.created === null ? null : formatPdfDate(new Date(patch.created));\n if (!writeMetaText(fn, mem, docPtr, 'CreationDate', value)) fail('CreationDate');\n }\n if (patch.modified !== undefined) {\n const value = patch.modified === null ? null : formatPdfDate(new Date(patch.modified));\n if (!writeMetaText(fn, mem, docPtr, 'ModDate', value)) fail('ModDate');\n }\n\n if (patch.trapped !== undefined) {\n if (!writeMetaTrapped(fn, docPtr, patch.trapped)) fail('Trapped');\n }\n\n if (patch.custom !== undefined) {\n for (const [key, value] of Object.entries(patch.custom)) {\n if (!isValidCustomKey(key)) continue;\n if (!writeMetaText(fn, mem, docPtr, key, value)) fail(key);\n }\n }\n}\n","import type { MetadataPatch, MetadataUpdateResult } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { applyMetadataPatch } from './internal/write/applyMetadataPatch';\nimport { MetadataReader } from './MetadataReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Synchronous orchestrator for document metadata writes. Lives next to\n * `MetadataReader` (one orchestrator per feature) so both worker hosts\n * (browser Web Worker and Node `worker_thread`) share the same code path.\n *\n * A metadata write rewrites the document Info dictionary in place. Like\n * `PagesMutator.move`, it is a structural layer edit: it returns the\n * re-read metadata and a `null` cache (the worker never fills cloud\n * coherence pins — the server does, after persisting the artifact and\n * bumping `metadataVersion`).\n */\nexport class MetadataMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n update(patch: MetadataPatch, signal: AbortSignal): MetadataUpdateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n applyMetadataPatch(fn, mem, docPtr, patch);\n throwIfAborted(signal);\n\n // Re-read the canonical metadata off the mutated session via the\n // shared reader (identical output local + cloud). `cache` is null —\n // local engines have no manifest/CDN.\n const metadata = new MetadataReader(this.runtime, this.session).read(signal);\n return { metadata, cache: null };\n }\n}\n","import type { PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\n/** `FS_RECTF { float left, top, right, bottom }` → 16 bytes. */\nexport const RECTF_BYTES = 16;\n/** `FS_SIZEF { float width, height }` → 8 bytes. */\nexport const SIZEF_BYTES = 8;\n/** A single 32-bit float (e.g. a user-unit out-parameter). */\nexport const F32_BYTES = 4;\n/** A single 32-bit int (e.g. a color channel out-parameter). */\nexport const I32_BYTES = 4;\n/** `FS_QUADPOINTSF` — 8 floats → 32 bytes. */\nexport const QUADPOINTSF_BYTES = 32;\n/** `FS_POINTF { float x, y }` → 8 bytes. */\nexport const POINTF_BYTES = 8;\n\n/** Generated from `EPDF_CHAR_GEOMETRY`; pinned by native static_asserts. */\nexport const EPDF_CHAR_GEOMETRY_LAYOUT = {\n bytes: 124,\n offsets: {\n looseBox: 0,\n tightBox: 16,\n looseQuad: 32,\n tightQuad: 64,\n matrix: 96,\n flags: 120,\n },\n flags: {\n hasTightBox: 1 << 0,\n hasLooseQuad: 1 << 1,\n hasTightQuad: 1 << 2,\n upright: 1 << 3,\n space: 1 << 4,\n empty: 1 << 5,\n synthesized: 1 << 6,\n },\n} as const;\n\nexport interface RectF {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport interface SizeF {\n width: number;\n height: number;\n}\n\n/** Decode an `FS_RECTF` struct that a native call wrote into `ptr`. */\nexport function readRectF(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset = 0): RectF {\n return {\n left: readF32(mem, ptr, byteOffset),\n top: readF32(mem, ptr, byteOffset + 4),\n right: readF32(mem, ptr, byteOffset + 8),\n bottom: readF32(mem, ptr, byteOffset + 12),\n };\n}\n\n/** Decode an `FS_SIZEF` struct that a native call wrote into `ptr`. */\nexport function readSizeF(mem: PdfRuntimeMemory, ptr: Ptr): SizeF {\n return {\n width: readF32(mem, ptr, 0),\n height: readF32(mem, ptr, 4),\n };\n}\n\n/** Read a single 32-bit float at `byteOffset` within `ptr`. */\nexport function readF32(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset = 0): number {\n return Number(mem.peek(ptr, 'f32', byteOffset));\n}\n\n/** Read a single 32-bit int at `byteOffset` within `ptr`. */\nexport function readI32(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset = 0): number {\n return Number(mem.peek(ptr, 'i32', byteOffset));\n}\n","import type { PdfDestination } from '@embedpdf/engine-core/runtime';\n\n/**\n * `PDFDEST_VIEW_*` fit-type codes (public/fpdf_doc.h) — the shared\n * vocabulary of `FPDFDest_GetView` (read) and `EPDFDest_CreateView`\n * (write). XYZ is listed for completeness but never goes through\n * CreateView (it has its own null-aware constructor).\n */\nexport const DEST_VIEW = {\n unknown: 0,\n xyz: 1,\n fit: 2,\n fitH: 3,\n fitV: 4,\n fitR: 5,\n fitB: 6,\n fitBH: 7,\n fitBV: 8,\n} as const;\n\ntype NonXyzKind = Exclude<PdfDestination['kind'], 'xyz'>;\n\n/** Wire destination kind → PDFDEST_VIEW code, for the non-XYZ kinds. */\nexport const VIEW_CODE_BY_KIND: Record<NonXyzKind, number> = {\n fit: DEST_VIEW.fit,\n fitH: DEST_VIEW.fitH,\n fitV: DEST_VIEW.fitV,\n fitR: DEST_VIEW.fitR,\n fitB: DEST_VIEW.fitB,\n fitBH: DEST_VIEW.fitBH,\n fitBV: DEST_VIEW.fitBV,\n};\n","import type { PdfDestination } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { F32_BYTES, I32_BYTES, readF32, readI32 } from '../../runtime/memory/structs';\nimport { DEST_VIEW } from './destinationViewCodes';\n\nconst MAX_VIEW_PARAMS = 4; // /FitR carries the most: left, bottom, right, top\n\n/**\n * Materialise one explicit `PdfDestination` from a live `destPtr`. PDFium\n * already resolved named destinations before handing us the pointer, so\n * only explicit arrays arrive here (the rule `PdfDestination` documents).\n *\n * Returns `null` when the destination is unreadable: no visible indirect page\n * in the document, or an unknown fit type. Coordinates stay raw PDF user\n * space — no conversion at this layer.\n *\n * Shared by the link reader, `goto` action-node payloads, and the document\n * `openDestination`; the outline/bookmark port reuses it too.\n */\nexport function readDestination(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n destPtr: Ptr,\n): PdfDestination | null {\n const pageObjectNumber = fn.EPDFDest_GetPageObjectNumber(docPtr, destPtr);\n if (pageObjectNumber === 0) return null;\n\n const view = withScratchN(\n mem,\n [I32_BYTES, MAX_VIEW_PARAMS * F32_BYTES],\n ([countPtr, paramsPtr]) => {\n const code = fn.FPDFDest_GetView(destPtr, countPtr, paramsPtr);\n const count = Math.min(readI32(mem, countPtr), MAX_VIEW_PARAMS);\n const params: number[] = [];\n for (let i = 0; i < count; i++) params.push(readF32(mem, paramsPtr, i * F32_BYTES));\n return { code, params };\n },\n );\n const at = (i: number): number | null => (i < view.params.length ? view.params[i]! : null);\n\n switch (view.code) {\n case DEST_VIEW.xyz:\n return { kind: 'xyz', pageObjectNumber, ...readXyzLocation(fn, mem, destPtr) };\n case DEST_VIEW.fit:\n return { kind: 'fit', pageObjectNumber };\n case DEST_VIEW.fitH:\n return { kind: 'fitH', pageObjectNumber, top: at(0) };\n case DEST_VIEW.fitV:\n return { kind: 'fitV', pageObjectNumber, left: at(0) };\n case DEST_VIEW.fitR: {\n // /FitR is only meaningful with the full rect; a malformed one\n // degrades to the whole page rather than inventing coordinates.\n if (view.params.length < 4) return { kind: 'fit', pageObjectNumber };\n return {\n kind: 'fitR',\n pageObjectNumber,\n left: view.params[0]!,\n bottom: view.params[1]!,\n right: view.params[2]!,\n top: view.params[3]!,\n };\n }\n case DEST_VIEW.fitB:\n return { kind: 'fitB', pageObjectNumber };\n case DEST_VIEW.fitBH:\n return { kind: 'fitBH', pageObjectNumber, top: at(0) };\n case DEST_VIEW.fitBV:\n return { kind: 'fitBV', pageObjectNumber, left: at(0) };\n default:\n return null;\n }\n}\n\n/** `/XYZ` null-aware axes via `FPDFDest_GetLocationInPage` (FPDF_BOOL is 4 bytes). */\nfunction readXyzLocation(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n destPtr: Ptr,\n): { left: number | null; top: number | null; zoom: number | null } {\n return withScratchN(\n mem,\n [I32_BYTES, I32_BYTES, I32_BYTES, F32_BYTES, F32_BYTES, F32_BYTES],\n ([hasLeft, hasTop, hasZoom, left, top, zoom]) => {\n if (!fn.FPDFDest_GetLocationInPage(destPtr, hasLeft, hasTop, hasZoom, left, top, zoom)) {\n // Unreadable location: every axis \"retains current\" — still a valid /XYZ.\n return { left: null, top: null, zoom: null };\n }\n return {\n left: readI32(mem, hasLeft) ? readF32(mem, left) : null,\n top: readI32(mem, hasTop) ? readF32(mem, top) : null,\n zoom: readI32(mem, hasZoom) ? readF32(mem, zoom) : null,\n };\n },\n );\n}\n","import type {\n ActionReadBudget,\n PdfActionNode,\n PdfActionTargetRef,\n PdfActionTree,\n PdfActionType,\n PdfActionWarning,\n} from '@embedpdf/engine-core/runtime';\nimport {\n decodeSubmitFormFlags,\n EngineError,\n EngineErrorCode,\n} from '@embedpdf/engine-core/runtime';\nimport {\n NULL_PTR,\n type PdfFunctions,\n type PdfRuntimeMemory,\n type Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport { readUtf8String, readUtf16String } from '../../runtime/memory/strings';\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { I32_BYTES, readI32 } from '../../runtime/memory/structs';\nimport { readDestination } from '../destinations/readDestination';\n\nconst DEFAULT_ACTION_READ_BUDGET: ActionReadBudget = {\n maxModels: 512,\n maxNodes: 16_384,\n maxScriptCodeUnits: 16_000_000,\n maxTargetEntries: 4_096,\n maxPayloadCodeUnits: 262_144,\n};\n\nconst ACTION_TYPE_BY_CODE: Record<number, PdfActionType> = {\n 0: 'unknown',\n 1: 'goto',\n 2: 'goto-remote',\n 3: 'goto-embedded',\n 4: 'launch',\n 5: 'thread',\n 6: 'uri',\n 7: 'sound',\n 8: 'movie',\n 9: 'hide',\n 10: 'named',\n 11: 'submit-form',\n 12: 'reset-form',\n 13: 'import-data',\n 14: 'javascript',\n 15: 'set-ocg-state',\n 16: 'rendition',\n 17: 'transition',\n 18: 'goto-3d-view',\n};\n\nconst WARNING_CYCLE_DROPPED = 0x1;\nconst WARNING_MALFORMED_NEXT = 0x2;\nconst WARNING_INCOMPLETE = 0x4;\nconst INVALID_NODE_U32 = 0xffff_ffff;\n\n/** `EPDF_ANNOT_ACTION_ACTIVATE` — the `/A` slot of the per-annotation event\n * table (the same table `readAnnotationBase` walks). */\nexport const ANNOT_ACTION_ACTIVATE = 0;\n\n/** Decode one `EPDF_ACTION_TYPE_*` code — the shared vocabulary consumers\n * use so action-shaped surfaces cannot drift. */\nexport function actionTypeFromCode(code: number): PdfActionType {\n return ACTION_TYPE_BY_CODE[code] ?? 'unknown';\n}\n\n/** Is this `EPDFAction_GetRootNode`/`GetNextAt` result a real node id?\n * (`EPDF_ACTION_NODE_INVALID` may surface as -1 or u32 max via cwrap.) */\nexport function isValidActionNodeId(raw: number): boolean {\n return raw !== -1 && raw >>> 0 !== INVALID_NODE_U32;\n}\n\n/** Mutable aggregate budget shared by every action model in one read job.\n * Payload budgets are RESERVED before the backing buffer is allocated. */\nexport class ActionReadBudgetTracker {\n private models = 0;\n private nodes = 0;\n private scriptCodeUnits = 0;\n private targetEntries = 0;\n private payloadCodeUnits = 0;\n\n constructor(private readonly limits: ActionReadBudget = DEFAULT_ACTION_READ_BUDGET) {}\n\n addModel(nodeCount: number): void {\n this.models += 1;\n this.nodes += nodeCount;\n this.assertWithinBudget();\n }\n\n addScript(script: string): void {\n this.scriptCodeUnits += script.length;\n this.assertWithinBudget();\n }\n\n /** Charge target entries BEFORE the target array is walked. */\n reserveTargets(count: number): void {\n this.targetEntries += count;\n this.assertWithinBudget();\n }\n\n /** Charge payload text BEFORE the scratch buffer for it is allocated. */\n reservePayloadBytes(length: number): void {\n this.payloadCodeUnits += length;\n this.assertWithinBudget();\n }\n\n private assertWithinBudget(): void {\n if (\n this.models > this.limits.maxModels ||\n this.nodes > this.limits.maxNodes ||\n this.scriptCodeUnits > this.limits.maxScriptCodeUnits ||\n this.targetEntries > this.limits.maxTargetEntries ||\n this.payloadCodeUnits > this.limits.maxPayloadCodeUnits\n ) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'aggregate PDF action read budget exceeded',\n {\n details: {\n models: this.models,\n nodes: this.nodes,\n scriptCodeUnits: this.scriptCodeUnits,\n targetEntries: this.targetEntries,\n payloadCodeUnits: this.payloadCodeUnits,\n limits: this.limits,\n },\n },\n );\n }\n }\n}\n\n/**\n * Convert and close one detached native action model. This is the only\n * native-model walker used by document, page, field, and annotation reads.\n *\n * `docPtr` resolves `goto` destinations (page identity + named-destination\n * lookup); every caller reads within an open document session.\n *\n * Payload rule: a node whose payload cannot be materialised (a goto without\n * a resolvable destination, a javascript node with no `/JS`, a withheld\n * target list) degrades to `{ type: 'unknown' }` with its original `/S` on\n * `subtype`, and the tree gains the `'payload-dropped'` warning — impossible\n * states stay unrepresentable while malformed documents stay readable.\n */\nexport function readActionModel(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n modelPtr: Ptr,\n budget: ActionReadBudgetTracker,\n): PdfActionTree | null {\n if (modelPtr === NULL_PTR) return null;\n try {\n const nodeCount = fn.EPDFAction_GetNodeCount(modelPtr);\n if (!Number.isInteger(nodeCount) || nodeCount < 0) {\n throw malformedActionModel('invalid node count', { nodeCount });\n }\n budget.addModel(nodeCount);\n\n const warningFlags = fn.EPDFAction_GetWarningFlags(modelPtr) >>> 0;\n const incomplete = !fn.EPDFAction_IsComplete(modelPtr);\n const rootId = normalizeOptionalNodeId(fn.EPDFAction_GetRootNode(modelPtr), nodeCount);\n const visiting = new Set<number>();\n let payloadDropped = false;\n\n /** Probe the two-call length first and charge the budget BEFORE the\n * scratch buffer for the value is allocated. */\n const readPayloadString = (call: (buf: Ptr, capacity: number) => number): string | null => {\n const length = call(NULL_PTR, 0);\n if (length <= 0) return null;\n budget.reservePayloadBytes(length);\n return readUtf8String(mem, call);\n };\n\n const readOutBool = (read: (outPtr: Ptr) => boolean | number): boolean | null =>\n withScratchN(mem, [I32_BYTES], ([outPtr]) =>\n read(outPtr) ? readI32(mem, outPtr) !== 0 : null,\n );\n\n const readTargetObjectNumber = (nodeId: number, index: number): number | null =>\n withScratchN(mem, [I32_BYTES], ([outPtr]) => {\n if (!fn.EPDFAction_GetNodeTargetObjectNumber(modelPtr, nodeId, index, outPtr)) {\n return null;\n }\n const value = readI32(mem, outPtr) >>> 0;\n return value === 0 ? null : value;\n });\n\n const readTargets = (nodeId: number, count: number): PdfActionTargetRef[] | null => {\n const targets: PdfActionTargetRef[] = [];\n for (let index = 0; index < count; index++) {\n const name = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeTargetName(modelPtr, nodeId, index, buf, capacity),\n );\n if (name !== null) {\n targets.push({ kind: 'name', name });\n continue;\n }\n const objectNumber = readTargetObjectNumber(nodeId, index);\n if (objectNumber === null) return null; // neither form: unreadable list\n targets.push({ kind: 'objectNumber', objectNumber });\n }\n return targets;\n };\n\n const readResetFormState = (\n nodeId: number,\n ): { hasFields: boolean; exclude: boolean } | null =>\n withScratchN(mem, [I32_BYTES, I32_BYTES], ([hasFieldsPtr, excludePtr]) => {\n if (!fn.EPDFAction_GetNodeResetForm(modelPtr, nodeId, hasFieldsPtr, excludePtr)) {\n return null;\n }\n return {\n hasFields: readI32(mem, hasFieldsPtr) !== 0,\n exclude: readI32(mem, excludePtr) !== 0,\n };\n });\n\n const readSubmitFormState = (nodeId: number): { hasFields: boolean; flags: number } | null =>\n withScratchN(mem, [I32_BYTES, I32_BYTES], ([hasFieldsPtr, flagsPtr]) => {\n if (!fn.EPDFAction_GetNodeSubmitForm(modelPtr, nodeId, hasFieldsPtr, flagsPtr)) {\n return null;\n }\n return {\n hasFields: readI32(mem, hasFieldsPtr) !== 0,\n flags: readI32(mem, flagsPtr) >>> 0,\n };\n });\n\n const readNode = (nodeId: number): PdfActionNode => {\n if (visiting.has(nodeId)) {\n throw malformedActionModel('native action model contains a cycle', { nodeId });\n }\n visiting.add(nodeId);\n try {\n const type = actionTypeFromCode(fn.EPDFAction_GetNodeType(modelPtr, nodeId));\n const subtype =\n readUtf8String(mem, (buf, capacity) =>\n fn.EPDFAction_GetNodeSubtype(modelPtr, nodeId, buf, capacity),\n ) ?? '';\n\n const nextCount = fn.EPDFAction_GetNextCount(modelPtr, nodeId);\n if (!Number.isInteger(nextCount) || nextCount < 0) {\n throw malformedActionModel('invalid action child count', { nodeId, nextCount });\n }\n const next: PdfActionNode[] = [];\n for (let index = 0; index < nextCount; index++) {\n const childId = normalizeNodeId(\n fn.EPDFAction_GetNextAt(modelPtr, nodeId, index),\n nodeCount,\n );\n next.push(readNode(childId));\n }\n\n const degraded = (): PdfActionNode => {\n payloadDropped = true;\n return { type: 'unknown', subtype, next };\n };\n\n switch (type) {\n case 'javascript': {\n if (!fn.EPDFAction_NodeHasJavaScript(modelPtr, nodeId)) return degraded();\n const script =\n readUtf16String(mem, (buf, capacity) =>\n fn.EPDFAction_GetNodeJavaScript(modelPtr, nodeId, buf, capacity),\n ) ?? '';\n budget.addScript(script);\n return { type, subtype, script, next };\n }\n case 'rendition': {\n if (!fn.EPDFAction_NodeHasJavaScript(modelPtr, nodeId)) {\n return { type, subtype, next };\n }\n const script =\n readUtf16String(mem, (buf, capacity) =>\n fn.EPDFAction_GetNodeJavaScript(modelPtr, nodeId, buf, capacity),\n ) ?? '';\n budget.addScript(script);\n return { type, subtype, script, next };\n }\n case 'goto': {\n const destPtr = fn.EPDFAction_GetNodeDest(docPtr, modelPtr, nodeId);\n const destination =\n destPtr !== NULL_PTR ? readDestination(fn, mem, docPtr, destPtr) : null;\n return destination ? { type, subtype, destination, next } : degraded();\n }\n case 'uri': {\n const uri = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeURI(docPtr, modelPtr, nodeId, buf, capacity),\n );\n if (uri === null) return degraded();\n const isMap =\n readOutBool((outPtr) => fn.EPDFAction_GetNodeURIIsMap(modelPtr, nodeId, outPtr)) ??\n false;\n return { type, subtype, uri, isMap, next };\n }\n case 'named': {\n const name = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeName(modelPtr, nodeId, buf, capacity),\n );\n return name === null ? degraded() : { type, subtype, name, next };\n }\n case 'hide': {\n const count = fn.EPDFAction_GetNodeTargetCount(modelPtr, nodeId);\n if (!Number.isInteger(count) || count < 0) return degraded();\n budget.reserveTargets(count);\n const targets = readTargets(nodeId, count);\n if (targets === null) return degraded();\n const hide =\n readOutBool((outPtr) => fn.EPDFAction_GetNodeHideFlag(modelPtr, nodeId, outPtr)) ??\n true;\n return { type, subtype, targets, hide, next };\n }\n case 'reset-form': {\n const state = readResetFormState(nodeId);\n const count = fn.EPDFAction_GetNodeTargetCount(modelPtr, nodeId);\n if (state === null || !Number.isInteger(count) || count < 0) return degraded();\n budget.reserveTargets(count);\n const fields = state.hasFields ? readTargets(nodeId, count) : null;\n if (state.hasFields && fields === null) return degraded();\n return { type, subtype, fields, exclude: state.exclude, next };\n }\n case 'submit-form': {\n // Feature-detect: an older runtime payload (pin lag) exposes no\n // submit getters — the node stays payload-less recognized-inert,\n // the pre-payload behavior, NOT a degraded unknown.\n if (typeof fn.EPDFAction_GetNodeSubmitForm !== 'function') {\n return { type, subtype, next };\n }\n const state = readSubmitFormState(nodeId);\n // The getter refuses when the REQUIRED /F did not resolve to a\n // URL: the native side withheld the payload — the atomic rule\n // degrades the whole node, never a half payload.\n if (state === null) return degraded();\n const url = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeSubmitFormURL(modelPtr, nodeId, buf, capacity),\n );\n if (url === null) return degraded();\n const count = fn.EPDFAction_GetNodeTargetCount(modelPtr, nodeId);\n if (!Number.isInteger(count) || count < 0) return degraded();\n budget.reserveTargets(count);\n const fields = state.hasFields ? readTargets(nodeId, count) : null;\n if (state.hasFields && fields === null) return degraded();\n const charSet = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeSubmitFormCharSet(modelPtr, nodeId, buf, capacity),\n );\n return {\n type,\n subtype,\n payload: {\n url,\n fields,\n flags: decodeSubmitFormFlags(state.flags),\n ...(charSet === null ? {} : { charSet }),\n },\n next,\n };\n }\n case 'goto-remote':\n case 'goto-embedded':\n case 'launch': {\n const filePath = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeFilePath(modelPtr, nodeId, buf, capacity),\n );\n return filePath === null ? degraded() : { type, subtype, filePath, next };\n }\n default:\n return { type, subtype, next };\n }\n } finally {\n visiting.delete(nodeId);\n }\n };\n\n const root = rootId === null ? null : readNode(rootId);\n const warnings = warningsFromFlags(warningFlags, incomplete);\n if (payloadDropped) warnings.push('payload-dropped');\n return { root, incomplete, warningFlags, warnings };\n } finally {\n fn.EPDFAction_CloseModel(modelPtr);\n }\n}\n\nfunction normalizeOptionalNodeId(raw: number, nodeCount: number): number | null {\n const invalid = raw === -1 || raw === INVALID_NODE_U32 || raw >>> 0 === INVALID_NODE_U32;\n return invalid ? null : normalizeNodeId(raw, nodeCount);\n}\n\nfunction normalizeNodeId(raw: number, nodeCount: number): number {\n if (!Number.isInteger(raw) || raw < 0 || raw >= nodeCount) {\n throw malformedActionModel('native action model returned an invalid node id', {\n raw,\n nodeCount,\n });\n }\n return raw;\n}\n\nfunction warningsFromFlags(flags: number, incomplete: boolean): PdfActionWarning[] {\n const warnings: PdfActionWarning[] = [];\n if ((flags & WARNING_CYCLE_DROPPED) !== 0) warnings.push('cycle-dropped');\n if ((flags & WARNING_MALFORMED_NEXT) !== 0) warnings.push('malformed-next');\n if ((flags & WARNING_INCOMPLETE) !== 0 || incomplete) warnings.push('incomplete');\n return warnings;\n}\n\nfunction malformedActionModel(message: string, details: Record<string, unknown>): EngineError {\n return new EngineError(EngineErrorCode.MalformedPdf, message, { details });\n}\n","import type {\n PageBoxes,\n PageLayout,\n PageListSnapshot,\n PdfRect,\n PdfPageActions,\n} from '@embedpdf/engine-core/runtime';\nimport { normalizePdfRect } from '@embedpdf/engine-core/runtime';\nimport type {\n PdfFunctions,\n PdfRuntimeMemory,\n PdfRuntimeModule,\n Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { readUtf16String } from '../../runtime/memory/strings';\nimport {\n F32_BYTES,\n RECTF_BYTES,\n SIZEF_BYTES,\n readF32,\n readRectF,\n readSizeF,\n} from '../../runtime/memory/structs';\nimport { throwIfAborted } from '../../shared/abort';\nimport { ActionReadBudgetTracker, readActionModel } from '../actions/ActionModelReader';\n\n// EPDF_PAGE_BOX_TYPE (public/fpdfview.h).\nconst BOX_MEDIA = 0;\nconst BOX_CROP = 1;\nconst BOX_BLEED = 2;\nconst BOX_TRIM = 3;\nconst BOX_ART = 4;\n\n/**\n * Runtime-agnostic page geometry reader. Produces the `pages.list()`\n * snapshot from the lightweight `...ByIndex` PDFium bindings, none of which\n * load or parse a page (no `pagePtr`), so listing stays cheap. Shared\n * verbatim by the local WASM worker and the server native worker, so a\n * given PDF yields an identical `PageListSnapshot` on both engines.\n */\nexport class PagesReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(signal: AbortSignal): PageListSnapshot {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const records = this.session.allRecords();\n const actionBudget = new ActionReadBudgetTracker();\n\n // One scratch buffer per struct kind, reused across every page.\n return withScratchN(\n mem,\n [RECTF_BYTES, SIZEF_BYTES, F32_BYTES],\n ([rectPtr, sizePtr, userUnitPtr]) => {\n const pages: PageLayout[] = records.map((record) => {\n throwIfAborted(signal);\n const index = record.pageIndex;\n const actions = readPageActions(fn, mem, docPtr, record.pageObjectNumber, actionBudget);\n return {\n index,\n pageObjectNumber: record.pageObjectNumber,\n label: readLabel(fn, mem, docPtr, index),\n size: readSize(fn, mem, docPtr, index, sizePtr),\n rotation: readRotation(fn, docPtr, index),\n userUnit: readUserUnit(fn, mem, docPtr, index, userUnitPtr),\n boxes: readBoxes(fn, mem, docPtr, index, rectPtr),\n ...(actions ? { actions } : {}),\n };\n });\n return { pageCount: pages.length, pages };\n },\n );\n }\n}\n\nfunction readPageActions(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n pageObjectNumber: number,\n budget: ActionReadBudgetTracker,\n): PdfPageActions | undefined {\n const actions: PdfPageActions = {};\n const open = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetPageActionModel(docPtr, pageObjectNumber, 0),\n budget,\n );\n const close = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetPageActionModel(docPtr, pageObjectNumber, 1),\n budget,\n );\n if (open) actions.open = open;\n if (close) actions.close = close;\n return open || close ? actions : undefined;\n}\n\n/**\n * Read one FS_RECTF box and canonicalize to a y-up `PdfRect`\n * (`{ left, bottom, right, top }`, equivalent to `[llx, lly, urx, ury]`) so\n * the lower-left/upper-right invariant holds regardless of how the PDF\n * ordered the corners. Returns null when the optional box is absent.\n */\nfunction readBox(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n boxType: number,\n rectPtr: Ptr,\n): PdfRect | null {\n if (!fn.EPDF_GetPageBoxByIndex(docPtr, index, boxType, rectPtr)) return null;\n // FS_RECTF → y-up `PdfRect`, normalized so the lower-left/upper-right invariant\n // holds regardless of how the PDF ordered the corners.\n return normalizePdfRect(readRectF(mem, rectPtr));\n}\n\nfunction readBoxes(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n rectPtr: Ptr,\n): PageBoxes {\n // MediaBox always resolves (page-tree inheritance + PDFium default).\n // CropBox falls back to MediaBox, so both are guaranteed present.\n const media = readBox(fn, mem, docPtr, index, BOX_MEDIA, rectPtr) ?? {\n left: 0,\n bottom: 0,\n right: 0,\n top: 0,\n };\n const crop = readBox(fn, mem, docPtr, index, BOX_CROP, rectPtr) ?? media;\n const bleed = readBox(fn, mem, docPtr, index, BOX_BLEED, rectPtr);\n const trim = readBox(fn, mem, docPtr, index, BOX_TRIM, rectPtr);\n const art = readBox(fn, mem, docPtr, index, BOX_ART, rectPtr);\n return {\n media,\n crop,\n ...(bleed ? { bleed } : {}),\n ...(trim ? { trim } : {}),\n ...(art ? { art } : {}),\n };\n}\n\nfunction readSize(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n sizePtr: Ptr,\n): { width: number; height: number } {\n if (!fn.EPDF_GetPageSizeByIndexNormalized(docPtr, index, sizePtr)) {\n return { width: 0, height: 0 };\n }\n return readSizeF(mem, sizePtr);\n}\n\nfunction readRotation(fn: PdfFunctions, docPtr: Ptr, index: number): 0 | 90 | 180 | 270 {\n // Returns quarter-turns (0..3), or -1 on error.\n const quarterTurns = fn.EPDF_GetPageRotationByIndex(docPtr, index);\n switch (quarterTurns) {\n case 1:\n return 90;\n case 2:\n return 180;\n case 3:\n return 270;\n default:\n return 0;\n }\n}\n\nfunction readUserUnit(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n userUnitPtr: Ptr,\n): number {\n if (!fn.EPDF_GetPageUserUnitByIndex(docPtr, index, userUnitPtr)) return 1;\n const value = readF32(mem, userUnitPtr, 0);\n return Number.isFinite(value) && value > 0 ? value : 1;\n}\n\nfunction readLabel(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n): string | null {\n // A page label of '' is indistinguishable from \"absent\" for our DTO, so\n // empty reads as null (`emptyAs: null`); the trailing `|| null` also maps\n // a decoded-but-empty buffer to null.\n return (\n readUtf16String(\n mem,\n (buf, capacity) => fn.FPDF_GetPageLabel(docPtr, index, buf, capacity),\n null,\n ) || null\n );\n}\n","import {\n EngineError,\n EngineErrorCode,\n type PageDeleteResult,\n type PageMoveResult,\n type PageObjectNumber,\n type PageRotateResult,\n type PageRotation,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { PagesReader } from './PagesReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Synchronous orchestrator for page-level reads and reorder mutations.\n * Lives next to `AnnotationMutator` (one orchestrator per\n * mutation domain) so both worker hosts (browser Web Worker and Node\n * `worker_thread`) share the same code path.\n *\n * Architectural anchor — locked with the user, do not loosen without\n * re-reading the doc comments on `PageMoveResult` and `RevisionAuthority`:\n *\n * - Pages are addressed by their durable `pageObjectNumber`. There is\n * no \"weak page ref\" model in the engine; therefore there is no\n * document-level revision token, no `DocumentRevisionStore`, and no\n * \"doc-level shouldRefetch\" semantic. Anything that *is* listed\n * here must remain stable across every reorder permutation.\n *\n * - Per-page `RevisionToken`s do NOT bump on `move()`. The /Annots\n * array of each affected page is untouched (PDFium just rewrites\n * pointer entries in the doc-level pages tree), so weak\n * `AnnotationRef.kind === 'index'` references the caller is\n * holding remain valid across a page reorder. This is the right\n * semantic for an editing UI: shuffling pages must NOT silently\n * break a pending highlight edit.\n *\n * - Identity strengthening (the opportunistic `/NM` stamping that\n * applies to weak annotations on `update()` / `move()`) is also\n * intentionally absent here. Pages are durable by construction;\n * there is nothing to upgrade.\n */\nexport class PagesMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * Reorder pages. Mirrors `FPDF_MovePages`: detach the supplied pages,\n * then re-insert them as a contiguous block at `destIndex` in the\n * post-removal index space, preserving caller order.\n *\n * Atomicity:\n * - `FPDF_MovePages` rejects atomically: if it returns false, no\n * change has happened. We surface that as `InvalidArg`.\n * - On success we refresh the per-session page registry and read the\n * new layout back, which is what the result returns.\n *\n * Validation done up front (the helper repeats these checks; we do\n * them here for clean error messages):\n * - non-empty inputs;\n * - duplicate `pageObjectNumber`s rejected;\n * - every `pon` resolvable via the session's page registry;\n * - `destIndex` in `[0, pageCount - len]`.\n */\n move(\n pageObjectNumbers: PageObjectNumber[],\n destIndex: number,\n signal: AbortSignal,\n ): PageMoveResult {\n throwIfAborted(signal);\n this.requireUniquePons('pages.move', pageObjectNumbers);\n if (destIndex < 0 || !Number.isInteger(destIndex)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.move destIndex must be a non-negative integer (got ${destIndex})`,\n );\n }\n\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const totalPages = fn.FPDF_GetPageCount(docPtr);\n const postRemoval = totalPages - pageObjectNumbers.length;\n if (destIndex > postRemoval) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.move destIndex ${destIndex} out of range; post-removal page count is ${postRemoval}`,\n );\n }\n\n // Resolve every pon to its current pageIndex via the session\n // registry. Bad pons throw `NotFound` from the session, which is\n // exactly what we want — the caller asked to move a page that does\n // not exist.\n const fromIndices = pageObjectNumbers.map((pon) => {\n throwIfAborted(signal);\n return this.session.recordByObjectNumber(pon).pageIndex;\n });\n\n // Marshal int[] and call the helper.\n const arrPtr = mem.alloc(4 * fromIndices.length);\n let ok: boolean;\n try {\n for (let i = 0; i < fromIndices.length; i++) {\n mem.poke(arrPtr, 'i32', fromIndices[i], 4 * i);\n }\n ok = fn.FPDF_MovePages(docPtr, arrPtr, fromIndices.length, destIndex);\n } finally {\n mem.free(arrPtr);\n }\n\n if (!ok) {\n // FPDF_MovePages validates atomically: a `false` return means no\n // change happened. Most likely cause is a contiguous-block\n // overlap our up-front checks did not catch — surface it cleanly.\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `FPDF_MovePages rejected the request (destIndex=${destIndex}, fromIndices=[${fromIndices.join(\n ',',\n )}])`,\n );\n }\n\n // Page positions changed; rebuild the index<->pon map. Per-page\n // revisions and weak-flag bookkeeping survive — both keyed by pon,\n // both untouched by the reorder.\n this.session.refreshPageRegistry();\n\n // A move returns geometry, not liveness: read the new layout off the\n // reordered session via the shared reader (identical output local +\n // cloud). `cache` is null — local engines have no manifest/CDN.\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /**\n * Set the ABSOLUTE display rotation of the supplied pages. Rotation is\n * presentation metadata over normalized content (pages always load with\n * rotation forced to 0 — see `PagePtrPool`), so:\n * - no cached render, text run, or geometry coordinate changes;\n * - per-page `RevisionToken`s do NOT bump;\n * - page identity and order are untouched — no registry refresh.\n *\n * Atomicity: every PON is resolved up front (`NotFound` on caller error),\n * so the apply loop below operates on validated pages only and each write\n * is absolute + idempotent — a retry after an unexpected mid-loop engine\n * fault converges to the requested state. Abort is honored BEFORE the\n * loop, never inside it.\n */\n rotate(\n pageObjectNumbers: PageObjectNumber[],\n rotation: PageRotation,\n signal: AbortSignal,\n ): PageRotateResult {\n throwIfAborted(signal);\n this.requireUniquePons('pages.rotate', pageObjectNumbers);\n if (rotation !== 0 && rotation !== 90 && rotation !== 180 && rotation !== 270) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.rotate rotation must be 0, 90, 180 or 270 (got ${rotation})`,\n );\n }\n\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n for (const pon of pageObjectNumbers) {\n this.session.recordByObjectNumber(pon); // NotFound on unknown pon\n }\n\n // The EPDF helper takes quarter-turns (0..3); the wire speaks degrees.\n const quarterTurns = rotation / 90;\n for (const pon of pageObjectNumbers) {\n if (!fn.EPDFDoc_SetPageRotationByObjectNumber(docPtr, pon, quarterTurns)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFDoc_SetPageRotationByObjectNumber rejected page ${pon} after validation`,\n );\n }\n }\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /**\n * Delete pages. Deleted object numbers are RETIRED — the engine nulls the\n * page object rather than freeing the number — so per-page state keyed by\n * PON can never silently attach to an unrelated future page; we still drop\n * the session's revision/weak entries as hygiene. Surviving pages keep\n * their identity and `RevisionToken`s.\n *\n * Guards:\n * - a document must keep at least one page (`InvalidArg`);\n * - every PON must resolve (`NotFound`);\n * - no target page may have a live pooled `pagePtr`. Thread confinement\n * means no other job can be mid-flight, so a held ptr here is a leaked\n * `acquire` — an internal bug we surface loudly instead of deleting\n * under a live handle.\n *\n * Abort is honored BEFORE the apply loop, never inside it.\n */\n delete(pageObjectNumbers: PageObjectNumber[], signal: AbortSignal): PageDeleteResult {\n throwIfAborted(signal);\n this.requireUniquePons('pages.delete', pageObjectNumbers);\n\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const totalPages = fn.FPDF_GetPageCount(docPtr);\n if (pageObjectNumbers.length >= totalPages) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.delete would remove every page (${pageObjectNumbers.length} of ${totalPages}); a document must keep at least one`,\n );\n }\n\n const pool = this.session.pagePool();\n for (const pon of pageObjectNumbers) {\n this.session.recordByObjectNumber(pon); // NotFound on unknown pon\n if (pool.isHeld(pon)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `internal invariant violation: pagePtr for page ${pon} is still held during pages.delete`,\n );\n }\n }\n\n for (const pon of pageObjectNumbers) {\n if (!fn.EPDFDoc_DeletePageByObjectNumber(docPtr, pon)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFDoc_DeletePageByObjectNumber rejected page ${pon} after validation`,\n );\n }\n this.session.dropPageState(pon);\n }\n\n // Page count and order changed; rebuild the index<->pon map. Surviving\n // pages' revisions and weak-flag bookkeeping stay put (keyed by pon).\n this.session.refreshPageRegistry();\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /** Shared input check: non-empty, no duplicate PONs. */\n private requireUniquePons(op: string, pageObjectNumbers: PageObjectNumber[]): void {\n if (pageObjectNumbers.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, `${op} requires at least one page`);\n }\n const seen = new Set<PageObjectNumber>();\n for (const pon of pageObjectNumbers) {\n if (seen.has(pon)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `${op} was given duplicate page object number ${pon}`,\n );\n }\n seen.add(pon);\n }\n }\n}\n","import { EngineError, EngineErrorCode, type PageObjectNumber } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\nconst FPDF_NO_INCREMENTAL = 1 << 1;\n\n/**\n * Export a subset of pages as a standalone PDF. A READ over the session:\n * `FPDF_ImportPagesByIndex` copies pages into a scratch document, so the\n * source is untouched — no revision bumps, no registry refresh, no layer\n * artifact. Lives next to `PagesReader`/`PagesMutator` (one file per page\n * verb family) so both worker hosts share the code path.\n */\nexport class PagesExtractor {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * Copy the given pages, in the supplied caller order, into a new\n * document and serialize it. Validation up front: non-empty, no\n * duplicates, every PON resolvable (`NotFound` from the session on a\n * bad one). The scratch document is always closed, success or throw.\n */\n extract(\n pageObjectNumbers: PageObjectNumber[],\n signal: AbortSignal,\n ): { bytes: ArrayBuffer; size: number } {\n throwIfAborted(signal);\n if (pageObjectNumbers.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.extract requires at least one page');\n }\n const seen = new Set<PageObjectNumber>();\n for (const pon of pageObjectNumbers) {\n if (seen.has(pon)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.extract was given duplicate page object number ${pon}`,\n );\n }\n seen.add(pon);\n }\n\n // Resolve every pon to its CURRENT index via the session registry —\n // NotFound on caller error, and caller order is preserved in the output.\n const indices = pageObjectNumbers.map(\n (pon) => this.session.recordByObjectNumber(pon).pageIndex,\n );\n\n const { fn, mem } = this.runtime;\n const srcPtr = this.session.requireDocPtr();\n\n const destPtr = fn.FPDF_CreateNewDocument();\n if (!destPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDF_CreateNewDocument failed');\n }\n const idxPtr = mem.alloc(4 * indices.length);\n const sizePtr = mem.alloc(4);\n let pdfPtr: Ptr | null = null;\n try {\n for (let i = 0; i < indices.length; i++) {\n mem.poke(idxPtr, 'i32', indices[i], 4 * i);\n }\n if (!fn.FPDF_ImportPagesByIndex(destPtr, srcPtr, idxPtr, indices.length, 0)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDF_ImportPagesByIndex rejected the request (indices=[${indices.join(',')}])`,\n );\n }\n\n mem.poke(sizePtr, 'i32', 0);\n pdfPtr = fn.EPDF_SaveDocumentToOwnedBuffer(destPtr, FPDF_NO_INCREMENTAL, sizePtr);\n const size = Number(mem.peek(sizePtr, 'i32'));\n if (!pdfPtr || size <= 0) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save extracted pages');\n }\n\n const bytes = mem.readBytes(pdfPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size };\n } finally {\n if (pdfPtr) fn.EPDF_FreeBuffer(pdfPtr);\n mem.free(sizePtr);\n mem.free(idxPtr);\n fn.FPDF_CloseDocument(destPtr);\n }\n }\n}\n","import {\n EngineError,\n EngineErrorCode,\n PAGE_INSERT_BLANK_MAX_COUNT,\n type PageInsertBlankSpec,\n type PageInsertResult,\n type PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { PagesReader } from './PagesReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Insert every page of a standalone PDF into the session document. A\n * structural MUTATION (like move/delete): the source bytes are loaded as a\n * throwaway PDFium document, `FPDF_ImportPagesByIndex` deep-copies its\n * pages in at `destIndex`, and the page registry is rebuilt. Pre-existing\n * pages keep their identity and `RevisionToken`s; the inserted copies get\n * fresh object numbers, resolved from the post-insert registry.\n */\nexport class PagesInserter {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n insert(bytes: ArrayBuffer, destIndex: number | undefined, signal: AbortSignal): PageInsertResult {\n throwIfAborted(signal);\n if (bytes.byteLength === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.insert requires non-empty bytes');\n }\n\n const { fn, mem } = this.runtime;\n const destPtr = this.session.requireDocPtr();\n const beforeCount = fn.FPDF_GetPageCount(destPtr);\n const at = destIndex ?? beforeCount;\n if (!Number.isInteger(at) || at < 0 || at > beforeCount) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insert destIndex ${at} out of range [0, ${beforeCount}]`,\n );\n }\n\n // FPDF_ImportPagesByIndex does NOT fully detach imported objects from\n // their source document (imported streams still read through it), so\n // the source doc and its buffer must outlive every future save of the\n // destination. On failure they are released immediately; on success\n // they are parked on the session and released at session close.\n // TODO(fork): a deep-detaching import would let this close eagerly.\n const dataPtr = mem.alloc(bytes.byteLength);\n let srcPtr: Ptr | null = null;\n let insertedCount = 0;\n try {\n mem.writeBytes(dataPtr, new Uint8Array(bytes));\n srcPtr = fn.FPDF_LoadMemDocument(dataPtr, bytes.byteLength, '');\n if (!srcPtr) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'pages.insert source PDF could not be opened',\n );\n }\n insertedCount = fn.FPDF_GetPageCount(srcPtr);\n if (insertedCount <= 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.insert source PDF has no pages');\n }\n // Null index array + count 0 = \"import every page\", in order.\n if (!fn.FPDF_ImportPagesByIndex(destPtr, srcPtr, NULL_PTR, 0, at)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDF_ImportPagesByIndex rejected the insert at index ${at}`,\n );\n }\n const retainedSrc = srcPtr;\n this.session.retainUntilClose(() => {\n fn.FPDF_CloseDocument(retainedSrc);\n mem.free(dataPtr);\n });\n } catch (error) {\n if (srcPtr) fn.FPDF_CloseDocument(srcPtr);\n mem.free(dataPtr);\n throw error;\n }\n\n // Page count and order changed; rebuild the index<->pon map. Existing\n // pages' revisions and weak-flag bookkeeping stay put (keyed by pon).\n this.session.refreshPageRegistry();\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n const insertedPageObjectNumbers: PageObjectNumber[] = layout.pages\n .slice(at, at + insertedCount)\n .map((page) => page.pageObjectNumber);\n return { insertedPageObjectNumbers, layout, cache: null };\n }\n\n /**\n * Create `count` blank pages of `size` at `destIndex`. Same mutation\n * contract as `insert`, but native creation (`FPDFPage_New`) instead of a\n * deep copy: no source document, so none of the retain-until-close\n * lifetime hazard above. Each page gets an empty content stream\n * (`FPDFPage_GenerateContent`) so the saved PDF renders identically in\n * third-party viewers.\n */\n insertBlank(\n spec: PageInsertBlankSpec,\n destIndex: number | undefined,\n signal: AbortSignal,\n ): PageInsertResult {\n throwIfAborted(signal);\n const { size } = spec;\n const count = spec.count ?? 1;\n if (\n !Number.isFinite(size?.width) ||\n !Number.isFinite(size?.height) ||\n size.width <= 0 ||\n size.height <= 0\n ) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insertBlank size must have positive finite dimensions, got ${size?.width}x${size?.height}`,\n );\n }\n if (!Number.isInteger(count) || count < 1 || count > PAGE_INSERT_BLANK_MAX_COUNT) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insertBlank count ${count} out of range [1, ${PAGE_INSERT_BLANK_MAX_COUNT}]`,\n );\n }\n\n const { fn } = this.runtime;\n const destPtr = this.session.requireDocPtr();\n const beforeCount = fn.FPDF_GetPageCount(destPtr);\n const at = destIndex ?? beforeCount;\n if (!Number.isInteger(at) || at < 0 || at > beforeCount) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insertBlank destIndex ${at} out of range [0, ${beforeCount}]`,\n );\n }\n\n for (let i = 0; i < count; i++) {\n // FPDFPage_New would clamp an out-of-range index to \"append\"; the\n // guard above keeps that PDFium leniency out of the contract.\n const pagePtr = fn.FPDFPage_New(destPtr, at + i, size.width, size.height);\n if (!pagePtr) {\n // Undo the pages already created so a failure leaves the document\n // untouched (the registry was never refreshed, so it still agrees).\n for (let j = 0; j < i; j++) fn.FPDFPage_Delete(destPtr, at);\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_New rejected page ${i + 1}/${count} at index ${at + i}`,\n );\n }\n fn.FPDFPage_GenerateContent(pagePtr);\n fn.FPDF_ClosePage(pagePtr);\n }\n\n this.session.refreshPageRegistry();\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n const insertedPageObjectNumbers: PageObjectNumber[] = layout.pages\n .slice(at, at + count)\n .map((page) => page.pageObjectNumber);\n return { insertedPageObjectNumbers, layout, cache: null };\n }\n}\n","import type { Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\n\n/**\n * Document-scoped capabilities threaded into per-subtype annotation\n * READERS — the read-side mirror of `AnnotationWriteContext`. Most kinds\n * materialise from the `annotPtr` alone and ignore it; the link reader\n * needs the document because destination, action, and URI resolution are\n * document-scoped PDFium operations.\n */\nexport interface AnnotationReadContext {\n readonly docPtr: Ptr;\n}\n\n/** Build the read context both read paths (list loop, mutator read-back) use. */\nexport function readContextFor(session: DocumentSession): AnnotationReadContext {\n return { docPtr: session.requireDocPtr() };\n}\n","import type { AnnotationFlags } from '@embedpdf/engine-core/runtime';\nimport { NO_ANNOTATION_FLAGS } from '@embedpdf/engine-core/runtime';\n\n/**\n * Bit positions of the `/F` (Annotation Flags) entry per ISO 32000 §12.5.3.\n * The single source of truth shared by the flag reader and writer so they\n * can never drift apart.\n */\nexport const ANNOT_FLAG_BITS = {\n invisible: 1 << 0,\n hidden: 1 << 1,\n print: 1 << 2,\n noZoom: 1 << 3,\n noRotate: 1 << 4,\n noView: 1 << 5,\n readOnly: 1 << 6,\n locked: 1 << 7,\n toggleNoView: 1 << 8,\n lockedContents: 1 << 9,\n} as const satisfies Record<keyof AnnotationFlags, number>;\n\nconst FLAG_KEYS = Object.keys(ANNOT_FLAG_BITS) as (keyof AnnotationFlags)[];\n\n/** Expand a raw `/F` bitset into the typed boolean object. */\nexport function bitsToFlags(bits: number): AnnotationFlags {\n if (bits === 0) return { ...NO_ANNOTATION_FLAGS };\n const flags = { ...NO_ANNOTATION_FLAGS };\n for (const key of FLAG_KEYS) {\n flags[key] = (bits & ANNOT_FLAG_BITS[key]) !== 0;\n }\n return flags;\n}\n\n/**\n * Fold a partial flag patch onto an existing `/F` bitset. Only keys present\n * in `partial` are touched; absent keys preserve their current bit. This is\n * what lets `create` start from 0 and `update` merge onto the live value.\n */\nexport function flagsToBits(current: number, partial: Partial<AnnotationFlags>): number {\n let bits = current;\n for (const key of FLAG_KEYS) {\n const value = partial[key];\n if (value === undefined) continue;\n if (value) {\n bits |= ANNOT_FLAG_BITS[key];\n } else {\n bits &= ~ANNOT_FLAG_BITS[key];\n }\n }\n return bits;\n}\n","import type { LineEnding } from '@embedpdf/engine-core/runtime';\n\n/**\n * `FPDF_ANNOT_LINE_END` enum codes from `public/fpdf_annot.h`, mapped to the\n * wire-stable kebab-case `LineEnding` strings. We keep this PDFium-specific\n * mapping in engine-services so engine-core stays free of any PDFium\n * dependency (mirrors `shapeBorderStyle.ts`).\n *\n * None=0, Square=1, Circle=2, Diamond=3, OpenArrow=4, ClosedArrow=5,\n * Butt=6, ROpenArrow=7, RClosedArrow=8, Slash=9, Unknown=10\n *\n * `Unknown` has no wire representation, so it round-trips as `'none'`.\n */\nconst LE_NONE = 0;\nconst LE_SQUARE = 1;\nconst LE_CIRCLE = 2;\nconst LE_DIAMOND = 3;\nconst LE_OPEN_ARROW = 4;\nconst LE_CLOSED_ARROW = 5;\nconst LE_BUTT = 6;\nconst LE_R_OPEN_ARROW = 7;\nconst LE_R_CLOSED_ARROW = 8;\nconst LE_SLASH = 9;\n\nexport function lineEndingToCode(ending: LineEnding): number {\n switch (ending) {\n case 'square':\n return LE_SQUARE;\n case 'circle':\n return LE_CIRCLE;\n case 'diamond':\n return LE_DIAMOND;\n case 'open-arrow':\n return LE_OPEN_ARROW;\n case 'closed-arrow':\n return LE_CLOSED_ARROW;\n case 'butt':\n return LE_BUTT;\n case 'r-open-arrow':\n return LE_R_OPEN_ARROW;\n case 'r-closed-arrow':\n return LE_R_CLOSED_ARROW;\n case 'slash':\n return LE_SLASH;\n case 'none':\n default:\n return LE_NONE;\n }\n}\n\nexport function lineEndingFromCode(code: number): LineEnding {\n switch (code) {\n case LE_SQUARE:\n return 'square';\n case LE_CIRCLE:\n return 'circle';\n case LE_DIAMOND:\n return 'diamond';\n case LE_OPEN_ARROW:\n return 'open-arrow';\n case LE_CLOSED_ARROW:\n return 'closed-arrow';\n case LE_BUTT:\n return 'butt';\n case LE_R_OPEN_ARROW:\n return 'r-open-arrow';\n case LE_R_CLOSED_ARROW:\n return 'r-closed-arrow';\n case LE_SLASH:\n return 'slash';\n case LE_NONE:\n default:\n return 'none';\n }\n}\n","import type {\n AnnotationFlags,\n Color,\n InkList,\n LineEndings,\n LinePoints,\n PdfPoint,\n PdfQuad,\n PdfRect,\n PdfRectDifferences,\n} from '@embedpdf/engine-core/runtime';\nimport {\n NULL_PTR,\n type PdfFunctions,\n type PdfRuntimeMemory,\n type Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport { withScratch, withScratchN } from '../../../../runtime/memory/scratch';\nimport { readUtf16String } from '../../../../runtime/memory/strings';\nimport {\n F32_BYTES,\n I32_BYTES,\n POINTF_BYTES,\n QUADPOINTSF_BYTES,\n RECTF_BYTES,\n readF32,\n readI32,\n readRectF,\n} from '../../../../runtime/memory/structs';\nimport { bitsToFlags } from '../annotationFlagBits';\nimport { lineEndingFromCode } from '../lineEnding';\n\n/**\n * Reads a UTF-16 string entry from an annotation dictionary. Returns\n * `null` if the key is not present, otherwise the (possibly empty) string.\n */\nexport function readAnnotString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n): string | null {\n if (!fn.FPDFAnnot_HasKey(annotPtr, key)) return null;\n return readUtf16String(\n mem,\n (buf, capacity) => fn.FPDFAnnot_GetStringValue(annotPtr, key, buf, capacity),\n '',\n );\n}\n\n/**\n * Read /Rect from an annot dict via FPDFAnnot_GetRect.\n * FS_RECTF layout: { float left, top, right, bottom } -> 16 bytes.\n */\nexport function readAnnotRect(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): PdfRect {\n return withScratch(mem, RECTF_BYTES, (buf) => {\n if (!fn.FPDFAnnot_GetRect(annotPtr, buf)) {\n return { left: 0, bottom: 0, right: 0, top: 0 };\n }\n return readRectF(mem, buf);\n });\n}\n\nexport function readAnnotFlags(fn: PdfFunctions, annotPtr: Ptr): AnnotationFlags {\n return bitsToFlags(fn.FPDFAnnot_GetFlags(annotPtr));\n}\n\n/**\n * Read an annotation color via the EmbedPDF `EPDFAnnot_GetColor`\n * extension. The `type` arg (FPDFANNOT_COLORTYPE) selects which color to\n * read — `0` (default) is the stroke/fill `/C`, `1` is the interior `/IC`\n * of square/circle/polygon annotations. Unlike the stock\n * `FPDFAnnot_GetColor`, the extension exposes interior color. Returns RGB\n * only — annotation opacity lives in `/CA`, not a per-color alpha.\n *\n * Returns `null` when the requested color entry is absent.\n */\nexport function readAnnotColor(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n type: number = 0, // FPDFANNOT_COLORTYPE_Color\n): Color | null {\n return withScratchN(mem, [I32_BYTES, I32_BYTES, I32_BYTES], ([r, g, b]) => {\n if (!fn.EPDFAnnot_GetColor(annotPtr, type, r, g, b)) return null;\n return {\n r: readI32(mem, r) & 0xff,\n g: readI32(mem, g) & 0xff,\n b: readI32(mem, b) & 0xff,\n };\n });\n}\n\n/**\n * Read annotation opacity via the EmbedPDF `EPDFAnnot_GetOpacity`\n * extension. Returns a 0..1 value (the native alpha is 0..255). Returns\n * `null` when the annotation has no opacity entry. This is the path that\n * stays consistent across native `EPDFAnnot_GenerateAppearance`, unlike a\n * raw `/CA` number read.\n */\nexport function readAnnotOpacity(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number | null {\n return withScratch(mem, I32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetOpacity(annotPtr, buf)) return null;\n return (readI32(mem, buf) & 0xff) / 255;\n });\n}\n\n/**\n * Read the effective border style and width via\n * `EPDFAnnot_GetBorderStyle`, which resolves `/BS`, legacy `/Border`, and\n * the ISO defaults. The return value is the raw `FPDF_ANNOT_BORDER_STYLE`\n * enum code; the width is written into the scratch out-parameter.\n * Style/width string mapping lives in the shape reader (engine-core stays\n * PDFium-free).\n */\nexport function readBorderStyle(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): { styleCode: number; width: number } {\n return withScratch(mem, F32_BYTES, (buf) => {\n const styleCode = fn.EPDFAnnot_GetBorderStyle(annotPtr, buf);\n return { styleCode, width: readF32(mem, buf) };\n });\n}\n\n/**\n * Read the dash pattern of a dashed border. Resolves modern `/BS /D` first,\n * then the fourth element of the legacy `/Border` array. Returns an empty\n * array when the effective border is not dashed or has no explicit pattern.\n */\nexport function readBorderDashPattern(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number[] {\n const count = fn.EPDFAnnot_GetBorderDashPatternCount(annotPtr);\n if (count <= 0) return [];\n return withScratch(mem, count * F32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetBorderDashPattern(annotPtr, buf, count)) return [];\n const out: number[] = [];\n for (let i = 0; i < count; i++) out.push(readF32(mem, buf, i * F32_BYTES));\n return out;\n });\n}\n\n/**\n * Read the `/BE` cloudy border intensity. Returns `null` when the\n * annotation has no cloudy border effect. The DTO domain is positive-or-null,\n * so a degenerate foreign `/BE /I 0` (no visible clouds) normalizes to `null`\n * rather than leaking an out-of-schema zero; a `/BE` without `/I` reads as 1\n * (the runtime's default).\n */\nexport function readBorderEffect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number | null {\n return withScratch(mem, F32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetBorderEffect(annotPtr, buf)) return null;\n const intensity = readF32(mem, buf);\n return intensity > 0 ? intensity : null;\n });\n}\n\n/**\n * Read the `/RD` rectangle differences. Returns `null` when the\n * annotation has no `/RD` entry. PDFium reports `/RD` in\n * `[left, bottom, right, top]` order; we surface the wire-stable\n * `{ left, top, right, bottom }` shape.\n */\nexport function readRectangleDifferences(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): PdfRectDifferences | null {\n return withScratchN(\n mem,\n [F32_BYTES, F32_BYTES, F32_BYTES, F32_BYTES],\n ([left, bottom, right, top]) => {\n if (!fn.EPDFAnnot_GetRectangleDifferences(annotPtr, left, bottom, right, top)) return null;\n return {\n left: readF32(mem, left),\n bottom: readF32(mem, bottom),\n right: readF32(mem, right),\n top: readF32(mem, top),\n };\n },\n );\n}\n\n/**\n * Read the `/Vertices` point list of a polygon/polyline annotation via\n * the two-call `FPDFAnnot_GetVertices` pattern (probe for the count with\n * a NULL buffer, then read into a `count * FS_POINTF` buffer). Returns an\n * empty array when the annotation has no vertices.\n */\nexport function readVertices(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): PdfPoint[] {\n const count = fn.FPDFAnnot_GetVertices(annotPtr, NULL_PTR, 0);\n if (count <= 0) return [];\n return withScratch(mem, count * POINTF_BYTES, (buf) => {\n const got = fn.FPDFAnnot_GetVertices(annotPtr, buf, count);\n if (got <= 0) return [];\n const out: PdfPoint[] = [];\n for (let i = 0; i < got; i++) {\n const off = i * POINTF_BYTES;\n out.push({ x: readF32(mem, buf, off), y: readF32(mem, buf, off + 4) });\n }\n return out;\n });\n}\n\n/**\n * Read the `/InkList` of an ink annotation. `FPDFAnnot_GetInkListCount`\n * gives the number of strokes; each stroke is sized with a probe call to\n * `FPDFAnnot_GetInkListPath` (NULL buffer) and then read into a\n * `count * FS_POINTF` buffer. Empty strokes are skipped; the result is an\n * array of non-empty point paths.\n */\nexport function readInkList(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): InkList {\n const pathCount = fn.FPDFAnnot_GetInkListCount(annotPtr);\n if (pathCount <= 0) return [];\n const out: InkList = [];\n for (let p = 0; p < pathCount; p++) {\n const count = fn.FPDFAnnot_GetInkListPath(annotPtr, p, NULL_PTR, 0);\n if (count <= 0) continue;\n const stroke = withScratch(mem, count * POINTF_BYTES, (buf) => {\n const got = fn.FPDFAnnot_GetInkListPath(annotPtr, p, buf, count);\n if (got <= 0) return [];\n const pts: PdfPoint[] = [];\n for (let i = 0; i < got; i++) {\n const off = i * POINTF_BYTES;\n pts.push({ x: readF32(mem, buf, off), y: readF32(mem, buf, off + 4) });\n }\n return pts;\n });\n if (stroke.length > 0) out.push(stroke);\n }\n return out;\n}\n\n/**\n * Read the `/L` endpoints of a line annotation via `FPDFAnnot_GetLine`\n * (two `FS_POINTF` out-params). Returns `null` when the annotation is not\n * a line or has no `/L` entry.\n */\nexport function readLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): LinePoints | null {\n return withScratchN(mem, [POINTF_BYTES, POINTF_BYTES], ([start, end]) => {\n if (!fn.FPDFAnnot_GetLine(annotPtr, start, end)) return null;\n return {\n start: { x: readF32(mem, start, 0), y: readF32(mem, start, 4) },\n end: { x: readF32(mem, end, 0), y: readF32(mem, end, 4) },\n };\n });\n}\n\n/**\n * Read the `/LE` line endings of a line/polyline annotation via the\n * EmbedPDF `EPDFAnnot_GetLineEndings` extension (two int out-params).\n * Returns `{ start: 'none', end: 'none' }` when the annotation has no\n * `/LE` entry, so callers always get a well-formed pair.\n */\nexport function readLineEndings(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): LineEndings {\n return withScratchN(mem, [I32_BYTES, I32_BYTES], ([start, end]) => {\n if (!fn.EPDFAnnot_GetLineEndings(annotPtr, start, end)) {\n return { start: 'none', end: 'none' };\n }\n return {\n start: lineEndingFromCode(readI32(mem, start)),\n end: lineEndingFromCode(readI32(mem, end)),\n };\n });\n}\n\n/**\n * Read the `/DA` default appearance (font + size + colour) of a free-text\n * annotation via `EPDFAnnot_GetDefaultAppearance` (font int, size f32, and\n * r/g/b int out-params). `fontCode` is the raw `FPDF_STANDARD_FONT` enum\n * value. Returns `null` when the annotation has no `/DA`.\n */\nexport function readDefaultAppearance(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): { fontCode: number; fontSize: number; color: Color } | null {\n return withScratchN(\n mem,\n [I32_BYTES, F32_BYTES, I32_BYTES, I32_BYTES, I32_BYTES],\n ([font, size, r, g, b]) => {\n if (!fn.EPDFAnnot_GetDefaultAppearance(annotPtr, font, size, r, g, b)) return null;\n return {\n fontCode: readI32(mem, font),\n fontSize: readF32(mem, size),\n color: {\n r: readI32(mem, r) & 0xff,\n g: readI32(mem, g) & 0xff,\n b: readI32(mem, b) & 0xff,\n },\n };\n },\n );\n}\n\n/**\n * Read the `/Q` text alignment quadding code of a free-text annotation via\n * `EPDFAnnot_GetTextAlignment`. The code<->string mapping lives in\n * `textAlignment.ts`; an absent `/Q` reads back as `0` (left).\n */\nexport function readTextAlignment(fn: PdfFunctions, annotPtr: Ptr): number {\n return fn.EPDFAnnot_GetTextAlignment(annotPtr);\n}\n\n/**\n * Read `/OverlayText` of a redact annotation via `EPDFAnnot_GetOverlayText`\n * (standard UTF-16 byte-length ABI). Returns `null` when the key is absent\n * (the redaction has no label), otherwise the — possibly empty — label.\n */\nexport function readOverlayText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): string | null {\n if (!fn.FPDFAnnot_HasKey(annotPtr, 'OverlayText')) return null;\n return readUtf16String(\n mem,\n (buf, capacity) => fn.EPDFAnnot_GetOverlayText(annotPtr, buf, capacity),\n '',\n );\n}\n\n/**\n * Read `/Repeat` of a redact annotation via `EPDFAnnot_GetOverlayTextRepeat`\n * (an absent key reads as `false`, the PDF default).\n */\nexport function readOverlayTextRepeat(fn: PdfFunctions, annotPtr: Ptr): boolean {\n return fn.EPDFAnnot_GetOverlayTextRepeat(annotPtr);\n}\n\n/**\n * Read the `/IT` intent name via `EPDFAnnot_GetIntent`. Unlike the standard\n * `FPDFAnnot_GetStringValue` ABI, this getter reports the count of UTF-16\n * code units (excluding the NUL), so we size the buffer as\n * `(count + 1) * 2` bytes. Returns `null` when no intent is present.\n */\nexport function readIntent(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): string | null {\n const codeUnits = fn.EPDFAnnot_GetIntent(annotPtr, NULL_PTR, 0);\n if (codeUnits <= 0) return null;\n const bytes = (codeUnits + 1) * 2;\n return withScratch(mem, bytes, (buf) => {\n fn.EPDFAnnot_GetIntent(annotPtr, buf, bytes);\n return mem.readU16String(buf);\n });\n}\n\n/**\n * Read the `/CL` callout leader line of a free-text callout via\n * `EPDFAnnot_GetCalloutLineCount` + `EPDFAnnot_GetCalloutLine` (the points\n * are read into a `count * FS_POINTF` buffer, like {@link readVertices}).\n * Returns an empty array when there is no callout line.\n */\nexport function readCalloutLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): PdfPoint[] {\n const count = fn.EPDFAnnot_GetCalloutLineCount(annotPtr);\n if (count <= 0) return [];\n return withScratch(mem, count * POINTF_BYTES, (buf) => {\n const got = fn.EPDFAnnot_GetCalloutLine(annotPtr, buf, count);\n if (got <= 0) return [];\n const out: PdfPoint[] = [];\n for (let i = 0; i < got; i++) {\n const off = i * POINTF_BYTES;\n out.push({ x: readF32(mem, buf, off), y: readF32(mem, buf, off + 4) });\n }\n return out;\n });\n}\n\n/**\n * Read attachment points for a text-markup annotation.\n * Each `FS_QUADPOINTSF` is 8 floats = 32 bytes.\n */\nexport function readQuadPoints(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): PdfQuad[] {\n const count = fn.FPDFAnnot_CountAttachmentPoints(annotPtr);\n if (count <= 0) return [];\n\n return withScratch(mem, QUADPOINTSF_BYTES, (buf) => {\n const out: PdfQuad[] = [];\n for (let i = 0; i < count; i++) {\n if (!fn.FPDFAnnot_GetAttachmentPoints(annotPtr, i, buf)) continue;\n const f = (off: number) => readF32(mem, buf, off);\n // Positional, in PDFium FS_QUADPOINTSF slot order (PDF 32000 12.5.6.10):\n // { x1,y1, x2,y2, x3,y3, x4,y4 } -> p1 p2 p3 p4. We do NOT relabel these\n // as named corners: PdfQuad asserts no corner semantics (see its docs).\n out.push({\n p1: { x: f(0), y: f(4) },\n p2: { x: f(8), y: f(12) },\n p3: { x: f(16), y: f(20) },\n p4: { x: f(24), y: f(28) },\n });\n }\n return out;\n });\n}\n","import type { PdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from '../../../../runtime/memory/scratch';\nimport { F32_BYTES, RECTF_BYTES, readF32, readRectF } from '../../../../runtime/memory/structs';\n\n/**\n * Read-side twin of `writers/.../writeAnnotationTransformMetadata.ts`. Decodes\n * the EmbedPDF rotation keys from /EMBD_Metadata back onto the DTO:\n *\n * - `Rotation` — degrees, PDF convention. Returned for EVERY rotatable\n * kind (box AND vertex); the plugin converts it back to its CW-content\n * `rot` once at the repository seam.\n * - `UnrotatedRect` — the logical box. BOX kinds only (square/circle/\n * free-text); a vertex annotation never carries one (its points are the\n * visual), so vertex readers don't ask for it.\n *\n * Both are absent on un-rotated annotations (and on everything authored before\n * rotation shipped), so both reads return `undefined` and the DTO field stays\n * unset.\n */\n\nconst KEY_ROTATION = 'Rotation';\nconst KEY_UNROTATED_RECT = 'UnrotatedRect';\n\n/** The advisory/portable rotation scalar (degrees, PDF convention), or\n * `undefined` when absent or zero. */\nexport function readAnnotationRotation(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number | undefined {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) return undefined;\n return withScratch(mem, F32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetEmbedMetadataNumber(annotPtr, KEY_ROTATION, buf)) return undefined;\n const v = readF32(mem, buf);\n return v ? v : undefined; // 0 ≡ \"no rotation\"\n });\n}\n\n/** The logical (unrotated) box of a rotated BOX annotation, or `undefined`. */\nexport function readAnnotationUnrotatedRect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): PdfRect | undefined {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) return undefined;\n return withScratch(mem, RECTF_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetEmbedMetadataRect(annotPtr, KEY_UNROTATED_RECT, buf)) return undefined;\n // FS_RECTF { left, top, right, bottom } → wire-stable PdfRect.\n const r = readRectF(mem, buf);\n return { left: r.left, bottom: r.bottom, right: r.right, top: r.top };\n });\n}\n","import type { CaretIntent, StrikeoutIntent } from '@embedpdf/engine-core/runtime';\n\n/** Adobe-compatible `/IT` names, normalized at the engine-core boundary. */\nconst IT_REPLACE = 'Replace';\nconst IT_STRIKEOUT_TEXT_EDIT = 'StrikeOutTextEdit';\n\nexport function caretIntentToName(intent: CaretIntent): string {\n switch (intent) {\n case 'replace':\n return IT_REPLACE;\n }\n}\n\nexport function caretIntentFromName(name: string | null): CaretIntent | null {\n return name === IT_REPLACE ? 'replace' : null;\n}\n\nexport function strikeoutIntentToName(intent: StrikeoutIntent): string {\n switch (intent) {\n case 'strikeout-text-edit':\n return IT_STRIKEOUT_TEXT_EDIT;\n }\n}\n\nexport function strikeoutIntentFromName(name: string | null): StrikeoutIntent | null {\n return name === IT_STRIKEOUT_TEXT_EDIT ? 'strikeout-text-edit' : null;\n}\n","import type { AnnotationBase, CaretAnnotationDTO, Color } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readIntent,\n readRectangleDifferences,\n} from './annotationReadPrimitives';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\nimport { caretIntentFromName } from '../textEditIntent';\n\n/** Default `/C` colour when a caret has none (matches the writer default). */\nconst DEFAULT_CARET_COLOR: Color = { r: 255, g: 0, b: 0 };\n\nexport function readCaret(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): CaretAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...DEFAULT_CARET_COLOR };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const rd = readRectangleDifferences(fn, mem, annotPtr);\n const intent = caretIntentFromName(readIntent(fn, mem, annotPtr));\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n\n return {\n ...base,\n subtype: 'caret',\n intent,\n color,\n opacity,\n rectDifferences: rd,\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect ? { unrotatedRect } : {}),\n };\n}\n","import type {\n AttachmentFileInfo,\n EmbeddedFileRef,\n WireResource,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\nimport type {\n PdfFunctions,\n PdfRuntimeMemory,\n PdfRuntimeModule,\n Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport { readUtf16String, writeUtf16String } from '../../../runtime/memory/strings';\n\n/**\n * Shared primitives over an `FPDF_ATTACHMENT` handle (an unretained\n * filespec pointer — no close call exists or is needed). Used by both\n * homes an embedded file can have: the document-level `/EmbeddedFiles`\n * name tree (`AttachmentReader`) and a FileAttachment annotation's `/FS`\n * (the annotation reader + `downloadFile`).\n */\n\n/** Read the name-tree KEY at |index| — the durable EmbeddedFileRef address. */\nexport function readAttachmentKey(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n): string | null {\n return readUtf16String(mem, (buf, cap) => fn.EPDFDoc_GetAttachmentKey(docPtr, index, buf, cap));\n}\n\n/** Resolve an EmbeddedFileRef to its CURRENT name-tree index, or -1. */\nexport function resolveAttachmentIndex(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n ref: EmbeddedFileRef,\n): number {\n const keyPtr = mem.writeU16String(ref.key);\n try {\n return fn.EPDFDoc_GetAttachmentIndexByKey(docPtr, keyPtr);\n } finally {\n mem.free(keyPtr);\n }\n}\n\n/**\n * Write an embedded file's payload onto an existing FPDF_ATTACHMENT:\n * bytes via FPDFAttachment_SetFile (which also writes /Params\n * Size/CheckSum/CreationDate), declared mime via EPDFAttachment_SetSubtype\n * (attachments accept any format — no sniffing), optional /Desc. Shared\n * by the file-attachment annotation writer and the document-level\n * `attachments.create` mutation — the write half of the one attachment\n * vocabulary.\n */\nexport function writeAttachmentFilePayload(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n docPtr: Ptr,\n file: { mimeType?: string; description?: string },\n resource: WireResource,\n): void {\n const byteLength = resource.bytes.byteLength;\n if (byteLength === 0) {\n // Valid zero-byte attachment: PDFium accepts (NULL, 0).\n if (!fn.FPDFAttachment_SetFile(attachmentPtr, docPtr, NULL_PTR, 0)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAttachment_SetFile returned false');\n }\n } else {\n const dataPtr = mem.alloc(byteLength);\n try {\n mem.writeBytes(dataPtr, new Uint8Array(resource.bytes));\n if (!fn.FPDFAttachment_SetFile(attachmentPtr, docPtr, dataPtr, byteLength)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAttachment_SetFile returned false');\n }\n } finally {\n mem.free(dataPtr);\n }\n }\n\n if (!fn.EPDFAttachment_SetSubtype(attachmentPtr, file.mimeType ?? 'application/octet-stream')) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAttachment_SetSubtype returned false');\n }\n if (file.description !== undefined) {\n const ok = writeUtf16String(mem, file.description, (ptr) =>\n fn.EPDFAttachment_SetDescription(attachmentPtr, ptr),\n );\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAttachment_SetDescription returned false',\n );\n }\n }\n}\n\n/** Read the metadata projection of an embedded file (never its bytes). */\nexport function readAttachmentFileInfo(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n): AttachmentFileInfo {\n const name =\n readUtf16String(mem, (buf, cap) => fn.FPDFAttachment_GetName(attachmentPtr, buf, cap)) ?? '';\n const mimeType = readUtf16String(mem, (buf, cap) =>\n fn.FPDFAttachment_GetSubtype(attachmentPtr, buf, cap),\n );\n const description = readUtf16String(mem, (buf, cap) =>\n fn.EPDFAttachment_GetDescription(attachmentPtr, buf, cap),\n );\n const creationDate = readAttachmentString(fn, mem, attachmentPtr, 'CreationDate');\n const checksum = normalizeChecksum(readAttachmentString(fn, mem, attachmentPtr, 'CheckSum'));\n const size = readAttachmentSize(fn, mem, attachmentPtr);\n\n return {\n name,\n ...(mimeType ? { mimeType } : {}),\n ...(description ? { description } : {}),\n ...(size !== null ? { size } : {}),\n ...(checksum ? { checksum } : {}),\n ...(creationDate ? { creationDate } : {}),\n };\n}\n\n/**\n * Decode the embedded file into a standalone buffer via the fork's\n * single-decode `EPDFAttachment_ExtractFileToOwnedBuffer`. A zero-byte\n * embedded file is a valid `{ size: 0 }` result.\n */\nexport function extractAttachmentToBuffer(\n runtime: PdfRuntimeModule,\n attachmentPtr: Ptr,\n maxDecodedBytes: number | undefined,\n): { bytes: ArrayBuffer; size: number } {\n const { fn, mem } = runtime;\n const bufPtrSlot = mem.alloc(8); // void** — 8 bytes covers wasm32 and native\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n let dataPtr: Ptr | null = null;\n try {\n // Plain 0 (not 0n): the wasm memory writes pointer slots via\n // Emscripten setValue, which rejects BigInt for 32-bit pointers.\n mem.poke(bufPtrSlot, 'ptr', 0);\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', -1);\n const ok = fn.EPDFAttachment_ExtractFileToOwnedBuffer(\n attachmentPtr,\n BigInt(maxDecodedBytes ?? 0),\n bufPtrSlot,\n sizePtr,\n statusPtr,\n );\n if (!ok) {\n throw extractStatusError(Number(mem.peek(statusPtr, 'i32')));\n }\n const size = Number(mem.peek(sizePtr, 'i32')) >>> 0;\n dataPtr = mem.peek(bufPtrSlot, 'ptr') as Ptr;\n if (size === 0 || !dataPtr) {\n return { bytes: new ArrayBuffer(0), size: 0 };\n }\n const view = mem.readBytes(dataPtr, size);\n const buffer = new ArrayBuffer(view.byteLength);\n new Uint8Array(buffer).set(view);\n return { bytes: buffer, size };\n } finally {\n if (dataPtr) fn.EPDF_FreeBuffer(dataPtr);\n mem.free(statusPtr);\n mem.free(sizePtr);\n mem.free(bufPtrSlot);\n }\n}\n\n/**\n * Decode the embedded file straight to `path` via the fork's streaming\n * `EPDFAttachment_ExtractFile` + `FPDF_FILEWRITE` — the server mode: the\n * decoded payload never crosses the thread boundary and HTTP streams it\n * from disk. On failure the destination may hold a partial file (the\n * caller owns temp-file cleanup, as with `document.saveFile`).\n */\nexport function extractAttachmentToFile(\n runtime: PdfRuntimeModule,\n attachmentPtr: Ptr,\n path: string,\n maxDecodedBytes: number | undefined,\n): { size: number } {\n const { fn, mem } = runtime;\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n const writer = runtime.fileWrite.toNodeFile(path);\n try {\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', -1);\n const ok = fn.EPDFAttachment_ExtractFile(\n attachmentPtr,\n writer.ptr,\n BigInt(maxDecodedBytes ?? 0),\n sizePtr,\n statusPtr,\n );\n if (!ok) {\n throw extractStatusError(Number(mem.peek(statusPtr, 'i32')));\n }\n return { size: Number(mem.peek(sizePtr, 'i32')) >>> 0 };\n } finally {\n writer.close();\n mem.free(statusPtr);\n mem.free(sizePtr);\n }\n}\n\n/** `EPDFAttachmentExtractStatus` (public/fpdf_attachment.h) → EngineError. */\nfunction extractStatusError(status: number): EngineError {\n switch (status) {\n case 1: // kNoFileStream\n return new EngineError(\n EngineErrorCode.InvalidArg,\n 'attachment has no embedded file stream (missing /EF)',\n );\n case 2: // kDecodeFailed\n return new EngineError(EngineErrorCode.MalformedPdf, 'embedded file stream failed to decode');\n case 3: // kSizeLimitExceeded\n return new EngineError(\n EngineErrorCode.InvalidArg,\n 'embedded file exceeds the configured decoded-size limit',\n );\n case 4: // kWriteFailed\n return new EngineError(EngineErrorCode.Unknown, 'writing the extracted attachment failed');\n default:\n return new EngineError(\n EngineErrorCode.Unknown,\n `attachment extraction failed (status ${status})`,\n );\n }\n}\n\nfunction readAttachmentString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n key: string,\n): string | null {\n if (!fn.FPDFAttachment_HasKey(attachmentPtr, key)) return null;\n return readUtf16String(\n mem,\n (buf, cap) => fn.FPDFAttachment_GetStringValue(attachmentPtr, key, buf, cap),\n null,\n );\n}\n\nfunction readAttachmentSize(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n): number | null {\n const out = mem.alloc(4);\n try {\n if (!fn.EPDFAttachment_GetIntegerValue(attachmentPtr, 'Size', out)) return null;\n const size = Number(mem.peek(out, 'i32'));\n return size >= 0 ? size : null;\n } finally {\n mem.free(out);\n }\n}\n\n/** PDFium reports `/CheckSum` hex strings as `<ABCD…>` — normalize to bare lowercase hex. */\nfunction normalizeChecksum(raw: string | null): string | null {\n if (!raw) return null;\n const inner = raw.startsWith('<') && raw.endsWith('>') ? raw.slice(1, -1) : raw;\n return /^[0-9a-fA-F]+$/.test(inner) ? inner.toLowerCase() : raw;\n}\n","import type { FileAttachmentIcon, NoteIcon } from '@embedpdf/engine-core/runtime';\n\n/**\n * `/Name` icon ↔ `FPDF_ANNOT_NAME` enum code mapping for text and\n * file-attachment annotations (`EPDFAnnot_SetName` / `EPDFAnnot_GetName`).\n * Codes mirror the `FPDF_ANNOT_NAME` enum in `public/fpdf_annot.h` —\n * same pattern as `stampName.ts` (whose stamp block starts at 13, right\n * after these) keeping engine-core PDFium-free.\n */\n\nexport const NOTE_ICON_TO_CODE: Readonly<Record<NoteIcon, number>> = Object.freeze({\n comment: 0,\n key: 1,\n note: 2,\n help: 3,\n 'new-paragraph': 4,\n paragraph: 5,\n insert: 6,\n});\n\nexport const NOTE_CODE_TO_ICON: Readonly<Record<number, NoteIcon>> = Object.freeze(\n Object.fromEntries(\n Object.entries(NOTE_ICON_TO_CODE).map(([icon, code]) => [code, icon as NoteIcon]),\n ),\n);\n\nexport const FILE_ICON_TO_CODE: Readonly<Record<FileAttachmentIcon, number>> = Object.freeze({\n graph: 7,\n 'push-pin': 8,\n paperclip: 9,\n tag: 10,\n});\n\nexport const FILE_CODE_TO_ICON: Readonly<Record<number, FileAttachmentIcon>> = Object.freeze(\n Object.fromEntries(\n Object.entries(FILE_ICON_TO_CODE).map(([icon, code]) => [code, icon as FileAttachmentIcon]),\n ),\n);\n","import type {\n AnnotationBase,\n AttachmentFileInfo,\n Color,\n FileAttachmentAnnotationDTO,\n FileAttachmentIcon,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAttachmentFileInfo } from '../../../attachments/internal/attachmentPrimitives';\nimport { FILE_CODE_TO_ICON } from '../annotationIcon';\nimport { readAnnotColor, readAnnotOpacity } from './annotationReadPrimitives';\n\n/** Default `/C` — matches the generator's default icon fill and the writer default. */\nconst DEFAULT_FILE_ATTACHMENT_COLOR: Color = { r: 255, g: 255, b: 0 };\n\n/** An absent or foreign `/Name` reads as 'push-pin' (ISO 32000 §12.5.6.15 default). */\nconst DEFAULT_FILE_ATTACHMENT_ICON: FileAttachmentIcon = 'push-pin';\n\n/**\n * FileAttachment DTO: base + icon presentation + the attached file's\n * METADATA (bytes are downloaded explicitly via\n * `PageAnnotationsService.downloadFile`). A malformed annotation without\n * a readable `/FS` filespec still reads — `file.name` is `''` and the\n * download call reports the precise error.\n */\nexport function readFileAttachment(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): FileAttachmentAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...DEFAULT_FILE_ATTACHMENT_COLOR };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const icon = FILE_CODE_TO_ICON[fn.EPDFAnnot_GetName(annotPtr)] ?? DEFAULT_FILE_ATTACHMENT_ICON;\n\n const attachmentPtr = fn.FPDFAnnot_GetFileAttachment(annotPtr);\n const file: AttachmentFileInfo = attachmentPtr\n ? readAttachmentFileInfo(fn, mem, attachmentPtr)\n : { name: '' };\n\n return {\n ...base,\n subtype: 'file-attachment',\n icon,\n file,\n color,\n opacity,\n };\n}\n","/**\n * `FPDFANNOT_COLORTYPE` enum codes from `public/fpdf_annot.h`. Shared by\n * the annotation read/write primitives and the shape reader/writer so the\n * color-selector magic numbers live in exactly one place.\n *\n * Color=0 (the stroke/fill `/C`)\n * InteriorColor=1 (the `/IC` of square/circle/polygon)\n * OverlayColor=2 (the redaction overlay)\n * TextColor=3 (the free-text `/DA` color)\n */\nexport const FPDFANNOT_COLORTYPE = {\n Color: 0,\n InteriorColor: 1,\n OverlayColor: 2,\n TextColor: 3,\n} as const;\n\nexport type AnnotationColorType = (typeof FPDFANNOT_COLORTYPE)[keyof typeof FPDFANNOT_COLORTYPE];\n","import type { FreeTextIntent } from '@embedpdf/engine-core/runtime';\n\n/**\n * Free-text `/IT` intent names (ISO 32000 §12.5.6.6) mapped to the\n * wire-stable `FreeTextIntent` strings. Kept in engine-services so\n * engine-core stays PDFium-free.\n *\n * FreeText -> 'free-text' (plain text box)\n * FreeTextCallout -> 'free-text-callout' (with /CL leader line)\n *\n * `FreeTextTypeWriter` (a typewriter variant) round-trips as the plain\n * `'free-text'` intent — we don't author it.\n */\nconst IT_FREE_TEXT = 'FreeText';\nconst IT_FREE_TEXT_CALLOUT = 'FreeTextCallout';\n\nexport function freeTextIntentToName(intent: FreeTextIntent): string {\n return intent === 'free-text-callout' ? IT_FREE_TEXT_CALLOUT : IT_FREE_TEXT;\n}\n\nexport function freeTextIntentFromName(name: string | null): FreeTextIntent {\n return name === IT_FREE_TEXT_CALLOUT ? 'free-text-callout' : 'free-text';\n}\n","import type { FreeTextFont, StandardFont } from '@embedpdf/engine-core/runtime';\n\n/**\n * `FPDF_STANDARD_FONT` enum codes (the 14 standard PDF fonts) mapped to the\n * wire-stable kebab-case `StandardFont` strings. We keep this PDFium-specific\n * mapping in engine-services so engine-core stays free of any PDFium\n * dependency (mirrors `lineEnding.ts` / `shapeBorderStyle.ts`).\n *\n * Courier=0, Courier-Bold=1, Courier-BoldOblique=2, Courier-Oblique=3,\n * Helvetica=4, Helvetica-Bold=5, Helvetica-BoldOblique=6,\n * Helvetica-Oblique=7, Times-Roman=8, Times-Bold=9, Times-BoldItalic=10,\n * Times-Italic=11, Symbol=12, ZapfDingbats=13\n */\nconst FONT_TO_CODE: Record<StandardFont, number> = {\n courier: 0,\n 'courier-bold': 1,\n 'courier-bold-oblique': 2,\n 'courier-oblique': 3,\n helvetica: 4,\n 'helvetica-bold': 5,\n 'helvetica-bold-oblique': 6,\n 'helvetica-oblique': 7,\n 'times-roman': 8,\n 'times-bold': 9,\n 'times-bold-italic': 10,\n 'times-italic': 11,\n symbol: 12,\n 'zapf-dingbats': 13,\n};\n\nconst CODE_TO_FONT: Record<number, StandardFont> = Object.fromEntries(\n Object.entries(FONT_TO_CODE).map(([font, code]) => [code, font as StandardFont]),\n) as Record<number, StandardFont>;\n\n/** Default when a `/DA` font is missing or unrecognised. */\nexport const DEFAULT_STANDARD_FONT: StandardFont = 'helvetica';\n\nexport function standardFontToCode(font: StandardFont): number {\n return FONT_TO_CODE[font] ?? FONT_TO_CODE[DEFAULT_STANDARD_FONT];\n}\n\n/**\n * Narrow a FreeText `fontFamily` to one of the 14 standard fonts. A `false`\n * result means the value is a registered-font `key`. The standard names are\n * therefore reserved — a registered font keyed `'helvetica'` resolves as the\n * standard font.\n */\nexport function isStandardFont(font: FreeTextFont): font is StandardFont {\n return Object.prototype.hasOwnProperty.call(FONT_TO_CODE, font);\n}\n\nexport function standardFontFromCode(code: number): StandardFont {\n return CODE_TO_FONT[code] ?? DEFAULT_STANDARD_FONT;\n}\n","import type { TextAlignment } from '@embedpdf/engine-core/runtime';\n\n/**\n * `/Q` quadding codes (ISO 32000 §12.7.3.3) mapped to the wire-stable\n * `TextAlignment` strings. Kept in engine-services so engine-core stays\n * PDFium-free (mirrors `lineEnding.ts`).\n *\n * Left=0, Center=1, Right=2\n */\nconst Q_LEFT = 0;\nconst Q_CENTER = 1;\nconst Q_RIGHT = 2;\n\nexport function textAlignmentToCode(align: TextAlignment): number {\n switch (align) {\n case 'center':\n return Q_CENTER;\n case 'right':\n return Q_RIGHT;\n case 'left':\n default:\n return Q_LEFT;\n }\n}\n\nexport function textAlignmentFromCode(code: number): TextAlignment {\n switch (code) {\n case Q_CENTER:\n return 'center';\n case Q_RIGHT:\n return 'right';\n case Q_LEFT:\n default:\n return 'left';\n }\n}\n","import type { AnnotationBorderStyle } from '@embedpdf/engine-core/runtime';\n\n/**\n * `FPDF_ANNOT_BORDER_STYLE` enum codes from `public/fpdf_annot.h`. We keep\n * this PDFium-specific mapping in engine-services so engine-core stays free\n * of any PDFium dependency (mirrors `PDF_SUBTYPE_TO_CODE`).\n *\n * UNKNOWN=0, SOLID=1, DASHED=2, BEVELED=3, INSET=4, UNDERLINE=5, CLOUDY=6\n *\n * The wire-stable `AnnotationBorderStyle` union covers the four styles a\n * shape annotation realistically authors; cloudy borders are surfaced\n * separately via `cloudyIntensity` (the `/BE` border effect).\n */\nconst BS_SOLID = 1;\nconst BS_DASHED = 2;\nconst BS_BEVELED = 3;\nconst BS_INSET = 4;\n\nexport function borderStyleToCode(style: AnnotationBorderStyle): number {\n switch (style) {\n case 'dashed':\n return BS_DASHED;\n case 'beveled':\n return BS_BEVELED;\n case 'inset':\n return BS_INSET;\n case 'solid':\n default:\n return BS_SOLID;\n }\n}\n\nexport function borderStyleFromCode(code: number): AnnotationBorderStyle {\n switch (code) {\n case BS_DASHED:\n return 'dashed';\n case BS_BEVELED:\n return 'beveled';\n case BS_INSET:\n return 'inset';\n case BS_SOLID:\n default:\n return 'solid';\n }\n}\n","import type {\n AnnotationBorderStyle,\n Color,\n FilledStyleFields,\n GeometryStyleFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { borderStyleFromCode } from '../shapeBorderStyle';\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readBorderDashPattern,\n readBorderStyle,\n} from './annotationReadPrimitives';\n\n/**\n * Default `/C` colour when an annotation has none. Matches the v2 engine\n * (circle/square/polygon/polyline/line/ink all default red).\n */\nconst DEFAULT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Effective `/BS` or legacy `/Border` fields shared by bordered kinds. */\nexport interface BorderFields {\n strokeWidth: number;\n borderStyle: AnnotationBorderStyle;\n dashArray?: number[];\n}\n\n/**\n * Shared reader for the effective border (style + width + dash), resolving\n * `/BS`, legacy `/Border`, and the ISO defaults. The border-only slice of\n * {@link readGeometryStyleExtras}, reused by the free-text box border (which\n * reads `/C` and `/DA` itself).\n */\nexport function readBorderFields(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): BorderFields {\n const { styleCode, width } = readBorderStyle(fn, mem, annotPtr);\n const dashArray = readBorderDashPattern(fn, mem, annotPtr);\n return {\n strokeWidth: width,\n borderStyle: borderStyleFromCode(styleCode),\n ...(dashArray.length > 0 ? { dashArray } : {}),\n };\n}\n\n/**\n * Shared reader for the geometry styling (`/C`, `/CA`, border, dash) — the\n * no-fill layer shared by ink and the filled families. Family readers layer\n * their own geometry + extras on top; filled families add `/IC` via\n * {@link readFilledStyleExtras}.\n */\nexport function readGeometryStyleExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): GeometryStyleFields {\n const color = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.Color) ?? {\n ...DEFAULT_COLOR,\n };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n\n return {\n color,\n opacity,\n ...readBorderFields(fn, mem, annotPtr),\n };\n}\n\n/**\n * Shared reader for the full stroke/fill styling (geometry styling + `/IC`).\n * Reused by every filled family (shape/vertex/line); each layers its own\n * geometry + extras on top.\n */\nexport function readFilledStyleExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): FilledStyleFields {\n const interiorColor = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n return {\n ...readGeometryStyleExtras(fn, mem, annotPtr),\n interiorColor: interiorColor ?? null,\n };\n}\n","import type {\n AnnotationBase,\n CalloutLine,\n Color,\n FreeTextAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { freeTextIntentFromName } from '../freeTextIntent';\nimport { standardFontFromCode, DEFAULT_STANDARD_FONT } from '../standardFont';\nimport { textAlignmentFromCode } from '../textAlignment';\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readCalloutLine,\n readDefaultAppearance,\n readIntent,\n readLineEndings,\n readRectangleDifferences,\n readTextAlignment,\n} from './annotationReadPrimitives';\nimport { readBorderFields } from './readStyle';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\n\n/** Default `/DA` colour (black) when an annotation has no default appearance. */\nconst DEFAULT_FREETEXT_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/** Default font size when `/DA` has none (or an unusable 0). */\nconst DEFAULT_FONT_SIZE = 12;\n\nfunction colorsEqual(a: Color, b: Color): boolean {\n return a.r === b.r && a.g === b.g && a.b === b.b;\n}\n\nexport function readFreeText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): FreeTextAnnotationDTO {\n const da = readDefaultAppearance(fn, mem, annotPtr);\n const color = da?.color ?? { ...DEFAULT_FREETEXT_COLOR };\n const fontFamily = da ? standardFontFromCode(da.fontCode) : DEFAULT_STANDARD_FONT;\n const fontSize = da && da.fontSize > 0 ? da.fontSize : DEFAULT_FONT_SIZE;\n\n // `TextColor` overrides text only; surface it as `fontColor` solely when it\n // is present AND differs from the `/DA` colour (otherwise text follows `color`).\n const textColor = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.TextColor);\n const fontColor = textColor && !colorsEqual(textColor, color) ? textColor : undefined;\n\n // For free text `/C` (color type 0) is the box background, not a stroke.\n const background = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.Color);\n\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n\n const textAlign = textAlignmentFromCode(readTextAlignment(fn, annotPtr));\n const intent = freeTextIntentFromName(readIntent(fn, mem, annotPtr));\n\n const points = readCalloutLine(fn, mem, annotPtr);\n const calloutLine: CalloutLine | undefined =\n points.length === 2\n ? [points[0]!, points[1]!]\n : points.length === 3\n ? [points[0]!, points[1]!, points[2]!]\n : undefined;\n const leaderEnd = readLineEndings(fn, mem, annotPtr).end;\n\n const rd = readRectangleDifferences(fn, mem, annotPtr);\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n\n return {\n ...base,\n subtype: 'free-text',\n intent,\n fontFamily,\n fontSize,\n textAlign,\n color,\n ...(fontColor !== undefined ? { fontColor } : {}),\n interiorColor: background ?? null,\n opacity,\n ...readBorderFields(fn, mem, annotPtr),\n rectDifferences: rd,\n ...(calloutLine !== undefined ? { calloutLine } : {}),\n ...(calloutLine !== undefined && leaderEnd !== 'none' ? { lineEnding: leaderEnd } : {}),\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect ? { unrotatedRect } : {}),\n };\n}\n","import type { InkIntent } from '@embedpdf/engine-core/runtime';\n\nexport function inkIntentToName(intent: InkIntent): string {\n switch (intent) {\n case 'ink-highlight':\n return 'InkHighlight';\n }\n}\n\nexport function inkIntentFromName(name: string | null): InkIntent | null {\n switch (name) {\n case 'InkHighlight':\n return 'ink-highlight';\n default:\n return null;\n }\n}\n","import type { AnnotationBase, InkAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readInkList, readIntent } from './annotationReadPrimitives';\nimport { readGeometryStyleExtras } from './readStyle';\nimport { readAnnotationRotation } from './readAnnotationTransformMetadata';\nimport { inkIntentFromName } from '../inkIntent';\n\nexport function readInk(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): InkAnnotationDTO {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const intent = inkIntentFromName(readIntent(fn, mem, annotPtr));\n return {\n ...base,\n subtype: 'ink',\n ...readGeometryStyleExtras(fn, mem, annotPtr),\n intent,\n inkList: readInkList(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n };\n}\n","import type { AnnotationBase, LineAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readLine as readLinePoints, readLineEndings } from './annotationReadPrimitives';\nimport { readFilledStyleExtras } from './readStyle';\nimport { readAnnotationRotation } from './readAnnotationTransformMetadata';\n\n/** Fallback `/L` when the annotation has no line geometry. */\nconst ZERO_LINE = { start: { x: 0, y: 0 }, end: { x: 0, y: 0 } };\n\nexport function readLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): LineAnnotationDTO {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n return {\n ...base,\n subtype: 'line',\n ...readFilledStyleExtras(fn, mem, annotPtr),\n linePoints: readLinePoints(fn, mem, annotPtr) ?? ZERO_LINE,\n lineEndings: readLineEndings(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n };\n}\n","import type {\n AnnotationBase,\n LinkAnnotationDTO,\n PdfActionTree,\n PdfLinkTarget,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readDestination } from '../../../destinations/readDestination';\nimport type { AnnotationReadContext } from './annotationReadContext';\n\n/**\n * Link reader: rect/flags/relationship ride the base (a link grouped to an\n * annotation is plain `inReplyTo` + `replyType: 'group'`); this module only\n * materialises the normalized target.\n *\n * ONE truth, one projection: the target is a pure function of the SAME\n * payload-carrying action tree the scripting plane reads\n * (`base.actions.activate`) — no second native read exists any more, so the\n * two action-shaped surfaces cannot drift by construction.\n *\n * `/A` precedence, pinned: an activate action that exists but cannot be\n * executed (an `incomplete` tree, a degraded/unreadable root) projects\n * `unsupported` — a broken action is a dead link, never an invitation to\n * guess. The direct `/Dest` (which is data, not an action) is consulted\n * ONLY when no `/A` exists at all.\n */\nexport function readLink(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n _rawSubtypeCode: number,\n ctx: AnnotationReadContext,\n): LinkAnnotationDTO {\n return { ...base, subtype: 'link', target: readLinkTarget(fn, mem, annotPtr, base, ctx) };\n}\n\n/**\n * Project the navigation view from a payload-carrying activate tree. Pure —\n * shared with any consumer that wants the root-level navigation reading of a\n * tree (the link plugin's no-actions-plugin fallback uses the same law).\n */\nexport function linkTargetFromActionTree(tree: PdfActionTree): PdfLinkTarget | null {\n // The law, enforced at the projection too: never execute — not even\n // navigate the root of — a tree marked incomplete.\n if (tree.incomplete) return { kind: 'unsupported' };\n const root = tree.root;\n if (!root) return { kind: 'unsupported' };\n switch (root.type) {\n case 'goto':\n return { kind: 'goto', destination: root.destination };\n case 'uri':\n return { kind: 'uri', uri: root.uri };\n // Reported, never followed/executed (and never writable — see the DTO).\n case 'goto-remote':\n return { kind: 'goto-remote', file: root.filePath };\n case 'launch':\n return { kind: 'launch', path: root.filePath };\n case 'javascript':\n // No script payload here by design: the text rides the action tree —\n // the scripting plane's single home.\n return { kind: 'javascript' };\n case 'named':\n return { kind: 'named', name: root.name };\n default:\n return { kind: 'unsupported' };\n }\n}\n\nfunction readLinkTarget(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n ctx: AnnotationReadContext,\n): PdfLinkTarget | null {\n const activate = base.actions?.activate;\n if (activate) return linkTargetFromActionTree(activate);\n\n // No /A at all → the direct `/Dest`, normalized onto `goto`.\n const linkPtr = fn.FPDFAnnot_GetLink(annotPtr);\n if (!linkPtr) return null;\n const destPtr = fn.FPDFLink_GetDest(ctx.docPtr, linkPtr);\n if (!destPtr) return null; // neither /A nor /Dest: a dead link, reported as-is\n const destination = readDestination(fn, mem, ctx.docPtr, destPtr);\n return destination ? { kind: 'goto', destination } : { kind: 'unsupported' };\n}\n","import type { AnnotationBase, Color, RedactAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { DEFAULT_STANDARD_FONT, standardFontFromCode } from '../standardFont';\nimport { textAlignmentFromCode } from '../textAlignment';\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readDefaultAppearance,\n readOverlayText,\n readOverlayTextRepeat,\n readQuadPoints,\n readTextAlignment,\n} from './annotationReadPrimitives';\n\n/** Default `/C` marking outline (red) — the redaction marking convention and\n * the AP generator's default. */\nconst DEFAULT_REDACT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Default label colour (black) when a redaction carries no `/DA`. */\nconst DEFAULT_LABEL_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/** Default label size when there is no `/DA`. When a `/DA` IS present its\n * size is kept verbatim — including `0`, which means auto-fit for a\n * redaction label (unlike free text, which normalizes 0 away). */\nconst DEFAULT_FONT_SIZE = 12;\n\nexport function readRedact(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): RedactAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.Color) ?? {\n ...DEFAULT_REDACT_COLOR,\n };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const interiorColor =\n readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor) ?? null;\n\n const da = readDefaultAppearance(fn, mem, annotPtr);\n const fontFamily = da ? standardFontFromCode(da.fontCode) : DEFAULT_STANDARD_FONT;\n const fontSize = da ? da.fontSize : DEFAULT_FONT_SIZE;\n const fontColor = da?.color ?? { ...DEFAULT_LABEL_COLOR };\n\n return {\n ...base,\n subtype: 'redact',\n quadPoints: readQuadPoints(fn, mem, annotPtr),\n color,\n opacity,\n interiorColor,\n overlayText: readOverlayText(fn, mem, annotPtr),\n repeat: readOverlayTextRepeat(fn, annotPtr),\n fontFamily,\n fontSize,\n fontColor,\n textAlign: textAlignmentFromCode(readTextAlignment(fn, annotPtr)),\n };\n}\n","import type {\n AnnotationBase,\n CircleAnnotationDTO,\n ShapeAnnotationFields,\n SquareAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readBorderEffect, readRectangleDifferences } from './annotationReadPrimitives';\nimport { readFilledStyleExtras } from './readStyle';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\n\n/**\n * Shared reader for the two shape subtypes. Materialises the common\n * stroke/fill styling plus the shape-only cloudy (`/BE`) and rect-diff\n * (`/RD`) fields; the caller fills in the `subtype` literal. Absent `/BE`\n * and `/RD` read as explicit `null` (never omission), so a read DTO\n * compares structurally against a clearing patch.\n */\nexport function readShapeExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): ShapeAnnotationFields {\n const cloudyIntensity = readBorderEffect(fn, mem, annotPtr);\n const rectDifferences = readRectangleDifferences(fn, mem, annotPtr);\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n\n return {\n ...readFilledStyleExtras(fn, mem, annotPtr),\n cloudyIntensity,\n rectDifferences,\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect ? { unrotatedRect } : {}),\n };\n}\n\nexport function readCircle(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): CircleAnnotationDTO {\n return { ...base, subtype: 'circle', ...readShapeExtras(fn, mem, annotPtr) };\n}\n\nexport function readSquare(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): SquareAnnotationDTO {\n return { ...base, subtype: 'square', ...readShapeExtras(fn, mem, annotPtr) };\n}\n","/**\n * Stamp `/Name` label ↔ `FPDF_ANNOT_NAME` enum code mapping for the\n * `EPDFAnnot_SetName` / `EPDFAnnot_GetName` fork helpers. Labels are the\n * PDF spec / Adobe literal name values (ISO 32000 §12.5.6.12 table 181\n * plus the Adobe SB/SH extended set the fork supports). Codes mirror the\n * `FPDF_ANNOT_NAME` enum in `public/fpdf_annot.h` — same pattern as\n * `lineEnding.ts` keeping engine-core PDFium-free.\n */\n\nexport const STAMP_NAME_TO_CODE: Readonly<Record<string, number>> = Object.freeze({\n Approved: 13,\n Experimental: 14,\n NotApproved: 15,\n AsIs: 16,\n Expired: 17,\n NotForPublicRelease: 18,\n Confidential: 19,\n Final: 20,\n Sold: 21,\n Departmental: 22,\n ForComment: 23,\n TopSecret: 24,\n Draft: 25,\n ForPublicRelease: 26,\n Completed: 27,\n Void: 28,\n PreliminaryResults: 29,\n InformationOnly: 30,\n Rejected: 31,\n Witness: 32,\n InitialHere: 33,\n SignHere: 34,\n Accepted: 35,\n});\n\nexport const STAMP_CODE_TO_NAME: Readonly<Record<number, string>> = Object.freeze(\n Object.fromEntries(Object.entries(STAMP_NAME_TO_CODE).map(([name, code]) => [code, name])),\n);\n\nexport function isKnownStampName(name: string): boolean {\n return Object.prototype.hasOwnProperty.call(STAMP_NAME_TO_CODE, name);\n}\n","import type { AnnotationBase, StampAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { STAMP_CODE_TO_NAME } from '../stampName';\nimport { readAnnotString } from './annotationReadPrimitives';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\n\n/**\n * Stamp DTO: base + `/Name` label + transform metadata. The visual content\n * stays in the `/AP` stream — rendered via `renderAppearanceImages()`,\n * never surfaced as DTO data.\n */\nexport function readStamp(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): StampAnnotationDTO {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n return {\n ...base,\n subtype: 'stamp',\n name: readStampName(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect != null ? { unrotatedRect } : {}),\n };\n}\n\nfunction readStampName(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): string | null {\n const code = fn.EPDFAnnot_GetName(annotPtr);\n const known = STAMP_CODE_TO_NAME[code];\n if (known !== undefined) return known;\n // Custom /Name values fall outside the fork's enum; try the raw entry.\n return readAnnotString(fn, mem, annotPtr, 'Name');\n}\n","/**\n * `/State` + `/StateModel` spelling maps — ISO 32000 §12.5.6.3, Table 174.\n *\n * Known values are wire-stable lowercase (the house vocabulary — same\n * rationale as `AnnotationReplyType` / `AnnotationBorderStyle`); the PDF\n * stores the capitalized Table 174 spellings. Unknown values — custom\n * Acrobat state models and their states — pass through VERBATIM in both\n * directions, so foreign review workflows survive a round trip.\n */\n\nconst STATE_MODEL_TO_PDF: Record<string, string> = {\n review: 'Review',\n marked: 'Marked',\n};\n\nconst STATE_TO_PDF: Record<string, string> = {\n accepted: 'Accepted',\n rejected: 'Rejected',\n cancelled: 'Cancelled',\n completed: 'Completed',\n none: 'None',\n marked: 'Marked',\n unmarked: 'Unmarked',\n};\n\nconst PDF_TO_STATE_MODEL: Record<string, string> = invert(STATE_MODEL_TO_PDF);\nconst PDF_TO_STATE: Record<string, string> = invert(STATE_TO_PDF);\n\nexport function stateModelToPdf(value: string): string {\n return STATE_MODEL_TO_PDF[value] ?? value;\n}\n\nexport function stateModelFromPdf(value: string): string {\n return PDF_TO_STATE_MODEL[value] ?? value;\n}\n\nexport function stateToPdf(value: string): string {\n return STATE_TO_PDF[value] ?? value;\n}\n\nexport function stateFromPdf(value: string): string {\n return PDF_TO_STATE[value] ?? value;\n}\n\nfunction invert(map: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(map).map(([wire, pdf]) => [pdf, wire]));\n}\n","import type {\n AnnotationBase,\n Color,\n NoteIcon,\n TextAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { NOTE_CODE_TO_ICON } from '../annotationIcon';\nimport { stateFromPdf, stateModelFromPdf } from '../annotationState';\nimport { readAnnotColor, readAnnotOpacity, readAnnotString } from './annotationReadPrimitives';\n\n/** Default `/C` — matches the generator's yellow note fill and the writer default. */\nconst DEFAULT_NOTE_COLOR: Color = { r: 255, g: 255, b: 0 };\n\n/** An absent or foreign `/Name` reads as 'note' (ISO 32000 §12.5.6.4 default). */\nconst DEFAULT_NOTE_ICON: NoteIcon = 'note';\n\nexport function readText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): TextAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...DEFAULT_NOTE_COLOR };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const icon = NOTE_CODE_TO_ICON[fn.EPDFAnnot_GetName(annotPtr)] ?? DEFAULT_NOTE_ICON;\n // /State + /StateModel (ISO 32000 §12.5.6.3): faithful read — `null` iff\n // the key is absent. Known Table 174 spellings normalize to the lowercase\n // wire vocabulary; custom state models pass through verbatim. ISO\n // defaulting (a model with no explicit state) is a composer concern.\n const stateRaw = readAnnotString(fn, mem, annotPtr, 'State');\n const stateModelRaw = readAnnotString(fn, mem, annotPtr, 'StateModel');\n\n return {\n ...base,\n subtype: 'text',\n icon,\n color,\n opacity,\n state: stateRaw === null ? null : stateFromPdf(stateRaw),\n stateModel: stateModelRaw === null ? null : stateModelFromPdf(stateModelRaw),\n };\n}\n","import type {\n AnnotationBase,\n Color,\n HighlightAnnotationDTO,\n PdfQuad,\n SquigglyAnnotationDTO,\n StrikeoutAnnotationDTO,\n UnderlineAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readIntent,\n readQuadPoints,\n} from './annotationReadPrimitives';\nimport { strikeoutIntentFromName } from '../textEditIntent';\n\nconst DEFAULT_HIGHLIGHT_COLOR: Color = { r: 255, g: 255, b: 0 };\nconst DEFAULT_TEXT_MARKUP_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/**\n * Shared reader for the four text-markup subtypes. Wires color, opacity,\n * and quadPoints; the caller fills in the `subtype` literal so the\n * result matches the requested DTO shape.\n */\nexport function readTextMarkupExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n fallbackColor: Color = DEFAULT_TEXT_MARKUP_COLOR,\n): {\n color: Color;\n opacity: number;\n quadPoints: PdfQuad[];\n} {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...fallbackColor };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const quadPoints = readQuadPoints(fn, mem, annotPtr);\n return { color, opacity, quadPoints };\n}\n\nexport function readHighlight(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): HighlightAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr, DEFAULT_HIGHLIGHT_COLOR);\n return { ...base, subtype: 'highlight', ...extras };\n}\n\nexport function readUnderline(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): UnderlineAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr);\n return { ...base, subtype: 'underline', ...extras };\n}\n\nexport function readSquiggly(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): SquigglyAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr);\n return { ...base, subtype: 'squiggly', ...extras };\n}\n\nexport function readStrikeout(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): StrikeoutAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr);\n const intent = strikeoutIntentFromName(readIntent(fn, mem, annotPtr));\n return { ...base, subtype: 'strikeout', intent, ...extras };\n}\n","import type { AnnotationBase, UnsupportedAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotString } from './annotationReadPrimitives';\n\n/**\n * Forward-compat fallback. Captures the raw subtype code (and best-effort\n * subtype name from the dict) so debugging information survives across\n * the wire even when no per-subtype reader has been wired yet.\n */\nexport function readUnsupported(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n rawSubtypeCode: number,\n): UnsupportedAnnotationDTO {\n const rawSubtypeName = readAnnotString(fn, mem, annotPtr, 'Subtype');\n return {\n ...base,\n subtype: 'unsupported',\n rawSubtypeCode,\n rawSubtypeName,\n };\n}\n","import type {\n AnnotationBase,\n PolygonAnnotationDTO,\n PolylineAnnotationDTO,\n VertexAnnotationFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readBorderEffect, readLineEndings, readVertices } from './annotationReadPrimitives';\nimport { readFilledStyleExtras } from './readStyle';\nimport { readAnnotationRotation } from './readAnnotationTransformMetadata';\n\n/**\n * Shared reader for the two vertex subtypes (polygon/polyline). Reads the\n * common stroke/fill styling plus the `/Vertices` point list; each caller\n * layers its own subtype-specific extras (polygon: cloudy border; polyline:\n * line endings) and the `subtype` literal.\n */\nexport function readVertexExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): VertexAnnotationFields {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n return {\n ...readFilledStyleExtras(fn, mem, annotPtr),\n vertices: readVertices(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n };\n}\n\nexport function readPolygon(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): PolygonAnnotationDTO {\n return {\n ...base,\n subtype: 'polygon',\n ...readVertexExtras(fn, mem, annotPtr),\n // Absent /BE reads as explicit `null` (never omission), so a read DTO\n // compares structurally against a clearing patch.\n cloudyIntensity: readBorderEffect(fn, mem, annotPtr),\n };\n}\n\nexport function readPolyline(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): PolylineAnnotationDTO {\n return {\n ...base,\n subtype: 'polyline',\n ...readVertexExtras(fn, mem, annotPtr),\n lineEndings: readLineEndings(fn, mem, annotPtr),\n };\n}\n","import type { AnnotationBase, Color, WidgetAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport { type PdfFunctions, type PdfRuntimeMemory, type Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratchN } from '../../../../runtime/memory/scratch';\nimport { readI32 } from '../../../../runtime/memory/structs';\nimport { standardFontFromCode } from '../standardFont';\nimport { textAlignmentFromCode } from '../textAlignment';\nimport { readDefaultAppearance, readTextAlignment } from './annotationReadPrimitives';\nimport { readBorderFields } from './readStyle';\n\nconst MK_BORDER_COLOR = 0; // EPDF_MK_COLOR_BC\nconst MK_BACKGROUND_COLOR = 1; // EPDF_MK_COLOR_BG\nconst I32_BYTES = 4;\n\nfunction readMKColor(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n which: number,\n): Color | null {\n return withScratchN(mem, [I32_BYTES, I32_BYTES, I32_BYTES], ([r, g, b]) => {\n if (!fn.EPDFAnnot_GetMKColor(annotPtr, which, r, g, b)) return null;\n return {\n r: readI32(mem, r) & 0xff,\n g: readI32(mem, g) & 0xff,\n b: readI32(mem, b) & 0xff,\n };\n });\n}\n\n/**\n * Widget-plane read: /MK colours, /BS border, /DA text defaults, /Q, and\n * the field join. Field-plane data (value, options, flags) lives on\n * `doc.forms` — join via `fieldObjectNumber`.\n */\nexport function readWidget(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): WidgetAnnotationDTO {\n const border = readBorderFields(fn, mem, annotPtr);\n const da = readDefaultAppearance(fn, mem, annotPtr);\n return {\n ...base,\n subtype: 'widget',\n color: readMKColor(fn, mem, annotPtr, MK_BORDER_COLOR),\n interiorColor: readMKColor(fn, mem, annotPtr, MK_BACKGROUND_COLOR),\n strokeWidth: border.strokeWidth,\n borderStyle: border.borderStyle,\n ...(da\n ? {\n fontFamily: standardFontFromCode(da.fontCode),\n fontSize: da.fontSize,\n fontColor: da.color,\n }\n : {}),\n textAlign: textAlignmentFromCode(readTextAlignment(fn, annotPtr)),\n // Joined by the caller (joinWidgetFieldNumbers): the /Parent target is\n // a FIELD dictionary, which annotation-plane primitives cannot follow.\n fieldObjectNumber: 0,\n fieldFamily: 'unknown',\n };\n}\n","import type {\n AnnotationBase,\n AnnotationDTO,\n AnnotationSubtype,\n} from '@embedpdf/engine-core/runtime';\nimport { subtypeFromCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AnnotationReadContext } from './annotationReadContext';\nimport { readCaret } from './readCaretAnnotation';\nimport { readFileAttachment } from './readFileAttachmentAnnotation';\nimport { readFreeText } from './readFreeTextAnnotation';\nimport { readInk } from './readInkAnnotation';\nimport { readLine } from './readLineAnnotation';\nimport { readLink } from './readLinkAnnotation';\nimport { readRedact } from './readRedactAnnotation';\nimport { readCircle, readSquare } from './readShapeAnnotation';\nimport { readStamp } from './readStampAnnotation';\nimport { readText } from './readTextAnnotation';\nimport {\n readHighlight,\n readSquiggly,\n readStrikeout,\n readUnderline,\n} from './readTextMarkupAnnotation';\nimport { readUnsupported } from './readUnsupportedAnnotation';\nimport { readPolygon, readPolyline } from './readVertexAnnotation';\nimport { readWidget } from './readWidgetAnnotation';\n\n/**\n * One reader per `AnnotationSubtype`. Each reader produces the DTO type\n * the registry promised: `kinds/<subtype>/dto.ts`. Readers receive the\n * pre-built `AnnotationBase` (identity + flags + rect + dates) so each\n * implementation only has to materialise its own fields, plus the\n * document-scoped `AnnotationReadContext` — most readers ignore it (they\n * work off the `annotPtr` alone); the link reader consumes it.\n *\n * The `unsupported` fallback preserves the raw subtype code so a future\n * reader landing for that subtype can replace it without a wire-format\n * version bump.\n */\nexport type AnnotationSubtypeReader = (\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n rawSubtypeCode: number,\n ctx: AnnotationReadContext,\n) => AnnotationDTO;\n\nconst READER_BY_SUBTYPE: Partial<Record<AnnotationSubtype, AnnotationSubtypeReader>> = {\n highlight: readHighlight,\n underline: readUnderline,\n squiggly: readSquiggly,\n strikeout: readStrikeout,\n circle: readCircle,\n square: readSquare,\n polygon: readPolygon,\n polyline: readPolyline,\n line: readLine,\n link: readLink,\n ink: readInk,\n 'free-text': readFreeText,\n caret: readCaret,\n text: readText,\n stamp: readStamp,\n 'file-attachment': readFileAttachment,\n widget: readWidget,\n redact: readRedact,\n unsupported: readUnsupported,\n};\n\n/**\n * Maps a PDFium subtype code onto the reader that should handle it.\n * Returns the `unsupported` reader for any subtype that doesn't have a\n * dedicated reader yet.\n */\nexport function pickReader(rawSubtypeCode: number): {\n reader: AnnotationSubtypeReader;\n subtype: AnnotationSubtype;\n} {\n const subtype = subtypeFromCode(rawSubtypeCode);\n const reader = READER_BY_SUBTYPE[subtype];\n if (reader) return { reader, subtype };\n return { reader: READER_BY_SUBTYPE.unsupported!, subtype: 'unsupported' };\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../document-session/DocumentSession';\n\ninterface FormModelEntry {\n /** The session mutation sequence the model was built at. */\n seq: number;\n ptr: Ptr;\n}\n\n/**\n * Per-session cache of the native `EPDFForm_LoadModel` snapshot, keyed on\n * the session's mutation sequence.\n *\n * The native model is an immutable, detached snapshot: correct forever,\n * stale after any document mutation. Rebuilding it per call would walk the\n * field tree and sweep every page's /Annots on each read (widget lists on\n * multi-page documents read it constantly); keeping one forever would\n * serve stale values. Version-keying gives exact coherence for free:\n * `DocumentSession.noteMutation()` bumps the sequence on EVERY successful\n * mutation (annotations, pages, metadata, forms — widgets are annotations,\n * so all of them can affect the form model), and the next read rebuilds.\n *\n * The cache also owns the native handle's lifetime: exactly one live model\n * per session, closed before replacement and on session teardown via\n * {@link disposeFormModel}.\n */\nconst cache = new WeakMap<DocumentSession, FormModelEntry>();\n\nexport function acquireFormModel(runtime: PdfRuntimeModule, session: DocumentSession): Ptr {\n const seq = session.mutationSeq();\n const hit = cache.get(session);\n if (hit && hit.seq === seq) {\n return hit.ptr;\n }\n if (hit) {\n runtime.fn.EPDFForm_CloseModel(hit.ptr);\n cache.delete(session);\n }\n const ptr = runtime.fn.EPDFForm_LoadModel(session.requireDocPtr());\n if (ptr === NULL_PTR) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to build form model');\n }\n cache.set(session, { seq, ptr });\n return ptr;\n}\n\n/** Close and forget the session's cached model, if any. */\nexport function disposeFormModel(runtime: PdfRuntimeModule, session: DocumentSession): void {\n const hit = cache.get(session);\n if (!hit) {\n return;\n }\n runtime.fn.EPDFForm_CloseModel(hit.ptr);\n cache.delete(session);\n}\n","import type {\n FormFieldBase,\n FormFieldDTO,\n FormFieldFamily,\n FormFieldOption,\n FormKind,\n FormSnapshot,\n FormWidgetRef,\n ToggleFieldWidget,\n FormValueEntry,\n PdfFieldActions,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readUtf16String, readUtf8String } from '../../../runtime/memory/strings';\nimport { ActionReadBudgetTracker, readActionModel } from '../../actions/ActionModelReader';\n\n// Mirrors EPDF_FORMFIELD_FAMILY_* in public/epdf_form.h.\nexport const FAMILY_BY_CODE: Record<number, FormFieldFamily> = {\n 0: 'unknown',\n 1: 'pushbutton',\n 2: 'checkbox',\n 3: 'radio',\n 4: 'text',\n 5: 'combobox',\n 6: 'listbox',\n 7: 'signature',\n};\n\n// Mirrors EPDF_FORMKIND_* in public/epdf_form.h.\nconst FORM_KIND_BY_CODE: Record<number, FormKind> = {\n 0: 'none',\n 1: 'acroform',\n 2: 'xfa',\n};\n\n// PDF /Ff bits (1-based bit numbers per ISO 32000 Table 226/228/230).\nconst FF_READ_ONLY = 1 << 0;\nconst FF_REQUIRED = 1 << 1;\nconst FF_NO_EXPORT = 1 << 2;\nconst FF_MULTILINE = 1 << 12;\nconst FF_PASSWORD = 1 << 13;\nconst FF_NO_TOGGLE_TO_OFF = 1 << 14;\nconst FF_EDIT = 1 << 18;\nconst FF_MULTI_SELECT = 1 << 21;\nconst FF_COMB = 1 << 24;\nconst FF_RADIOS_IN_UNISON = 1 << 25;\n\nfunction readWide(runtime: PdfRuntimeModule, call: (buf: Ptr, capacity: number) => number): string {\n return readUtf16String(runtime.mem, call) ?? '';\n}\n\nfunction readWideOrNull(\n runtime: PdfRuntimeModule,\n call: (buf: Ptr, capacity: number) => number,\n): string | null {\n return readUtf16String(runtime.mem, call, null);\n}\n\nfunction readToggleWidgets(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n): ToggleFieldWidget[] {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFieldWidgets(model, fieldIndex);\n const widgets: ToggleFieldWidget[] = [];\n for (let w = 0; w < count; w++) {\n widgets.push({\n annotObjectNumber: fn.EPDFForm_GetFieldWidgetObjNum(model, fieldIndex, w),\n pageObjectNumber: fn.EPDFForm_GetFieldWidgetPageObjNum(model, fieldIndex, w),\n onState:\n readUtf8String(runtime.mem, (buf, cap) =>\n fn.EPDFForm_GetFieldWidgetOnState(model, fieldIndex, w, buf, cap),\n ) ?? '',\n exportValue: readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldWidgetExportValue(model, fieldIndex, w, buf, cap),\n ),\n checked: fn.EPDFForm_IsFieldWidgetChecked(model, fieldIndex, w),\n });\n }\n return widgets;\n}\n\nfunction readPlainWidgets(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n): FormWidgetRef[] {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFieldWidgets(model, fieldIndex);\n const widgets: FormWidgetRef[] = [];\n for (let w = 0; w < count; w++) {\n widgets.push({\n annotObjectNumber: fn.EPDFForm_GetFieldWidgetObjNum(model, fieldIndex, w),\n pageObjectNumber: fn.EPDFForm_GetFieldWidgetPageObjNum(model, fieldIndex, w),\n });\n }\n return widgets;\n}\n\nfunction readOptions(runtime: PdfRuntimeModule, model: Ptr, fieldIndex: number): FormFieldOption[] {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFieldOptions(model, fieldIndex);\n const options: FormFieldOption[] = [];\n for (let o = 0; o < count; o++) {\n options.push({\n label: readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldOptionLabel(model, fieldIndex, o, buf, cap),\n ),\n value: readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldOptionValue(model, fieldIndex, o, buf, cap),\n ),\n selected: fn.EPDFForm_IsFieldOptionSelected(model, fieldIndex, o),\n });\n }\n return options;\n}\n\n/** Read one field of the native model into its per-family DTO. */\nexport function readFieldAt(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n docPtr: Ptr,\n actionBudget = new ActionReadBudgetTracker(),\n): FormFieldDTO {\n const { fn } = runtime;\n const fieldObjectNumber = fn.EPDFForm_GetFieldObjNum(model, fieldIndex);\n const name = readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldName(model, fieldIndex, buf, cap),\n );\n const rawFlags = fn.EPDFForm_GetFieldFlags(model, fieldIndex);\n const family = FAMILY_BY_CODE[fn.EPDFForm_GetFieldFamily(model, fieldIndex)] ?? 'unknown';\n const valueEntry = readValueEntry(runtime, model, fieldIndex, false);\n const defaultValueEntry = readValueEntry(runtime, model, fieldIndex, true);\n const actions = readFieldActions(runtime, model, fieldIndex, docPtr, actionBudget);\n\n const base: FormFieldBase = {\n ref:\n fieldObjectNumber > 0 ? { kind: 'objectNumber', fieldObjectNumber } : { kind: 'fqn', name },\n fieldObjectNumber,\n name,\n family,\n origin: fn.EPDFForm_GetFieldOrigin(model, fieldIndex) === 1 ? 'recovered' : 'acroform',\n flags: {\n readOnly: (rawFlags & FF_READ_ONLY) !== 0,\n required: (rawFlags & FF_REQUIRED) !== 0,\n noExport: (rawFlags & FF_NO_EXPORT) !== 0,\n raw: rawFlags,\n },\n alternateName: readWideOrNull(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldAlternateName(model, fieldIndex, buf, cap),\n ),\n mappingName: readWideOrNull(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldMappingName(model, fieldIndex, buf, cap),\n ),\n valueEntry,\n defaultValueEntry,\n ...(actions ? { actions } : {}),\n widgets: [],\n };\n const scalarValue = entryScalar(valueEntry);\n const scalarDefault = entryScalar(defaultValueEntry);\n\n switch (family) {\n case 'text': {\n const maxLen = fn.EPDFForm_GetFieldMaxLen(model, fieldIndex);\n return {\n ...base,\n family,\n value: scalarValue,\n defaultValue: scalarDefault,\n maxLength: maxLen > 0 ? maxLen : null,\n multiline: (rawFlags & FF_MULTILINE) !== 0,\n password: (rawFlags & FF_PASSWORD) !== 0,\n comb: (rawFlags & FF_COMB) !== 0,\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n case 'checkbox': {\n const widgets = readToggleWidgets(runtime, model, fieldIndex);\n return {\n ...base,\n family,\n checked: widgets.some((w) => w.checked),\n exportValue: widgets[0]?.exportValue ?? 'Yes',\n widgets,\n };\n }\n case 'radio': {\n const widgets = readToggleWidgets(runtime, model, fieldIndex);\n return {\n ...base,\n family,\n value: widgets.find((widget) => widget.checked)?.exportValue ?? 'Off',\n radiosInUnison: (rawFlags & FF_RADIOS_IN_UNISON) !== 0,\n noToggleToOff: (rawFlags & FF_NO_TOGGLE_TO_OFF) !== 0,\n widgets,\n };\n }\n case 'combobox': {\n return {\n ...base,\n family,\n value: scalarValue,\n defaultValue: scalarDefault,\n edit: (rawFlags & FF_EDIT) !== 0,\n options: readOptions(runtime, model, fieldIndex),\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n case 'listbox': {\n const options = readOptions(runtime, model, fieldIndex);\n return {\n ...base,\n family,\n selectedValues: options.filter((o) => o.selected).map((o) => o.value),\n multiSelect: (rawFlags & FF_MULTI_SELECT) !== 0,\n options,\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n case 'pushbutton':\n case 'signature': {\n return { ...base, family, widgets: readPlainWidgets(runtime, model, fieldIndex) };\n }\n default: {\n return {\n ...base,\n family: 'unknown',\n rawValue:\n valueEntry.kind === 'array' ? valueEntry.values.join(',') : entryScalar(valueEntry),\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n }\n}\n\n/** Read the whole native model into a detached {@link FormSnapshot}. */\nexport function readFormSnapshot(runtime: PdfRuntimeModule, model: Ptr, docPtr: Ptr): FormSnapshot {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFields(model);\n const fields: FormFieldDTO[] = [];\n const actionBudget = new ActionReadBudgetTracker();\n for (let i = 0; i < count; i++) {\n fields.push(readFieldAt(runtime, model, i, docPtr, actionBudget));\n }\n const calculationOrder: FormSnapshot['calculationOrder'] = [];\n const calculationCount = fn.EPDFForm_CountCalculationOrder(model);\n for (let index = 0; index < calculationCount; index++) {\n const fieldIndex = fn.EPDFForm_GetCalculationOrderFieldIndex(model, index);\n calculationOrder.push(\n fieldIndex >= 0 && fieldIndex < fields.length ? fields[fieldIndex].ref : null,\n );\n }\n return {\n formKind: FORM_KIND_BY_CODE[fn.EPDFForm_GetFormKind(model)] ?? 'none',\n needsAppearances: fn.EPDFForm_GetNeedAppearances(model),\n fields,\n calculationOrder,\n };\n}\n\nfunction readValueEntry(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n isDefault: boolean,\n): FormValueEntry {\n const { fn } = runtime;\n const kind = isDefault\n ? fn.EPDFForm_GetFieldDefaultValueKind(model, fieldIndex)\n : fn.EPDFForm_GetFieldValueKind(model, fieldIndex);\n if (kind === 0) return { kind: 'none' };\n if (kind === 3) return { kind: 'unsupported' };\n if (kind !== 1 && kind !== 2) return { kind: 'unsupported' };\n const count = isDefault\n ? fn.EPDFForm_CountFieldDefaultValues(model, fieldIndex)\n : fn.EPDFForm_CountFieldValues(model, fieldIndex);\n const values: string[] = [];\n for (let index = 0; index < count; index++) {\n values.push(\n readWide(runtime, (buf, capacity) =>\n isDefault\n ? fn.EPDFForm_GetFieldDefaultValueAt(model, fieldIndex, index, buf, capacity)\n : fn.EPDFForm_GetFieldValueAt(model, fieldIndex, index, buf, capacity),\n ),\n );\n }\n return kind === 1 ? { kind: 'scalar', value: values[0] ?? '' } : { kind: 'array', values };\n}\n\nfunction entryScalar(entry: FormValueEntry): string {\n if (entry.kind === 'scalar') return entry.value;\n if (entry.kind === 'array') return entry.values[0] ?? '';\n return '';\n}\n\nfunction readFieldActions(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n docPtr: Ptr,\n budget: ActionReadBudgetTracker,\n): PdfFieldActions | undefined {\n const { fn, mem } = runtime;\n const entries = [\n ['keystroke', 0],\n ['format', 1],\n ['validate', 2],\n ['calculate', 3],\n ] as const;\n const actions: PdfFieldActions = {};\n for (const [key, event] of entries) {\n const action = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFForm_GetFieldActionModel(model, fieldIndex, event),\n budget,\n );\n if (action) actions[key] = action;\n }\n return Object.keys(actions).length > 0 ? actions : undefined;\n}\n","import type { AnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\n// Cross-feature read into the forms model cache: the widget<->field join is\n// form-tree knowledge, and the version-keyed cache makes it O(1) between\n// mutations. No module cycle: the cache imports nothing from annotations.\nimport { acquireFormModel } from '../../../forms/internal/formModelCache';\nimport { FAMILY_BY_CODE } from '../../../forms/internal/readFormSnapshot';\n\n/**\n * Resolve the owning field's object number for a widget annotation, or 0\n * when unattached. (The /Parent of a widget is a FIELD dictionary - not an\n * annotation - so FPDFAnnot_GetLinkedAnnot cannot follow it; the reconciled\n * form model is the authoritative join.)\n */\nexport function resolveWidgetFieldObjectNumber(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n annotObjectNumber: number,\n): number {\n if (annotObjectNumber <= 0) return 0;\n const model = acquireFormModel(runtime, session);\n const fieldIndex = runtime.fn.EPDFForm_GetFieldIndexForWidget(model, annotObjectNumber);\n if (fieldIndex < 0) return 0;\n return runtime.fn.EPDFForm_GetFieldObjNum(model, fieldIndex);\n}\n\n/** Stamp `fieldObjectNumber` onto every widget DTO in a freshly read list. */\nexport function joinWidgetFieldNumbers(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n annotations: AnnotationDTO[],\n): void {\n for (const annotation of annotations) {\n if (annotation.subtype !== 'widget') continue;\n if (annotation.ref.kind !== 'objectNumber') continue;\n const model = acquireFormModel(runtime, session);\n const fieldIndex = runtime.fn.EPDFForm_GetFieldIndexForWidget(\n model,\n annotation.ref.annotObjectNumber,\n );\n if (fieldIndex < 0) {\n annotation.fieldObjectNumber = 0;\n annotation.fieldFamily = 'unknown';\n continue;\n }\n annotation.fieldObjectNumber = runtime.fn.EPDFForm_GetFieldObjNum(model, fieldIndex);\n annotation.fieldFamily =\n FAMILY_BY_CODE[runtime.fn.EPDFForm_GetFieldFamily(model, fieldIndex)] ?? 'unknown';\n }\n}\n","import type {\n AnnotationIdentityQuality,\n AnnotationRef,\n PageObjectNumber,\n RevisionToken,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotString } from './annotationReadPrimitives';\n\nexport interface AnnotationIdentity {\n ref: AnnotationRef;\n identityQuality: AnnotationIdentityQuality;\n nm: string | null;\n}\n\n/**\n * Decides which `AnnotationRef` form to expose on the wire and the\n * `identityQuality` flag.\n *\n * Order:\n * 1. `EPDFAnnot_GetObjectNumber(annot)` - if `> 0`, use `objectNumber`.\n * Always durable.\n * 2. /NM - if present and non-empty, use `nm`. Always durable.\n * 3. Fallback: `index + revision`. Always weak. The revision must be\n * provided by the caller (sourced from the live `RevisionAuthority`).\n */\nexport function readAnnotationIdentity(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n index: number,\n revision: RevisionToken,\n): AnnotationIdentity {\n const objectNumber = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n const nm = readAnnotString(fn, mem, annotPtr, 'NM');\n\n if (objectNumber > 0) {\n return {\n ref: {\n kind: 'objectNumber',\n pageObjectNumber,\n annotObjectNumber: objectNumber,\n },\n identityQuality: 'durable',\n nm: nm ?? null,\n };\n }\n\n if (nm && nm.length > 0) {\n return {\n ref: { kind: 'nm', pageObjectNumber, nm },\n identityQuality: 'durable',\n nm,\n };\n }\n\n return {\n ref: { kind: 'index', pageObjectNumber, index, revision },\n identityQuality: 'weak',\n nm: nm ?? null,\n };\n}\n","import type { AnnotationReplyType } from '@embedpdf/engine-core/runtime';\n\n/**\n * `/RT` (reply type) codec between the wire-stable {@link AnnotationReplyType}\n * strings and PDFium's `FPDF_ANNOT_REPLY_TYPE` integer codes (see\n * `public/fpdf_annot.h`). Kept in engine-services so engine-core stays\n * PDFium-free.\n *\n * 0 FPDF_ANNOT_RT_UNKNOWN (RT absent / unrecognized)\n * 1 FPDF_ANNOT_RT_REPLY /R — the ISO default when /RT is missing\n * 2 FPDF_ANNOT_RT_GROUP /Group\n */\nexport const RT_UNKNOWN = 0;\nexport const RT_REPLY = 1;\nexport const RT_GROUP = 2;\n\n/**\n * Map a PDFium reply-type code to the wire string, GATED on the presence\n * of `/IRT`. PDFium's `EPDFAnnot_GetReplyType` returns `RT_REPLY` even\n * when there is no `/IRT` (it reports the `/RT` default in isolation), so\n * callers must only invoke this for annotations that actually carry an\n * `/IRT` link. `RT_GROUP` -> `'group'`; everything else -> `'reply'`.\n */\nexport function replyTypeFromCode(code: number): AnnotationReplyType {\n return code === RT_GROUP ? 'group' : 'reply';\n}\n\n/** Map the wire string to the PDFium code written via `EPDFAnnot_SetReplyType`. */\nexport function replyTypeToCode(replyType: AnnotationReplyType): number {\n return replyType === 'group' ? RT_GROUP : RT_REPLY;\n}\n","import type {\n AnnotationRef,\n AnnotationReplyType,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotString } from './annotationReadPrimitives';\nimport { replyTypeFromCode } from '../replyType';\n\nexport interface AnnotationRelationship {\n inReplyTo: AnnotationRef | null;\n replyType: AnnotationReplyType | null;\n}\n\nconst NO_RELATIONSHIP: AnnotationRelationship = { inReplyTo: null, replyType: null };\n\n/**\n * Read the `/IRT` + `/RT` relationship edge of an annotation.\n *\n * `/IRT` is an indirect reference to the parent annotation, which (per ISO\n * 32000 §12.5.6.2) lives on the SAME page — so we surface the parent with\n * the same `pageObjectNumber` and the same identity precedence the rest of\n * the engine uses (objectNumber, then `/NM`). We do NOT fall back to an\n * index ref: an `/IRT` target is by construction an indirect object, so its\n * object number is always available. In the pathological case where neither\n * an object number nor an `/NM` can be read (a malformed direct-object\n * target), we report no relationship rather than an unaddressable parent —\n * keeping the invariant `replyType === null` iff `inReplyTo === null`.\n *\n * `/RT` is read via `EPDFAnnot_GetReplyType`, which returns the `/R` default\n * when `/RT` is absent; we only consult it when `/IRT` is present, so a\n * top-level annotation never spuriously reports `'reply'`.\n */\nexport function readAnnotationRelationship(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n): AnnotationRelationship {\n const parentPtr = fn.FPDFAnnot_GetLinkedAnnot(annotPtr, 'IRT');\n if (!parentPtr) return NO_RELATIONSHIP;\n\n try {\n const inReplyTo = readParentRef(fn, mem, parentPtr, pageObjectNumber);\n if (!inReplyTo) return NO_RELATIONSHIP;\n return { inReplyTo, replyType: replyTypeFromCode(fn.EPDFAnnot_GetReplyType(annotPtr)) };\n } finally {\n fn.FPDFPage_CloseAnnot(parentPtr);\n }\n}\n\nfunction readParentRef(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n parentPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n): AnnotationRef | null {\n const objectNumber = fn.EPDFAnnot_GetObjectNumber(parentPtr);\n if (objectNumber > 0) {\n return { kind: 'objectNumber', pageObjectNumber, annotObjectNumber: objectNumber };\n }\n const nm = readAnnotString(fn, mem, parentPtr, 'NM');\n if (nm && nm.length > 0) {\n return { kind: 'nm', pageObjectNumber, nm };\n }\n return null;\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\n/**\n * Decoded /EMBD_Metadata dictionary as seen from a single annotation.\n *\n * Mirrors the schema written by `writers/annotations/embed-metadata.ts`.\n * Each field is optional because:\n * - older annotations (pre-cloud, or imported from other tools) have no\n * /EMBD_Metadata at all,\n * - the dict may be partially populated (e.g. only UserID, no GroupID),\n * - future schema versions may add or drop fields.\n *\n * Readers tolerate missing fields by returning `undefined`; callers\n * decide how to render the absence (typically \"unknown author\" /\n * \"no group\").\n */\nexport interface EmbedMetadata {\n schemaVersion?: number;\n userId?: string;\n groupId?: string;\n createdBy?: string;\n updatedBy?: string;\n}\n\n/**\n * Read /EMBD_Metadata from an annotation, if present. Returns `null`\n * (not an empty object) when the annotation has no EMBD_Metadata\n * dictionary at all — the caller can distinguish \"no metadata\" from\n * \"metadata with only some fields set\".\n *\n * Uses the same UTF-16LE two-pass read pattern as `readAnnotString` in\n * `./util.ts` so a future change to the underlying memory helpers\n * propagates uniformly.\n */\nexport function readEmbedMetadata(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): EmbedMetadata | null {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) return null;\n\n const schemaVersion = readMetaNumber(fn, mem, annotPtr, 'SchemaVersion');\n const userId = readMetaString(fn, mem, annotPtr, 'UserID');\n const groupId = readMetaString(fn, mem, annotPtr, 'GroupID');\n const createdBy = readMetaString(fn, mem, annotPtr, 'CreatedBy');\n const updatedBy = readMetaString(fn, mem, annotPtr, 'UpdatedBy');\n\n const out: EmbedMetadata = {};\n if (schemaVersion !== undefined) out.schemaVersion = schemaVersion;\n if (userId !== undefined) out.userId = userId;\n if (groupId !== undefined) out.groupId = groupId;\n if (createdBy !== undefined) out.createdBy = createdBy;\n if (updatedBy !== undefined) out.updatedBy = updatedBy;\n return out;\n}\n\nfunction readMetaString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n): string | undefined {\n // Two-pass UTF-16LE read mirroring readAnnotString:\n // pass 1: NULL_PTR + 0 → returns required byte count (incl. null\n // terminator, so an empty string returns 2)\n // pass 2: alloc buf, fill it, decode\n const len = fn.EPDFAnnot_GetEmbedMetadataString(annotPtr, key, NULL_PTR, 0);\n if (len <= 0) return undefined;\n if (len === 2) return '';\n\n const buf = mem.alloc(len);\n try {\n const written = fn.EPDFAnnot_GetEmbedMetadataString(annotPtr, key, buf, len);\n if (written <= 0) return undefined;\n return mem.readU16String(buf);\n } finally {\n mem.free(buf);\n }\n}\n\nfunction readMetaNumber(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n): number | undefined {\n const buf = mem.alloc(4); // float\n try {\n const ok = fn.EPDFAnnot_GetEmbedMetadataNumber(annotPtr, key, buf);\n if (!ok) return undefined;\n return Number(mem.peek(buf, 'f32'));\n } finally {\n mem.free(buf);\n }\n}\n","import type { BlendMode } from '@embedpdf/engine-core/runtime';\n\n/** Explicit wire-domain ↔ PDFium `FPDF_BLENDMODE` mapping. */\nexport function blendModeToCode(mode: BlendMode): number {\n switch (mode) {\n case 'normal':\n return 0;\n case 'multiply':\n return 1;\n case 'screen':\n return 2;\n case 'overlay':\n return 3;\n case 'darken':\n return 4;\n case 'lighten':\n return 5;\n case 'color-dodge':\n return 6;\n case 'color-burn':\n return 7;\n case 'hard-light':\n return 8;\n case 'soft-light':\n return 9;\n case 'difference':\n return 10;\n case 'exclusion':\n return 11;\n case 'hue':\n return 12;\n case 'saturation':\n return 13;\n case 'color':\n return 14;\n case 'luminosity':\n return 15;\n }\n}\n\nexport function blendModeFromCode(code: number): BlendMode {\n switch (code) {\n case 1:\n return 'multiply';\n case 2:\n return 'screen';\n case 3:\n return 'overlay';\n case 4:\n return 'darken';\n case 5:\n return 'lighten';\n case 6:\n return 'color-dodge';\n case 7:\n return 'color-burn';\n case 8:\n return 'hard-light';\n case 9:\n return 'soft-light';\n case 10:\n return 'difference';\n case 11:\n return 'exclusion';\n case 12:\n return 'hue';\n case 13:\n return 'saturation';\n case 14:\n return 'color';\n case 15:\n return 'luminosity';\n default:\n return 'normal';\n }\n}\n","import type {\n AnnotationBase,\n PageObjectNumber,\n RevisionToken,\n PdfAnnotationActions,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotFlags, readAnnotRect, readAnnotString } from './annotationReadPrimitives';\nimport { readAnnotationIdentity } from './readAnnotationIdentity';\nimport { readAnnotationRelationship } from './readAnnotationRelationship';\nimport { readEmbedMetadata } from './readEmbedMetadata';\nimport { blendModeFromCode } from '../blendMode';\nimport { pdfDateToIso } from '../../../../shared/pdf-date';\nimport { ActionReadBudgetTracker, readActionModel } from '../../../actions/ActionModelReader';\n\n/**\n * Reads the wire shell every annotation DTO carries: identity, flags,\n * rect, contents, author, dates. No subtype-specific fields. The\n * per-subtype reader builds its DTO by extending this with its own\n * fields and `subtype: '...'` discriminator.\n */\nexport function readAnnotationBase(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n index: number,\n revision: RevisionToken,\n actionBudget = new ActionReadBudgetTracker(),\n): AnnotationBase {\n const identity = readAnnotationIdentity(fn, mem, annotPtr, pageObjectNumber, index, revision);\n const rect = readAnnotRect(fn, mem, annotPtr);\n const flags = readAnnotFlags(fn, annotPtr);\n const contents = readAnnotString(fn, mem, annotPtr, 'Contents');\n const subject = readAnnotString(fn, mem, annotPtr, 'Subj');\n const author = readAnnotString(fn, mem, annotPtr, 'T');\n const createdRaw = readAnnotString(fn, mem, annotPtr, 'CreationDate');\n const modifiedRaw = readAnnotString(fn, mem, annotPtr, 'M');\n const blendMode = blendModeFromCode(fn.EPDFAnnot_GetBlendMode(annotPtr));\n // EmbedPDF /EMBD_Metadata is optional; absent for legacy or anonymous\n // annotations. We spread the present fields into the DTO so the wire\n // never carries explicit `undefined` keys.\n const embd = readEmbedMetadata(fn, mem, annotPtr);\n const relationship = readAnnotationRelationship(fn, mem, annotPtr, pageObjectNumber);\n const actions = readAnnotationActions(fn, mem, docPtr, annotPtr, actionBudget);\n\n return {\n ref: identity.ref,\n pageObjectNumber,\n index,\n identityQuality: identity.identityQuality,\n nm: identity.nm,\n flags,\n rect,\n contents,\n subject,\n author,\n created: createdRaw ? pdfDateToIso(createdRaw) : null,\n modified: modifiedRaw ? pdfDateToIso(modifiedRaw) : null,\n blendMode,\n inReplyTo: relationship.inReplyTo,\n replyType: relationship.replyType,\n ...(embd?.userId !== undefined ? { userId: embd.userId } : {}),\n ...(embd?.groupId !== undefined ? { groupId: embd.groupId } : {}),\n ...(embd?.createdBy !== undefined ? { createdBy: embd.createdBy } : {}),\n ...(embd?.updatedBy !== undefined ? { updatedBy: embd.updatedBy } : {}),\n ...(actions ? { actions } : {}),\n };\n}\n\nfunction readAnnotationActions(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n annotPtr: Ptr,\n budget: ActionReadBudgetTracker,\n): PdfAnnotationActions | undefined {\n const events = [\n ['activate', 0],\n ['cursorEnter', 1],\n ['cursorExit', 2],\n ['mouseDown', 3],\n ['mouseUp', 4],\n ['focus', 5],\n ['blur', 6],\n ['pageOpen', 7],\n ['pageClose', 8],\n ['pageVisible', 9],\n ['pageInvisible', 10],\n ] as const;\n const actions: PdfAnnotationActions = {};\n for (const [key, event] of events) {\n const action = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFAnnot_GetActionModel(annotPtr, event),\n budget,\n );\n if (action) actions[key] = action;\n }\n return Object.keys(actions).length > 0 ? actions : undefined;\n}\n","import type {\n AnnotationDTO,\n AnnotationListPageSnapshot,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readContextFor } from './annotationReadContext';\nimport { pickReader } from './annotationReaderRegistry';\nimport { joinWidgetFieldNumbers } from './joinWidgetField';\nimport { readAnnotationBase } from './readAnnotationBase';\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../../../shared/abort';\nimport { ActionReadBudgetTracker } from '../../../actions/ActionModelReader';\n\n/**\n * Shared per-page annotation read loop, used by both read paths. The raw\n * path (off `docPtr`, no `pagePtr`) and the full path (off an acquired\n * `pagePtr`) differ only in how they obtain the annotation count and each\n * `annotPtr`; everything after that — per-subtype dispatch, weak-flag\n * accounting, `pageState` decoration — is identical, so it lives here once.\n *\n * `getAnnotPtrAt(i)` returns the annotation handle at index `i`; this loop\n * always closes it via `FPDFPage_CloseAnnot`. The caller owns acquiring and\n * releasing any enclosing `pagePtr`.\n */\nexport function collectPageAnnotations(input: {\n runtime: PdfRuntimeModule;\n session: DocumentSession;\n pageObjectNumber: PageObjectNumber;\n count: number;\n getAnnotPtrAt: (index: number) => Ptr;\n signal: AbortSignal;\n}): AnnotationListPageSnapshot {\n const { runtime, session, pageObjectNumber, count, getAnnotPtrAt, signal } = input;\n const { fn, mem } = runtime;\n\n const annotations: AnnotationDTO[] = [];\n let hasWeak = false;\n const revision = session.pageState(pageObjectNumber).revision;\n const actionBudget = new ActionReadBudgetTracker();\n const readCtx = readContextFor(session);\n\n for (let i = 0; i < count; i++) {\n throwIfAborted(signal);\n const annotPtr = getAnnotPtrAt(i);\n if (!annotPtr) continue;\n try {\n const base = readAnnotationBase(\n fn,\n mem,\n readCtx.docPtr,\n annotPtr,\n pageObjectNumber,\n i,\n revision,\n actionBudget,\n );\n const subtypeCode = fn.FPDFAnnot_GetSubtype(annotPtr);\n const { reader } = pickReader(subtypeCode);\n const dto = reader(fn, mem, annotPtr, base, subtypeCode, readCtx);\n annotations.push(dto);\n if (dto.identityQuality === 'weak') hasWeak = true;\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n joinWidgetFieldNumbers(runtime, session, annotations);\n session.recordWeakFlag(pageObjectNumber, hasWeak);\n return { pageState: session.pageState(pageObjectNumber), annotations };\n}\n","import type { AnnotationListPageSnapshot, PageObjectNumber } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { collectPageAnnotations } from './internal/read/collectPageAnnotations';\n\n/**\n * Per-page slow-path reader. Acquires a `pagePtr` from the\n * `PagePtrPool`, dispatches the same per-subtype catalog as the raw\n * reader (via `collectPageAnnotations`), and releases the page on exit.\n *\n * Currently the dispatched readers do not use the `pagePtr` parameter\n * (text-markup is fully readable from the dict). Subtype readers that\n * need form/widget access (e.g. widget) will plug into this code path\n * as they land - the public DTO surface stays the same.\n */\nexport class AnnotationReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n list(pageObjectNumber: PageObjectNumber, signal: AbortSignal): AnnotationListPageSnapshot {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n return collectPageAnnotations({\n runtime: this.runtime,\n session: this.session,\n pageObjectNumber,\n count,\n getAnnotPtrAt: (i) => fn.FPDFPage_GetAnnot(pagePtr, i),\n signal,\n });\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n}\n","import type {\n PageRaster,\n PageRenderBackground,\n PageRenderViewport,\n PdfRect,\n PdfRotation,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * The ONE place a PDF user-space region becomes a device raster.\n *\n * Every PDFium rasterizer — `PageRenderReader`, `AnnotationAppearanceReader`,\n * and any future one (thumbnails, stamps, flatten) — composes these three\n * pieces and supplies only its own `draw` call. The geometry is a pure affine\n * (the engine twin of the viewer's `Mat2D`/`rotateScaleMatrix`); the bitmap\n * lifecycle (alloc → fill → draw → read back → free) lives in `rasterize`.\n */\n\nconst FPDF_BITMAP_BGRA = 4;\n/** Emit RGBA byte order (vs PDFium's native BGRA) so callers get `rgba8` directly. */\nexport const FPDF_REVERSE_BYTE_ORDER = 0x10;\n\n/** A 2D affine as the same six numbers as the viewer `Mat2D`, CSS `matrix()`, FS_MATRIX. */\nexport type Mat2D = readonly [a: number, b: number, c: number, d: number, e: number, f: number];\n\n/**\n * Map a normalized post-`GetDisplayMatrix()` display-space rect onto an\n * `outW × outH` device bitmap, baking in the caller's viewport rotation.\n *\n * PDFium's page and annotation renderers pre-apply `CPDF_Page::GetDisplayMatrix()`\n * before concatenating the caller matrix. That display matrix has already\n * converted PDF page coordinates (y-up) into bitmap/display coordinates\n * (y-down), so the caller matrix must target that post-display rect.\n */\nexport function displayRectToDeviceMatrix(\n rect: PdfRect,\n rotation: PdfRotation,\n outW: number,\n outH: number,\n): Mat2D {\n const left = rect.left;\n const bottom = rect.bottom;\n const width = rect.right - rect.left;\n const height = rect.top - rect.bottom;\n const sx0 = outW / width;\n const sy0 = outH / height;\n const sx90 = outW / height;\n const sy90 = outH / width;\n\n switch (rotation) {\n case 90:\n return [0, sy90, -sx90, 0, sx90 * (bottom + height), -sy90 * left];\n case 180:\n return [-sx0, 0, 0, -sy0, sx0 * (left + width), sy0 * (bottom + height)];\n case 270:\n return [0, -sy90, sx90, 0, -sx90 * bottom, sy90 * (left + width)];\n case 0:\n return [sx0, 0, 0, sy0, -sx0 * left, -sy0 * bottom];\n }\n}\n\n/**\n * Device pixel size for a region under a rotation + viewport. `width` swaps with\n * height on quarter-turns. Validates the viewport (the public-API contract).\n */\nexport function deviceSize(\n rect: PdfRect,\n rotation: PdfRotation,\n viewport: PageRenderViewport,\n): { width: number; height: number } {\n const rectWidth = rect.right - rect.left;\n const rectHeight = rect.top - rect.bottom;\n const swap = rotation === 90 || rotation === 270;\n const baseWidth = swap ? rectHeight : rectWidth;\n const baseHeight = swap ? rectWidth : rectHeight;\n\n if (viewport.kind === 'width') {\n if (!Number.isFinite(viewport.width) || viewport.width <= 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'render viewport width must be positive');\n }\n const width = Math.max(1, Math.round(viewport.width));\n return { width, height: Math.max(1, Math.round((width * baseHeight) / baseWidth)) };\n }\n\n const scale = viewport.scale ?? 1;\n if (!Number.isFinite(scale) || scale <= 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'render viewport scale must be positive');\n }\n return {\n width: Math.max(1, Math.round(baseWidth * scale)),\n height: Math.max(1, Math.round(baseHeight * scale)),\n };\n}\n\nexport interface RasterizeOptions {\n /** The region to render, in PDF user space — ALREADY normalized by the caller. */\n rect: PdfRect;\n /** Page dimensions in PDF user space, used to mirror PDFium's display matrix. */\n page: { width: number; height: number };\n rotation: PdfRotation;\n viewport: PageRenderViewport;\n background: PageRenderBackground;\n /**\n * Output-pixel budget: reject BEFORE allocating when the computed device\n * size exceeds it (the decode-bomb-guard pattern — the check lives where\n * the allocation happens). PDF page space is effectively unbounded, so a\n * width-bounded request can still explode vertically on degenerate\n * geometry. Optional: LOCAL renders omit it (exactness is the local\n * product promise); server renders carry the deployment policy's budget.\n */\n maxOutputPixels?: number;\n /**\n * Perform the PDFium draw into `bitmapPtr` with the prepared user `matrixPtr`\n * (and `clipPtr`, the full-bitmap clip — annotation renders ignore it). Return\n * false to abort the raster (e.g. the PDFium call failed).\n */\n draw: (bitmapPtr: Ptr, matrixPtr: Ptr, clipPtr: Ptr) => boolean;\n}\n\n/**\n * Owns the whole bitmap lifecycle: allocate the pixel buffer + bitmap + matrix\n * (+ clip), fill the background, run the caller's `draw`, read the pixels back\n * into a `PageRaster`, and free everything. Returns null on a degenerate rect or\n * a failed allocation/draw.\n */\nexport function rasterize(runtime: PdfRuntimeModule, opts: RasterizeOptions): PageRaster | null {\n const { fn, mem } = runtime;\n const { rect, page, rotation, viewport, background, draw } = opts;\n\n // Degenerate (zero/negative area) has no renderable output and would divide by\n // zero in the matrix.\n if (rect.right <= rect.left || rect.top <= rect.bottom) return null;\n\n const displayRect = pdfRectToDisplayRect(rect, page.height);\n const { width, height } = deviceSize(displayRect, rotation, viewport);\n if (opts.maxOutputPixels !== undefined && width * height > opts.maxOutputPixels) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `render output ${width}x${height} exceeds the ${opts.maxOutputPixels}-pixel budget — ` +\n 'request a smaller width (or tiles, once available)',\n );\n }\n const stride = width * 4;\n const bytes = stride * height;\n\n let pixelPtr: Ptr | null = null;\n let bitmapPtr: Ptr | null = null;\n let matrixPtr: Ptr | null = null;\n let clipPtr: Ptr | null = null;\n try {\n pixelPtr = mem.alloc(bytes);\n bitmapPtr = fn.FPDFBitmap_CreateEx(width, height, FPDF_BITMAP_BGRA, pixelPtr, stride);\n if (!bitmapPtr) return null;\n\n fn.FPDFBitmap_FillRect(\n bitmapPtr,\n 0,\n 0,\n width,\n height,\n background === 'transparent' ? 0x00000000 : 0xffffffff,\n );\n\n matrixPtr = mem.alloc(6 * 4);\n pokeMat2D(mem, matrixPtr, displayRectToDeviceMatrix(displayRect, rotation, width, height));\n\n clipPtr = mem.alloc(4 * 4);\n mem.poke(clipPtr, 'f32', 0, 0);\n mem.poke(clipPtr, 'f32', 0, 4);\n mem.poke(clipPtr, 'f32', width, 8);\n mem.poke(clipPtr, 'f32', height, 12);\n\n if (!draw(bitmapPtr, matrixPtr, clipPtr)) return null;\n\n const pixels = mem.readBytes(pixelPtr, bytes);\n return {\n width,\n height,\n stride,\n color: 'rgba8',\n premultipliedAlpha: false,\n data: toExactArrayBuffer(pixels),\n };\n } finally {\n if (bitmapPtr) fn.FPDFBitmap_Destroy(bitmapPtr);\n if (clipPtr) mem.free(clipPtr);\n if (matrixPtr) mem.free(matrixPtr);\n if (pixelPtr) mem.free(pixelPtr);\n }\n}\n\nfunction pdfRectToDisplayRect(rect: PdfRect, pageHeight: number): PdfRect {\n return {\n left: rect.left,\n right: rect.right,\n bottom: pageHeight - rect.top,\n top: pageHeight - rect.bottom,\n };\n}\n\nfunction pokeMat2D(mem: PdfRuntimeModule['mem'], ptr: Ptr, m: Mat2D): void {\n for (let i = 0; i < 6; i++) mem.poke(ptr, 'f32', m[i], i * 4);\n}\n\nfunction toExactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n const out = new Uint8Array(bytes.byteLength);\n out.set(bytes);\n return out.buffer;\n}\n","import type {\n AnnotationAppearanceMode,\n AnnotationAppearanceRaster,\n AnnotationAppearanceRenderOptions,\n AnnotationAppearancesResult,\n PageObjectNumber,\n PageRaster,\n PdfRect,\n PdfRotation,\n} from '@embedpdf/engine-core/runtime';\nimport { normalizePdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { FPDF_REVERSE_BYTE_ORDER, rasterize } from '../render/deviceRaster';\nimport { readAnnotRect, readIntent } from './internal/read/annotationReadPrimitives';\nimport { readAnnotationIdentity } from './internal/read/readAnnotationIdentity';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './internal/read/readAnnotationTransformMetadata';\nimport { freeTextIntentFromName } from './internal/freeTextIntent';\n\n/** `FPDF_ANNOT_WIDGET` — form-field annotation subtype code. */\nconst ANNOT_SUBTYPE_WIDGET = 20;\n\n/** `FPDF_ANNOT_FREETEXT` — free-text annotation subtype code. */\nconst ANNOT_SUBTYPE_FREETEXT = 3;\n\n/**\n * BOX-family subtypes (free-text 3, square 5, circle 6, stamp 13, caret 14):\n * the kinds whose v3 writers put rotation in the AP `/Matrix` +\n * `/EMBD_Metadata` `/UnrotatedRect`. Only these are eligible for\n * rotation-stripped appearance rendering — vertex kinds\n * (line/polyline/polygon/ink) pre-rotate their geometry, so their rasters must\n * stay on the classic path. This set MUST cover every kind whose reader\n * surfaces the rotation pair: `fromDTO` (plugin-annotation repository) mirrors\n * this exact condition to re-apply the stripped rotation as `apRot`.\n */\nconst BOX_FAMILY_SUBTYPES: ReadonlySet<number> = new Set([3, 5, 6, 13, 14]);\n\n/**\n * Per-appearance output-pixel ceiling (see the clamp in `renderOne`).\n * 16 M px ≈ a 4000² raster ≈ 64 MB of transient RGBA — safely inside the\n * wasm heap for the one-at-a-time batch loop, while a page-sized annotation\n * stays crisp to roughly 5–6× before its appearance starts stretching.\n * Small annotations (the overwhelming majority) never come near it.\n */\nconst APPEARANCE_PIXEL_CLAMP = 16_000_000;\n\n/**\n * Maps an `AnnotationAppearanceMode` onto the PDFium appearance-mode int and\n * the `EPDFAnnot_GetAvailableAppearanceModes` bit it occupies.\n * N -> mode 0 / bit 1, R -> mode 1 / bit 2, D -> mode 2 / bit 4.\n */\nconst APPEARANCE_MODES: ReadonlyArray<{\n name: AnnotationAppearanceMode;\n modeInt: number;\n bit: number;\n}> = [\n { name: 'normal', modeInt: 0, bit: 1 },\n { name: 'rollover', modeInt: 1, bit: 2 },\n { name: 'down', modeInt: 2, bit: 4 },\n];\n\n/**\n * Batch-renders the appearance streams (`/AP`) of every annotation on a page,\n * one bitmap per requested mode. Ported from the v2 PDFium engine's\n * `renderPageAnnotationsRaw` / `renderSingleAnnotAppearance`, but expressed in\n * PDF user space and against the `PdfRuntimeModule` (`fn` + `mem`).\n *\n * Each appearance bitmap is sized to its annotation's `/Rect` scaled by\n * `options.scale`. The shared raster helper handles PDFium's display matrix\n * convention, so this reader stays in normalized PDF page coordinates.\n */\nexport class AnnotationAppearanceReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n render(\n pageObjectNumber: PageObjectNumber,\n options: AnnotationAppearanceRenderOptions,\n signal: AbortSignal,\n ): AnnotationAppearancesResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n const scale = normalizeScale(options.scale);\n const rotation = (options.rotation ?? 0) as PdfRotation;\n const modes = resolveModes(options.modes);\n const revision = this.session.pageState(pageObjectNumber).revision;\n\n const appearances: AnnotationAppearanceRaster[] = [];\n\n try {\n const page = {\n width: fn.FPDF_GetPageWidthF(pagePtr),\n height: fn.FPDF_GetPageHeightF(pagePtr),\n };\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n for (let i = 0; i < count; i++) {\n throwIfAborted(signal);\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, i);\n if (!annotPtr) continue;\n\n try {\n const available = fn.EPDFAnnot_GetAvailableAppearanceModes(annotPtr);\n // Skip annotations without any /AP sub-dictionary. Mirrors v2.\n if (!available) continue;\n\n const identity = readAnnotationIdentity(fn, mem, annotPtr, pageObjectNumber, i, revision);\n // Rotation-stripped rendering (see AnnotationRender.ts) applies ONLY\n // where the rotation demonstrably lives in the AP Matrix: a BOX-family\n // kind carrying BOTH `/EMBD_Metadata` `/Rotation` and `/UnrotatedRect`.\n // There the raster renders flat, `rect` is the logical unrotated box,\n // and the DTO's `rotation` (same two fields, surfaced by the box\n // readers) is the consumer's view transform. Everything else — vertex\n // kinds (rotation pre-baked into their geometry), foreign PDFs with\n // arbitrary AP matrices — renders on the classic path, placed by\n // `/Rect`, bit-identical to before.\n // A free-text CALLOUT is excluded even with both fields present: only\n // its text box tilts, via an INLINE `cm` mid-stream (the leader stays\n // page-space), so the form `/Matrix` is identity — nothing to strip.\n const subtypeCode = fn.FPDFAnnot_GetSubtype(annotPtr);\n const isCallout =\n subtypeCode === ANNOT_SUBTYPE_FREETEXT &&\n freeTextIntentFromName(readIntent(fn, mem, annotPtr)) === 'free-text-callout';\n const stripRotation =\n BOX_FAMILY_SUBTYPES.has(subtypeCode) &&\n !isCallout &&\n readAnnotationRotation(fn, mem, annotPtr) !== undefined;\n const unrotatedRect = stripRotation\n ? readAnnotationUnrotatedRect(fn, mem, annotPtr)\n : undefined;\n // Normalize once at the read boundary — the wire `rect` and the render\n // matrix both rely on the normalized invariant.\n const rect = normalizePdfRect(unrotatedRect ?? readAnnotRect(fn, mem, annotPtr));\n\n for (const mode of modes) {\n if (!(available & mode.bit)) continue;\n const raster = this.renderOne(\n pagePtr,\n annotPtr,\n mode.modeInt,\n rect,\n page,\n rotation,\n scale,\n unrotatedRect !== undefined,\n options.maxOutputPixels,\n );\n if (!raster) continue;\n appearances.push({\n ref: identity.ref,\n mode: mode.name,\n rect,\n raster,\n });\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n return { pageState: this.session.pageState(pageObjectNumber), appearances };\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n /**\n * Render a single annotation appearance into its own raster. Returns `null`\n * when the mode has no appearance stream (after an optional form-field AP\n * generation fallback) or the render fails.\n */\n private renderOne(\n pagePtr: Ptr,\n annotPtr: Ptr,\n modeInt: number,\n rect: PdfRect,\n page: { width: number; height: number },\n rotation: PdfRotation,\n scale: number,\n stripRotation: boolean,\n maxOutputPixels?: number,\n ): PageRaster | null {\n const { fn } = this.runtime;\n\n if (!fn.EPDFAnnot_HasAppearanceStream(annotPtr, modeInt)) {\n // Form widgets frequently ship without a baked /AP. Generate one on the\n // fly (same fallback as the v2 engine), then re-check.\n const subtype = fn.FPDFAnnot_GetSubtype(annotPtr);\n if (subtype === ANNOT_SUBTYPE_WIDGET && !fn.FPDFAnnot_HasKey(annotPtr, 'AP')) {\n fn.EPDFAnnot_GenerateFormFieldAP(annotPtr);\n if (!fn.EPDFAnnot_HasAppearanceStream(annotPtr, modeInt)) return null;\n } else {\n return null;\n }\n }\n\n // SAFETY CLAMP — an engine invariant, not an option: no single appearance\n // raster exceeds APPEARANCE_PIXEL_CLAMP output pixels. Appearance size is\n // `rect × scale`, and rects span orders of magnitude — a page-sized stamp\n // at a deep-zoom scale would ask for gigabytes and OOM the wasm heap\n // (observed: a ~600pt annotation at scale ~47 → 3.3 GB malloc). The clamp\n // REDUCES the effective scale for that appearance instead of rejecting:\n // the raster still covers the same rect, so the consumer's box-stretch\n // shows it slightly soft rather than missing — bounded memory with\n // graceful degradation. `options.maxOutputPixels` (the deployment budget,\n // reject semantics) still applies after it, unchanged.\n const rectArea = Math.max(1, (rect.right - rect.left) * (rect.top - rect.bottom));\n const effScale = Math.min(scale, Math.sqrt(APPEARANCE_PIXEL_CLAMP / rectArea));\n\n // `rect` is already normalized at the read boundary; `rasterize` handles the\n // degenerate-rect / device-size / matrix / bitmap lifecycle. We supply only\n // the annotation draw (transparent background — appearances composite over\n // page content).\n return rasterize(this.runtime, {\n rect,\n page,\n rotation,\n viewport: { kind: 'scale', scale: effScale },\n ...(maxOutputPixels !== undefined ? { maxOutputPixels } : {}),\n background: 'transparent',\n // `stripRotation` (EmbedPDF box-kind rotation only): render the AP form\n // content WITHOUT its rotation Matrix, MatchRect-mapped to the unrotated\n // box — the consumer re-applies the DTO's `rotation` as a view transform.\n draw: (bitmapPtr, matrixPtr) =>\n (stripRotation ? fn.EPDF_RenderAnnotBitmapUnrotated : fn.EPDF_RenderAnnotBitmap)(\n bitmapPtr,\n pagePtr,\n annotPtr,\n modeInt,\n matrixPtr,\n FPDF_REVERSE_BYTE_ORDER,\n ),\n });\n }\n}\n\nfunction resolveModes(\n requested: AnnotationAppearanceMode[] | undefined,\n): ReadonlyArray<(typeof APPEARANCE_MODES)[number]> {\n if (!requested || requested.length === 0) {\n return APPEARANCE_MODES.filter((m) => m.name === 'normal');\n }\n const wanted = new Set(requested);\n return APPEARANCE_MODES.filter((m) => wanted.has(m.name));\n}\n\nfunction normalizeScale(scale: number | undefined): number {\n if (scale === undefined) return 1;\n if (!Number.isFinite(scale) || scale <= 0) return 1;\n return scale;\n}\n","import type {\n AnnotationListPageSnapshot,\n AnnotationListSnapshotAllPages,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { collectPageAnnotations } from './internal/read/collectPageAnnotations';\n\n/**\n * Whole-document and per-page raw read paths. Never acquires a pagePtr;\n * uses `EPDFPage_GetAnnotCountRaw` / `EPDFPage_GetAnnotRaw` /\n * `EPDFAnnot_GetObjectNumber` directly off the docPtr.\n *\n * Per-subtype dispatch is the same as the full reader (both share\n * `collectPageAnnotations`), so the wire shape `AnnotationDTO[]` is\n * identical between raw and full read paths for the subtypes that don't\n * actually need a pagePtr to materialise their fields.\n */\nexport class RawAnnotationReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n listAll(signal: AbortSignal): AnnotationListSnapshotAllPages {\n throwIfAborted(signal);\n this.session.ensureFullPageRegistry();\n const records = this.session.allRecords();\n const pages: AnnotationListPageSnapshot[] = [];\n for (const record of records) {\n throwIfAborted(signal);\n pages.push(this.listOne(record.pageObjectNumber, signal));\n }\n return { pages };\n }\n\n listOne(pageObjectNumber: PageObjectNumber, signal: AbortSignal): AnnotationListPageSnapshot {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const record = this.session.recordByObjectNumber(pageObjectNumber);\n\n const count = fn.EPDFPage_GetAnnotCountRaw(docPtr, record.pageIndex);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFPage_GetAnnotCountRaw returned ${count} for page ${pageObjectNumber}`,\n );\n }\n\n return collectPageAnnotations({\n runtime: this.runtime,\n session: this.session,\n pageObjectNumber,\n count,\n getAnnotPtrAt: (i) => fn.EPDFPage_GetAnnotRaw(docPtr, record.pageIndex, i),\n signal,\n });\n }\n}\n","import {\n EngineError,\n EngineErrorCode,\n type AnnotationFlags,\n type Color,\n type InkList,\n type LineEndings,\n type LinePoints,\n type PdfPoint,\n type PdfRect,\n type PdfRectDifferences,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { F32_BYTES, POINTF_BYTES, RECTF_BYTES } from '../../../../runtime/memory/structs';\nimport { flagsToBits } from '../annotationFlagBits';\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { lineEndingToCode } from '../lineEnding';\n\n/**\n * Write-side twin of `annotationReadPrimitives.ts`. Every annotation\n * family (text-markup, shape, and upcoming polygon/polyline/line/free-text)\n * composes these low-level setters so the PDFium FFI surface lives in one\n * place. All colour/opacity/border writes go through the EmbedPDF\n * `EPDFAnnot_*` extensions — the same path v2 used and the read primitives\n * read back — so values survive native `EPDFAnnot_GenerateAppearance`.\n */\n\n/**\n * Set an annotation colour via the EmbedPDF `EPDFAnnot_SetColor`\n * extension. The `type` arg (FPDFANNOT_COLORTYPE) selects which colour to\n * write — `Color` is the stroke/fill `/C`, `InteriorColor` is the `/IC`\n * of square/circle/polygon. RGB only; annotation opacity lives in `/CA`\n * (see {@link setAnnotOpacity}), not a per-colour alpha. The stock\n * `FPDFAnnot_SetColor` cannot author interior colour, which is why we use\n * the extension uniformly.\n */\nexport function setAnnotColor(\n fn: PdfFunctions,\n annotPtr: Ptr,\n color: Color,\n type: number = FPDFANNOT_COLORTYPE.Color,\n): void {\n const ok = fn.EPDFAnnot_SetColor(annotPtr, type, color.r & 0xff, color.g & 0xff, color.b & 0xff);\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetColor returned false');\n }\n}\n\n/**\n * Remove an annotation colour entry via `EPDFAnnot_ClearColor` (e.g. a\n * transparent fill clears `/IC`). A false return is benign — there was no\n * entry to clear — so we don't treat it as an error.\n */\nexport function clearAnnotColor(fn: PdfFunctions, annotPtr: Ptr, type: number): void {\n fn.EPDFAnnot_ClearColor(annotPtr, type);\n}\n\n/**\n * Set annotation opacity (`/CA`) via the dedicated `EPDFAnnot_SetOpacity`\n * extension. Input is 0..1; the native alpha is 0..255. This is the path\n * that stores `/CA` in the form native appearance generation expects, so\n * opacity survives the bake.\n */\nexport function setAnnotOpacity(fn: PdfFunctions, annotPtr: Ptr, opacity: number): void {\n const alpha = Math.max(0, Math.min(255, Math.round(opacity * 255)));\n if (!fn.EPDFAnnot_SetOpacity(annotPtr, alpha)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetOpacity returned false');\n }\n}\n\n/**\n * Set the `/F` (Annotation Flags) entry via `FPDFAnnot_SetFlags`. Only the\n * keys present in `partial` are changed; the rest preserve their current\n * value (read back via `FPDFAnnot_GetFlags` first). On create the dict\n * starts at 0, so this is equivalently \"set exactly these\"; on update it\n * merges onto the live flags.\n */\nexport function setAnnotFlags(\n fn: PdfFunctions,\n annotPtr: Ptr,\n partial: Partial<AnnotationFlags>,\n): void {\n const next = flagsToBits(fn.FPDFAnnot_GetFlags(annotPtr), partial);\n if (!fn.FPDFAnnot_SetFlags(annotPtr, next)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_SetFlags returned false');\n }\n}\n\n/**\n * Write `/Rect` without touching `/AP`. Appearance preservation/regeneration\n * belongs to AnnotationMutator; a geometry primitive must not silently rewrite\n * an existing appearance `/BBox`. FS_RECTF layout is\n * `{ left, top, right, bottom }` (top > bottom in PDF coords).\n */\nexport function setAnnotRect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n rect: PdfRect,\n): void {\n const buf = mem.alloc(RECTF_BYTES);\n try {\n mem.poke(buf, 'f32', rect.left, 0);\n mem.poke(buf, 'f32', rect.top, 4);\n mem.poke(buf, 'f32', rect.right, 8);\n mem.poke(buf, 'f32', rect.bottom, 12);\n if (!fn.EPDFAnnot_SetRect(annotPtr, buf)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetRect returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Write a UTF-16 string entry into an annotation dictionary. The write\n * side of `readAnnotString`.\n */\nexport function writeAnnotString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n value: string,\n): void {\n const ptr = mem.writeU16String(value);\n try {\n fn.FPDFAnnot_SetStringValue(annotPtr, key, ptr);\n } finally {\n mem.free(ptr);\n }\n}\n\n/**\n * Three-state string write: `null` REMOVES the dictionary entry.\n *\n * Clearing goes through `EPDFAnnot_RemoveKey` because\n * `FPDFAnnot_SetStringValue` with a NULL value writes an EMPTY string —\n * it never removes. True removal is what keeps the read side honest:\n * `readAnnotString` returns `null` iff the key is absent, so a cleared\n * field reads back as `null`, not `''`.\n */\nexport function writeAnnotStringOrClear(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n value: string | null,\n): void {\n if (value === null) {\n fn.EPDFAnnot_RemoveKey(annotPtr, key);\n return;\n }\n writeAnnotString(fn, mem, annotPtr, key, value);\n}\n\n/**\n * Set `/BS /S` (border style code) and `/BS /W` (width) in one call via\n * `EPDFAnnot_SetBorderStyle`. `styleCode` is a raw\n * `FPDF_ANNOT_BORDER_STYLE` enum value — the string<->code mapping lives\n * in `shapeBorderStyle.ts` so engine-core stays PDFium-free.\n */\nexport function setBorderStyle(\n fn: PdfFunctions,\n annotPtr: Ptr,\n styleCode: number,\n width: number,\n): void {\n if (!fn.EPDFAnnot_SetBorderStyle(annotPtr, styleCode, width)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetBorderStyle returned false');\n }\n}\n\n/**\n * Write the dashed-border pattern (`/BS /D`) via\n * `EPDFAnnot_SetBorderDashPattern`. Each entry is clamped to >= 0.\n */\nexport function setBorderDashPattern(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n dashArray: number[],\n): void {\n const buf = mem.alloc(dashArray.length * F32_BYTES);\n try {\n for (let i = 0; i < dashArray.length; i++) {\n mem.poke(buf, 'f32', Math.max(0, dashArray[i]!), i * F32_BYTES);\n }\n if (!fn.EPDFAnnot_SetBorderDashPattern(annotPtr, buf, dashArray.length)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetBorderDashPattern returned false',\n );\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/** Set the `/BE` cloudy border effect intensity. */\nexport function setBorderEffect(fn: PdfFunctions, annotPtr: Ptr, intensity: number): void {\n if (!fn.EPDFAnnot_SetBorderEffect(annotPtr, intensity)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetBorderEffect returned false');\n }\n}\n\n/**\n * Remove the `/BE` cloudy border effect. A false return is benign (there\n * was no effect to clear), so we don't treat it as an error.\n */\nexport function clearBorderEffect(fn: PdfFunctions, annotPtr: Ptr): void {\n fn.EPDFAnnot_ClearBorderEffect(annotPtr);\n}\n\n/**\n * Write `/RD` rectangle differences via\n * `EPDFAnnot_SetRectangleDifferences`. PDFium core stores `/RD` as\n * `[left, bottom, right, top]`; we accept the wire-stable\n * `{ left, top, right, bottom }` shape and reorder at the boundary.\n */\nexport function setRectangleDifferences(\n fn: PdfFunctions,\n annotPtr: Ptr,\n rd: PdfRectDifferences,\n): void {\n if (!fn.EPDFAnnot_SetRectangleDifferences(annotPtr, rd.left, rd.bottom, rd.right, rd.top)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetRectangleDifferences returned false',\n );\n }\n}\n\n/**\n * Remove the `/RD` rectangle-differences entry. A false return is benign\n * (there was no entry to clear), so we don't treat it as an error.\n */\nexport function clearRectangleDifferences(fn: PdfFunctions, annotPtr: Ptr): void {\n fn.EPDFAnnot_ClearRectangleDifferences(annotPtr);\n}\n\n/**\n * Replace the `/Vertices` point list of a polygon/polyline annotation via\n * the EmbedPDF `EPDFAnnot_SetVertices` extension. Writes the points into a\n * contiguous `count * FS_POINTF` buffer.\n */\nexport function setVertices(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n vertices: PdfPoint[],\n): void {\n const buf = mem.alloc(vertices.length * POINTF_BYTES);\n try {\n for (let i = 0; i < vertices.length; i++) {\n const off = i * POINTF_BYTES;\n mem.poke(buf, 'f32', vertices[i]!.x, off);\n mem.poke(buf, 'f32', vertices[i]!.y, off + 4);\n }\n if (!fn.EPDFAnnot_SetVertices(annotPtr, buf, vertices.length)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetVertices returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Write the `/L` endpoints of a line annotation via the EmbedPDF\n * `EPDFAnnot_SetLine` extension. Uses one 16-byte buffer holding two\n * `FS_POINTF` structs (start at offset 0, end at offset 8).\n */\nexport function setLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n line: LinePoints,\n): void {\n const start = mem.alloc(POINTF_BYTES);\n const end = mem.alloc(POINTF_BYTES);\n try {\n mem.poke(start, 'f32', line.start.x, 0);\n mem.poke(start, 'f32', line.start.y, 4);\n mem.poke(end, 'f32', line.end.x, 0);\n mem.poke(end, 'f32', line.end.y, 4);\n if (!fn.EPDFAnnot_SetLine(annotPtr, start, end)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetLine returned false');\n }\n } finally {\n mem.free(start);\n mem.free(end);\n }\n}\n\n/**\n * Replace the `/InkList` of an ink annotation. PDFium has no single\n * \"set ink list\" call, so we clear any existing list with\n * `FPDFAnnot_RemoveInkList` (a false return is benign on a freshly-created\n * annotation that has none) and re-add each non-empty stroke via\n * `FPDFAnnot_AddInkStroke`, which takes a contiguous `count * FS_POINTF`\n * buffer and returns the new stroke index (`< 0` on failure).\n */\nexport function setInkList(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n inkList: InkList,\n): void {\n fn.FPDFAnnot_RemoveInkList(annotPtr);\n for (const stroke of inkList) {\n if (stroke.length === 0) continue;\n const buf = mem.alloc(stroke.length * POINTF_BYTES);\n try {\n for (let i = 0; i < stroke.length; i++) {\n const off = i * POINTF_BYTES;\n mem.poke(buf, 'f32', stroke[i]!.x, off);\n mem.poke(buf, 'f32', stroke[i]!.y, off + 4);\n }\n if (fn.FPDFAnnot_AddInkStroke(annotPtr, buf, stroke.length) < 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_AddInkStroke returned < 0');\n }\n } finally {\n mem.free(buf);\n }\n }\n}\n\n/**\n * Write the `/LE` line endings of a line/polyline annotation via the\n * EmbedPDF `EPDFAnnot_SetLineEndings` extension. The string<->code mapping\n * lives in `lineEnding.ts` so engine-core stays PDFium-free.\n */\nexport function setLineEndings(fn: PdfFunctions, annotPtr: Ptr, endings: LineEndings): void {\n if (\n !fn.EPDFAnnot_SetLineEndings(\n annotPtr,\n lineEndingToCode(endings.start),\n lineEndingToCode(endings.end),\n )\n ) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetLineEndings returned false');\n }\n}\n\n/**\n * Write the `/DA` default appearance (font + size + colour) of a free-text\n * annotation via `EPDFAnnot_SetDefaultAppearance`. The `/DA` colour paints\n * the border and the default text colour; a separate `TextColor` entry (see\n * {@link setAnnotColor}) overrides the text only. `fontCode` is the raw\n * `FPDF_STANDARD_FONT` enum value — the string<->code mapping lives in\n * `standardFont.ts` so engine-core stays PDFium-free.\n */\nexport function setDefaultAppearance(\n fn: PdfFunctions,\n annotPtr: Ptr,\n fontCode: number,\n fontSize: number,\n color: Color,\n): void {\n if (\n !fn.EPDFAnnot_SetDefaultAppearance(\n annotPtr,\n fontCode,\n fontSize,\n color.r & 0xff,\n color.g & 0xff,\n color.b & 0xff,\n )\n ) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetDefaultAppearance returned false');\n }\n}\n\n/**\n * Write the `/DA` default appearance using a runtime font registered through\n * `engine.fonts` (via `EPDFAnnot_SetDefaultAppearanceRegisteredFont`). `fontId`\n * is the thread-local `CFX_FontRegistry::FontId` resolved from the stable\n * `registeredFontKey` at authoring time. The font's glyph subset is embedded\n * into the annotation's appearance stream when the document/layer is saved.\n */\nexport function setDefaultAppearanceRegisteredFont(\n fn: PdfFunctions,\n annotPtr: Ptr,\n fontId: number,\n fontSize: number,\n color: Color,\n): void {\n if (\n !fn.EPDFAnnot_SetDefaultAppearanceRegisteredFont(\n annotPtr,\n fontId,\n fontSize,\n color.r & 0xff,\n color.g & 0xff,\n color.b & 0xff,\n )\n ) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetDefaultAppearanceRegisteredFont returned false',\n );\n }\n}\n\n/**\n * Write the `/Q` text alignment of a free-text annotation via\n * `EPDFAnnot_SetTextAlignment`. `code` is the raw quadding value — the\n * string<->code mapping lives in `textAlignment.ts`.\n */\nexport function setTextAlignment(fn: PdfFunctions, annotPtr: Ptr, code: number): void {\n if (!fn.EPDFAnnot_SetTextAlignment(annotPtr, code)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetTextAlignment returned false');\n }\n}\n\n/**\n * Write the `/IT` intent name via `EPDFAnnot_SetIntent` (expects a UTF-8\n * bytestring without the leading slash, e.g. `'FreeTextCallout'`). The\n * string<->name mapping lives in `freeTextIntent.ts`.\n */\nexport function setIntent(fn: PdfFunctions, annotPtr: Ptr, name: string): void {\n if (!fn.EPDFAnnot_SetIntent(annotPtr, name)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetIntent returned false');\n }\n}\n\n/**\n * Write the `/CL` callout leader line of a free-text callout via\n * `EPDFAnnot_SetCalloutLine`. Accepts 2 points (straight leader) or 3\n * (knee-jointed); writes them into a contiguous `count * FS_POINTF` buffer\n * (like {@link setVertices}).\n */\n/**\n * Write `/OverlayText` of a redact annotation via `EPDFAnnot_SetOverlayText`.\n * The native setter removes the key for an empty string, so passing `''`\n * clears the label.\n */\nexport function setOverlayText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n text: string,\n): void {\n const ptr = mem.writeU16String(text);\n try {\n if (!fn.EPDFAnnot_SetOverlayText(annotPtr, ptr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetOverlayText returned false');\n }\n } finally {\n mem.free(ptr);\n }\n}\n\n/**\n * Write `/Repeat` of a redact annotation via `EPDFAnnot_SetOverlayTextRepeat`\n * (`false` removes the key — absent is the PDF default).\n */\nexport function setOverlayTextRepeat(fn: PdfFunctions, annotPtr: Ptr, repeat: boolean): void {\n if (!fn.EPDFAnnot_SetOverlayTextRepeat(annotPtr, repeat)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetOverlayTextRepeat returned false');\n }\n}\n\nexport function setCalloutLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n points: readonly PdfPoint[],\n): void {\n const buf = mem.alloc(points.length * POINTF_BYTES);\n try {\n for (let i = 0; i < points.length; i++) {\n const off = i * POINTF_BYTES;\n mem.poke(buf, 'f32', points[i]!.x, off);\n mem.poke(buf, 'f32', points[i]!.y, off + 4);\n }\n if (!fn.EPDFAnnot_SetCalloutLine(annotPtr, buf, points.length)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetCalloutLine returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n","import type { AnnotationDraftBase, AnnotationPatchBase } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n setAnnotFlags,\n writeAnnotString,\n writeAnnotStringOrClear,\n} from './annotationWritePrimitives';\nimport { formatPdfDate } from '../../../../shared/pdf-date';\n\n/**\n * Write the annotation-wide base fields shared by every Draft\n * (contents/subject/nm). The kind-specific writer calls this BEFORE its\n * own field writes; order doesn't actually matter at the PDF level, but\n * keeping the base first makes the writers symmetric with the readers.\n *\n * `/T` (author display) is stamped by the mutator from\n * `AnnotationActor.displayName` via {@link writeAnnotationAuthor}.\n *\n * `nm` is written verbatim if the caller supplied one. The mutator\n * decides whether to opportunistically stamp a UUID v4 on a weak\n * annotation; the writer does not.\n */\nexport function applyAnnotationBaseDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: AnnotationDraftBase,\n): void {\n if (draft.contents !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Contents', draft.contents);\n }\n if (draft.subject !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Subj', draft.subject);\n }\n if (draft.nm !== undefined && draft.nm.length > 0) {\n writeAnnotString(fn, mem, annotPtr, 'NM', draft.nm);\n }\n if (draft.flags !== undefined) {\n setAnnotFlags(fn, annotPtr, draft.flags);\n }\n}\n\n/**\n * Write the annotation-wide base fields shared by every Patch\n * (contents/subject). /T is bound at creation and not patchable — see\n * `AnnotationPatchBase`. /NM is monotonic per annotation; the mutator\n * may stamp /NM opportunistically on a weak annotation via\n * `writeAnnotationNm`.\n *\n * Three-state semantics on string|null fields:\n * undefined -> don't touch the dict\n * null -> remove the entry\n * \"...\" -> set the entry to that value\n */\nexport function applyAnnotationBasePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: AnnotationPatchBase,\n): void {\n if (patch.contents !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Contents', patch.contents);\n }\n if (patch.subject !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Subj', patch.subject);\n }\n if (patch.flags !== undefined) {\n setAnnotFlags(fn, annotPtr, patch.flags);\n }\n}\n\n/**\n * Stamp /T (the standard PDF \"author\" display field) on an annotation.\n * Called by the mutator on CREATE — /T is bound to the caller's\n * `display_name` at creation. No-op when `displayName` is empty so\n * callers don't need to gate it.\n */\nexport function writeAnnotationAuthor(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n displayName: string,\n): void {\n if (displayName.length === 0) return;\n writeAnnotString(fn, mem, annotPtr, 'T', displayName);\n}\n\n/**\n * Stamp /NM on an annotation that didn't have one. Used by the mutator\n * (not by the writers proper) to upgrade a weak annotation to durable\n * identity during update. Idempotent and silent if the value is empty.\n */\nexport function writeAnnotationNm(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n nm: string,\n): void {\n if (nm.length === 0) return;\n writeAnnotString(fn, mem, annotPtr, 'NM', nm);\n}\n\n/**\n * Stamp /M (modification date) on an annotation. /M is a standard\n * ISO 32000 base annotation field — the moment of the last edit — so\n * it lives here alongside /T / /NM / /Contents rather than in any\n * vendor-namespaced extension.\n *\n * Called by the mutator on every annotation create AND every update;\n * the existing base draft/patch writers leave /M alone because the\n * value is derived from the moment of the write, not from the\n * draft/patch payload. The base reader already extracts /M and\n * surfaces it on `AnnotationBase.modified`.\n *\n * Format: `D:YYYYMMDDHHmmSSOHH'mm'` (see formatPdfDate).\n */\nexport function writeAnnotationModified(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n now: Date = new Date(),\n): void {\n writeAnnotString(fn, mem, annotPtr, 'M', formatPdfDate(now));\n}\n","import type { AnnotationStableId } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { generateUuid } from '../../../../shared/uuid';\nimport { readAnnotString } from '../read/annotationReadPrimitives';\nimport { writeAnnotationNm } from '../write/writeAnnotationBase';\n\n/**\n * Read an annotation's stable id, opportunistically stamping a fresh\n * engine-generated UUID v4 as `/NM` if it is currently weak (no object\n * number, no `/NM`). Monotonic `/NM` rule: an already-durable annotation\n * is NEVER touched. Caller owns the lifecycle of `annotPtr`.\n *\n * Shared by the create/update/move mutator paths and the `/IRT`\n * relationship writer (which strengthens a weak parent before linking to\n * it, so the strengthened id can be reported in `meta.changed`).\n */\nexport function captureOrStampStableId(\n runtime: PdfRuntimeModule,\n annotPtr: Ptr,\n): AnnotationStableId {\n const { fn, mem } = runtime;\n const objNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (objNum > 0) return { kind: 'objectNumber', value: objNum };\n const nm = readAnnotString(fn, mem, annotPtr, 'NM');\n if (nm !== null && nm.length > 0) return { kind: 'nm', value: nm };\n const minted = generateUuid();\n writeAnnotationNm(fn, mem, annotPtr, minted);\n return { kind: 'nm', value: minted };\n}\n","import type { AnnotationRef } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\n\n/**\n * Resolve an `AnnotationRef` to a live `annotPtr` on an ALREADY-acquired\n * `pagePtr`. This does NOT acquire/release the page and does NOT close the\n * returned annot — the caller owns both lifetimes.\n *\n * Resolution order matches the wire spec:\n * 1. `objectNumber` -> `EPDFPage_GetAnnotByObjectNumber`\n * 2. `nm` -> `EPDFPage_GetAnnotByName`\n * 3. `index` -> revision validation, then `FPDFPage_GetAnnot`\n *\n * Surfaces `InvalidReference` deterministically when the ref doesn't\n * resolve, so mutation paths can fail fast before doing any work.\n */\nexport function resolveAnnotPtr(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n pagePtr: Ptr,\n ref: AnnotationRef,\n): Ptr {\n const { fn, mem } = runtime;\n switch (ref.kind) {\n case 'objectNumber': {\n const annotPtr = fn.EPDFPage_GetAnnotByObjectNumber(pagePtr, ref.annotObjectNumber);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with object number ${ref.annotObjectNumber} on page ${ref.pageObjectNumber}`,\n );\n }\n return annotPtr;\n }\n case 'nm': {\n const namePtr = mem.writeU16String(ref.nm);\n try {\n const annotPtr = fn.EPDFPage_GetAnnotByName(pagePtr, namePtr);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with /NM '${ref.nm}' on page ${ref.pageObjectNumber}`,\n );\n }\n return annotPtr;\n } finally {\n mem.free(namePtr);\n }\n }\n case 'index': {\n session.validateRevision(ref.revision);\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, ref.index);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `index ${ref.index} out of range on page ${ref.pageObjectNumber}`,\n );\n }\n return annotPtr;\n }\n }\n throw new EngineError(EngineErrorCode.InvalidArg, `unsupported annotation ref kind`);\n}\n","import type {\n AnnotationListMutationMeta,\n AnnotationStableId,\n PageState,\n} from '@embedpdf/engine-core/runtime';\nimport {\n invalidatesWeakIndexRefs,\n shiftsExistingAnnotationIndices,\n type AnnotationMutationKind,\n} from '@embedpdf/engine-core/runtime';\n\n/**\n * The kind of mutation that just happened on a page.\n *\n * Index-space behaviour drives whether weak (`kind: 'index'`) refs\n * the client may be holding stay valid:\n *\n * - `update` does not touch the /Annots array at all.\n * - `create` is append-only — the new annotation lands at\n * `index = previousCount`, so no existing index ever shifts.\n * The array grows, but every pre-existing weak ref still points\n * at the same physical annotation.\n * - `delete` removes an entry and shifts every later index down by\n * one. Pre-existing weak refs at or after the removed index are\n * now off-by-one and stale.\n * - `move` detaches a contiguous block and re-inserts it, rewriting\n * indices on both ends of the gap. Existing weak refs across that\n * range are stale.\n *\n * So the doctrine for `MutationKind` is: only `delete` and `move`\n * actually invalidate weak refs. `update` and `create` leave them\n * alone. (A future explicit-position `createAt(index)` API would\n * shift indices >= toIndex and would join the structural cohort —\n * see `MutationKind` extension note in `compute()` below.)\n */\nexport type MutationKind = AnnotationMutationKind;\n\n/**\n * Inputs that decide whether a mutation should make a client refetch.\n *\n * `pageStateBefore` is captured BEFORE the mutation. Its known\n * `weakAnnotationState` drives the locked rule:\n * index-shifting mutation × any weak annotation on the page ⇒ refetch.\n *\n * `pageStateAfter` is captured AFTER the mutation. It carries the\n * bumped revision token (for index-shifting ops) and the recomputed\n * weak-annotation state (for any op that might have changed it, e.g.\n * opportunistic /NM stamping during update).\n *\n * `changed` is the list of stable ids the mutation actually touched.\n * Empty for a weak delete (we have no durable id to report).\n */\nexport interface ImpactInputs {\n mutation: MutationKind;\n pageStateBefore: PageState;\n pageStateAfter: PageState;\n changed: AnnotationStableId[];\n}\n\n/**\n * Pure helper: turn a mutation outcome into the side-effect envelope\n * every result type carries on its `meta` field.\n *\n * The rules — locked with the user, do not change without re-reading\n * the doc comment on `AnnotationListMutationMeta` and the\n * `MutationKind` definition above:\n *\n * 1. `update` and `create` are non-invalidating.\n *\n * - `update` doesn't touch the /Annots array; indices on the page\n * do not move, so weak refs the client may be holding stay\n * valid. Opportunistic /NM stamping during an update is also\n * non-structural — it changes the annotation's identity quality\n * but not its position.\n *\n * - `create` is append-only. The new annotation goes at\n * `index = previousCount`, so no existing index shifts and no\n * pre-existing weak ref ever becomes stale. We treat `create`\n * the same as `update` for impact purposes: no revision bump,\n * `weakRefsInvalidated = false`, `shouldRefetch = null`.\n *\n * The \"revisions exist solely for weak-ref authentication\"\n * doctrine (see `pages.move()`'s identical reasoning) means we\n * deliberately do NOT bump on `create` — bumping a revision\n * that nobody's weak ref depends on would erode the invariant\n * and turn revisions into a generic \"something changed\" signal.\n *\n * 2. `delete` and `move` ARE index-shifting. They genuinely move\n * pre-existing indices:\n * - `delete` removes an annotation, shifting every later index\n * down by one.\n * - `move` detaches a contiguous block and re-inserts it\n * elsewhere, rewriting indices on both ends of the gap.\n * They invalidate weak refs iff the page actually had any weak\n * refs *before* the mutation — if every annotation already had a\n * durable identity, no client could possibly be holding a stale\n * index, and we keep `shouldRefetch = null`.\n *\n * (`move` opportunistically stamps /NM on weak refs in the batch\n * BEFORE the move, so the annotations actually being moved end up\n * durable on the way out; but other weak annotations on the page\n * still need a refetch.)\n *\n * 3. When rule (2) fires, the reason is always `'weakRefsInvalidated'`.\n * `'pageRebuilt'` and `'externalChange'` are reserved for higher-\n * level signals the engine doesn't emit yet (insert/delete-page\n * that rebuilds /Annots, watch-based refresh). Page **reorder**\n * explicitly does NOT bump per-page revisions and does NOT emit\n * `pageRebuilt` — see `PagesMutator`.\n *\n * Future note: when an explicit-position `createAt(index)` API\n * ships, add `'createAt'` to `MutationKind` and slot it into rule\n * (2) — it shifts every index >= toIndex and is structural in the\n * same way `delete` and `move` are.\n */\nexport function computeMutationImpact(inputs: ImpactInputs): AnnotationListMutationMeta {\n const { mutation, pageStateBefore, pageStateAfter, changed } = inputs;\n\n if (!shiftsExistingAnnotationIndices(mutation)) {\n return {\n affectedPages: [pageStateAfter],\n cacheDelta: null,\n changed,\n weakRefsInvalidated: false,\n shouldRefetch: null,\n };\n }\n\n // delete / move: index-shifting.\n const weakRefsInvalidated = invalidatesWeakIndexRefs(\n mutation,\n pageStateBefore.weakAnnotationState,\n );\n return {\n affectedPages: [pageStateAfter],\n cacheDelta: null,\n changed,\n weakRefsInvalidated,\n shouldRefetch: weakRefsInvalidated ? { reason: 'weakRefsInvalidated' } : null,\n };\n}\n","import type { AnnotationDTO, PageObjectNumber, RevisionToken } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AnnotationReadContext } from './annotationReadContext';\nimport { pickReader } from './annotationReaderRegistry';\nimport { readAnnotationBase } from './readAnnotationBase';\n\n/**\n * Materialise a single annotation DTO from a live `annotPtr`, reusing the\n * exact same code paths the list readers use. Caller owns the lifecycle of\n * `annotPtr` (this function does NOT close it) so the mutator can keep it\n * for follow-up writes.\n *\n * Used by:\n * - `AnnotationMutator.create()` after `EPDFPage_CreateAnnot` to\n * produce `AnnotationCreateResult.created`.\n * - `AnnotationMutator.update()` after writes complete to produce\n * `AnnotationUpdateResult.updated`.\n */\nexport function readAnnotationFromPtr(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n index: number,\n revision: RevisionToken,\n ctx: AnnotationReadContext,\n): AnnotationDTO {\n const base = readAnnotationBase(fn, mem, ctx.docPtr, annotPtr, pageObjectNumber, index, revision);\n const subtypeCode = fn.FPDFAnnot_GetSubtype(annotPtr);\n const { reader } = pickReader(subtypeCode);\n return reader(fn, mem, annotPtr, base, subtypeCode, ctx);\n}\n","import type { AnnotationActor } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * Write the EmbedPDF-namespaced /EMBD_Metadata annotation dictionary.\n *\n * This module owns ONLY the vendor-extension dictionary. Standard PDF\n * base fields (/T, /M, /NM, /Contents) are handled by\n * `writers/annotations/base.ts` — /EMBD_Metadata is a separate\n * dictionary nested under the annotation that carries cloud-side\n * identity bookkeeping which has no PDF-spec equivalent.\n *\n * Schema (v1):\n * /EMBD_Metadata <<\n * /SchemaVersion 1 % EmbedPDF metadata schema version\n * /UserID (acme/alice) % identity that created the annotation\n * /GroupID (engineering) % group the annotation belongs to\n * /CreatedBy (acme/alice) % same as UserID on create\n * /UpdatedBy (acme/alice) % last editor; refreshed on every update\n * >>\n *\n * Read side: see `readers/annotations/embed-metadata.ts` (commit 12).\n *\n * PDFium bindings used: the `EPDFAnnot_*EmbedMetadata*` extension API\n * shipped in the EmbedPDF PDFium fork. Values are written as UTF-16LE\n * strings via the same `mem.writeU16String` pattern the base writer\n * uses for /T.\n */\n\nconst KEY_SCHEMA_VERSION = 'SchemaVersion';\nconst KEY_USER_ID = 'UserID';\nconst KEY_GROUP_ID = 'GroupID';\nconst KEY_CREATED_BY = 'CreatedBy';\nconst KEY_UPDATED_BY = 'UpdatedBy';\n\n/**\n * Current EmbedPDF metadata schema version. Bump if/when the field set\n * or semantics change; readers tolerate older versions by falling back\n * to the fields they recognise.\n */\nexport const EMBD_METADATA_SCHEMA_VERSION = 1;\n\n/**\n * Stamp /EMBD_Metadata on a freshly created annotation. No-op if the\n * actor has no identity fields — the worker still emits the standard\n * /M timestamp via the base writer; only the vendor dictionary is\n * skipped.\n *\n * actor.userId → /UserID, /CreatedBy, /UpdatedBy\n * actor.groupId → /GroupID\n *\n * /SchemaVersion is written whenever any field is written.\n */\nexport function applyEmbedMetadataOnCreate(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n actor: AnnotationActor | undefined,\n): void {\n if (!actor || (!actor.userId && !actor.groupId)) return;\n\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, KEY_SCHEMA_VERSION, EMBD_METADATA_SCHEMA_VERSION);\n\n if (actor.userId) {\n setMetadataString(fn, mem, annotPtr, KEY_USER_ID, actor.userId);\n setMetadataString(fn, mem, annotPtr, KEY_CREATED_BY, actor.userId);\n setMetadataString(fn, mem, annotPtr, KEY_UPDATED_BY, actor.userId);\n }\n if (actor.groupId) {\n setMetadataString(fn, mem, annotPtr, KEY_GROUP_ID, actor.groupId);\n }\n}\n\n/**\n * Apply /EMBD_Metadata refreshes on update. Two fields can change on\n * update; everything else (UserID, CreatedBy) is immutable.\n *\n * actor.userId → /UpdatedBy (refreshed every update where the\n * caller has an identity)\n * actor.groupId → /GroupID (reassigned only when the patch\n * explicitly contains a new groupId; route runs\n * `checkSetGroup` first)\n *\n * If the target annotation has no EMBD_Metadata yet (created before\n * the cloud started stamping, or by a non-cloud writer), we seed\n * /SchemaVersion so subsequent readers can find the marker.\n *\n * No-op when the actor has neither userId nor groupId.\n */\nexport function applyEmbedMetadataOnUpdate(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n actor: AnnotationActor | undefined,\n): void {\n if (!actor || (!actor.userId && !actor.groupId)) return;\n\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) {\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, KEY_SCHEMA_VERSION, EMBD_METADATA_SCHEMA_VERSION);\n }\n if (actor.userId) {\n setMetadataString(fn, mem, annotPtr, KEY_UPDATED_BY, actor.userId);\n }\n if (actor.groupId) {\n setMetadataString(fn, mem, annotPtr, KEY_GROUP_ID, actor.groupId);\n }\n}\n\nfunction setMetadataString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n value: string,\n): void {\n // Mirror the UTF-16LE pattern from writers/annotations/base.ts:\n // FPDFAnnot_SetStringValue and EPDFAnnot_SetEmbedMetadataString share\n // the same FPDF_WIDESTRING value shape, so we use the same helper.\n const ptr = mem.writeU16String(value);\n try {\n fn.EPDFAnnot_SetEmbedMetadataString(annotPtr, key, ptr);\n } finally {\n mem.free(ptr);\n }\n}\n","import { EngineError, EngineErrorCode, type PdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { RECTF_BYTES } from '../../../../runtime/memory/structs';\nimport { readAnnotationUnrotatedRect } from '../read/readAnnotationTransformMetadata';\nimport { EMBD_METADATA_SCHEMA_VERSION } from './writeEmbedMetadata';\n\n/**\n * Write the EmbedPDF transform keys under /EMBD_Metadata. This is the seam\n * PDFium's native AP generator reads to bake a ROTATED appearance:\n *\n * /EMBD_Metadata <<\n * /Rotation 45 % degrees, PDF convention (CCW)\n * /UnrotatedRect [x0 y0 x1 y1] % BOX kinds only — the logical box\n * >>\n *\n * The family split (see the v3 plan):\n * - BOX kinds (square/circle/free-text): `/Rotation` + `/UnrotatedRect`.\n * With BOTH present the AP generator emits an `/AP /Matrix` that rotates a\n * box-sized appearance about the box centre, and `/Rect` is the enclosing\n * AABB. This is the portable, externally-correct rotation.\n * - VERTEX kinds (line/polyline/polygon/ink): `/Rotation` ONLY (advisory).\n * The points are already rotated (they are the visual), so a lone\n * `/Rotation` is INERT for the AP generator (it ignores `/Rotation` with no\n * `/UnrotatedRect`) — it just records the applied angle so EmbedPDF can\n * reconstruct an oriented selection box + offer reset.\n *\n * Both fields follow the engine-wide tri-state law (\"a patch touches what it\n * states, preserves what it omits\"):\n * - `undefined` → the key is UNTOUCHED (a rect-only move keeps its rotation).\n * - `null` or `0` → CLEAR just that key via `EPDFAnnot_ClearEmbedMetadataKey`\n * (0 ≡ no rotation is the canonical identity, not a sentinel; never clear\n * the whole dict — identity fields UserID/GroupID/CreatedBy/UpdatedBy must\n * survive).\n * - a value → SET the key. Setting a nonzero rotation with no\n * `/UnrotatedRect` (neither in the patch nor already on the annotation)\n * is an unsatisfiable state for the AP generator and throws `InvalidArg`.\n *\n * MUST run BEFORE `EPDFAnnot_GenerateAppearance` so the bake sees the rotation.\n * `/SchemaVersion` is seeded (stays 1) if this is the first key in the dict.\n */\n\nconst KEY_ROTATION = 'Rotation';\nconst KEY_UNROTATED_RECT = 'UnrotatedRect';\n\n/** Transform fields a rotatable draft/patch can carry (off the engine DTO).\n * Tri-state: `undefined` preserves, `null` clears, a value sets. */\nexport interface AnnotationTransform {\n /** `/EMBD_Metadata/Rotation` — degrees, PDF convention. 0 ≡ none. */\n rotation?: number | null;\n /** `/EMBD_Metadata/UnrotatedRect` — the logical box (BOX kinds only). */\n unrotatedRect?: PdfRect | null;\n}\n\n/** Seed `/SchemaVersion` when we are about to create the dict by writing the\n * first transform key, so the marker readers look for is always present. */\nfunction ensureSchemaVersion(fn: PdfFunctions, annotPtr: Ptr): void {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) {\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, 'SchemaVersion', EMBD_METADATA_SCHEMA_VERSION);\n }\n}\n\nfunction setRotation(fn: PdfFunctions, annotPtr: Ptr, rotation: number): void {\n ensureSchemaVersion(fn, annotPtr);\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, KEY_ROTATION, rotation);\n}\n\nfunction setUnrotatedRect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n rect: PdfRect,\n): void {\n ensureSchemaVersion(fn, annotPtr);\n const buf = mem.alloc(RECTF_BYTES);\n try {\n // FS_RECTF { left, top, right, bottom } — same layout as setAnnotRect.\n mem.poke(buf, 'f32', rect.left, 0);\n mem.poke(buf, 'f32', rect.top, 4);\n mem.poke(buf, 'f32', rect.right, 8);\n mem.poke(buf, 'f32', rect.bottom, 12);\n fn.EPDFAnnot_SetEmbedMetadataRect(annotPtr, KEY_UNROTATED_RECT, buf);\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Write transform metadata for a BOX kind (square/circle/free-text/stamp),\n * tri-state per field: `undefined` never touches the document (safe to call on\n * every patch), `null`/`0` clears, a value sets. A nonzero rotation with no\n * unrotated box anywhere (patch or annotation) is unsatisfiable — the AP\n * generator needs the pair — and throws instead of writing a broken state.\n */\nexport function writeBoxTransformMetadata(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n t: AnnotationTransform,\n): void {\n if (t.rotation !== undefined) {\n if (t.rotation !== null && t.rotation !== 0) {\n const hasBox =\n t.unrotatedRect != null ||\n (t.unrotatedRect === undefined && readAnnotationUnrotatedRect(fn, mem, annotPtr) != null);\n if (!hasBox) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'rotation requires unrotatedRect: supply the pair together (or rely on an existing /EMBD_Metadata/UnrotatedRect)',\n );\n }\n setRotation(fn, annotPtr, t.rotation);\n } else {\n fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_ROTATION);\n }\n }\n if (t.unrotatedRect !== undefined) {\n if (t.unrotatedRect !== null) setUnrotatedRect(fn, mem, annotPtr, t.unrotatedRect);\n else fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_UNROTATED_RECT);\n }\n}\n\n/**\n * Write the advisory `/Rotation` scalar for a VERTEX kind\n * (line/polyline/polygon/ink), tri-state: `undefined` never touches the\n * document, `null`/`0` clears, a value sets. Whenever it does write, any\n * `/UnrotatedRect` is defensively cleared — that key is an impossible state on\n * a vertex kind and must never accidentally drive the AP generator.\n */\nexport function writeVertexTransformMetadata(\n fn: PdfFunctions,\n annotPtr: Ptr,\n t: AnnotationTransform,\n): void {\n if (t.rotation === undefined) return;\n if (t.rotation !== null && t.rotation !== 0) setRotation(fn, annotPtr, t.rotation);\n else fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_ROTATION);\n fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_UNROTATED_RECT);\n}\n","import type { CaretDraft, CaretPatch, Color } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n clearRectangleDifferences,\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setIntent,\n setRectangleDifferences,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\nimport { caretIntentToName } from '../textEditIntent';\n\n/** Default `/C` colour when a caret draft omits it (engine-wide default mark). */\nconst DEFAULT_CARET_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Default opacity, set explicitly so reads always round-trip the same value. */\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Apply a caret draft to a freshly-created annotation. Caret carries no\n * geometry of its own beyond `/Rect`. Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` (required — supplied by the caller; never derived)\n * 3. `/C` color + `/CA` opacity\n * 4. `/RD` rectangle differences (optional)\n */\nexport function applyCaretDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: CaretDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n // Box-family rotation pair — MUST land before the AP bake sees the caret.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: draft.rotation,\n unrotatedRect: draft.unrotatedRect,\n });\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_CARET_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n if (draft.intent !== undefined) setIntent(fn, annotPtr, caretIntentToName(draft.intent));\n if (draft.rectDifferences != null) {\n setRectangleDifferences(fn, annotPtr, draft.rectDifferences);\n }\n}\n\n/**\n * Apply a caret patch to an existing annotation. Only present fields are\n * touched.\n */\nexport function applyCaretPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: CaretPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.rotation !== undefined || patch.unrotatedRect !== undefined) {\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n }\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.intent !== undefined) {\n setIntent(fn, annotPtr, caretIntentToName(patch.intent));\n }\n if (patch.rectDifferences === null) {\n clearRectangleDifferences(fn, annotPtr);\n } else if (patch.rectDifferences !== undefined) {\n setRectangleDifferences(fn, annotPtr, patch.rectDifferences);\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the caret\n * writer for a draft/patch's `subtype`.\n */\nexport function isCaretSubtype(subtype: string): subtype is 'caret' {\n return subtype === 'caret';\n}\n","import type {\n Color,\n FileAttachmentPatch,\n FileAttachmentWireDraft,\n WireAttachmentFile,\n WireResource,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { writeAttachmentFilePayload } from '../../../attachments/internal/attachmentPrimitives';\nimport { FILE_ICON_TO_CODE } from '../annotationIcon';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { setAnnotColor, setAnnotOpacity, setAnnotRect } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\n\n/** Default `/C` — the generator's default icon fill, set explicitly so reads round-trip. */\nconst DEFAULT_FILE_ATTACHMENT_COLOR: Color = { r: 255, g: 255, b: 0 };\n\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Validate a file-attachment draft before any native write: the wire\n * `file.resource` ref must have arrived with the mutation. No format\n * sniffing — unlike stamps, ANY bytes are a valid attachment.\n */\nexport function preflightFileAttachmentDraft(\n draft: FileAttachmentWireDraft,\n ctx: AnnotationWriteContext | undefined,\n): void {\n requireFileResource(draft.file, ctx);\n if (ctx?.docPtr === undefined) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'file-attachment writer requires docPtr on the write context',\n );\n }\n}\n\n/**\n * Apply a file-attachment draft. Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` + `/C` + `/CA` + `/Name` icon\n * 3. the embedded file: `/FS` filespec via `FPDFAnnot_AddFileAttachment`,\n * bytes via `FPDFAttachment_SetFile` (which also writes `/Params`\n * Size/CheckSum/CreationDate), declared mime via\n * `EPDFAttachment_SetSubtype`, optional `/Desc`.\n *\n * The icon appearance itself is generator-owned: the mutator's closing\n * `regenerateAppearance` bakes it from `/C` + `/Name`\n * (GenerateFileAttachmentAP), exactly like the text note.\n */\nexport function applyFileAttachmentDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: FileAttachmentWireDraft,\n ctx: AnnotationWriteContext | undefined,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_FILE_ATTACHMENT_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n setFileAttachmentIcon(fn, annotPtr, draft.icon ?? 'paperclip');\n attachFile(fn, mem, annotPtr, draft.file, requireFileResource(draft.file, ctx), ctx!.docPtr!);\n}\n\n/** Patch: presentation only — the attached file is create-only by design. */\nexport function applyFileAttachmentPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: FileAttachmentPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.icon !== undefined) {\n setFileAttachmentIcon(fn, annotPtr, patch.icon);\n }\n}\n\nexport function isFileAttachmentSubtype(subtype: string): subtype is 'file-attachment' {\n return subtype === 'file-attachment';\n}\n\nfunction setFileAttachmentIcon(\n fn: PdfFunctions,\n annotPtr: Ptr,\n icon: keyof typeof FILE_ICON_TO_CODE,\n): void {\n if (!fn.EPDFAnnot_SetName(annotPtr, FILE_ICON_TO_CODE[icon])) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetName returned false');\n }\n}\n\nfunction requireFileResource(\n file: WireAttachmentFile,\n ctx: AnnotationWriteContext | undefined,\n): WireResource {\n const resource = ctx?.resources?.[file.resource];\n if (!resource) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `attachment file references resource '${file.resource}' but no such binary payload accompanied the mutation`,\n );\n }\n return resource;\n}\n\nfunction attachFile(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n file: WireAttachmentFile,\n resource: WireResource,\n docPtr: Ptr,\n): void {\n const namePtr = mem.writeU16String(file.name);\n let attachmentPtr: Ptr;\n try {\n attachmentPtr = fn.FPDFAnnot_AddFileAttachment(annotPtr, namePtr);\n } finally {\n mem.free(namePtr);\n }\n if (!attachmentPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_AddFileAttachment returned NULL');\n }\n\n writeAttachmentFilePayload(fn, mem, attachmentPtr, docPtr, file, resource);\n}\n","import {\n EngineError,\n EngineErrorCode,\n type Color,\n type FreeTextFont,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, Ptr } from '@embedpdf/engine-runtime';\n\nimport { isStandardFont, standardFontToCode } from '../standardFont';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport {\n setDefaultAppearance,\n setDefaultAppearanceRegisteredFont,\n} from './annotationWritePrimitives';\n\n/**\n * Write `/DA`. A standard font name goes through the native standard-font\n * path; anything else is treated as a registered-font `key` and resolved to\n * this thread's FontId. A key with no resolver wired (e.g. a host without a\n * font registry) is a programming error — fail loud rather than silently\n * downgrade to Helvetica and embed the wrong glyphs.\n *\n * Shared by the free-text and redact writers: `/DA` styles a free-text body\n * and a redaction `/OverlayText` label through the exact same triple.\n */\nexport function applyDefaultAppearance(\n fn: PdfFunctions,\n annotPtr: Ptr,\n fontFamily: FreeTextFont,\n fontSize: number,\n color: Color,\n ctx: AnnotationWriteContext | undefined,\n): void {\n if (isStandardFont(fontFamily)) {\n setDefaultAppearance(fn, annotPtr, standardFontToCode(fontFamily), fontSize, color);\n return;\n }\n if (!ctx?.resolveRegisteredFontId) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `fontFamily '${fontFamily}' is not a standard font and no font registry is available on this host`,\n );\n }\n setDefaultAppearanceRegisteredFont(\n fn,\n annotPtr,\n ctx.resolveRegisteredFontId(fontFamily),\n fontSize,\n color,\n );\n}\n","import {\n type Color,\n type FilledStyleDraftFields,\n type GeometryStyleDraftFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { readBorderStyle } from '../read/annotationReadPrimitives';\nimport { borderStyleFromCode, borderStyleToCode } from '../shapeBorderStyle';\nimport {\n clearAnnotColor,\n setAnnotColor,\n setAnnotOpacity,\n setBorderDashPattern,\n setBorderStyle,\n} from './annotationWritePrimitives';\n\n/** The `/BS` (border) subset shared by every kind that draws a border. */\nexport type BorderDraftFields = Pick<\n GeometryStyleDraftFields,\n 'strokeWidth' | 'borderStyle' | 'dashArray'\n>;\n\n/**\n * Defaults applied when a draft omits a styling field. Shared by every\n * geometric family (shape/vertex/line/ink) so circle, square, polygon,\n * polyline, line, and ink all default to a 1pt solid red stroke.\n */\nexport const DEFAULT_OPACITY = 1;\nexport const DEFAULT_STROKE_WIDTH = 1;\nexport const DEFAULT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/**\n * Apply the geometry styling (`/C`, `/CA`, `/BS`, dash) from a draft to a\n * freshly-created annotation. This is the no-fill layer shared by ink and\n * the filled families; `interiorColor` (`/IC`) is layered on by\n * {@link applyFilledStyleDraft}. Geometry (`/Rect`, `/Vertices`, `/L`,\n * `/InkList`), cloudy borders, rect-differences, and line endings are\n * layered on by the family-specific writer around this call.\n */\nexport function applyGeometryStyleDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: GeometryStyleDraftFields,\n): void {\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n applyBorderDraft(fn, mem, annotPtr, draft);\n}\n\n/**\n * Write the `/BS` border (style + width, then dash) from a draft. This is\n * the border-only slice of {@link applyGeometryStyleDraft}, shared with the\n * free-text box border (which manages `/C` and `/DA` itself). A missing\n * `borderStyle`/`strokeWidth` falls back to a 1pt solid border.\n */\nexport function applyBorderDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: BorderDraftFields,\n): void {\n setBorderStyle(\n fn,\n annotPtr,\n borderStyleToCode(draft.borderStyle ?? 'solid'),\n draft.strokeWidth ?? DEFAULT_STROKE_WIDTH,\n );\n if (draft.dashArray !== undefined && draft.dashArray.length > 0) {\n setBorderDashPattern(fn, mem, annotPtr, draft.dashArray);\n }\n}\n\n/**\n * Apply the geometry styling from a patch to an existing annotation. Only\n * present fields are touched. Border style + width share the single\n * `EPDFAnnot_SetBorderStyle` call, so when only one is patched we read the\n * current pair first and preserve the other.\n */\nexport function applyGeometryStylePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: GeometryStyleDraftFields,\n): void {\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n applyBorderPatch(fn, mem, annotPtr, patch);\n}\n\n/**\n * Write the `/BS` border from a patch, touching only present fields. Border\n * style + width share the single `EPDFAnnot_SetBorderStyle` call, so when\n * only one is patched we read the current pair first and preserve the other.\n * The border-only slice of {@link applyGeometryStylePatch}, shared with the\n * free-text box border.\n */\nexport function applyBorderPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: BorderDraftFields,\n): void {\n if (patch.borderStyle !== undefined || patch.strokeWidth !== undefined) {\n const current = readBorderStyle(fn, mem, annotPtr);\n const style = patch.borderStyle ?? borderStyleFromCode(current.styleCode);\n const width = patch.strokeWidth ?? current.width;\n setBorderStyle(fn, annotPtr, borderStyleToCode(style), width);\n }\n if (patch.dashArray !== undefined && patch.dashArray.length > 0) {\n setBorderDashPattern(fn, mem, annotPtr, patch.dashArray);\n }\n}\n\n/**\n * Apply the full stroke/fill styling (geometry styling + `/IC`) from a\n * draft. A `null`/omitted fill clears `/IC` so the shape renders unfilled.\n * Used by the filled families (circle/square/polygon/polyline/line).\n */\nexport function applyFilledStyleDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: FilledStyleDraftFields,\n): void {\n const interior = draft.interiorColor ?? null;\n if (interior === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n } else {\n setAnnotColor(fn, annotPtr, interior, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n applyGeometryStyleDraft(fn, mem, annotPtr, draft);\n}\n\n/**\n * Apply the full stroke/fill styling from a patch. Only present fields are\n * touched; `interiorColor: null` clears `/IC`.\n */\nexport function applyFilledStylePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: FilledStyleDraftFields,\n): void {\n if (patch.interiorColor !== undefined) {\n if (patch.interiorColor === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n } else {\n setAnnotColor(fn, annotPtr, patch.interiorColor, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n }\n applyGeometryStylePatch(fn, mem, annotPtr, patch);\n}\n","import { type Color, type FreeTextDraft, type FreeTextPatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { freeTextIntentToName } from '../freeTextIntent';\nimport { readDefaultAppearance } from '../read/annotationReadPrimitives';\nimport { DEFAULT_STANDARD_FONT, standardFontFromCode } from '../standardFont';\nimport { textAlignmentToCode } from '../textAlignment';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport {\n clearAnnotColor,\n clearRectangleDifferences,\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setCalloutLine,\n setIntent,\n setLineEndings,\n setRectangleDifferences,\n setTextAlignment,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyDefaultAppearance } from './writeDefaultAppearance';\nimport { applyBorderDraft, applyBorderPatch, DEFAULT_OPACITY } from './writeStyle';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\n\n/**\n * Default `/DA` colour for free text: black (border + default text). Unlike\n * the geometric families (which default to red `/C`), a text box reads best\n * with a black mark.\n */\nconst DEFAULT_FREETEXT_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/**\n * Apply a free-text draft to a freshly-created annotation. Colour model:\n * - `color` -> `/DA` colour = border + default text colour.\n * - `fontColor` (optional) -> `TextColor` channel, overriding text only;\n * written AFTER `/DA` so the override wins.\n * - `interiorColor` -> `/C` box background (`null`/omitted clears it).\n *\n * Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` (required — supplied by the caller; never derived)\n * 3. `/C` background (set or clear) + `/CA` opacity\n * 4. `/BS` border (style + width + dash)\n * 5. `/DA` default appearance (font + size + `color`)\n * 6. `TextColor` override (only when `fontColor` is given)\n * 7. `/Q` text alignment\n * 8. `/IT` intent\n * 9. `/RD` rectangle differences (optional)\n * 10. callout `/CL` + leader `/LE` ending (only for callouts with geometry)\n */\nexport function applyFreeTextDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: FreeTextDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n\n const background = draft.interiorColor ?? null;\n if (background === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.Color);\n } else {\n setAnnotColor(fn, annotPtr, background, FPDFANNOT_COLORTYPE.Color);\n }\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n\n applyBorderDraft(fn, mem, annotPtr, draft);\n\n const daColor = draft.color ?? DEFAULT_FREETEXT_COLOR;\n applyDefaultAppearance(fn, annotPtr, draft.fontFamily, draft.fontSize, daColor, ctx);\n if (draft.fontColor !== undefined) {\n setAnnotColor(fn, annotPtr, draft.fontColor, FPDFANNOT_COLORTYPE.TextColor);\n }\n\n setTextAlignment(fn, annotPtr, textAlignmentToCode(draft.textAlign));\n setIntent(fn, annotPtr, freeTextIntentToName(draft.intent));\n\n if (draft.rectDifferences != null) {\n setRectangleDifferences(fn, annotPtr, draft.rectDifferences);\n }\n\n if (draft.calloutLine !== undefined) {\n setCalloutLine(fn, mem, annotPtr, draft.calloutLine);\n }\n if (draft.lineEnding !== undefined) {\n setLineEndings(fn, annotPtr, { start: 'none', end: draft.lineEnding });\n }\n // A plain text box rotates like square/circle (box model). A callout's\n // rotation applies to its text BOX only (`unrotatedRect` = the logical text\n // box; the /CL leader stays page-space) — the AP generator bakes it as an\n // inline matrix, not the form /Matrix. Absent fields simply clear the keys.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: draft.rotation,\n unrotatedRect: draft.unrotatedRect,\n });\n}\n\n/**\n * Apply a free-text patch to an existing annotation. Only present fields are\n * touched. `/DA` packs the font, size, and `color` into ONE string, so a\n * partial patch preserves the unpatched members by READING the current triple\n * first (the same read-modify-write as {@link applyBorderPatch}'s shared\n * `/BS` call) — a `{fontSize}` patch must never reset the font or colour.\n * Registered (embedded) fonts are the one caveat: the current `/DA` reads\n * back as a font CODE, so preserving a registered family requires the patch\n * to restate `fontFamily` (an unknown code falls back to the standard-font\n * default).\n *\n * `fontColor` here only sets an override; clearing it back to \"follow\n * `color`\" is out of scope this iteration.\n */\nexport function applyFreeTextPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: FreeTextPatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n // Transform metadata is tri-state per field (undefined preserves, null\n // clears, value sets) — independent of whether /Rect was rewritten. A\n // rect-only patch on a rotated box keeps its rotation.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n\n if (patch.interiorColor !== undefined) {\n if (patch.interiorColor === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.Color);\n } else {\n setAnnotColor(fn, annotPtr, patch.interiorColor, FPDFANNOT_COLORTYPE.Color);\n }\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n\n applyBorderPatch(fn, mem, annotPtr, patch);\n\n if (patch.fontFamily !== undefined || patch.fontSize !== undefined || patch.color !== undefined) {\n const cur = readDefaultAppearance(fn, mem, annotPtr);\n applyDefaultAppearance(\n fn,\n annotPtr,\n patch.fontFamily ?? (cur ? standardFontFromCode(cur.fontCode) : DEFAULT_STANDARD_FONT),\n patch.fontSize ?? (cur && cur.fontSize > 0 ? cur.fontSize : 12),\n patch.color ?? cur?.color ?? DEFAULT_FREETEXT_COLOR,\n ctx,\n );\n }\n if (patch.fontColor !== undefined) {\n setAnnotColor(fn, annotPtr, patch.fontColor, FPDFANNOT_COLORTYPE.TextColor);\n }\n\n if (patch.textAlign !== undefined) {\n setTextAlignment(fn, annotPtr, textAlignmentToCode(patch.textAlign));\n }\n if (patch.intent !== undefined) {\n setIntent(fn, annotPtr, freeTextIntentToName(patch.intent));\n }\n\n if (patch.rectDifferences === null) {\n clearRectangleDifferences(fn, annotPtr);\n } else if (patch.rectDifferences !== undefined) {\n setRectangleDifferences(fn, annotPtr, patch.rectDifferences);\n }\n\n if (patch.calloutLine !== undefined) {\n setCalloutLine(fn, mem, annotPtr, patch.calloutLine);\n }\n if (patch.lineEnding !== undefined) {\n setLineEndings(fn, annotPtr, { start: 'none', end: patch.lineEnding });\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the\n * free-text writer for a draft/patch's `subtype`.\n */\nexport function isFreeTextSubtype(subtype: string): subtype is 'free-text' {\n return subtype === 'free-text';\n}\n","import type { InkDraft, InkPatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { setAnnotRect, setInkList, setIntent } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyGeometryStyleDraft, applyGeometryStylePatch } from './writeStyle';\nimport { writeVertexTransformMetadata } from './writeAnnotationTransformMetadata';\nimport { inkIntentToName } from '../inkIntent';\n\n/**\n * Apply an ink draft to a freshly-created annotation. Ink has a stroke but\n * no `/IC`, so it uses the geometry styling layer (not the filled one).\n * Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin; the engine never derives it)\n * 3. geometry styling (/C, /CA, /BS, dash)\n * 4. /InkList freehand strokes\n */\nexport function applyInkDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: InkDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n if (draft.intent !== undefined) setIntent(fn, annotPtr, inkIntentToName(draft.intent));\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyGeometryStyleDraft(fn, mem, annotPtr, draft);\n setInkList(fn, mem, annotPtr, draft.inkList);\n // Advisory rotation: the strokes are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyInkPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: InkPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.intent !== undefined) setIntent(fn, annotPtr, inkIntentToName(patch.intent));\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyGeometryStylePatch(fn, mem, annotPtr, patch);\n if (patch.inkList !== undefined) {\n setInkList(fn, mem, annotPtr, patch.inkList);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the ink\n * writer for a draft/patch's `subtype`.\n */\nexport function isInkSubtype(subtype: string): subtype is 'ink' {\n return subtype === 'ink';\n}\n","import type { LineDraft, LinePatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { setAnnotRect, setLine, setLineEndings } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyFilledStyleDraft, applyFilledStylePatch } from './writeStyle';\nimport { writeVertexTransformMetadata } from './writeAnnotationTransformMetadata';\n\n/** Default line endings when a line draft omits them. */\nconst DEFAULT_LINE_ENDINGS = { start: 'none', end: 'none' } as const;\n\n/**\n * Apply a line draft to a freshly-created annotation. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin; the engine never derives it)\n * 3. shared stroke/fill styling (/C, /CA, /BS, dash)\n * 4. /L line geometry\n * 5. /LE line endings (default none/none)\n */\nexport function applyLineDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: LineDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n setLine(fn, mem, annotPtr, draft.linePoints);\n setLineEndings(fn, annotPtr, draft.lineEndings ?? DEFAULT_LINE_ENDINGS);\n // Advisory rotation: the endpoints are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyLinePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: LinePatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n if (patch.linePoints !== undefined) {\n setLine(fn, mem, annotPtr, patch.linePoints);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n if (patch.lineEndings !== undefined) {\n setLineEndings(fn, annotPtr, patch.lineEndings);\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the line\n * writer for a draft/patch's `subtype`.\n */\nexport function isLineSubtype(subtype: string): subtype is 'line' {\n return subtype === 'line';\n}\n","import {\n EngineError,\n EngineErrorCode,\n type LinkDraft,\n type LinkPatch,\n type PdfDestination,\n type PdfLinkTargetWritable,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from '../../../../runtime/memory/scratch';\nimport { F32_BYTES } from '../../../../runtime/memory/structs';\nimport { VIEW_CODE_BY_KIND } from '../../../destinations/destinationViewCodes';\nimport { setAnnotRect } from './annotationWritePrimitives';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\n\n/**\n * Link writer: rect + the `/A` action. Only `goto`/`uri` targets are\n * writable (the draft/patch types enforce it; `goto-remote`/`launch` are\n * read-only by design). Relationship (`/IRT` + `/RT` — v2's grouped links)\n * is written by the mutator's kind-agnostic relationship pass, never here.\n *\n * A retarget REPLACES `/A`; it cannot remove a pre-existing direct `/Dest`\n * (no dict-entry removal primitive in the runtime), which is why the link\n * READER gives `/A` precedence — see readLinkAnnotation.ts.\n */\nexport function applyLinkDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: LinkDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n // `target: null` is the create-then-edit flow: the rect exists first, a\n // later patch supplies the destination/URI. Nothing to write yet.\n if (draft.target) applyLinkTarget(fn, mem, annotPtr, draft.target, ctx);\n}\n\nexport function applyLinkPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: LinkPatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) setAnnotRect(fn, mem, annotPtr, patch.rect);\n if (patch.target === null) clearLinkTarget(fn, annotPtr);\n else if (patch.target !== undefined) applyLinkTarget(fn, mem, annotPtr, patch.target, ctx);\n}\n\n/**\n * `target: null` → a dead link. The model treats the target as ONE concept\n * with two spellings, so THIS layer composes the two single-purpose\n * removal primitives — removing only `/A` would resurrect a stale direct\n * `/Dest` as the live target.\n */\nfunction clearLinkTarget(fn: PdfFunctions, annotPtr: Ptr): void {\n if (!fn.EPDFAnnot_RemoveAction(annotPtr) || !fn.EPDFAnnot_RemoveDest(annotPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to clear link target');\n }\n}\n\nexport function isLinkSubtype(subtype: string): subtype is 'link' {\n return subtype === 'link';\n}\n\nfunction applyLinkTarget(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n target: PdfLinkTargetWritable,\n ctx?: AnnotationWriteContext,\n): void {\n const docPtr = ctx?.docPtr;\n if (!docPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'writing a link target requires a document pointer on the write context',\n );\n }\n\n const actionPtr =\n target.kind === 'uri'\n ? fn.EPDFAction_CreateURI(docPtr, target.uri)\n : fn.EPDFAction_CreateGoTo(docPtr, createDestination(fn, mem, docPtr, target.destination));\n if (!actionPtr) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to create '${target.kind}' action`);\n }\n if (!fn.EPDFAnnot_SetAction(annotPtr, actionPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetAction failed for link');\n }\n}\n\n/**\n * Build an INDIRECT explicit-destination array for `dest`. The target page\n * is loaded just to reference its dictionary and closed immediately —\n * destinations routinely point at pages the mutator's pool never touches.\n */\nfunction createDestination(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n dest: PdfDestination,\n): Ptr {\n const pagePtr = fn.EPDFDoc_LoadPageByObjectNumber(docPtr, dest.pageObjectNumber);\n if (!pagePtr) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `link destination page not found: pageObjectNumber=${dest.pageObjectNumber}`,\n );\n }\n try {\n const destPtr =\n dest.kind === 'xyz'\n ? // Absent axes write PDF nulls (spec: \"retain current value\").\n fn.EPDFDest_CreateXYZ(\n pagePtr,\n dest.left != null,\n dest.left ?? 0,\n dest.top != null,\n dest.top ?? 0,\n dest.zoom != null,\n dest.zoom ?? 0,\n )\n : createViewDestination(fn, mem, pagePtr, dest);\n if (!destPtr) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to create '${dest.kind}' destination`);\n }\n return destPtr;\n } finally {\n fn.FPDF_ClosePage(pagePtr);\n }\n}\n\nfunction createViewDestination(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n pagePtr: Ptr,\n dest: Exclude<PdfDestination, { kind: 'xyz' }>,\n): Ptr {\n // The runtime pads missing params with 0 up to the fit type's arity —\n // a null top/left therefore writes as 0 (v2 parity; the array form has\n // no per-param null encoding through this API).\n const params: number[] = (() => {\n switch (dest.kind) {\n case 'fitH':\n case 'fitBH':\n return dest.top != null ? [dest.top] : [];\n case 'fitV':\n case 'fitBV':\n return dest.left != null ? [dest.left] : [];\n case 'fitR':\n return [dest.left, dest.bottom, dest.right, dest.top];\n default:\n return [];\n }\n })();\n\n const view = VIEW_CODE_BY_KIND[dest.kind];\n if (!params.length) return fn.EPDFDest_CreateView(pagePtr, view, NULL_PTR, 0);\n return withScratch(mem, params.length * F32_BYTES, (buf) => {\n for (let i = 0; i < params.length; i++) mem.poke(buf, 'f32', params[i]!, i * F32_BYTES);\n return fn.EPDFDest_CreateView(pagePtr, view, buf, params.length);\n });\n}\n","import {\n EngineError,\n EngineErrorCode,\n type Color,\n type HighlightDraft,\n type HighlightPatch,\n type PdfQuad,\n type SquigglyDraft,\n type SquigglyPatch,\n type StrikeoutDraft,\n type StrikeoutPatch,\n type UnderlineDraft,\n type UnderlinePatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setIntent,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { strikeoutIntentToName } from '../textEditIntent';\n\n/**\n * Default opacity when a draft omits `opacity`. PDFium's /CA defaults to\n * 1.0 if absent from the dict, but we set it explicitly so reads always\n * round-trip the same value.\n */\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Default fill colour per text-markup subtype. Matches the read-side\n * fallback in `readers/annotations/text-markup.ts`.\n */\nconst DEFAULT_HIGHLIGHT_COLOR: Color = { r: 255, g: 255, b: 0 };\nconst DEFAULT_TEXT_MARKUP_COLOR: Color = { r: 0, g: 0, b: 0 };\n\nexport type TextMarkupDraft = HighlightDraft | UnderlineDraft | SquigglyDraft | StrikeoutDraft;\nexport type TextMarkupPatch = HighlightPatch | UnderlinePatch | SquigglyPatch | StrikeoutPatch;\n\n/**\n * Apply a text-markup draft to a freshly-created annotation. Caller is\n * responsible for `EPDFPage_CreateAnnot`; this function only writes\n * fields. Order:\n * 1. base author-metadata (contents/author/nm)\n * 2. quadPoints (required for text-markup; 0-length is a typed error)\n * 3. rect (computed from quadPoints when not supplied — text-markup\n * annotations require /Rect to be the smallest enclosing box)\n * 4. color (with subtype-aware fallback)\n * 5. opacity (/CA)\n */\nexport function applyTextMarkupDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: TextMarkupDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n\n const quadPoints = draft.quadPoints;\n if (!Array.isArray(quadPoints) || quadPoints.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `text-markup draft (${draft.subtype}) requires at least one quadPoint`,\n );\n }\n appendQuadPoints(fn, mem, annotPtr, quadPoints);\n setRectFromQuadPoints(fn, mem, annotPtr, quadPoints);\n\n const fallback =\n draft.subtype === 'highlight' ? DEFAULT_HIGHLIGHT_COLOR : DEFAULT_TEXT_MARKUP_COLOR;\n setAnnotColor(fn, annotPtr, draft.color ?? fallback);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n if (draft.subtype === 'strikeout' && draft.intent !== undefined) {\n setIntent(fn, annotPtr, strikeoutIntentToName(draft.intent));\n }\n}\n\n/**\n * Apply a text-markup patch to an existing annotation. Order:\n * 1. base author-metadata (contents/author; never /NM)\n * 2. color (only if present)\n * 3. opacity (only if present)\n * 4. quadPoints (only if present, AND non-empty — the schema accepts an\n * empty array but PDFium would treat it as a deletion of the\n * attachment-point list, which is never the user's intent. We\n * explicitly reject the empty-array case).\n *\n * `rect` is recomputed only when quadPoints change, to keep /Rect in sync\n * with the smallest enclosing box.\n */\nexport function applyTextMarkupPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: TextMarkupPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.subtype === 'strikeout' && patch.intent !== undefined) {\n setIntent(fn, annotPtr, strikeoutIntentToName(patch.intent));\n }\n if (patch.quadPoints !== undefined) {\n if (patch.quadPoints.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `text-markup patch quadPoints, when present, must be non-empty`,\n );\n }\n replaceQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n setRectFromQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n }\n}\n\n/**\n * Type-narrowing predicate. Mirrors the reader-side dispatch. Used by\n * the writer registry to pick the right writer for a draft/patch's\n * `subtype` discriminator.\n */\nexport function isTextMarkupSubtype(\n subtype: string,\n): subtype is 'highlight' | 'underline' | 'squiggly' | 'strikeout' {\n return (\n subtype === 'highlight' ||\n subtype === 'underline' ||\n subtype === 'squiggly' ||\n subtype === 'strikeout'\n );\n}\n\nexport function appendQuadPoints(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n quadPoints: PdfQuad[],\n): void {\n const buf = mem.alloc(32);\n try {\n for (const qp of quadPoints) {\n writeQuadPointStruct(mem, buf, qp);\n const ok = fn.FPDFAnnot_AppendAttachmentPoints(annotPtr, buf);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'FPDFAnnot_AppendAttachmentPoints returned false',\n );\n }\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Replace the existing quadPoints with the supplied list. PDFium has\n * `FPDFAnnot_SetAttachmentPoints` which writes at index, but no truncate\n * helper, so we overwrite as many existing slots as we can and append\n * the rest. PDFium will GROW the list via append, but it cannot SHRINK\n * it; for that reason `applyTextMarkupPatch` rejects an empty patch and\n * the conformance suite covers the \"patch must not shrink quadPoints\"\n * rule (`patch.quadPoints.length >= existingCount`).\n */\nexport function replaceQuadPoints(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n quadPoints: PdfQuad[],\n): void {\n const existing = fn.FPDFAnnot_CountAttachmentPoints(annotPtr);\n if (quadPoints.length < existing) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `text-markup patch cannot shrink quadPoints (have ${existing}, patch supplies ${quadPoints.length})`,\n );\n }\n\n const buf = mem.alloc(32);\n try {\n for (let i = 0; i < existing; i++) {\n writeQuadPointStruct(mem, buf, quadPoints[i]!);\n const ok = fn.FPDFAnnot_SetAttachmentPoints(annotPtr, i, buf);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFAnnot_SetAttachmentPoints failed at index ${i}`,\n );\n }\n }\n for (let i = existing; i < quadPoints.length; i++) {\n writeQuadPointStruct(mem, buf, quadPoints[i]!);\n const ok = fn.FPDFAnnot_AppendAttachmentPoints(annotPtr, buf);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFAnnot_AppendAttachmentPoints failed at index ${i}`,\n );\n }\n }\n } finally {\n mem.free(buf);\n }\n}\n\nfunction writeQuadPointStruct(mem: PdfRuntimeMemory, buf: Ptr, qp: PdfQuad): void {\n // FS_QUADPOINTSF layout per public/fpdf_annot.h: { x1,y1, x2,y2, x3,y3, x4,y4 }\n // = p1 p2 p3 p4 — same positional slot order as readQuadPoints.\n mem.poke(buf, 'f32', qp.p1.x, 0);\n mem.poke(buf, 'f32', qp.p1.y, 4);\n mem.poke(buf, 'f32', qp.p2.x, 8);\n mem.poke(buf, 'f32', qp.p2.y, 12);\n mem.poke(buf, 'f32', qp.p3.x, 16);\n mem.poke(buf, 'f32', qp.p3.y, 20);\n mem.poke(buf, 'f32', qp.p4.x, 24);\n mem.poke(buf, 'f32', qp.p4.y, 28);\n}\n\nexport function setRectFromQuadPoints(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n quadPoints: PdfQuad[],\n): void {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const qp of quadPoints) {\n for (const p of [qp.p1, qp.p2, qp.p3, qp.p4]) {\n if (p.x < minX) minX = p.x;\n if (p.x > maxX) maxX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.y > maxY) maxY = p.y;\n }\n }\n\n // /Rect must be the smallest box enclosing every quad.\n setAnnotRect(fn, mem, annotPtr, { left: minX, top: maxY, right: maxX, bottom: minY });\n}\n","import type { Color, RedactDraft, RedactPatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { DEFAULT_STANDARD_FONT } from '../standardFont';\nimport { textAlignmentToCode } from '../textAlignment';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport {\n clearAnnotColor,\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setOverlayText,\n setOverlayTextRepeat,\n setTextAlignment,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyDefaultAppearance } from './writeDefaultAppearance';\nimport { DEFAULT_OPACITY } from './writeStyle';\nimport {\n appendQuadPoints,\n replaceQuadPoints,\n setRectFromQuadPoints,\n} from './writeTextMarkupAnnotation';\n\n/** Default `/C` marking outline: red — the redaction marking convention (and\n * the AP generator's default). */\nconst DEFAULT_REDACT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Default `/DA` label colour: black, mirroring free text. Tools that pair a\n * label with a dark `interiorColor` should set a light `fontColor`\n * explicitly. */\nconst DEFAULT_LABEL_COLOR: Color = { r: 0, g: 0, b: 0 };\n\nconst DEFAULT_FONT_SIZE = 12;\n\n/**\n * True when the draft/patch carries the label or any `/DA` member — i.e. the\n * `/DA` must be (re)written. ISO 32000-2 requires a `/DA` alongside\n * `/OverlayText`, so setting a label always emits one (defaults filling any\n * omitted triple member). Clearing the label (`overlayText: null`) does not.\n */\nfunction touchesLabelStyle(p: {\n overlayText?: string | null;\n fontFamily?: unknown;\n fontSize?: number;\n fontColor?: Color;\n}): boolean {\n return (\n (p.overlayText !== undefined && p.overlayText !== null) ||\n p.fontFamily !== undefined ||\n p.fontSize !== undefined ||\n p.fontColor !== undefined\n );\n}\n\n/**\n * Apply a redact draft to a freshly-created annotation. Colour model:\n * - `color` -> `/C` marking-stage outline.\n * - `interiorColor` -> `/IC` post-apply fill (`null`/omitted = the key is\n * never written; ISO leaves the region transparent).\n * - `fontColor` -> the `/DA` colour (label text).\n *\n * Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` (required — supplied by the caller; never derived)\n * 3. `/QuadPoints` (text redactions only)\n * 4. `/C` outline + `/CA` opacity + `/IC` fill\n * 5. `/OverlayText` + `/Repeat`\n * 6. `/DA` (only when a label field is present)\n * 7. `/Q` label alignment\n */\nexport function applyRedactDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: RedactDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n if (draft.quadPoints && draft.quadPoints.length > 0) {\n appendQuadPoints(fn, mem, annotPtr, draft.quadPoints);\n }\n\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_REDACT_COLOR, FPDFANNOT_COLORTYPE.Color);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n const fill = draft.interiorColor ?? null;\n if (fill !== null) {\n setAnnotColor(fn, annotPtr, fill, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n\n if (draft.overlayText !== undefined && draft.overlayText.length > 0) {\n setOverlayText(fn, mem, annotPtr, draft.overlayText);\n }\n if (draft.repeat) {\n setOverlayTextRepeat(fn, annotPtr, true);\n }\n if (touchesLabelStyle(draft)) {\n applyDefaultAppearance(\n fn,\n annotPtr,\n draft.fontFamily ?? DEFAULT_STANDARD_FONT,\n draft.fontSize ?? DEFAULT_FONT_SIZE,\n draft.fontColor ?? DEFAULT_LABEL_COLOR,\n ctx,\n );\n }\n if (draft.textAlign !== undefined) {\n setTextAlignment(fn, annotPtr, textAlignmentToCode(draft.textAlign));\n }\n}\n\n/**\n * Apply a redact patch to an existing annotation. Only present fields are\n * touched. `/DA` follows the free-text triple rule: send `fontFamily` +\n * `fontSize` + `fontColor` together when changing any of them. `quadPoints`\n * shares the text-markup no-shrink constraint (PDFium can grow but not\n * shrink the attachment-points list); patching quads re-derives `/Rect` from\n * their bounds unless the patch also carries an explicit `rect`.\n */\nexport function applyRedactPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: RedactPatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.quadPoints !== undefined) {\n replaceQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n if (patch.rect === undefined) {\n setRectFromQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n }\n }\n\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color, FPDFANNOT_COLORTYPE.Color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.interiorColor !== undefined) {\n if (patch.interiorColor === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n } else {\n setAnnotColor(fn, annotPtr, patch.interiorColor, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n }\n\n if (patch.overlayText !== undefined) {\n // The native setter removes the key for an empty string, so `null`\n // (clear the label) maps to ''.\n setOverlayText(fn, mem, annotPtr, patch.overlayText ?? '');\n }\n if (patch.repeat !== undefined) {\n setOverlayTextRepeat(fn, annotPtr, patch.repeat);\n }\n if (touchesLabelStyle(patch)) {\n applyDefaultAppearance(\n fn,\n annotPtr,\n patch.fontFamily ?? DEFAULT_STANDARD_FONT,\n patch.fontSize ?? DEFAULT_FONT_SIZE,\n patch.fontColor ?? DEFAULT_LABEL_COLOR,\n ctx,\n );\n }\n if (patch.textAlign !== undefined) {\n setTextAlignment(fn, annotPtr, textAlignmentToCode(patch.textAlign));\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the redact\n * writer for a draft/patch's `subtype`.\n */\nexport function isRedactSubtype(subtype: string): subtype is 'redact' {\n return subtype === 'redact';\n}\n","import {\n type CircleDraft,\n type CirclePatch,\n type SquareDraft,\n type SquarePatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n clearBorderEffect,\n clearRectangleDifferences,\n setAnnotRect,\n setBorderEffect,\n setRectangleDifferences,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyFilledStyleDraft, applyFilledStylePatch } from './writeStyle';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\n\nexport type ShapeDraft = CircleDraft | SquareDraft;\nexport type ShapePatch = CirclePatch | SquarePatch;\n\n/**\n * Apply a shape draft to a freshly-created annotation. Caller is\n * responsible for `EPDFPage_CreateAnnot`; this function only writes\n * fields. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — shapes carry their geometry as /Rect, not quads)\n * 3. shared stroke/fill styling (/IC, /C, /CA, /BS, dash)\n * 4. optional cloudy (/BE), rect-diff (/RD)\n */\nexport function applyShapeDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: ShapeDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n\n if (draft.cloudyIntensity != null && draft.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, draft.cloudyIntensity);\n }\n if (draft.rectDifferences != null) {\n setRectangleDifferences(fn, annotPtr, draft.rectDifferences);\n }\n // /Rect above is the rotated visual AABB; the rotation metadata tells the AP\n // generator to bake a /Matrix from the unrotated box.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: draft.rotation,\n unrotatedRect: draft.unrotatedRect,\n });\n}\n\n/**\n * Apply a shape patch to an existing annotation. Only fields present on\n * the patch are touched; `cloudyIntensity` and `rectDifferences` are\n * tri-state (as `interiorColor`): a value sets the entry, `null` removes it.\n */\nexport function applyShapePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: ShapePatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n // Transform metadata is tri-state per field (undefined preserves, null\n // clears, value sets) — independent of whether /Rect was rewritten. A\n // rect-only patch on a rotated box keeps its rotation.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n\n if (patch.cloudyIntensity !== undefined) {\n if (patch.cloudyIntensity !== null && patch.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, patch.cloudyIntensity);\n } else {\n // `null` removes /BE (tri-state). The schema forbids 0, but treat any\n // non-positive value defensively as a clear — never write a degenerate\n // /BE the read side would normalize away.\n clearBorderEffect(fn, annotPtr);\n }\n }\n if (patch.rectDifferences === null) {\n clearRectangleDifferences(fn, annotPtr);\n } else if (patch.rectDifferences !== undefined) {\n setRectangleDifferences(fn, annotPtr, patch.rectDifferences);\n }\n}\n\n/**\n * Type-narrowing predicate. Mirrors the reader-side dispatch. Used by the\n * writer registry to pick the shape writer for a draft/patch's `subtype`.\n */\nexport function isShapeSubtype(subtype: string): subtype is 'circle' | 'square' {\n return subtype === 'circle' || subtype === 'square';\n}\n","import {\n EngineError,\n EngineErrorCode,\n sniffBinaryMetadata,\n type BinaryMetadata,\n type PdfRect,\n type ResourceRef,\n type StampFit,\n type StampWireDraft,\n type StampWirePatch,\n type WireResource,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { F32_BYTES } from '../../../../runtime/memory/structs';\nimport { readAnnotRect } from '../read/annotationReadPrimitives';\nimport { STAMP_NAME_TO_CODE } from '../stampName';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { setAnnotRect } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\n\n/** `EPDF_STAMP_FIT` codes from `public/fpdf_annot.h` (CSS `object-fit` naming on the wire). */\nconst STAMP_FIT_TO_CODE: Record<StampFit, number> = {\n contain: 0, // EPDF_STAMP_FIT_CONTAIN\n cover: 1, // EPDF_STAMP_FIT_COVER\n fill: 2, // EPDF_STAMP_FIT_STRETCH\n};\n\n/**\n * Validate every caller-controlled stamp input before the mutation owner\n * performs its first native write. AnnotationMutator invokes these before\n * creating an annotation or strengthening a weak annotation id.\n */\nexport function preflightStampDraft(draft: StampWireDraft, ctx?: AnnotationWriteContext): void {\n if (draft.name !== undefined) requireStampNameCode(draft.name);\n requireStampFit(draft.fit ?? 'contain');\n requireStampContent(draft.source, ctx);\n}\n\nexport function preflightStampPatch(patch: StampWirePatch, ctx?: AnnotationWriteContext): void {\n if (patch.name !== undefined) requireStampNameCode(patch.name);\n requireStampFit(patch.fit ?? 'contain');\n if (patch.source !== undefined) requireStampContent(patch.source, ctx);\n}\n\n/**\n * Apply a stamp draft. Order mirrors the other writers (base → subtype\n * fields), then the appearance pipeline via {@link authorStampAppearance}:\n * 1. resolve the `{ resource }` ref against the mutation's binary payloads\n * 2. sniff the bytes (PNG/JPEG → image object, PDF → cloned form XObject)\n * 3. `EPDFAnnot_UpdateAppearanceToRect` fits the appearance into the box\n * honouring `fit` and any `/EMBD_Metadata` rotation.\n * The mutator's `EPDFAnnot_GenerateAppearance` pass afterwards is a no-op\n * for stamps (CPDF_GenerateAP has no stamp arm), so the appearance built\n * here is what ships.\n */\nexport function applyStampDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: StampWireDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n if (draft.name !== undefined) {\n setStampName(fn, annotPtr, draft.name);\n }\n authorStampAppearance(\n fn,\n mem,\n annotPtr,\n draft.source,\n draft.fit ?? 'contain',\n {\n rect: draft.rect,\n // The appearance author wants values-or-absent; a tri-state `null`\n // (no rotation) authors the same as an omitted field.\n unrotatedRect: draft.unrotatedRect ?? undefined,\n rotation: draft.rotation ?? undefined,\n },\n ctx,\n );\n}\n\nexport function applyStampPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: StampWirePatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.name !== undefined) {\n setStampName(fn, annotPtr, patch.name);\n }\n if (patch.source !== undefined) {\n // Content replacement: rebuild the appearance from the new bytes, authored\n // in the unrotated frame (see authorStampAppearance) so a rotated stamp\n // never double-fits into its padded AABB.\n const rect = patch.rect ?? readAnnotRect(fn, mem, annotPtr);\n authorStampAppearance(\n fn,\n mem,\n annotPtr,\n patch.source,\n patch.fit ?? 'contain',\n {\n rect,\n unrotatedRect: patch.unrotatedRect ?? undefined,\n rotation: patch.rotation ?? undefined,\n },\n ctx,\n );\n return;\n }\n // No new bytes: geometry / rotation / fit only.\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n // Transform metadata is tri-state per field (undefined preserves, null/0\n // clears, value sets) — a rect-only re-position keeps the rotation, and\n // rotate-back-to-0 is stated explicitly (`rotation: null`/`0`) by the\n // emitter rather than implied by omission.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n if (\n patch.rect !== undefined ||\n patch.fit !== undefined ||\n patch.rotation !== undefined ||\n patch.unrotatedRect !== undefined\n ) {\n // Geometry-only patch: re-fit the existing appearance into the new /Rect.\n refitAppearance(fn, annotPtr, patch.fit ?? 'contain');\n }\n}\n\nexport function isStampSubtype(subtype: string): subtype is 'stamp' {\n return subtype === 'stamp';\n}\n\nfunction setStampName(fn: PdfFunctions, annotPtr: Ptr, name: string): void {\n const code = STAMP_NAME_TO_CODE[name];\n if (code === undefined) {\n throw new EngineError(EngineErrorCode.Unknown, 'stamp name preflight invariant broken');\n }\n if (!fn.EPDFAnnot_SetName(annotPtr, code)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetName returned false');\n }\n}\n\nfunction requireStampNameCode(name: string): number {\n const code = STAMP_NAME_TO_CODE[name];\n if (code === undefined) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `unknown stamp name '${name}'; supported names: ${Object.keys(STAMP_NAME_TO_CODE).join(', ')}`,\n );\n }\n return code;\n}\n\nfunction requireStampFit(fit: StampFit): void {\n if (STAMP_FIT_TO_CODE[fit] === undefined) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `unknown stamp fit '${String(fit)}'; expected contain, cover, or fill`,\n );\n }\n}\n\nfunction requireStampResource(\n ref: ResourceRef,\n ctx: AnnotationWriteContext | undefined,\n): WireResource {\n const resource = ctx?.resources?.[ref.resource];\n if (!resource) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `stamp source references resource '${ref.resource}' but no such binary payload accompanied the mutation`,\n );\n }\n return resource;\n}\n\nfunction requireStampContent(ref: ResourceRef, ctx: AnnotationWriteContext | undefined): void {\n const resource = requireStampResource(ref, ctx);\n if (!(resource.bytes instanceof ArrayBuffer) || !sniffBinaryMetadata(resource.bytes)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'stamp source must be PNG, JPEG, or single-page PDF bytes',\n );\n }\n if (ctx?.docPtr === undefined || ctx.pagePtr === undefined) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'stamp writer requires docPtr/pagePtr on the write context',\n );\n }\n}\n\n/** The box transform a stamp draft/patch carries (the box-kind rotation split). */\ninterface StampBox {\n /** `/Rect` — the rotated visual AABB when rotated; the box itself otherwise. */\n rect: PdfRect;\n /** The logical (pre-rotation) box; present only alongside a non-zero rotation. */\n unrotatedRect?: PdfRect;\n /** `/EMBD_Metadata/Rotation` (deg, PDF convention). */\n rotation?: number;\n}\n\n/**\n * Author a stamp's appearance from `source`, correct under rotation.\n *\n * The appearance MUST be built in the UNROTATED frame and rotated by an\n * `/AP /Matrix` afterwards — the \"FreeText pattern\" the stamp draft documents.\n * If instead the image is fit into the rotated AABB `/Rect` (a portrait box for\n * a landscape image, say), the letterboxed bands get baked into the appearance,\n * and the closing native re-fit — which records `EPDFOrigContentRect` from that\n * padded box and then fits it into the unrotated box — shrinks the image by the\n * aspect ratio a SECOND time. The result is a small image adrift in white\n * padding, and only when rotated (at 0° the two frames coincide, so it fills).\n *\n * So for a rotated stamp we: author the image into the UNROTATED box with no\n * rotation metadata active (its recorded `EPDFOrigContentRect` is the\n * image-filled logical box), then write the rotation metadata, set the real\n * AABB `/Rect`, and re-fit once — which bakes the `/Matrix` and leaves the\n * appearance filling the box exactly as the 0° case does. The unrotated path is\n * unchanged: author straight into `/Rect`.\n */\nfunction authorStampAppearance(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n source: ResourceRef,\n fit: StampFit,\n box: StampBox,\n ctx: AnnotationWriteContext | undefined,\n): void {\n const rotated = !!box.rotation && box.unrotatedRect !== undefined;\n if (!rotated) {\n setAnnotRect(fn, mem, annotPtr, box.rect);\n setStampContent(fn, mem, annotPtr, source, fit, box.rect, ctx);\n return;\n }\n const unrotated = box.unrotatedRect!;\n // 1. Author in the unrotated frame — clear any rotation metadata first so the\n // internal re-fit records an image-shaped EPDFOrigContentRect, not the AABB.\n writeBoxTransformMetadata(fn, mem, annotPtr, {});\n setAnnotRect(fn, mem, annotPtr, unrotated);\n setStampContent(fn, mem, annotPtr, source, fit, unrotated, ctx);\n // 2. Apply the transform: metadata bakes the /Matrix, /Rect becomes the AABB,\n // and one re-fit reconciles BBox + Matrix from the now-recorded content.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: box.rotation,\n unrotatedRect: unrotated,\n });\n setAnnotRect(fn, mem, annotPtr, box.rect);\n refitAppearance(fn, annotPtr, fit);\n}\n\nfunction setStampContent(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n ref: ResourceRef,\n fit: StampFit,\n rect: PdfRect,\n ctx: AnnotationWriteContext | undefined,\n): void {\n const resource = ctx?.resources?.[ref.resource];\n const meta = resource ? sniffBinaryMetadata(resource.bytes) : null;\n if (!resource || !meta || ctx?.docPtr === undefined || ctx.pagePtr === undefined) {\n throw new EngineError(EngineErrorCode.Unknown, 'stamp content preflight invariant broken');\n }\n\n // Replace, not merge: drop any existing appearance objects (no-op on create).\n for (let i = fn.FPDFAnnot_GetObjectCount(annotPtr) - 1; i >= 0; i--) {\n fn.FPDFAnnot_RemoveObject(annotPtr, i);\n }\n\n if (meta.mimeType === 'application/pdf') {\n setAppearanceFromPdfBytes(fn, mem, annotPtr, resource.bytes);\n } else {\n appendImageObject(fn, mem, annotPtr, ctx.docPtr, ctx.pagePtr, resource.bytes, meta, rect, fit);\n }\n\n // Normalises the AP (BBox, EPDFOrigContentRect for future re-fits) and\n // applies any /EMBD_Metadata rotation — same closing step as v2.\n refitAppearance(fn, annotPtr, fit);\n}\n\nfunction refitAppearance(fn: PdfFunctions, annotPtr: Ptr, fit: StampFit): void {\n if (!fn.EPDFAnnot_UpdateAppearanceToRect(annotPtr, STAMP_FIT_TO_CODE[fit])) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_UpdateAppearanceToRect returned false',\n );\n }\n}\n\n/**\n * PNG/JPEG → image object appended to the appearance.\n *\n * The AP's coordinate space aligns with page space (its BBox is the annot\n * `/Rect`, same as v2), so the image must be painted INSIDE `/Rect` or it\n * falls outside the form's clip and renders blank. The `fit` placement is\n * computed here from the sniffed intrinsic dimensions; the closing\n * `EPDFAnnot_UpdateAppearanceToRect` pass then normalises the BBox and\n * records `EPDFOrigContentRect` so later geometry-only patches can re-fit\n * natively.\n */\nfunction appendImageObject(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n docPtr: Ptr,\n pagePtr: Ptr,\n bytes: ArrayBuffer,\n meta: Extract<BinaryMetadata, { width: number }>,\n rect: PdfRect,\n fit: StampFit,\n): void {\n const imageObjPtr = fn.FPDFPageObj_NewImageObj(docPtr);\n if (!imageObjPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFPageObj_NewImageObj returned NULL');\n }\n\n let appended = false;\n try {\n const dataPtr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(dataPtr, new Uint8Array(bytes));\n const ok =\n meta.mimeType === 'image/png'\n ? fn.EPDFImageObj_SetPng(pagePtr, 0, imageObjPtr, dataPtr, bytes.byteLength)\n : fn.EPDFImageObj_SetJpeg(pagePtr, 0, imageObjPtr, dataPtr, bytes.byteLength);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `${meta.mimeType === 'image/png' ? 'EPDFImageObj_SetPng' : 'EPDFImageObj_SetJpeg'} rejected the image data`,\n );\n }\n } finally {\n mem.free(dataPtr);\n }\n\n const placement = fitIntoRect(meta.width, meta.height, rect, fit);\n setImageMatrix(fn, mem, imageObjPtr, placement.width, placement.height);\n fn.FPDFPageObj_Transform(imageObjPtr, 1, 0, 0, 1, placement.left, placement.bottom);\n\n if (!fn.FPDFAnnot_AppendObject(annotPtr, imageObjPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_AppendObject returned false');\n }\n appended = true;\n } finally {\n // The annotation owns the object once appended; on failure we own it.\n if (!appended) {\n fn.FPDFPageObj_Destroy(imageObjPtr);\n }\n }\n}\n\n/** Fit-policy placement of `w×h` content inside `rect` (centered for the aspect-preserving fits). */\nfunction fitIntoRect(\n w: number,\n h: number,\n rect: PdfRect,\n fit: StampFit,\n): { left: number; bottom: number; width: number; height: number } {\n const boxW = Math.max(0, rect.right - rect.left);\n const boxH = Math.max(0, rect.top - rect.bottom);\n if (fit === 'fill' || w <= 0 || h <= 0) {\n return { left: rect.left, bottom: rect.bottom, width: boxW, height: boxH };\n }\n const scale = fit === 'contain' ? Math.min(boxW / w, boxH / h) : Math.max(boxW / w, boxH / h);\n const width = w * scale;\n const height = h * scale;\n return {\n left: rect.left + (boxW - width) / 2,\n bottom: rect.bottom + (boxH - height) / 2,\n width,\n height,\n };\n}\n\n/** FS_MATRIX { a, b, c, d, e, f } — six f32s. */\nfunction setImageMatrix(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n imageObjPtr: Ptr,\n width: number,\n height: number,\n): void {\n const buf = mem.alloc(6 * F32_BYTES);\n try {\n mem.poke(buf, 'f32', width, 0);\n mem.poke(buf, 'f32', 0, 4);\n mem.poke(buf, 'f32', 0, 8);\n mem.poke(buf, 'f32', height, 12);\n mem.poke(buf, 'f32', 0, 16);\n mem.poke(buf, 'f32', 0, 20);\n if (!fn.FPDFPageObj_SetMatrix(imageObjPtr, buf)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFPageObj_SetMatrix returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Single-page PDF → deep-cloned Form XObject as AP/N (the v2 rubber-stamp\n * path). The source buffer must stay alive until the temp document closes.\n */\nfunction setAppearanceFromPdfBytes(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n bytes: ArrayBuffer,\n): void {\n const dataPtr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(dataPtr, new Uint8Array(bytes));\n const tempDocPtr = fn.FPDF_LoadMemDocument(dataPtr, bytes.byteLength, '');\n if (!tempDocPtr) {\n throw new EngineError(EngineErrorCode.MalformedPdf, 'stamp source PDF could not be opened');\n }\n try {\n if (!fn.EPDFAnnot_SetAppearanceFromPage(annotPtr, tempDocPtr, 0)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetAppearanceFromPage returned false',\n );\n }\n } finally {\n fn.FPDF_CloseDocument(tempDocPtr);\n }\n } finally {\n mem.free(dataPtr);\n }\n}\n","import type { Color, TextDraft, TextPatch } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { NOTE_ICON_TO_CODE } from '../annotationIcon';\nimport { stateModelToPdf, stateToPdf } from '../annotationState';\nimport {\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n writeAnnotString,\n writeAnnotStringOrClear,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\n\n/** Default `/C` — the generator's yellow note fill, set explicitly so reads round-trip. */\nconst DEFAULT_NOTE_COLOR: Color = { r: 255, g: 255, b: 0 };\n\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Apply a text (sticky-note) draft. The visual is entirely generator-owned:\n * the mutator's closing `regenerateAppearance` bakes the 20×20 note icon\n * from `/C` + `/Name` (GenerateTextAP), so this writer only records state.\n * `/State` + `/StateModel` are dictionary-only (ISO 32000 §12.5.6.3) and\n * never reach the generator.\n */\nexport function applyTextDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: TextDraft,\n): void {\n if (draft.state !== undefined && draft.stateModel === undefined) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'text draft: state requires stateModel (ISO 32000 §12.5.6.3)',\n );\n }\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_NOTE_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n setNoteIcon(fn, annotPtr, draft.icon ?? 'note');\n if (draft.stateModel !== undefined) {\n writeAnnotString(fn, mem, annotPtr, 'StateModel', stateModelToPdf(draft.stateModel));\n }\n if (draft.state !== undefined) {\n writeAnnotString(fn, mem, annotPtr, 'State', stateToPdf(draft.state));\n }\n}\n\nexport function applyTextPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: TextPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.icon !== undefined) {\n setNoteIcon(fn, annotPtr, patch.icon);\n }\n // Three-state; a patch may touch one entry alone (the other may already\n // be on the annotation), so no cross-field rule here — that is draft-only.\n if (patch.stateModel !== undefined) {\n writeAnnotStringOrClear(\n fn,\n mem,\n annotPtr,\n 'StateModel',\n patch.stateModel === null ? null : stateModelToPdf(patch.stateModel),\n );\n }\n if (patch.state !== undefined) {\n writeAnnotStringOrClear(\n fn,\n mem,\n annotPtr,\n 'State',\n patch.state === null ? null : stateToPdf(patch.state),\n );\n }\n}\n\nexport function isTextSubtype(subtype: string): subtype is 'text' {\n return subtype === 'text';\n}\n\nfunction setNoteIcon(fn: PdfFunctions, annotPtr: Ptr, icon: keyof typeof NOTE_ICON_TO_CODE): void {\n if (!fn.EPDFAnnot_SetName(annotPtr, NOTE_ICON_TO_CODE[icon])) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetName returned false');\n }\n}\n","import type {\n PolygonDraft,\n PolygonPatch,\n PolylineDraft,\n PolylinePatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n clearBorderEffect,\n setAnnotRect,\n setBorderEffect,\n setLineEndings,\n setVertices,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyFilledStyleDraft, applyFilledStylePatch } from './writeStyle';\nimport { writeVertexTransformMetadata } from './writeAnnotationTransformMetadata';\n\nexport type VertexDraft = PolygonDraft | PolylineDraft;\nexport type VertexPatch = PolygonPatch | PolylinePatch;\n\n/** Default line endings when a polyline draft omits them. */\nconst DEFAULT_LINE_ENDINGS = { start: 'none', end: 'none' } as const;\n\n/**\n * Apply a polygon draft to a freshly-created annotation. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin; the engine never derives it)\n * 3. shared stroke/fill styling (/IC, /C, /CA, /BS, dash)\n * 4. /Vertices geometry\n * 5. optional cloudy (/BE)\n *\n * Note: polygon does NOT use /RD (rectangle differences) — its geometry is\n * fully described by /Vertices + /Rect, so /RD is redundant. Per ISO 32000\n * /RD applies to Square/Circle (and FreeText/Caret), not Polygon.\n */\nexport function applyPolygonDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: PolygonDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n setVertices(fn, mem, annotPtr, draft.vertices);\n\n if (draft.cloudyIntensity != null && draft.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, draft.cloudyIntensity);\n }\n // Advisory rotation: the vertices are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyPolygonPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: PolygonPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n if (patch.vertices !== undefined) {\n setVertices(fn, mem, annotPtr, patch.vertices);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n if (patch.cloudyIntensity !== undefined) {\n if (patch.cloudyIntensity !== null && patch.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, patch.cloudyIntensity);\n } else {\n // `null` removes /BE (tri-state). The schema forbids 0, but treat any\n // non-positive value defensively as a clear — never write a degenerate\n // /BE the read side would normalize away.\n clearBorderEffect(fn, annotPtr);\n }\n }\n}\n\n/**\n * Apply a polyline draft to a freshly-created annotation. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin)\n * 3. shared stroke/fill styling (/IC, /C, /CA, /BS, dash)\n * 4. /Vertices geometry\n * 5. /LE line endings (default none/none)\n */\nexport function applyPolylineDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: PolylineDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n setVertices(fn, mem, annotPtr, draft.vertices);\n setLineEndings(fn, annotPtr, draft.lineEndings ?? DEFAULT_LINE_ENDINGS);\n // Advisory rotation: the vertices are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyPolylinePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: PolylinePatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n if (patch.vertices !== undefined) {\n setVertices(fn, mem, annotPtr, patch.vertices);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n if (patch.lineEndings !== undefined) {\n setLineEndings(fn, annotPtr, patch.lineEndings);\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the vertex\n * writer for a draft/patch's `subtype`.\n */\nexport function isVertexSubtype(subtype: string): subtype is 'polygon' | 'polyline' {\n return subtype === 'polygon' || subtype === 'polyline';\n}\n","import type {\n AnnotationSubtype,\n WidgetDraft,\n WidgetPatch,\n WidgetStyleDraftFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { borderStyleToCode } from '../shapeBorderStyle';\nimport { standardFontToCode } from '../standardFont';\nimport { textAlignmentToCode } from '../textAlignment';\nimport { setAnnotRect } from './annotationWritePrimitives';\n\nconst MK_BORDER_COLOR = 0; // EPDF_MK_COLOR_BC\nconst MK_BACKGROUND_COLOR = 1; // EPDF_MK_COLOR_BG\n\nexport function isWidgetSubtype(subtype: AnnotationSubtype): subtype is 'widget' {\n return subtype === 'widget';\n}\n\n/**\n * THE widget-plane style writer: /MK colours, /BS, /DA, /Q. Both entry\n * points funnel here — the widget annotation kind (create/patch) and\n * `doc.forms.createField`'s inline placements — so creation-time and\n * edit-time styling can never drift apart.\n */\nexport function applyWidgetStyle(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n style: WidgetStyleDraftFields,\n): void {\n if (style.color === null) {\n fn.EPDFAnnot_ClearMKColor(annotPtr, MK_BORDER_COLOR);\n } else if (style.color) {\n fn.EPDFAnnot_SetMKColor(annotPtr, MK_BORDER_COLOR, style.color.r, style.color.g, style.color.b);\n }\n if (style.interiorColor === null) {\n fn.EPDFAnnot_ClearMKColor(annotPtr, MK_BACKGROUND_COLOR);\n } else if (style.interiorColor) {\n fn.EPDFAnnot_SetMKColor(\n annotPtr,\n MK_BACKGROUND_COLOR,\n style.interiorColor.r,\n style.interiorColor.g,\n style.interiorColor.b,\n );\n }\n\n if (style.strokeWidth !== undefined || style.borderStyle !== undefined) {\n fn.EPDFAnnot_SetBorderStyle(\n annotPtr,\n borderStyleToCode(style.borderStyle ?? 'solid'),\n style.strokeWidth ?? 1,\n );\n }\n\n if (\n style.fontFamily !== undefined ||\n style.fontSize !== undefined ||\n style.fontColor !== undefined\n ) {\n const color = style.fontColor ?? { r: 0, g: 0, b: 0 };\n fn.EPDFAnnot_SetDefaultAppearance(\n annotPtr,\n standardFontToCode(style.fontFamily ?? 'helvetica'),\n style.fontSize ?? 12,\n color.r,\n color.g,\n color.b,\n );\n }\n\n if (style.textAlign !== undefined) {\n fn.EPDFAnnot_SetTextAlignment(annotPtr, textAlignmentToCode(style.textAlign));\n }\n}\n\n/** Create an INERT widget: placement + style. Adoption is a forms concern. */\nexport function applyWidgetDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: WidgetDraft,\n): void {\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyWidgetStyle(fn, mem, annotPtr, draft);\n}\n\n/**\n * Move/restyle a widget. When the widget is attached to a field the\n * family-correct appearance is re-baked afterwards; on inert widgets the\n * regenerator is a no-op (no /FT context) and that is fine.\n */\nexport function applyWidgetPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: WidgetPatch,\n): void {\n if (patch.rect) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyWidgetStyle(fn, mem, annotPtr, patch);\n fn.EPDFAnnot_GenerateFormFieldAP(annotPtr);\n}\n","import {\n EngineError,\n EngineErrorCode,\n type WireAnnotationDraft,\n type WireAnnotationPatch,\n} from '@embedpdf/engine-core/runtime';\nimport type {\n CaretDraft,\n CaretPatch,\n WidgetDraft,\n WidgetPatch,\n FreeTextDraft,\n FreeTextPatch,\n InkDraft,\n InkPatch,\n LineDraft,\n LinePatch,\n LinkDraft,\n LinkPatch,\n PolygonDraft,\n PolygonPatch,\n PolylineDraft,\n PolylinePatch,\n RedactDraft,\n RedactPatch,\n StampWireDraft,\n StampWirePatch,\n TextDraft,\n TextPatch,\n FileAttachmentWireDraft,\n FileAttachmentPatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { applyCaretDraft, applyCaretPatch, isCaretSubtype } from './writeCaretAnnotation';\nimport {\n applyFileAttachmentDraft,\n applyFileAttachmentPatch,\n isFileAttachmentSubtype,\n preflightFileAttachmentDraft,\n} from './writeFileAttachmentAnnotation';\nimport {\n applyFreeTextDraft,\n applyFreeTextPatch,\n isFreeTextSubtype,\n} from './writeFreeTextAnnotation';\nimport { applyInkDraft, applyInkPatch, isInkSubtype } from './writeInkAnnotation';\nimport { applyLineDraft, applyLinePatch, isLineSubtype } from './writeLineAnnotation';\nimport { applyLinkDraft, applyLinkPatch, isLinkSubtype } from './writeLinkAnnotation';\nimport { applyRedactDraft, applyRedactPatch, isRedactSubtype } from './writeRedactAnnotation';\nimport {\n applyShapeDraft,\n applyShapePatch,\n isShapeSubtype,\n type ShapeDraft,\n type ShapePatch,\n} from './writeShapeAnnotation';\nimport {\n applyStampDraft,\n applyStampPatch,\n isStampSubtype,\n preflightStampDraft,\n preflightStampPatch,\n} from './writeStampAnnotation';\nimport { applyTextDraft, applyTextPatch, isTextSubtype } from './writeTextAnnotation';\nimport {\n applyTextMarkupDraft,\n applyTextMarkupPatch,\n isTextMarkupSubtype,\n type TextMarkupDraft,\n type TextMarkupPatch,\n} from './writeTextMarkupAnnotation';\nimport {\n applyPolygonDraft,\n applyPolygonPatch,\n applyPolylineDraft,\n applyPolylinePatch,\n isVertexSubtype,\n} from './writeVertexAnnotation';\nimport { applyWidgetDraft, applyWidgetPatch, isWidgetSubtype } from './writeWidgetAnnotation';\n\n/** Validate subtype inputs before AnnotationMutator performs any native write. */\nexport function preflightDraft(draft: WireAnnotationDraft, ctx?: AnnotationWriteContext): void {\n if (isStampSubtype(draft.subtype)) {\n preflightStampDraft(draft as StampWireDraft, ctx);\n }\n if (isFileAttachmentSubtype(draft.subtype)) {\n preflightFileAttachmentDraft(draft as FileAttachmentWireDraft, ctx);\n }\n}\n\n/** Validate subtype inputs before AnnotationMutator performs any native write. */\nexport function preflightPatch(patch: WireAnnotationPatch, ctx?: AnnotationWriteContext): void {\n if (isStampSubtype(patch.subtype)) {\n preflightStampPatch(patch as StampWirePatch, ctx);\n }\n}\n\n/**\n * Per-subtype write dispatch, mirroring the read-side registry. Adding a\n * new subtype is one extra arm here plus its writer module — no other\n * file in this package needs to change.\n *\n * The mutator calls `applyDraft` or `applyPatch` once per mutation; the\n * actual `EPDFPage_CreateAnnot` / identity resolution happens around\n * these calls in `AnnotationMutator`.\n */\nexport function applyDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: WireAnnotationDraft,\n ctx?: AnnotationWriteContext,\n): void {\n if (isTextMarkupSubtype(draft.subtype)) {\n applyTextMarkupDraft(fn, mem, annotPtr, draft as TextMarkupDraft);\n return;\n }\n if (isShapeSubtype(draft.subtype)) {\n applyShapeDraft(fn, mem, annotPtr, draft as ShapeDraft);\n return;\n }\n if (isVertexSubtype(draft.subtype)) {\n if (draft.subtype === 'polygon') {\n applyPolygonDraft(fn, mem, annotPtr, draft as PolygonDraft);\n } else {\n applyPolylineDraft(fn, mem, annotPtr, draft as PolylineDraft);\n }\n return;\n }\n if (isLineSubtype(draft.subtype)) {\n applyLineDraft(fn, mem, annotPtr, draft as LineDraft);\n return;\n }\n if (isLinkSubtype(draft.subtype)) {\n applyLinkDraft(fn, mem, annotPtr, draft as LinkDraft, ctx);\n return;\n }\n if (isInkSubtype(draft.subtype)) {\n applyInkDraft(fn, mem, annotPtr, draft as InkDraft);\n return;\n }\n if (isFreeTextSubtype(draft.subtype)) {\n applyFreeTextDraft(fn, mem, annotPtr, draft as FreeTextDraft, ctx);\n return;\n }\n if (isCaretSubtype(draft.subtype)) {\n applyCaretDraft(fn, mem, annotPtr, draft as CaretDraft);\n return;\n }\n if (isTextSubtype(draft.subtype)) {\n applyTextDraft(fn, mem, annotPtr, draft as TextDraft);\n return;\n }\n if (isStampSubtype(draft.subtype)) {\n applyStampDraft(fn, mem, annotPtr, draft as StampWireDraft, ctx);\n return;\n }\n if (isFileAttachmentSubtype(draft.subtype)) {\n applyFileAttachmentDraft(fn, mem, annotPtr, draft as FileAttachmentWireDraft, ctx);\n return;\n }\n if (isWidgetSubtype(draft.subtype)) {\n applyWidgetDraft(fn, mem, annotPtr, draft as WidgetDraft);\n return;\n }\n if (isRedactSubtype(draft.subtype)) {\n applyRedactDraft(fn, mem, annotPtr, draft as RedactDraft, ctx);\n return;\n }\n // Should be unreachable: AnnotationDraft is the closed union of writable\n // subtypes (which today is exactly the four text-markup kinds — the\n // unsupported kind has Draft = never). The check is here so a future\n // subtype that lands in `AnnotationDraft` without a writer entry fails\n // loud at runtime instead of silently no-op-ing.\n throw new EngineError(\n EngineErrorCode.NotImplemented,\n `no writer registered for draft.subtype='${(draft as { subtype: string }).subtype}'`,\n );\n}\n\nexport function applyPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: WireAnnotationPatch,\n ctx?: AnnotationWriteContext,\n): void {\n if (isTextMarkupSubtype(patch.subtype)) {\n applyTextMarkupPatch(fn, mem, annotPtr, patch as TextMarkupPatch);\n return;\n }\n if (isShapeSubtype(patch.subtype)) {\n applyShapePatch(fn, mem, annotPtr, patch as ShapePatch);\n return;\n }\n if (isVertexSubtype(patch.subtype)) {\n if (patch.subtype === 'polygon') {\n applyPolygonPatch(fn, mem, annotPtr, patch as PolygonPatch);\n } else {\n applyPolylinePatch(fn, mem, annotPtr, patch as PolylinePatch);\n }\n return;\n }\n if (isLineSubtype(patch.subtype)) {\n applyLinePatch(fn, mem, annotPtr, patch as LinePatch);\n return;\n }\n if (isLinkSubtype(patch.subtype)) {\n applyLinkPatch(fn, mem, annotPtr, patch as LinkPatch, ctx);\n return;\n }\n if (isInkSubtype(patch.subtype)) {\n applyInkPatch(fn, mem, annotPtr, patch as InkPatch);\n return;\n }\n if (isFreeTextSubtype(patch.subtype)) {\n applyFreeTextPatch(fn, mem, annotPtr, patch as FreeTextPatch, ctx);\n return;\n }\n if (isCaretSubtype(patch.subtype)) {\n applyCaretPatch(fn, mem, annotPtr, patch as CaretPatch);\n return;\n }\n if (isTextSubtype(patch.subtype)) {\n applyTextPatch(fn, mem, annotPtr, patch as TextPatch);\n return;\n }\n if (isStampSubtype(patch.subtype)) {\n applyStampPatch(fn, mem, annotPtr, patch as StampWirePatch, ctx);\n return;\n }\n if (isFileAttachmentSubtype(patch.subtype)) {\n applyFileAttachmentPatch(fn, mem, annotPtr, patch as FileAttachmentPatch);\n return;\n }\n if (isWidgetSubtype(patch.subtype)) {\n applyWidgetPatch(fn, mem, annotPtr, patch as WidgetPatch);\n return;\n }\n if (isRedactSubtype(patch.subtype)) {\n applyRedactPatch(fn, mem, annotPtr, patch as RedactPatch, ctx);\n return;\n }\n throw new EngineError(\n EngineErrorCode.NotImplemented,\n `no writer registered for patch.subtype='${(patch as { subtype: string }).subtype}'`,\n );\n}\n","import type {\n AnnotationRef,\n AnnotationReplyType,\n AnnotationStableId,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\nimport { captureOrStampStableId } from '../identity/captureOrStampStableId';\nimport { resolveAnnotPtr } from '../identity/resolveAnnotationPointer';\nimport { RT_UNKNOWN, replyTypeToCode } from '../replyType';\n\n/**\n * The `/IRT` + `/RT` slice of a draft or patch, normalized to the three\n * cases the writer handles.\n */\nexport interface RelationshipWrite {\n /**\n * undefined -> leave `/IRT` untouched\n * null -> clear `/IRT` (+ `/RT`)\n * ref -> set/relink `/IRT` to this parent\n */\n inReplyTo?: AnnotationRef | null;\n /** `/RT` to write; defaults to `'reply'` when a link is set without it. */\n replyType?: AnnotationReplyType;\n}\n\n/**\n * Apply the `/IRT` + `/RT` relationship to `annotPtr` on an\n * already-acquired `pagePtr`. Returns the parent's (possibly newly\n * strengthened) {@link AnnotationStableId} when a link was SET, so the\n * mutator can report the side-effecting promotion in `meta.changed`;\n * `null` for the clear / RT-only / no-op cases.\n *\n * Linking to a parent that is a weak/direct object promotes it to an\n * indirect object (`/IRT` must be an indirect reference). This is\n * non-structural — it assigns the parent an object number in place\n * without shifting any `/Annots` index — so it does not invalidate weak\n * refs or warrant a revision bump. We strengthen the parent with a\n * durable `/NM` BEFORE linking (via {@link captureOrStampStableId}) so its\n * identity survives a full save/reload, and report that id upstream.\n *\n * ISO 32000 §12.5.6.2 requires the reply and its parent to share a page;\n * we enforce that here with a fast `InvalidArg` (PDFium itself only checks\n * same-document).\n */\nexport function writeAnnotationRelationship(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n pagePtr: Ptr,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n rel: RelationshipWrite,\n): AnnotationStableId | null {\n const { fn } = runtime;\n\n // Clear: remove /IRT and /RT; the annotation becomes top-level.\n if (rel.inReplyTo === null) {\n fn.EPDFAnnot_SetLinkedAnnot(annotPtr, 'IRT', NULL_PTR);\n fn.EPDFAnnot_SetReplyType(annotPtr, RT_UNKNOWN);\n return null;\n }\n\n // Set / relink.\n if (rel.inReplyTo) {\n if (rel.inReplyTo.pageObjectNumber !== pageObjectNumber) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `/IRT parent must be on the same page as the reply (parent page ${rel.inReplyTo.pageObjectNumber}, reply page ${pageObjectNumber})`,\n );\n }\n const parentPtr = resolveAnnotPtr(runtime, session, pagePtr, rel.inReplyTo);\n try {\n // Strengthen BEFORE the link promotes the parent to indirect, so the\n // reported id is the save-stable /NM rather than a renumberable objNum.\n const parentStableId = captureOrStampStableId(runtime, parentPtr);\n if (!fn.EPDFAnnot_SetLinkedAnnot(annotPtr, 'IRT', parentPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to set /IRT linked annotation');\n }\n fn.EPDFAnnot_SetReplyType(annotPtr, replyTypeToCode(rel.replyType ?? 'reply'));\n return parentStableId;\n } finally {\n fn.FPDFPage_CloseAnnot(parentPtr);\n }\n }\n\n // inReplyTo undefined: a standalone /RT change only applies if the\n // annotation already has an /IRT link (RT without IRT is meaningless per\n // ISO 32000 §12.5.6.2). Silently skip otherwise.\n if (rel.replyType !== undefined) {\n const linkedPtr = fn.FPDFAnnot_GetLinkedAnnot(annotPtr, 'IRT');\n if (linkedPtr) {\n try {\n fn.EPDFAnnot_SetReplyType(annotPtr, replyTypeToCode(rel.replyType));\n } finally {\n fn.FPDFPage_CloseAnnot(linkedPtr);\n }\n }\n }\n return null;\n}\n","import {\n appearanceImpactOf,\n EngineError,\n EngineErrorCode,\n PDF_SUBTYPE_TO_CODE,\n type AnnotationActor,\n type AppearanceOutcome,\n type BlendMode,\n type AnnotationCreateResult,\n type AnnotationDeleteResult,\n type AnnotationDTO,\n type WireAnnotationDraft,\n type AnnotationListMutationMeta,\n type AnnotationMoveResult,\n type WireAnnotationPatch,\n type WireResourceMap,\n type AnnotationRef,\n type AnnotationStableId,\n type AnnotationUpdateResult,\n type PageObjectNumber,\n PdfAnnotationSubtypeCode,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { blendModeFromCode, blendModeToCode } from './internal/blendMode';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport type { FontRegistrar } from '../fonts';\nimport { captureOrStampStableId } from './internal/identity/captureOrStampStableId';\nimport { resolveAnnotPtr } from './internal/identity/resolveAnnotationPointer';\nimport { computeMutationImpact } from './internal/mutations/computeMutationImpact';\nimport { readContextFor } from './internal/read/annotationReadContext';\nimport { readAnnotString } from './internal/read/annotationReadPrimitives';\nimport {\n joinWidgetFieldNumbers,\n resolveWidgetFieldObjectNumber,\n} from './internal/read/joinWidgetField';\nimport { readAnnotationFromPtr } from './internal/read/readAnnotationFromPtr';\nimport type { AnnotationWriteContext } from './internal/write/annotationWriteContext';\nimport {\n applyDraft,\n applyPatch,\n preflightDraft,\n preflightPatch,\n} from './internal/write/annotationWriterRegistry';\nimport {\n writeAnnotationAuthor,\n writeAnnotationModified,\n} from './internal/write/writeAnnotationBase';\nimport { writeAnnotationRelationship } from './internal/write/writeAnnotationRelationship';\nimport {\n applyEmbedMetadataOnCreate,\n applyEmbedMetadataOnUpdate,\n} from './internal/write/writeEmbedMetadata';\n\n/** `FPDF_ANNOT_APPEARANCEMODE_NORMAL` — the `/AP /N` stream. */\nconst APPEARANCE_MODE_NORMAL = 0;\n\n/**\n * Synchronous orchestrator for `create` / `update` / `delete` annotation\n * mutations. Owns the dance between PDFium calls, identity bookkeeping,\n * revision bumping (only for structural ops), and the\n * `AnnotationListMutationMeta` envelope every result type carries.\n *\n * Lives in `engine-services` (not the worker hosts) so the local Web\n * Worker, the Node `worker_thread` server, and any future direct-thread\n * embedding share the exact same code path. The only difference between\n * them is the underlying `PdfRuntimeModule` (WASM vs native).\n *\n * Identity rules enforced here, locked with the user:\n * - `create` always uses `EPDFPage_CreateAnnot` (the fork helper that\n * creates an INDIRECT object) so new annotations are born durable.\n * If the fork helper ever returns a direct object, we throw — never\n * silently produce a weak annotation.\n * - `update` is non-structural. /NM is monotonic per annotation:\n * * already durable (objectNumber > 0 OR /NM present) -> NEVER touched.\n * * weak (no objectNumber, no /NM) -> stamp engine-generated UUID v4.\n * The patch type has no `nm` field, so the writer surface enforces\n * \"callers cannot rename a stable id\" at the type level. Updates do\n * not bump the revision.\n * - `delete` is subtype-agnostic. Three native fork helpers handle the\n * three ref kinds without round-tripping through index. For weak\n * deletes (`AnnotationStableId | null`-shaped result), we set\n * `deleted: null` so callers can detect that no durable id was\n * reportable.\n */\nexport class AnnotationMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n /**\n * Registered-font registry for this thread. Optional: when absent, the\n * registered-font authoring path is unavailable and a draft/patch carrying\n * a `registeredFontKey` fails loud (rather than silently using a standard\n * font). Standard-font FreeText and all other subtypes are unaffected.\n */\n private readonly fonts?: FontRegistrar,\n ) {}\n\n /** Build the per-write context handed to subtype writers: font resolver\n * (FreeText `/DA`), doc/page pointers and binary resources (stamp). */\n private writeContext(pagePtr: Ptr, resources?: WireResourceMap): AnnotationWriteContext {\n const fonts = this.fonts;\n return {\n ...(fonts ? { resolveRegisteredFontId: (key: string) => fonts.idFor(key) } : {}),\n docPtr: this.session.requireDocPtr(),\n pagePtr,\n ...(resources ? { resources } : {}),\n };\n }\n\n create(\n pageObjectNumber: PageObjectNumber,\n draft: WireAnnotationDraft,\n signal: AbortSignal,\n actor?: AnnotationActor,\n resources?: WireResourceMap,\n ): AnnotationCreateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const subtypeCode = PDF_SUBTYPE_TO_CODE[draft.subtype];\n\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n try {\n this.ensureKnownWeakStateFromPage(pageObjectNumber, pagePtr);\n const writeCtx = this.writeContext(pagePtr, resources);\n preflightDraft(draft, writeCtx);\n // `create` is append-only: PDFium drops the new annotation at\n // `index = previousCount`, so no existing index ever shifts. Per\n // the locked rule in `computeMutationImpact`, that means create is\n // non-invalidating — no per-page revision bump, no weak-ref\n // staleness signal. The DTO is read against the page's current\n // revision (which both pre-existing and freshly-created\n // annotations share, since nothing bumped it).\n const pageStateBefore = this.session.pageState(pageObjectNumber);\n throwIfAborted(signal);\n\n const annotPtr = fn.EPDFPage_CreateAnnot(pagePtr, subtypeCode);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFPage_CreateAnnot returned NULL for subtype '${draft.subtype}'`,\n );\n }\n\n let dto;\n let newObjNum: number;\n let newIndex: number;\n let linkedParentId: AnnotationStableId | null = null;\n try {\n applyDraft(fn, mem, annotPtr, draft, writeCtx);\n // Link to an /IRT parent when the draft asks for one. This may\n // promote a weak/direct parent to an indirect object (non-structural,\n // no index shift); the strengthened parent id is folded into\n // `meta.changed` below so the client can reconcile its cached ref.\n if (draft.inReplyTo !== undefined || draft.replyType !== undefined) {\n linkedParentId = writeAnnotationRelationship(\n this.runtime,\n this.session,\n pagePtr,\n annotPtr,\n pageObjectNumber,\n { inReplyTo: draft.inReplyTo, replyType: draft.replyType },\n );\n }\n // Stamp identity + modification metadata AFTER the per-subtype\n // writer so a buggy subtype writer can't clobber them:\n // /T ← actor.displayName (when present)\n // /M ← now (always)\n // /EMBD_Metadata ← actor.userId/groupId (when present)\n if (actor?.displayName) {\n writeAnnotationAuthor(fn, mem, annotPtr, actor.displayName);\n }\n writeAnnotationModified(fn, mem, annotPtr);\n applyEmbedMetadataOnCreate(fn, mem, annotPtr, actor);\n // Bake the /AP appearance stream now that every visual field is\n // written, so the new annotation ships with a standard-compliant\n // appearance (matches the v2 engine).\n this.regenerateAppearance(annotPtr, pagePtr, draft.blendMode);\n\n newObjNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (newObjNum <= 0) {\n // Defensive: the fork helper guarantees an indirect object.\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFPage_CreateAnnot produced a direct object (no objectNumber); fork helper invariant broken`,\n );\n }\n newIndex = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (newIndex < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${newIndex} for freshly created annotation`,\n );\n }\n\n dto = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n pageObjectNumber,\n newIndex,\n pageStateBefore.revision,\n readContextFor(this.session),\n );\n joinWidgetFieldNumbers(this.runtime, this.session, [dto]);\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n\n const createdId: AnnotationStableId = { kind: 'objectNumber', value: newObjNum };\n // Linking promoted the parent in place, so the page may now have one\n // fewer weak annotation — refresh the flag that future delete/move\n // refetch decisions read. (A plain create touches no existing annot.)\n if (linkedParentId) this.recordWeakStateFromPage(pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(pageObjectNumber);\n const meta: AnnotationListMutationMeta = computeMutationImpact({\n mutation: 'create',\n pageStateBefore,\n pageStateAfter,\n changed: linkedParentId ? [createdId, linkedParentId] : [createdId],\n });\n\n return { created: dto, meta };\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n update(\n ref: AnnotationRef,\n patch: WireAnnotationPatch,\n signal: AbortSignal,\n actor?: AnnotationActor,\n resources?: WireResourceMap,\n ): AnnotationUpdateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(ref.pageObjectNumber);\n let annotPtr: Ptr | null = null;\n try {\n annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n throwIfAborted(signal);\n\n const writeCtx = this.writeContext(pagePtr, resources);\n preflightPatch(patch, writeCtx);\n\n this.ensureKnownWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateBefore = this.session.pageState(ref.pageObjectNumber);\n\n // Apply boundary: validation and cancellation are complete before the\n // first possible document write (weak-id strengthening below).\n throwIfAborted(signal);\n\n // Opportunistic /NM stamp for weak annotations + capture the\n // resulting stable id for `meta.changed`. Same monotonic /NM\n // rule that `move()` uses; sharing the helper guarantees the\n // two paths cannot drift in their identity bookkeeping.\n const stableId = this.captureOrStampStableId(annotPtr);\n\n // Blend mode lives inside the existing /AP graphics state rather than in\n // the annotation dictionary. Capture it before re-baking so an unrelated\n // patch (colour, geometry, contents...) cannot silently reset it.\n const previousBlendMode = blendModeFromCode(fn.EPDFAnnot_GetBlendMode(annotPtr));\n\n // Pre-patch DTO for the appearance classifier: it value-diffs the patch\n // against this, so no-op keys (full-projection clients) drop away and a\n // pure move is recognized no matter how verbose the patch is.\n const preIndex = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (preIndex < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${preIndex} before update`,\n );\n }\n const currentDto = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n ref.pageObjectNumber,\n preIndex,\n pageStateBefore.revision,\n readContextFor(this.session),\n );\n\n // Apply caller-supplied subtype-specific writes.\n applyPatch(fn, mem, annotPtr, patch, writeCtx);\n // Apply /IRT + /RT changes (set/relink/clear, or RT-only). Setting a\n // link may promote a weak parent to indirect (non-structural); the\n // strengthened parent id is folded into `meta.changed` below.\n let linkedParentId: AnnotationStableId | null = null;\n if (patch.inReplyTo !== undefined || patch.replyType !== undefined) {\n linkedParentId = writeAnnotationRelationship(\n this.runtime,\n this.session,\n pagePtr,\n annotPtr,\n ref.pageObjectNumber,\n { inReplyTo: patch.inReplyTo, replyType: patch.replyType },\n );\n }\n // Refresh standard /M (modified date) on every update — independent\n // of whether the patch touched any subtype-specific field. Then\n // refresh /EMBD_Metadata/UpdatedBy if an actor was supplied;\n // UserID/GroupID/CreatedBy are preserved across updates.\n writeAnnotationModified(fn, mem, annotPtr);\n applyEmbedMetadataOnUpdate(fn, mem, annotPtr, actor);\n // The appearance decision (engine-core `appearanceImpactOf`): an /AP is\n // content, not cache — a foreign-authored stream (Acrobat's rich /AP, an\n // image stamp) is destroyed only as the explicit consequence of a\n // semantic edit, never as a side effect of writing back values nobody\n // changed. `inert` patches (metadata-only, or all values no-ops) never\n // touch /AP; a VERIFIED rigid translation preserves an existing /AP\n // byte-for-byte (ISO 32000: BBox→/Rect fitting translates the pixels);\n // everything else re-bakes. With no existing normal /AP there is\n // nothing to preserve, so any appearance-relevant write bakes one (v2\n // parity — otherwise the annotation renders as nothing). The verdict is\n // echoed on the result: clients drive raster invalidation off\n // `appearance.changed` instead of guessing from the patch they sent.\n const impact = appearanceImpactOf(currentDto, patch);\n let appearance: AppearanceOutcome;\n if (\n impact === 'inert' ||\n (impact === 'translation' &&\n fn.EPDFAnnot_HasAppearanceStream(annotPtr, APPEARANCE_MODE_NORMAL))\n ) {\n appearance = { action: 'preserved', changed: false };\n } else {\n const ok = this.regenerateAppearance(\n annotPtr,\n pagePtr,\n patch.blendMode ?? previousBlendMode,\n );\n appearance = ok\n ? { action: 'regenerated', changed: true }\n : // No generic generator for this subtype (e.g. widgets). The\n // dictionary still changed when the patch was appearance-relevant,\n // so `changed` stays true in that case — form-layer renderers may\n // paint differently even though no /AP was written.\n { action: 'generation-unavailable', changed: impact === 'regenerate' };\n }\n\n // PDFium caches the parsed appearance form on an annotation context. A\n // regenerated /AP is persisted immediately, but reading blend mode through\n // the same handle can still observe that old form. Reopen the non-structural\n // target before read-back so the returned DTO reflects the new stream.\n fn.FPDFPage_CloseAnnot(annotPtr);\n annotPtr = null;\n annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n\n // Read back. Update is non-structural, so the index does NOT move\n // and the revision does NOT bump.\n const newIndex = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (newIndex < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${newIndex} after update`,\n );\n }\n const dto = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n ref.pageObjectNumber,\n newIndex,\n pageStateBefore.revision,\n readContextFor(this.session),\n );\n joinWidgetFieldNumbers(this.runtime, this.session, [dto]);\n\n this.recordWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(ref.pageObjectNumber);\n const meta = computeMutationImpact({\n mutation: 'update',\n pageStateBefore,\n pageStateAfter,\n changed: linkedParentId ? [stableId, linkedParentId] : [stableId],\n });\n return { updated: dto, appearance, meta };\n } finally {\n if (annotPtr !== null) fn.FPDFPage_CloseAnnot(annotPtr);\n pool.release(ref.pageObjectNumber);\n }\n }\n\n /**\n * Attached widgets are views of a form field: deleting one here would\n * orphan the field's /Kids (the corruption class doc.forms.repair\n * exists to fix). Detach first, or use the forms-plane cascade.\n */\n private assertNotAttachedWidget(annotPtr: Ptr): void {\n const { fn } = this.runtime;\n if (fn.FPDFAnnot_GetSubtype(annotPtr) !== PdfAnnotationSubtypeCode.WIDGET) return;\n const annotObjectNumber = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (resolveWidgetFieldObjectNumber(this.runtime, this.session, annotObjectNumber) === 0) {\n return; // inert widget: an ordinary annotation, ordinary delete\n }\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'widget is attached to a form field - use doc.forms.detachWidget or doc.forms.deleteField',\n );\n }\n\n delete(ref: AnnotationRef, signal: AbortSignal): AnnotationDeleteResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(ref.pageObjectNumber);\n let bumpRequested = false;\n try {\n this.ensureKnownWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateBefore = this.session.pageState(ref.pageObjectNumber);\n throwIfAborted(signal);\n\n let deleted: AnnotationStableId | null;\n let ok = false;\n switch (ref.kind) {\n case 'objectNumber': {\n // Probe so we 404 honestly before mutating. The fork helper\n // does its own existence check too, but we want a clean\n // InvalidReference up front rather than a \"false\" return code\n // we'd have to translate.\n const probe = fn.EPDFPage_GetAnnotByObjectNumber(pagePtr, ref.annotObjectNumber);\n if (!probe) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with object number ${ref.annotObjectNumber} on page ${ref.pageObjectNumber}`,\n );\n }\n try {\n this.assertNotAttachedWidget(probe);\n } finally {\n fn.FPDFPage_CloseAnnot(probe);\n }\n bumpRequested = true;\n ok = fn.EPDFPage_RemoveAnnotByObjectNumber(pagePtr, ref.annotObjectNumber);\n deleted = { kind: 'objectNumber', value: ref.annotObjectNumber };\n break;\n }\n case 'nm': {\n const namePtr = mem.writeU16String(ref.nm);\n try {\n const probe = fn.EPDFPage_GetAnnotByName(pagePtr, namePtr);\n if (!probe) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with /NM '${ref.nm}' on page ${ref.pageObjectNumber}`,\n );\n }\n try {\n this.assertNotAttachedWidget(probe);\n } finally {\n fn.FPDFPage_CloseAnnot(probe);\n }\n bumpRequested = true;\n ok = fn.EPDFPage_RemoveAnnotByName(pagePtr, namePtr);\n } finally {\n mem.free(namePtr);\n }\n deleted = { kind: 'nm', value: ref.nm };\n break;\n }\n case 'index': {\n this.session.validateRevision(ref.revision);\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, ref.index);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `index ${ref.index} out of range on page ${ref.pageObjectNumber}`,\n );\n }\n let probedObjNum: number;\n let probedNm: string | null;\n try {\n probedObjNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n probedNm = readAnnotString(fn, mem, annotPtr, 'NM');\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n deleted =\n probedObjNum > 0\n ? { kind: 'objectNumber', value: probedObjNum }\n : probedNm !== null && probedNm.length > 0\n ? { kind: 'nm', value: probedNm }\n : null;\n bumpRequested = true;\n // EPDFPage_RemoveAnnot is the fork helper that ALSO cleans up\n // the indirect object if the annotation has one. The vanilla\n // FPDFPage_RemoveAnnot would leak the indirect object.\n ok = fn.EPDFPage_RemoveAnnot(pagePtr, ref.index);\n break;\n }\n }\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to remove annotation: ${ref.kind}`);\n }\n\n // Structural change; bump the local index-space epoch now and stop\n // the finally-bump. Do not gate this on the page's current weak state:\n // old snapshots can still hold index refs from before annotations were\n // strengthened, and delete/move can make those refs point elsewhere.\n this.session.bumpRevision(ref.pageObjectNumber);\n bumpRequested = false;\n this.recordWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(ref.pageObjectNumber);\n\n const meta = computeMutationImpact({\n mutation: 'delete',\n pageStateBefore,\n pageStateAfter,\n changed: deleted ? [deleted] : [],\n });\n return { deleted, meta };\n } finally {\n if (bumpRequested) this.session.bumpRevision(ref.pageObjectNumber);\n pool.release(ref.pageObjectNumber);\n }\n }\n\n /**\n * Batch reorder of a contiguous block of annotations within a single\n * page's /Annots array. Symmetric with `pages.move()` for pages.\n *\n * Semantics (locked with the user, mirrors `EPDFPage_MoveAnnots`):\n * - Each ref in `refs` is resolved to its current /Annots index.\n * The block is detached, then re-inserted at `toIndex` in the\n * post-removal index space, preserving caller-supplied order.\n * - Single-annotation case is `move([ref], toIndex)`. There is no\n * separate single-move path; one batch primitive serves both.\n * - Atomic from the caller's perspective:\n * * one revision bump per batch, regardless of `refs.length`.\n * * one `AnnotationListMutationMeta` envelope.\n * * if `EPDFPage_MoveAnnots` rejects (returns false) the page is\n * untouched and we throw `InvalidArg` without bumping.\n * - Identity strengthening: each weak ref in the batch (no\n * `objectNumber`, no `/NM`) is opportunistically stamped with a\n * fresh engine-generated UUID v4 BEFORE the move. So\n * `meta.changed` always lists durable stable ids, and the moved\n * DTOs come out durable. Same monotonic `/NM` rule as `update()`.\n *\n * Validation rules applied here BEFORE calling the helper, so callers\n * get clean errors instead of an opaque `false` return code:\n * - `refs.length >= 1`.\n * - All refs target the page identified by `pageObjectNumber`.\n * - `toIndex >= 0` and `toIndex <= count - refs.length` (count is\n * captured AFTER ref resolution, so the helper sees the same view).\n * - Resolved indices have no duplicates.\n *\n * The `EPDFPage_MoveAnnots` helper itself enforces the same rules; the\n * up-front validation is purely for a usable error surface.\n */\n move(\n pageObjectNumber: PageObjectNumber,\n refs: AnnotationRef[],\n toIndex: number,\n signal: AbortSignal,\n ): AnnotationMoveResult {\n throwIfAborted(signal);\n if (refs.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'move requires at least one ref');\n }\n if (toIndex < 0 || !Number.isInteger(toIndex)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move toIndex must be a non-negative integer (got ${toIndex})`,\n );\n }\n for (const r of refs) {\n if (r.pageObjectNumber !== pageObjectNumber) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move refs must all target page ${pageObjectNumber}; got ref on page ${r.pageObjectNumber}`,\n );\n }\n }\n\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n let bumpRequested = false;\n\n try {\n this.ensureKnownWeakStateFromPage(pageObjectNumber, pagePtr);\n const pageStateBefore = this.session.pageState(pageObjectNumber);\n throwIfAborted(signal);\n\n // 1. Resolve every ref in caller order. For each: capture its\n // current /Annots index and its (possibly newly-stamped)\n // stable id. We close each annotPtr right after probing — the\n // move helper takes the page-level pointer, and we'll re-open\n // annotPtrs later by *new* index for the readback.\n const fromIndices: number[] = new Array(refs.length);\n const stableIds: AnnotationStableId[] = new Array(refs.length);\n for (let i = 0; i < refs.length; i++) {\n throwIfAborted(signal);\n const annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, refs[i]);\n try {\n const idx = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (idx < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${idx} during move resolution`,\n );\n }\n fromIndices[i] = idx;\n stableIds[i] = this.captureOrStampStableId(annotPtr);\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n // 2. Reject duplicate source indices up front. Two refs that\n // resolve to the same index would violate the helper's\n // invariant (and would also be a confused caller).\n const seen = new Set<number>();\n for (const idx of fromIndices) {\n if (seen.has(idx)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move refs resolve to duplicate /Annots index ${idx}`,\n );\n }\n seen.add(idx);\n }\n\n // 3. Range-check toIndex against the post-removal count, matching\n // the helper's contract.\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n const postRemovalCount = count - fromIndices.length;\n if (toIndex > postRemovalCount) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move toIndex ${toIndex} out of range; post-removal count is ${postRemovalCount}`,\n );\n }\n\n // 4. Marshal fromIndices into an i32 array in runtime memory and\n // invoke the helper. From this call onward a structural change\n // may have happened; finally-bump on any failure.\n const arrBytes = 4 * fromIndices.length;\n const arrPtr = mem.alloc(arrBytes);\n let ok: boolean;\n try {\n for (let i = 0; i < fromIndices.length; i++) {\n mem.poke(arrPtr, 'i32', fromIndices[i], 4 * i);\n }\n bumpRequested = true;\n ok = fn.EPDFPage_MoveAnnots(pagePtr, arrPtr, fromIndices.length, toIndex);\n } finally {\n mem.free(arrPtr);\n }\n\n if (!ok) {\n // The helper validates atomically: a `false` return means it\n // rejected the request and made no changes. Cancel the pending\n // bump and surface a clean error.\n bumpRequested = false;\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `EPDFPage_MoveAnnots rejected the request (toIndex=${toIndex}, fromIndices=[${fromIndices.join(\n ',',\n )}])`,\n );\n }\n\n // 5. Single revision bump for the whole batch. This is the local\n // index-space epoch, so it advances for every successful move even\n // if the page is currently strong. Read back DTOs against the\n // bumped revision so they are internally consistent.\n const bumpedRev = this.session.bumpRevision(pageObjectNumber);\n bumpRequested = false;\n\n const moved: AnnotationDTO[] = new Array(fromIndices.length);\n for (let i = 0; i < fromIndices.length; i++) {\n throwIfAborted(signal);\n const newIdx = toIndex + i;\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, newIdx);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `failed to re-read moved annotation at index ${newIdx}`,\n );\n }\n try {\n moved[i] = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n pageObjectNumber,\n newIdx,\n bumpedRev,\n readContextFor(this.session),\n );\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n this.recordWeakStateFromPage(pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(pageObjectNumber);\n const meta: AnnotationListMutationMeta = computeMutationImpact({\n mutation: 'move',\n pageStateBefore,\n pageStateAfter,\n changed: stableIds,\n });\n return { moved, meta };\n } finally {\n if (bumpRequested) this.session.bumpRevision(pageObjectNumber);\n pool.release(pageObjectNumber);\n }\n }\n\n /**\n * Bake (or re-bake) an annotation's `/AP` normal appearance stream from\n * its current dictionary properties using PDFium's native AP generator,\n * then flush the page content so the result is persisted into the\n * page/object tree. Same path the v2 engine used after every\n * create/update; runs for every writable subtype (shapes + text-markup).\n *\n * Best-effort: `EPDFAnnot_GenerateAppearance` returns false for subtypes\n * PDFium has no generator for (e.g. widgets), in which case the\n * annotation simply ships without a baked `/AP` and viewers synthesize\n * one — so a false return is not a hard error; it is surfaced to `update`\n * callers as the `generation-unavailable` appearance outcome. This step is\n * non-structural: it never shifts annotation indices or bumps revisions.\n */\n private regenerateAppearance(annotPtr: Ptr, pagePtr: Ptr, blendMode?: BlendMode): boolean {\n const { fn } = this.runtime;\n const ok =\n blendMode === undefined\n ? fn.EPDFAnnot_GenerateAppearance(annotPtr)\n : fn.EPDFAnnot_GenerateAppearanceWithBlend(annotPtr, blendModeToCode(blendMode));\n fn.FPDFPage_GenerateContent(pagePtr);\n return ok;\n }\n\n private captureOrStampStableId(annotPtr: Ptr): AnnotationStableId {\n return captureOrStampStableId(this.runtime, annotPtr);\n }\n\n private ensureKnownWeakStateFromPage(pageObjectNumber: PageObjectNumber, pagePtr: Ptr): void {\n if (this.session.weakAnnotationState(pageObjectNumber).kind === 'known') {\n return;\n }\n this.recordWeakStateFromPage(pageObjectNumber, pagePtr);\n }\n\n private recordWeakStateFromPage(pageObjectNumber: PageObjectNumber, pagePtr: Ptr): void {\n this.session.recordWeakFlag(pageObjectNumber, this.computeHasWeakAnnotations(pagePtr));\n }\n\n private computeHasWeakAnnotations(pagePtr: Ptr): boolean {\n const { fn, mem } = this.runtime;\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotCount returned ${count} while computing weak annotations`,\n );\n }\n for (let i = 0; i < count; i++) {\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, i);\n if (!annotPtr) {\n continue;\n }\n try {\n const objNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (objNum > 0) {\n continue;\n }\n const nm = readAnnotString(fn, mem, annotPtr, 'NM');\n if (nm === null || nm.length === 0) {\n return true;\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n return false;\n }\n}\n","import type {\n MutationMeta,\n PageFlattenResult,\n PageFlattenUsage,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, serializeError } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { AnnotationReader } from '../annotations';\n\nconst FLATTEN_FAIL = 0;\nconst FLATTEN_SUCCESS = 1;\nconst FLATTEN_NOTHING_TO_DO = 2;\n\n/** Layer-safe page flattening. Content and annotation liveness change together. */\nexport class PagesFlattener {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n flatten(\n pageObjectNumbers: PageObjectNumber[],\n usage: PageFlattenUsage,\n signal: AbortSignal,\n ): PageFlattenResult {\n throwIfAborted(signal);\n requireUniquePages(pageObjectNumbers);\n for (const pageObjectNumber of pageObjectNumbers) {\n this.session.recordByObjectNumber(pageObjectNumber);\n }\n\n const results: PageFlattenResult['results'] = [];\n const affected = new Set<PageObjectNumber>();\n let stop = false;\n for (const pageObjectNumber of pageObjectNumbers) {\n if (stop || (signal.aborted && affected.size > 0)) {\n stop = true;\n results.push({ pageObjectNumber, status: 'skipped' });\n continue;\n }\n if (signal.aborted) throwIfAborted(signal);\n\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n let code: number;\n try {\n code = this.runtime.fn.EPDFPage_Flatten(pagePtr, usage === 'print' ? 1 : 0);\n } catch (error) {\n affected.add(pageObjectNumber);\n results.push({ pageObjectNumber, status: 'failed', error: serializeError(error) });\n stop = true;\n continue;\n } finally {\n pool.release(pageObjectNumber);\n }\n\n if (code === FLATTEN_NOTHING_TO_DO) {\n results.push({ pageObjectNumber, status: 'unchanged' });\n } else if (code === FLATTEN_SUCCESS) {\n affected.add(pageObjectNumber);\n results.push({ pageObjectNumber, status: 'applied' });\n } else {\n affected.add(pageObjectNumber);\n results.push({\n pageObjectNumber,\n status: 'failed',\n error: serializeError(\n new EngineError(\n EngineErrorCode.Unknown,\n code === FLATTEN_FAIL\n ? 'native page flatten failed after preflight'\n : `native page flatten returned unexpected code ${code}`,\n ),\n ),\n });\n stop = true;\n }\n }\n\n if (affected.size === 0) return { pageObjectNumbers, usage, results, meta: null };\n\n this.session.noteMutation();\n for (const pageObjectNumber of affected) {\n this.session.bumpRevision(pageObjectNumber);\n try {\n // Recompute the weak-annotation flag from the annotations that remain.\n new AnnotationReader(this.runtime, this.session).list(pageObjectNumber, signal);\n } catch {\n // The page state remains conservatively unknown. Never lose the layer\n // artifact because a post-flatten diagnostic read failed.\n }\n }\n const meta: MutationMeta = {\n affectedPages: [...affected].map((pageObjectNumber) =>\n this.session.pageState(pageObjectNumber),\n ),\n cacheDelta: null,\n };\n return { pageObjectNumbers, usage, results, meta };\n }\n}\n\nfunction requireUniquePages(pageObjectNumbers: PageObjectNumber[]): void {\n if (pageObjectNumbers.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.flatten requires at least one page');\n }\n const seen = new Set<PageObjectNumber>();\n for (const pageObjectNumber of pageObjectNumbers) {\n if (seen.has(pageObjectNumber)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.flatten was given duplicate page object number ${pageObjectNumber}`,\n );\n }\n seen.add(pageObjectNumber);\n }\n}\n","import type {\n AnnotationRef,\n MutationMeta,\n PageObjectNumber,\n RedactionApplyResult,\n RedactionApplyScope,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n serializeError,\n subtypeFromCode,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { I32_BYTES, readI32 } from '../../runtime/memory/structs';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { throwIfAborted } from '../../shared/abort';\nimport { AnnotationReader } from '../annotations';\nimport { resolveAnnotPtr } from '../annotations/internal/identity/resolveAnnotationPointer';\n\n/**\n * The destructive half of redaction (see `DocumentRedactionService` for the\n * model and the layer trust boundary). Content and annotation liveness\n * change together, exactly like {@link PagesFlattener} — this class mirrors\n * its validate-then-apply boundary and ordered-batch semantics.\n *\n * Scope semantics:\n * - `pages`: every REDACT annotation on each listed page is applied; a\n * page with none is `unchanged`.\n * - `annotations`: exactly the referenced REDACT annotations are applied.\n * Every ref is resolved and subtype-checked BEFORE the first native\n * write; a non-REDACT ref rejects the whole call with `InvalidArg`.\n *\n * The per-page `removedAnnotationCount` is the native collateral count:\n * annotations other than REDACT ones removed alongside the apply (popup\n * cascades and detached widgets included).\n */\nexport class RedactionApplier {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n apply(scope: RedactionApplyScope, signal: AbortSignal): RedactionApplyResult {\n throwIfAborted(signal);\n\n const plan = this.buildPlan(scope);\n for (const pageObjectNumber of plan.keys()) {\n this.session.recordByObjectNumber(pageObjectNumber);\n }\n this.preflight(plan, signal);\n\n const { fn } = this.runtime;\n const results: RedactionApplyResult['results'] = [];\n const affected = new Set<PageObjectNumber>();\n let totalRemoved = 0;\n let stop = false;\n\n for (const [pageObjectNumber, refs] of plan) {\n if (stop || (signal.aborted && affected.size > 0)) {\n stop = true;\n results.push({ pageObjectNumber, status: 'skipped', removedAnnotationCount: 0 });\n continue;\n }\n if (signal.aborted) throwIfAborted(signal);\n\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n try {\n const outcome =\n refs === null ? this.applyAllOnPage(pagePtr) : this.applyRefsOnPage(pagePtr, refs);\n if (outcome.status === 'applied') {\n fn.FPDFPage_GenerateContent(pagePtr);\n affected.add(pageObjectNumber);\n totalRemoved += outcome.removed;\n }\n results.push({\n pageObjectNumber,\n status: outcome.status,\n removedAnnotationCount: outcome.removed,\n });\n } catch (error) {\n affected.add(pageObjectNumber);\n results.push({\n pageObjectNumber,\n status: 'failed',\n removedAnnotationCount: 0,\n error: serializeError(error),\n });\n stop = true;\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n if (affected.size === 0) {\n return { scope, results, removedAnnotationCount: totalRemoved, meta: null };\n }\n\n this.session.noteMutation();\n for (const pageObjectNumber of affected) {\n this.session.bumpRevision(pageObjectNumber);\n try {\n // Recompute the weak-annotation flag from the annotations that remain.\n new AnnotationReader(this.runtime, this.session).list(pageObjectNumber, signal);\n } catch {\n // The page state remains conservatively unknown. Never lose the layer\n // artifact because a post-apply diagnostic read failed.\n }\n }\n const meta: MutationMeta = {\n affectedPages: [...affected].map((pageObjectNumber) =>\n this.session.pageState(pageObjectNumber),\n ),\n cacheDelta: null,\n };\n return { scope, results, removedAnnotationCount: totalRemoved, meta };\n }\n\n /**\n * Normalize the scope into an ordered per-page plan. `null` refs means\n * \"every REDACT annotation on the page\" (the `pages` scope).\n */\n private buildPlan(scope: RedactionApplyScope): Map<PageObjectNumber, AnnotationRef[] | null> {\n const plan = new Map<PageObjectNumber, AnnotationRef[] | null>();\n if (scope.kind === 'pages') {\n if (scope.pageObjectNumbers.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'redaction.apply requires at least one page',\n );\n }\n for (const pageObjectNumber of scope.pageObjectNumbers) {\n if (plan.has(pageObjectNumber)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `redaction.apply was given duplicate page object number ${pageObjectNumber}`,\n );\n }\n plan.set(pageObjectNumber, null);\n }\n return plan;\n }\n\n if (scope.refs.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'redaction.apply requires at least one annotation ref',\n );\n }\n for (const ref of scope.refs) {\n const existing = plan.get(ref.pageObjectNumber);\n if (existing === null) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'mixed redaction scopes on one page');\n }\n if (existing) existing.push(ref);\n else plan.set(ref.pageObjectNumber, [ref]);\n }\n // Applying removes annotations, which shifts positional indices — a\n // batch of multiple refs on one page can only address the survivors\n // stably through durable ref kinds.\n for (const [pageObjectNumber, refs] of plan) {\n if (refs !== null && refs.length > 1 && refs.some((r) => r.kind === 'index')) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `multiple redactions on page ${pageObjectNumber} cannot be addressed by positional 'index' refs — use objectNumber/nm refs, or one apply call per index ref`,\n );\n }\n }\n return plan;\n }\n\n /**\n * Validate every ref BEFORE the first native write: it must resolve and\n * it must be a REDACT annotation. After this returns, the apply loop's\n * writes begin and per-page failures are recorded, not thrown.\n */\n private preflight(\n plan: Map<PageObjectNumber, AnnotationRef[] | null>,\n signal: AbortSignal,\n ): void {\n const { fn } = this.runtime;\n for (const [pageObjectNumber, refs] of plan) {\n if (refs === null) continue;\n throwIfAborted(signal);\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n try {\n for (const ref of refs) {\n const annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n try {\n const subtype = subtypeFromCode(fn.FPDFAnnot_GetSubtype(annotPtr));\n if (subtype !== 'redact') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `redaction.apply ref on page ${pageObjectNumber} resolves to a '${subtype}' annotation, not a redact annotation`,\n );\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n }\n\n private applyAllOnPage(pagePtr: Ptr): { status: 'applied' | 'unchanged'; removed: number } {\n const { fn, mem } = this.runtime;\n const hasRedactions = this.pageHasRedactAnnotations(pagePtr);\n return withScratch(mem, I32_BYTES, (countPtr) => {\n const ok = fn.EPDFPage_ApplyRedactions(pagePtr, countPtr);\n if (!ok) {\n // Native FALSE is overloaded: it means either \"no REDACT annotations\"\n // or that applying one failed. Distinguish those cases before the\n // destructive call so a sanitizer failure is never reported as an\n // unchanged page.\n if (hasRedactions) {\n throw new EngineError(EngineErrorCode.Unknown, 'native page redaction apply failed');\n }\n return { status: 'unchanged' as const, removed: 0 };\n }\n return { status: 'applied' as const, removed: readI32(mem, countPtr) >>> 0 };\n });\n }\n\n private pageHasRedactAnnotations(pagePtr: Ptr): boolean {\n const { fn } = this.runtime;\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n for (let index = 0; index < count; index++) {\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, index);\n if (!annotPtr) continue;\n try {\n if (subtypeFromCode(fn.FPDFAnnot_GetSubtype(annotPtr)) === 'redact') return true;\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n return false;\n }\n\n private applyRefsOnPage(\n pagePtr: Ptr,\n refs: AnnotationRef[],\n ): { status: 'applied'; removed: number } {\n const { fn, mem } = this.runtime;\n let removed = 0;\n for (const ref of refs) {\n // Re-resolve at apply time: an earlier apply on this page may have\n // removed collateral annotations, and durable refs stay valid across\n // that (preflight rejected fragile batched index refs).\n const annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n try {\n const ok = withScratch(mem, I32_BYTES, (countPtr) => {\n const applied = fn.EPDFAnnot_ApplyRedaction(pagePtr, annotPtr, countPtr);\n if (applied) removed += readI32(mem, countPtr) >>> 0;\n return applied;\n });\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'native redaction apply failed after preflight',\n );\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n return { status: 'applied', removed };\n }\n}\n","import type { CharMapAnchor, PageObjectNumber, PageTextSnapshot } from '@embedpdf/engine-core/runtime';\nimport { charMapViolation, EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Per-page slow-path text reader. Acquires a `pagePtr` from the\n * `PagePtrPool`, opens a PDFium text page (`FPDFText_LoadPage`), extracts\n * the page text, and releases everything in reverse order.\n *\n * Index spaces (see engine-core `text/charmap.ts`): `charCount` is the\n * CHARACTER space (`FPDFText_CountChars` — the space geometry runs tile);\n * `text` is the TEXT projection. The two diverge when a character\n * contributes zero text units (non-printing) or two (supplementary plane);\n * `charMap` anchors encode exactly those deviations.\n *\n * Both come from the fork's batched extension calls, which share one\n * encoding authority (`FX_UTF16Encode`) so text and map can never\n * disagree:\n *\n * - `EPDFText_GetTextFull` — true UTF-16LE extraction; supplementary\n * characters arrive as surrogate pairs instead of being silently\n * dropped by `FPDFText_GetText`'s UCS-2 encoder. Called once with an\n * upper-bound buffer (2 units per character + NUL), so no measure\n * round-trip.\n * - `EPDFText_GetCharToTextMap` — the anchors, measure-then-fill. Zero\n * anchors is the common (identity) page and skips the fill call.\n */\nexport class PageTextReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(pageObjectNumber: PageObjectNumber, signal: AbortSignal): PageTextSnapshot {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n throwIfAborted(signal);\n const textPagePtr = fn.FPDFText_LoadPage(pagePtr);\n if (!textPagePtr) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `FPDFText_LoadPage returned null for page object ${pageObjectNumber}`,\n );\n }\n try {\n throwIfAborted(signal);\n const charCount = Math.max(fn.FPDFText_CountChars(textPagePtr), 0);\n const text = readTextFull(this.runtime, textPagePtr, charCount);\n const charMap = readCharMap(this.runtime, textPagePtr, pageObjectNumber);\n // Cross-check the two calls against the shared invariants — a\n // disagreement is an engine bug and must fail loudly, never ship a\n // snapshot that slices wrong.\n const violation = charMapViolation(charCount, text.length, charMap);\n if (violation !== null) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `char map invariant violated for page object ${pageObjectNumber}: ${violation}`,\n );\n }\n return charMap.length > 0 ? { text, charCount, charMap } : { text, charCount };\n } finally {\n fn.FPDFText_ClosePage(textPagePtr);\n }\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n}\n\n/**\n * Full-fidelity page text in one call: the buffer is sized at the maximum\n * possible expansion (every character a surrogate pair, plus the NUL), so\n * the returned requirement always fits and the measure round-trip is\n * skipped. The return value counts UTF-16 units INCLUDING the terminator.\n */\nfunction readTextFull(\n runtime: PdfRuntimeModule,\n textPagePtr: Ptr,\n charCount: number,\n): string {\n if (charCount <= 0) return '';\n const { fn, mem } = runtime;\n const bufUnits = charCount * 2 + 1;\n return withScratch(mem, bufUnits * 2, (buf) => {\n const written = fn.EPDFText_GetTextFull(textPagePtr, buf, bufUnits);\n if (written <= 1) return '';\n return decodeUtf16Le(mem.readBytes(buf, (written - 1) * 2));\n });\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n const units = new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1);\n let out = '';\n const CHUNK = 0x2000;\n for (let i = 0; i < units.length; i += CHUNK) {\n out += String.fromCharCode(...units.subarray(i, Math.min(i + CHUNK, units.length)));\n }\n return out;\n}\n\n/** Anchor struct layout: two little-endian i32s (see EPDF_CHAR_MAP_ANCHOR). */\nconst ANCHOR_BYTES = 8;\n\nfunction readCharMap(\n runtime: PdfRuntimeModule,\n textPagePtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n): CharMapAnchor[] {\n const { fn, mem } = runtime;\n const count = fn.EPDFText_GetCharToTextMap(textPagePtr, NULL_PTR, 0);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `EPDFText_GetCharToTextMap failed for page object ${pageObjectNumber}`,\n );\n }\n if (count === 0) return [];\n return withScratch(mem, count * ANCHOR_BYTES, (buf) => {\n fn.EPDFText_GetCharToTextMap(textPagePtr, buf, count);\n const bytes = mem.readBytes(buf, count * ANCHOR_BYTES);\n const words = new Int32Array(bytes.buffer, bytes.byteOffset, count * 2);\n const anchors: CharMapAnchor[] = new Array(count);\n for (let i = 0; i < count; i++) {\n anchors[i] = [words[i * 2], words[i * 2 + 1]];\n }\n return anchors;\n });\n}\n","import type {\n PageGeometryGlyph,\n PageGeometryRun,\n PageGeometrySnapshot,\n PageObjectNumber,\n PdfQuad,\n PdfRect,\n RotatedGeometryGlyph,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n normalizePdfRect,\n pdfQuadBounds,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeMemory, PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport {\n EPDF_CHAR_GEOMETRY_LAYOUT,\n readF32,\n readI32,\n readRectF,\n} from '../../runtime/memory/structs';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Mid-object orientation drift that forces a run split (~0.5°). Real content\n * keeps one char matrix per text object; this guards the exotic cases so a\n * run's `rotation` is always representative of every glyph in it.\n */\nconst ROTATION_SPLIT_TOLERANCE = 0.0087;\n\n/**\n * One glyph as read from `EPDFText_GetCharGeometry`, plus the run-grouping\n * context sampled alongside it. Pure data — no native handles — so the\n * grouping stage below is a pure function the tests can drive directly.\n */\nexport interface RawGeometryGlyphRecord {\n /** Grouping key: the glyph's text object handle (opaque identity). */\n objectKey: number | bigint;\n /** Sampled at each text object's first glyph (run splits inherit it). */\n fontSize?: number;\n /**\n * Wire flags (bit 1 = space, bit 2 = empty). Synthesized-but-visible\n * glyphs (/ActualText pieces) stay 0, exactly like the legacy reader —\n * they represent real, selectable text.\n */\n flags: number;\n /** Page-space AABB (zeroed when empty). */\n looseBox: PdfRect;\n tightBox?: PdfRect;\n /** Oriented cells — real glyphs with a usable (non-singular) matrix only. */\n looseQuad?: PdfQuad;\n tightQuad?: PdfQuad;\n /** Native uprightness of the char matrix (empty glyphs: true, inert). */\n upright: boolean;\n /** Baseline angle (radians CCW, PDF y-up); 0 when upright. */\n rotation: number;\n /** True when the ascent vector maps opposite the rotated +y (det < 0). */\n ascentFlip: boolean;\n}\n\n/** The orientation class a run commits to at its first classifiable glyph. */\ntype RunClass = { upright: true } | { upright: false; rotation: number; ascentFlip: boolean };\n\n/**\n * Geometry-only text layout reader.\n *\n * Emits geometry in PDF user space (y-up edges) — the canonical engine\n * geometry. The viewer converts to content/view space via the page geometry\n * matrix; this reader applies NO Y-flip or device transform.\n *\n * One `EPDFText_GetCharGeometry` call per glyph supplies boxes, oriented\n * cells, and flags together; `buildRunsFromRawGlyphs` then groups glyphs\n * into the upright/rotated run union. Upright runs are byte-identical to the\n * pre-orientation reader (quads the native layer offers are deliberately\n * dropped — the dominant case never pays for orientation).\n */\nexport class PageGeometryReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(pageObjectNumber: PageObjectNumber, signal: AbortSignal): PageGeometrySnapshot {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n throwIfAborted(signal);\n const textPagePtr = fn.FPDFText_LoadPage(pagePtr);\n if (!textPagePtr) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `FPDFText_LoadPage returned null for page object ${pageObjectNumber}`,\n );\n }\n try {\n throwIfAborted(signal);\n const glyphCount = Math.max(fn.FPDFText_CountChars(textPagePtr), 0);\n const records: RawGeometryGlyphRecord[] = [];\n const geometryPtr = mem.alloc(EPDF_CHAR_GEOMETRY_LAYOUT.bytes);\n\n try {\n let prevObjectKey: number | bigint | null = null;\n for (let i = 0; i < glyphCount; i++) {\n throwIfAborted(signal);\n const objectKey = fn.FPDFText_GetTextObject(textPagePtr, i);\n const record: RawGeometryGlyphRecord = {\n objectKey,\n ...this.readGlyphRaw(textPagePtr, i, geometryPtr),\n };\n if (objectKey !== prevObjectKey) {\n record.fontSize = fn.FPDFText_GetFontSize(textPagePtr, i);\n prevObjectKey = objectKey;\n }\n records.push(record);\n }\n } finally {\n mem.free(geometryPtr);\n }\n\n return { runs: buildRunsFromRawGlyphs(records) };\n } finally {\n fn.FPDFText_ClosePage(textPagePtr);\n }\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n private readGlyphRaw(\n textPagePtr: Ptr,\n charIndex: number,\n geometryPtr: Ptr,\n ): Omit<RawGeometryGlyphRecord, 'objectKey' | 'fontSize'> {\n const { fn, mem } = this.runtime;\n if (!fn.EPDFText_GetCharGeometry(textPagePtr, charIndex, geometryPtr)) {\n return emptyRawGlyph();\n }\n\n const { offsets, flags: bits } = EPDF_CHAR_GEOMETRY_LAYOUT;\n const native = readI32(mem, geometryPtr, offsets.flags) >>> 0;\n // Degenerate geometry keeps the legacy zeroed-glyph convention so\n // upright snapshots stay bit-identical to the pre-orientation reader.\n if (native & bits.empty) {\n return emptyRawGlyph();\n }\n\n const upright = Boolean(native & bits.upright);\n const raw: Omit<RawGeometryGlyphRecord, 'objectKey' | 'fontSize'> = {\n flags: native & bits.space ? 1 : 0,\n looseBox: normalizePdfRect(readRectF(mem, geometryPtr, offsets.looseBox)),\n upright,\n rotation: 0,\n ascentFlip: false,\n };\n if (native & bits.hasTightBox) {\n raw.tightBox = normalizePdfRect(readRectF(mem, geometryPtr, offsets.tightBox));\n }\n if (native & bits.hasLooseQuad) {\n raw.looseQuad = readQuad(mem, geometryPtr, offsets.looseQuad);\n if (native & bits.hasTightQuad) {\n raw.tightQuad = readQuad(mem, geometryPtr, offsets.tightQuad);\n }\n if (!upright) {\n const a = readF32(mem, geometryPtr, offsets.matrix);\n const b = readF32(mem, geometryPtr, offsets.matrix + 4);\n const c = readF32(mem, geometryPtr, offsets.matrix + 8);\n const d = readF32(mem, geometryPtr, offsets.matrix + 12);\n raw.rotation = Math.atan2(b, a);\n raw.ascentFlip = a * d - b * c < 0;\n }\n }\n return raw;\n }\n}\n\n/**\n * Group per-glyph records into the run union. Pure — exported for tests.\n *\n * Runs split on text-object change (the legacy rule) and on orientation\n * change between classifiable glyphs (θ drift / mixed orientation). A run's\n * variant is decided by its FIRST classifiable glyph:\n * - empty glyphs never classify (they adopt the run's variant);\n * - real glyphs WITHOUT an oriented cell (singular matrix, synthesized\n * /ActualText pieces) classify as upright — box-only data degrades to\n * exactly the legacy behavior;\n * - real glyphs with a non-upright matrix classify as rotated.\n * Runs that never see a classifiable glyph emit as upright (degenerate,\n * legacy behavior).\n */\nexport function buildRunsFromRawGlyphs(records: RawGeometryGlyphRecord[]): PageGeometryRun[] {\n const runs: PageGeometryRun[] = [];\n let buffer: RawGeometryGlyphRecord[] = [];\n let charStart = 0;\n let fontSize: number | undefined;\n let objectKey: number | bigint | null = null;\n let cls: RunClass | undefined;\n\n const flush = (nextStart: number) => {\n if (buffer.length > 0) {\n runs.push(materializeRun(buffer, charStart, fontSize, cls));\n buffer = [];\n cls = undefined;\n }\n charStart = nextStart;\n };\n\n for (let i = 0; i < records.length; i++) {\n const record = records[i];\n if (record.objectKey !== objectKey) {\n flush(i);\n objectKey = record.objectKey;\n fontSize = record.fontSize;\n }\n const recordClass = classOf(record);\n if (recordClass) {\n if (cls && !sameClass(cls, recordClass)) flush(i);\n if (!cls) cls = recordClass;\n }\n buffer.push(record);\n }\n flush(records.length);\n return runs;\n}\n\nfunction classOf(record: RawGeometryGlyphRecord): RunClass | undefined {\n if (record.flags & 2) return undefined; // empty glyphs never classify\n if (record.looseQuad && !record.upright) {\n return { upright: false, rotation: record.rotation, ascentFlip: record.ascentFlip };\n }\n return { upright: true };\n}\n\nfunction sameClass(a: RunClass, b: RunClass): boolean {\n if (a.upright || b.upright) return a.upright === b.upright;\n if (a.ascentFlip !== b.ascentFlip) return false;\n const delta = a.rotation - b.rotation;\n return Math.abs(Math.atan2(Math.sin(delta), Math.cos(delta))) <= ROTATION_SPLIT_TOLERANCE;\n}\n\nfunction materializeRun(\n buffer: RawGeometryGlyphRecord[],\n charStart: number,\n fontSize: number | undefined,\n cls: RunClass | undefined,\n): PageGeometryRun {\n if (cls && !cls.upright) {\n const glyphs: RotatedGeometryGlyph[] = buffer.map((g) =>\n g.looseQuad\n ? {\n looseQuad: g.looseQuad,\n flags: g.flags,\n ...(g.tightQuad ? { tightQuad: g.tightQuad } : {}),\n }\n : // Empty glyphs inside a rotated run: zeroed quad + the empty flag,\n // mirroring the upright variant's zeroed-box convention.\n { looseQuad: zeroQuad(), flags: g.flags },\n );\n return {\n rect: runBounds(buffer, (g) => (g.looseQuad ? pdfQuadBounds(g.looseQuad) : ZERO_RECT)),\n charStart,\n glyphs,\n rotation: cls.rotation,\n ascentFlip: cls.ascentFlip,\n ...(fontSize !== undefined ? { fontSize } : {}),\n };\n }\n\n // Upright (and degenerate-only) runs: the legacy materialization verbatim —\n // native-offered quads are dropped, the rect seeds from the FIRST glyph's\n // box (zeroed for empty glyphs, quirk included) and expands over non-empty\n // glyphs only.\n const glyphs: PageGeometryGlyph[] = buffer.map((g) => ({\n looseBox: g.looseBox,\n flags: g.flags,\n ...(g.tightBox ? { tightBox: g.tightBox } : {}),\n }));\n return {\n rect: runBounds(buffer, (g) => g.looseBox),\n charStart,\n glyphs,\n ...(fontSize !== undefined ? { fontSize } : {}),\n };\n}\n\n/** Legacy run-rect algorithm: seed from the first glyph, expand on non-empty. */\nfunction runBounds(\n buffer: RawGeometryGlyphRecord[],\n boundsOf: (g: RawGeometryGlyphRecord) => PdfRect,\n): PdfRect {\n const seed = boundsOf(buffer[0]);\n const rect = { left: seed.left, bottom: seed.bottom, right: seed.right, top: seed.top };\n for (const g of buffer) {\n if (g.flags & 2) continue;\n const b = boundsOf(g);\n rect.left = Math.min(rect.left, b.left);\n rect.bottom = Math.min(rect.bottom, b.bottom);\n rect.right = Math.max(rect.right, b.right);\n rect.top = Math.max(rect.top, b.top);\n }\n return rect;\n}\n\nconst ZERO_RECT: PdfRect = { left: 0, bottom: 0, right: 0, top: 0 };\n\nfunction zeroQuad(): PdfQuad {\n return { p1: { x: 0, y: 0 }, p2: { x: 0, y: 0 }, p3: { x: 0, y: 0 }, p4: { x: 0, y: 0 } };\n}\n\nfunction emptyRawGlyph(): Omit<RawGeometryGlyphRecord, 'objectKey' | 'fontSize'> {\n return {\n flags: 2,\n looseBox: { left: 0, bottom: 0, right: 0, top: 0 },\n upright: true,\n rotation: 0,\n ascentFlip: false,\n };\n}\n\nfunction readQuad(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset: number): PdfQuad {\n const f = (offset: number) => readF32(mem, ptr, byteOffset + offset);\n return {\n p1: { x: f(0), y: f(4) },\n p2: { x: f(8), y: f(12) },\n p3: { x: f(16), y: f(20) },\n p4: { x: f(24), y: f(28) },\n };\n}\n","import type {\n PageObjectNumber,\n PageRenderOptions,\n PageRenderTarget,\n PdfRect,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, normalizePdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { FPDF_REVERSE_BYTE_ORDER, rasterize } from './deviceRaster';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\nconst FPDF_RENDER_ANNOT = 0x01;\n\nexport class PageRenderReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n render(pageObjectNumber: PageObjectNumber, options: PageRenderOptions, signal: AbortSignal) {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n throwIfAborted(signal);\n\n const pageWidth = fn.FPDF_GetPageWidthF(pagePtr);\n const pageHeight = fn.FPDF_GetPageHeightF(pagePtr);\n const target = resolveTarget(options.target, pageWidth, pageHeight);\n const rotation = options.rotation ?? 0;\n const viewport = options.viewport ?? { kind: 'scale', scale: 1 };\n\n let flags = FPDF_REVERSE_BYTE_ORDER;\n if (options.includeAnnotations ?? true) flags |= FPDF_RENDER_ANNOT;\n\n const raster = rasterize(this.runtime, {\n rect: target,\n page: { width: pageWidth, height: pageHeight },\n rotation,\n viewport,\n ...(options.maxOutputPixels !== undefined\n ? { maxOutputPixels: options.maxOutputPixels }\n : {}),\n background: options.background === 'transparent' ? 'transparent' : 'white',\n draw: (bitmapPtr, matrixPtr, clipPtr) => {\n throwIfAborted(signal);\n fn.FPDF_RenderPageBitmapWithMatrix(bitmapPtr, pagePtr, matrixPtr, clipPtr, flags);\n throwIfAborted(signal);\n return true;\n },\n });\n if (!raster) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `failed to render page object ${pageObjectNumber}`,\n );\n }\n return raster;\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n}\n\n/** Resolve the render target to a normalized PDF-space rect (page box, or a sub-rect). */\nfunction resolveTarget(\n target: PageRenderTarget | undefined,\n pageWidth: number,\n pageHeight: number,\n): PdfRect {\n if (!target || target.kind === 'page') {\n return { left: 0, bottom: 0, right: pageWidth, top: pageHeight };\n }\n const rect = normalizePdfRect(target.rect);\n if (rect.right <= rect.left || rect.top <= rect.bottom) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'render rect must have positive area');\n }\n return rect;\n}\n","import type {\n AnnotationRef,\n AttachmentFileWorkerPayload,\n EmbeddedFileItem,\n EmbeddedFileRef,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n extractAttachmentToBuffer,\n extractAttachmentToFile,\n readAttachmentFileInfo,\n readAttachmentKey,\n resolveAttachmentIndex,\n} from './internal/attachmentPrimitives';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { resolveAnnotPtr } from '../annotations/internal/identity/resolveAnnotationPointer';\n\n/**\n * Read-only access to embedded files, at both of their homes: the\n * document catalog's `/EmbeddedFiles` name tree (list / readFile by\n * index) and a FileAttachment annotation's `/FS` (readAnnotationFile by\n * ref). Pure READS over the session — no revision bumps, no layer\n * artifacts (the `PagesExtractor` shape).\n *\n * Byte delivery mirrors the request's `path?`: absent → a standalone\n * buffer for the transfer list (browser); present → the decoded file is\n * streamed to `path` via `FPDF_FILEWRITE` (server), and only metadata\n * rides the response.\n */\nexport class AttachmentReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /** Snapshot of the `/EmbeddedFiles` name tree, in tree (key-sorted) order. */\n list(signal: AbortSignal): EmbeddedFileItem[] {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const count = fn.FPDFDoc_GetAttachmentCount(docPtr);\n const items: EmbeddedFileItem[] = [];\n for (let index = 0; index < count; index++) {\n const attachmentPtr = fn.FPDFDoc_GetAttachment(docPtr, index);\n if (!attachmentPtr) continue;\n const key = readAttachmentKey(fn, mem, docPtr, index) ?? '';\n items.push({ ...readAttachmentFileInfo(fn, mem, attachmentPtr), key, index });\n }\n return items;\n }\n\n /** Decode one document-level embedded file, addressed by key. */\n readFile(\n ref: EmbeddedFileRef,\n path: string | undefined,\n maxDecodedBytes: number | undefined,\n signal: AbortSignal,\n ): AttachmentFileWorkerPayload {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const index = resolveAttachmentIndex(fn, mem, docPtr, ref);\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no embedded file with key '${ref.key}' in the document`,\n );\n }\n const attachmentPtr = fn.FPDFDoc_GetAttachment(docPtr, index);\n if (!attachmentPtr) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `embedded file with key '${ref.key}' resolved to index ${index} but could not be opened`,\n );\n }\n const info = readAttachmentFileInfo(fn, mem, attachmentPtr);\n return this.extract(attachmentPtr, info.name, info.mimeType, path, maxDecodedBytes);\n }\n\n /** Decode the file embedded in a FileAttachment annotation's `/FS`. */\n readAnnotationFile(\n pageObjectNumber: PageObjectNumber,\n ref: AnnotationRef,\n path: string | undefined,\n maxDecodedBytes: number | undefined,\n signal: AbortSignal,\n ): AttachmentFileWorkerPayload {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n let annotPtr: Ptr | null = null;\n try {\n annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n const attachmentPtr = fn.FPDFAnnot_GetFileAttachment(annotPtr);\n if (!attachmentPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'annotation is not a file attachment or carries no embedded file (/FS)',\n );\n }\n const info = readAttachmentFileInfo(fn, mem, attachmentPtr);\n return this.extract(attachmentPtr, info.name, info.mimeType, path, maxDecodedBytes);\n } finally {\n if (annotPtr !== null) fn.FPDFPage_CloseAnnot(annotPtr);\n pool.release(pageObjectNumber);\n }\n }\n\n private extract(\n attachmentPtr: Ptr,\n name: string,\n mimeType: string | undefined,\n path: string | undefined,\n maxDecodedBytes: number | undefined,\n ): AttachmentFileWorkerPayload {\n if (path !== undefined) {\n const { size } = extractAttachmentToFile(this.runtime, attachmentPtr, path, maxDecodedBytes);\n return { name, ...(mimeType ? { mimeType } : {}), size, path };\n }\n const { bytes, size } = extractAttachmentToBuffer(this.runtime, attachmentPtr, maxDecodedBytes);\n return { name, ...(mimeType ? { mimeType } : {}), size, bytes };\n }\n}\n","import type {\n AttachmentCreateResult,\n AttachmentDeleteResult,\n EmbeddedFileRef,\n WireAttachmentFile,\n WireResourceMap,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n readAttachmentFileInfo,\n resolveAttachmentIndex,\n writeAttachmentFilePayload,\n} from './internal/attachmentPrimitives';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Create/delete mutations over the document catalog's `/EmbeddedFiles`\n * name tree — the doc-level sibling of `AnnotationMutator`, sharing the\n * write path (`writeAttachmentFilePayload`) with the file-attachment\n * annotation writer.\n *\n * Identity is the name-tree KEY (unique by construction), so unlike\n * annotations there is no weak-ref/revision bookkeeping here. Note the\n * tree is key-sorted: both mutations shift OTHER entries' indices; keys\n * never move. Layer persistence (`finishMutation`) and event publication\n * happen in the callers, exactly like every other mutation family.\n */\nexport class AttachmentMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * Create an embedded file. `file.name` becomes the tree key (PDFium\n * writes key = /UF = /F); a duplicate key rejects with `InvalidArg`.\n * The result carries the read-back entry, `checksum`/`size`/dates\n * included.\n */\n create(\n file: WireAttachmentFile,\n resources: WireResourceMap | undefined,\n signal: AbortSignal,\n ): AttachmentCreateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const resource = resources?.[file.resource];\n if (!resource) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `attachment file references resource '${file.resource}' but no such binary payload accompanied the mutation`,\n );\n }\n if (file.name.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'attachment file requires a name');\n }\n\n // Duplicate keys are an identity violation, not a replace.\n // (FPDFDoc_AddAttachment would also refuse, but a probe first gives\n // the caller a precise error instead of a generic native failure.)\n if (resolveAttachmentIndex(fn, mem, docPtr, { kind: 'key', key: file.name }) !== -1) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `an embedded file with key '${file.name}' already exists — keys are unique; rename and retry`,\n );\n }\n\n throwIfAborted(signal);\n const namePtr = mem.writeU16String(file.name);\n let attachmentPtr: Ptr;\n try {\n attachmentPtr = fn.FPDFDoc_AddAttachment(docPtr, namePtr);\n } finally {\n mem.free(namePtr);\n }\n if (!attachmentPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFDoc_AddAttachment returned NULL');\n }\n\n writeAttachmentFilePayload(fn, mem, attachmentPtr, docPtr, file, resource);\n\n // Read back the materialised entry at its (name-sorted) position.\n const index = resolveAttachmentIndex(fn, mem, docPtr, { kind: 'key', key: file.name });\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'created attachment did not resolve by key after the write',\n );\n }\n return {\n created: { ...readAttachmentFileInfo(fn, mem, attachmentPtr), key: file.name, index },\n // Cloud coherence pins are a server concern; the worker reports none.\n cache: null,\n };\n }\n\n /** Delete an embedded file by key. Unlinks the tree entry only. */\n delete(ref: EmbeddedFileRef, signal: AbortSignal): AttachmentDeleteResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const index = resolveAttachmentIndex(fn, mem, docPtr, ref);\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no embedded file with key '${ref.key}' in the document`,\n );\n }\n if (!fn.FPDFDoc_DeleteAttachment(docPtr, index)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFDoc_DeleteAttachment returned false');\n }\n return { deleted: ref, cache: null };\n }\n}\n","import type { DocumentSecurityProbeInfo } from '@embedpdf/engine-core/runtime';\n\nimport { hasAllStandardSecurityPermissions } from '../../../shared/securityPermissions';\n\nexport type OpenedAs = 'none' | 'user' | 'owner';\n\n/**\n * Single constructor for the \"successfully inspected\" shape of\n * `DocumentSecurityProbeInfo`. Every path that actually resolves a\n * permission word — the cold file probe, the live-session snapshot, and\n * the password-permission check — funnels through here so the encrypted/\n * none distinction, the revision-nulling rule, and the\n * `pdfPermissionsAllAllowed` derivation stay defined in exactly one place.\n *\n * The password-blocked / unsupported / unknown shapes are NOT built here:\n * those carry null permission words and only the cold probe can produce\n * them, so they stay local to `SecurityReader.probeFile`.\n */\nexport function buildSecurityInfo(input: {\n openedAs: OpenedAs;\n permissionsBits: number;\n securityHandlerRevision: number | null;\n probedAt: number;\n}): DocumentSecurityProbeInfo {\n const encrypted = input.openedAs !== 'none';\n return {\n encryptionState: encrypted ? 'encrypted' : 'none',\n encryptionRequiresPassword: false,\n securityHandlerRevision: encrypted ? input.securityHandlerRevision : null,\n pdfPermissionsBits: input.permissionsBits,\n pdfPermissionsAllAllowed: hasAllStandardSecurityPermissions(input.permissionsBits),\n pdfOpenedAs: input.openedAs,\n securityProbedAt: input.probedAt,\n };\n}\n\n/**\n * Mirrors `EPDF_PASSWORD_PERMISSION_*` in public/fpdfview.h:\n * invalid=0, none=1, user=2, owner=3.\n */\nexport function openedAsFromCode(code: number): OpenedAs {\n if (code === 3) return 'owner';\n if (code === 2) return 'user';\n return 'none';\n}\n","import type { DocumentSecurityProbeInfo } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { buildSecurityInfo, openedAsFromCode } from './internal/buildSecurityInfo';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { ensureInitialized } from '../../runtime/lifecycle/bootstrap';\nimport { normalizeU32 } from '../../shared/securityPermissions';\n\nconst FPDF_ERR_PASSWORD = 4;\nconst FPDF_ERR_SECURITY = 5;\n\n/**\n * Reads document security/permission state. Three entry points:\n *\n * - `probeFile` is the only doc-less path: it opens, inspects, and\n * closes its own document straight off a file. It is the intentional\n * exception to the package's `(runtime, session)` reader shape — it\n * answers \"what is this file's security?\" before any session exists.\n * - `readLiveSecurityInfo` / `checkPasswordPermissions` inspect an\n * already-open `DocumentSession`.\n */\nexport class SecurityReader {\n constructor(private readonly runtime: PdfRuntimeModule) {\n // WorkerHost initializes the runtime before dispatching jobs, but\n // this reader is intentionally usable as a one-shot probe too.\n // `ensureInitialized()` is idempotent per runtime instance.\n ensureInitialized(this.runtime);\n }\n\n probeFile(path: string, password: string | null = null): DocumentSecurityProbeInfo {\n const now = Date.now();\n let access: ReturnType<PdfRuntimeModule['fileAccess']['fromNodeFile']> | null = null;\n let docPtr: Ptr | null = null;\n try {\n access = this.runtime.fileAccess.fromNodeFile(path);\n docPtr = this.runtime.fn.FPDF_LoadCustomDocument(access.ptr, password ?? '');\n if (!docPtr) {\n const err = this.runtime.fn.FPDF_GetLastError();\n if (err === FPDF_ERR_PASSWORD) {\n return {\n encryptionState: 'encrypted',\n encryptionRequiresPassword: true,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: now,\n };\n }\n if (err === FPDF_ERR_SECURITY) {\n return {\n encryptionState: 'unsupported',\n encryptionRequiresPassword: null,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: now,\n };\n }\n return unknownSecurity(now);\n }\n\n const encrypted = this.runtime.fn.EPDF_IsEncrypted(docPtr);\n // Cold probe (no password session): `FPDF_GetDocPermissions` reports\n // the document's declared permission word. Contrast with the live\n // session, which reads `FPDF_GetDocUserPermissions` (the effective\n // word after any owner unlock). See `readLiveSecurityInfo`.\n const bits = normalizeU32(this.runtime.fn.FPDF_GetDocPermissions(docPtr));\n const openedAs = !encrypted\n ? 'none'\n : this.runtime.fn.EPDF_IsOwnerUnlocked(docPtr)\n ? 'owner'\n : 'user';\n return buildSecurityInfo({\n openedAs,\n permissionsBits: bits,\n securityHandlerRevision: encrypted\n ? this.runtime.fn.FPDF_GetSecurityHandlerRevision(docPtr)\n : null,\n probedAt: now,\n });\n } finally {\n if (docPtr) this.runtime.fn.FPDF_CloseDocument(docPtr);\n access?.close();\n }\n }\n\n /**\n * Snapshot of the live session's EFFECTIVE security state.\n * `FPDF_GetDocUserPermissions` reports the permission word in force\n * right now (e.g. after an owner unlock), as opposed to the declared\n * word the cold `probeFile` path reads.\n */\n readLiveSecurityInfo(session: DocumentSession): DocumentSecurityProbeInfo {\n const { fn } = this.runtime;\n const docPtr = session.requireDocPtr();\n const encrypted = fn.EPDF_IsEncrypted(docPtr);\n const bits = normalizeU32(fn.FPDF_GetDocUserPermissions(docPtr));\n const openedAs = !encrypted ? 'none' : fn.EPDF_IsOwnerUnlocked(docPtr) ? 'owner' : 'user';\n return buildSecurityInfo({\n openedAs,\n permissionsBits: bits,\n securityHandlerRevision: encrypted ? fn.FPDF_GetSecurityHandlerRevision(docPtr) : null,\n probedAt: Date.now(),\n });\n }\n\n /**\n * Verify a password against the live session and report the resulting\n * effective permissions. Throws `DocPasswordIncorrect` when the\n * password is rejected, or (in `'owner'` mode) when it unlocks only as\n * a user.\n */\n checkPasswordPermissions(\n session: DocumentSession,\n password: string,\n mode: 'any' | 'owner' = 'any',\n ): DocumentSecurityProbeInfo {\n const docPtr = session.requireDocPtr();\n const { mem, fn } = this.runtime;\n const kindPtr = mem.alloc(4);\n const userPermissionsPtr = mem.alloc(4);\n const effectivePermissionsPtr = mem.alloc(4);\n const revisionPtr = mem.alloc(4);\n try {\n mem.poke(kindPtr, 'i32', 0);\n mem.poke(userPermissionsPtr, 'i32', 0);\n mem.poke(effectivePermissionsPtr, 'i32', 0);\n mem.poke(revisionPtr, 'i32', 0);\n const ok = fn.EPDF_CheckPasswordPermissions(\n docPtr,\n password,\n kindPtr,\n userPermissionsPtr,\n effectivePermissionsPtr,\n revisionPtr,\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.DocPasswordIncorrect, 'incorrect document password');\n }\n const openedAs = openedAsFromCode(Number(mem.peek(kindPtr, 'i32')));\n if (mode === 'owner' && openedAs !== 'owner') {\n throw new EngineError(EngineErrorCode.DocPasswordIncorrect, 'owner password required');\n }\n return buildSecurityInfo({\n openedAs,\n permissionsBits: normalizeU32(Number(mem.peek(effectivePermissionsPtr, 'i32'))),\n securityHandlerRevision: Number(mem.peek(revisionPtr, 'i32')),\n probedAt: Date.now(),\n });\n } finally {\n mem.free(revisionPtr);\n mem.free(effectivePermissionsPtr);\n mem.free(userPermissionsPtr);\n mem.free(kindPtr);\n }\n }\n}\n\nfunction unknownSecurity(now: number): DocumentSecurityProbeInfo {\n return {\n encryptionState: 'unknown',\n encryptionRequiresPassword: null,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: now,\n };\n}\n","import { EngineError, EngineErrorCode, type PdfSaveMode } from '@embedpdf/engine-core/runtime';\n\nconst FPDF_INCREMENTAL = 1 << 0;\nconst FPDF_NO_INCREMENTAL = 1 << 1;\n\nexport function pdfSaveModeFlags(mode: PdfSaveMode): number {\n return mode === 'incremental' ? FPDF_INCREMENTAL : FPDF_NO_INCREMENTAL;\n}\n\nexport function layerSaveError(status: number): EngineError {\n if (status === 1) {\n return new EngineError(\n EngineErrorCode.DocOpenFailed,\n 'layer artifact cannot be saved because append-only offsets exceed the supported range',\n );\n }\n return new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save layer artifact');\n}\n","import { EngineError, EngineErrorCode, type PdfSaveMode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { layerSaveError, pdfSaveModeFlags } from './internal/pdfSaveMode';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\n\n/**\n * Owns every \"serialize the open document\" path for a `DocumentSession`.\n * Two distinct outputs:\n *\n * - Layer artifacts (`saveLayerArtifact*`) are the storage-optimized\n * `.layer` delta used by server-side persistence. Only valid for a\n * `layer` session.\n * - Standalone saves (`saveStandalone*`) export a self-contained PDF\n * view (base + applied delta) via `FPDF_SaveAsCopy` /\n * `EPDF_SaveDocumentToOwnedBuffer`, valid for any session kind.\n *\n * Lives in `engine-services` so the browser Worker and the Node\n * `worker_thread` server share the exact same save code path.\n */\nexport class DocumentSaver {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n saveLayerArtifact(): { bytes: ArrayBuffer; size: number } {\n this.requireLayer();\n\n const { mem, fn } = this.runtime;\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n let artifactPtr: Ptr | null = null;\n try {\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', -1);\n artifactPtr = fn.EPDFLayer_SaveLayerArtifactToOwnedBuffer(\n this.session.requireDocPtr(),\n sizePtr,\n statusPtr,\n );\n const status = Number(mem.peek(statusPtr, 'i32'));\n const size = Number(mem.peek(sizePtr, 'i32'));\n if (!artifactPtr || status !== 0 || size <= 0) {\n throw layerSaveError(status);\n }\n\n const bytes = mem.readBytes(artifactPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size };\n } finally {\n if (artifactPtr) fn.EPDF_FreeBuffer(artifactPtr);\n mem.free(statusPtr);\n mem.free(sizePtr);\n }\n }\n\n saveLayerArtifactToFile(path: string): { path: string } {\n this.requireLayer();\n\n const { mem, fn } = this.runtime;\n const statusPtr = mem.alloc(4);\n const writer = this.runtime.fileWrite.toNodeFile(path);\n try {\n mem.poke(statusPtr, 'i32', -1);\n const ok = fn.EPDFLayer_SaveLayerArtifact(\n this.session.requireDocPtr(),\n writer.ptr,\n statusPtr,\n );\n const status = Number(mem.peek(statusPtr, 'i32'));\n if (!ok || status !== 0) {\n throw layerSaveError(status);\n }\n return { path };\n } finally {\n writer.close();\n mem.free(statusPtr);\n }\n }\n\n saveStandaloneToBuffer(mode: PdfSaveMode): { bytes: ArrayBuffer; size: number } {\n const { mem, fn } = this.runtime;\n const sizePtr = mem.alloc(4);\n let pdfPtr: Ptr | null = null;\n try {\n mem.poke(sizePtr, 'i32', 0);\n // Standalone saves are not layer artifacts. For a CPDF_LayerDocument,\n // FPDF_INCREMENTAL copies the base bytes through and appends the layer\n // delta as a normal PDF revision. The EPDFLayer_* artifact APIs are only\n // for internal server storage.\n pdfPtr = fn.EPDF_SaveDocumentToOwnedBuffer(\n this.session.requireDocPtr(),\n pdfSaveModeFlags(mode),\n sizePtr,\n );\n const size = Number(mem.peek(sizePtr, 'i32'));\n if (!pdfPtr || size <= 0) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save document');\n }\n\n const bytes = mem.readBytes(pdfPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size };\n } finally {\n if (pdfPtr) fn.EPDF_FreeBuffer(pdfPtr);\n mem.free(sizePtr);\n }\n }\n\n saveStandaloneToFile(path: string, mode: PdfSaveMode): { path: string } {\n const writer = this.runtime.fileWrite.toNodeFile(path);\n try {\n // See saveStandaloneToBuffer(): this exports a standalone PDF view,\n // not the storage-optimized `.layer` artifact.\n const ok = this.runtime.fn.FPDF_SaveAsCopy(\n this.session.requireDocPtr(),\n writer.ptr,\n pdfSaveModeFlags(mode),\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save document');\n }\n return { path };\n } finally {\n writer.close();\n }\n }\n\n private requireLayer(): void {\n if (this.session.kind !== 'layer') {\n throw new EngineError(EngineErrorCode.InvalidArg, 'document session is not a layer');\n }\n }\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFileAccessHandle, PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\n/**\n * A font to register at thread startup from a local file. Used by hosts that\n * own their font policy (the cloud server's fallback fonts), as opposed to the\n * per-request `fonts.register` wire path the browser engine drives.\n *\n * Registration is by path, mirroring how the server opens base documents\n * (`fileAccess.fromNodeFile`): the bytes are range-read on demand and never\n * held resident in the JS heap, so a deployment can configure many large\n * fallback fonts (CJK families) without paying RAM per font.\n */\nexport interface StartupFontSpec {\n key: string;\n /** Absolute path to a TTF/OTF file (native/node runtimes only). */\n path: string;\n familyName?: string;\n weight?: number;\n /** `undefined` → infer from the file. */\n italic?: boolean;\n /** Also add to the glyph-fallback chain (automatic missing-glyph fill). */\n fallback?: boolean;\n}\n\n/**\n * Thread-confined runtime font registry binding.\n *\n * Wraps the `EPDFFont_*` C API on a single PDFium thread. PDFium's font\n * registry is thread-local: a font registered here is visible only to this\n * thread's page rendering and annotation-authoring calls, and the numeric\n * `CFX_FontRegistry::FontId` it returns is a per-thread `next_font_id++`.\n *\n * That id is volatile, so we never let it cross the worker boundary. The host\n * owns the `fontKey → id` map (passed in by reference) and every wire message\n * references the stable `fontKey`. The FreeText writer resolves a key to the\n * current thread's id through {@link idFor} at authoring time.\n *\n * Lives in `engine-services` (not a worker host) so the browser Web Worker,\n * the Node `worker_thread` server, and any future direct-thread embedding\n * share the exact same binding — only the `PdfRuntimeModule` (WASM vs native)\n * differs.\n */\nexport class FontRegistrar {\n /**\n * File-access handles retained for path-registered fonts. PDFium range-reads\n * the file lazily (on each face creation), so the FPDF_FILEACCESS must stay\n * alive until the registry is cleared — same lifetime rule as a file-backed\n * base document. Closed in {@link clear}.\n */\n private readonly fileHandles: PdfFileAccessHandle[] = [];\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n /** Host-owned `fontKey → native FontId` map for this thread. */\n private readonly ids: Map<string, number>,\n ) {}\n\n /**\n * Register a font from its bytes. Copies into the WASM heap, hands the\n * pointer to `EPDFFont_RegisterMemFont64` (which copies the bytes into the\n * native registry), then frees the scratch — so the heap holds exactly one\n * retained copy per registered font.\n *\n * Throws `InvalidArg` when the runtime rejects the font (corrupt, no glyphs).\n */\n register(\n fontKey: string,\n familyName: string,\n weight: number,\n italic: number,\n bytes: Uint8Array,\n ): void {\n if (bytes.byteLength === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, `empty font data: ${fontKey}`);\n }\n const { mem, fn } = this.runtime;\n const ptr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(ptr, bytes);\n const id = fn.EPDFFont_RegisterMemFont64(familyName, weight, italic, ptr, bytes.byteLength);\n if (id === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `font registration failed (unloadable or no glyphs): ${fontKey}`,\n );\n }\n this.ids.set(fontKey, id);\n } finally {\n mem.free(ptr);\n }\n }\n\n /**\n * Register a font from a local file via `EPDFFont_RegisterFont`. The runtime\n * range-reads the file on demand (it is not loaded into the JS heap), and the\n * file-access handle is retained until {@link clear}. Native/node only.\n *\n * Throws `InvalidArg` when the runtime rejects the font (corrupt, no glyphs).\n */\n registerFromNodeFile(\n fontKey: string,\n familyName: string,\n weight: number,\n italic: number,\n path: string,\n ): void {\n const access = this.runtime.fileAccess.fromNodeFile(path);\n let id = 0;\n try {\n id = this.runtime.fn.EPDFFont_RegisterFont(familyName, weight, italic, access.ptr);\n } catch (error) {\n access.close();\n throw error;\n }\n if (id === 0) {\n access.close();\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `font registration failed (unloadable or no glyphs): ${fontKey} (${path})`,\n );\n }\n this.ids.set(fontKey, id);\n this.fileHandles.push(access);\n }\n\n /**\n * Register host-owned startup fonts on this thread, in order, optionally\n * adding each to the fallback chain. Order matters: it fixes both the native\n * FontIds and the fallback precedence, so every worker thread that runs the\n * same list ends up identical.\n */\n registerStartup(specs: readonly StartupFontSpec[]): void {\n for (const spec of specs) {\n const italic = spec.italic === undefined ? -1 : spec.italic ? 1 : 0;\n this.registerFromNodeFile(\n spec.key,\n spec.familyName ?? '',\n spec.weight ?? 0,\n italic,\n spec.path,\n );\n if (spec.fallback) {\n this.addFallback(spec.key);\n }\n }\n }\n\n /** Append a registered font to the ordered glyph-fallback chain. */\n addFallback(fontKey: string): void {\n const id = this.requireId(fontKey);\n if (!this.runtime.fn.EPDFFont_AddFallbackFont(id)) {\n throw new EngineError(EngineErrorCode.InvalidArg, `addFallback failed: ${fontKey}`);\n }\n }\n\n clearFallbacks(): void {\n this.runtime.fn.EPDFFont_ClearFallbackFonts();\n }\n\n /** Unregister every font and reset the fallback chain (clears the map too). */\n clear(): void {\n this.runtime.fn.EPDFFont_ClearRegisteredFonts();\n this.ids.clear();\n // Native registry no longer reads through these — release the file handles.\n for (const access of this.fileHandles) {\n access.close();\n }\n this.fileHandles.length = 0;\n }\n\n /** Resolve a stable key to this thread's native FontId. Throws if unknown. */\n idFor(fontKey: string): number {\n return this.requireId(fontKey);\n }\n\n private requireId(fontKey: string): number {\n const id = this.ids.get(fontKey);\n if (id === undefined) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `font not registered on this thread: ${fontKey}`,\n );\n }\n return id;\n }\n}\n","import type { FormFieldRef } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readUtf16String } from '../../../runtime/memory/strings';\n\nexport interface ResolvedField {\n /** Index of the field in the native model. */\n fieldIndex: number;\n /** Indirect object number of the field dictionary; `0` for direct dicts. */\n fieldObjectNumber: number;\n}\n\n/**\n * Resolve a caller ref against the native model. `objectNumber` refs use\n * the model's reverse index; `fqn` refs compare fully qualified names.\n * Throws `NotFound` when nothing matches.\n */\nexport function resolveFieldRef(\n runtime: PdfRuntimeModule,\n model: Ptr,\n ref: FormFieldRef,\n): ResolvedField {\n const { fn } = runtime;\n if (ref.kind === 'objectNumber') {\n const fieldIndex = fn.EPDFForm_GetFieldIndexByObjNum(model, ref.fieldObjectNumber);\n if (fieldIndex < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `form field not found: object ${ref.fieldObjectNumber}`,\n );\n }\n return { fieldIndex, fieldObjectNumber: ref.fieldObjectNumber };\n }\n\n const count = fn.EPDFForm_CountFields(model);\n for (let i = 0; i < count; i++) {\n const name =\n readUtf16String(runtime.mem, (buf, cap) => fn.EPDFForm_GetFieldName(model, i, buf, cap)) ??\n '';\n if (name === ref.name) {\n return { fieldIndex: i, fieldObjectNumber: fn.EPDFForm_GetFieldObjNum(model, i) };\n }\n }\n throw new EngineError(EngineErrorCode.NotFound, `form field not found: \"${ref.name}\"`);\n}\n","import type {\n FormDataFormat,\n FormFieldDTO,\n FormFieldRef,\n FormSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { acquireFormModel } from './internal/formModelCache';\nimport { readFieldAt, readFormSnapshot } from './internal/readFormSnapshot';\nimport { resolveFieldRef } from './internal/resolveFieldRef';\n\n/**\n * Read side of the forms feature. All reads go through the session's\n * version-keyed model cache, so repeated reads between mutations reuse\n * one native snapshot build.\n */\nexport class FormReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n snapshot(signal: AbortSignal): FormSnapshot {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n return readFormSnapshot(this.runtime, model, this.session.requireDocPtr());\n }\n\n field(ref: FormFieldRef, signal: AbortSignal): FormFieldDTO {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n const { fieldIndex } = resolveFieldRef(this.runtime, model, ref);\n return readFieldAt(this.runtime, model, fieldIndex, this.session.requireDocPtr());\n }\n\n /**\n * Serialize form data. Exports read the reconciled view (recovered\n * fields included; on layers, promoted values win) straight from the\n * document — the model cache is not involved.\n */\n exportData(\n format: FormDataFormat,\n signal: AbortSignal,\n ): { format: FormDataFormat; bytes: ArrayBuffer } {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const call = format === 'fdf' ? fn.EPDFForm_ExportFDF : fn.EPDFForm_ExportXFDF;\n\n const length = call(docPtr, NULL_PTR, 0, NULL_PTR, 0);\n if (length <= 0) {\n throw new EngineError(EngineErrorCode.Unknown, `form ${format} export failed`);\n }\n return withScratch(mem, length, (buf) => {\n const written = call(docPtr, NULL_PTR, 0, buf, length);\n if (written !== length) {\n throw new EngineError(EngineErrorCode.Unknown, `form ${format} export failed`);\n }\n const view = mem.readBytes(buf, length);\n const bytes = new ArrayBuffer(view.byteLength);\n new Uint8Array(bytes).set(view);\n return { format, bytes };\n });\n }\n}\n","import type { WidgetPlacement } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../document-session/DocumentSession';\nimport { setAnnotRect } from '../../annotations/internal/write/annotationWritePrimitives';\nimport { applyWidgetStyle } from '../../annotations/internal/write/writeWidgetAnnotation';\n\nconst WIDGET_SUBTYPE_CODE = 20; // FPDF_ANNOT_WIDGET\n\n/**\n * Birth a widget through the annotation plane (EPDFPage_CreateAnnot -\n * indirect, durable object number), place it, and style it with THE\n * widget-plane writer (`applyWidgetStyle` - the same code the widget\n * annotation kind uses for create/patch). Returns the widget's object\n * number, ready for EPDFForm_AttachWidget adoption.\n */\nexport function createUnattachedWidget(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n placement: WidgetPlacement,\n): number {\n const { fn, mem } = runtime;\n const pool = session.pagePool();\n const pagePtr = pool.acquire(placement.pageObjectNumber);\n try {\n const annotPtr = fn.EPDFPage_CreateAnnot(pagePtr, WIDGET_SUBTYPE_CODE);\n if (annotPtr === NULL_PTR) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to create widget annotation');\n }\n try {\n setAnnotRect(fn, mem, annotPtr, placement.rect);\n if (placement.appearance) {\n applyWidgetStyle(fn, mem, annotPtr, placement.appearance);\n }\n const widgetObjectNumber = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (widgetObjectNumber <= 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'widget annotation has no object number');\n }\n return widgetObjectNumber;\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n } finally {\n pool.release(placement.pageObjectNumber);\n }\n}\n","/**\n * /Ff bits writable through drafts and patches (1-based spec bit numbers).\n * Family-DEFINING bits (Radio 1<<15, Pushbutton 1<<16, Combo 1<<17) are set\n * once by EPDFForm_CreateField and immutable afterwards - the native\n * setter rejects them.\n */\nexport const FIELD_FLAG_BITS = {\n readOnly: 1 << 0,\n required: 1 << 1,\n noExport: 1 << 2,\n multiline: 1 << 12,\n password: 1 << 13,\n noToggleToOff: 1 << 14,\n edit: 1 << 18,\n multiSelect: 1 << 21,\n comb: 1 << 24,\n radiosInUnison: 1 << 25,\n} as const;\n\nexport type FieldFlagName = keyof typeof FIELD_FLAG_BITS;\n\n/**\n * Fold optional booleans into set/clear masks: `true` sets the bit,\n * `false` clears it, `undefined` leaves it alone.\n */\nexport function flagMasks(flags: Partial<Record<FieldFlagName, boolean | undefined>>): {\n setBits: number;\n clearBits: number;\n} {\n let setBits = 0;\n let clearBits = 0;\n for (const [name, bit] of Object.entries(FIELD_FLAG_BITS)) {\n const value = flags[name as FieldFlagName];\n if (value === true) setBits |= bit;\n else if (value === false) clearBits |= bit;\n }\n return { setBits, clearBits };\n}\n","import type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from '../../../runtime/memory/scratch';\n\n/**\n * Marshal a `const FPDF_WIDESTRING*` array: encode every string into the\n * runtime heap, write the pointer table with the runtime's pointer width\n * (bigint pointers cannot be poked into the wasm 32-bit heap), run |body|,\n * free everything.\n */\nexport function withWideStringArray<T>(\n runtime: PdfRuntimeModule,\n values: readonly string[],\n body: (arrayPtr: Ptr, count: number) => T,\n): T {\n const { mem } = runtime;\n const stringPtrs = values.map((value) => mem.writeU16String(value));\n const isWasm = runtime.kind === 'wasm';\n const ptrSize = isWasm ? 4 : 8;\n try {\n return withScratch(mem, Math.max(1, stringPtrs.length * ptrSize), (arrayPtr) => {\n stringPtrs.forEach((ptr, i) =>\n isWasm\n ? mem.poke(arrayPtr, 'i32', Number(ptr), i * 4)\n : mem.poke(arrayPtr, 'i64', ptr, i * 8),\n );\n return body(arrayPtr, stringPtrs.length);\n });\n } finally {\n for (let i = stringPtrs.length - 1; i >= 0; i--) {\n mem.free(stringPtrs[i]);\n }\n }\n}\n","import type {\n FormDataFormat,\n FormFieldDraft,\n FormFieldDTO,\n FormFieldPatch,\n FormFieldRef,\n FormFieldValue,\n FormImportResult,\n FormRepairResult,\n FormSetValueResult,\n FormWidgetRef,\n MutationMeta,\n WidgetPlacement,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { withScratch, withScratchN } from '../../runtime/memory/scratch';\nimport { createUnattachedWidget } from './internal/authorWidget';\nimport { flagMasks } from './internal/fieldFlagBits';\nimport { acquireFormModel } from './internal/formModelCache';\nimport { withWideStringArray } from './internal/wideStringArray';\nimport { readFieldAt, readFormSnapshot } from './internal/readFormSnapshot';\nimport { resolveFieldRef } from './internal/resolveFieldRef';\n\n// Mirrors EPDF_FORMFIELD_FAMILY_* in public/epdf_form.h.\nconst FAMILY_CODE = {\n checkbox: 2,\n radio: 3,\n text: 4,\n combobox: 5,\n listbox: 6,\n} as const;\n\n/** Widgets a single value write can touch; far above any real form. */\nconst CHANGED_WIDGETS_CAPACITY = 256;\n\n// Mirrors EPDF_FORM_REPAIR_* in public/epdf_form.h.\nconst REPAIR_BAKE_APPEARANCES = 0x1;\n\n/**\n * Value writes are non-structural: no page-list revision bumps, and the\n * cloud layer computes its own cache delta server-side.\n */\nconst EMPTY_META: MutationMeta = { affectedPages: [], cacheDelta: null };\n\nconst FAMILY_BY_VALUE_TYPE: Record<FormFieldValue['type'], readonly string[]> = {\n text: ['text'],\n toggle: ['checkbox', 'radio'],\n choice: ['combobox', 'listbox'],\n};\n\n/**\n * Write side of the forms feature. Every method is a validate-then-apply\n * transaction over the native EPDFForm_* write API: a failed call leaves\n * the document untouched (on layers: nothing promoted), and each success\n * bumps the session's mutation sequence so version-keyed caches rebuild.\n */\nexport class FormMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n setValue(ref: FormFieldRef, value: FormFieldValue, signal: AbortSignal): FormSetValueResult {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved.fieldObjectNumber);\n\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n const allowed = FAMILY_BY_VALUE_TYPE[value.type];\n if (!allowed.includes(before.family)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `value type '${value.type}' does not apply to a '${before.family}' field`,\n );\n }\n\n const changed = this.applyWrite(resolved.fieldObjectNumber, value);\n return this.readBack(resolved.fieldObjectNumber, changed);\n }\n\n reset(ref: FormFieldRef, signal: AbortSignal): FormSetValueResult {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved.fieldObjectNumber);\n\n const changed = this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_ResetField(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n buf,\n cap,\n countPtr,\n ),\n );\n if (changed === null) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'form field cannot be reset');\n }\n return this.readBack(resolved.fieldObjectNumber, changed);\n }\n\n importData(\n data: ArrayBuffer,\n format: FormDataFormat | undefined,\n signal: AbortSignal,\n ): FormImportResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const bytes = new Uint8Array(data);\n if (bytes.byteLength === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'empty form data payload');\n }\n const resolvedFormat = format ?? sniffFormat(bytes);\n const call = resolvedFormat === 'fdf' ? fn.EPDFForm_ImportFDF : fn.EPDFForm_ImportXFDF;\n const docPtr = this.session.requireDocPtr();\n\n const counters = withScratchN(mem, [bytes.byteLength, 16], ([dataPtr, resultPtr]) => {\n mem.writeBytes(dataPtr, bytes);\n const ok = call(docPtr, dataPtr, bytes.byteLength, resultPtr);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `payload is not valid ${resolvedFormat.toUpperCase()}`,\n );\n }\n return {\n fieldsTotal: Number(mem.peek(resultPtr, 'i32', 0)),\n fieldsApplied: Number(mem.peek(resultPtr, 'i32', 4)),\n fieldsSkipped: Number(mem.peek(resultPtr, 'i32', 8)),\n widgetsChanged: Number(mem.peek(resultPtr, 'i32', 12)),\n };\n });\n\n this.session.noteMutation();\n const fresh = acquireFormModel(this.runtime, this.session);\n return {\n ...counters,\n snapshot: readFormSnapshot(this.runtime, fresh, this.session.requireDocPtr()),\n meta: EMPTY_META,\n };\n }\n\n repair(bakeAppearances: boolean, signal: AbortSignal): FormRepairResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const flags = bakeAppearances ? REPAIR_BAKE_APPEARANCES : 0;\n\n const report = withScratch(mem, 24, (reportPtr) => {\n const ok = fn.EPDFForm_Repair(this.session.requireDocPtr(), flags, reportPtr);\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, 'form repair failed');\n }\n return {\n acroformCreated: Number(mem.peek(reportPtr, 'i32', 0)) !== 0,\n fieldsLinked: Number(mem.peek(reportPtr, 'i32', 4)),\n widgetsLinked: Number(mem.peek(reportPtr, 'i32', 8)),\n fieldsUnrepairable: Number(mem.peek(reportPtr, 'i32', 12)),\n appearancesBaked: Number(mem.peek(reportPtr, 'i32', 16)),\n needAppearancesCleared: Number(mem.peek(reportPtr, 'i32', 20)) !== 0,\n };\n });\n\n this.session.noteMutation();\n return { ...report, meta: EMPTY_META };\n }\n\n /**\n * Create a field and (optionally) its widgets in one composed\n * transaction: native field creation, widget birth through the\n * annotation plane, adoption, then field-plane setters. A failure\n * mid-composition throws; earlier steps stay applied (the document is\n * never inconsistent - at worst a partially configured field exists).\n */\n createField(draft: FormFieldDraft, signal: AbortSignal): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const placements = this.placementsOf(draft);\n if (draft.family === 'radio') {\n for (const placement of placements) {\n if (!placement.onState || placement.onState === 'Off') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'every radio widget needs a non-\"Off\" onState',\n );\n }\n }\n }\n\n const familyCode = FAMILY_CODE[draft.family];\n const namePtr = mem.writeU16String(draft.name);\n let fieldObjectNumber: number;\n try {\n fieldObjectNumber = fn.EPDFForm_CreateField(docPtr, familyCode, namePtr);\n } finally {\n mem.free(namePtr);\n }\n if (fieldObjectNumber <= 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `cannot create field \"${draft.name}\" (name conflict or invalid)`,\n );\n }\n\n const { setBits, clearBits } = flagMasks(\n draft as unknown as Record<string, boolean | undefined>,\n );\n if (setBits !== 0 || clearBits !== 0) {\n fn.EPDFForm_SetFieldFlags(docPtr, fieldObjectNumber, setBits, clearBits);\n }\n if ('options' in draft && draft.options) {\n this.applyOptions(fieldObjectNumber, draft.options);\n }\n if ('defaultValue' in draft && draft.defaultValue !== undefined) {\n this.applyDefaultValues(fieldObjectNumber, [draft.defaultValue]);\n }\n if ('maxLength' in draft && draft.maxLength !== undefined) {\n if (!fn.EPDFForm_SetFieldMaxLen(docPtr, fieldObjectNumber, draft.maxLength)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'maxLength rejected');\n }\n }\n if (draft.alternateName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldAlternateName,\n fieldObjectNumber,\n draft.alternateName,\n 'alternate name rejected',\n );\n }\n if (draft.mappingName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldMappingName,\n fieldObjectNumber,\n draft.mappingName,\n 'mapping name rejected',\n );\n }\n\n for (const placement of placements) {\n const widgetObjectNumber = createUnattachedWidget(this.runtime, this.session, placement);\n const onState =\n draft.family === 'radio'\n ? placement.onState!\n : draft.family === 'checkbox'\n ? (placement.onState ?? 'Yes')\n : '';\n if (!fn.EPDFForm_AttachWidget(docPtr, fieldObjectNumber, widgetObjectNumber, onState)) {\n throw new EngineError(EngineErrorCode.Unknown, 'widget adoption failed');\n }\n }\n\n this.session.noteMutation();\n return { field: this.readBackField(fieldObjectNumber) };\n }\n\n updateField(\n ref: FormFieldRef,\n patch: FormFieldPatch,\n signal: AbortSignal,\n ): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved.fieldObjectNumber);\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n if (before.family !== patch.family) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `patch family '${patch.family}' does not match field family '${before.family}'`,\n );\n }\n const fieldObjectNumber = resolved.fieldObjectNumber;\n\n if (patch.name !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldName,\n fieldObjectNumber,\n patch.name,\n `cannot rename to \"${patch.name}\" (sibling conflict or invalid)`,\n );\n }\n const { setBits, clearBits } = flagMasks(\n patch as unknown as Record<string, boolean | undefined>,\n );\n if (setBits !== 0 || clearBits !== 0) {\n if (!fn.EPDFForm_SetFieldFlags(docPtr, fieldObjectNumber, setBits, clearBits)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'flag update rejected');\n }\n }\n if ('maxLength' in patch && patch.maxLength !== undefined) {\n if (!fn.EPDFForm_SetFieldMaxLen(docPtr, fieldObjectNumber, patch.maxLength ?? 0)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'maxLength rejected (current value exceeds it)',\n );\n }\n }\n if ('defaultValue' in patch && patch.defaultValue !== undefined) {\n if (patch.defaultValue === null) {\n if (!fn.EPDFForm_RemoveFieldDefaultValue(docPtr, fieldObjectNumber)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'default value removal rejected');\n }\n } else {\n this.applyDefaultValues(fieldObjectNumber, [patch.defaultValue]);\n }\n }\n if (patch.alternateName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldAlternateName,\n fieldObjectNumber,\n patch.alternateName ?? '',\n 'alternate name rejected',\n );\n }\n if (patch.mappingName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldMappingName,\n fieldObjectNumber,\n patch.mappingName ?? '',\n 'mapping name rejected',\n );\n }\n if ('options' in patch && patch.options) {\n this.applyOptions(fieldObjectNumber, patch.options);\n }\n\n this.session.noteMutation();\n return { field: this.readBackField(fieldObjectNumber) };\n }\n\n /**\n * Delete a terminal field. Widgets are DETACHED here (they become inert\n * annotations); the worker host cascades their annotation deletion so\n * page /Annots bookkeeping flows through the annotation feature.\n */\n deleteField(\n ref: FormFieldRef,\n signal: AbortSignal,\n ): { deletedFieldObjectNumber: number; detachedWidgets: FormWidgetRef[] } {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved.fieldObjectNumber);\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n\n const ok = withScratchN(mem, [256 * 4, 4], ([buf, countPtr]) => {\n mem.poke(countPtr, 'i32', 0);\n return fn.EPDFForm_DeleteField(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n buf,\n 256,\n countPtr,\n );\n });\n if (!ok) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'field cannot be deleted');\n }\n\n this.session.noteMutation();\n return {\n deletedFieldObjectNumber: resolved.fieldObjectNumber,\n detachedWidgets: before.widgets.map((w) => ({\n annotObjectNumber: w.annotObjectNumber,\n pageObjectNumber: w.pageObjectNumber,\n })),\n };\n }\n\n attachWidget(\n ref: FormFieldRef,\n widget: FormWidgetRef,\n onState: string | undefined,\n signal: AbortSignal,\n ): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved.fieldObjectNumber);\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n const toggle = before.family === 'checkbox' || before.family === 'radio';\n const state = toggle ? (onState ?? (before.family === 'checkbox' ? 'Yes' : '')) : '';\n if (toggle && (!state || state === 'Off')) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'attaching to a radio group needs a non-\"Off\" onState',\n );\n }\n if (\n !fn.EPDFForm_AttachWidget(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n widget.annotObjectNumber,\n state,\n )\n ) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'widget cannot be adopted (already attached, merged, or not a widget)',\n );\n }\n this.session.noteMutation();\n return { field: this.readBackField(resolved.fieldObjectNumber) };\n }\n\n detachWidget(\n ref: FormFieldRef,\n widget: FormWidgetRef,\n signal: AbortSignal,\n ): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved.fieldObjectNumber);\n if (\n !fn.EPDFForm_DetachWidget(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n widget.annotObjectNumber,\n )\n ) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'widget is not attached to this field');\n }\n this.session.noteMutation();\n return { field: this.readBackField(resolved.fieldObjectNumber) };\n }\n\n private placementsOf(draft: FormFieldDraft): WidgetPlacement[] {\n if (draft.family === 'radio') {\n return draft.widgets ?? [];\n }\n return draft.widget ? [draft.widget] : [];\n }\n\n private applyOptions(\n fieldObjectNumber: number,\n options: ReadonlyArray<{ label: string; value: string }>,\n ): void {\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const ok = withWideStringArray(\n this.runtime,\n options.map((o) => o.label),\n (labelsPtr) =>\n withWideStringArray(\n this.runtime,\n options.map((o) => o.value),\n (exportsPtr, count) =>\n fn.EPDFForm_SetFieldOptions(docPtr, fieldObjectNumber, labelsPtr, exportsPtr, count),\n ),\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'options rejected');\n }\n }\n\n private applyWideSetter(\n setter: (docPtr: Ptr, fieldObjectNumber: number, valuePtr: Ptr) => boolean,\n fieldObjectNumber: number,\n value: string,\n errorMessage: string,\n ): void {\n const { mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const valuePtr = mem.writeU16String(value);\n try {\n if (!setter(docPtr, fieldObjectNumber, valuePtr)) {\n throw new EngineError(EngineErrorCode.InvalidArg, errorMessage);\n }\n } finally {\n mem.free(valuePtr);\n }\n }\n\n private applyDefaultValues(fieldObjectNumber: number, values: readonly string[]): void {\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const ok = withWideStringArray(this.runtime, values, (valuesPtr, count) =>\n fn.EPDFForm_SetFieldDefaultValues(docPtr, fieldObjectNumber, valuesPtr, count),\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'default value rejected');\n }\n }\n\n private readBackField(fieldObjectNumber: number): FormFieldDTO {\n const fresh = acquireFormModel(this.runtime, this.session);\n const fieldIndex = this.runtime.fn.EPDFForm_GetFieldIndexByObjNum(fresh, fieldObjectNumber);\n if (fieldIndex < 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'form field vanished after write');\n }\n return readFieldAt(this.runtime, fresh, fieldIndex, this.session.requireDocPtr());\n }\n\n private assertWritable(fieldObjectNumber: number): void {\n if (fieldObjectNumber === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'form field is stored as a direct object and cannot be written',\n );\n }\n }\n\n /** Dispatch the typed native write. Returns the changed widget objnums. */\n private applyWrite(fieldObjectNumber: number, value: FormFieldValue): number[] {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const changed = this.withChangedWidgets((buf, cap, countPtr) => {\n switch (value.type) {\n default:\n throw new EngineError(EngineErrorCode.InvalidArg, 'unknown form value type');\n case 'text': {\n const textPtr = mem.writeU16String(value.value);\n try {\n return fn.EPDFForm_SetTextValue(docPtr, fieldObjectNumber, textPtr, buf, cap, countPtr);\n } finally {\n mem.free(textPtr);\n }\n }\n case 'toggle':\n // Empty string clears the group, same as the C API's NULL.\n return fn.EPDFForm_SetToggle(\n docPtr,\n fieldObjectNumber,\n value.state ?? '',\n buf,\n cap,\n countPtr,\n );\n case 'choice':\n return withWideStringArray(this.runtime, value.values, (arrayPtr, count) =>\n fn.EPDFForm_SetChoiceValues(\n docPtr,\n fieldObjectNumber,\n arrayPtr,\n count,\n buf,\n cap,\n countPtr,\n ),\n );\n }\n });\n\n if (changed === null) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'form value rejected (unknown toggle state, length limit, or non-option choice)',\n );\n }\n return changed;\n }\n\n /** Run a native write with the changed-widgets out buffer wired up. */\n private withChangedWidgets(\n call: (buf: Ptr, cap: number, countPtr: Ptr) => boolean,\n ): number[] | null {\n const { mem } = this.runtime;\n return withScratchN(mem, [CHANGED_WIDGETS_CAPACITY * 4, 4], ([buf, countPtr]) => {\n mem.poke(countPtr, 'i32', 0);\n if (!call(buf, CHANGED_WIDGETS_CAPACITY, countPtr)) {\n return null;\n }\n const total = Number(mem.peek(countPtr, 'i32'));\n const reported = Math.min(total, CHANGED_WIDGETS_CAPACITY);\n const changed: number[] = [];\n for (let i = 0; i < reported; i++) {\n changed.push(Number(mem.peek(buf, 'i32', i * 4)));\n }\n return changed;\n });\n }\n\n /** Bump the session version, rebuild the model, and read the field back. */\n private readBack(fieldObjectNumber: number, changedObjNums: number[]): FormSetValueResult {\n this.session.noteMutation();\n const fresh = acquireFormModel(this.runtime, this.session);\n const fieldIndex = this.runtime.fn.EPDFForm_GetFieldIndexByObjNum(fresh, fieldObjectNumber);\n if (fieldIndex < 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'form field vanished after write');\n }\n const field: FormFieldDTO = readFieldAt(\n this.runtime,\n fresh,\n fieldIndex,\n this.session.requireDocPtr(),\n );\n const changedSet = new Set(changedObjNums);\n const changedWidgets: FormWidgetRef[] = field.widgets\n .filter((w) => changedSet.has(w.annotObjectNumber))\n .map((w) => ({\n annotObjectNumber: w.annotObjectNumber,\n pageObjectNumber: w.pageObjectNumber,\n }));\n return { field, changedWidgets, meta: EMPTY_META };\n }\n}\n\n/** `%FDF-…` payloads are FDF; anything starting with markup is XFDF. */\nfunction sniffFormat(bytes: Uint8Array): FormDataFormat {\n for (let i = 0; i < Math.min(bytes.length, 64); i++) {\n const c = bytes[i];\n // Skip UTF-8 BOM and whitespace.\n if (c === 0xef || c === 0xbb || c === 0xbf) continue;\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d) continue;\n return c === 0x3c /* '<' */ ? 'xfdf' : 'fdf';\n }\n return 'fdf';\n}\n","import type {\n FormEffect,\n FormEffectResult,\n FormEffectsResult,\n FormFieldDTO,\n FormFieldRef,\n FormFieldValue,\n FormWidgetRef,\n MutationMeta,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, serializeError } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { throwIfAborted } from '../../shared/abort';\nimport { acquireFormModel } from './internal/formModelCache';\nimport { readFieldAt } from './internal/readFormSnapshot';\nimport { resolveFieldRef } from './internal/resolveFieldRef';\nimport { withWideStringArray } from './internal/wideStringArray';\nimport { ActionReadBudgetTracker } from '../actions/ActionModelReader';\n\nconst CHANGED_WIDGETS_CAPACITY = 1024;\nconst EMPTY_META: MutationMeta = { affectedPages: [], cacheDelta: null };\nconst DISPLAY_CODE = { visible: 0, hidden: 1, noPrint: 2, noView: 3 } as const;\n\ninterface PreflightEffect {\n effect: FormEffect;\n fieldObjectNumbers: number[];\n fields: FormFieldDTO[];\n error?: ReturnType<typeof serializeError>;\n}\n\ninterface NativeEffectResult {\n ok: boolean;\n changedWidgetObjectNumbers: number[];\n}\n\n/** Ordered, non-rollback-atomic sink for one committed client script run. */\nexport class FormsEffectsApplier {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n apply(effects: FormEffect[], signal: AbortSignal): FormEffectsResult {\n throwIfAborted(signal);\n const preflightActionBudget = new ActionReadBudgetTracker();\n const resultActionBudget = new ActionReadBudgetTracker();\n const preflight = effects.map((effect) => this.preflight(effect, preflightActionBudget));\n const results: FormEffectResult[] = [];\n const allChangedWidgets = new Map<string, FormWidgetRef>();\n let mustFinalize = false;\n let stop = false;\n\n for (let index = 0; index < preflight.length; index++) {\n const item = preflight[index];\n if (stop || (signal.aborted && mustFinalize)) {\n stop = true;\n results.push(emptyResult(index, 'skipped'));\n continue;\n }\n if (signal.aborted) throwIfAborted(signal);\n if (item.error) {\n results.push({\n ...emptyResult(index, 'rejected'),\n fields: item.fields,\n error: item.error,\n });\n continue;\n }\n\n let before: FormFieldDTO[];\n try {\n before = item.fieldObjectNumbers.map((objectNumber) => this.readField(objectNumber));\n } catch (error) {\n // No write has happened for this effect. A race between preflight and\n // apply is a rejection unless an earlier effect already landed.\n const status = mustFinalize ? 'failed' : 'rejected';\n results.push({ ...emptyResult(index, status), error: serializeError(error) });\n if (status === 'failed') stop = true;\n continue;\n }\n\n if (isNoOp(item.effect, before)) {\n results.push({ ...emptyResult(index, 'unchanged'), fields: before });\n continue;\n }\n\n try {\n const native = this.applyNative(item.effect, item.fieldObjectNumbers);\n if (!native.ok) {\n // Native false is outcome-indeterminate at this layer. Finalize the\n // session and stop; compounding writes would make recovery harder.\n mustFinalize = true;\n this.session.noteMutation();\n const fields = this.readFieldsBestEffort(item.fieldObjectNumbers, resultActionBudget);\n const changedWidgets = widgetRefs(native.changedWidgetObjectNumbers, before, fields);\n rememberWidgets(allChangedWidgets, changedWidgets);\n results.push({\n index,\n status: 'failed',\n fields,\n changedWidgets,\n error: serializeError(\n new EngineError(EngineErrorCode.Unknown, 'native form effect failed after preflight'),\n ),\n });\n stop = true;\n continue;\n }\n\n const applied = effectChangedState(item.effect, before, native.changedWidgetObjectNumbers);\n if (!applied) {\n results.push({ ...emptyResult(index, 'unchanged'), fields: before });\n continue;\n }\n\n mustFinalize = true;\n this.session.noteMutation();\n const fields = this.readFieldsBestEffort(item.fieldObjectNumbers, resultActionBudget);\n const changedWidgets = widgetRefs(native.changedWidgetObjectNumbers, before, fields);\n rememberWidgets(allChangedWidgets, changedWidgets);\n results.push({ index, status: 'applied', fields, changedWidgets });\n } catch (error) {\n mustFinalize = true;\n this.session.noteMutation();\n results.push({\n index,\n status: 'failed',\n fields: this.readFieldsBestEffort(item.fieldObjectNumbers, resultActionBudget),\n changedWidgets: [],\n error: serializeError(error),\n });\n stop = true;\n }\n }\n\n return {\n results,\n changedWidgets: [...allChangedWidgets.values()],\n meta: mustFinalize ? EMPTY_META : null,\n };\n }\n\n private preflight(effect: FormEffect, actionBudget: ActionReadBudgetTracker): PreflightEffect {\n try {\n const refs = effect.kind === 'reset' ? effect.refs : [effect.ref];\n if (refs.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'reset effect requires at least one field',\n );\n }\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = refs.map((ref) => this.resolve(model, ref));\n const fields = resolved.map(({ fieldIndex }) =>\n readFieldAt(this.runtime, model, fieldIndex, this.session.requireDocPtr(), actionBudget),\n );\n validateEffect(effect, fields);\n return {\n effect,\n fieldObjectNumbers: resolved.map(({ fieldObjectNumber }) => fieldObjectNumber),\n fields,\n };\n } catch (error) {\n return { effect, fieldObjectNumbers: [], fields: [], error: serializeError(error) };\n }\n }\n\n private resolve(\n model: Ptr,\n ref: FormFieldRef,\n ): { fieldIndex: number; fieldObjectNumber: number } {\n const resolved = resolveFieldRef(this.runtime, model, ref);\n if (resolved.fieldObjectNumber <= 0) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n 'direct-object form fields cannot be mutated',\n );\n }\n return resolved;\n }\n\n private readField(\n fieldObjectNumber: number,\n actionBudget = new ActionReadBudgetTracker(),\n ): FormFieldDTO {\n const model = acquireFormModel(this.runtime, this.session);\n const index = this.runtime.fn.EPDFForm_GetFieldIndexByObjNum(model, fieldObjectNumber);\n if (index < 0) {\n throw new EngineError(EngineErrorCode.InvalidReference, 'form field disappeared');\n }\n return readFieldAt(this.runtime, model, index, this.session.requireDocPtr(), actionBudget);\n }\n\n private readFieldsBestEffort(\n fieldObjectNumbers: number[],\n actionBudget: ActionReadBudgetTracker,\n ): FormFieldDTO[] {\n const fields: FormFieldDTO[] = [];\n for (const objectNumber of fieldObjectNumbers) {\n try {\n fields.push(this.readField(objectNumber, actionBudget));\n } catch {\n // The result vocabulary already marks the effect failed. Never throw\n // here: landed state still has to reach WorkerHost.finishMutation().\n }\n }\n return fields;\n }\n\n private applyNative(effect: FormEffect, fieldObjectNumbers: number[]): NativeEffectResult {\n if (effect.kind === 'reset') {\n const changed: number[] = [];\n for (const objectNumber of fieldObjectNumbers) {\n const result = this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_ResetField(\n this.session.requireDocPtr(),\n objectNumber,\n buf,\n cap,\n countPtr,\n ),\n );\n changed.push(...result.changedWidgetObjectNumbers);\n if (!result.ok) return { ok: false, changedWidgetObjectNumbers: changed };\n }\n return { ok: true, changedWidgetObjectNumbers: changed };\n }\n\n const objectNumber = fieldObjectNumbers[0];\n switch (effect.kind) {\n case 'setValue':\n return this.applyValue(objectNumber, effect.value);\n case 'setDisplay':\n return this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_SetFieldDisplay(\n this.session.requireDocPtr(),\n objectNumber,\n DISPLAY_CODE[effect.display],\n buf,\n cap,\n countPtr,\n ),\n );\n case 'setAppearanceText': {\n const textPtr = this.runtime.mem.writeU16String(effect.text);\n try {\n return this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_SetFieldAppearanceText(\n this.session.requireDocPtr(),\n objectNumber,\n textPtr,\n buf,\n cap,\n countPtr,\n ),\n );\n } finally {\n this.runtime.mem.free(textPtr);\n }\n }\n }\n }\n\n private applyValue(fieldObjectNumber: number, value: FormFieldValue): NativeEffectResult {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n return this.withChangedWidgets((buf, cap, countPtr) => {\n if (value.type === 'toggle') {\n return fn.EPDFForm_SetToggle(\n docPtr,\n fieldObjectNumber,\n value.state ?? '',\n buf,\n cap,\n countPtr,\n );\n }\n if (value.type === 'choice') {\n return withWideStringArray(this.runtime, value.values, (valuesPtr, count) =>\n fn.EPDFForm_SetChoiceValues(\n docPtr,\n fieldObjectNumber,\n valuesPtr,\n count,\n buf,\n cap,\n countPtr,\n ),\n );\n }\n const valuePtr = mem.writeU16String(value.value);\n try {\n return fn.EPDFForm_SetTextValue(docPtr, fieldObjectNumber, valuePtr, buf, cap, countPtr);\n } finally {\n mem.free(valuePtr);\n }\n });\n }\n\n private withChangedWidgets(\n call: (buf: Ptr, cap: number, countPtr: Ptr) => boolean,\n ): NativeEffectResult {\n const { mem } = this.runtime;\n return withScratchN(mem, [CHANGED_WIDGETS_CAPACITY * 4, 4], ([buf, countPtr]) => {\n mem.poke(countPtr, 'i32', 0);\n const ok = call(buf, CHANGED_WIDGETS_CAPACITY, countPtr);\n const count = Math.min(\n Math.max(0, Number(mem.peek(countPtr, 'i32'))),\n CHANGED_WIDGETS_CAPACITY,\n );\n const changedWidgetObjectNumbers: number[] = [];\n for (let index = 0; index < count; index++) {\n changedWidgetObjectNumbers.push(Number(mem.peek(buf, 'i32', index * 4)));\n }\n return { ok, changedWidgetObjectNumbers };\n });\n }\n}\n\nfunction validateEffect(effect: FormEffect, fields: FormFieldDTO[]): void {\n if (effect.kind === 'reset') {\n for (const field of fields) {\n if (field.family === 'pushbutton' || field.family === 'signature') {\n throw new EngineError(EngineErrorCode.InvalidArg, `${field.family} fields cannot be reset`);\n }\n }\n return;\n }\n const field = fields[0];\n if (effect.kind === 'setAppearanceText') {\n if (field.family !== 'text' && field.family !== 'combobox') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `appearance text does not apply to a ${field.family} field`,\n );\n }\n return;\n }\n if (effect.kind === 'setDisplay') return;\n validateValue(field, effect.value);\n}\n\nfunction validateValue(field: FormFieldDTO, value: FormFieldValue): void {\n if (value.type === 'text') {\n if (field.family !== 'text') mismatch(field, value);\n return;\n }\n if (value.type === 'toggle') {\n if (field.family !== 'checkbox' && field.family !== 'radio') mismatch(field, value);\n if (value.state !== null && !field.widgets.some((widget) => widget.onState === value.state)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'unknown toggle appearance state');\n }\n return;\n }\n if (field.family !== 'combobox' && field.family !== 'listbox') mismatch(field, value);\n if (new Set(value.values).size !== value.values.length) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'choice values must not contain duplicates');\n }\n if (field.family === 'combobox' && value.values.length > 1) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'combo boxes accept at most one value');\n }\n if (field.family === 'listbox' && !field.multiSelect && value.values.length > 1) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'single-select list boxes accept one value');\n }\n const optionValues = new Set(field.options.map((option) => option.value));\n const freeText = field.family === 'combobox' && field.edit && value.values.length === 1;\n if (!freeText && value.values.some((entry) => !optionValues.has(entry))) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'choice value is not a field option');\n }\n}\n\nfunction mismatch(field: FormFieldDTO, value: FormFieldValue): never {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `value type '${value.type}' does not apply to a '${field.family}' field`,\n );\n}\n\nfunction isNoOp(effect: FormEffect, fields: FormFieldDTO[]): boolean {\n if (effect.kind === 'setAppearanceText') return fields[0].widgets.length === 0;\n if (effect.kind === 'setDisplay') return fields[0].widgets.length === 0;\n if (effect.kind === 'reset') {\n return fields.every((field) => valueEntriesEqual(field.valueEntry, field.defaultValueEntry));\n }\n const field = fields[0];\n const value = effect.value;\n if (value.type === 'text' && field.family === 'text') return field.value === value.value;\n if (value.type === 'toggle' && (field.family === 'checkbox' || field.family === 'radio')) {\n return field.widgets.every((widget) => widget.checked === (widget.onState === value.state));\n }\n if (value.type === 'choice' && field.family === 'combobox') {\n return value.values.length === 0 ? field.value === '' : field.value === value.values[0];\n }\n if (value.type === 'choice' && field.family === 'listbox') {\n return arraysEqual(field.selectedValues, value.values);\n }\n return false;\n}\n\nfunction effectChangedState(\n effect: FormEffect,\n before: FormFieldDTO[],\n changedWidgetObjectNumbers: number[],\n): boolean {\n if (effect.kind === 'setDisplay' || effect.kind === 'setAppearanceText') {\n return changedWidgetObjectNumbers.length > 0;\n }\n return !isNoOp(effect, before) || changedWidgetObjectNumbers.length > 0;\n}\n\nfunction valueEntriesEqual(\n left: FormFieldDTO['valueEntry'],\n right: FormFieldDTO['defaultValueEntry'],\n): boolean {\n if (left.kind !== right.kind) return false;\n if (left.kind === 'scalar' && right.kind === 'scalar') return left.value === right.value;\n if (left.kind === 'array' && right.kind === 'array')\n return arraysEqual(left.values, right.values);\n return true;\n}\n\nfunction arraysEqual(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((entry, index) => entry === right[index]);\n}\n\nfunction widgetRefs(\n objectNumbers: number[],\n before: FormFieldDTO[],\n after: FormFieldDTO[],\n): FormWidgetRef[] {\n const byObjectNumber = new Map<number, FormWidgetRef>();\n for (const field of [...before, ...after]) {\n for (const widget of field.widgets) byObjectNumber.set(widget.annotObjectNumber, widget);\n }\n return [...new Set(objectNumbers)]\n .map((objectNumber) => byObjectNumber.get(objectNumber))\n .filter((widget): widget is FormWidgetRef => widget !== undefined)\n .map(({ annotObjectNumber, pageObjectNumber }) => ({ annotObjectNumber, pageObjectNumber }));\n}\n\nfunction rememberWidgets(target: Map<string, FormWidgetRef>, widgets: FormWidgetRef[]): void {\n for (const widget of widgets) {\n target.set(`${widget.pageObjectNumber}:${widget.annotObjectNumber}`, widget);\n }\n}\n\nfunction emptyResult(index: number, status: FormEffectResult['status']): FormEffectResult {\n return { index, status, fields: [], changedWidgets: [] };\n}\n","import type { FoldedText, PageObjectNumber, PageTextSnapshot } from '@embedpdf/engine-core/runtime';\nimport { foldText } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../document-session/DocumentSession';\nimport { PageTextReader } from '../../text/PageTextReader';\n\nexport interface PageCorpus {\n /** Default-fold (`{}`) corpus; `folded.original` IS `snapshot.text`. */\n folded: FoldedText;\n /**\n * The page text snapshot the corpus was folded from — carried so match\n * ranges (text space) can be converted to CHARACTER space via the\n * engine-core charmap helpers without re-reading the page.\n */\n snapshot: PageTextSnapshot;\n}\n\ninterface PageCorpusEntry extends PageCorpus {\n /** The session mutation sequence the entry was built at. */\n seq: number;\n}\n\n/**\n * Per-session, per-page search corpus: the page's text snapshot plus its\n * DEFAULT fold (the one literal queries with default options search).\n * This is the local engine's in-memory equivalent of the server's corpus\n * artifacts — same fold version, same shape, built lazily on first search\n * and reused across slices and re-queries.\n *\n * Version-keyed on `DocumentSession.mutationSeq()` per PAGE (not per\n * session): a form fill or annotation edit bumps the sequence, and only\n * the pages actually re-read after that pay the re-extraction — untouched\n * cache entries for other pages are refreshed lazily as they're revisited.\n *\n * Capped: search touches every page of arbitrarily large documents, so\n * entries evict in insertion order past `MAX_CACHED_PAGES` (text of ~500\n * pages ≈ a few MB — bounded regardless of document size).\n */\nconst MAX_CACHED_PAGES = 512;\n\nconst cache = new WeakMap<DocumentSession, Map<PageObjectNumber, PageCorpusEntry>>();\n\nexport function acquirePageCorpus(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n pageObjectNumber: PageObjectNumber,\n signal: AbortSignal,\n): PageCorpus {\n const seq = session.mutationSeq();\n let pages = cache.get(session);\n if (!pages) {\n pages = new Map();\n cache.set(session, pages);\n }\n\n const hit = pages.get(pageObjectNumber);\n if (hit && hit.seq === seq) return hit;\n\n const snapshot = new PageTextReader(runtime, session).read(pageObjectNumber, signal);\n const entry: PageCorpusEntry = { seq, folded: foldText(snapshot.text), snapshot };\n\n pages.delete(pageObjectNumber); // re-insert = most recently used\n pages.set(pageObjectNumber, entry);\n if (pages.size > MAX_CACHED_PAGES) {\n const oldest = pages.keys().next().value;\n if (oldest !== undefined) pages.delete(oldest);\n }\n return entry;\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { SearchQuery, SearchRequest } from '@embedpdf/engine-core/runtime';\n\n/**\n * The local engine's resume cursor. Opaque to callers by contract; JSON\n * under the hood because a local cursor never crosses a trust boundary\n * (the server mints its own, authenticated, format for the wire).\n *\n * A cursor pins three things and refuses to resume if any moved:\n * - the query+mode identity (`key`) — a cursor is not transferable\n * between queries,\n * - the document version (`seq`) — resuming over mutated content could\n * serve stale pages or, worse, text a redaction just removed,\n * - the scan origin (`start`) — position is meaningless in a different\n * page order.\n */\nexport interface SearchCursorState {\n v: 1;\n seq: number;\n key: string;\n /** startPage pon the scan order was rotated to (0 = natural order). */\n start: number;\n /** Pages of the scan order already consumed. */\n scanned: number;\n}\n\n/** Stable identity for query + mode (option order pinned by hand). */\nexport function searchQueryKey(query: SearchQuery, mode: string): string {\n return JSON.stringify([\n query.regex ? 'r' : 'l',\n query.text,\n query.matchCase ? 1 : 0,\n query.matchDiacritics ? 1 : 0,\n query.wholeWord ? 1 : 0,\n mode,\n ]);\n}\n\nexport function encodeSearchCursor(state: SearchCursorState): string {\n return JSON.stringify(state);\n}\n\nexport function decodeSearchCursor(\n request: SearchRequest,\n cursor: string,\n expectedSeq: number,\n expectedKey: string,\n): SearchCursorState {\n let state: SearchCursorState;\n try {\n state = JSON.parse(cursor) as SearchCursorState;\n } catch {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed search cursor');\n }\n if (state?.v !== 1 || typeof state.scanned !== 'number' || typeof state.key !== 'string') {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed search cursor');\n }\n if (state.key !== expectedKey) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'search cursor belongs to a different query — restart the search',\n );\n }\n if (state.seq !== expectedSeq) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'document changed since this search cursor was issued — restart the search',\n { details: { cursorSeq: state.seq, currentSeq: expectedSeq } },\n );\n }\n // The cursor owns position; a startPage alongside it is a caller bug.\n if (request.startPage !== undefined && request.startPage !== state.start) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'startPage conflicts with the cursor — omit startPage when resuming',\n );\n }\n return state;\n}\n","import type {\n SearchMatch,\n SearchMatchRange,\n SearchRequest,\n SearchSlice,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n buildSnippet,\n charRangeForTextOffsets,\n foldOptionsFor,\n foldText,\n matchLiteral,\n matchRegex,\n buildPageTextLayout,\n textSegmentsForRange,\n validateSearchQuery,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { PageGeometryReader } from '../geometry/PageGeometryReader';\nimport { acquirePageCorpus } from './internal/pageCorpusCache';\nimport { decodeSearchCursor, encodeSearchCursor, searchQueryKey } from './internal/searchCursor';\n\n/**\n * Per-slice budget defaults and ceilings. The ceiling is the worker's\n * self-defense: one `query()` call is one synchronous stretch of native\n * work, and no request — whatever budget it asks for — may hold the\n * worker longer than ~a few hundred pages. Callers wanting more issue\n * more slices; the cursor makes that cheap.\n */\nconst DEFAULT_MAX_PAGES = 64;\nconst CEILING_MAX_PAGES = 256;\nconst DEFAULT_MAX_MATCHES = 256;\nconst CEILING_MAX_MATCHES = 1024;\n\n/**\n * The whole search pipeline for one budgeted slice, running inside the\n * trust boundary (worker locally, server process in the cloud):\n *\n * extract — page text via the session corpus cache (version-keyed on\n * `mutationSeq`, so results always reflect the CURRENT layer\n * view — text a redaction removed is unfindable),\n * match — the pure engine-core matcher (identical code on every\n * engine; parity by construction),\n * anchor — geometry read only for pages that actually matched, rects\n * via the selection line-merge (one rect per visual line).\n *\n * Scope gating (`doc.text.search`, `doc.text.copy` for `'full'`) is the\n * caller's job — this reader assumes an authorized request.\n */\nexport class SearchReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n query(request: SearchRequest, signal: AbortSignal): SearchSlice {\n throwIfAborted(signal);\n const query = request.query;\n const mode = request.mode ?? 'full';\n\n // One validator covers everything: regex dialect AND flag combos\n // (regex + matchDiacritics is the rejected one). Literal queries are\n // always valid.\n const valid = validateSearchQuery(query);\n if (!valid.ok) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `invalid search query (${valid.issue}): ${valid.message}`,\n );\n }\n\n const records = this.session.allRecords();\n const totalPages = records.length;\n\n // Nothing findable — don't burn a scan on an empty needle.\n if (!query.regex && foldText(query.text).folded.trim().length === 0) {\n return { matches: [], nextCursor: null, scannedPages: 0, totalPages };\n }\n\n const seq = this.session.mutationSeq();\n const key = searchQueryKey(query, mode);\n\n let start = 0;\n let scanned = 0;\n if (request.cursor !== undefined) {\n const state = decodeSearchCursor(request, request.cursor, seq, key);\n start = state.start;\n scanned = state.scanned;\n } else {\n if (request.startPage !== undefined) {\n // Throws NotFound for an unknown page — same contract as page(pon).\n this.session.recordByObjectNumber(request.startPage);\n start = request.startPage;\n }\n if (request.skip !== undefined) {\n // Trusted-position resume: the caller pins content versions\n // externally (the cloud wire's search token carries the content\n // epoch), so no sequence check applies here. Clamp into range.\n scanned = Math.min(Math.max(0, Math.floor(request.skip)), totalPages);\n }\n }\n\n // Viewport-first: rotate display order to begin at `start`, wrapping.\n let order = records;\n if (start !== 0) {\n const at = records.findIndex((r) => r.pageObjectNumber === start);\n order = records.slice(at).concat(records.slice(0, at));\n }\n\n const maxPages = clamp(request.budget?.maxPages, DEFAULT_MAX_PAGES, CEILING_MAX_PAGES);\n const maxMatches = clamp(request.budget?.maxMatches, DEFAULT_MAX_MATCHES, CEILING_MAX_MATCHES);\n\n const matches: SearchMatch[] = [];\n let pagesThisSlice = 0;\n // Budget checks sit at page granularity: a page's matches are never\n // split across slices, so the cursor only ever points between pages.\n while (scanned < order.length && pagesThisSlice < maxPages && matches.length < maxMatches) {\n throwIfAborted(signal);\n const pon = order[scanned].pageObjectNumber;\n const corpus = acquirePageCorpus(this.runtime, this.session, pon, signal);\n\n const text = corpus.snapshot.text;\n let ranges: SearchMatchRange[];\n if (query.regex) {\n ranges = matchRegex(text, query);\n } else if (query.matchCase || query.matchDiacritics) {\n // Non-default fold options: re-fold the cached raw text per query.\n ranges = matchLiteral(foldText(text, foldOptionsFor(query)), query);\n } else {\n ranges = matchLiteral(corpus.folded, query);\n }\n\n if (ranges.length > 0) {\n const geometry = new PageGeometryReader(this.runtime, this.session).read(pon, signal);\n // One canonical layout per page, shared by every match on it.\n const layout = buildPageTextLayout(geometry);\n for (const range of ranges) {\n // Match ranges are TEXT-space (string offsets); the hit DTO and\n // the geometry layout speak CHARACTER space. Convert exactly once,\n // here — the biased range helper keeps zero-width characters\n // adjacent to the match OUTSIDE it on both sides. Snippets stay in\n // text space (their offsets are internal to the snippet string).\n const chars = charRangeForTextOffsets(corpus.snapshot, range.start, range.start + range.length);\n matches.push({\n pageObjectNumber: pon,\n charStart: chars.start,\n charCount: chars.end - chars.start,\n segments: textSegmentsForRange(layout, chars.start, chars.end - chars.start),\n ...(mode === 'full' ? { snippet: buildSnippet(text, range) } : {}),\n });\n }\n }\n\n scanned++;\n pagesThisSlice++;\n }\n\n return {\n matches,\n nextCursor:\n scanned < order.length ? encodeSearchCursor({ v: 1, seq, key, start, scanned }) : null,\n scannedPages: scanned,\n totalPages,\n };\n }\n}\n\nfunction clamp(requested: number | undefined, fallback: number, ceiling: number): number {\n if (requested === undefined || !Number.isFinite(requested)) return fallback;\n return Math.max(1, Math.min(Math.floor(requested), ceiling));\n}\n","import type { DocumentActionsSnapshot, PdfActionTree } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { ActionReadBudgetTracker, readActionModel } from './ActionModelReader';\nimport { readDestination } from '../destinations/readDestination';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { readUtf16String } from '../../runtime/memory/strings';\nimport { throwIfAborted } from '../../shared/abort';\n\nconst DOCUMENT_ACTION_EVENTS = [\n ['willClose', 0],\n ['willSave', 1],\n ['didSave', 2],\n ['willPrint', 3],\n ['didPrint', 4],\n] as const;\n\n/** Read catalog-owned actions. Extraction only; no action is executed. */\nexport class DocumentActionsReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(signal: AbortSignal): DocumentActionsSnapshot {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const budget = new ActionReadBudgetTracker();\n const count = fn.FPDFDoc_GetJavaScriptActionCount(docPtr);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'failed to enumerate PDF name-tree scripts',\n );\n }\n\n const nameTreeScripts: DocumentActionsSnapshot['nameTreeScripts'] = [];\n for (let index = 0; index < count; index++) {\n throwIfAborted(signal);\n const namedPtr = fn.FPDFDoc_GetJavaScriptAction(docPtr, index);\n if (namedPtr === NULL_PTR) {\n throw new EngineError(EngineErrorCode.MalformedPdf, 'invalid PDF name-tree script entry', {\n details: { index },\n });\n }\n let name: string;\n try {\n name =\n readUtf16String(mem, (buf, capacity) =>\n fn.FPDFJavaScriptAction_GetName(namedPtr, buf, capacity),\n ) ?? '';\n } finally {\n fn.FPDFDoc_CloseJavaScriptAction(namedPtr);\n }\n // Name-tree keys enter the same detached snapshot as node payloads and\n // ride the same aggregate budget.\n budget.reservePayloadBytes(name.length);\n const action = requireAction(\n readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetNamedJavaScriptActionModel(docPtr, index),\n budget,\n ),\n 'name-tree script',\n index,\n );\n nameTreeScripts.push({ name, action });\n }\n\n const openAction = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetOpenActionModel(docPtr),\n budget,\n );\n // `/OpenAction` is one entry — the destination form only exists when the\n // action form does not.\n const openDestPtr = openAction ? NULL_PTR : fn.EPDFDoc_GetOpenActionDest(docPtr);\n const openDestination =\n openDestPtr !== NULL_PTR ? readDestination(fn, mem, docPtr, openDestPtr) : null;\n const additional: Partial<Record<(typeof DOCUMENT_ACTION_EVENTS)[number][0], PdfActionTree>> =\n {};\n for (const [key, event] of DOCUMENT_ACTION_EVENTS) {\n throwIfAborted(signal);\n const action = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetAdditionalActionModel(docPtr, event),\n budget,\n );\n if (action) additional[key] = action;\n }\n return { nameTreeScripts, openAction, openDestination, ...additional };\n }\n}\n\nfunction requireAction(action: PdfActionTree | null, owner: string, index: number): PdfActionTree {\n if (action) return action;\n throw new EngineError(EngineErrorCode.MalformedPdf, `failed to read ${owner}`, {\n details: { index },\n });\n}\n","import {\n EngineError,\n EngineErrorCode,\n type PageObjectNumber,\n type PieceInfoEntry,\n type PieceInfoPatch,\n type PieceInfoSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { readUtf8String, readUtf16String, writeUtf16String } from '../../runtime/memory/strings';\nimport { throwIfAborted } from '../../shared/abort';\nimport { formatPdfDate, pdfDateToIso } from '../../shared/pdf-date';\nimport { withWideStringArray } from '../forms/internal/wideStringArray';\n\n// FPDF_OBJECT_* codes reported by EPDFDoc_Get(Page)PieceInfoValueType.\nconst OBJ_BOOLEAN = 1;\nconst OBJ_NUMBER = 2;\nconst OBJ_STRING = 3;\nconst OBJ_NAME = 4;\nconst OBJ_ARRAY = 5;\n\n/**\n * `/PieceInfo` reads and writes for one holder — the document CATALOG\n * (`pageObjectNumber` undefined) or one PAGE. Wraps the fork's symmetric\n * `EPDFDoc_*PieceInfo*` / `EPDFDoc_*PagePieceInfo*` families behind one\n * shape, so the worker host has a single code path for both levels.\n *\n * Writes stamp `content_last_modified` once per job (the worker is\n * single-threaded, so every key written by one job gets one revision date);\n * the native side fans it out to the application dict, the page dict,\n * and — for catalog writes — /Info /ModDate.\n */\nexport class PieceInfoAccessor {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n private readonly pageObjectNumber?: PageObjectNumber,\n ) {\n if (pageObjectNumber !== undefined) {\n // NotFound on a bad pon — same fail-fast as every page verb.\n session.recordByObjectNumber(pageObjectNumber);\n }\n }\n\n read(application: string, signal: AbortSignal): PieceInfoSnapshot | null {\n throwIfAborted(signal);\n requireApplication(application);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n\n const has =\n pon === undefined\n ? fn.EPDFDoc_HasPieceInfoEntry(docPtr, application)\n : fn.EPDFDoc_HasPagePieceInfoEntry(docPtr, pon, application);\n if (!has) return null;\n\n const keyCount =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoKeyCount(docPtr, application)\n : fn.EPDFDoc_GetPagePieceInfoKeyCount(docPtr, pon, application);\n\n const entries: Record<string, PieceInfoEntry> = {};\n for (let i = 0; i < keyCount; i++) {\n throwIfAborted(signal);\n const key = readUtf8String(mem, (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoKeyAt(docPtr, application, i, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoKeyAt(docPtr, pon, application, i, buf, cap),\n );\n if (key === null) continue;\n entries[key] = this.readEntry(application, key);\n }\n\n const lastModifiedPdf = readUtf16String(\n mem,\n (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoLastModified(docPtr, application, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoLastModified(docPtr, pon, application, buf, cap),\n null,\n );\n return {\n entries,\n lastModified: lastModifiedPdf ? pdfDateToIso(lastModifiedPdf) : null,\n };\n }\n\n update(application: string, patch: PieceInfoPatch, signal: AbortSignal): void {\n throwIfAborted(signal);\n requireApplication(application);\n requirePatch(patch);\n const keys = Object.keys(patch);\n if (keys.length === 0) return;\n validatePatch(patch, keys);\n\n // This is the apply boundary. No caller-controlled validation and no\n // cancellation check belongs below it: once the first native setter runs,\n // this deliberately non-rollback-atomic patch may be partially written if\n // a native invariant fails on a later key.\n throwIfAborted(signal);\n\n const { mem } = this.runtime;\n // One revision date per job, however many keys the patch touches.\n const lastModified = formatPdfDate(new Date());\n const lmPtr = mem.writeU16String(lastModified);\n try {\n for (const key of keys) {\n const value = patch[key];\n const ok = this.writeEntry(application, key, value, lmPtr);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `pieceInfo write rejected for key '${key}' after validation`,\n );\n }\n }\n } finally {\n mem.free(lmPtr);\n }\n }\n\n applications(signal: AbortSignal): string[] {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n const count =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoEntryCount(docPtr)\n : fn.EPDFDoc_GetPagePieceInfoEntryCount(docPtr, pon);\n const out: string[] = [];\n for (let i = 0; i < count; i++) {\n const name = readUtf8String(mem, (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoEntryAt(docPtr, i, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoEntryAt(docPtr, pon, i, buf, cap),\n );\n if (name !== null) out.push(name);\n }\n return out;\n }\n\n clear(application: string, signal: AbortSignal): void {\n throwIfAborted(signal);\n requireApplication(application);\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n const ok =\n pon === undefined\n ? fn.EPDFDoc_ClearPieceInfoEntry(docPtr, application)\n : fn.EPDFDoc_ClearPagePieceInfoEntry(docPtr, pon, application);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `pieceInfo clear rejected for application '${application}'`,\n );\n }\n }\n\n private readEntry(application: string, key: string): PieceInfoEntry {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n const type =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoValueType(docPtr, application, key)\n : fn.EPDFDoc_GetPagePieceInfoValueType(docPtr, pon, application, key);\n\n switch (type) {\n case OBJ_STRING: {\n const value = readUtf16String(\n mem,\n (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoString(docPtr, application, key, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoString(docPtr, pon, application, key, buf, cap),\n '',\n );\n return value === null ? { type: 'unknown' } : { type: 'string', value };\n }\n case OBJ_NAME: {\n const value = readUtf8String(mem, (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoName(docPtr, application, key, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoName(docPtr, pon, application, key, buf, cap),\n );\n return value === null ? { type: 'unknown' } : { type: 'name', value };\n }\n case OBJ_NUMBER: {\n const outPtr = mem.alloc(4);\n try {\n const ok =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoNumber(docPtr, application, key, outPtr)\n : fn.EPDFDoc_GetPagePieceInfoNumber(docPtr, pon, application, key, outPtr);\n if (!ok) return { type: 'unknown' };\n return { type: 'number', value: Number(mem.peek(outPtr, 'f32')) };\n } finally {\n mem.free(outPtr);\n }\n }\n case OBJ_BOOLEAN: {\n const outPtr = mem.alloc(4);\n try {\n const ok =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoBoolean(docPtr, application, key, outPtr)\n : fn.EPDFDoc_GetPagePieceInfoBoolean(docPtr, pon, application, key, outPtr);\n if (!ok) return { type: 'unknown' };\n return { type: 'boolean', value: Number(mem.peek(outPtr, 'i32')) !== 0 };\n } finally {\n mem.free(outPtr);\n }\n }\n case OBJ_ARRAY: {\n const count =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoStringArrayCount(docPtr, application, key)\n : fn.EPDFDoc_GetPagePieceInfoStringArrayCount(docPtr, pon, application, key);\n // -1 = not a pure text-string array — preserved, not readable here.\n if (count < 0) return { type: 'unknown' };\n const value: string[] = [];\n for (let i = 0; i < count; i++) {\n const item = readUtf16String(\n mem,\n (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoStringArrayAt(docPtr, application, key, i, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoStringArrayAt(\n docPtr,\n pon,\n application,\n key,\n i,\n buf,\n cap,\n ),\n '',\n );\n if (item === null) return { type: 'unknown' };\n value.push(item);\n }\n return { type: 'string-array', value };\n }\n default:\n return { type: 'unknown' };\n }\n }\n\n private writeEntry(\n application: string,\n key: string,\n value: PieceInfoPatch[string],\n lmPtr: Ptr,\n ): boolean {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n\n if (value === null) {\n return pon === undefined\n ? fn.EPDFDoc_ClearPieceInfoKey(docPtr, application, key, lmPtr)\n : fn.EPDFDoc_ClearPagePieceInfoKey(docPtr, pon, application, key, lmPtr);\n }\n if (typeof value === 'string') {\n return writeUtf16String(mem, value, (ptr) =>\n pon === undefined\n ? fn.EPDFDoc_SetPieceInfoString(docPtr, application, key, ptr, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoString(docPtr, pon, application, key, ptr, lmPtr),\n );\n }\n if (typeof value === 'number') {\n return pon === undefined\n ? fn.EPDFDoc_SetPieceInfoNumber(docPtr, application, key, value, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoNumber(docPtr, pon, application, key, value, lmPtr);\n }\n if (typeof value === 'boolean') {\n return pon === undefined\n ? fn.EPDFDoc_SetPieceInfoBoolean(docPtr, application, key, value, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoBoolean(docPtr, pon, application, key, value, lmPtr);\n }\n if (Array.isArray(value)) {\n return withWideStringArray(this.runtime, value, (arrayPtr, count) =>\n pon === undefined\n ? fn.EPDFDoc_SetPieceInfoStringArray(docPtr, application, key, arrayPtr, count, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoStringArray(\n docPtr,\n pon,\n application,\n key,\n arrayPtr,\n count,\n lmPtr,\n ),\n );\n }\n if (typeof value === 'object' && value !== null && 'name' in value) {\n return pon === undefined\n ? fn.EPDFDoc_SetPieceInfoName(docPtr, application, key, value.name, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoName(docPtr, pon, application, key, value.name, lmPtr);\n }\n // validatePatch() makes this unreachable. Keep a loud invariant failure\n // rather than silently ignoring a new wire value if the vocabulary grows.\n throw new EngineError(EngineErrorCode.Unknown, `unvalidated pieceInfo value for '${key}'`);\n }\n}\n\nfunction requireApplication(application: string): void {\n if (typeof application !== 'string' || application.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pieceInfo application must be non-empty');\n }\n}\n\nfunction requirePatch(patch: PieceInfoPatch): void {\n if (typeof patch !== 'object' || patch === null || Array.isArray(patch)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pieceInfo patch must be an object');\n }\n}\n\nfunction validatePatch(patch: PieceInfoPatch, keys: string[]): void {\n for (const key of keys) {\n if (key.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pieceInfo keys must be non-empty');\n }\n validatePatchValue(key, patch[key]);\n }\n}\n\nfunction validatePatchValue(key: string, value: PieceInfoPatch[string]): void {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pieceInfo number for '${key}' must be finite`,\n );\n }\n return;\n }\n\n if (Array.isArray(value)) {\n if (!value.every((item) => typeof item === 'string')) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pieceInfo string array for '${key}' must contain only strings`,\n );\n }\n return;\n }\n\n if (typeof value === 'object' && value !== null && 'name' in value) {\n if (typeof value.name !== 'string' || value.name.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pieceInfo PDF name for '${key}' must be a non-empty string`,\n );\n }\n return;\n }\n\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `unsupported pieceInfo value for '${key}': string | number | boolean | string[] | { name } | null`,\n );\n}\n","import {\n EMPTY_TRANSFER,\n EngineError,\n EngineErrorCode,\n serializeError,\n wirePack,\n type AnnotationsCreateWorkerRequest,\n type AnnotationsDeleteWorkerRequest,\n type DocumentCheckPasswordPermissionsWorkerRequest,\n type DocumentProbeSecurityFileWorkerRequest,\n type DocumentRenderPageFileWorkerRequest,\n type DocumentSaveBufferWorkerRequest,\n type DocumentSaveFileWorkerRequest,\n type DocumentSaveLayerBufferWorkerRequest,\n type FormsAttachWidgetWorkerRequest,\n type FormsCreateFieldWorkerRequest,\n type FormsDeleteFieldWorkerRequest,\n type FormsDetachWidgetWorkerRequest,\n type FormsExportWorkerRequest,\n type FormsImportWorkerRequest,\n type FormsListWorkerRequest,\n type FormsRepairWorkerRequest,\n type FormsUpdateFieldWorkerRequest,\n type FormsResetWorkerRequest,\n type FormsSetValueWorkerRequest,\n type FontsRegisterWorkerRequest,\n type FontsAddFallbackWorkerRequest,\n type FontsClearFallbacksWorkerRequest,\n type FontsClearWorkerRequest,\n type AnnotationsListFullPageWorkerRequest,\n type AnnotationsListRawAllWorkerRequest,\n type AnnotationsListRawPageWorkerRequest,\n type AnnotationsRenderAppearancesWorkerRequest,\n type AnnotationsMoveWorkerRequest,\n type AnnotationsUpdateWorkerRequest,\n type CloseWorkerRequest,\n type LayerCloseWorkerRequest,\n type MetadataReadWorkerRequest,\n type MetadataUpdateWorkerRequest,\n type ActionsReadWorkerRequest,\n type OpenWorkerRequest,\n type PagesListWorkerRequest,\n type PagesGeometryWorkerRequest,\n type PagesMoveWorkerRequest,\n type PagesRotateWorkerRequest,\n type PagesDeleteWorkerRequest,\n type PagesExtractWorkerRequest,\n type PagesInsertBlankWorkerRequest,\n type PagesInsertWorkerRequest,\n type AttachmentsListWorkerRequest,\n type AttachmentsReadFileWorkerRequest,\n type AttachmentsCreateWorkerRequest,\n type AttachmentsDeleteWorkerRequest,\n type AnnotationsReadFileWorkerRequest,\n type PagesFlattenWorkerRequest,\n type RedactionApplyWorkerRequest,\n type PieceInfoApplicationsWorkerRequest,\n type PieceInfoClearWorkerRequest,\n type PieceInfoReadWorkerRequest,\n type PieceInfoUpdateWorkerRequest,\n type PageNetworkRenderFormat,\n type PageRaster,\n type PagesRenderWorkerRequest,\n type PagesRenderEncodedWorkerRequest,\n type DocumentRenderPageFileEncodedWorkerRequest,\n type AnnotationsRenderAppearancesEncodedWorkerRequest,\n type EncodedAppearanceWire,\n type EncodedImageWire,\n type RenderEncode,\n type PagesTextWorkerRequest,\n type SearchQueryWorkerRequest,\n type FormsApplyEffectsWorkerRequest,\n type SerializedEngineError,\n type ShutdownWorkerRequest,\n type WirePack,\n type WorkerJobId,\n type WorkerRequest,\n type WorkerResponse,\n type WorkerResultPayload,\n} from '@embedpdf/engine-core/runtime';\nimport type { MutationMeta } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { DocumentSession } from '../document-session/DocumentSession';\nimport { BaseDocumentRegistry } from '../document-session/lifecycle/BaseDocumentRegistry';\nimport {\n openFatMemoryDocument,\n openLayerDocument,\n} from '../document-session/lifecycle/PdfDocumentOpener';\nimport { DocumentActionsReader } from '../features/actions';\nimport {\n AnnotationReader,\n AnnotationAppearanceReader,\n AnnotationMutator,\n RawAnnotationReader,\n} from '../features/annotations';\nimport { AttachmentMutator, AttachmentReader } from '../features/attachments';\nimport { FontRegistrar, type StartupFontSpec } from '../features/fonts';\nimport { FormMutator, FormReader, FormsEffectsApplier, disposeFormModel } from '../features/forms';\nimport { PageGeometryReader } from '../features/geometry';\nimport { MetadataMutator, MetadataReader } from '../features/metadata';\nimport {\n PagesExtractor,\n PagesFlattener,\n PagesInserter,\n PagesMutator,\n PagesReader,\n} from '../features/pages';\nimport { PieceInfoAccessor } from '../features/pieceinfo';\nimport { RedactionApplier } from '../features/redaction';\nimport { PageRenderReader } from '../features/render';\nimport { DocumentSaver } from '../features/save';\nimport { SearchReader } from '../features/search';\nimport { SecurityReader } from '../features/security';\nimport { PageTextReader } from '../features/text';\nimport { ensureInitialized, destroyLibrary } from '../runtime/lifecycle/bootstrap';\n\n/** The image a {@link WorkerImageEncoder} produced. `bytes` must OWN its\n * buffer (a fresh allocation, not a pooled `Buffer` slab view) — it is\n * placed on the transfer manifest and moved zero-copy. */\nexport interface WorkerEncodedImage {\n contentType: string;\n bytes: Uint8Array;\n}\n\n/**\n * Injected image-encode capability for the `*.renderEncoded` wire kinds.\n * Dependency inversion keeps the native encoder OUT of this shared\n * package: the cloud server's worker entry injects a sharp/libvips\n * implementation; browser/local entries inject nothing (they encode via\n * canvas) and the encoded kinds reject with `NotImplemented`.\n */\nexport interface WorkerImageEncoder {\n encode(\n raster: PageRaster,\n opts: { format: PageNetworkRenderFormat; quality?: number },\n ): Promise<WorkerEncodedImage>;\n}\n\nexport interface WorkerHostOptions {\n imageEncoder?: WorkerImageEncoder;\n}\n\n/**\n * The piece that runs \"inside the worker\": owns runtime, manages document\n * sessions, dispatches requests to the engine-services synchronous code.\n *\n * Environment-agnostic. Wrap it with a Web Worker entry, a Node\n * worker_thread entry, or an inline transport. The wrapper owns\n * postMessage plumbing and any process/lifecycle concerns; the host only\n * knows about PdfRuntimeModule, DocumentSession, AbortController, and the\n * worker wire shape from @embedpdf/engine-core.\n */\nexport class WorkerHost {\n private readonly sessions = new Map<string, DocumentSession>();\n private readonly baseDocuments: BaseDocumentRegistry;\n private readonly aborts = new Map<WorkerJobId, AbortController>();\n /**\n * Runtime-global registered fonts for this thread. The registry is\n * thread-local in PDFium, so it lives on the host (one per thread), not per\n * document session. `fontIds` maps the stable wire `fontKey` to this\n * thread's volatile native FontId.\n */\n private readonly fontIds = new Map<string, number>();\n private readonly fonts: FontRegistrar;\n private destroyed = false;\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n /**\n * Receives a fully-typed `WirePack<WorkerResponse>` (the envelope\n * payload plus its transfer manifest). The wrapper (browser\n * `worker-entry.ts`, Node `worker-entry.ts`, or `InlineTransport`)\n * is responsible for actually invoking `postMessage(pack.payload,\n * pack.transfer)` — the host doesn't know which environment it\n * runs in.\n */\n private readonly post: (pack: WirePack<WorkerResponse>) => void,\n /** Optional capabilities. See {@link WorkerHostOptions}. */\n private readonly options: WorkerHostOptions = {},\n ) {\n ensureInitialized(this.runtime);\n this.baseDocuments = new BaseDocumentRegistry(this.runtime);\n this.fonts = new FontRegistrar(this.runtime, this.fontIds);\n }\n\n /**\n * Register deployment-owned fonts on this worker thread, after init and\n * before serving requests. Server-only: the cloud engine never exposes font\n * configuration to clients, so the host (not a wire message) seeds the\n * thread's fallback fonts. Browser engines drive fonts through the\n * `fonts.*` wire path instead. Throws if any font fails to load.\n */\n registerStartupFonts(specs: readonly StartupFontSpec[]): void {\n this.fonts.registerStartup(specs);\n }\n\n receive(msg: WorkerRequest): void {\n if (msg.kind === 'abort') {\n this.aborts.get(msg.jobId)?.abort();\n return;\n }\n\n // The encoded render kinds are the protocol's ONLY async ops: their\n // raster comes from the SAME sync handlers as the raw kinds (all\n // session/registry use completes before the first await), and only\n // the injected image encode awaits. They run on a parallel async\n // path with identical resolve/reject/abort bookkeeping; everything\n // else stays on the synchronous switch below, unchanged.\n if (\n msg.kind === 'pages.renderEncoded' ||\n msg.kind === 'document.renderPageFileEncoded' ||\n msg.kind === 'annotations.renderAppearancesEncoded'\n ) {\n void this.receiveEncoded(msg);\n return;\n }\n\n const ctrl = new AbortController();\n this.aborts.set(msg.jobId, ctrl);\n\n // Abort policy: only handlers that loop over pages/annotations honor\n // `ctrl.signal` (the read/mutation paths below). One-shot native\n // operations — open, document save, security probe, close, shutdown —\n // are effectively atomic from our side and intentionally non-abortable,\n // so they do not receive the signal.\n let resultPack: WirePack<WorkerResultPayload>;\n try {\n switch (msg.kind) {\n case 'open.fatMem':\n case 'open.layerMemBase':\n case 'open.layerFileBase':\n resultPack = this.handleOpen(msg);\n break;\n case 'metadata.read':\n resultPack = this.handleMetadataRead(msg, ctrl.signal);\n break;\n case 'metadata.update':\n resultPack = this.handleMetadataUpdate(msg, ctrl.signal);\n break;\n case 'actions.read':\n resultPack = this.handleActionsRead(msg, ctrl.signal);\n break;\n case 'annotations.listRawAll':\n resultPack = this.handleAnnotationsListRawAll(msg, ctrl.signal);\n break;\n case 'annotations.listRawPage':\n resultPack = this.handleAnnotationsListRawPage(msg, ctrl.signal);\n break;\n case 'annotations.listFullPage':\n resultPack = this.handleAnnotationsListFullPage(msg, ctrl.signal);\n break;\n case 'annotations.renderAppearances':\n resultPack = this.handleAnnotationsRenderAppearances(msg, ctrl.signal);\n break;\n case 'annotations.create':\n resultPack = this.handleAnnotationsCreate(msg, ctrl.signal);\n break;\n case 'annotations.update':\n resultPack = this.handleAnnotationsUpdate(msg, ctrl.signal);\n break;\n case 'annotations.delete':\n resultPack = this.handleAnnotationsDelete(msg, ctrl.signal);\n break;\n case 'annotations.move':\n resultPack = this.handleAnnotationsMove(msg, ctrl.signal);\n break;\n case 'forms.list':\n resultPack = this.handleFormsList(msg, ctrl.signal);\n break;\n case 'forms.setValue':\n resultPack = this.handleFormsSetValue(msg, ctrl.signal);\n break;\n case 'forms.reset':\n resultPack = this.handleFormsReset(msg, ctrl.signal);\n break;\n case 'forms.applyEffects':\n resultPack = this.handleFormsApplyEffects(msg, ctrl.signal);\n break;\n case 'forms.export':\n resultPack = this.handleFormsExport(msg, ctrl.signal);\n break;\n case 'forms.import':\n resultPack = this.handleFormsImport(msg, ctrl.signal);\n break;\n case 'forms.repair':\n resultPack = this.handleFormsRepair(msg, ctrl.signal);\n break;\n case 'forms.createField':\n resultPack = this.handleFormsCreateField(msg, ctrl.signal);\n break;\n case 'forms.updateField':\n resultPack = this.handleFormsUpdateField(msg, ctrl.signal);\n break;\n case 'forms.deleteField':\n resultPack = this.handleFormsDeleteField(msg, ctrl.signal);\n break;\n case 'forms.attachWidget':\n resultPack = this.handleFormsAttachWidget(msg, ctrl.signal);\n break;\n case 'forms.detachWidget':\n resultPack = this.handleFormsDetachWidget(msg, ctrl.signal);\n break;\n case 'pages.list':\n resultPack = this.handlePagesList(msg, ctrl.signal);\n break;\n case 'pages.move':\n resultPack = this.handlePagesMove(msg, ctrl.signal);\n break;\n case 'pages.rotate':\n resultPack = this.handlePagesRotate(msg, ctrl.signal);\n break;\n case 'pages.delete':\n resultPack = this.handlePagesDelete(msg, ctrl.signal);\n break;\n case 'pages.flatten':\n resultPack = this.handlePagesFlatten(msg, ctrl.signal);\n break;\n case 'redaction.apply':\n resultPack = this.handleRedactionApply(msg, ctrl.signal);\n break;\n case 'pages.extract':\n resultPack = this.handlePagesExtract(msg, ctrl.signal);\n break;\n case 'pages.insert':\n resultPack = this.handlePagesInsert(msg, ctrl.signal);\n break;\n case 'pages.insertBlank':\n resultPack = this.handlePagesInsertBlank(msg, ctrl.signal);\n break;\n case 'attachments.list':\n resultPack = this.handleAttachmentsList(msg, ctrl.signal);\n break;\n case 'attachments.readFile':\n resultPack = this.handleAttachmentsReadFile(msg, ctrl.signal);\n break;\n case 'attachments.create':\n resultPack = this.handleAttachmentsCreate(msg, ctrl.signal);\n break;\n case 'attachments.delete':\n resultPack = this.handleAttachmentsDelete(msg, ctrl.signal);\n break;\n case 'annotations.readFile':\n resultPack = this.handleAnnotationsReadFile(msg, ctrl.signal);\n break;\n case 'pieceInfo.read':\n resultPack = this.handlePieceInfoRead(msg, ctrl.signal);\n break;\n case 'pieceInfo.update':\n resultPack = this.handlePieceInfoUpdate(msg, ctrl.signal);\n break;\n case 'pieceInfo.applications':\n resultPack = this.handlePieceInfoApplications(msg, ctrl.signal);\n break;\n case 'pieceInfo.clear':\n resultPack = this.handlePieceInfoClear(msg, ctrl.signal);\n break;\n case 'pages.text':\n resultPack = this.handlePagesText(msg, ctrl.signal);\n break;\n case 'pages.geometry':\n resultPack = this.handlePagesGeometry(msg, ctrl.signal);\n break;\n case 'pages.render':\n resultPack = this.handlePagesRender(msg, ctrl.signal);\n break;\n case 'search.query':\n resultPack = this.handleSearchQuery(msg, ctrl.signal);\n break;\n case 'document.saveBuffer':\n resultPack = this.handleDocumentSaveBuffer(msg);\n break;\n case 'document.saveLayerBuffer':\n resultPack = this.handleDocumentSaveLayerBuffer(msg);\n break;\n case 'document.saveFile':\n resultPack = this.handleDocumentSaveFile(msg);\n break;\n case 'document.probeSecurityFile':\n resultPack = this.handleDocumentProbeSecurityFile(msg);\n break;\n case 'document.renderPageFile':\n resultPack = this.handleDocumentRenderPageFile(msg, ctrl.signal);\n break;\n case 'document.checkPasswordPermissions':\n resultPack = this.handleDocumentCheckPasswordPermissions(msg);\n break;\n case 'fonts.register':\n resultPack = this.handleFontsRegister(msg);\n break;\n case 'fonts.addFallback':\n resultPack = this.handleFontsAddFallback(msg);\n break;\n case 'fonts.clearFallbacks':\n resultPack = this.handleFontsClearFallbacks(msg);\n break;\n case 'fonts.clear':\n resultPack = this.handleFontsClear(msg);\n break;\n case 'layer.close':\n resultPack = this.handleLayerClose(msg);\n break;\n case 'close':\n resultPack = this.handleClose(msg);\n break;\n case 'shutdown':\n resultPack = this.handleShutdown(msg);\n break;\n default:\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `unknown request kind: ${(msg as WorkerRequest).kind}`,\n );\n }\n // Lift the handler's transfer manifest onto the response envelope\n // unchanged. The handler decided which buffers to move; the host\n // just relays that decision through the `resolve` envelope.\n this.post(\n wirePack(\n { kind: 'resolve', jobId: msg.jobId, result: resultPack.payload },\n resultPack.transfer,\n ),\n );\n } catch (err) {\n const error: SerializedEngineError = serializeError(err);\n // Reject envelopes never carry binary; explicit EMPTY_TRANSFER\n // documents that intent.\n this.post(wirePack({ kind: 'reject', jobId: msg.jobId, error }, EMPTY_TRANSFER));\n } finally {\n this.aborts.delete(msg.jobId);\n }\n }\n\n private handleOpen(req: OpenWorkerRequest): WirePack<WorkerResultPayload> {\n const key = sessionKey(req.docId, req.kind === 'open.fatMem' ? undefined : req.layerName);\n if (this.sessions.has(key)) {\n throw new EngineError(EngineErrorCode.InvalidArg, `document session already open: ${key}`);\n }\n const session = new DocumentSession(this.runtime);\n if (req.kind === 'open.fatMem') {\n const bytes = new Uint8Array(req.bytes);\n try {\n session.openFromHandle(openFatMemoryDocument(this.runtime, bytes, req.password));\n } catch (error) {\n // Password failures are a STATE, not an error: park the session with\n // the already-transferred bytes and answer with a security probe that\n // says \"password required\". The client handle comes up locked\n // (`security.passwordPrompt === 'required'`); a later\n // `document.checkPasswordPermissions` performs the actual load.\n if (!isPasswordOpenError(error)) throw error;\n session.parkLocked(bytes);\n this.sessions.set(key, session);\n return wirePack({\n tag: 'open',\n docId: req.docId,\n security: passwordRequiredProbe(),\n });\n }\n } else if (req.kind === 'open.layerMemBase') {\n const base = this.baseDocuments.acquireMemoryBase({\n key: req.baseKey,\n bytes: new Uint8Array(req.baseBytes),\n password: req.password,\n });\n session.openFromHandle(openLayerDocument(this.runtime, base, req.layer, req.password));\n } else {\n const base = this.baseDocuments.acquireFileBase({\n key: req.baseKey,\n path: req.basePath,\n password: req.password,\n });\n session.openFromHandle(openLayerDocument(this.runtime, base, req.layer, req.password));\n }\n this.sessions.set(key, session);\n return wirePack({\n tag: 'open',\n docId: req.docId,\n security: new SecurityReader(this.runtime).checkPasswordPermissions(\n session,\n req.password ?? '',\n ),\n });\n }\n\n private handleMetadataRead(\n req: MetadataReadWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const metadata = new MetadataReader(this.runtime, session).read(signal);\n return wirePack({ tag: 'metadata.read', metadata });\n }\n\n private handleMetadataUpdate(\n req: MetadataUpdateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new MetadataMutator(this.runtime, session);\n const result = mutator.update(req.patch, signal);\n return this.finishMutation(session, { tag: 'metadata.update', result }, req.artifactPath);\n }\n\n private handleActionsRead(\n req: ActionsReadWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const snapshot = new DocumentActionsReader(this.runtime, session).read(signal);\n return wirePack({ tag: 'actions.read', snapshot });\n }\n\n private handleAnnotationsListRawAll(\n req: AnnotationsListRawAllWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new RawAnnotationReader(this.runtime, session);\n const snapshot = reader.listAll(signal);\n return wirePack({ tag: 'annotations.listRawAll', snapshot });\n }\n\n private handleAnnotationsListRawPage(\n req: AnnotationsListRawPageWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new RawAnnotationReader(this.runtime, session);\n const snapshot = reader.listOne(req.pageObjectNumber, signal);\n return wirePack({ tag: 'annotations.listRawPage', snapshot });\n }\n\n private handleAnnotationsListFullPage(\n req: AnnotationsListFullPageWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new AnnotationReader(this.runtime, session);\n const snapshot = reader.list(req.pageObjectNumber, signal);\n return wirePack({ tag: 'annotations.listFullPage', snapshot });\n }\n\n private handleAnnotationsRenderAppearances(\n req: AnnotationsRenderAppearancesWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new AnnotationAppearanceReader(this.runtime, session);\n const result = reader.render(req.pageObjectNumber, req.options ?? {}, signal);\n // Transfer every appearance raster buffer back zero-copy, like pages.render.\n const transfer = result.appearances.map((a) => a.raster.data);\n return wirePack({ tag: 'annotations.renderAppearances', result }, transfer);\n }\n\n private handleAnnotationsCreate(\n req: AnnotationsCreateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session, this.fonts);\n const result = mutator.create(\n req.pageObjectNumber,\n req.draft,\n signal,\n req.actor,\n req.resources,\n );\n return this.finishMutation(session, { tag: 'annotations.create', result }, req.artifactPath);\n }\n\n private handleAnnotationsUpdate(\n req: AnnotationsUpdateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session, this.fonts);\n const result = mutator.update(req.ref, req.patch, signal, req.actor, req.resources);\n return this.finishMutation(session, { tag: 'annotations.update', result }, req.artifactPath);\n }\n\n private handleAnnotationsDelete(\n req: AnnotationsDeleteWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session);\n const result = mutator.delete(req.ref, signal);\n return this.finishMutation(session, { tag: 'annotations.delete', result }, req.artifactPath);\n }\n\n private handleAnnotationsMove(\n req: AnnotationsMoveWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session);\n const result = mutator.move(req.pageObjectNumber, req.refs, req.toIndex, signal);\n return this.finishMutation(session, { tag: 'annotations.move', result }, req.artifactPath);\n }\n\n private handlePagesList(\n req: PagesListWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PagesReader(this.runtime, session);\n const snapshot = reader.read(signal);\n return wirePack({ tag: 'pages.list', snapshot });\n }\n\n private handlePagesMove(\n req: PagesMoveWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.move(req.pageObjectNumbers, req.destIndex, signal);\n return this.finishMutation(session, { tag: 'pages.move', result }, req.artifactPath);\n }\n\n private handlePagesRotate(\n req: PagesRotateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.rotate(req.pageObjectNumbers, req.rotation, signal);\n return this.finishMutation(session, { tag: 'pages.rotate', result }, req.artifactPath);\n }\n\n private handlePagesDelete(\n req: PagesDeleteWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.delete(req.pageObjectNumbers, signal);\n return this.finishMutation(session, { tag: 'pages.delete', result }, req.artifactPath);\n }\n\n private handlePagesFlatten(\n req: PagesFlattenWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new PagesFlattener(this.runtime, session).flatten(\n req.pageObjectNumbers,\n req.usage,\n signal,\n );\n if (result.meta === null) return wirePack({ tag: 'pages.flatten', result });\n return this.finishMutation(session, { tag: 'pages.flatten', result }, req.artifactPath);\n }\n\n private handleRedactionApply(\n req: RedactionApplyWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new RedactionApplier(this.runtime, session).apply(req.scope, signal);\n if (result.meta === null) return wirePack({ tag: 'redaction.apply', result });\n return this.finishMutation(session, { tag: 'redaction.apply', result }, req.artifactPath);\n }\n\n private handlePagesExtract(\n req: PagesExtractWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const extracted = new PagesExtractor(this.runtime, session).extract(\n req.pageObjectNumbers,\n signal,\n );\n // A read: no finishMutation, no layer artifact. Bytes transfer zero-copy.\n return wirePack({ tag: 'pages.extract', bytes: extracted.bytes, size: extracted.size }, [\n extracted.bytes,\n ]);\n }\n\n private handlePagesInsert(\n req: PagesInsertWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const inserter = new PagesInserter(this.runtime, session);\n const result = inserter.insert(req.bytes, req.destIndex, signal);\n return this.finishMutation(session, { tag: 'pages.insert', result }, req.artifactPath);\n }\n\n private handlePagesInsertBlank(\n req: PagesInsertBlankWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const inserter = new PagesInserter(this.runtime, session);\n const result = inserter.insertBlank({ size: req.size, count: req.count }, req.destIndex, signal);\n return this.finishMutation(session, { tag: 'pages.insertBlank', result }, req.artifactPath);\n }\n\n private handleAttachmentsList(\n req: AttachmentsListWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const items = new AttachmentReader(this.runtime, session).list(signal);\n return wirePack({ tag: 'attachments.list', items });\n }\n\n private handleAttachmentsReadFile(\n req: AttachmentsReadFileWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const content = new AttachmentReader(this.runtime, session).readFile(\n req.ref,\n req.path,\n req.maxDecodedBytes,\n signal,\n );\n // A read: no finishMutation, no layer artifact. Buffer-mode bytes\n // transfer zero-copy; path mode carries metadata only.\n return wirePack(\n { tag: 'attachments.readFile', content },\n content.bytes !== undefined ? [content.bytes] : [],\n );\n }\n\n private handleAttachmentsCreate(\n req: AttachmentsCreateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AttachmentMutator(this.runtime, session);\n const result = mutator.create(req.file, req.resources, signal);\n return this.finishMutation(session, { tag: 'attachments.create', result }, req.artifactPath);\n }\n\n private handleAttachmentsDelete(\n req: AttachmentsDeleteWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AttachmentMutator(this.runtime, session);\n const result = mutator.delete(req.ref, signal);\n return this.finishMutation(session, { tag: 'attachments.delete', result }, req.artifactPath);\n }\n\n private handleAnnotationsReadFile(\n req: AnnotationsReadFileWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const content = new AttachmentReader(this.runtime, session).readAnnotationFile(\n req.pageObjectNumber,\n req.ref,\n req.path,\n req.maxDecodedBytes,\n signal,\n );\n return wirePack(\n { tag: 'annotations.readFile', content },\n content.bytes !== undefined ? [content.bytes] : [],\n );\n }\n\n private handlePieceInfoRead(\n req: PieceInfoReadWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n const snapshot = accessor.read(req.application, signal);\n return wirePack({ tag: 'pieceInfo.read', snapshot });\n }\n\n private handlePieceInfoUpdate(\n req: PieceInfoUpdateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n accessor.update(req.application, req.patch, signal);\n // A mutation: layer sessions persist the artifact like every other write.\n return this.finishMutation(session, { tag: 'pieceInfo.update' }, req.artifactPath);\n }\n\n private handlePieceInfoApplications(\n req: PieceInfoApplicationsWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n const applications = accessor.applications(signal);\n return wirePack({ tag: 'pieceInfo.applications', applications });\n }\n\n private handlePieceInfoClear(\n req: PieceInfoClearWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n accessor.clear(req.application, signal);\n return this.finishMutation(session, { tag: 'pieceInfo.clear' }, req.artifactPath);\n }\n\n private handlePagesText(\n req: PagesTextWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PageTextReader(this.runtime, session);\n const snapshot = reader.read(req.pageObjectNumber, signal);\n return wirePack({ tag: 'pages.text', snapshot });\n }\n\n private handlePagesGeometry(\n req: PagesGeometryWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PageGeometryReader(this.runtime, session);\n const snapshot = reader.read(req.pageObjectNumber, signal);\n return wirePack({ tag: 'pages.geometry', snapshot });\n }\n\n private handleSearchQuery(\n req: SearchQueryWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new SearchReader(this.runtime, session);\n const slice = reader.query(req.request, signal);\n return wirePack({ tag: 'search.query', slice });\n }\n\n private handlePagesRender(\n req: PagesRenderWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PageRenderReader(this.runtime, session);\n const raster = reader.render(req.pageObjectNumber, req.options ?? {}, signal);\n return wirePack({ tag: 'pages.render', raster }, [raster.data]);\n }\n\n private async receiveEncoded(\n msg:\n | PagesRenderEncodedWorkerRequest\n | DocumentRenderPageFileEncodedWorkerRequest\n | AnnotationsRenderAppearancesEncodedWorkerRequest,\n ): Promise<void> {\n // Fail-fast BEFORE any native work: a host without an injected\n // encoder (browser/local workers) rejects the job without paying for\n // a raster it could never encode.\n if (!this.options.imageEncoder) {\n this.post(\n wirePack(\n {\n kind: 'reject',\n jobId: msg.jobId,\n error: serializeError(\n new EngineError(\n EngineErrorCode.NotImplemented,\n 'this engine has no image encoder (the *.renderEncoded kinds are cloud-server surface)',\n ),\n ),\n },\n EMPTY_TRANSFER,\n ),\n );\n return;\n }\n const ctrl = new AbortController();\n this.aborts.set(msg.jobId, ctrl);\n try {\n let resultPack: WirePack<WorkerResultPayload>;\n switch (msg.kind) {\n case 'pages.renderEncoded':\n resultPack = await this.handlePagesRenderEncoded(msg, ctrl.signal);\n break;\n case 'document.renderPageFileEncoded':\n resultPack = await this.handleDocumentRenderPageFileEncoded(msg, ctrl.signal);\n break;\n case 'annotations.renderAppearancesEncoded':\n resultPack = await this.handleAnnotationsRenderAppearancesEncoded(msg, ctrl.signal);\n break;\n }\n this.post(\n wirePack(\n { kind: 'resolve', jobId: msg.jobId, result: resultPack.payload },\n resultPack.transfer,\n ),\n );\n } catch (err) {\n this.post(\n wirePack({ kind: 'reject', jobId: msg.jobId, error: serializeError(err) }, EMPTY_TRANSFER),\n );\n } finally {\n this.aborts.delete(msg.jobId);\n }\n }\n\n private async encodeRaster(\n raster: PageRaster,\n encode: RenderEncode,\n signal: AbortSignal,\n ): Promise<EncodedImageWire> {\n const encoder = this.options.imageEncoder;\n if (!encoder) {\n throw new EngineError(\n EngineErrorCode.NotImplemented,\n 'this engine has no image encoder (the *.renderEncoded kinds are cloud-server surface)',\n );\n }\n const { bytes, contentType } = await encoder.encode(raster, encode);\n // The encoder is not abortable; honor a cancellation that arrived\n // while it ran by rejecting instead of resolving a dead job.\n if (signal.aborted) {\n throw new EngineError(EngineErrorCode.Aborted, 'aborted during image encode');\n }\n return { contentType, width: raster.width, height: raster.height, bytes };\n }\n\n private async handlePagesRenderEncoded(\n req: PagesRenderEncodedWorkerRequest,\n signal: AbortSignal,\n ): Promise<WirePack<WorkerResultPayload>> {\n const inner = this.handlePagesRender({ ...req, kind: 'pages.render' }, signal);\n if (inner.payload.tag !== 'pages.render') {\n throw new EngineError(EngineErrorCode.WireFormat, `unexpected ${inner.payload.tag}`);\n }\n const image = await this.encodeRaster(inner.payload.raster, req.encode, signal);\n return wirePack({ tag: 'pages.renderEncoded', image }, [image.bytes.buffer]);\n }\n\n private async handleDocumentRenderPageFileEncoded(\n req: DocumentRenderPageFileEncodedWorkerRequest,\n signal: AbortSignal,\n ): Promise<WirePack<WorkerResultPayload>> {\n // The transient session closes inside the sync handler's finally —\n // the raster owns its pixels, so encoding after close is sound.\n const inner = this.handleDocumentRenderPageFile(\n { ...req, kind: 'document.renderPageFile' },\n signal,\n );\n if (inner.payload.tag !== 'document.renderPageFile') {\n throw new EngineError(EngineErrorCode.WireFormat, `unexpected ${inner.payload.tag}`);\n }\n const image = await this.encodeRaster(inner.payload.raster, req.encode, signal);\n return wirePack(\n {\n tag: 'document.renderPageFileEncoded',\n pageObjectNumber: inner.payload.pageObjectNumber,\n pageCount: inner.payload.pageCount,\n image,\n },\n [image.bytes.buffer],\n );\n }\n\n private async handleAnnotationsRenderAppearancesEncoded(\n req: AnnotationsRenderAppearancesEncodedWorkerRequest,\n signal: AbortSignal,\n ): Promise<WirePack<WorkerResultPayload>> {\n const inner = this.handleAnnotationsRenderAppearances(\n { ...req, kind: 'annotations.renderAppearances' },\n signal,\n );\n if (inner.payload.tag !== 'annotations.renderAppearances') {\n throw new EngineError(EngineErrorCode.WireFormat, `unexpected ${inner.payload.tag}`);\n }\n const { pageState, appearances } = inner.payload.result;\n // SEQUENTIAL encode, deliberately: the whole raster batch already\n // exists in `inner` (peak memory is set by the render, not by encode\n // order), so fanning every appearance into the process-wide encoder\n // pool at once would only let one big batch monopolize it and starve\n // the encodes of interleaved jobs. One at a time matches the\n // previous API-side encoding loop exactly and keeps the pool fair.\n const encoded: EncodedAppearanceWire[] = [];\n for (const a of appearances) {\n encoded.push({\n ref: a.ref,\n mode: a.mode,\n rect: a.rect,\n image: await this.encodeRaster(a.raster, req.encode, signal),\n });\n }\n return wirePack(\n { tag: 'annotations.renderAppearancesEncoded', result: { pageState, appearances: encoded } },\n encoded.map((e) => e.image.bytes.buffer),\n );\n }\n\n private handleDocumentSaveBuffer(\n req: DocumentSaveBufferWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const saved = new DocumentSaver(this.runtime, session).saveStandaloneToBuffer(req.mode);\n return wirePack({ tag: 'document.saveBuffer', bytes: saved.bytes, size: saved.size }, [\n saved.bytes,\n ]);\n }\n\n private handleDocumentSaveFile(\n req: DocumentSaveFileWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const saved = new DocumentSaver(this.runtime, session).saveStandaloneToFile(req.path, req.mode);\n return wirePack({ tag: 'document.saveFile', path: saved.path });\n }\n\n private handleDocumentSaveLayerBuffer(\n req: DocumentSaveLayerBufferWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n if (session.kind !== 'layer') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'document has no layer to export (opened without a layer)',\n );\n }\n const artifact = new DocumentSaver(this.runtime, session).saveLayerArtifact();\n return wirePack(\n { tag: 'document.saveLayerBuffer', bytes: artifact.bytes, size: artifact.size },\n [artifact.bytes],\n );\n }\n\n private handleDocumentProbeSecurityFile(\n req: DocumentProbeSecurityFileWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const reader = new SecurityReader(this.runtime);\n const security = reader.probeFile(req.path, req.password);\n return wirePack({ tag: 'document.probeSecurityFile', security });\n }\n\n /**\n * One-shot file render (the derived-artifact warmer's producer): open the\n * base from a file path into a TRANSIENT session — never stored in\n * `this.sessions`, so it can't collide with (or leak into) live document\n * sessions — resolve the display index to its durable page object number,\n * render, close. Shares the base parse with concurrent ad-hoc opens of\n * the same file via the registry refcount.\n */\n private handleDocumentRenderPageFile(\n req: DocumentRenderPageFileWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = new DocumentSession(this.runtime);\n const base = this.baseDocuments.acquireFileBase({\n key: `adhoc-file:${req.path}`,\n path: req.path,\n password: req.password,\n });\n try {\n session.openFromHandle(\n openLayerDocument(this.runtime, base, { kind: 'fresh' }, req.password),\n );\n const layout = new PagesReader(this.runtime, session).read(signal);\n const page = layout.pages[req.pageIndex];\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `renderPageFile: no page at index ${req.pageIndex} (pageCount=${layout.pageCount})`,\n );\n }\n const raster = new PageRenderReader(this.runtime, session).render(\n page.pageObjectNumber,\n req.options ?? {},\n signal,\n );\n return wirePack(\n {\n tag: 'document.renderPageFile',\n pageObjectNumber: page.pageObjectNumber,\n pageCount: layout.pageCount,\n raster,\n },\n [raster.data],\n );\n } finally {\n // Closing the session releases the base acquisition through the\n // open handle's close stack (same lifecycle as live sessions).\n session.close();\n }\n }\n\n private handleDocumentCheckPasswordPermissions(\n req: DocumentCheckPasswordPermissionsWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n // The one handler that accepts a LOCKED session: on a locked session,\n // \"check this password\" means \"load the parked bytes with it\". A wrong\n // password throws DocPasswordIncorrect and the session stays parked\n // (bytes retained) for the next attempt.\n const parked = this.sessions.get(sessionKey(req.docId));\n let session: DocumentSession;\n if (parked?.isLocked()) {\n parked.openFromHandle(\n openFatMemoryDocument(this.runtime, parked.lockedBytes(), req.password),\n );\n session = parked;\n } else {\n session = this.requireSession(req);\n }\n const security = new SecurityReader(this.runtime).checkPasswordPermissions(\n session,\n req.password,\n req.mode ?? 'any',\n );\n return wirePack({ tag: 'document.checkPasswordPermissions', security });\n }\n\n private handleFontsRegister(req: FontsRegisterWorkerRequest): WirePack<WorkerResultPayload> {\n this.fonts.register(\n req.fontKey,\n req.familyName,\n req.weight,\n req.italic,\n new Uint8Array(req.data),\n );\n return wirePack({ tag: 'fonts.register', fontKey: req.fontKey });\n }\n\n private handleFontsAddFallback(\n req: FontsAddFallbackWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n this.fonts.addFallback(req.fontKey);\n return wirePack({ tag: 'fonts.addFallback' });\n }\n\n private handleFontsClearFallbacks(\n _req: FontsClearFallbacksWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n this.fonts.clearFallbacks();\n return wirePack({ tag: 'fonts.clearFallbacks' });\n }\n\n private handleFontsClear(_req: FontsClearWorkerRequest): WirePack<WorkerResultPayload> {\n this.fonts.clear();\n return wirePack({ tag: 'fonts.clear' });\n }\n\n /**\n * Close exactly ONE layer session — the reload seam for layer-session\n * freshness. The base document's refcount releases through the session's\n * close stack, so sibling layer sessions (and the base session) are\n * untouched. Idempotent: closing an absent session is a no-op ack,\n * because the caller may be reloading a layer this worker never held\n * (e.g. after a pool eviction).\n */\n private handleLayerClose(req: LayerCloseWorkerRequest): WirePack<WorkerResultPayload> {\n const key = sessionKey(req.docId, req.layerName);\n const session = this.sessions.get(key);\n if (session) {\n disposeFormModel(this.runtime, session);\n session.close();\n this.sessions.delete(key);\n }\n return wirePack({ tag: 'close' });\n }\n\n private handleClose(req: CloseWorkerRequest): WirePack<WorkerResultPayload> {\n for (const [key, session] of Array.from(this.sessions.entries())) {\n if (!sessionKeyBelongsToDoc(key, req.docId)) continue;\n disposeFormModel(this.runtime, session);\n session.close();\n this.sessions.delete(key);\n }\n return wirePack({ tag: 'close' });\n }\n\n private handleShutdown(_req: ShutdownWorkerRequest): WirePack<WorkerResultPayload> {\n if (!this.destroyed) {\n this.destroyed = true;\n for (const session of this.sessions.values()) {\n disposeFormModel(this.runtime, session);\n session.close();\n }\n this.sessions.clear();\n this.baseDocuments.releaseAll();\n destroyLibrary(this.runtime);\n }\n return wirePack({ tag: 'shutdown' });\n }\n\n private requireSession(req: { docId: string; layerName?: string }): DocumentSession {\n const key = sessionKey(req.docId, req.layerName);\n const session = this.sessions.get(key);\n if (session?.isLocked()) {\n // Truthful error for any operation reaching a parked session: the\n // document exists but needs `security.unlock()` first.\n throw new EngineError(\n EngineErrorCode.DocPasswordRequired,\n `document session is password-locked: ${key}`,\n );\n }\n if (!session || !session.isOpen()) {\n throw new EngineError(EngineErrorCode.DocNotOpen, `document session not open: ${key}`);\n }\n return session;\n }\n\n /**\n * Finalize a mutation response. For a standalone session the mutation\n * result is returned as-is. For a layer session we additionally persist\n * the layer artifact (to file when `artifactPath` is given, otherwise to\n * a transferable buffer) and merge it onto the response envelope. This\n * is the one place the layer-vs-standalone branch lives, shared by every\n * annotation and page mutation handler.\n */\n private handleFormsList(\n req: FormsListWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new FormReader(this.runtime, session);\n return wirePack({ tag: 'forms.list', snapshot: reader.snapshot(signal) });\n }\n\n private handleFormsSetValue(\n req: FormsSetValueWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.setValue(req.ref, req.value, signal);\n return this.finishMutation(session, { tag: 'forms.setValue', result }, req.artifactPath);\n }\n\n private handleFormsReset(\n req: FormsResetWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.reset(req.ref, signal);\n return this.finishMutation(session, { tag: 'forms.reset', result }, req.artifactPath);\n }\n\n private handleFormsApplyEffects(\n req: FormsApplyEffectsWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new FormsEffectsApplier(this.runtime, session).apply(req.effects, signal);\n if (result.meta === null) return wirePack({ tag: 'forms.applyEffects', result });\n return this.finishMutation(session, { tag: 'forms.applyEffects', result }, req.artifactPath);\n }\n\n private handleFormsExport(\n req: FormsExportWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new FormReader(this.runtime, session);\n const exported = reader.exportData(req.format, signal);\n return wirePack({ tag: 'forms.export', format: exported.format, bytes: exported.bytes }, [\n exported.bytes,\n ]);\n }\n\n private handleFormsImport(\n req: FormsImportWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.importData(req.data, req.format, signal);\n return this.finishMutation(session, { tag: 'forms.import', result }, req.artifactPath);\n }\n\n private handleFormsRepair(\n req: FormsRepairWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.repair(req.bakeAppearances ?? false, signal);\n return this.finishMutation(session, { tag: 'forms.repair', result }, req.artifactPath);\n }\n\n private handleFormsCreateField(\n req: FormsCreateFieldWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.createField(req.draft, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.createField', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private handleFormsUpdateField(\n req: FormsUpdateFieldWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.updateField(req.ref, req.patch, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.updateField', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private handleFormsDeleteField(\n req: FormsDeleteFieldWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { deletedFieldObjectNumber, detachedWidgets } = mutator.deleteField(req.ref, signal);\n\n // Cascade: the mutator detached the widgets (inert annotations now);\n // deleting them through the annotation feature keeps /Annots\n // bookkeeping, weak-ref invalidation, and page revisions in ONE place.\n const annotations = new AnnotationMutator(this.runtime, session);\n for (const widget of detachedWidgets) {\n if (widget.annotObjectNumber <= 0 || widget.pageObjectNumber <= 0) continue;\n annotations.delete(\n {\n kind: 'objectNumber',\n pageObjectNumber: widget.pageObjectNumber,\n annotObjectNumber: widget.annotObjectNumber,\n },\n signal,\n );\n }\n // The annotation deletes above mutated /Annots after the form\n // mutator's own bump; bump again so the form-model cache rebuilds.\n session.noteMutation();\n\n return this.finishMutation(\n session,\n {\n tag: 'forms.deleteField',\n result: {\n deletedFieldObjectNumber,\n removedWidgets: detachedWidgets,\n meta: EMPTY_FORM_META,\n },\n },\n req.artifactPath,\n );\n }\n\n private handleFormsAttachWidget(\n req: FormsAttachWidgetWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.attachWidget(req.ref, req.widget, req.onState, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.attachWidget', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private handleFormsDetachWidget(\n req: FormsDetachWidgetWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.detachWidget(req.ref, req.widget, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.detachWidget', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private finishMutation<P extends WorkerResultPayload>(\n session: DocumentSession,\n payload: P,\n artifactPath?: string,\n ): WirePack<WorkerResultPayload> {\n // Every successful mutation funnels through here; the sequence bump\n // invalidates version-keyed caches (the forms model). Forms mutators\n // bump themselves before reading back, so their tags are skipped to\n // avoid rebuilding the model cache twice per write — as do the\n // flattener and redaction applier, which note the mutation before\n // their post-apply annotation re-read.\n if (\n !payload.tag.startsWith('forms.') &&\n payload.tag !== 'pages.flatten' &&\n payload.tag !== 'redaction.apply'\n ) {\n session.noteMutation();\n }\n if (session.kind !== 'layer') {\n return wirePack(payload);\n }\n const saved = this.saveLayerArtifact(session, artifactPath);\n return wirePack({ ...payload, ...saved.payload }, saved.transfer);\n }\n\n private saveLayerArtifact(session: DocumentSession, artifactPath?: string): LayerArtifactSave {\n const saver = new DocumentSaver(this.runtime, session);\n if (artifactPath) {\n const artifactFile = saver.saveLayerArtifactToFile(artifactPath);\n return { payload: { artifactFile }, transfer: [] };\n }\n const artifact = saver.saveLayerArtifact();\n return { payload: { artifact }, transfer: [artifact.bytes] };\n }\n}\n\ninterface LayerArtifactSave {\n payload: { artifact: { bytes: ArrayBuffer; size: number } } | { artifactFile: { path: string } };\n transfer: ArrayBuffer[];\n}\n\n/** Form mutations are non-structural at the page-list level. */\nconst EMPTY_FORM_META: MutationMeta = { affectedPages: [], cacheDelta: null };\n\nconst BASE_SESSION_SUFFIX = '__base__';\n\nfunction sessionKey(docId: string, layerName?: string): string {\n return `${docId}::${layerName ? `layer:${layerName}` : BASE_SESSION_SUFFIX}`;\n}\n\nfunction sessionKeyBelongsToDoc(key: string, docId: string): boolean {\n return key === sessionKey(docId) || key.startsWith(`${docId}::layer:`);\n}\n\nfunction isPasswordOpenError(error: unknown): boolean {\n return (\n error instanceof EngineError &&\n (error.code === EngineErrorCode.DocPasswordRequired ||\n error.code === EngineErrorCode.DocPasswordIncorrect)\n );\n}\n\n/**\n * The security probe a locked open answers with — identical to what\n * `SecurityReader.probeFile` reports for a password-protected file it\n * couldn't read: encrypted, password required, permissions unknown.\n * `securityStateFromProbe` + `passwordPromptFromState` on the client\n * turn this into `passwordPrompt: { state: 'required' }`.\n */\nfunction passwordRequiredProbe() {\n return {\n encryptionState: 'encrypted' as const,\n encryptionRequiresPassword: true,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: Date.now(),\n };\n}\n"],"mappings":";;;;AAEA,MAAM,8BAAc,IAAI,QAA0B;;;;;;AAOlD,SAAgB,kBAAkB,SAAiC;CACjE,IAAI,YAAY,IAAI,OAAO,GAAG;CAC9B,QAAQ,GAAG,gBAAgB;CAC3B,YAAY,IAAI,OAAO;AACzB;;;;;AAMA,SAAgB,eAAe,SAAiC;CAC9D,IAAI,CAAC,YAAY,IAAI,OAAO,GAAG;CAC/B,QAAQ,GAAG,oBAAoB;CAC/B,YAAY,OAAO,OAAO;AAC5B;;;;;;;;AChBA,SAAgB,eAAe,QAA2B;CACxD,IAAI,OAAO,SAAS;EAClB,MAAM,SAAS,OAAO;EACtB,IAAI,kBAAkB,OAAO,MAAM;EACnC,MAAM,IAAIA,8BAAAA,WAAW,MAAM;CAC7B;AACF;;;;;;;;;;;;;;;;;;;;ACIA,SAAgB,eAAuB;CACrC,MAAM,QAAQ,WAAW,OAAO,gCAAgB,IAAI,WAAW,EAAE,CAAC;CAElE,MAAM,KAAM,MAAM,KAAM,KAAQ;CAChC,MAAM,KAAM,MAAM,KAAM,KAAQ;CAChC,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;CAC7E,OAAO,GAAG,IAAI,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,GAAG,EAAE,EAAE,GAAG,IAAI,MAAM,IAAI,EAAE,EAAE,GAAG,IAAI,MAAM,IAAI,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE;AACzG;;;;;;;;;;;;;;;;;;;;;;;ACHA,SAAgB,aAAa,KAA4B;CACvD,MAAM,QACJ,gFAAgF,KAAK,GAAG;CAC1F,IAAI,CAAC,OAAO,OAAO;CAEnB,MAAM,GAAG,OAAO,QAAQ,OAAO,OAAO,OAAO,SAAS,MAAM,SAAS,WAAW;CAChF,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,KAAK,OAAO,MAAM,IAAI;CAC5B,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,IAAI,OAAO,KAAK;CAItB,MAAM,4BAAY,IAAI,KAAK,CAAC;CAC5B,UAAU,eAAe,GAAG,IAAI,CAAC;CACjC,UAAU,YAAY,GAAG,GAAG,GAAG,CAAC;CAIhC,IACE,UAAU,eAAe,MAAM,KAC/B,UAAU,YAAY,MAAM,MAC5B,UAAU,WAAW,MAAM,KAC3B,UAAU,YAAY,MAAM,KAC5B,UAAU,cAAc,MAAM,KAC9B,UAAU,cAAc,MAAM,GAE9B,OAAO;CAGT,IAAI,gBAAgB;CACpB,IAAI,MAAM;EACR,MAAM,MAAM,OAAO,OAAO;EAC1B,MAAM,MAAM,OAAO,OAAO;EAC1B,IAAI,MAAM,MAAM,MAAM,IAAI,OAAO;EAEjC,iBAAiB,MAAM,KAAK,QAAQ,SAAS,MAAM,IAAI;CACzD;CAEA,wBAAO,IAAI,KAAK,UAAU,QAAQ,IAAI,gBAAgB,GAAM,EAAA,CAAE,YAAY;AAC5E;;;;;;;;;;;;;AAcA,SAAgB,cAAc,oBAAU,IAAI,KAAK,GAAW;CAC1D,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,IAAI,WAAW,+BAA+B;CAEnF,MAAM,OAAO,GAAW,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;CAC3D,MAAM,OAAO,EAAE,YAAY;CAC3B,IAAI,OAAO,KAAK,OAAO,MAAM,MAAM,IAAI,WAAW,qCAAqC;CAEvF,MAAM,YAAY,CAAC,EAAE,kBAAkB;CACvC,MAAM,OAAO,aAAa,IAAI,MAAM;CACpC,MAAM,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,SAAS,IAAI,EAAE,CAAC;CACpD,MAAM,MAAM,IAAI,KAAK,IAAI,SAAS,IAAI,EAAE;CACxC,OACE,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,IACxD,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,IAC5D,OAAO,IAAI,GAAG,IAAI;AAEzB;;;;;;;;ACxFA,SAAgB,IAAI,OAAuB;CACzC,OAAO,UAAU;AACnB;;;;;;;;ACAA,MAAa,oCAAoC;;AAGjD,MAAa,eAAe;;AAG5B,SAAgB,kCAAkC,MAAuB;CACvE,QACG,IAAI,IAAI,IAAI,uCAAuC,MAAM;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACIA,IAAa,WAAb,MAAqD;CAInD,YAGE,mBAA4D,QAAQ;EAClE,qBAAqB;GACnB,MAAM;EACR,CAAC;CACH,GACA;EALiB,KAAA,kBAAA;EANF,gBAAA,MAAA,6BAAY,IAAI,IAAoC,CAAA;EAC7D,gBAAA,MAAA,YAA0B,IAAA;CAU/B;CAEH,UAAU,UAAsD;EAC9D,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa;GACX,KAAK,UAAU,OAAO,QAAQ;EAChC;CACF;CAEA,QAAQ,OAA4B;EAGlC,IAAI,YAAY,OAAO;GACrB,MAAM,EAAE,aAAa,MAAM;GAC3B,IAAI,aAAa,MACf,KAAK,WAAW,KAAK,aAAa,OAAO,WAAW,KAAK,IAAI,KAAK,UAAU,QAAQ;EAExF;EAGA,KAAK,MAAM,YAAY,CAAC,GAAG,KAAK,SAAS,GACvC,IAAI;GACF,SAAS,KAAK;EAChB,SAAS,KAAK;GACZ,KAAK,gBAAgB,GAAG;EAC1B;CAEJ;CAEA,eAA8B;EAC5B,OAAO,KAAK;CACd;;CAGA,QAAc;EACZ,KAAK,UAAU,MAAM;CACvB;AACF;;;;;;;AAQA,IAAa,wBAAb,MAAmC;CACjC,YACE,KACA,WACA,MAAsC,MACtC;EAHiB,KAAA,MAAA;EACA,KAAA,YAAA;EACA,KAAA,MAAA;CAChB;;CAGH,aAAa,OAAgC;EAC3C,KAAK,IAAI,QAAQ;GACf,GAAG;GACH,QAAQ;IACN,MAAM;IACN,WAAW,KAAK;IAChB,KAAK,KAAK;IACV,IAAI,KAAK,IAAI;IACb,UAAU;GACZ;EACF,CAAkB;CACpB;AACF;;;AC5FA,MAAMC,sBAAoB;AAoB1B,IAAa,aAAb,MAAwB;;EACL,gBAAA,MAAA,WAA6B,CAAC,CAAA;EACvC,gBAAA,MAAA,UAAS,KAAA;;CAEjB,KAAK,QAA0B;EAC7B,IAAI,KAAK,QAAQ;GACf,OAAO;GACP;EACF;EACA,KAAK,QAAQ,KAAK,MAAM;CAC1B;CAEA,QAAc;EACZ,IAAI,KAAK,QAAQ;EACjB,KAAK,SAAS;EACd,IAAI,aAAsB;EAC1B,KAAK,IAAI,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,GAAG,KAC5C,IAAI;GACF,KAAK,QAAQ,EAAE,GAAG;EACpB,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EAEF,KAAK,QAAQ,SAAS;EACtB,IAAI,YAAY,MAAM;CACxB;AACF;AAEA,SAAgB,sBACd,SACA,OACA,WAA0B,MACP;CACnB,MAAM,EAAE,KAAK,OAAO;CACpB,MAAM,QAAQ,IAAI,WAAW;CAC7B,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;CAC1C,MAAM,WAAW,IAAI,KAAK,OAAO,CAAC;CAElC,IAAI;EACF,IAAI,WAAW,SAAS,KAAK;EAC7B,MAAM,SAAS,GAAG,uBAAuB,SAAS,MAAM,YAAY,YAAY,EAAE;EAClF,IAAI,CAAC,QAAQ;GAIX,IAAI,GAAG,kBAAkB,MAAMA,qBAC7B,MAAM,WACF,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,sBAAsB,6BAA6B,IACnF,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,qBAAqB,8BAA8B;GAEzF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;EAChF;EACA,sCAAsC,SAAS,MAAM;EACrD,MAAM,WAAW,GAAG,mBAAmB,MAAM,CAAC;EAC9C,OAAO;GAAE,MAAM;GAAc;GAAQ,aAAa,MAAM,MAAM;EAAE;CAClE,SAAS,OAAO;EACd,MAAM,MAAM;EACZ,MAAM;CACR;AACF;AAEA,SAAgB,kBACd,SACA,MACA,QAAqB,EAAE,MAAM,QAAQ,GACrC,WAA0B,MACP;CACnB,MAAM,EAAE,KAAK,OAAO;CACpB,MAAM,QAAQ,IAAI,WAAW;CAC7B,MAAM,WAAW,KAAK,QAAQ,CAAC;CAE/B,IAAI,cAA0C;CAC9C,MAAM,YAAY,IAAI,MAAM,CAAC;CAC7B,IAAI;EACF,IAAI,KAAK,WAAW,OAAO,EAAE;EAC7B,IAAI;EACJ,IAAI,MAAM,SAAS,SACjB,SAAS,GAAG,oBAAoB,KAAK,SAASC,yBAAAA,UAAU,YAAY,IAAI,SAAS;OAC5E;GACL,cACE,MAAM,SAAS,kBACX,QAAQ,WAAW,aAAa,MAAM,IAAI,IAC1C,QAAQ,WAAW,WAAW,MAAM,KAAK;GAC/C,MAAM,WAAW,aAAa,MAAM,CAAC;GACrC,SACE,MAAM,SAAS,cAAc,MAAM,SAAS,kBACxC,GAAG,4BAA4B,KAAK,SAAS,YAAY,KAAK,YAAY,IAAI,SAAS,IACvF,GAAG,oBAAoB,KAAK,SAAS,YAAY,KAAK,YAAY,IAAI,SAAS;EACvF;EAEA,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;EAChD,IAAI,CAAC,UAAU,WAAW,GACxB,MAAM,eAAe,MAAM;EAG7B,sCAAsC,SAAS,MAAM;EACrD,MAAM,WAAW,GAAG,mBAAmB,MAAM,CAAC;EAC9C,OAAO;GAAE,MAAM;GAAS;GAAQ,aAAa,MAAM,MAAM;EAAE;CAC7D,SAAS,OAAO;EACd,MAAM,MAAM;EACZ,MAAM;CACR,UAAU;EACR,IAAI,KAAK,SAAS;CACpB;AACF;AAEA,SAAgB,sCACd,SACA,QACM;CACN,MAAM,EAAE,OAAO;CACf,IAAI,GAAG,oBAAoB,GAAG,mCAAmC,GAAG,iBAAiB,MAAM,GACzF,GAAG,gCAAgC,QAAQ,IAAI;AAEnD;AAEA,SAAS,eAAe,QAA6B;CACnD,QAAQ,QAAR;EACE,KAAK,GACH,OAAO,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,qBAAqB,2BAA2B;EACzF,KAAK,GACH,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,0BAA0B;EACjF,KAAK,GACH,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,cAChB,0DACF;EACF,SACE,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,+BAA+B;CACzF;AACF;;;;;;;;;;;;;;;;;;;ACxIA,IAAa,cAAb,MAAyB;CAGvB,YACE,SACA,QACA;EAFiB,KAAA,UAAA;EACA,KAAA,SAAA;EAJF,gBAAA,MAAA,0BAAS,IAAI,IAAkD,CAAA;CAK7E;CAEH,QAAQ,kBAAyC;EAC/C,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,WAAW,KAAK,OAAO,IAAI,gBAAgB;EACjD,IAAI,UAAU;GACZ,SAAS;GACT,OAAO,SAAS;EAClB;EACA,MAAM,MAAM,GAAG,yCAAyC,KAAK,QAAQ,gBAAgB;EACrF,IAAI,CAAC,KACH,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,kBAChC;EAEF,KAAK,OAAO,IAAI,kBAAkB;GAAE;GAAK,MAAM;EAAE,CAAC;EAClD,OAAO;CACT;;;;;;;;CASA,OAAO,kBAA6C;EAClD,OAAO,KAAK,OAAO,IAAI,gBAAgB;CACzC;CAEA,QAAQ,kBAA0C;EAChD,MAAM,QAAQ,KAAK,OAAO,IAAI,gBAAgB;EAC9C,IAAI,CAAC,OAAO;EACZ,MAAM;EACN,IAAI,MAAM,QAAQ,GAAG;GACnB,KAAK,QAAQ,GAAG,eAAe,MAAM,GAAG;GACxC,KAAK,OAAO,OAAO,gBAAgB;EACrC;CACF;CAEA,WAAiB;EACf,MAAM,EAAE,OAAO,KAAK;EACpB,KAAK,MAAM,EAAE,SAAS,KAAK,OAAO,OAAO,GACvC,GAAG,eAAe,GAAG;EAEvB,KAAK,OAAO,MAAM;CACpB;AACF;;;;;;;;;;;;ACvCA,IAAa,yBAAb,MAAiE;CAI/D,YAAY,cAAsC;EAAtB,KAAA,eAAA;EAHX,gBAAA,MAAA,+BAAc,IAAI,IAA8B,CAAA;EAChD,gBAAA,MAAA,wCAAuB,IAAI,IAA2C,CAAA;CAEpC;;CAGnD,QAAQ,kBAA4C;EAClD,OAAO,KAAK,YAAY,IAAI,gBAAgB,KAAK;CACnD;;CAGA,MAAM,kBAAmD;EACvD,OAAO;GACL,cAAc,KAAK;GACnB;GACA,YAAY,KAAK,QAAQ,gBAAgB;EAC3C;CACF;;;;;CAMA,KAAK,kBAAmD;EACtD,MAAM,OAAO,KAAK,QAAQ,gBAAgB,IAAI;EAC9C,KAAK,YAAY,IAAI,kBAAkB,IAAI;EAC3C,OAAO,KAAK,MAAM,gBAAgB;CACpC;;;;;CAMA,SAAS,OAA4B;EACnC,IAAI,MAAM,iBAAiB,KAAK,cAC9B,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,0DACA,EAAE,SAAS,EAAE,MAAM,EAAE,CACvB;EAEF,MAAM,UAAU,KAAK,MAAM,MAAM,gBAAgB;EACjD,IAAI,EAAA,GAAA,8BAAA,oBAAA,CAAqB,SAAS,KAAK,GACrC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,2BAA2B,EACjF,SAAS;GAAE,UAAU;GAAO;EAAQ,EACtC,CAAC;CAEL;CAEA,oBAAoB,kBAAyD;EAC3E,OAAO,KAAK,qBAAqB,IAAI,gBAAgB,KAAKC,8BAAAA;CAC5D;CAEA,0BAA0B,kBAAoC,OAAkC;EAC9F,KAAK,qBAAqB,IAAI,kBAAkB,KAAK;CACvD;CAEA,KAAK,kBAA0C;EAC7C,KAAK,YAAY,OAAO,gBAAgB;EACxC,KAAK,qBAAqB,OAAO,gBAAgB;CACnD;CAEA,QAAc;EACZ,KAAK,YAAY,MAAM;EACvB,KAAK,qBAAqB,MAAM;CAClC;AACF;;;;;;;;;;;;;ACrEA,IAAa,kBAAb,MAA6B;CAgB3B,YACE,SACA,WACA;EAFiB,KAAA,UAAA;EAhBX,gBAAA,MAAA,UAAqB,IAAA;EACrB,gBAAA,MAAA,iBAAqC,IAAA;EACrC,gBAAA,MAAA,SAAsC,IAAA;EAC7B,gBAAA,MAAA,cAAA,KAAA,CAAA;EAGA,gBAAA,MAAA,yCAAwB,IAAI,IAAkC,CAAA;EAE9D,gBAAA,MAAA,kCAAiB,IAAI,IAAwB,CAAA;EACtD,gBAAA,MAAA,mBAAkB,KAAA;EAElB,gBAAA,MAAA,aAAsC,IAAA;EACtC,gBAAA,MAAA,sBAAqB,CAAA;EACrB,gBAAA,MAAA,SAA4B,IAAA;EAgE5B,gBAAA,MAAA,eAAiC,IAAA;EAqLxB,gBAAA,MAAA,YAA8B,CAAC,CAAA;EA/O9C,KAAK,aAAa,aAAa,kBAAkB;CACnD;CAEA,IAAI,YAAoB;EACtB,OAAO,KAAK;CACd;CAEA,IAAI,OAAqC;EACvC,OAAO,KAAK;CACd;CAEA,SAAkB;EAChB,OAAO,KAAK,WAAW;CACzB;CAEA,KAAK,OAAmB,WAA0B,MAAY;EAC5D,KAAK,eAAe,sBAAsB,KAAK,SAAS,OAAO,QAAQ,CAAC;CAC1E;CAEA,eAAe,QAAiC;EAC9C,IAAI,KAAK,QAAQ;GACf,OAAO,MAAM;GACb,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uBAAuB;EAC3E;EACA,KAAK,SAAS,OAAO;EACrB,KAAK,sBAAsB,OAAO,MAAM;EACxC,KAAK,QAAQ,OAAO;EACpB,KAAK,YAAY,IAAI,uBAAuB,KAAK,UAAU;EAC3D,KAAK,QAAQ,IAAI,YAAY,KAAK,SAAS,OAAO,MAAM;EACxD,KAAK,cAAc;CACrB;;;;;;;;CASA,WAAW,OAAyB;EAClC,IAAI,KAAK,QACP,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uBAAuB;EAE3E,KAAK,cAAc;CACrB;CAEA,WAAoB;EAClB,OAAO,KAAK,WAAW,QAAQ,KAAK,gBAAgB;CACtD;;CAGA,cAA0B;EACxB,IAAI,CAAC,KAAK,aACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,gCAAgC;EAEpF,OAAO,KAAK;CACd;;CAKA,YAAoB;EAClB,OAAO,KAAK,QAAQ,GAAG,kBAAkB,KAAK,cAAc,CAAC;CAC/D;;;;;CAMA,yBAA+B;EAC7B,IAAI,KAAK,iBAAiB;EAC1B,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,cAAc;EAClC,MAAM,QAAQ,GAAG,kBAAkB,MAAM;EACzC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,IAAI,KAAK,eAAe,IAAI,CAAC,GAAG;GAChC,MAAM,MAAM,GAAG,mCAAmC,QAAQ,CAAC;GAC3D,IAAI,EAAA,GAAA,8BAAA,wBAAA,CAAyB,GAAG,GAS9B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,iBAAiB,EAAE,iHACnB,EAAE,SAAS;IAAE,WAAW;IAAG;GAAI,EAAE,CACnC;GAEF,MAAM,SAAqB;IAAE,kBAAkB;IAAK,WAAW;GAAE;GACjE,KAAK,eAAe,IAAI,GAAG,MAAM;GACjC,KAAK,sBAAsB,IAAI,KAAK,MAAM;EAC5C;EACA,KAAK,kBAAkB;CACzB;;CAGA,qBAAqB,kBAAgD;EACnE,MAAM,SAAS,KAAK,sBAAsB,IAAI,gBAAgB;EAC9D,IAAI,QAAQ,OAAO;EAInB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,cAAc;EAClC,MAAM,WAAW,GAAG,+BAA+B,QAAQ,gBAAgB;EAC3E,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,kBAChC;EAEF,GAAG,eAAe,QAAQ;EAI1B,KAAK,uBAAuB;EAC5B,MAAM,QAAQ,KAAK,sBAAsB,IAAI,gBAAgB;EAC7D,IAAI,CAAC,OACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,2BAA2B,iBAAiB,yBAC9C;EAEF,OAAO;CACT;;CAGA,aAA2B;EACzB,KAAK,uBAAuB;EAC5B,OAAO,MAAM,KAAK,KAAK,eAAe,QAAQ,CAAC,CAAC,CAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CACzB,KAAK,GAAG,OAAO,CAAC;CACrB;;;;;;;;CASA,sBAA4B;EAC1B,KAAK,eAAe,MAAM;EAC1B,KAAK,sBAAsB,MAAM;EACjC,KAAK,kBAAkB;EACvB,KAAK,uBAAuB;CAC9B;;CAGA,UAAU,kBAA+C;EAGvD,KAAK,qBAAqB,gBAAgB;EAC1C,MAAM,sBAAsB,KAAK,iBAAiB,CAAC,CAAC,oBAAoB,gBAAgB;EACxF,OAAO;GACL;GACA,UAAU,KAAK,iBAAiB,CAAC,CAAC,MAAM,gBAAgB;GACxD;EACF;CACF;;CAGA,eAAe,kBAAoC,SAAwB;EACzE,KAAK,0BAA0B,mBAAA,GAAA,8BAAA,yBAAA,CAA2C,OAAO,CAAC;CACpF;CAEA,0BAA0B,kBAAoC,OAAkC;EAC9F,KAAK,iBAAiB,CAAC,CAAC,0BAA0B,kBAAkB,KAAK;CAC3E;CAEA,oBAAoB,kBAAyD;EAC3E,OAAO,KAAK,iBAAiB,CAAC,CAAC,oBAAoB,gBAAgB;CACrE;;CAGA,aAAa,kBAAmD;EAC9D,OAAO,KAAK,iBAAiB,CAAC,CAAC,KAAK,gBAAgB;CACtD;;;;;;;;;CAUA,cAAsB;EACpB,OAAO,KAAK;CACd;;CAGA,eAAqB;EACnB,KAAK;CACP;;;;;;CAOA,cAAc,kBAA0C;EACtD,KAAK,iBAAiB,CAAC,CAAC,KAAK,gBAAgB;CAC/C;CAEA,iBAAiB,OAA4B;EAC3C,KAAK,iBAAiB,CAAC,CAAC,SAAS,KAAK;CACxC;CAEA,WAAwB;EACtB,IAAI,CAAC,KAAK,OACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAE1E,OAAO,KAAK;CACd;CAEA,gBAAqB;EACnB,IAAI,CAAC,KAAK,QACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAE1E,OAAO,KAAK;CACd;;;;;;;;;CAUA,iBAAiB,SAA2B;EAC1C,KAAK,SAAS,KAAK,OAAO;CAC5B;CAIA,QAAc;EACZ,IAAI,aAAsB;EAC1B,IAAI;GACF,KAAK,OAAO,SAAS;EACvB,SAAS,OAAO;GACd,aAAa;EACf,UAAU;GACR,KAAK,QAAQ;EACf;EAEA,IAAI;GACF,KAAK,gBAAgB;EACvB,SAAS,OAAO;GACd,eAAA,aAAe;EACjB,UAAU;GACR,KAAK,gBAAgB;GACrB,KAAK,SAAS;GACd,KAAK,QAAQ;GACb,KAAK,cAAc;GACnB,KAAK,WAAW,MAAM;GACtB,KAAK,YAAY;GACjB,KAAK,eAAe,MAAM;GAC1B,KAAK,sBAAsB,MAAM;GACjC,KAAK,kBAAkB;EACzB;EAIA,KAAK,IAAI,IAAI,KAAK,SAAS,SAAS,GAAG,KAAK,GAAG,KAC7C,IAAI;GACF,KAAK,SAAS,EAAE,CAAC;EACnB,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EAEF,KAAK,SAAS,SAAS;EAEvB,IAAI,YAAY,MAAM;CACxB;CAEA,mBAA8C;EAC5C,IAAI,CAAC,KAAK,WACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAE1E,OAAO,KAAK;CACd;AACF;AASA,IAAI,iBAAiB;AAErB,SAAS,oBAA4B;CACnC,OAAO,SAAS,EAAE,eAAA,CAAgB,SAAS,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE;AAC1E;;;ACpVA,IAAa,uBAAb,MAAkC;CAGhC,YAAY,SAA4C;EAA3B,KAAA,UAAA;EAFZ,gBAAA,MAAA,2BAAU,IAAI,IAAuB,CAAA;CAEG;CAEzD,kBAAkB,MAIO;EACvB,MAAM,WAAW,KAAK,OAAO,KAAK,GAAG;EACrC,IAAI,UAAU,OAAO;EAErB,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,QAAQ,IAAI,WAAW;EAC7B,MAAM,UAAU,IAAI,MAAM,KAAK,MAAM,UAAU;EAC/C,MAAM,WAAW,IAAI,KAAK,OAAO,CAAC;EAElC,IAAI;GACF,IAAI,WAAW,SAAS,KAAK,KAAK;GAClC,MAAM,UAAU,GAAG,2BACjB,SACA,KAAK,MAAM,YACX,KAAK,YAAY,EACnB;GACA,IAAI,CAAC,SACH,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,8BAA8B;GAErF,sCAAsC,KAAK,SAAS,OAAO;GAC3D,MAAM,WAAW,GAAG,yBAAyB,OAAO,CAAC;GACrD,OAAO,KAAK,OAAO,KAAK,KAAK,eAAe,MAAM,MAAM,CAAC;EAC3D,SAAS,OAAO;GACd,MAAM,MAAM;GACZ,MAAM;EACR;CACF;CAEA,gBAAgB,MAIS;EACvB,MAAM,WAAW,KAAK,OAAO,KAAK,GAAG;EACrC,IAAI,UAAU,OAAO;EAErB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,IAAI,WAAW;EAC7B,IAAI,SAAqC;EAEzC,IAAI;GACF,SAAS,KAAK,QAAQ,WAAW,aAAa,KAAK,IAAI;GACvD,MAAM,WAAW,QAAQ,MAAM,CAAC;GAChC,MAAM,UAAU,GAAG,sBAAsB,OAAO,KAAK,KAAK,YAAY,EAAE;GACxE,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,8BAA8B;GAErF,sCAAsC,KAAK,SAAS,OAAO;GAC3D,MAAM,WAAW,GAAG,yBAAyB,OAAO,CAAC;GACrD,OAAO,KAAK,OAAO,KAAK,KAAK,eAAe,MAAM,MAAM,CAAC;EAC3D,SAAS,OAAO;GACd,MAAM,MAAM;GACZ,MAAM;EACR;CACF;CAEA,aAAmB;EACjB,MAAM,UAAU,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;EAChD,KAAK,QAAQ,MAAM;EACnB,IAAI,aAAsB;EAC1B,KAAK,MAAM,SAAS,SAClB,IAAI;GACF,MAAM,MAAM;EACd,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EAEF,IAAI,YAAY,MAAM;CACxB;;CAGA,sBAAsB,KAAqB;EACzC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,QAAQ;CACxC;CAEA,OAAe,KAA0C;EACvD,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;EAClC,IAAI,CAAC,OAAO,OAAO;EACnB,MAAM;EACN,OAAO,KAAK,UAAU,KAAK;CAC7B;CAEA,OAAe,KAAa,SAAc,OAAyC;EACjF,MAAM,QAAmB;GAAE;GAAK;GAAS,MAAM;GAAG;EAAM;EACxD,KAAK,QAAQ,IAAI,KAAK,KAAK;EAC3B,OAAO,KAAK,UAAU,KAAK;CAC7B;CAEA,UAAkB,OAAwC;EACxD,IAAI,WAAW;EACf,OAAO;GACL,KAAK,MAAM;GACX,SAAS,MAAM;GACf,eAAe;IACb,IAAI,UAAU;IACd,WAAW;IACX,MAAM,OAAO,KAAK,QAAQ,IAAI,MAAM,GAAG;IACvC,IAAI,CAAC,MAAM;IACX,KAAK;IACL,IAAI,KAAK,OAAO,GAAG;IACnB,KAAK,QAAQ,OAAO,MAAM,GAAG;IAC7B,KAAK,MAAM;GACb;EACF;CACF;AACF;;;;;;;;;;;ACrHA,SAAgB,YAAe,KAAuB,OAAe,MAA0B;CAC7F,MAAM,MAAM,IAAI,MAAM,KAAK;CAC3B,IAAI;EACF,OAAO,KAAK,GAAG;CACjB,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;AAOA,SAAgB,aACd,KACA,OACA,MACG;CACH,MAAM,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,CAAC;CAChD,IAAI;EACF,OAAO,KAAK,IAAI;CAClB,UAAU;EACR,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KACpC,IAAI,KAAK,KAAK,EAAE;CAEpB;AACF;;;;;;;;;;;;;;;;;;ACjBA,SAAgB,gBACd,KACA,MACA,UAAqB,IACN;CACf,MAAM,MAAM,KAAKC,yBAAAA,UAAU,CAAC;CAC5B,IAAI,OAAO,GAAG,OAAO;CACrB,IAAI,QAAQ,GAAG,OAAO;CACtB,OAAO,YAAY,KAAK,MAAM,QAAQ;EAEpC,IADgB,KAAK,KAAK,GAChB,KAAK,GAAG,OAAO;EACzB,OAAO,IAAI,cAAc,GAAG;CAC9B,CAAC;AACH;;;;;;;AAQA,SAAgB,eACd,KACA,MACe;CACf,MAAM,MAAM,KAAKA,yBAAAA,UAAU,CAAC;CAC5B,IAAI,OAAO,GAAG,OAAO;CACrB,OAAO,YAAY,KAAK,MAAM,QAAQ;EAEpC,IADgB,KAAK,KAAK,GAChB,KAAK,GAAG,OAAO;EACzB,OAAO,IAAI,aAAa,GAAG;CAC7B,CAAC;AACH;;;;;;AAOA,SAAgB,iBACd,KACA,OACA,KACS;CACT,MAAM,MAAM,IAAI,eAAe,KAAK;CACpC,IAAI;EACF,OAAO,IAAI,GAAG;CAChB,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;;AC1DA,SAAgB,aACd,IACA,KACA,QACA,KACe;CACf,IAAI,CAAC,GAAG,iBAAiB,QAAQ,GAAG,GAAG,OAAO;CAC9C,OAAO,gBACL,MACC,KAAK,aAAa,GAAG,iBAAiB,QAAQ,KAAK,KAAK,QAAQ,GACjE,EACF;AACF;;;;;;;;;ACbA,SAAS,gBACP,IACA,KACA,QACA,OACA,YACe;CACf,OAAO,eAAe,MAAM,KAAK,aAC/B,GAAG,oBAAoB,QAAQ,OAAO,YAAY,KAAK,QAAQ,CACjE;AACF;;;;;;;;;AAUA,SAAgB,kBACd,IACA,KACA,QACwB;CACxB,MAAM,QAAQ,OAAO,GAAG,qBAAqB,QAAQ,IAAI,CAAC,IAAI;CAC9D,MAAM,MAA8B,CAAC;CACrC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;EAC9B,MAAM,MAAM,gBAAgB,IAAI,KAAK,QAAQ,GAAG,IAAI;EACpD,IAAI,CAAC,KAAK;EACV,MAAM,QAAQ,aAAa,IAAI,KAAK,QAAQ,GAAG;EAC/C,IAAI,SAAS,MAAM;EACnB,IAAI,OAAO;CACb;CACA,OAAO;AACT;;;ACxCA,MAAMC,iBAAe;AACrB,MAAMC,kBAAgB;AAEtB,SAAgB,YAAY,IAAkB,QAAsC;CAClF,MAAM,MAAM,OAAO,GAAG,oBAAoB,MAAM,CAAC;CACjD,IAAI,QAAQD,gBAAc,OAAO;CACjC,IAAI,QAAQC,iBAAe,OAAO;CAClC,OAAO;AACT;;;;;;;;;;;;ACKA,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,QAAuC;EAC1C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,MAAM,KAAK,QAAQ,cAAc;EAEvC,MAAM,QAAQ,aAAa,IAAI,KAAK,KAAK,OAAO;EAChD,eAAe,MAAM;EACrB,MAAM,SAAS,aAAa,IAAI,KAAK,KAAK,QAAQ;EAClD,eAAe,MAAM;EACrB,MAAM,UAAU,aAAa,IAAI,KAAK,KAAK,SAAS;EACpD,eAAe,MAAM;EACrB,MAAM,WAAW,aAAa,IAAI,KAAK,KAAK,UAAU;EACtD,eAAe,MAAM;EACrB,MAAM,WAAW,aAAa,IAAI,KAAK,KAAK,UAAU;EACtD,eAAe,MAAM;EACrB,MAAM,UAAU,aAAa,IAAI,KAAK,KAAK,SAAS;EACpD,eAAe,MAAM;EACrB,MAAM,cAAc,aAAa,IAAI,KAAK,KAAK,cAAc;EAC7D,eAAe,MAAM;EACrB,MAAM,SAAS,aAAa,IAAI,KAAK,KAAK,SAAS;EACnD,eAAe,MAAM;EACrB,MAAM,UAAU,YAAY,IAAI,GAAG;EACnC,eAAe,MAAM;EACrB,MAAM,SAAS,kBAAkB,IAAI,KAAK,GAAG;EAE7C,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA,SAAS,cAAc,aAAa,WAAW,IAAI;GACnD,UAAU,SAAS,aAAa,MAAM,IAAI;GAC1C;GACA;EACF;CACF;AACF;;;;;;;;;;;;;;;;AC7CA,SAAgB,cACd,IACA,KACA,QACA,KACA,OACS;CACT,IAAI,UAAU,MACZ,OAAO,GAAG,iBAAiB,QAAQ,KAAKC,yBAAAA,QAAQ;CAElD,OAAO,iBAAiB,KAAK,QAAQ,QAAQ,GAAG,iBAAiB,QAAQ,KAAK,GAAG,CAAC;AACpF;;;ACxBA,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;;;;;;;AAQxB,SAAgB,iBACd,IACA,QACA,QACS;CACT,MAAM,OACJ,WAAW,SAAS,eAAe,WAAW,UAAU,gBAAgB;CAC1E,OAAO,GAAG,oBAAoB,QAAQ,IAAI;AAC5C;;;;;;;;ACXA,MAAM,qCAAqB,IAAI,IAAI;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;AAOD,MAAM,gBAA8D;CAClE,CAAC,SAAS,OAAO;CACjB,CAAC,UAAU,QAAQ;CACnB,CAAC,WAAW,SAAS;CACrB,CAAC,YAAY,UAAU;CACvB,CAAC,YAAY,UAAU;CACvB,CAAC,WAAW,SAAS;AACvB;;;;;;AAOA,SAAS,iBAAiB,KAAsB;CAC9C,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,OAAO;CACrC,IAAI,mBAAmB,IAAI,GAAG,GAAG,OAAO;CACxC,IAAI,IAAI,OAAO,KAAK,OAAO;CAC3B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;EACnC,MAAM,IAAI,IAAI,WAAW,CAAC;EAC1B,IAAI,IAAI,MAAQ,IAAI,KAAM,OAAO;CACnC;CACA,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,mBACd,IACA,KACA,QACA,OACM;CACN,MAAM,QAAQ,SAAwB;EACpC,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,4BAA4B,MAAM;CACnF;CAEA,KAAK,MAAM,CAAC,OAAO,QAAQ,eAAe;EACxC,MAAM,QAAQ,MAAM;EACpB,IAAI,UAAU,KAAA,GAAW;EACzB,IAAI,CAAC,cAAc,IAAI,KAAK,QAAQ,KAAK,KAAK,GAAG,KAAK,GAAG;CAC3D;CAEA,IAAI,MAAM,YAAY,KAAA,GAEhB;MAAA,CAAC,cAAc,IAAI,KAAK,QAAQ,gBADtB,MAAM,YAAY,OAAO,OAAO,cAAc,IAAI,KAAK,MAAM,OAAO,CAAC,CAC1B,GAAG,KAAK,cAAc;CAAA;CAEjF,IAAI,MAAM,aAAa,KAAA,GAEjB;MAAA,CAAC,cAAc,IAAI,KAAK,QAAQ,WADtB,MAAM,aAAa,OAAO,OAAO,cAAc,IAAI,KAAK,MAAM,QAAQ,CAAC,CACjC,GAAG,KAAK,SAAS;CAAA;CAGvE,IAAI,MAAM,YAAY,KAAA,GAChB;MAAA,CAAC,iBAAiB,IAAI,QAAQ,MAAM,OAAO,GAAG,KAAK,SAAS;CAAA;CAGlE,IAAI,MAAM,WAAW,KAAA,GACnB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,MAAM,GAAG;EACvD,IAAI,CAAC,iBAAiB,GAAG,GAAG;EAC5B,IAAI,CAAC,cAAc,IAAI,KAAK,QAAQ,KAAK,KAAK,GAAG,KAAK,GAAG;CAC3D;AAEJ;;;;;;;;;;;;;;AC/EA,IAAa,kBAAb,MAA6B;CAC3B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OAAO,OAAsB,QAA2C;EACtE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EAGzB,mBAAmB,IAAI,KAFR,KAAK,QAAQ,cAEK,GAAG,KAAK;EACzC,eAAe,MAAM;EAMrB,OAAO;GAAE,UADQ,IAAI,eAAe,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MACrD;GAAG,OAAO;EAAK;CACjC;AACF;;;;ACvBA,MAAa,4BAA4B;CACvC,OAAO;CACP,SAAS;EACP,UAAU;EACV,UAAU;EACV,WAAW;EACX,WAAW;EACX,QAAQ;EACR,OAAO;CACT;CACA,OAAO;EACL,aAAa;EACb,cAAc;EACd,cAAc;EACd,SAAS;EACT,OAAO;EACP,OAAO;EACP,aAAa;CACf;AACF;;AAeA,SAAgB,UAAU,KAAuB,KAAU,aAAa,GAAU;CAChF,OAAO;EACL,MAAM,QAAQ,KAAK,KAAK,UAAU;EAClC,KAAK,QAAQ,KAAK,KAAK,aAAa,CAAC;EACrC,OAAO,QAAQ,KAAK,KAAK,aAAa,CAAC;EACvC,QAAQ,QAAQ,KAAK,KAAK,aAAa,EAAE;CAC3C;AACF;;AAGA,SAAgB,UAAU,KAAuB,KAAiB;CAChE,OAAO;EACL,OAAO,QAAQ,KAAK,KAAK,CAAC;EAC1B,QAAQ,QAAQ,KAAK,KAAK,CAAC;CAC7B;AACF;;AAGA,SAAgB,QAAQ,KAAuB,KAAU,aAAa,GAAW;CAC/E,OAAO,OAAO,IAAI,KAAK,KAAK,OAAO,UAAU,CAAC;AAChD;;AAGA,SAAgB,QAAQ,KAAuB,KAAU,aAAa,GAAW;CAC/E,OAAO,OAAO,IAAI,KAAK,KAAK,OAAO,UAAU,CAAC;AAChD;;;;;;;;;ACnEA,MAAa,YAAY;CACvB,SAAS;CACT,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;AACT;;AAKA,MAAa,oBAAgD;CAC3D,KAAK,UAAU;CACf,MAAM,UAAU;CAChB,MAAM,UAAU;CAChB,MAAM,UAAU;CAChB,MAAM,UAAU;CAChB,OAAO,UAAU;CACjB,OAAO,UAAU;AACnB;;;ACxBA,MAAM,kBAAkB;;;;;;;;;;;;;AAcxB,SAAgB,gBACd,IACA,KACA,QACA,SACuB;CACvB,MAAM,mBAAmB,GAAG,6BAA6B,QAAQ,OAAO;CACxE,IAAI,qBAAqB,GAAG,OAAO;CAEnC,MAAM,OAAO,aACX,KACA,CAAA,GAAY,kBAAA,CAA2B,IACtC,CAAC,UAAU,eAAe;EACzB,MAAM,OAAO,GAAG,iBAAiB,SAAS,UAAU,SAAS;EAC7D,MAAM,QAAQ,KAAK,IAAI,QAAQ,KAAK,QAAQ,GAAG,eAAe;EAC9D,MAAM,SAAmB,CAAC;EAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,WAAW,IAAA,CAAa,CAAC;EAClF,OAAO;GAAE;GAAM;EAAO;CACxB,CACF;CACA,MAAM,MAAM,MAA8B,IAAI,KAAK,OAAO,SAAS,KAAK,OAAO,KAAM;CAErF,QAAQ,KAAK,MAAb;EACE,KAAK,UAAU,KACb,OAAO;GAAE,MAAM;GAAO;GAAkB,GAAG,gBAAgB,IAAI,KAAK,OAAO;EAAE;EAC/E,KAAK,UAAU,KACb,OAAO;GAAE,MAAM;GAAO;EAAiB;EACzC,KAAK,UAAU,MACb,OAAO;GAAE,MAAM;GAAQ;GAAkB,KAAK,GAAG,CAAC;EAAE;EACtD,KAAK,UAAU,MACb,OAAO;GAAE,MAAM;GAAQ;GAAkB,MAAM,GAAG,CAAC;EAAE;EACvD,KAAK,UAAU;GAGb,IAAI,KAAK,OAAO,SAAS,GAAG,OAAO;IAAE,MAAM;IAAO;GAAiB;GACnE,OAAO;IACL,MAAM;IACN;IACA,MAAM,KAAK,OAAO;IAClB,QAAQ,KAAK,OAAO;IACpB,OAAO,KAAK,OAAO;IACnB,KAAK,KAAK,OAAO;GACnB;EAEF,KAAK,UAAU,MACb,OAAO;GAAE,MAAM;GAAQ;EAAiB;EAC1C,KAAK,UAAU,OACb,OAAO;GAAE,MAAM;GAAS;GAAkB,KAAK,GAAG,CAAC;EAAE;EACvD,KAAK,UAAU,OACb,OAAO;GAAE,MAAM;GAAS;GAAkB,MAAM,GAAG,CAAC;EAAE;EACxD,SACE,OAAO;CACX;AACF;;AAGA,SAAS,gBACP,IACA,KACA,SACkE;CAClE,OAAO,aACL,KACA;;;;;;;CAAiE,IAChE,CAAC,SAAS,QAAQ,SAAS,MAAM,KAAK,UAAU;EAC/C,IAAI,CAAC,GAAG,2BAA2B,SAAS,SAAS,QAAQ,SAAS,MAAM,KAAK,IAAI,GAEnF,OAAO;GAAE,MAAM;GAAM,KAAK;GAAM,MAAM;EAAK;EAE7C,OAAO;GACL,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI;GACnD,KAAK,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI;GAChD,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI;EACrD;CACF,CACF;AACF;;;ACxEA,MAAM,6BAA+C;CACnD,WAAW;CACX,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,qBAAqB;AACvB;AAEA,MAAM,sBAAqD;CACzD,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;;;AAQzB,SAAgB,mBAAmB,MAA6B;CAC9D,OAAO,oBAAoB,SAAS;AACtC;;;AAUA,IAAa,0BAAb,MAAqC;CAOnC,YAAY,SAA4C,4BAA4B;EAAvD,KAAA,SAAA;EANrB,gBAAA,MAAA,UAAS,CAAA;EACT,gBAAA,MAAA,SAAQ,CAAA;EACR,gBAAA,MAAA,mBAAkB,CAAA;EAClB,gBAAA,MAAA,iBAAgB,CAAA;EAChB,gBAAA,MAAA,oBAAmB,CAAA;CAE0D;CAErF,SAAS,WAAyB;EAChC,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,mBAAmB;CAC1B;CAEA,UAAU,QAAsB;EAC9B,KAAK,mBAAmB,OAAO;EAC/B,KAAK,mBAAmB;CAC1B;;CAGA,eAAe,OAAqB;EAClC,KAAK,iBAAiB;EACtB,KAAK,mBAAmB;CAC1B;;CAGA,oBAAoB,QAAsB;EACxC,KAAK,oBAAoB;EACzB,KAAK,mBAAmB;CAC1B;CAEA,qBAAmC;EACjC,IACE,KAAK,SAAS,KAAK,OAAO,aAC1B,KAAK,QAAQ,KAAK,OAAO,YACzB,KAAK,kBAAkB,KAAK,OAAO,sBACnC,KAAK,gBAAgB,KAAK,OAAO,oBACjC,KAAK,mBAAmB,KAAK,OAAO,qBAEpC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,6CACA,EACE,SAAS;GACP,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,iBAAiB,KAAK;GACtB,eAAe,KAAK;GACpB,kBAAkB,KAAK;GACvB,QAAQ,KAAK;EACf,EACF,CACF;CAEJ;AACF;;;;;;;;;;;;;;AAeA,SAAgB,gBACd,IACA,KACA,QACA,UACA,QACsB;CACtB,IAAI,aAAaC,yBAAAA,UAAU,OAAO;CAClC,IAAI;EACF,MAAM,YAAY,GAAG,wBAAwB,QAAQ;EACrD,IAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,GAC9C,MAAM,qBAAqB,sBAAsB,EAAE,UAAU,CAAC;EAEhE,OAAO,SAAS,SAAS;EAEzB,MAAM,eAAe,GAAG,2BAA2B,QAAQ,MAAM;EACjE,MAAM,aAAa,CAAC,GAAG,sBAAsB,QAAQ;EACrD,MAAM,SAAS,wBAAwB,GAAG,uBAAuB,QAAQ,GAAG,SAAS;EACrF,MAAM,2BAAW,IAAI,IAAY;EACjC,IAAI,iBAAiB;;;EAIrB,MAAM,qBAAqB,SAAgE;GACzF,MAAM,SAAS,KAAKA,yBAAAA,UAAU,CAAC;GAC/B,IAAI,UAAU,GAAG,OAAO;GACxB,OAAO,oBAAoB,MAAM;GACjC,OAAO,eAAe,KAAK,IAAI;EACjC;EAEA,MAAM,eAAe,SACnB,aAAa,KAAK,CAAA,CAAU,IAAI,CAAC,YAC/B,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,MAAM,IAAI,IAC9C;EAEF,MAAM,0BAA0B,QAAgB,UAC9C,aAAa,KAAK,CAAA,CAAU,IAAI,CAAC,YAAY;GAC3C,IAAI,CAAC,GAAG,qCAAqC,UAAU,QAAQ,OAAO,MAAM,GAC1E,OAAO;GAET,MAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM;GACvC,OAAO,UAAU,IAAI,OAAO;EAC9B,CAAC;EAEH,MAAM,eAAe,QAAgB,UAA+C;GAClF,MAAM,UAAgC,CAAC;GACvC,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;IAC1C,MAAM,OAAO,mBAAmB,KAAK,aACnC,GAAG,6BAA6B,UAAU,QAAQ,OAAO,KAAK,QAAQ,CACxE;IACA,IAAI,SAAS,MAAM;KACjB,QAAQ,KAAK;MAAE,MAAM;MAAQ;KAAK,CAAC;KACnC;IACF;IACA,MAAM,eAAe,uBAAuB,QAAQ,KAAK;IACzD,IAAI,iBAAiB,MAAM,OAAO;IAClC,QAAQ,KAAK;KAAE,MAAM;KAAgB;IAAa,CAAC;GACrD;GACA,OAAO;EACT;EAEA,MAAM,sBACJ,WAEA,aAAa,KAAK,CAAA,GAAA,CAAqB,IAAI,CAAC,cAAc,gBAAgB;GACxE,IAAI,CAAC,GAAG,4BAA4B,UAAU,QAAQ,cAAc,UAAU,GAC5E,OAAO;GAET,OAAO;IACL,WAAW,QAAQ,KAAK,YAAY,MAAM;IAC1C,SAAS,QAAQ,KAAK,UAAU,MAAM;GACxC;EACF,CAAC;EAEH,MAAM,uBAAuB,WAC3B,aAAa,KAAK,CAAA,GAAA,CAAqB,IAAI,CAAC,cAAc,cAAc;GACtE,IAAI,CAAC,GAAG,6BAA6B,UAAU,QAAQ,cAAc,QAAQ,GAC3E,OAAO;GAET,OAAO;IACL,WAAW,QAAQ,KAAK,YAAY,MAAM;IAC1C,OAAO,QAAQ,KAAK,QAAQ,MAAM;GACpC;EACF,CAAC;EAEH,MAAM,YAAY,WAAkC;GAClD,IAAI,SAAS,IAAI,MAAM,GACrB,MAAM,qBAAqB,wCAAwC,EAAE,OAAO,CAAC;GAE/E,SAAS,IAAI,MAAM;GACnB,IAAI;IACF,MAAM,OAAO,mBAAmB,GAAG,uBAAuB,UAAU,MAAM,CAAC;IAC3E,MAAM,UACJ,eAAe,MAAM,KAAK,aACxB,GAAG,0BAA0B,UAAU,QAAQ,KAAK,QAAQ,CAC9D,KAAK;IAEP,MAAM,YAAY,GAAG,wBAAwB,UAAU,MAAM;IAC7D,IAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,GAC9C,MAAM,qBAAqB,8BAA8B;KAAE;KAAQ;IAAU,CAAC;IAEhF,MAAM,OAAwB,CAAC;IAC/B,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,SAAS;KAC9C,MAAM,UAAU,gBACd,GAAG,qBAAqB,UAAU,QAAQ,KAAK,GAC/C,SACF;KACA,KAAK,KAAK,SAAS,OAAO,CAAC;IAC7B;IAEA,MAAM,iBAAgC;KACpC,iBAAiB;KACjB,OAAO;MAAE,MAAM;MAAW;MAAS;KAAK;IAC1C;IAEA,QAAQ,MAAR;KACE,KAAK,cAAc;MACjB,IAAI,CAAC,GAAG,6BAA6B,UAAU,MAAM,GAAG,OAAO,SAAS;MACxE,MAAM,SACJ,gBAAgB,MAAM,KAAK,aACzB,GAAG,6BAA6B,UAAU,QAAQ,KAAK,QAAQ,CACjE,KAAK;MACP,OAAO,UAAU,MAAM;MACvB,OAAO;OAAE;OAAM;OAAS;OAAQ;MAAK;KACvC;KACA,KAAK,aAAa;MAChB,IAAI,CAAC,GAAG,6BAA6B,UAAU,MAAM,GACnD,OAAO;OAAE;OAAM;OAAS;MAAK;MAE/B,MAAM,SACJ,gBAAgB,MAAM,KAAK,aACzB,GAAG,6BAA6B,UAAU,QAAQ,KAAK,QAAQ,CACjE,KAAK;MACP,OAAO,UAAU,MAAM;MACvB,OAAO;OAAE;OAAM;OAAS;OAAQ;MAAK;KACvC;KACA,KAAK,QAAQ;MACX,MAAM,UAAU,GAAG,uBAAuB,QAAQ,UAAU,MAAM;MAClE,MAAM,cACJ,YAAYA,yBAAAA,WAAW,gBAAgB,IAAI,KAAK,QAAQ,OAAO,IAAI;MACrE,OAAO,cAAc;OAAE;OAAM;OAAS;OAAa;MAAK,IAAI,SAAS;KACvE;KACA,KAAK,OAAO;MACV,MAAM,MAAM,mBAAmB,KAAK,aAClC,GAAG,sBAAsB,QAAQ,UAAU,QAAQ,KAAK,QAAQ,CAClE;MACA,IAAI,QAAQ,MAAM,OAAO,SAAS;MAIlC,OAAO;OAAE;OAAM;OAAS;OAAK,OAF3B,aAAa,WAAW,GAAG,2BAA2B,UAAU,QAAQ,MAAM,CAAC,KAC/E;OACkC;MAAK;KAC3C;KACA,KAAK,SAAS;MACZ,MAAM,OAAO,mBAAmB,KAAK,aACnC,GAAG,uBAAuB,UAAU,QAAQ,KAAK,QAAQ,CAC3D;MACA,OAAO,SAAS,OAAO,SAAS,IAAI;OAAE;OAAM;OAAS;OAAM;MAAK;KAClE;KACA,KAAK,QAAQ;MACX,MAAM,QAAQ,GAAG,8BAA8B,UAAU,MAAM;MAC/D,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,OAAO,SAAS;MAC3D,OAAO,eAAe,KAAK;MAC3B,MAAM,UAAU,YAAY,QAAQ,KAAK;MACzC,IAAI,YAAY,MAAM,OAAO,SAAS;MAItC,OAAO;OAAE;OAAM;OAAS;OAAS,MAF/B,aAAa,WAAW,GAAG,2BAA2B,UAAU,QAAQ,MAAM,CAAC,KAC/E;OACqC;MAAK;KAC9C;KACA,KAAK,cAAc;MACjB,MAAM,QAAQ,mBAAmB,MAAM;MACvC,MAAM,QAAQ,GAAG,8BAA8B,UAAU,MAAM;MAC/D,IAAI,UAAU,QAAQ,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,OAAO,SAAS;MAC7E,OAAO,eAAe,KAAK;MAC3B,MAAM,SAAS,MAAM,YAAY,YAAY,QAAQ,KAAK,IAAI;MAC9D,IAAI,MAAM,aAAa,WAAW,MAAM,OAAO,SAAS;MACxD,OAAO;OAAE;OAAM;OAAS;OAAQ,SAAS,MAAM;OAAS;MAAK;KAC/D;KACA,KAAK,eAAe;MAIlB,IAAI,OAAO,GAAG,iCAAiC,YAC7C,OAAO;OAAE;OAAM;OAAS;MAAK;MAE/B,MAAM,QAAQ,oBAAoB,MAAM;MAIxC,IAAI,UAAU,MAAM,OAAO,SAAS;MACpC,MAAM,MAAM,mBAAmB,KAAK,aAClC,GAAG,gCAAgC,UAAU,QAAQ,KAAK,QAAQ,CACpE;MACA,IAAI,QAAQ,MAAM,OAAO,SAAS;MAClC,MAAM,QAAQ,GAAG,8BAA8B,UAAU,MAAM;MAC/D,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,OAAO,SAAS;MAC3D,OAAO,eAAe,KAAK;MAC3B,MAAM,SAAS,MAAM,YAAY,YAAY,QAAQ,KAAK,IAAI;MAC9D,IAAI,MAAM,aAAa,WAAW,MAAM,OAAO,SAAS;MACxD,MAAM,UAAU,mBAAmB,KAAK,aACtC,GAAG,oCAAoC,UAAU,QAAQ,KAAK,QAAQ,CACxE;MACA,OAAO;OACL;OACA;OACA,SAAS;QACP;QACA;QACA,QAAA,GAAA,8BAAA,sBAAA,CAA6B,MAAM,KAAK;QACxC,GAAI,YAAY,OAAO,CAAC,IAAI,EAAE,QAAQ;OACxC;OACA;MACF;KACF;KACA,KAAK;KACL,KAAK;KACL,KAAK,UAAU;MACb,MAAM,WAAW,mBAAmB,KAAK,aACvC,GAAG,2BAA2B,UAAU,QAAQ,KAAK,QAAQ,CAC/D;MACA,OAAO,aAAa,OAAO,SAAS,IAAI;OAAE;OAAM;OAAS;OAAU;MAAK;KAC1E;KACA,SACE,OAAO;MAAE;MAAM;MAAS;KAAK;IACjC;GACF,UAAU;IACR,SAAS,OAAO,MAAM;GACxB;EACF;EAEA,MAAM,OAAO,WAAW,OAAO,OAAO,SAAS,MAAM;EACrD,MAAM,WAAW,kBAAkB,cAAc,UAAU;EAC3D,IAAI,gBAAgB,SAAS,KAAK,iBAAiB;EACnD,OAAO;GAAE;GAAM;GAAY;GAAc;EAAS;CACpD,UAAU;EACR,GAAG,sBAAsB,QAAQ;CACnC;AACF;AAEA,SAAS,wBAAwB,KAAa,WAAkC;CAE9E,OADgB,QAAQ,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,mBACvD,OAAO,gBAAgB,KAAK,SAAS;AACxD;AAEA,SAAS,gBAAgB,KAAa,WAA2B;CAC/D,IAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,OAAO,WAC9C,MAAM,qBAAqB,mDAAmD;EAC5E;EACA;CACF,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,kBAAkB,OAAe,YAAyC;CACjF,MAAM,WAA+B,CAAC;CACtC,KAAK,QAAQ,2BAA2B,GAAG,SAAS,KAAK,eAAe;CACxE,KAAK,QAAQ,4BAA4B,GAAG,SAAS,KAAK,gBAAgB;CAC1E,KAAK,QAAQ,wBAAwB,KAAK,YAAY,SAAS,KAAK,YAAY;CAChF,OAAO;AACT;AAEA,SAAS,qBAAqB,SAAiB,SAA+C;CAC5F,OAAO,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,SAAS,EAAE,QAAQ,CAAC;AAC3E;;;AC/XA,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,UAAU;;;;;;;;AAShB,IAAa,cAAb,MAAyB;CACvB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,QAAuC;EAC1C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,UAAU,KAAK,QAAQ,WAAW;EACxC,MAAM,eAAe,IAAI,wBAAwB;EAGjD,OAAO,aACL,KACA;;;;EAAoC,IACnC,CAAC,SAAS,SAAS,iBAAiB;GACnC,MAAM,QAAsB,QAAQ,KAAK,WAAW;IAClD,eAAe,MAAM;IACrB,MAAM,QAAQ,OAAO;IACrB,MAAM,UAAU,gBAAgB,IAAI,KAAK,QAAQ,OAAO,kBAAkB,YAAY;IACtF,OAAO;KACL;KACA,kBAAkB,OAAO;KACzB,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK;KACvC,MAAM,SAAS,IAAI,KAAK,QAAQ,OAAO,OAAO;KAC9C,UAAU,aAAa,IAAI,QAAQ,KAAK;KACxC,UAAU,aAAa,IAAI,KAAK,QAAQ,OAAO,WAAW;KAC1D,OAAO,UAAU,IAAI,KAAK,QAAQ,OAAO,OAAO;KAChD,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;IAC/B;GACF,CAAC;GACD,OAAO;IAAE,WAAW,MAAM;IAAQ;GAAM;EAC1C,CACF;CACF;AACF;AAEA,SAAS,gBACP,IACA,KACA,QACA,kBACA,QAC4B;CAC5B,MAAM,UAA0B,CAAC;CACjC,MAAM,OAAO,gBACX,IACA,KACA,QACA,GAAG,2BAA2B,QAAQ,kBAAkB,CAAC,GACzD,MACF;CACA,MAAM,QAAQ,gBACZ,IACA,KACA,QACA,GAAG,2BAA2B,QAAQ,kBAAkB,CAAC,GACzD,MACF;CACA,IAAI,MAAM,QAAQ,OAAO;CACzB,IAAI,OAAO,QAAQ,QAAQ;CAC3B,OAAO,QAAQ,QAAQ,UAAU,KAAA;AACnC;;;;;;;AAQA,SAAS,QACP,IACA,KACA,QACA,OACA,SACA,SACgB;CAChB,IAAI,CAAC,GAAG,uBAAuB,QAAQ,OAAO,SAAS,OAAO,GAAG,OAAO;CAGxE,QAAA,GAAA,8BAAA,iBAAA,CAAwB,UAAU,KAAK,OAAO,CAAC;AACjD;AAEA,SAAS,UACP,IACA,KACA,QACA,OACA,SACW;CAGX,MAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,OAAO,WAAW,OAAO,KAAK;EACnE,MAAM;EACN,QAAQ;EACR,OAAO;EACP,KAAK;CACP;CACA,MAAM,OAAO,QAAQ,IAAI,KAAK,QAAQ,OAAO,UAAU,OAAO,KAAK;CACnE,MAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,OAAO,WAAW,OAAO;CAChE,MAAM,OAAO,QAAQ,IAAI,KAAK,QAAQ,OAAO,UAAU,OAAO;CAC9D,MAAM,MAAM,QAAQ,IAAI,KAAK,QAAQ,OAAO,SAAS,OAAO;CAC5D,OAAO;EACL;EACA;EACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;EACzB,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;EACvB,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;CACvB;AACF;AAEA,SAAS,SACP,IACA,KACA,QACA,OACA,SACmC;CACnC,IAAI,CAAC,GAAG,kCAAkC,QAAQ,OAAO,OAAO,GAC9D,OAAO;EAAE,OAAO;EAAG,QAAQ;CAAE;CAE/B,OAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,aAAa,IAAkB,QAAa,OAAmC;CAGtF,QADqB,GAAG,4BAA4B,QAAQ,KACzC,GAAnB;EACE,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,aACP,IACA,KACA,QACA,OACA,aACQ;CACR,IAAI,CAAC,GAAG,4BAA4B,QAAQ,OAAO,WAAW,GAAG,OAAO;CACxE,MAAM,QAAQ,QAAQ,KAAK,aAAa,CAAC;CACzC,OAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACvD;AAEA,SAAS,UACP,IACA,KACA,QACA,OACe;CAIf,OACE,gBACE,MACC,KAAK,aAAa,GAAG,kBAAkB,QAAQ,OAAO,KAAK,QAAQ,GACpE,IACF,KAAK;AAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1KA,IAAa,eAAb,MAA0B;CACxB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;;;;;;;;;;;;;CAoBH,KACE,mBACA,WACA,QACgB;EAChB,eAAe,MAAM;EACrB,KAAK,kBAAkB,cAAc,iBAAiB;EACtD,IAAI,YAAY,KAAK,CAAC,OAAO,UAAU,SAAS,GAC9C,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,4DAA4D,UAAU,EACxE;EAGF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,cADa,GAAG,kBAAkB,MACX,IAAI,kBAAkB;EACnD,IAAI,YAAY,aACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wBAAwB,UAAU,4CAA4C,aAChF;EAOF,MAAM,cAAc,kBAAkB,KAAK,QAAQ;GACjD,eAAe,MAAM;GACrB,OAAO,KAAK,QAAQ,qBAAqB,GAAG,CAAC,CAAC;EAChD,CAAC;EAGD,MAAM,SAAS,IAAI,MAAM,IAAI,YAAY,MAAM;EAC/C,IAAI;EACJ,IAAI;GACF,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KACtC,IAAI,KAAK,QAAQ,OAAO,YAAY,IAAI,IAAI,CAAC;GAE/C,KAAK,GAAG,eAAe,QAAQ,QAAQ,YAAY,QAAQ,SAAS;EACtE,UAAU;GACR,IAAI,KAAK,MAAM;EACjB;EAEA,IAAI,CAAC,IAIH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,kDAAkD,UAAU,iBAAiB,YAAY,KACvF,GACF,EAAE,GACJ;EAMF,KAAK,QAAQ,oBAAoB;EAMjC,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;;;;;;;;;;;;;;CAgBA,OACE,mBACA,UACA,QACkB;EAClB,eAAe,MAAM;EACrB,KAAK,kBAAkB,gBAAgB,iBAAiB;EACxD,IAAI,aAAa,KAAK,aAAa,MAAM,aAAa,OAAO,aAAa,KACxE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDAAwD,SAAS,EACnE;EAGF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,KAAK,MAAM,OAAO,mBAChB,KAAK,QAAQ,qBAAqB,GAAG;EAIvC,MAAM,eAAe,WAAW;EAChC,KAAK,MAAM,OAAO,mBAChB,IAAI,CAAC,GAAG,sCAAsC,QAAQ,KAAK,YAAY,GACrE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,uDAAuD,IAAI,kBAC7D;EAKJ,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;;;;;;;;;;;;;;;;;CAmBA,OAAO,mBAAuC,QAAuC;EACnF,eAAe,MAAM;EACrB,KAAK,kBAAkB,gBAAgB,iBAAiB;EAExD,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,aAAa,GAAG,kBAAkB,MAAM;EAC9C,IAAI,kBAAkB,UAAU,YAC9B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yCAAyC,kBAAkB,OAAO,MAAM,WAAW,qCACrF;EAGF,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,KAAK,MAAM,OAAO,mBAAmB;GACnC,KAAK,QAAQ,qBAAqB,GAAG;GACrC,IAAI,KAAK,OAAO,GAAG,GACjB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kDAAkD,IAAI,mCACxD;EAEJ;EAEA,KAAK,MAAM,OAAO,mBAAmB;GACnC,IAAI,CAAC,GAAG,iCAAiC,QAAQ,GAAG,GAClD,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kDAAkD,IAAI,kBACxD;GAEF,KAAK,QAAQ,cAAc,GAAG;EAChC;EAIA,KAAK,QAAQ,oBAAoB;EAGjC,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;CAGA,kBAA0B,IAAY,mBAA6C;EACjF,IAAI,kBAAkB,WAAW,GAC/B,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,GAAG,GAAG,4BAA4B;EAEtF,MAAM,uBAAO,IAAI,IAAsB;EACvC,KAAK,MAAM,OAAO,mBAAmB;GACnC,IAAI,KAAK,IAAI,GAAG,GACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,GAAG,GAAG,0CAA0C,KAClD;GAEF,KAAK,IAAI,GAAG;EACd;CACF;AACF;;;AChQA,MAAMC,wBAAsB;;;;;;;;AAS5B,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;CAQH,QACE,mBACA,QACsC;EACtC,eAAe,MAAM;EACrB,IAAI,kBAAkB,WAAW,GAC/B,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,0CAA0C;EAE9F,MAAM,uBAAO,IAAI,IAAsB;EACvC,KAAK,MAAM,OAAO,mBAAmB;GACnC,IAAI,KAAK,IAAI,GAAG,GACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDAAwD,KAC1D;GAEF,KAAK,IAAI,GAAG;EACd;EAIA,MAAM,UAAU,kBAAkB,KAC/B,QAAQ,KAAK,QAAQ,qBAAqB,GAAG,CAAC,CAAC,SAClD;EAEA,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,UAAU,GAAG,uBAAuB;EAC1C,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,+BAA+B;EAEhF,MAAM,SAAS,IAAI,MAAM,IAAI,QAAQ,MAAM;EAC3C,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,IAAI,SAAqB;EACzB,IAAI;GACF,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,KAAK,QAAQ,OAAO,QAAQ,IAAI,IAAI,CAAC;GAE3C,IAAI,CAAC,GAAG,wBAAwB,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,GACxE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,0DAA0D,QAAQ,KAAK,GAAG,EAAE,GAC9E;GAGF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,SAAS,GAAG,+BAA+B,SAASF,uBAAqB,OAAO;GAChF,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,IAAI,CAAC,UAAU,QAAQ,GACrB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,gCAAgC;GAGvF,MAAM,QAAQ,IAAI,UAAU,QAAQ,IAAI;GACxC,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;GAAK;EAC/B,UAAU;GACR,IAAI,QAAQ,GAAG,gBAAgB,MAAM;GACrC,IAAI,KAAK,OAAO;GAChB,IAAI,KAAK,MAAM;GACf,GAAG,mBAAmB,OAAO;EAC/B;CACF;AACF;;;;;;;;;;;ACpEA,IAAa,gBAAb,MAA2B;CACzB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OAAO,OAAoB,WAA+B,QAAuC;EAC/F,eAAe,MAAM;EACrB,IAAI,MAAM,eAAe,GACvB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uCAAuC;EAG3F,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,UAAU,KAAK,QAAQ,cAAc;EAC3C,MAAM,cAAc,GAAG,kBAAkB,OAAO;EAChD,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,OAAO,UAAU,EAAE,KAAK,KAAK,KAAK,KAAK,aAC1C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0BAA0B,GAAG,oBAAoB,YAAY,EAC/D;EASF,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;EAC1C,IAAI,SAAqB;EACzB,IAAI,gBAAgB;EACpB,IAAI;GACF,IAAI,WAAW,SAAS,IAAI,WAAW,KAAK,CAAC;GAC7C,SAAS,GAAG,qBAAqB,SAAS,MAAM,YAAY,EAAE;GAC9D,IAAI,CAAC,QACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,6CACF;GAEF,gBAAgB,GAAG,kBAAkB,MAAM;GAC3C,IAAI,iBAAiB,GACnB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sCAAsC;GAG1F,IAAI,CAAC,GAAG,wBAAwB,SAAS,QAAQC,yBAAAA,UAAU,GAAG,EAAE,GAC9D,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,wDAAwD,IAC1D;GAEF,MAAM,cAAc;GACpB,KAAK,QAAQ,uBAAuB;IAClC,GAAG,mBAAmB,WAAW;IACjC,IAAI,KAAK,OAAO;GAClB,CAAC;EACH,SAAS,OAAO;GACd,IAAI,QAAQ,GAAG,mBAAmB,MAAM;GACxC,IAAI,KAAK,OAAO;GAChB,MAAM;EACR;EAIA,KAAK,QAAQ,oBAAoB;EAEjC,MAAM,SAAS,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAAM;EAItE,OAAO;GAAE,2BAH6C,OAAO,MAC1D,MAAM,IAAI,KAAK,aAAa,CAAC,CAC7B,KAAK,SAAS,KAAK,gBACW;GAAG;GAAQ,OAAO;EAAK;CAC1D;;;;;;;;;CAUA,YACE,MACA,WACA,QACkB;EAClB,eAAe,MAAM;EACrB,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK,SAAS;EAC5B,IACE,CAAC,OAAO,SAAS,MAAM,KAAK,KAC5B,CAAC,OAAO,SAAS,MAAM,MAAM,KAC7B,KAAK,SAAS,KACd,KAAK,UAAU,GAEf,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oEAAoE,MAAM,MAAM,GAAG,MAAM,QAC3F;EAEF,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQE,8BAAAA,6BACnD,MAAM,IAAIH,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,2BAA2B,MAAM,oBAAoBE,8BAAAA,4BAA4B,EACnF;EAGF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,UAAU,KAAK,QAAQ,cAAc;EAC3C,MAAM,cAAc,GAAG,kBAAkB,OAAO;EAChD,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,OAAO,UAAU,EAAE,KAAK,KAAK,KAAK,KAAK,aAC1C,MAAM,IAAIH,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,GAAG,oBAAoB,YAAY,EACpE;EAGF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAG9B,MAAM,UAAU,GAAG,aAAa,SAAS,KAAK,GAAG,KAAK,OAAO,KAAK,MAAM;GACxE,IAAI,CAAC,SAAS;IAGZ,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,gBAAgB,SAAS,EAAE;IAC1D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,8BAA8B,IAAI,EAAE,GAAG,MAAM,YAAY,KAAK,GAChE;GACF;GACA,GAAG,yBAAyB,OAAO;GACnC,GAAG,eAAe,OAAO;EAC3B;EAEA,KAAK,QAAQ,oBAAoB;EAEjC,MAAM,SAAS,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAAM;EAItE,OAAO;GAAE,2BAH6C,OAAO,MAC1D,MAAM,IAAI,KAAK,KAAK,CAAC,CACrB,KAAK,SAAS,KAAK,gBACW;GAAG;GAAQ,OAAO;EAAK;CAC1D;AACF;;;;ACvJA,SAAgB,eAAe,SAAiD;CAC9E,OAAO,EAAE,QAAQ,QAAQ,cAAc,EAAE;AAC3C;;;;;;;;ACVA,MAAa,kBAAkB;CAC7B,WAAW;CACX,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,cAAc;CACd,gBAAgB;AAClB;AAEA,MAAM,YAAY,OAAO,KAAK,eAAe;;AAG7C,SAAgB,YAAY,MAA+B;CACzD,IAAI,SAAS,GAAG,OAAO,EAAE,GAAGG,8BAAAA,oBAAoB;CAChD,MAAM,QAAQ,EAAE,GAAGA,8BAAAA,oBAAoB;CACvC,KAAK,MAAM,OAAO,WAChB,MAAM,QAAQ,OAAO,gBAAgB,UAAU;CAEjD,OAAO;AACT;;;;;;AAOA,SAAgB,YAAY,SAAiB,SAA2C;CACtF,IAAI,OAAO;CACX,KAAK,MAAM,OAAO,WAAW;EAC3B,MAAM,QAAQ,QAAQ;EACtB,IAAI,UAAU,KAAA,GAAW;EACzB,IAAI,OACF,QAAQ,gBAAgB;OAExB,QAAQ,CAAC,gBAAgB;CAE7B;CACA,OAAO;AACT;;;;;;;;;;;;;;ACrCA,MAAM,UAAU;AAChB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;AACxB,MAAM,UAAU;AAChB,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,WAAW;AAEjB,SAAgB,iBAAiB,QAA4B;CAC3D,QAAQ,QAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,kBACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,mBAAmB,MAA0B;CAC3D,QAAQ,MAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,mBACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK;EACL,SACE,OAAO;CACX;AACF;;;;;;;ACrCA,SAAgB,gBACd,IACA,KACA,UACA,KACe;CACf,IAAI,CAAC,GAAG,iBAAiB,UAAU,GAAG,GAAG,OAAO;CAChD,OAAO,gBACL,MACC,KAAK,aAAa,GAAG,yBAAyB,UAAU,KAAK,KAAK,QAAQ,GAC3E,EACF;AACF;;;;;AAMA,SAAgB,cAAc,IAAkB,KAAuB,UAAwB;CAC7F,OAAO,YAAY,KAAA,KAAmB,QAAQ;EAC5C,IAAI,CAAC,GAAG,kBAAkB,UAAU,GAAG,GACrC,OAAO;GAAE,MAAM;GAAG,QAAQ;GAAG,OAAO;GAAG,KAAK;EAAE;EAEhD,OAAO,UAAU,KAAK,GAAG;CAC3B,CAAC;AACH;AAEA,SAAgB,eAAe,IAAkB,UAAgC;CAC/E,OAAO,YAAY,GAAG,mBAAmB,QAAQ,CAAC;AACpD;;;;;;;;;;;AAYA,SAAgB,eACd,IACA,KACA,UACA,OAAe,GACD;CACd,OAAO,aAAa,KAAK;;;;CAAgC,IAAI,CAAC,GAAG,GAAG,OAAO;EACzE,IAAI,CAAC,GAAG,mBAAmB,UAAU,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO;EAC5D,OAAO;GACL,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;EACvB;CACF,CAAC;AACH;;;;;;;;AASA,SAAgB,iBACd,IACA,KACA,UACe;CACf,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAC1C,IAAI,CAAC,GAAG,qBAAqB,UAAU,GAAG,GAAG,OAAO;EACpD,QAAQ,QAAQ,KAAK,GAAG,IAAI,OAAQ;CACtC,CAAC;AACH;;;;;;;;;AAUA,SAAgB,gBACd,IACA,KACA,UACsC;CACtC,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAE1C,OAAO;GAAE,WADS,GAAG,yBAAyB,UAAU,GACvC;GAAG,OAAO,QAAQ,KAAK,GAAG;EAAE;CAC/C,CAAC;AACH;;;;;;AAOA,SAAgB,sBACd,IACA,KACA,UACU;CACV,MAAM,QAAQ,GAAG,oCAAoC,QAAQ;CAC7D,IAAI,SAAS,GAAG,OAAO,CAAC;CACxB,OAAO,YAAY,KAAK,QAAA,IAAoB,QAAQ;EAClD,IAAI,CAAC,GAAG,+BAA+B,UAAU,KAAK,KAAK,GAAG,OAAO,CAAC;EACtE,MAAM,MAAgB,CAAC;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK,IAAA,CAAa,CAAC;EACzE,OAAO;CACT,CAAC;AACH;;;;;;;;AASA,SAAgB,iBACd,IACA,KACA,UACe;CACf,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAC1C,IAAI,CAAC,GAAG,0BAA0B,UAAU,GAAG,GAAG,OAAO;EACzD,MAAM,YAAY,QAAQ,KAAK,GAAG;EAClC,OAAO,YAAY,IAAI,YAAY;CACrC,CAAC;AACH;;;;;;;AAQA,SAAgB,yBACd,IACA,KACA,UAC2B;CAC3B,OAAO,aACL,KACA;;;;;CAA2C,IAC1C,CAAC,MAAM,QAAQ,OAAO,SAAS;EAC9B,IAAI,CAAC,GAAG,kCAAkC,UAAU,MAAM,QAAQ,OAAO,GAAG,GAAG,OAAO;EACtF,OAAO;GACL,MAAM,QAAQ,KAAK,IAAI;GACvB,QAAQ,QAAQ,KAAK,MAAM;GAC3B,OAAO,QAAQ,KAAK,KAAK;GACzB,KAAK,QAAQ,KAAK,GAAG;EACvB;CACF,CACF;AACF;;;;;;;AAQA,SAAgB,aAAa,IAAkB,KAAuB,UAA2B;CAC/F,MAAM,QAAQ,GAAG,sBAAsB,UAAUC,yBAAAA,UAAU,CAAC;CAC5D,IAAI,SAAS,GAAG,OAAO,CAAC;CACxB,OAAO,YAAY,KAAK,QAAA,IAAuB,QAAQ;EACrD,MAAM,MAAM,GAAG,sBAAsB,UAAU,KAAK,KAAK;EACzD,IAAI,OAAO,GAAG,OAAO,CAAC;EACtB,MAAM,MAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;GAC5B,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK;IAAE,GAAG,QAAQ,KAAK,KAAK,GAAG;IAAG,GAAG,QAAQ,KAAK,KAAK,MAAM,CAAC;GAAE,CAAC;EACvE;EACA,OAAO;CACT,CAAC;AACH;;;;;;;;AASA,SAAgB,YAAY,IAAkB,KAAuB,UAAwB;CAC3F,MAAM,YAAY,GAAG,0BAA0B,QAAQ;CACvD,IAAI,aAAa,GAAG,OAAO,CAAC;CAC5B,MAAM,MAAe,CAAC;CACtB,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;EAClC,MAAM,QAAQ,GAAG,yBAAyB,UAAU,GAAGA,yBAAAA,UAAU,CAAC;EAClE,IAAI,SAAS,GAAG;EAChB,MAAM,SAAS,YAAY,KAAK,QAAA,IAAuB,QAAQ;GAC7D,MAAM,MAAM,GAAG,yBAAyB,UAAU,GAAG,KAAK,KAAK;GAC/D,IAAI,OAAO,GAAG,OAAO,CAAC;GACtB,MAAM,MAAkB,CAAC;GACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;IAC5B,MAAM,MAAM,IAAA;IACZ,IAAI,KAAK;KAAE,GAAG,QAAQ,KAAK,KAAK,GAAG;KAAG,GAAG,QAAQ,KAAK,KAAK,MAAM,CAAC;IAAE,CAAC;GACvE;GACA,OAAO;EACT,CAAC;EACD,IAAI,OAAO,SAAS,GAAG,IAAI,KAAK,MAAM;CACxC;CACA,OAAO;AACT;;;;;;AAOA,SAAgBC,WACd,IACA,KACA,UACmB;CACnB,OAAO,aAAa,KAAK,CAAA,GAAA,CAA2B,IAAI,CAAC,OAAO,SAAS;EACvE,IAAI,CAAC,GAAG,kBAAkB,UAAU,OAAO,GAAG,GAAG,OAAO;EACxD,OAAO;GACL,OAAO;IAAE,GAAG,QAAQ,KAAK,OAAO,CAAC;IAAG,GAAG,QAAQ,KAAK,OAAO,CAAC;GAAE;GAC9D,KAAK;IAAE,GAAG,QAAQ,KAAK,KAAK,CAAC;IAAG,GAAG,QAAQ,KAAK,KAAK,CAAC;GAAE;EAC1D;CACF,CAAC;AACH;;;;;;;AAQA,SAAgB,gBACd,IACA,KACA,UACa;CACb,OAAO,aAAa,KAAK,CAAA,GAAA,CAAqB,IAAI,CAAC,OAAO,SAAS;EACjE,IAAI,CAAC,GAAG,yBAAyB,UAAU,OAAO,GAAG,GACnD,OAAO;GAAE,OAAO;GAAQ,KAAK;EAAO;EAEtC,OAAO;GACL,OAAO,mBAAmB,QAAQ,KAAK,KAAK,CAAC;GAC7C,KAAK,mBAAmB,QAAQ,KAAK,GAAG,CAAC;EAC3C;CACF,CAAC;AACH;;;;;;;AAQA,SAAgB,sBACd,IACA,KACA,UAC6D;CAC7D,OAAO,aACL,KACA;;;;;;CAAsD,IACrD,CAAC,MAAM,MAAM,GAAG,GAAG,OAAO;EACzB,IAAI,CAAC,GAAG,+BAA+B,UAAU,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO;EAC9E,OAAO;GACL,UAAU,QAAQ,KAAK,IAAI;GAC3B,UAAU,QAAQ,KAAK,IAAI;GAC3B,OAAO;IACL,GAAG,QAAQ,KAAK,CAAC,IAAI;IACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;IACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;GACvB;EACF;CACF,CACF;AACF;;;;;;AAOA,SAAgB,kBAAkB,IAAkB,UAAuB;CACzE,OAAO,GAAG,2BAA2B,QAAQ;AAC/C;;;;;;AAOA,SAAgB,gBACd,IACA,KACA,UACe;CACf,IAAI,CAAC,GAAG,iBAAiB,UAAU,aAAa,GAAG,OAAO;CAC1D,OAAO,gBACL,MACC,KAAK,aAAa,GAAG,yBAAyB,UAAU,KAAK,QAAQ,GACtE,EACF;AACF;;;;;AAMA,SAAgB,sBAAsB,IAAkB,UAAwB;CAC9E,OAAO,GAAG,+BAA+B,QAAQ;AACnD;;;;;;;AAQA,SAAgB,WAAW,IAAkB,KAAuB,UAA8B;CAChG,MAAM,YAAY,GAAG,oBAAoB,UAAUD,yBAAAA,UAAU,CAAC;CAC9D,IAAI,aAAa,GAAG,OAAO;CAC3B,MAAM,SAAS,YAAY,KAAK;CAChC,OAAO,YAAY,KAAK,QAAQ,QAAQ;EACtC,GAAG,oBAAoB,UAAU,KAAK,KAAK;EAC3C,OAAO,IAAI,cAAc,GAAG;CAC9B,CAAC;AACH;;;;;;;AAQA,SAAgB,gBACd,IACA,KACA,UACY;CACZ,MAAM,QAAQ,GAAG,8BAA8B,QAAQ;CACvD,IAAI,SAAS,GAAG,OAAO,CAAC;CACxB,OAAO,YAAY,KAAK,QAAA,IAAuB,QAAQ;EACrD,MAAM,MAAM,GAAG,yBAAyB,UAAU,KAAK,KAAK;EAC5D,IAAI,OAAO,GAAG,OAAO,CAAC;EACtB,MAAM,MAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;GAC5B,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK;IAAE,GAAG,QAAQ,KAAK,KAAK,GAAG;IAAG,GAAG,QAAQ,KAAK,KAAK,MAAM,CAAC;GAAE,CAAC;EACvE;EACA,OAAO;CACT,CAAC;AACH;;;;;AAMA,SAAgB,eAAe,IAAkB,KAAuB,UAA0B;CAChG,MAAM,QAAQ,GAAG,gCAAgC,QAAQ;CACzD,IAAI,SAAS,GAAG,OAAO,CAAC;CAExB,OAAO,YAAY,KAAA,KAAyB,QAAQ;EAClD,MAAM,MAAiB,CAAC;EACxB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,IAAI,CAAC,GAAG,8BAA8B,UAAU,GAAG,GAAG,GAAG;GACzD,MAAM,KAAK,QAAgB,QAAQ,KAAK,KAAK,GAAG;GAIhD,IAAI,KAAK;IACP,IAAI;KAAE,GAAG,EAAE,CAAC;KAAG,GAAG,EAAE,CAAC;IAAE;IACvB,IAAI;KAAE,GAAG,EAAE,CAAC;KAAG,GAAG,EAAE,EAAE;IAAE;IACxB,IAAI;KAAE,GAAG,EAAE,EAAE;KAAG,GAAG,EAAE,EAAE;IAAE;IACzB,IAAI;KAAE,GAAG,EAAE,EAAE;KAAG,GAAG,EAAE,EAAE;IAAE;GAC3B,CAAC;EACH;EACA,OAAO;CACT,CAAC;AACH;;;;;;;;;;;;;;;;;;AC3YA,MAAME,iBAAe;AACrB,MAAMC,uBAAqB;;;AAI3B,SAAgB,uBACd,IACA,KACA,UACoB;CACpB,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GAAG,OAAO,KAAA;CACrD,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAC1C,IAAI,CAAC,GAAG,iCAAiC,UAAUD,gBAAc,GAAG,GAAG,OAAO,KAAA;EAC9E,MAAM,IAAI,QAAQ,KAAK,GAAG;EAC1B,OAAO,IAAI,IAAI,KAAA;CACjB,CAAC;AACH;;AAGA,SAAgB,4BACd,IACA,KACA,UACqB;CACrB,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GAAG,OAAO,KAAA;CACrD,OAAO,YAAY,KAAA,KAAmB,QAAQ;EAC5C,IAAI,CAAC,GAAG,+BAA+B,UAAUC,sBAAoB,GAAG,GAAG,OAAO,KAAA;EAElF,MAAM,IAAI,UAAU,KAAK,GAAG;EAC5B,OAAO;GAAE,MAAM,EAAE;GAAM,QAAQ,EAAE;GAAQ,OAAO,EAAE;GAAO,KAAK,EAAE;EAAI;CACtE,CAAC;AACH;;;;AClDA,MAAM,aAAa;AACnB,MAAM,yBAAyB;AAE/B,SAAgB,kBAAkB,QAA6B;CAC7D,QAAQ,QAAR;EACE,KAAK,WACH,OAAO;CACX;AACF;AAEA,SAAgB,oBAAoB,MAAyC;CAC3E,OAAO,SAAS,aAAa,YAAY;AAC3C;AAEA,SAAgB,sBAAsB,QAAiC;CACrE,QAAQ,QAAR;EACE,KAAK,uBACH,OAAO;CACX;AACF;AAEA,SAAgB,wBAAwB,MAA6C;CACnF,OAAO,SAAS,yBAAyB,wBAAwB;AACnE;;;;ACVA,MAAMC,wBAA6B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;AAExD,SAAgB,UACd,IACA,KACA,UACA,MACoB;CACpB,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAGA,sBAAoB;CAC5E,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,KAAK,yBAAyB,IAAI,KAAK,QAAQ;CACrD,MAAM,SAAS,oBAAoB,WAAW,IAAI,KAAK,QAAQ,CAAC;CAChE,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CAEnE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA,iBAAiB;EACjB,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C;AACF;;;;;;;;;;;ACjBA,SAAgB,kBACd,IACA,KACA,QACA,OACe;CACf,OAAO,gBAAgB,MAAM,KAAK,QAAQ,GAAG,yBAAyB,QAAQ,OAAO,KAAK,GAAG,CAAC;AAChG;;AAGA,SAAgB,uBACd,IACA,KACA,QACA,KACQ;CACR,MAAM,SAAS,IAAI,eAAe,IAAI,GAAG;CACzC,IAAI;EACF,OAAO,GAAG,gCAAgC,QAAQ,MAAM;CAC1D,UAAU;EACR,IAAI,KAAK,MAAM;CACjB;AACF;;;;;;;;;;AAWA,SAAgB,2BACd,IACA,KACA,eACA,QACA,MACA,UACM;CACN,MAAM,aAAa,SAAS,MAAM;CAClC,IAAI,eAAe,GAEb;MAAA,CAAC,GAAG,uBAAuB,eAAe,QAAQC,yBAAAA,UAAU,CAAC,GAC/D,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;CAAA,OAEnF;EACL,MAAM,UAAU,IAAI,MAAM,UAAU;EACpC,IAAI;GACF,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS,KAAK,CAAC;GACtD,IAAI,CAAC,GAAG,uBAAuB,eAAe,QAAQ,SAAS,UAAU,GACvE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;EAE1F,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;CACF;CAEA,IAAI,CAAC,GAAG,0BAA0B,eAAe,KAAK,YAAY,0BAA0B,GAC1F,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,0CAA0C;CAE3F,IAAI,KAAK,gBAAgB,KAAA,GAInB;MAAA,CAHO,iBAAiB,KAAK,KAAK,cAAc,QAClD,GAAG,8BAA8B,eAAe,GAAG,CAE/C,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,8CACF;CAAA;AAGN;;AAGA,SAAgB,uBACd,IACA,KACA,eACoB;CACpB,MAAM,OACJ,gBAAgB,MAAM,KAAK,QAAQ,GAAG,uBAAuB,eAAe,KAAK,GAAG,CAAC,KAAK;CAC5F,MAAM,WAAW,gBAAgB,MAAM,KAAK,QAC1C,GAAG,0BAA0B,eAAe,KAAK,GAAG,CACtD;CACA,MAAM,cAAc,gBAAgB,MAAM,KAAK,QAC7C,GAAG,8BAA8B,eAAe,KAAK,GAAG,CAC1D;CACA,MAAM,eAAe,qBAAqB,IAAI,KAAK,eAAe,cAAc;CAChF,MAAM,WAAW,kBAAkB,qBAAqB,IAAI,KAAK,eAAe,UAAU,CAAC;CAC3F,MAAM,OAAO,mBAAmB,IAAI,KAAK,aAAa;CAEtD,OAAO;EACL;EACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;EACrC,GAAI,SAAS,OAAO,EAAE,KAAK,IAAI,CAAC;EAChC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;CACzC;AACF;;;;;;AAOA,SAAgB,0BACd,SACA,eACA,iBACsC;CACtC,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,aAAa,IAAI,MAAM,CAAC;CAC9B,MAAM,UAAU,IAAI,MAAM,CAAC;CAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;CAC7B,IAAI,UAAsB;CAC1B,IAAI;EAGF,IAAI,KAAK,YAAY,OAAO,CAAC;EAC7B,IAAI,KAAK,SAAS,OAAO,CAAC;EAC1B,IAAI,KAAK,WAAW,OAAO,EAAE;EAQ7B,IAAI,CAPO,GAAG,wCACZ,eACA,OAAO,mBAAmB,CAAC,GAC3B,YACA,SACA,SAEI,GACJ,MAAM,mBAAmB,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,CAAC;EAE7D,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM;EAClD,UAAU,IAAI,KAAK,YAAY,KAAK;EACpC,IAAI,SAAS,KAAK,CAAC,SACjB,OAAO;GAAE,uBAAO,IAAI,YAAY,CAAC;GAAG,MAAM;EAAE;EAE9C,MAAM,OAAO,IAAI,UAAU,SAAS,IAAI;EACxC,MAAM,SAAS,IAAI,YAAY,KAAK,UAAU;EAC9C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,IAAI;EAC/B,OAAO;GAAE,OAAO;GAAQ;EAAK;CAC/B,UAAU;EACR,IAAI,SAAS,GAAG,gBAAgB,OAAO;EACvC,IAAI,KAAK,SAAS;EAClB,IAAI,KAAK,OAAO;EAChB,IAAI,KAAK,UAAU;CACrB;AACF;;;;;;;;AASA,SAAgB,wBACd,SACA,eACA,MACA,iBACkB;CAClB,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,UAAU,IAAI,MAAM,CAAC;CAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;CAC7B,MAAM,SAAS,QAAQ,UAAU,WAAW,IAAI;CAChD,IAAI;EACF,IAAI,KAAK,SAAS,OAAO,CAAC;EAC1B,IAAI,KAAK,WAAW,OAAO,EAAE;EAQ7B,IAAI,CAPO,GAAG,2BACZ,eACA,OAAO,KACP,OAAO,mBAAmB,CAAC,GAC3B,SACA,SAEI,GACJ,MAAM,mBAAmB,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,CAAC;EAE7D,OAAO,EAAE,MAAM,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE;CACxD,UAAU;EACR,OAAO,MAAM;EACb,IAAI,KAAK,SAAS;EAClB,IAAI,KAAK,OAAO;CAClB;AACF;;AAGA,SAAS,mBAAmB,QAA6B;CACvD,QAAQ,QAAR;EACE,KAAK,GACH,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,YAChB,sDACF;EACF,KAAK,GACH,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,uCAAuC;EAC9F,KAAK,GACH,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,YAChB,yDACF;EACF,KAAK,GACH,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;EAC3F,SACE,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,SAChB,wCAAwC,OAAO,EACjD;CACJ;AACF;AAEA,SAAS,qBACP,IACA,KACA,eACA,KACe;CACf,IAAI,CAAC,GAAG,sBAAsB,eAAe,GAAG,GAAG,OAAO;CAC1D,OAAO,gBACL,MACC,KAAK,QAAQ,GAAG,8BAA8B,eAAe,KAAK,KAAK,GAAG,GAC3E,IACF;AACF;AAEA,SAAS,mBACP,IACA,KACA,eACe;CACf,MAAM,MAAM,IAAI,MAAM,CAAC;CACvB,IAAI;EACF,IAAI,CAAC,GAAG,+BAA+B,eAAe,QAAQ,GAAG,GAAG,OAAO;EAC3E,MAAM,OAAO,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;EACxC,OAAO,QAAQ,IAAI,OAAO;CAC5B,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;AAGA,SAAS,kBAAkB,KAAmC;CAC5D,IAAI,CAAC,KAAK,OAAO;CACjB,MAAM,QAAQ,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI;CAC5E,OAAO,iBAAiB,KAAK,KAAK,IAAI,MAAM,YAAY,IAAI;AAC9D;;;;;;;;;;ACvQA,MAAa,oBAAwD,OAAO,OAAO;CACjF,SAAS;CACT,KAAK;CACL,MAAM;CACN,MAAM;CACN,iBAAiB;CACjB,WAAW;CACX,QAAQ;AACV,CAAC;AAED,MAAa,oBAAwD,OAAO,OAC1E,OAAO,YACL,OAAO,QAAQ,iBAAiB,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAAgB,CAAC,CAClF,CACF;AAEA,MAAa,oBAAkE,OAAO,OAAO;CAC3F,OAAO;CACP,YAAY;CACZ,WAAW;CACX,KAAK;AACP,CAAC;AAED,MAAa,oBAAkE,OAAO,OACpF,OAAO,YACL,OAAO,QAAQ,iBAAiB,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAA0B,CAAC,CAC5F,CACF;;;;ACvBA,MAAMC,kCAAuC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;;AAGpE,MAAM,+BAAmD;;;;;;;;AASzD,SAAgB,mBACd,IACA,KACA,UACA,MAC6B;CAC7B,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAGA,gCAA8B;CACtF,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,OAAO,kBAAkB,GAAG,kBAAkB,QAAQ,MAAM;CAElE,MAAM,gBAAgB,GAAG,4BAA4B,QAAQ;CAC7D,MAAM,OAA2B,gBAC7B,uBAAuB,IAAI,KAAK,aAAa,IAC7C,EAAE,MAAM,GAAG;CAEf,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA;CACF;AACF;;;;;;;;;;;;;ACxCA,MAAa,sBAAsB;CACjC,OAAO;CACP,eAAe;CACf,cAAc;CACd,WAAW;AACb;;;;;;;;;;;;;;ACFA,MAAM,eAAe;AACrB,MAAM,uBAAuB;AAE7B,SAAgB,qBAAqB,QAAgC;CACnE,OAAO,WAAW,sBAAsB,uBAAuB;AACjE;AAEA,SAAgB,uBAAuB,MAAqC;CAC1E,OAAO,SAAS,uBAAuB,sBAAsB;AAC/D;;;;;;;;;;;;;;ACTA,MAAM,eAA6C;CACjD,SAAS;CACT,gBAAgB;CAChB,wBAAwB;CACxB,mBAAmB;CACnB,WAAW;CACX,kBAAkB;CAClB,0BAA0B;CAC1B,qBAAqB;CACrB,eAAe;CACf,cAAc;CACd,qBAAqB;CACrB,gBAAgB;CAChB,QAAQ;CACR,iBAAiB;AACnB;AAEA,MAAM,eAA6C,OAAO,YACxD,OAAO,QAAQ,YAAY,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAAoB,CAAC,CACjF;;AAGA,MAAa,wBAAsC;AAEnD,SAAgB,mBAAmB,MAA4B;CAC7D,OAAO,aAAa,SAAS,aAAA;AAC/B;;;;;;;AAQA,SAAgB,eAAe,MAA0C;CACvE,OAAO,OAAO,UAAU,eAAe,KAAK,cAAc,IAAI;AAChE;AAEA,SAAgB,qBAAqB,MAA4B;CAC/D,OAAO,aAAa,SAAA;AACtB;;;;;;;;;;AC5CA,MAAM,SAAS;AACf,MAAM,WAAW;AACjB,MAAM,UAAU;AAEhB,SAAgB,oBAAoB,OAA8B;CAChE,QAAQ,OAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,sBAAsB,MAA6B;CACjE,QAAQ,MAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK;EACL,SACE,OAAO;CACX;AACF;;;;;;;;;;;;;;ACtBA,MAAM,WAAW;AACjB,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,WAAW;AAEjB,SAAgB,kBAAkB,OAAsC;CACtE,QAAQ,OAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,oBAAoB,MAAqC;CACvE,QAAQ,MAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK;EACL,SACE,OAAO;CACX;AACF;;;;;;;ACvBA,MAAMC,kBAAuB;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;;;;;;AAelD,SAAgB,iBACd,IACA,KACA,UACc;CACd,MAAM,EAAE,WAAW,UAAU,gBAAgB,IAAI,KAAK,QAAQ;CAC9D,MAAM,YAAY,sBAAsB,IAAI,KAAK,QAAQ;CACzD,OAAO;EACL,aAAa;EACb,aAAa,oBAAoB,SAAS;EAC1C,GAAI,UAAU,SAAS,IAAI,EAAE,UAAU,IAAI,CAAC;CAC9C;AACF;;;;;;;AAQA,SAAgB,wBACd,IACA,KACA,UACqB;CACrB,MAAM,QAAQ,eAAe,IAAI,KAAK,UAAU,oBAAoB,KAAK,KAAK,EAC5E,GAAGA,gBACL;CACA,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAG7C,OAAO;EACL;EACA,SAJc,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;EAK1D,GAAG,iBAAiB,IAAI,KAAK,QAAQ;CACvC;AACF;;;;;;AAOA,SAAgB,sBACd,IACA,KACA,UACmB;CACnB,MAAM,gBAAgB,eAAe,IAAI,KAAK,UAAU,oBAAoB,aAAa;CACzF,OAAO;EACL,GAAG,wBAAwB,IAAI,KAAK,QAAQ;EAC5C,eAAe,iBAAiB;CAClC;AACF;;;;AC5DA,MAAMC,2BAAgC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;AAGzD,MAAMC,sBAAoB;AAE1B,SAAS,YAAY,GAAU,GAAmB;CAChD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AACjD;AAEA,SAAgB,aACd,IACA,KACA,UACA,MACuB;CACvB,MAAM,KAAK,sBAAsB,IAAI,KAAK,QAAQ;CAClD,MAAM,QAAQ,IAAI,SAAS,EAAE,GAAGD,yBAAuB;CACvD,MAAM,aAAa,KAAK,qBAAqB,GAAG,QAAQ,IAAI;CAC5D,MAAM,WAAW,MAAM,GAAG,WAAW,IAAI,GAAG,WAAWC;CAIvD,MAAM,YAAY,eAAe,IAAI,KAAK,UAAU,oBAAoB,SAAS;CACjF,MAAM,YAAY,aAAa,CAAC,YAAY,WAAW,KAAK,IAAI,YAAY,KAAA;CAG5E,MAAM,aAAa,eAAe,IAAI,KAAK,UAAU,oBAAoB,KAAK;CAE9E,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAE5D,MAAM,YAAY,sBAAsB,kBAAkB,IAAI,QAAQ,CAAC;CACvE,MAAM,SAAS,uBAAuB,WAAW,IAAI,KAAK,QAAQ,CAAC;CAEnE,MAAM,SAAS,gBAAgB,IAAI,KAAK,QAAQ;CAChD,MAAM,cACJ,OAAO,WAAW,IACd,CAAC,OAAO,IAAK,OAAO,EAAG,IACvB,OAAO,WAAW,IAChB;EAAC,OAAO;EAAK,OAAO;EAAK,OAAO;CAAG,IACnC,KAAA;CACR,MAAM,YAAY,gBAAgB,IAAI,KAAK,QAAQ,CAAC,CAAC;CAErD,MAAM,KAAK,yBAAyB,IAAI,KAAK,QAAQ;CACrD,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CAEnE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA;EACA;EACA,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;EAC/C,eAAe,cAAc;EAC7B;EACA,GAAG,iBAAiB,IAAI,KAAK,QAAQ;EACrC,iBAAiB;EACjB,GAAI,gBAAgB,KAAA,IAAY,EAAE,YAAY,IAAI,CAAC;EACnD,GAAI,gBAAgB,KAAA,KAAa,cAAc,SAAS,EAAE,YAAY,UAAU,IAAI,CAAC;EACrF,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C;AACF;;;AC5FA,SAAgB,gBAAgB,QAA2B;CACzD,QAAQ,QAAR;EACE,KAAK,iBACH,OAAO;CACX;AACF;AAEA,SAAgB,kBAAkB,MAAuC;CACvE,QAAQ,MAAR;EACE,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;ACRA,SAAgB,QACd,IACA,KACA,UACA,MACkB;CAClB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,SAAS,kBAAkB,WAAW,IAAI,KAAK,QAAQ,CAAC;CAC9D,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,wBAAwB,IAAI,KAAK,QAAQ;EAC5C;EACA,SAAS,YAAY,IAAI,KAAK,QAAQ;EACtC,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;CACzC;AACF;;;;AChBA,MAAM,YAAY;CAAE,OAAO;EAAE,GAAG;EAAG,GAAG;CAAE;CAAG,KAAK;EAAE,GAAG;EAAG,GAAG;CAAE;AAAE;AAE/D,SAAgB,SACd,IACA,KACA,UACA,MACmB;CACnB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,sBAAsB,IAAI,KAAK,QAAQ;EAC1C,YAAYC,WAAe,IAAI,KAAK,QAAQ,KAAK;EACjD,aAAa,gBAAgB,IAAI,KAAK,QAAQ;EAC9C,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;CACzC;AACF;;;;;;;;;;;;;;;;;;;ACEA,SAAgB,SACd,IACA,KACA,UACA,MACA,iBACA,KACmB;CACnB,OAAO;EAAE,GAAG;EAAM,SAAS;EAAQ,QAAQ,eAAe,IAAI,KAAK,UAAU,MAAM,GAAG;CAAE;AAC1F;;;;;;AAOA,SAAgB,yBAAyB,MAA2C;CAGlF,IAAI,KAAK,YAAY,OAAO,EAAE,MAAM,cAAc;CAClD,MAAM,OAAO,KAAK;CAClB,IAAI,CAAC,MAAM,OAAO,EAAE,MAAM,cAAc;CACxC,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO;GAAE,MAAM;GAAQ,aAAa,KAAK;EAAY;EACvD,KAAK,OACH,OAAO;GAAE,MAAM;GAAO,KAAK,KAAK;EAAI;EAEtC,KAAK,eACH,OAAO;GAAE,MAAM;GAAe,MAAM,KAAK;EAAS;EACpD,KAAK,UACH,OAAO;GAAE,MAAM;GAAU,MAAM,KAAK;EAAS;EAC/C,KAAK,cAGH,OAAO,EAAE,MAAM,aAAa;EAC9B,KAAK,SACH,OAAO;GAAE,MAAM;GAAS,MAAM,KAAK;EAAK;EAC1C,SACE,OAAO,EAAE,MAAM,cAAc;CACjC;AACF;AAEA,SAAS,eACP,IACA,KACA,UACA,MACA,KACsB;CACtB,MAAM,WAAW,KAAK,SAAS;CAC/B,IAAI,UAAU,OAAO,yBAAyB,QAAQ;CAGtD,MAAM,UAAU,GAAG,kBAAkB,QAAQ;CAC7C,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,UAAU,GAAG,iBAAiB,IAAI,QAAQ,OAAO;CACvD,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,cAAc,gBAAgB,IAAI,KAAK,IAAI,QAAQ,OAAO;CAChE,OAAO,cAAc;EAAE,MAAM;EAAQ;CAAY,IAAI,EAAE,MAAM,cAAc;AAC7E;;;;;ACrEA,MAAMC,yBAA8B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;AAGzD,MAAMC,wBAA6B;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;AAKtD,MAAMC,sBAAoB;AAE1B,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,MAAM,QAAQ,eAAe,IAAI,KAAK,UAAU,oBAAoB,KAAK,KAAK,EAC5E,GAAGF,uBACL;CACA,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,gBACJ,eAAe,IAAI,KAAK,UAAU,oBAAoB,aAAa,KAAK;CAE1E,MAAM,KAAK,sBAAsB,IAAI,KAAK,QAAQ;CAClD,MAAM,aAAa,KAAK,qBAAqB,GAAG,QAAQ,IAAI;CAC5D,MAAM,WAAW,KAAK,GAAG,WAAWE;CACpC,MAAM,YAAY,IAAI,SAAS,EAAE,GAAGD,sBAAoB;CAExD,OAAO;EACL,GAAG;EACH,SAAS;EACT,YAAY,eAAe,IAAI,KAAK,QAAQ;EAC5C;EACA;EACA;EACA,aAAa,gBAAgB,IAAI,KAAK,QAAQ;EAC9C,QAAQ,sBAAsB,IAAI,QAAQ;EAC1C;EACA;EACA;EACA,WAAW,sBAAsB,kBAAkB,IAAI,QAAQ,CAAC;CAClE;AACF;;;;;;;;;;ACvCA,SAAgB,gBACd,IACA,KACA,UACuB;CACvB,MAAM,kBAAkB,iBAAiB,IAAI,KAAK,QAAQ;CAC1D,MAAM,kBAAkB,yBAAyB,IAAI,KAAK,QAAQ;CAClE,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CAEnE,OAAO;EACL,GAAG,sBAAsB,IAAI,KAAK,QAAQ;EAC1C;EACA;EACA,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C;AACF;AAEA,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,OAAO;EAAE,GAAG;EAAM,SAAS;EAAU,GAAG,gBAAgB,IAAI,KAAK,QAAQ;CAAE;AAC7E;AAEA,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,OAAO;EAAE,GAAG;EAAM,SAAS;EAAU,GAAG,gBAAgB,IAAI,KAAK,QAAQ;CAAE;AAC7E;;;;;;;;;;;AChDA,MAAa,qBAAuD,OAAO,OAAO;CAChF,UAAU;CACV,cAAc;CACd,aAAa;CACb,MAAM;CACN,SAAS;CACT,qBAAqB;CACrB,cAAc;CACd,OAAO;CACP,MAAM;CACN,cAAc;CACd,YAAY;CACZ,WAAW;CACX,OAAO;CACP,kBAAkB;CAClB,WAAW;CACX,MAAM;CACN,oBAAoB;CACpB,iBAAiB;CACjB,UAAU;CACV,SAAS;CACT,aAAa;CACb,UAAU;CACV,UAAU;AACZ,CAAC;AAED,MAAa,qBAAuD,OAAO,OACzE,OAAO,YAAY,OAAO,QAAQ,kBAAkB,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAC3F;;;;;;;;ACtBA,SAAgB,UACd,IACA,KACA,UACA,MACoB;CACpB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CACnE,OAAO;EACL,GAAG;EACH,SAAS;EACT,MAAM,cAAc,IAAI,KAAK,QAAQ;EACrC,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,iBAAiB,OAAO,EAAE,cAAc,IAAI,CAAC;CACnD;AACF;AAEA,SAAS,cAAc,IAAkB,KAAuB,UAA8B;CAE5F,MAAM,QAAQ,mBADD,GAAG,kBAAkB,QACE;CACpC,IAAI,UAAU,KAAA,GAAW,OAAO;CAEhC,OAAO,gBAAgB,IAAI,KAAK,UAAU,MAAM;AAClD;;;;;;;;;;;;AC5BA,MAAM,qBAA6C;CACjD,QAAQ;CACR,QAAQ;AACV;AAEA,MAAM,eAAuC;CAC3C,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACX,MAAM;CACN,QAAQ;CACR,UAAU;AACZ;AAEA,MAAM,qBAA6C,OAAO,kBAAkB;AAC5E,MAAM,eAAuC,OAAO,YAAY;AAEhE,SAAgB,gBAAgB,OAAuB;CACrD,OAAO,mBAAmB,UAAU;AACtC;AAEA,SAAgB,kBAAkB,OAAuB;CACvD,OAAO,mBAAmB,UAAU;AACtC;AAEA,SAAgB,WAAW,OAAuB;CAChD,OAAO,aAAa,UAAU;AAChC;AAEA,SAAgB,aAAa,OAAuB;CAClD,OAAO,aAAa,UAAU;AAChC;AAEA,SAAS,OAAO,KAAqD;CACnE,OAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;AACjF;;;;ACjCA,MAAME,uBAA4B;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;;AAGzD,MAAM,oBAA8B;AAEpC,SAAgB,SACd,IACA,KACA,UACA,MACmB;CACnB,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAGA,qBAAmB;CAC3E,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,OAAO,kBAAkB,GAAG,kBAAkB,QAAQ,MAAM;CAKlE,MAAM,WAAW,gBAAgB,IAAI,KAAK,UAAU,OAAO;CAC3D,MAAM,gBAAgB,gBAAgB,IAAI,KAAK,UAAU,YAAY;CAErE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA,OAAO,aAAa,OAAO,OAAO,aAAa,QAAQ;EACvD,YAAY,kBAAkB,OAAO,OAAO,kBAAkB,aAAa;CAC7E;AACF;;;ACzBA,MAAMC,4BAAiC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAC9D,MAAMC,8BAAmC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;;;AAO5D,SAAgB,qBACd,IACA,KACA,UACA,gBAAuBA,6BAKvB;CACA,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAG,cAAc;CACtE,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAG7C,OAAO;EAAE;EAAO,SAFA,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;EAEnC,YADN,eAAe,IAAI,KAAK,QACT;CAAE;AACtC;AAEA,SAAgB,cACd,IACA,KACA,UACA,MACwB;CACxB,MAAM,SAAS,qBAAqB,IAAI,KAAK,UAAUD,yBAAuB;CAC9E,OAAO;EAAE,GAAG;EAAM,SAAS;EAAa,GAAG;CAAO;AACpD;AAEA,SAAgB,cACd,IACA,KACA,UACA,MACwB;CACxB,MAAM,SAAS,qBAAqB,IAAI,KAAK,QAAQ;CACrD,OAAO;EAAE,GAAG;EAAM,SAAS;EAAa,GAAG;CAAO;AACpD;AAEA,SAAgB,aACd,IACA,KACA,UACA,MACuB;CACvB,MAAM,SAAS,qBAAqB,IAAI,KAAK,QAAQ;CACrD,OAAO;EAAE,GAAG;EAAM,SAAS;EAAY,GAAG;CAAO;AACnD;AAEA,SAAgB,cACd,IACA,KACA,UACA,MACwB;CACxB,MAAM,SAAS,qBAAqB,IAAI,KAAK,QAAQ;CACrD,MAAM,SAAS,wBAAwB,WAAW,IAAI,KAAK,QAAQ,CAAC;CACpE,OAAO;EAAE,GAAG;EAAM,SAAS;EAAa;EAAQ,GAAG;CAAO;AAC5D;;;;;;;;ACzEA,SAAgB,gBACd,IACA,KACA,UACA,MACA,gBAC0B;CAC1B,MAAM,iBAAiB,gBAAgB,IAAI,KAAK,UAAU,SAAS;CACnE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;CACF;AACF;;;;;;;;;ACNA,SAAgB,iBACd,IACA,KACA,UACwB;CACxB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,OAAO;EACL,GAAG,sBAAsB,IAAI,KAAK,QAAQ;EAC1C,UAAU,aAAa,IAAI,KAAK,QAAQ;EACxC,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;CACzC;AACF;AAEA,SAAgB,YACd,IACA,KACA,UACA,MACsB;CACtB,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,iBAAiB,IAAI,KAAK,QAAQ;EAGrC,iBAAiB,iBAAiB,IAAI,KAAK,QAAQ;CACrD;AACF;AAEA,SAAgB,aACd,IACA,KACA,UACA,MACuB;CACvB,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,iBAAiB,IAAI,KAAK,QAAQ;EACrC,aAAa,gBAAgB,IAAI,KAAK,QAAQ;CAChD;AACF;;;ACjDA,MAAME,oBAAkB;AACxB,MAAMC,wBAAsB;AAC5B,MAAM,YAAY;AAElB,SAAS,YACP,IACA,KACA,UACA,OACc;CACd,OAAO,aAAa,KAAK;EAAC;EAAW;EAAW;CAAS,IAAI,CAAC,GAAG,GAAG,OAAO;EACzE,IAAI,CAAC,GAAG,qBAAqB,UAAU,OAAO,GAAG,GAAG,CAAC,GAAG,OAAO;EAC/D,OAAO;GACL,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;EACvB;CACF,CAAC;AACH;;;;;;AAOA,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,MAAM,SAAS,iBAAiB,IAAI,KAAK,QAAQ;CACjD,MAAM,KAAK,sBAAsB,IAAI,KAAK,QAAQ;CAClD,OAAO;EACL,GAAG;EACH,SAAS;EACT,OAAO,YAAY,IAAI,KAAK,UAAUD,iBAAe;EACrD,eAAe,YAAY,IAAI,KAAK,UAAUC,qBAAmB;EACjE,aAAa,OAAO;EACpB,aAAa,OAAO;EACpB,GAAI,KACA;GACE,YAAY,qBAAqB,GAAG,QAAQ;GAC5C,UAAU,GAAG;GACb,WAAW,GAAG;EAChB,IACA,CAAC;EACL,WAAW,sBAAsB,kBAAkB,IAAI,QAAQ,CAAC;EAGhE,mBAAmB;EACnB,aAAa;CACf;AACF;;;ACbA,MAAM,oBAAiF;CACrF,WAAW;CACX,WAAW;CACX,UAAU;CACV,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,UAAU;CACV,MAAM;CACN,MAAM;CACN,KAAK;CACL,aAAa;CACb,OAAO;CACP,MAAM;CACN,OAAO;CACP,mBAAmB;CACnB,QAAQ;CACR,QAAQ;CACR,aAAa;AACf;;;;;;AAOA,SAAgB,WAAW,gBAGzB;CACA,MAAM,WAAA,GAAA,8BAAA,gBAAA,CAA0B,cAAc;CAC9C,MAAM,SAAS,kBAAkB;CACjC,IAAI,QAAQ,OAAO;EAAE;EAAQ;CAAQ;CACrC,OAAO;EAAE,QAAQ,kBAAkB;EAAc,SAAS;CAAc;AAC1E;;;;;;;;;;;;;;;;;;;;ACzDA,MAAMC,0BAAQ,IAAI,QAAyC;AAE3D,SAAgB,iBAAiB,SAA2B,SAA+B;CACzF,MAAM,MAAM,QAAQ,YAAY;CAChC,MAAM,MAAMA,QAAM,IAAI,OAAO;CAC7B,IAAI,OAAO,IAAI,QAAQ,KACrB,OAAO,IAAI;CAEb,IAAI,KAAK;EACP,QAAQ,GAAG,oBAAoB,IAAI,GAAG;EACtC,QAAM,OAAO,OAAO;CACtB;CACA,MAAM,MAAM,QAAQ,GAAG,mBAAmB,QAAQ,cAAc,CAAC;CACjE,IAAI,QAAQC,yBAAAA,UACV,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,4BAA4B;CAE7E,QAAM,IAAI,SAAS;EAAE;EAAK;CAAI,CAAC;CAC/B,OAAO;AACT;;AAGA,SAAgB,iBAAiB,SAA2B,SAAgC;CAC1F,MAAM,MAAMH,QAAM,IAAI,OAAO;CAC7B,IAAI,CAAC,KACH;CAEF,QAAQ,GAAG,oBAAoB,IAAI,GAAG;CACtC,QAAM,OAAO,OAAO;AACtB;;;ACtCA,MAAa,iBAAkD;CAC7D,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAGA,MAAM,oBAA8C;CAClD,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAGA,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,sBAAsB;AAC5B,MAAM,UAAU,KAAK;AACrB,MAAM,kBAAkB,KAAK;AAC7B,MAAM,UAAU,KAAK;AACrB,MAAM,sBAAsB,KAAK;AAEjC,SAAS,SAAS,SAA2B,MAAsD;CACjG,OAAO,gBAAgB,QAAQ,KAAK,IAAI,KAAK;AAC/C;AAEA,SAAS,eACP,SACA,MACe;CACf,OAAO,gBAAgB,QAAQ,KAAK,MAAM,IAAI;AAChD;AAEA,SAAS,kBACP,SACA,OACA,YACqB;CACrB,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,2BAA2B,OAAO,UAAU;CAC7D,MAAM,UAA+B,CAAC;CACtC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK;EACX,mBAAmB,GAAG,8BAA8B,OAAO,YAAY,CAAC;EACxE,kBAAkB,GAAG,kCAAkC,OAAO,YAAY,CAAC;EAC3E,SACE,eAAe,QAAQ,MAAM,KAAK,QAChC,GAAG,+BAA+B,OAAO,YAAY,GAAG,KAAK,GAAG,CAClE,KAAK;EACP,aAAa,SAAS,UAAU,KAAK,QACnC,GAAG,mCAAmC,OAAO,YAAY,GAAG,KAAK,GAAG,CACtE;EACA,SAAS,GAAG,8BAA8B,OAAO,YAAY,CAAC;CAChE,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,iBACP,SACA,OACA,YACiB;CACjB,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,2BAA2B,OAAO,UAAU;CAC7D,MAAM,UAA2B,CAAC;CAClC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK;EACX,mBAAmB,GAAG,8BAA8B,OAAO,YAAY,CAAC;EACxE,kBAAkB,GAAG,kCAAkC,OAAO,YAAY,CAAC;CAC7E,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,YAAY,SAA2B,OAAY,YAAuC;CACjG,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,2BAA2B,OAAO,UAAU;CAC7D,MAAM,UAA6B,CAAC;CACpC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK;EACX,OAAO,SAAS,UAAU,KAAK,QAC7B,GAAG,6BAA6B,OAAO,YAAY,GAAG,KAAK,GAAG,CAChE;EACA,OAAO,SAAS,UAAU,KAAK,QAC7B,GAAG,6BAA6B,OAAO,YAAY,GAAG,KAAK,GAAG,CAChE;EACA,UAAU,GAAG,+BAA+B,OAAO,YAAY,CAAC;CAClE,CAAC;CAEH,OAAO;AACT;;AAGA,SAAgB,YACd,SACA,OACA,YACA,QACA,eAAe,IAAI,wBAAwB,GAC7B;CACd,MAAM,EAAE,OAAO;CACf,MAAM,oBAAoB,GAAG,wBAAwB,OAAO,UAAU;CACtE,MAAM,OAAO,SAAS,UAAU,KAAK,QACnC,GAAG,sBAAsB,OAAO,YAAY,KAAK,GAAG,CACtD;CACA,MAAM,WAAW,GAAG,uBAAuB,OAAO,UAAU;CAC5D,MAAM,SAAS,eAAe,GAAG,wBAAwB,OAAO,UAAU,MAAM;CAChF,MAAM,aAAa,eAAe,SAAS,OAAO,YAAY,KAAK;CACnE,MAAM,oBAAoB,eAAe,SAAS,OAAO,YAAY,IAAI;CACzE,MAAM,UAAU,iBAAiB,SAAS,OAAO,YAAY,QAAQ,YAAY;CAEjF,MAAM,OAAsB;EAC1B,KACE,oBAAoB,IAAI;GAAE,MAAM;GAAgB;EAAkB,IAAI;GAAE,MAAM;GAAO;EAAK;EAC5F;EACA;EACA;EACA,QAAQ,GAAG,wBAAwB,OAAO,UAAU,MAAM,IAAI,cAAc;EAC5E,OAAO;GACL,WAAW,WAAW,kBAAkB;GACxC,WAAW,WAAW,iBAAiB;GACvC,WAAW,WAAW,kBAAkB;GACxC,KAAK;EACP;EACA,eAAe,eAAe,UAAU,KAAK,QAC3C,GAAG,+BAA+B,OAAO,YAAY,KAAK,GAAG,CAC/D;EACA,aAAa,eAAe,UAAU,KAAK,QACzC,GAAG,6BAA6B,OAAO,YAAY,KAAK,GAAG,CAC7D;EACA;EACA;EACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC7B,SAAS,CAAC;CACZ;CACA,MAAM,cAAc,YAAY,UAAU;CAC1C,MAAM,gBAAgB,YAAY,iBAAiB;CAEnD,QAAQ,QAAR;EACE,KAAK,QAAQ;GACX,MAAM,SAAS,GAAG,wBAAwB,OAAO,UAAU;GAC3D,OAAO;IACL,GAAG;IACH;IACA,OAAO;IACP,cAAc;IACd,WAAW,SAAS,IAAI,SAAS;IACjC,YAAY,WAAW,kBAAkB;IACzC,WAAW,WAAW,iBAAiB;IACvC,OAAO,WAAW,aAAa;IAC/B,SAAS,iBAAiB,SAAS,OAAO,UAAU;GACtD;EACF;EACA,KAAK,YAAY;GACf,MAAM,UAAU,kBAAkB,SAAS,OAAO,UAAU;GAC5D,OAAO;IACL,GAAG;IACH;IACA,SAAS,QAAQ,MAAM,MAAM,EAAE,OAAO;IACtC,aAAa,QAAQ,EAAE,EAAE,eAAe;IACxC;GACF;EACF;EACA,KAAK,SAAS;GACZ,MAAM,UAAU,kBAAkB,SAAS,OAAO,UAAU;GAC5D,OAAO;IACL,GAAG;IACH;IACA,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,CAAC,EAAE,eAAe;IAChE,iBAAiB,WAAW,yBAAyB;IACrD,gBAAgB,WAAW,yBAAyB;IACpD;GACF;EACF;EACA,KAAK,YACH,OAAO;GACL,GAAG;GACH;GACA,OAAO;GACP,cAAc;GACd,OAAO,WAAW,aAAa;GAC/B,SAAS,YAAY,SAAS,OAAO,UAAU;GAC/C,SAAS,iBAAiB,SAAS,OAAO,UAAU;EACtD;EAEF,KAAK,WAAW;GACd,MAAM,UAAU,YAAY,SAAS,OAAO,UAAU;GACtD,OAAO;IACL,GAAG;IACH;IACA,gBAAgB,QAAQ,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;IACpE,cAAc,WAAW,qBAAqB;IAC9C;IACA,SAAS,iBAAiB,SAAS,OAAO,UAAU;GACtD;EACF;EACA,KAAK;EACL,KAAK,aACH,OAAO;GAAE,GAAG;GAAM;GAAQ,SAAS,iBAAiB,SAAS,OAAO,UAAU;EAAE;EAElF,SACE,OAAO;GACL,GAAG;GACH,QAAQ;GACR,UACE,WAAW,SAAS,UAAU,WAAW,OAAO,KAAK,GAAG,IAAI,YAAY,UAAU;GACpF,SAAS,iBAAiB,SAAS,OAAO,UAAU;EACtD;CAEJ;AACF;;AAGA,SAAgB,iBAAiB,SAA2B,OAAY,QAA2B;CACjG,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,qBAAqB,KAAK;CAC3C,MAAM,SAAyB,CAAC;CAChC,MAAM,eAAe,IAAI,wBAAwB;CACjD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,OAAO,KAAK,YAAY,SAAS,OAAO,GAAG,QAAQ,YAAY,CAAC;CAElE,MAAM,mBAAqD,CAAC;CAC5D,MAAM,mBAAmB,GAAG,+BAA+B,KAAK;CAChE,KAAK,IAAI,QAAQ,GAAG,QAAQ,kBAAkB,SAAS;EACrD,MAAM,aAAa,GAAG,uCAAuC,OAAO,KAAK;EACzE,iBAAiB,KACf,cAAc,KAAK,aAAa,OAAO,SAAS,OAAO,WAAW,CAAC,MAAM,IAC3E;CACF;CACA,OAAO;EACL,UAAU,kBAAkB,GAAG,qBAAqB,KAAK,MAAM;EAC/D,kBAAkB,GAAG,4BAA4B,KAAK;EACtD;EACA;CACF;AACF;AAEA,SAAS,eACP,SACA,OACA,YACA,WACgB;CAChB,MAAM,EAAE,OAAO;CACf,MAAM,OAAO,YACT,GAAG,kCAAkC,OAAO,UAAU,IACtD,GAAG,2BAA2B,OAAO,UAAU;CACnD,IAAI,SAAS,GAAG,OAAO,EAAE,MAAM,OAAO;CACtC,IAAI,SAAS,GAAG,OAAO,EAAE,MAAM,cAAc;CAC7C,IAAI,SAAS,KAAK,SAAS,GAAG,OAAO,EAAE,MAAM,cAAc;CAC3D,MAAM,QAAQ,YACV,GAAG,iCAAiC,OAAO,UAAU,IACrD,GAAG,0BAA0B,OAAO,UAAU;CAClD,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SACjC,OAAO,KACL,SAAS,UAAU,KAAK,aACtB,YACI,GAAG,gCAAgC,OAAO,YAAY,OAAO,KAAK,QAAQ,IAC1E,GAAG,yBAAyB,OAAO,YAAY,OAAO,KAAK,QAAQ,CACzE,CACF;CAEF,OAAO,SAAS,IAAI;EAAE,MAAM;EAAU,OAAO,OAAO,MAAM;CAAG,IAAI;EAAE,MAAM;EAAS;CAAO;AAC3F;AAEA,SAAS,YAAY,OAA+B;CAClD,IAAI,MAAM,SAAS,UAAU,OAAO,MAAM;CAC1C,IAAI,MAAM,SAAS,SAAS,OAAO,MAAM,OAAO,MAAM;CACtD,OAAO;AACT;AAEA,SAAS,iBACP,SACA,OACA,YACA,QACA,QAC6B;CAC7B,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,UAAU;EACd,CAAC,aAAa,CAAC;EACf,CAAC,UAAU,CAAC;EACZ,CAAC,YAAY,CAAC;EACd,CAAC,aAAa,CAAC;CACjB;CACA,MAAM,UAA2B,CAAC;CAClC,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS;EAClC,MAAM,SAAS,gBACb,IACA,KACA,QACA,GAAG,6BAA6B,OAAO,YAAY,KAAK,GACxD,MACF;EACA,IAAI,QAAQ,QAAQ,OAAO;CAC7B;CACA,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,UAAU,KAAA;AACrD;;;;;;;;;ACrTA,SAAgB,+BACd,SACA,SACA,mBACQ;CACR,IAAI,qBAAqB,GAAG,OAAO;CACnC,MAAM,QAAQ,iBAAiB,SAAS,OAAO;CAC/C,MAAM,aAAa,QAAQ,GAAG,gCAAgC,OAAO,iBAAiB;CACtF,IAAI,aAAa,GAAG,OAAO;CAC3B,OAAO,QAAQ,GAAG,wBAAwB,OAAO,UAAU;AAC7D;;AAGA,SAAgB,uBACd,SACA,SACA,aACM;CACN,KAAK,MAAM,cAAc,aAAa;EACpC,IAAI,WAAW,YAAY,UAAU;EACrC,IAAI,WAAW,IAAI,SAAS,gBAAgB;EAC5C,MAAM,QAAQ,iBAAiB,SAAS,OAAO;EAC/C,MAAM,aAAa,QAAQ,GAAG,gCAC5B,OACA,WAAW,IAAI,iBACjB;EACA,IAAI,aAAa,GAAG;GAClB,WAAW,oBAAoB;GAC/B,WAAW,cAAc;GACzB;EACF;EACA,WAAW,oBAAoB,QAAQ,GAAG,wBAAwB,OAAO,UAAU;EACnF,WAAW,cACT,eAAe,QAAQ,GAAG,wBAAwB,OAAO,UAAU,MAAM;CAC7E;AACF;;;;;;;;;;;;;;ACxBA,SAAgB,uBACd,IACA,KACA,UACA,kBACA,OACA,UACoB;CACpB,MAAM,eAAe,GAAG,0BAA0B,QAAQ;CAC1D,MAAM,KAAK,gBAAgB,IAAI,KAAK,UAAU,IAAI;CAElD,IAAI,eAAe,GACjB,OAAO;EACL,KAAK;GACH,MAAM;GACN;GACA,mBAAmB;EACrB;EACA,iBAAiB;EACjB,IAAI,MAAM;CACZ;CAGF,IAAI,MAAM,GAAG,SAAS,GACpB,OAAO;EACL,KAAK;GAAE,MAAM;GAAM;GAAkB;EAAG;EACxC,iBAAiB;EACjB;CACF;CAGF,OAAO;EACL,KAAK;GAAE,MAAM;GAAS;GAAkB;GAAO;EAAS;EACxD,iBAAiB;EACjB,IAAI,MAAM;CACZ;AACF;;;;;;;;ACxCA,SAAgB,kBAAkB,MAAmC;CACnE,OAAO,SAAA,IAAoB,UAAU;AACvC;;AAGA,SAAgB,gBAAgB,WAAwC;CACtE,OAAO,cAAc,UAAA,IAAA;AACvB;;;ACfA,MAAM,kBAA0C;CAAE,WAAW;CAAM,WAAW;AAAK;;;;;;;;;;;;;;;;;;AAmBnF,SAAgB,2BACd,IACA,KACA,UACA,kBACwB;CACxB,MAAM,YAAY,GAAG,yBAAyB,UAAU,KAAK;CAC7D,IAAI,CAAC,WAAW,OAAO;CAEvB,IAAI;EACF,MAAM,YAAY,cAAc,IAAI,KAAK,WAAW,gBAAgB;EACpE,IAAI,CAAC,WAAW,OAAO;EACvB,OAAO;GAAE;GAAW,WAAW,kBAAkB,GAAG,uBAAuB,QAAQ,CAAC;EAAE;CACxF,UAAU;EACR,GAAG,oBAAoB,SAAS;CAClC;AACF;AAEA,SAAS,cACP,IACA,KACA,WACA,kBACsB;CACtB,MAAM,eAAe,GAAG,0BAA0B,SAAS;CAC3D,IAAI,eAAe,GACjB,OAAO;EAAE,MAAM;EAAgB;EAAkB,mBAAmB;CAAa;CAEnF,MAAM,KAAK,gBAAgB,IAAI,KAAK,WAAW,IAAI;CACnD,IAAI,MAAM,GAAG,SAAS,GACpB,OAAO;EAAE,MAAM;EAAM;EAAkB;CAAG;CAE5C,OAAO;AACT;;;;;;;;;;;;;AChCA,SAAgB,kBACd,IACA,KACA,UACsB;CACtB,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GAAG,OAAO;CAErD,MAAM,gBAAgB,eAAe,IAAI,KAAK,UAAU,eAAe;CACvE,MAAM,SAAS,eAAe,IAAI,KAAK,UAAU,QAAQ;CACzD,MAAM,UAAU,eAAe,IAAI,KAAK,UAAU,SAAS;CAC3D,MAAM,YAAY,eAAe,IAAI,KAAK,UAAU,WAAW;CAC/D,MAAM,YAAY,eAAe,IAAI,KAAK,UAAU,WAAW;CAE/D,MAAM,MAAqB,CAAC;CAC5B,IAAI,kBAAkB,KAAA,GAAW,IAAI,gBAAgB;CACrD,IAAI,WAAW,KAAA,GAAW,IAAI,SAAS;CACvC,IAAI,YAAY,KAAA,GAAW,IAAI,UAAU;CACzC,IAAI,cAAc,KAAA,GAAW,IAAI,YAAY;CAC7C,IAAI,cAAc,KAAA,GAAW,IAAI,YAAY;CAC7C,OAAO;AACT;AAEA,SAAS,eACP,IACA,KACA,UACA,KACoB;CAKpB,MAAM,MAAM,GAAG,iCAAiC,UAAU,KAAKI,yBAAAA,UAAU,CAAC;CAC1E,IAAI,OAAO,GAAG,OAAO,KAAA;CACrB,IAAI,QAAQ,GAAG,OAAO;CAEtB,MAAM,MAAM,IAAI,MAAM,GAAG;CACzB,IAAI;EAEF,IADgB,GAAG,iCAAiC,UAAU,KAAK,KAAK,GAC9D,KAAK,GAAG,OAAO,KAAA;EACzB,OAAO,IAAI,cAAc,GAAG;CAC9B,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;AAEA,SAAS,eACP,IACA,KACA,UACA,KACoB;CACpB,MAAM,MAAM,IAAI,MAAM,CAAC;CACvB,IAAI;EAEF,IAAI,CADO,GAAG,iCAAiC,UAAU,KAAK,GACxD,GAAG,OAAO,KAAA;EAChB,OAAO,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;CACpC,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;AC5FA,SAAgB,gBAAgB,MAAyB;CACvD,QAAQ,MAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,cACH,OAAO;CACX;AACF;AAEA,SAAgB,kBAAkB,MAAyB;CACzD,QAAQ,MAAR;EACE,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;;;;;;;ACrDA,SAAgB,mBACd,IACA,KACA,QACA,UACA,kBACA,OACA,UACA,eAAe,IAAI,wBAAwB,GAC3B;CAChB,MAAM,WAAW,uBAAuB,IAAI,KAAK,UAAU,kBAAkB,OAAO,QAAQ;CAC5F,MAAM,OAAO,cAAc,IAAI,KAAK,QAAQ;CAC5C,MAAM,QAAQ,eAAe,IAAI,QAAQ;CACzC,MAAM,WAAW,gBAAgB,IAAI,KAAK,UAAU,UAAU;CAC9D,MAAM,UAAU,gBAAgB,IAAI,KAAK,UAAU,MAAM;CACzD,MAAM,SAAS,gBAAgB,IAAI,KAAK,UAAU,GAAG;CACrD,MAAM,aAAa,gBAAgB,IAAI,KAAK,UAAU,cAAc;CACpE,MAAM,cAAc,gBAAgB,IAAI,KAAK,UAAU,GAAG;CAC1D,MAAM,YAAY,kBAAkB,GAAG,uBAAuB,QAAQ,CAAC;CAIvE,MAAM,OAAO,kBAAkB,IAAI,KAAK,QAAQ;CAChD,MAAM,eAAe,2BAA2B,IAAI,KAAK,UAAU,gBAAgB;CACnF,MAAM,UAAU,sBAAsB,IAAI,KAAK,QAAQ,UAAU,YAAY;CAE7E,OAAO;EACL,KAAK,SAAS;EACd;EACA;EACA,iBAAiB,SAAS;EAC1B,IAAI,SAAS;EACb;EACA;EACA;EACA;EACA;EACA,SAAS,aAAa,aAAa,UAAU,IAAI;EACjD,UAAU,cAAc,aAAa,WAAW,IAAI;EACpD;EACA,WAAW,aAAa;EACxB,WAAW,aAAa;EACxB,GAAI,MAAM,WAAW,KAAA,IAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAC5D,GAAI,MAAM,YAAY,KAAA,IAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;EAC/D,GAAI,MAAM,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;EACrE,GAAI,MAAM,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;EACrE,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;CAC/B;AACF;AAEA,SAAS,sBACP,IACA,KACA,QACA,UACA,QACkC;CAClC,MAAM,SAAS;EACb,CAAC,YAAY,CAAC;EACd,CAAC,eAAe,CAAC;EACjB,CAAC,cAAc,CAAC;EAChB,CAAC,aAAa,CAAC;EACf,CAAC,WAAW,CAAC;EACb,CAAC,SAAS,CAAC;EACX,CAAC,QAAQ,CAAC;EACV,CAAC,YAAY,CAAC;EACd,CAAC,aAAa,CAAC;EACf,CAAC,eAAe,CAAC;EACjB,CAAC,iBAAiB,EAAE;CACtB;CACA,MAAM,UAAgC,CAAC;CACvC,KAAK,MAAM,CAAC,KAAK,UAAU,QAAQ;EACjC,MAAM,SAAS,gBACb,IACA,KACA,QACA,GAAG,yBAAyB,UAAU,KAAK,GAC3C,MACF;EACA,IAAI,QAAQ,QAAQ,OAAO;CAC7B;CACA,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,UAAU,KAAA;AACrD;;;;;;;;;;;;;;AC9EA,SAAgB,uBAAuB,OAOR;CAC7B,MAAM,EAAE,SAAS,SAAS,kBAAkB,OAAO,eAAe,WAAW;CAC7E,MAAM,EAAE,IAAI,QAAQ;CAEpB,MAAM,cAA+B,CAAC;CACtC,IAAI,UAAU;CACd,MAAM,WAAW,QAAQ,UAAU,gBAAgB,CAAC,CAAC;CACrD,MAAM,eAAe,IAAI,wBAAwB;CACjD,MAAM,UAAU,eAAe,OAAO;CAEtC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;EAC9B,eAAe,MAAM;EACrB,MAAM,WAAW,cAAc,CAAC;EAChC,IAAI,CAAC,UAAU;EACf,IAAI;GACF,MAAM,OAAO,mBACX,IACA,KACA,QAAQ,QACR,UACA,kBACA,GACA,UACA,YACF;GACA,MAAM,cAAc,GAAG,qBAAqB,QAAQ;GACpD,MAAM,EAAE,WAAW,WAAW,WAAW;GACzC,MAAM,MAAM,OAAO,IAAI,KAAK,UAAU,MAAM,aAAa,OAAO;GAChE,YAAY,KAAK,GAAG;GACpB,IAAI,IAAI,oBAAoB,QAAQ,UAAU;EAChD,UAAU;GACR,GAAG,oBAAoB,QAAQ;EACjC;CACF;CAEA,uBAAuB,SAAS,SAAS,WAAW;CACpD,QAAQ,eAAe,kBAAkB,OAAO;CAChD,OAAO;EAAE,WAAW,QAAQ,UAAU,gBAAgB;EAAG;CAAY;AACvE;;;;;;;;;;;;;ACtDA,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,kBAAoC,QAAiD;EACxF,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,MAAM,QAAQ,GAAG,uBAAuB,OAAO;GAC/C,OAAO,uBAAuB;IAC5B,SAAS,KAAK;IACd,SAAS,KAAK;IACd;IACA;IACA,gBAAgB,MAAM,GAAG,kBAAkB,SAAS,CAAC;IACrD;GACF,CAAC;EACH,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;AACF;;;;;;;;;;;;ACvBA,MAAM,mBAAmB;;;;;;;;;;AAgBzB,SAAgB,0BACd,MACA,UACA,MACA,MACO;CACP,MAAM,OAAO,KAAK;CAClB,MAAM,SAAS,KAAK;CACpB,MAAM,QAAQ,KAAK,QAAQ,KAAK;CAChC,MAAM,SAAS,KAAK,MAAM,KAAK;CAC/B,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,OAAO;CACnB,MAAM,OAAO,OAAO;CACpB,MAAM,OAAO,OAAO;CAEpB,QAAQ,UAAR;EACE,KAAK,IACH,OAAO;GAAC;GAAG;GAAM,CAAC;GAAM;GAAG,QAAQ,SAAS;GAAS,CAAC,OAAO;EAAI;EACnE,KAAK,KACH,OAAO;GAAC,CAAC;GAAK;GAAG;GAAG,CAAC;GAAK,OAAO,OAAO;GAAQ,OAAO,SAAS;EAAO;EACzE,KAAK,KACH,OAAO;GAAC;GAAG,CAAC;GAAM;GAAM;GAAG,CAAC,OAAO;GAAQ,QAAQ,OAAO;EAAM;EAClE,KAAK,GACH,OAAO;GAAC;GAAK;GAAG;GAAG;GAAK,CAAC,MAAM;GAAM,CAAC,MAAM;EAAM;CACtD;AACF;;;;;AAMA,SAAgB,WACd,MACA,UACA,UACmC;CACnC,MAAM,YAAY,KAAK,QAAQ,KAAK;CACpC,MAAM,aAAa,KAAK,MAAM,KAAK;CACnC,MAAM,OAAO,aAAa,MAAM,aAAa;CAC7C,MAAM,YAAY,OAAO,aAAa;CACtC,MAAM,aAAa,OAAO,YAAY;CAEtC,IAAI,SAAS,SAAS,SAAS;EAC7B,IAAI,CAAC,OAAO,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,GACxD,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wCAAwC;EAE5F,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,KAAK,CAAC;EACpD,OAAO;GAAE;GAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAO,QAAQ,aAAc,SAAS,CAAC;EAAE;CACpF;CAEA,MAAM,QAAQ,SAAS,SAAS;CAChC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GACtC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wCAAwC;CAE5F,OAAO;EACL,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,KAAK,CAAC;EAChD,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,KAAK,CAAC;CACpD;AACF;;;;;;;AAiCA,SAAgB,UAAU,SAA2B,MAA2C;CAC9F,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,EAAE,MAAM,MAAM,UAAU,UAAU,YAAY,SAAS;CAI7D,IAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,OAAO,KAAK,QAAQ,OAAO;CAE/D,MAAM,cAAc,qBAAqB,MAAM,KAAK,MAAM;CAC1D,MAAM,EAAE,OAAO,WAAW,WAAW,aAAa,UAAU,QAAQ;CACpE,IAAI,KAAK,oBAAoB,KAAA,KAAa,QAAQ,SAAS,KAAK,iBAC9D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iBAAiB,MAAM,GAAG,OAAO,eAAe,KAAK,gBAAgB,mEAEvE;CAEF,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,SAAS;CAEvB,IAAI,WAAuB;CAC3B,IAAI,YAAwB;CAC5B,IAAI,YAAwB;CAC5B,IAAI,UAAsB;CAC1B,IAAI;EACF,WAAW,IAAI,MAAM,KAAK;EAC1B,YAAY,GAAG,oBAAoB,OAAO,QAAQ,kBAAkB,UAAU,MAAM;EACpF,IAAI,CAAC,WAAW,OAAO;EAEvB,GAAG,oBACD,WACA,GACA,GACA,OACA,QACA,eAAe,gBAAgB,IAAa,UAC9C;EAEA,YAAY,IAAI,MAAM,EAAK;EAC3B,UAAU,KAAK,WAAW,0BAA0B,aAAa,UAAU,OAAO,MAAM,CAAC;EAEzF,UAAU,IAAI,MAAM,EAAK;EACzB,IAAI,KAAK,SAAS,OAAO,GAAG,CAAC;EAC7B,IAAI,KAAK,SAAS,OAAO,GAAG,CAAC;EAC7B,IAAI,KAAK,SAAS,OAAO,OAAO,CAAC;EACjC,IAAI,KAAK,SAAS,OAAO,QAAQ,EAAE;EAEnC,IAAI,CAAC,KAAK,WAAW,WAAW,OAAO,GAAG,OAAO;EAGjD,OAAO;GACL;GACA;GACA;GACA,OAAO;GACP,oBAAoB;GACpB,MAAM,mBAPO,IAAI,UAAU,UAAU,KAOP,CAAC;EACjC;CACF,UAAU;EACR,IAAI,WAAW,GAAG,mBAAmB,SAAS;EAC9C,IAAI,SAAS,IAAI,KAAK,OAAO;EAC7B,IAAI,WAAW,IAAI,KAAK,SAAS;EACjC,IAAI,UAAU,IAAI,KAAK,QAAQ;CACjC;AACF;AAEA,SAAS,qBAAqB,MAAe,YAA6B;CACxE,OAAO;EACL,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,QAAQ,aAAa,KAAK;EAC1B,KAAK,aAAa,KAAK;CACzB;AACF;AAEA,SAAS,UAAU,KAA8B,KAAU,GAAgB;CACzE,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,IAAI,IAAI,CAAC;AAC9D;AAEA,SAAS,mBAAmB,OAAgC;CAC1D,MAAM,MAAM,IAAI,WAAW,MAAM,UAAU;CAC3C,IAAI,IAAI,KAAK;CACb,OAAO,IAAI;AACb;;;;ACzLA,MAAM,uBAAuB;;AAG7B,MAAM,yBAAyB;;;;;;;;;;;AAY/B,MAAM,sCAA2C,IAAI,IAAI;CAAC;CAAG;CAAG;CAAG;CAAI;AAAE,CAAC;;;;;;;;AAS1E,MAAM,yBAAyB;;;;;;AAO/B,MAAM,mBAID;CACH;EAAE,MAAM;EAAU,SAAS;EAAG,KAAK;CAAE;CACrC;EAAE,MAAM;EAAY,SAAS;EAAG,KAAK;CAAE;CACvC;EAAE,MAAM;EAAQ,SAAS;EAAG,KAAK;CAAE;AACrC;;;;;;;;;;;AAYA,IAAa,6BAAb,MAAwC;CACtC,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OACE,kBACA,SACA,QAC6B;EAC7B,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,MAAM,QAAQ,eAAe,QAAQ,KAAK;EAC1C,MAAM,WAAY,QAAQ,YAAY;EACtC,MAAM,QAAQ,aAAa,QAAQ,KAAK;EACxC,MAAM,WAAW,KAAK,QAAQ,UAAU,gBAAgB,CAAC,CAAC;EAE1D,MAAM,cAA4C,CAAC;EAEnD,IAAI;GACF,MAAM,OAAO;IACX,OAAO,GAAG,mBAAmB,OAAO;IACpC,QAAQ,GAAG,oBAAoB,OAAO;GACxC;GACA,MAAM,QAAQ,GAAG,uBAAuB,OAAO;GAC/C,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;IAC9B,eAAe,MAAM;IACrB,MAAM,WAAW,GAAG,kBAAkB,SAAS,CAAC;IAChD,IAAI,CAAC,UAAU;IAEf,IAAI;KACF,MAAM,YAAY,GAAG,sCAAsC,QAAQ;KAEnE,IAAI,CAAC,WAAW;KAEhB,MAAM,WAAW,uBAAuB,IAAI,KAAK,UAAU,kBAAkB,GAAG,QAAQ;KAaxF,MAAM,cAAc,GAAG,qBAAqB,QAAQ;KACpD,MAAM,YACJ,gBAAgB,0BAChB,uBAAuB,WAAW,IAAI,KAAK,QAAQ,CAAC,MAAM;KAK5D,MAAM,gBAHJ,oBAAoB,IAAI,WAAW,KACnC,CAAC,aACD,uBAAuB,IAAI,KAAK,QAAQ,MAAM,KAAA,IAE5C,4BAA4B,IAAI,KAAK,QAAQ,IAC7C,KAAA;KAGJ,MAAM,QAAA,GAAA,8BAAA,iBAAA,CAAwB,iBAAiB,cAAc,IAAI,KAAK,QAAQ,CAAC;KAE/E,KAAK,MAAM,QAAQ,OAAO;MACxB,IAAI,EAAE,YAAY,KAAK,MAAM;MAC7B,MAAM,SAAS,KAAK,UAClB,SACA,UACA,KAAK,SACL,MACA,MACA,UACA,OACA,kBAAkB,KAAA,GAClB,QAAQ,eACV;MACA,IAAI,CAAC,QAAQ;MACb,YAAY,KAAK;OACf,KAAK,SAAS;OACd,MAAM,KAAK;OACX;OACA;MACF,CAAC;KACH;IACF,UAAU;KACR,GAAG,oBAAoB,QAAQ;IACjC;GACF;GAEA,OAAO;IAAE,WAAW,KAAK,QAAQ,UAAU,gBAAgB;IAAG;GAAY;EAC5E,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;;;;;;CAOA,UACE,SACA,UACA,SACA,MACA,MACA,UACA,OACA,eACA,iBACmB;EACnB,MAAM,EAAE,OAAO,KAAK;EAEpB,IAAI,CAAC,GAAG,8BAA8B,UAAU,OAAO,GAIrD,IADgB,GAAG,qBAAqB,QAC9B,MAAM,wBAAwB,CAAC,GAAG,iBAAiB,UAAU,IAAI,GAAG;GAC5E,GAAG,8BAA8B,QAAQ;GACzC,IAAI,CAAC,GAAG,8BAA8B,UAAU,OAAO,GAAG,OAAO;EACnE,OACE,OAAO;EAcX,MAAM,WAAW,KAAK,IAAI,IAAI,KAAK,QAAQ,KAAK,SAAS,KAAK,MAAM,KAAK,OAAO;EAChF,MAAM,WAAW,KAAK,IAAI,OAAO,KAAK,KAAK,yBAAyB,QAAQ,CAAC;EAM7E,OAAO,UAAU,KAAK,SAAS;GAC7B;GACA;GACA;GACA,UAAU;IAAE,MAAM;IAAS,OAAO;GAAS;GAC3C,GAAI,oBAAoB,KAAA,IAAY,EAAE,gBAAgB,IAAI,CAAC;GAC3D,YAAY;GAIZ,OAAO,WAAW,eACf,gBAAgB,GAAG,kCAAkC,GAAG,uBAAA,CACvD,WACA,SACA,UACA,SACA,WAAA,EAEF;EACJ,CAAC;CACH;AACF;AAEA,SAAS,aACP,WACkD;CAClD,IAAI,CAAC,aAAa,UAAU,WAAW,GACrC,OAAO,iBAAiB,QAAQ,MAAM,EAAE,SAAS,QAAQ;CAE3D,MAAM,SAAS,IAAI,IAAI,SAAS;CAChC,OAAO,iBAAiB,QAAQ,MAAM,OAAO,IAAI,EAAE,IAAI,CAAC;AAC1D;AAEA,SAAS,eAAe,OAAmC;CACzD,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG,OAAO;CAClD,OAAO;AACT;;;;;;;;;;;;;AC7OA,IAAa,sBAAb,MAAiC;CAC/B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,QAAQ,QAAqD;EAC3D,eAAe,MAAM;EACrB,KAAK,QAAQ,uBAAuB;EACpC,MAAM,UAAU,KAAK,QAAQ,WAAW;EACxC,MAAM,QAAsC,CAAC;EAC7C,KAAK,MAAM,UAAU,SAAS;GAC5B,eAAe,MAAM;GACrB,MAAM,KAAK,KAAK,QAAQ,OAAO,kBAAkB,MAAM,CAAC;EAC1D;EACA,OAAO,EAAE,MAAM;CACjB;CAEA,QAAQ,kBAAoC,QAAiD;EAC3F,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,SAAS,KAAK,QAAQ,qBAAqB,gBAAgB;EAEjE,MAAM,QAAQ,GAAG,0BAA0B,QAAQ,OAAO,SAAS;EACnE,IAAI,QAAQ,GACV,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,sCAAsC,MAAM,YAAY,kBAC1D;EAGF,OAAO,uBAAuB;GAC5B,SAAS,KAAK;GACd,SAAS,KAAK;GACd;GACA;GACA,gBAAgB,MAAM,GAAG,qBAAqB,QAAQ,OAAO,WAAW,CAAC;GACzE;EACF,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;AC1BA,SAAgB,cACd,IACA,UACA,OACA,OAAe,oBAAoB,OAC7B;CAEN,IAAI,CADO,GAAG,mBAAmB,UAAU,MAAM,MAAM,IAAI,KAAM,MAAM,IAAI,KAAM,MAAM,IAAI,GACrF,GACJ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,mCAAmC;AAEtF;;;;;;AAOA,SAAgB,gBAAgB,IAAkB,UAAe,MAAoB;CACnF,GAAG,qBAAqB,UAAU,IAAI;AACxC;;;;;;;AAQA,SAAgB,gBAAgB,IAAkB,UAAe,SAAuB;CACtF,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,UAAU,GAAG,CAAC,CAAC;CAClE,IAAI,CAAC,GAAG,qBAAqB,UAAU,KAAK,GAC1C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;AAExF;;;;;;;;AASA,SAAgB,cACd,IACA,UACA,SACM;CACN,MAAM,OAAO,YAAY,GAAG,mBAAmB,QAAQ,GAAG,OAAO;CACjE,IAAI,CAAC,GAAG,mBAAmB,UAAU,IAAI,GACvC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,mCAAmC;AAEtF;;;;;;;AAQA,SAAgB,aACd,IACA,KACA,UACA,MACM;CACN,MAAM,MAAM,IAAI,MAAA,EAAiB;CACjC,IAAI;EACF,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC;EACjC,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC;EAChC,IAAI,KAAK,KAAK,OAAO,KAAK,OAAO,CAAC;EAClC,IAAI,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE;EACpC,IAAI,CAAC,GAAG,kBAAkB,UAAU,GAAG,GACrC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;CAErF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;AAMA,SAAgB,iBACd,IACA,KACA,UACA,KACA,OACM;CACN,MAAM,MAAM,IAAI,eAAe,KAAK;CACpC,IAAI;EACF,GAAG,yBAAyB,UAAU,KAAK,GAAG;CAChD,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;AAWA,SAAgB,wBACd,IACA,KACA,UACA,KACA,OACM;CACN,IAAI,UAAU,MAAM;EAClB,GAAG,oBAAoB,UAAU,GAAG;EACpC;CACF;CACA,iBAAiB,IAAI,KAAK,UAAU,KAAK,KAAK;AAChD;;;;;;;AAQA,SAAgB,eACd,IACA,UACA,WACA,OACM;CACN,IAAI,CAAC,GAAG,yBAAyB,UAAU,WAAW,KAAK,GACzD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;AAE5F;;;;;AAMA,SAAgB,qBACd,IACA,KACA,UACA,WACM;CACN,MAAM,MAAM,IAAI,MAAM,UAAU,SAAA,CAAkB;CAClD,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KACpC,IAAI,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,UAAU,EAAG,GAAG,IAAA,CAAa;EAEhE,IAAI,CAAC,GAAG,+BAA+B,UAAU,KAAK,UAAU,MAAM,GACpE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+CACF;CAEJ,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;AAGA,SAAgB,gBAAgB,IAAkB,UAAe,WAAyB;CACxF,IAAI,CAAC,GAAG,0BAA0B,UAAU,SAAS,GACnD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,0CAA0C;AAE7F;;;;;AAMA,SAAgB,kBAAkB,IAAkB,UAAqB;CACvE,GAAG,4BAA4B,QAAQ;AACzC;;;;;;;AAQA,SAAgB,wBACd,IACA,UACA,IACM;CACN,IAAI,CAAC,GAAG,kCAAkC,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,GACtF,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kDACF;AAEJ;;;;;AAMA,SAAgB,0BAA0B,IAAkB,UAAqB;CAC/E,GAAG,oCAAoC,QAAQ;AACjD;;;;;;AAOA,SAAgB,YACd,IACA,KACA,UACA,UACM;CACN,MAAM,MAAM,IAAI,MAAM,SAAS,SAAA,CAAqB;CACpD,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GACxC,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK,KAAK,OAAO,SAAS,EAAE,CAAE,GAAG,GAAG;GACxC,IAAI,KAAK,KAAK,OAAO,SAAS,EAAE,CAAE,GAAG,MAAM,CAAC;EAC9C;EACA,IAAI,CAAC,GAAG,sBAAsB,UAAU,KAAK,SAAS,MAAM,GAC1D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;CAEzF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;AAOA,SAAgB,QACd,IACA,KACA,UACA,MACM;CACN,MAAM,QAAQ,IAAI,MAAA,CAAkB;CACpC,MAAM,MAAM,IAAI,MAAA,CAAkB;CAClC,IAAI;EACF,IAAI,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG,CAAC;EACtC,IAAI,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG,CAAC;EACtC,IAAI,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC;EAClC,IAAI,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC;EAClC,IAAI,CAAC,GAAG,kBAAkB,UAAU,OAAO,GAAG,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;CAErF,UAAU;EACR,IAAI,KAAK,KAAK;EACd,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;AAUA,SAAgB,WACd,IACA,KACA,UACA,SACM;CACN,GAAG,wBAAwB,QAAQ;CACnC,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,WAAW,GAAG;EACzB,MAAM,MAAM,IAAI,MAAM,OAAO,SAAA,CAAqB;EAClD,IAAI;GACF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACtC,MAAM,MAAM,IAAA;IACZ,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,GAAG;IACtC,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,MAAM,CAAC;GAC5C;GACA,IAAI,GAAG,uBAAuB,UAAU,KAAK,OAAO,MAAM,IAAI,GAC5D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;EAExF,UAAU;GACR,IAAI,KAAK,GAAG;EACd;CACF;AACF;;;;;;AAOA,SAAgB,eAAe,IAAkB,UAAe,SAA4B;CAC1F,IACE,CAAC,GAAG,yBACF,UACA,iBAAiB,QAAQ,KAAK,GAC9B,iBAAiB,QAAQ,GAAG,CAC9B,GAEA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;AAE5F;;;;;;;;;AAUA,SAAgB,qBACd,IACA,UACA,UACA,UACA,OACM;CACN,IACE,CAAC,GAAG,+BACF,UACA,UACA,UACA,MAAM,IAAI,KACV,MAAM,IAAI,KACV,MAAM,IAAI,GACZ,GAEA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,+CAA+C;AAElG;;;;;;;;AASA,SAAgB,mCACd,IACA,UACA,QACA,UACA,OACM;CACN,IACE,CAAC,GAAG,6CACF,UACA,QACA,UACA,MAAM,IAAI,KACV,MAAM,IAAI,KACV,MAAM,IAAI,GACZ,GAEA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,6DACF;AAEJ;;;;;;AAOA,SAAgB,iBAAiB,IAAkB,UAAe,MAAoB;CACpF,IAAI,CAAC,GAAG,2BAA2B,UAAU,IAAI,GAC/C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,2CAA2C;AAE9F;;;;;;AAOA,SAAgB,UAAU,IAAkB,UAAe,MAAoB;CAC7E,IAAI,CAAC,GAAG,oBAAoB,UAAU,IAAI,GACxC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC;AAEvF;;;;;;;;;;;;AAaA,SAAgB,eACd,IACA,KACA,UACA,MACM;CACN,MAAM,MAAM,IAAI,eAAe,IAAI;CACnC,IAAI;EACF,IAAI,CAAC,GAAG,yBAAyB,UAAU,GAAG,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;CAE5F,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;AAMA,SAAgB,qBAAqB,IAAkB,UAAe,QAAuB;CAC3F,IAAI,CAAC,GAAG,+BAA+B,UAAU,MAAM,GACrD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,+CAA+C;AAElG;AAEA,SAAgB,eACd,IACA,KACA,UACA,QACM;CACN,MAAM,MAAM,IAAI,MAAM,OAAO,SAAA,CAAqB;CAClD,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACtC,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,GAAG;GACtC,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,MAAM,CAAC;EAC5C;EACA,IAAI,CAAC,GAAG,yBAAyB,UAAU,KAAK,OAAO,MAAM,GAC3D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;CAE5F,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;;;;;;;AC5cA,SAAgB,yBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,aAAa,KAAA,GACrB,wBAAwB,IAAI,KAAK,UAAU,YAAY,MAAM,QAAQ;CAEvE,IAAI,MAAM,YAAY,KAAA,GACpB,wBAAwB,IAAI,KAAK,UAAU,QAAQ,MAAM,OAAO;CAElE,IAAI,MAAM,OAAO,KAAA,KAAa,MAAM,GAAG,SAAS,GAC9C,iBAAiB,IAAI,KAAK,UAAU,MAAM,MAAM,EAAE;CAEpD,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;AAE3C;;;;;;;;;;;;;AAcA,SAAgB,yBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,aAAa,KAAA,GACrB,wBAAwB,IAAI,KAAK,UAAU,YAAY,MAAM,QAAQ;CAEvE,IAAI,MAAM,YAAY,KAAA,GACpB,wBAAwB,IAAI,KAAK,UAAU,QAAQ,MAAM,OAAO;CAElE,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;AAE3C;;;;;;;AAQA,SAAgB,sBACd,IACA,KACA,UACA,aACM;CACN,IAAI,YAAY,WAAW,GAAG;CAC9B,iBAAiB,IAAI,KAAK,UAAU,KAAK,WAAW;AACtD;;;;;;AAOA,SAAgB,kBACd,IACA,KACA,UACA,IACM;CACN,IAAI,GAAG,WAAW,GAAG;CACrB,iBAAiB,IAAI,KAAK,UAAU,MAAM,EAAE;AAC9C;;;;;;;;;;;;;;;AAgBA,SAAgB,wBACd,IACA,KACA,UACA,sBAAY,IAAI,KAAK,GACf;CACN,iBAAiB,IAAI,KAAK,UAAU,KAAK,cAAc,GAAG,CAAC;AAC7D;;;;;;;;;;;;;AC3GA,SAAgB,uBACd,SACA,UACoB;CACpB,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,SAAS,GAAG,0BAA0B,QAAQ;CACpD,IAAI,SAAS,GAAG,OAAO;EAAE,MAAM;EAAgB,OAAO;CAAO;CAC7D,MAAM,KAAK,gBAAgB,IAAI,KAAK,UAAU,IAAI;CAClD,IAAI,OAAO,QAAQ,GAAG,SAAS,GAAG,OAAO;EAAE,MAAM;EAAM,OAAO;CAAG;CACjE,MAAM,SAAS,aAAa;CAC5B,kBAAkB,IAAI,KAAK,UAAU,MAAM;CAC3C,OAAO;EAAE,MAAM;EAAM,OAAO;CAAO;AACrC;;;;;;;;;;;;;;;;ACVA,SAAgB,gBACd,SACA,SACA,SACA,KACK;CACL,MAAM,EAAE,IAAI,QAAQ;CACpB,QAAQ,IAAI,MAAZ;EACE,KAAK,gBAAgB;GACnB,MAAM,WAAW,GAAG,gCAAgC,SAAS,IAAI,iBAAiB;GAClF,IAAI,CAAC,UACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,oCAAoC,IAAI,kBAAkB,WAAW,IAAI,kBAC3E;GAEF,OAAO;EACT;EACA,KAAK,MAAM;GACT,MAAM,UAAU,IAAI,eAAe,IAAI,EAAE;GACzC,IAAI;IACF,MAAM,WAAW,GAAG,wBAAwB,SAAS,OAAO;IAC5D,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,2BAA2B,IAAI,GAAG,YAAY,IAAI,kBACpD;IAEF,OAAO;GACT,UAAU;IACR,IAAI,KAAK,OAAO;GAClB;EACF;EACA,KAAK,SAAS;GACZ,QAAQ,iBAAiB,IAAI,QAAQ;GACrC,MAAM,WAAW,GAAG,kBAAkB,SAAS,IAAI,KAAK;GACxD,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,SAAS,IAAI,MAAM,wBAAwB,IAAI,kBACjD;GAEF,OAAO;EACT;CACF;CACA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;AACrF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkDA,SAAgB,sBAAsB,QAAkD;CACtF,MAAM,EAAE,UAAU,iBAAiB,gBAAgB,YAAY;CAE/D,IAAI,EAAA,GAAA,8BAAA,gCAAA,CAAiC,QAAQ,GAC3C,OAAO;EACL,eAAe,CAAC,cAAc;EAC9B,YAAY;EACZ;EACA,qBAAqB;EACrB,eAAe;CACjB;CAIF,MAAM,uBAAA,GAAA,8BAAA,yBAAA,CACJ,UACA,gBAAgB,mBAClB;CACA,OAAO;EACL,eAAe,CAAC,cAAc;EAC9B,YAAY;EACZ;EACA;EACA,eAAe,sBAAsB,EAAE,QAAQ,sBAAsB,IAAI;CAC3E;AACF;;;;;;;;;;;;;;;ACzHA,SAAgB,sBACd,IACA,KACA,UACA,kBACA,OACA,UACA,KACe;CACf,MAAM,OAAO,mBAAmB,IAAI,KAAK,IAAI,QAAQ,UAAU,kBAAkB,OAAO,QAAQ;CAChG,MAAM,cAAc,GAAG,qBAAqB,QAAQ;CACpD,MAAM,EAAE,WAAW,WAAW,WAAW;CACzC,OAAO,OAAO,IAAI,KAAK,UAAU,MAAM,aAAa,GAAG;AACzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACHA,MAAM,qBAAqB;AAC3B,MAAM,cAAc;AACpB,MAAM,eAAe;AACrB,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;;;;;;;;;;;;AAoBvB,SAAgB,2BACd,IACA,KACA,UACA,OACM;CACN,IAAI,CAAC,SAAU,CAAC,MAAM,UAAU,CAAC,MAAM,SAAU;CAEjD,GAAG,iCAAiC,UAAU,oBAAA,CAAgD;CAE9F,IAAI,MAAM,QAAQ;EAChB,kBAAkB,IAAI,KAAK,UAAU,aAAa,MAAM,MAAM;EAC9D,kBAAkB,IAAI,KAAK,UAAU,gBAAgB,MAAM,MAAM;EACjE,kBAAkB,IAAI,KAAK,UAAU,gBAAgB,MAAM,MAAM;CACnE;CACA,IAAI,MAAM,SACR,kBAAkB,IAAI,KAAK,UAAU,cAAc,MAAM,OAAO;AAEpE;;;;;;;;;;;;;;;;;AAkBA,SAAgB,2BACd,IACA,KACA,UACA,OACM;CACN,IAAI,CAAC,SAAU,CAAC,MAAM,UAAU,CAAC,MAAM,SAAU;CAEjD,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GACzC,GAAG,iCAAiC,UAAU,oBAAA,CAAgD;CAEhG,IAAI,MAAM,QACR,kBAAkB,IAAI,KAAK,UAAU,gBAAgB,MAAM,MAAM;CAEnE,IAAI,MAAM,SACR,kBAAkB,IAAI,KAAK,UAAU,cAAc,MAAM,OAAO;AAEpE;AAEA,SAAS,kBACP,IACA,KACA,UACA,KACA,OACM;CAIN,MAAM,MAAM,IAAI,eAAe,KAAK;CACpC,IAAI;EACF,GAAG,iCAAiC,UAAU,KAAK,GAAG;CACxD,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA,MAAM,eAAe;AACrB,MAAM,qBAAqB;;;AAa3B,SAAS,oBAAoB,IAAkB,UAAqB;CAClE,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GACzC,GAAG,iCAAiC,UAAU,iBAAA,CAA6C;AAE/F;AAEA,SAAS,YAAY,IAAkB,UAAe,UAAwB;CAC5E,oBAAoB,IAAI,QAAQ;CAChC,GAAG,iCAAiC,UAAU,cAAc,QAAQ;AACtE;AAEA,SAAS,iBACP,IACA,KACA,UACA,MACM;CACN,oBAAoB,IAAI,QAAQ;CAChC,MAAM,MAAM,IAAI,MAAA,EAAiB;CACjC,IAAI;EAEF,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC;EACjC,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC;EAChC,IAAI,KAAK,KAAK,OAAO,KAAK,OAAO,CAAC;EAClC,IAAI,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE;EACpC,GAAG,+BAA+B,UAAU,oBAAoB,GAAG;CACrE,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;AASA,SAAgB,0BACd,IACA,KACA,UACA,GACM;CACN,IAAI,EAAE,aAAa,KAAA,GACjB,IAAI,EAAE,aAAa,QAAQ,EAAE,aAAa,GAAG;EAI3C,IAAI,EAFF,EAAE,iBAAiB,QAClB,EAAE,kBAAkB,KAAA,KAAa,4BAA4B,IAAI,KAAK,QAAQ,KAAK,OAEpF,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iHACF;EAEF,YAAY,IAAI,UAAU,EAAE,QAAQ;CACtC,OACE,GAAG,gCAAgC,UAAU,YAAY;CAG7D,IAAI,EAAE,kBAAkB,KAAA,GACtB,IAAI,EAAE,kBAAkB,MAAM,iBAAiB,IAAI,KAAK,UAAU,EAAE,aAAa;MAC5E,GAAG,gCAAgC,UAAU,kBAAkB;AAExE;;;;;;;;AASA,SAAgB,6BACd,IACA,UACA,GACM;CACN,IAAI,EAAE,aAAa,KAAA,GAAW;CAC9B,IAAI,EAAE,aAAa,QAAQ,EAAE,aAAa,GAAG,YAAY,IAAI,UAAU,EAAE,QAAQ;MAC5E,GAAG,gCAAgC,UAAU,YAAY;CAC9D,GAAG,gCAAgC,UAAU,kBAAkB;AACjE;;;;AC1HA,MAAM,sBAA6B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;AAGxD,MAAMC,oBAAkB;;;;;;;;;AAUxB,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE1C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CACD,cAAc,IAAI,UAAU,MAAM,SAAS,mBAAmB;CAC9D,gBAAgB,IAAI,UAAU,MAAM,WAAWA,iBAAe;CAC9D,IAAI,MAAM,WAAW,KAAA,GAAW,UAAU,IAAI,UAAU,kBAAkB,MAAM,MAAM,CAAC;CACvF,IAAI,MAAM,mBAAmB,MAC3B,wBAAwB,IAAI,UAAU,MAAM,eAAe;AAE/D;;;;;AAMA,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,aAAa,KAAA,KAAa,MAAM,kBAAkB,KAAA,GAC1D,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CAEH,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,WAAW,KAAA,GACnB,UAAU,IAAI,UAAU,kBAAkB,MAAM,MAAM,CAAC;CAEzD,IAAI,MAAM,oBAAoB,MAC5B,0BAA0B,IAAI,QAAQ;MACjC,IAAI,MAAM,oBAAoB,KAAA,GACnC,wBAAwB,IAAI,UAAU,MAAM,eAAe;AAE/D;;;;;AAMA,SAAgB,eAAe,SAAqC;CAClE,OAAO,YAAY;AACrB;;;;AC3EA,MAAM,gCAAuC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAEpE,MAAMC,oBAAkB;;;;;;AAOxB,SAAgB,6BACd,OACA,KACM;CACN,oBAAoB,MAAM,MAAM,GAAG;CACnC,IAAI,KAAK,WAAW,KAAA,GAClB,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,6DACF;AAEJ;;;;;;;;;;;;;;AAeA,SAAgB,yBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,cAAc,IAAI,UAAU,MAAM,SAAS,6BAA6B;CACxE,gBAAgB,IAAI,UAAU,MAAM,WAAWF,iBAAe;CAC9D,sBAAsB,IAAI,UAAU,MAAM,QAAQ,WAAW;CAC7D,WAAW,IAAI,KAAK,UAAU,MAAM,MAAM,oBAAoB,MAAM,MAAM,GAAG,GAAG,IAAK,MAAO;AAC9F;;AAGA,SAAgB,yBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,SAAS,KAAA,GACjB,sBAAsB,IAAI,UAAU,MAAM,IAAI;AAElD;AAEA,SAAgB,wBAAwB,SAA+C;CACrF,OAAO,YAAY;AACrB;AAEA,SAAS,sBACP,IACA,UACA,MACM;CACN,IAAI,CAAC,GAAG,kBAAkB,UAAU,kBAAkB,KAAK,GACzD,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;AAErF;AAEA,SAAS,oBACP,MACA,KACc;CACd,MAAM,WAAW,KAAK,YAAY,KAAK;CACvC,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wCAAwC,KAAK,SAAS,sDACxD;CAEF,OAAO;AACT;AAEA,SAAS,WACP,IACA,KACA,UACA,MACA,UACA,QACM;CACN,MAAM,UAAU,IAAI,eAAe,KAAK,IAAI;CAC5C,IAAI;CACJ,IAAI;EACF,gBAAgB,GAAG,4BAA4B,UAAU,OAAO;CAClE,UAAU;EACR,IAAI,KAAK,OAAO;CAClB;CACA,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,2CAA2C;CAG5F,2BAA2B,IAAI,KAAK,eAAe,QAAQ,MAAM,QAAQ;AAC3E;;;;;;;;;;;;;AChHA,SAAgB,uBACd,IACA,UACA,YACA,UACA,OACA,KACM;CACN,IAAI,eAAe,UAAU,GAAG;EAC9B,qBAAqB,IAAI,UAAU,mBAAmB,UAAU,GAAG,UAAU,KAAK;EAClF;CACF;CACA,IAAI,CAAC,KAAK,yBACR,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,eAAe,WAAW,wEAC5B;CAEF,mCACE,IACA,UACA,IAAI,wBAAwB,UAAU,GACtC,UACA,KACF;AACF;ACnBA,MAAa,gBAAuB;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;;;;;;;;AAUzD,SAAgB,wBACd,IACA,KACA,UACA,OACM;CACN,cAAc,IAAI,UAAU,MAAM,SAAS,aAAa;CACxD,gBAAgB,IAAI,UAAU,MAAM,WAAA,CAA0B;CAC9D,iBAAiB,IAAI,KAAK,UAAU,KAAK;AAC3C;;;;;;;AAQA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,eACE,IACA,UACA,kBAAkB,MAAM,eAAe,OAAO,GAC9C,MAAM,eAAA,CACR;CACA,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,UAAU,SAAS,GAC5D,qBAAqB,IAAI,KAAK,UAAU,MAAM,SAAS;AAE3D;;;;;;;AAQA,SAAgB,wBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,iBAAiB,IAAI,KAAK,UAAU,KAAK;AAC3C;;;;;;;;AASA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,gBAAgB,KAAA,KAAa,MAAM,gBAAgB,KAAA,GAAW;EACtE,MAAM,UAAU,gBAAgB,IAAI,KAAK,QAAQ;EACjD,MAAM,QAAQ,MAAM,eAAe,oBAAoB,QAAQ,SAAS;EACxE,MAAM,QAAQ,MAAM,eAAe,QAAQ;EAC3C,eAAe,IAAI,UAAU,kBAAkB,KAAK,GAAG,KAAK;CAC9D;CACA,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,UAAU,SAAS,GAC5D,qBAAqB,IAAI,KAAK,UAAU,MAAM,SAAS;AAE3D;;;;;;AAOA,SAAgB,sBACd,IACA,KACA,UACA,OACM;CACN,MAAM,WAAW,MAAM,iBAAiB;CACxC,IAAI,aAAa,MACf,gBAAgB,IAAI,UAAU,oBAAoB,aAAa;MAE/D,cAAc,IAAI,UAAU,UAAU,oBAAoB,aAAa;CAEzE,wBAAwB,IAAI,KAAK,UAAU,KAAK;AAClD;;;;;AAMA,SAAgB,sBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,kBAAkB,KAAA,GAC1B,IAAI,MAAM,kBAAkB,MAC1B,gBAAgB,IAAI,UAAU,oBAAoB,aAAa;MAE/D,cAAc,IAAI,UAAU,MAAM,eAAe,oBAAoB,aAAa;CAGtF,wBAAwB,IAAI,KAAK,UAAU,KAAK;AAClD;;;;;;;;AC/HA,MAAM,yBAAgC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;;;;;;;;;;;;;;;;;AAqBzD,SAAgB,mBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE1C,MAAM,aAAa,MAAM,iBAAiB;CAC1C,IAAI,eAAe,MACjB,gBAAgB,IAAI,UAAU,oBAAoB,KAAK;MAEvD,cAAc,IAAI,UAAU,YAAY,oBAAoB,KAAK;CAEnE,gBAAgB,IAAI,UAAU,MAAM,WAAA,CAA0B;CAE9D,iBAAiB,IAAI,KAAK,UAAU,KAAK;CAEzC,MAAM,UAAU,MAAM,SAAS;CAC/B,uBAAuB,IAAI,UAAU,MAAM,YAAY,MAAM,UAAU,SAAS,GAAG;CACnF,IAAI,MAAM,cAAc,KAAA,GACtB,cAAc,IAAI,UAAU,MAAM,WAAW,oBAAoB,SAAS;CAG5E,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;CACnE,UAAU,IAAI,UAAU,qBAAqB,MAAM,MAAM,CAAC;CAE1D,IAAI,MAAM,mBAAmB,MAC3B,wBAAwB,IAAI,UAAU,MAAM,eAAe;CAG7D,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,KAAK,UAAU,MAAM,WAAW;CAErD,IAAI,MAAM,eAAe,KAAA,GACvB,eAAe,IAAI,UAAU;EAAE,OAAO;EAAQ,KAAK,MAAM;CAAW,CAAC;CAMvE,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;AACH;;;;;;;;;;;;;;;AAgBA,SAAgB,mBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAK5C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CAED,IAAI,MAAM,kBAAkB,KAAA,GAC1B,IAAI,MAAM,kBAAkB,MAC1B,gBAAgB,IAAI,UAAU,oBAAoB,KAAK;MAEvD,cAAc,IAAI,UAAU,MAAM,eAAe,oBAAoB,KAAK;CAG9E,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAG7C,iBAAiB,IAAI,KAAK,UAAU,KAAK;CAEzC,IAAI,MAAM,eAAe,KAAA,KAAa,MAAM,aAAa,KAAA,KAAa,MAAM,UAAU,KAAA,GAAW;EAC/F,MAAM,MAAM,sBAAsB,IAAI,KAAK,QAAQ;EACnD,uBACE,IACA,UACA,MAAM,eAAe,MAAM,qBAAqB,IAAI,QAAQ,IAAA,cAC5D,MAAM,aAAa,OAAO,IAAI,WAAW,IAAI,IAAI,WAAW,KAC5D,MAAM,SAAS,KAAK,SAAS,wBAC7B,GACF;CACF;CACA,IAAI,MAAM,cAAc,KAAA,GACtB,cAAc,IAAI,UAAU,MAAM,WAAW,oBAAoB,SAAS;CAG5E,IAAI,MAAM,cAAc,KAAA,GACtB,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;CAErE,IAAI,MAAM,WAAW,KAAA,GACnB,UAAU,IAAI,UAAU,qBAAqB,MAAM,MAAM,CAAC;CAG5D,IAAI,MAAM,oBAAoB,MAC5B,0BAA0B,IAAI,QAAQ;MACjC,IAAI,MAAM,oBAAoB,KAAA,GACnC,wBAAwB,IAAI,UAAU,MAAM,eAAe;CAG7D,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,KAAK,UAAU,MAAM,WAAW;CAErD,IAAI,MAAM,eAAe,KAAA,GACvB,eAAe,IAAI,UAAU;EAAE,OAAO;EAAQ,KAAK,MAAM;CAAW,CAAC;AAEzE;;;;;AAMA,SAAgB,kBAAkB,SAAyC;CACzE,OAAO,YAAY;AACrB;;;;;;;;;;;;AC5KA,SAAgB,cACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,WAAW,KAAA,GAAW,UAAU,IAAI,UAAU,gBAAgB,MAAM,MAAM,CAAC;CACrF,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,wBAAwB,IAAI,KAAK,UAAU,KAAK;CAChD,WAAW,IAAI,KAAK,UAAU,MAAM,OAAO;CAE3C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,cACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,WAAW,KAAA,GAAW,UAAU,IAAI,UAAU,gBAAgB,MAAM,MAAM,CAAC;CACrF,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,wBAAwB,IAAI,KAAK,UAAU,KAAK;CAChD,IAAI,MAAM,YAAY,KAAA,GACpB,WAAW,IAAI,KAAK,UAAU,MAAM,OAAO;CAG7C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;;;;;AAMA,SAAgB,aAAa,SAAmC;CAC9D,OAAO,YAAY;AACrB;;;;ACjDA,MAAME,yBAAuB;CAAE,OAAO;CAAQ,KAAK;AAAO;;;;;;;;;AAU1D,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,QAAQ,IAAI,KAAK,UAAU,MAAM,UAAU;CAC3C,eAAe,IAAI,UAAU,MAAM,eAAeA,sBAAoB;CAEtE,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,IAAI,MAAM,eAAe,KAAA,GACvB,QAAQ,IAAI,KAAK,UAAU,MAAM,UAAU;CAG7C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;CACvE,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,UAAU,MAAM,WAAW;AAElD;;;;;AAMA,SAAgB,cAAc,SAAoC;CAChE,OAAO,YAAY;AACrB;;;;;;;;;;;;;ACjCA,SAAgB,eACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAG1C,IAAI,MAAM,QAAQ,gBAAgB,IAAI,KAAK,UAAU,MAAM,QAAQ,GAAG;AACxE;AAEA,SAAgB,eACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GAAW,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CACxE,IAAI,MAAM,WAAW,MAAM,gBAAgB,IAAI,QAAQ;MAClD,IAAI,MAAM,WAAW,KAAA,GAAW,gBAAgB,IAAI,KAAK,UAAU,MAAM,QAAQ,GAAG;AAC3F;;;;;;;AAQA,SAAS,gBAAgB,IAAkB,UAAqB;CAC9D,IAAI,CAAC,GAAG,uBAAuB,QAAQ,KAAK,CAAC,GAAG,qBAAqB,QAAQ,GAC3E,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,6BAA6B;AAEhF;AAEA,SAAgB,cAAc,SAAoC;CAChE,OAAO,YAAY;AACrB;AAEA,SAAS,gBACP,IACA,KACA,UACA,QACA,KACM;CACN,MAAM,SAAS,KAAK;CACpB,IAAI,CAAC,QACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wEACF;CAGF,MAAM,YACJ,OAAO,SAAS,QACZ,GAAG,qBAAqB,QAAQ,OAAO,GAAG,IAC1C,GAAG,sBAAsB,QAAQ,kBAAkB,IAAI,KAAK,QAAQ,OAAO,WAAW,CAAC;CAC7F,IAAI,CAAC,WACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qBAAqB,OAAO,KAAK,SAAS;CAE3F,IAAI,CAAC,GAAG,oBAAoB,UAAU,SAAS,GAC7C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;AAExF;;;;;;AAOA,SAAS,kBACP,IACA,KACA,QACA,MACK;CACL,MAAM,UAAU,GAAG,+BAA+B,QAAQ,KAAK,gBAAgB;CAC/E,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,qDAAqD,KAAK,kBAC5D;CAEF,IAAI;EACF,MAAM,UACJ,KAAK,SAAS,QAEV,GAAG,mBACD,SACA,KAAK,QAAQ,MACb,KAAK,QAAQ,GACb,KAAK,OAAO,MACZ,KAAK,OAAO,GACZ,KAAK,QAAQ,MACb,KAAK,QAAQ,CACf,IACA,sBAAsB,IAAI,KAAK,SAAS,IAAI;EAClD,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qBAAqB,KAAK,KAAK,cAAc;EAE9F,OAAO;CACT,UAAU;EACR,GAAG,eAAe,OAAO;CAC3B;AACF;AAEA,SAAS,sBACP,IACA,KACA,SACA,MACK;CAIL,MAAM,gBAA0B;EAC9B,QAAQ,KAAK,MAAb;GACE,KAAK;GACL,KAAK,SACH,OAAO,KAAK,OAAO,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;GAC1C,KAAK;GACL,KAAK,SACH,OAAO,KAAK,QAAQ,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;GAC5C,KAAK,QACH,OAAO;IAAC,KAAK;IAAM,KAAK;IAAQ,KAAK;IAAO,KAAK;GAAG;GACtD,SACE,OAAO,CAAC;EACZ;CACF,EAAA,CAAG;CAEH,MAAM,OAAO,kBAAkB,KAAK;CACpC,IAAI,CAAC,OAAO,QAAQ,OAAO,GAAG,oBAAoB,SAAS,MAAMC,yBAAAA,UAAU,CAAC;CAC5E,OAAO,YAAY,KAAK,OAAO,SAAA,IAAqB,QAAQ;EAC1D,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,IAAI,KAAK,KAAK,OAAO,OAAO,IAAK,IAAA,CAAa;EACtF,OAAO,GAAG,oBAAoB,SAAS,MAAM,KAAK,OAAO,MAAM;CACjE,CAAC;AACH;;;;;;;;AC3IA,MAAMC,oBAAkB;;;;;AAMxB,MAAM,0BAAiC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAC9D,MAAM,4BAAmC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;;;;;;;;;AAgB5D,SAAgB,qBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,MAAM,aAAa,MAAM;CACzB,IAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GACtD,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sBAAsB,MAAM,QAAQ,kCACtC;CAEF,iBAAiB,IAAI,KAAK,UAAU,UAAU;CAC9C,sBAAsB,IAAI,KAAK,UAAU,UAAU;CAEnD,MAAM,WACJ,MAAM,YAAY,cAAc,0BAA0B;CAC5D,cAAc,IAAI,UAAU,MAAM,SAAS,QAAQ;CACnD,gBAAgB,IAAI,UAAU,MAAM,WAAWF,iBAAe;CAC9D,IAAI,MAAM,YAAY,eAAe,MAAM,WAAW,KAAA,GACpD,UAAU,IAAI,UAAU,sBAAsB,MAAM,MAAM,CAAC;AAE/D;;;;;;;;;;;;;;AAeA,SAAgB,qBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,YAAY,eAAe,MAAM,WAAW,KAAA,GACpD,UAAU,IAAI,UAAU,sBAAsB,MAAM,MAAM,CAAC;CAE7D,IAAI,MAAM,eAAe,KAAA,GAAW;EAClC,IAAI,MAAM,WAAW,WAAW,GAC9B,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+DACF;EAEF,kBAAkB,IAAI,KAAK,UAAU,MAAM,UAAU;EACrD,sBAAsB,IAAI,KAAK,UAAU,MAAM,UAAU;CAC3D;AACF;;;;;;AAOA,SAAgB,oBACd,SACiE;CACjE,OACE,YAAY,eACZ,YAAY,eACZ,YAAY,cACZ,YAAY;AAEhB;AAEA,SAAgB,iBACd,IACA,KACA,UACA,YACM;CACN,MAAM,MAAM,IAAI,MAAM,EAAE;CACxB,IAAI;EACF,KAAK,MAAM,MAAM,YAAY;GAC3B,qBAAqB,KAAK,KAAK,EAAE;GAEjC,IAAI,CADO,GAAG,iCAAiC,UAAU,GACnD,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,iDACF;EAEJ;CACF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;AAWA,SAAgB,kBACd,IACA,KACA,UACA,YACM;CACN,MAAM,WAAW,GAAG,gCAAgC,QAAQ;CAC5D,IAAI,WAAW,SAAS,UACtB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oDAAoD,SAAS,mBAAmB,WAAW,OAAO,EACpG;CAGF,MAAM,MAAM,IAAI,MAAM,EAAE;CACxB,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;GACjC,qBAAqB,KAAK,KAAK,WAAW,EAAG;GAE7C,IAAI,CADO,GAAG,8BAA8B,UAAU,GAAG,GACnD,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,iDAAiD,GACnD;EAEJ;EACA,KAAK,IAAI,IAAI,UAAU,IAAI,WAAW,QAAQ,KAAK;GACjD,qBAAqB,KAAK,KAAK,WAAW,EAAG;GAE7C,IAAI,CADO,GAAG,iCAAiC,UAAU,GACnD,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,oDAAoD,GACtD;EAEJ;CACF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;AAEA,SAAS,qBAAqB,KAAuB,KAAU,IAAmB;CAGhF,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;CAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;CAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;CAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;AAClC;AAEA,SAAgB,sBACd,IACA,KACA,UACA,YACM;CACN,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,KAAK,MAAM,MAAM,YACf,KAAK,MAAM,KAAK;EAAC,GAAG;EAAI,GAAG;EAAI,GAAG;EAAI,GAAG;CAAE,GAAG;EAC5C,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;EACzB,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;EACzB,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;EACzB,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;CAC3B;CAIF,aAAa,IAAI,KAAK,UAAU;EAAE,MAAM;EAAM,KAAK;EAAM,OAAO;EAAM,QAAQ;CAAK,CAAC;AACtF;;;;;AC1NA,MAAM,uBAA8B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;;;AAKzD,MAAM,sBAA6B;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;AAEtD,MAAM,oBAAoB;;;;;;;AAQ1B,SAAS,kBAAkB,GAKf;CACV,OACG,EAAE,gBAAgB,KAAA,KAAa,EAAE,gBAAgB,QAClD,EAAE,eAAe,KAAA,KACjB,EAAE,aAAa,KAAA,KACf,EAAE,cAAc,KAAA;AAEpB;;;;;;;;;;;;;;;;;AAkBA,SAAgB,iBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,IAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAChD,iBAAiB,IAAI,KAAK,UAAU,MAAM,UAAU;CAGtD,cAAc,IAAI,UAAU,MAAM,SAAS,sBAAsB,oBAAoB,KAAK;CAC1F,gBAAgB,IAAI,UAAU,MAAM,WAAA,CAA0B;CAC9D,MAAM,OAAO,MAAM,iBAAiB;CACpC,IAAI,SAAS,MACX,cAAc,IAAI,UAAU,MAAM,oBAAoB,aAAa;CAGrE,IAAI,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,SAAS,GAChE,eAAe,IAAI,KAAK,UAAU,MAAM,WAAW;CAErD,IAAI,MAAM,QACR,qBAAqB,IAAI,UAAU,IAAI;CAEzC,IAAI,kBAAkB,KAAK,GACzB,uBACE,IACA,UACA,MAAM,cAAA,aACN,MAAM,YAAY,mBAClB,MAAM,aAAa,qBACnB,GACF;CAEF,IAAI,MAAM,cAAc,KAAA,GACtB,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;AAEvE;;;;;;;;;AAUA,SAAgB,iBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,eAAe,KAAA,GAAW;EAClC,kBAAkB,IAAI,KAAK,UAAU,MAAM,UAAU;EACrD,IAAI,MAAM,SAAS,KAAA,GACjB,sBAAsB,IAAI,KAAK,UAAU,MAAM,UAAU;CAE7D;CAEA,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,OAAO,oBAAoB,KAAK;CAEpE,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,kBAAkB,KAAA,GAC1B,IAAI,MAAM,kBAAkB,MAC1B,gBAAgB,IAAI,UAAU,oBAAoB,aAAa;MAE/D,cAAc,IAAI,UAAU,MAAM,eAAe,oBAAoB,aAAa;CAItF,IAAI,MAAM,gBAAgB,KAAA,GAGxB,eAAe,IAAI,KAAK,UAAU,MAAM,eAAe,EAAE;CAE3D,IAAI,MAAM,WAAW,KAAA,GACnB,qBAAqB,IAAI,UAAU,MAAM,MAAM;CAEjD,IAAI,kBAAkB,KAAK,GACzB,uBACE,IACA,UACA,MAAM,cAAA,aACN,MAAM,YAAY,mBAClB,MAAM,aAAa,qBACnB,GACF;CAEF,IAAI,MAAM,cAAc,KAAA,GACtB,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;AAEvE;;;;;AAMA,SAAgB,gBAAgB,SAAsC;CACpE,OAAO,YAAY;AACrB;;;;;;;;;;;;ACxJA,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAE9C,IAAI,MAAM,mBAAmB,QAAQ,MAAM,kBAAkB,GAC3D,gBAAgB,IAAI,UAAU,MAAM,eAAe;CAErD,IAAI,MAAM,mBAAmB,MAC3B,wBAAwB,IAAI,UAAU,MAAM,eAAe;CAI7D,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;AACH;;;;;;AAOA,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAK5C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CACD,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAE9C,IAAI,MAAM,oBAAoB,KAAA,GAC5B,IAAI,MAAM,oBAAoB,QAAQ,MAAM,kBAAkB,GAC5D,gBAAgB,IAAI,UAAU,MAAM,eAAe;MAKnD,kBAAkB,IAAI,QAAQ;CAGlC,IAAI,MAAM,oBAAoB,MAC5B,0BAA0B,IAAI,QAAQ;MACjC,IAAI,MAAM,oBAAoB,KAAA,GACnC,wBAAwB,IAAI,UAAU,MAAM,eAAe;AAE/D;;;;;AAMA,SAAgB,eAAe,SAAiD;CAC9E,OAAO,YAAY,YAAY,YAAY;AAC7C;;;;ACjFA,MAAM,oBAA8C;CAClD,SAAS;CACT,OAAO;CACP,MAAM;AACR;;;;;;AAOA,SAAgB,oBAAoB,OAAuB,KAAoC;CAC7F,IAAI,MAAM,SAAS,KAAA,GAAW,qBAAqB,MAAM,IAAI;CAC7D,gBAAgB,MAAM,OAAO,SAAS;CACtC,oBAAoB,MAAM,QAAQ,GAAG;AACvC;AAEA,SAAgB,oBAAoB,OAAuB,KAAoC;CAC7F,IAAI,MAAM,SAAS,KAAA,GAAW,qBAAqB,MAAM,IAAI;CAC7D,gBAAgB,MAAM,OAAO,SAAS;CACtC,IAAI,MAAM,WAAW,KAAA,GAAW,oBAAoB,MAAM,QAAQ,GAAG;AACvE;;;;;;;;;;;;AAaA,SAAgB,gBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,UAAU,MAAM,IAAI;CAEvC,sBACE,IACA,KACA,UACA,MAAM,QACN,MAAM,OAAO,WACb;EACE,MAAM,MAAM;EAGZ,eAAe,MAAM,iBAAiB,KAAA;EACtC,UAAU,MAAM,YAAY,KAAA;CAC9B,GACA,GACF;AACF;AAEA,SAAgB,gBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,UAAU,MAAM,IAAI;CAEvC,IAAI,MAAM,WAAW,KAAA,GAAW;EAI9B,MAAM,OAAO,MAAM,QAAQ,cAAc,IAAI,KAAK,QAAQ;EAC1D,sBACE,IACA,KACA,UACA,MAAM,QACN,MAAM,OAAO,WACb;GACE;GACA,eAAe,MAAM,iBAAiB,KAAA;GACtC,UAAU,MAAM,YAAY,KAAA;EAC9B,GACA,GACF;EACA;CACF;CAEA,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAM5C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CACD,IACE,MAAM,SAAS,KAAA,KACf,MAAM,QAAQ,KAAA,KACd,MAAM,aAAa,KAAA,KACnB,MAAM,kBAAkB,KAAA,GAGxB,gBAAgB,IAAI,UAAU,MAAM,OAAO,SAAS;AAExD;AAEA,SAAgB,eAAe,SAAqC;CAClE,OAAO,YAAY;AACrB;AAEA,SAAS,aAAa,IAAkB,UAAe,MAAoB;CACzE,MAAM,OAAO,mBAAmB;CAChC,IAAI,SAAS,KAAA,GACX,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;CAExF,IAAI,CAAC,GAAG,kBAAkB,UAAU,IAAI,GACtC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;AAErF;AAEA,SAAS,qBAAqB,MAAsB;CAClD,MAAM,OAAO,mBAAmB;CAChC,IAAI,SAAS,KAAA,GACX,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uBAAuB,KAAK,sBAAsB,OAAO,KAAK,kBAAkB,CAAC,CAAC,KAAK,IAAI,GAC7F;CAEF,OAAO;AACT;AAEA,SAAS,gBAAgB,KAAqB;CAC5C,IAAI,kBAAkB,SAAS,KAAA,GAC7B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sBAAsB,OAAO,GAAG,EAAE,oCACpC;AAEJ;AAEA,SAAS,qBACP,KACA,KACc;CACd,MAAM,WAAW,KAAK,YAAY,IAAI;CACtC,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,qCAAqC,IAAI,SAAS,sDACpD;CAEF,OAAO;AACT;AAEA,SAAS,oBAAoB,KAAkB,KAA+C;CAC5F,MAAM,WAAW,qBAAqB,KAAK,GAAG;CAC9C,IAAI,EAAE,SAAS,iBAAiB,gBAAgB,EAAA,GAAA,8BAAA,oBAAA,CAAqB,SAAS,KAAK,GACjF,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0DACF;CAEF,IAAI,KAAK,WAAW,KAAA,KAAa,IAAI,YAAY,KAAA,GAC/C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,2DACF;AAEJ;;;;;;;;;;;;;;;;;;;;AA+BA,SAAS,sBACP,IACA,KACA,UACA,QACA,KACA,KACA,KACM;CAEN,IAAI,EADY,CAAC,CAAC,IAAI,YAAY,IAAI,kBAAkB,KAAA,IAC1C;EACZ,aAAa,IAAI,KAAK,UAAU,IAAI,IAAI;EACxC,gBAAgB,IAAI,KAAK,UAAU,QAAQ,KAAK,IAAI,MAAM,GAAG;EAC7D;CACF;CACA,MAAM,YAAY,IAAI;CAGtB,0BAA0B,IAAI,KAAK,UAAU,CAAC,CAAC;CAC/C,aAAa,IAAI,KAAK,UAAU,SAAS;CACzC,gBAAgB,IAAI,KAAK,UAAU,QAAQ,KAAK,WAAW,GAAG;CAG9D,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,IAAI;EACd,eAAe;CACjB,CAAC;CACD,aAAa,IAAI,KAAK,UAAU,IAAI,IAAI;CACxC,gBAAgB,IAAI,UAAU,GAAG;AACnC;AAEA,SAAS,gBACP,IACA,KACA,UACA,KACA,KACA,MACA,KACM;CACN,MAAM,WAAW,KAAK,YAAY,IAAI;CACtC,MAAM,OAAO,YAAA,GAAA,8BAAA,oBAAA,CAA+B,SAAS,KAAK,IAAI;CAC9D,IAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,WAAW,KAAA,KAAa,IAAI,YAAY,KAAA,GACrE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,0CAA0C;CAI3F,KAAK,IAAI,IAAI,GAAG,yBAAyB,QAAQ,IAAI,GAAG,KAAK,GAAG,KAC9D,GAAG,uBAAuB,UAAU,CAAC;CAGvC,IAAI,KAAK,aAAa,mBACpB,0BAA0B,IAAI,KAAK,UAAU,SAAS,KAAK;MAE3D,kBAAkB,IAAI,KAAK,UAAU,IAAI,QAAQ,IAAI,SAAS,SAAS,OAAO,MAAM,MAAM,GAAG;CAK/F,gBAAgB,IAAI,UAAU,GAAG;AACnC;AAEA,SAAS,gBAAgB,IAAkB,UAAe,KAAqB;CAC7E,IAAI,CAAC,GAAG,iCAAiC,UAAU,kBAAkB,IAAI,GACvE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,iDACF;AAEJ;;;;;;;;;;;;AAaA,SAAS,kBACP,IACA,KACA,UACA,QACA,SACA,OACA,MACA,MACA,KACM;CACN,MAAM,cAAc,GAAG,wBAAwB,MAAM;CACrD,IAAI,CAAC,aACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;CAGxF,IAAI,WAAW;CACf,IAAI;EACF,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;EAC1C,IAAI;GACF,IAAI,WAAW,SAAS,IAAI,WAAW,KAAK,CAAC;GAK7C,IAAI,EAHF,KAAK,aAAa,cACd,GAAG,oBAAoB,SAAS,GAAG,aAAa,SAAS,MAAM,UAAU,IACzE,GAAG,qBAAqB,SAAS,GAAG,aAAa,SAAS,MAAM,UAAU,IAE9E,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,GAAG,KAAK,aAAa,cAAc,wBAAwB,uBAAuB,yBACpF;EAEJ,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;EAEA,MAAM,YAAY,YAAY,KAAK,OAAO,KAAK,QAAQ,MAAM,GAAG;EAChE,eAAe,IAAI,KAAK,aAAa,UAAU,OAAO,UAAU,MAAM;EACtE,GAAG,sBAAsB,aAAa,GAAG,GAAG,GAAG,GAAG,UAAU,MAAM,UAAU,MAAM;EAElF,IAAI,CAAC,GAAG,uBAAuB,UAAU,WAAW,GAClD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;EAExF,WAAW;CACb,UAAU;EAER,IAAI,CAAC,UACH,GAAG,oBAAoB,WAAW;CAEtC;AACF;;AAGA,SAAS,YACP,GACA,GACA,MACA,KACiE;CACjE,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,KAAK,IAAI;CAC/C,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM;CAC/C,IAAI,QAAQ,UAAU,KAAK,KAAK,KAAK,GACnC,OAAO;EAAE,MAAM,KAAK;EAAM,QAAQ,KAAK;EAAQ,OAAO;EAAM,QAAQ;CAAK;CAE3E,MAAM,QAAQ,QAAQ,YAAY,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC;CAC5F,MAAM,QAAQ,IAAI;CAClB,MAAM,SAAS,IAAI;CACnB,OAAO;EACL,MAAM,KAAK,QAAQ,OAAO,SAAS;EACnC,QAAQ,KAAK,UAAU,OAAO,UAAU;EACxC;EACA;CACF;AACF;;AAGA,SAAS,eACP,IACA,KACA,aACA,OACA,QACM;CACN,MAAM,MAAM,IAAI,MAAM,EAAa;CACnC,IAAI;EACF,IAAI,KAAK,KAAK,OAAO,OAAO,CAAC;EAC7B,IAAI,KAAK,KAAK,OAAO,GAAG,CAAC;EACzB,IAAI,KAAK,KAAK,OAAO,GAAG,CAAC;EACzB,IAAI,KAAK,KAAK,OAAO,QAAQ,EAAE;EAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,EAAE;EAC1B,IAAI,KAAK,KAAK,OAAO,GAAG,EAAE;EAC1B,IAAI,CAAC,GAAG,sBAAsB,aAAa,GAAG,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;CAEzF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;AAMA,SAAS,0BACP,IACA,KACA,UACA,OACM;CACN,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;CAC1C,IAAI;EACF,IAAI,WAAW,SAAS,IAAI,WAAW,KAAK,CAAC;EAC7C,MAAM,aAAa,GAAG,qBAAqB,SAAS,MAAM,YAAY,EAAE;EACxE,IAAI,CAAC,YACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,sCAAsC;EAE5F,IAAI;GACF,IAAI,CAAC,GAAG,gCAAgC,UAAU,YAAY,CAAC,GAC7D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,gDACF;EAEJ,UAAU;GACR,GAAG,mBAAmB,UAAU;EAClC;CACF,UAAU;EACR,IAAI,KAAK,OAAO;CAClB;AACF;;;;AC1aA,MAAM,qBAA4B;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAEzD,MAAM,kBAAkB;;;;;;;;AASxB,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,UAAU,KAAA,KAAa,MAAM,eAAe,KAAA,GACpD,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,6DACF;CAEF,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,cAAc,IAAI,UAAU,MAAM,SAAS,kBAAkB;CAC7D,gBAAgB,IAAI,UAAU,MAAM,WAAW,eAAe;CAC9D,YAAY,IAAI,UAAU,MAAM,QAAQ,MAAM;CAC9C,IAAI,MAAM,eAAe,KAAA,GACvB,iBAAiB,IAAI,KAAK,UAAU,cAAc,gBAAgB,MAAM,UAAU,CAAC;CAErF,IAAI,MAAM,UAAU,KAAA,GAClB,iBAAiB,IAAI,KAAK,UAAU,SAAS,WAAW,MAAM,KAAK,CAAC;AAExE;AAEA,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,SAAS,KAAA,GACjB,YAAY,IAAI,UAAU,MAAM,IAAI;CAItC,IAAI,MAAM,eAAe,KAAA,GACvB,wBACE,IACA,KACA,UACA,cACA,MAAM,eAAe,OAAO,OAAO,gBAAgB,MAAM,UAAU,CACrE;CAEF,IAAI,MAAM,UAAU,KAAA,GAClB,wBACE,IACA,KACA,UACA,SACA,MAAM,UAAU,OAAO,OAAO,WAAW,MAAM,KAAK,CACtD;AAEJ;AAEA,SAAgB,cAAc,SAAoC;CAChE,OAAO,YAAY;AACrB;AAEA,SAAS,YAAY,IAAkB,UAAe,MAA4C;CAChG,IAAI,CAAC,GAAG,kBAAkB,UAAU,kBAAkB,KAAK,GACzD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;AAErF;;;;AC9EA,MAAM,uBAAuB;CAAE,OAAO;CAAQ,KAAK;AAAO;;;;;;;;;;;;;AAc1D,SAAgB,kBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAE7C,IAAI,MAAM,mBAAmB,QAAQ,MAAM,kBAAkB,GAC3D,gBAAgB,IAAI,UAAU,MAAM,eAAe;CAGrD,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,kBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,IAAI,MAAM,aAAa,KAAA,GACrB,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAG/C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;CACvE,IAAI,MAAM,oBAAoB,KAAA,GAC5B,IAAI,MAAM,oBAAoB,QAAQ,MAAM,kBAAkB,GAC5D,gBAAgB,IAAI,UAAU,MAAM,eAAe;MAKnD,kBAAkB,IAAI,QAAQ;AAGpC;;;;;;;;;AAUA,SAAgB,mBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAC7C,eAAe,IAAI,UAAU,MAAM,eAAe,oBAAoB;CAEtE,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,mBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,IAAI,MAAM,aAAa,KAAA,GACrB,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAG/C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;CACvE,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,UAAU,MAAM,WAAW;AAElD;;;;;AAMA,SAAgB,gBAAgB,SAAoD;CAClF,OAAO,YAAY,aAAa,YAAY;AAC9C;;;ACxHA,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAE5B,SAAgB,gBAAgB,SAAiD;CAC/E,OAAO,YAAY;AACrB;;;;;;;AAQA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,UAAU,MAClB,GAAG,uBAAuB,UAAU,eAAe;MAC9C,IAAI,MAAM,OACf,GAAG,qBAAqB,UAAU,iBAAiB,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;CAEhG,IAAI,MAAM,kBAAkB,MAC1B,GAAG,uBAAuB,UAAU,mBAAmB;MAClD,IAAI,MAAM,eACf,GAAG,qBACD,UACA,qBACA,MAAM,cAAc,GACpB,MAAM,cAAc,GACpB,MAAM,cAAc,CACtB;CAGF,IAAI,MAAM,gBAAgB,KAAA,KAAa,MAAM,gBAAgB,KAAA,GAC3D,GAAG,yBACD,UACA,kBAAkB,MAAM,eAAe,OAAO,GAC9C,MAAM,eAAe,CACvB;CAGF,IACE,MAAM,eAAe,KAAA,KACrB,MAAM,aAAa,KAAA,KACnB,MAAM,cAAc,KAAA,GACpB;EACA,MAAM,QAAQ,MAAM,aAAa;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;EAAE;EACpD,GAAG,+BACD,UACA,mBAAmB,MAAM,cAAc,WAAW,GAClD,MAAM,YAAY,IAClB,MAAM,GACN,MAAM,GACN,MAAM,CACR;CACF;CAEA,IAAI,MAAM,cAAc,KAAA,GACtB,GAAG,2BAA2B,UAAU,oBAAoB,MAAM,SAAS,CAAC;AAEhF;;AAGA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,iBAAiB,IAAI,KAAK,UAAU,KAAK;AAC3C;;;;;;AAOA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,MACR,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,iBAAiB,IAAI,KAAK,UAAU,KAAK;CACzC,GAAG,8BAA8B,QAAQ;AAC3C;;;;ACtBA,SAAgB,eAAe,OAA4B,KAAoC;CAC7F,IAAI,eAAe,MAAM,OAAO,GAC9B,oBAAoB,OAAyB,GAAG;CAElD,IAAI,wBAAwB,MAAM,OAAO,GACvC,6BAA6B,OAAkC,GAAG;AAEtE;;AAGA,SAAgB,eAAe,OAA4B,KAAoC;CAC7F,IAAI,eAAe,MAAM,OAAO,GAC9B,oBAAoB,OAAyB,GAAG;AAEpD;;;;;;;;;;AAWA,SAAgB,WACd,IACA,KACA,UACA,OACA,KACM;CACN,IAAI,oBAAoB,MAAM,OAAO,GAAG;EACtC,qBAAqB,IAAI,KAAK,UAAU,KAAwB;EAChE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,IAAI,MAAM,YAAY,WACpB,kBAAkB,IAAI,KAAK,UAAU,KAAqB;OAE1D,mBAAmB,IAAI,KAAK,UAAU,KAAsB;EAE9D;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,OAAoB,GAAG;EACzD;CACF;CACA,IAAI,aAAa,MAAM,OAAO,GAAG;EAC/B,cAAc,IAAI,KAAK,UAAU,KAAiB;EAClD;CACF;CACA,IAAI,kBAAkB,MAAM,OAAO,GAAG;EACpC,mBAAmB,IAAI,KAAK,UAAU,OAAwB,GAAG;EACjE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,OAAyB,GAAG;EAC/D;CACF;CACA,IAAI,wBAAwB,MAAM,OAAO,GAAG;EAC1C,yBAAyB,IAAI,KAAK,UAAU,OAAkC,GAAG;EACjF;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,KAAoB;EACxD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,OAAsB,GAAG;EAC7D;CACF;CAMA,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,2CAA4C,MAA8B,QAAQ,EACpF;AACF;AAEA,SAAgB,WACd,IACA,KACA,UACA,OACA,KACM;CACN,IAAI,oBAAoB,MAAM,OAAO,GAAG;EACtC,qBAAqB,IAAI,KAAK,UAAU,KAAwB;EAChE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,IAAI,MAAM,YAAY,WACpB,kBAAkB,IAAI,KAAK,UAAU,KAAqB;OAE1D,mBAAmB,IAAI,KAAK,UAAU,KAAsB;EAE9D;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,OAAoB,GAAG;EACzD;CACF;CACA,IAAI,aAAa,MAAM,OAAO,GAAG;EAC/B,cAAc,IAAI,KAAK,UAAU,KAAiB;EAClD;CACF;CACA,IAAI,kBAAkB,MAAM,OAAO,GAAG;EACpC,mBAAmB,IAAI,KAAK,UAAU,OAAwB,GAAG;EACjE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,OAAyB,GAAG;EAC/D;CACF;CACA,IAAI,wBAAwB,MAAM,OAAO,GAAG;EAC1C,yBAAyB,IAAI,KAAK,UAAU,KAA4B;EACxE;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,KAAoB;EACxD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,OAAsB,GAAG;EAC7D;CACF;CACA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,2CAA4C,MAA8B,QAAQ,EACpF;AACF;;;;;;;;;;;;;;;;;;;;;;ACzMA,SAAgB,4BACd,SACA,SACA,SACA,UACA,kBACA,KAC2B;CAC3B,MAAM,EAAE,OAAO;CAGf,IAAI,IAAI,cAAc,MAAM;EAC1B,GAAG,yBAAyB,UAAU,OAAOC,yBAAAA,QAAQ;EACrD,GAAG,uBAAuB,UAAA,CAAoB;EAC9C,OAAO;CACT;CAGA,IAAI,IAAI,WAAW;EACjB,IAAI,IAAI,UAAU,qBAAqB,kBACrC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,kEAAkE,IAAI,UAAU,iBAAiB,eAAe,iBAAiB,EACnI;EAEF,MAAM,YAAY,gBAAgB,SAAS,SAAS,SAAS,IAAI,SAAS;EAC1E,IAAI;GAGF,MAAM,iBAAiB,uBAAuB,SAAS,SAAS;GAChE,IAAI,CAAC,GAAG,yBAAyB,UAAU,OAAO,SAAS,GACzD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;GAEvF,GAAG,uBAAuB,UAAU,gBAAgB,IAAI,aAAa,OAAO,CAAC;GAC7E,OAAO;EACT,UAAU;GACR,GAAG,oBAAoB,SAAS;EAClC;CACF;CAKA,IAAI,IAAI,cAAc,KAAA,GAAW;EAC/B,MAAM,YAAY,GAAG,yBAAyB,UAAU,KAAK;EAC7D,IAAI,WACF,IAAI;GACF,GAAG,uBAAuB,UAAU,gBAAgB,IAAI,SAAS,CAAC;EACpE,UAAU;GACR,GAAG,oBAAoB,SAAS;EAClC;CAEJ;CACA,OAAO;AACT;;;;AC9CA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B/B,IAAa,oBAAb,MAA+B;CAC7B,YACE,SACA,SAOA,OACA;EATiB,KAAA,UAAA;EACA,KAAA,UAAA;EAOA,KAAA,QAAA;CAChB;;;CAIH,aAAqB,SAAc,WAAqD;EACtF,MAAM,QAAQ,KAAK;EACnB,OAAO;GACL,GAAI,QAAQ,EAAE,0BAA0B,QAAgB,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC;GAC9E,QAAQ,KAAK,QAAQ,cAAc;GACnC;GACA,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACnC;CACF;CAEA,OACE,kBACA,OACA,QACA,OACA,WACwB;EACxB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,cAAcC,8BAAAA,oBAAoB,MAAM;EAE9C,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI;GACF,KAAK,6BAA6B,kBAAkB,OAAO;GAC3D,MAAM,WAAW,KAAK,aAAa,SAAS,SAAS;GACrD,eAAe,OAAO,QAAQ;GAQ9B,MAAM,kBAAkB,KAAK,QAAQ,UAAU,gBAAgB;GAC/D,eAAe,MAAM;GAErB,MAAM,WAAW,GAAG,qBAAqB,SAAS,WAAW;GAC7D,IAAI,CAAC,UACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mDAAmD,MAAM,QAAQ,EACnE;GAGF,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI,iBAA4C;GAChD,IAAI;IACF,WAAW,IAAI,KAAK,UAAU,OAAO,QAAQ;IAK7C,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,cAAc,KAAA,GACvD,iBAAiB,4BACf,KAAK,SACL,KAAK,SACL,SACA,UACA,kBACA;KAAE,WAAW,MAAM;KAAW,WAAW,MAAM;IAAU,CAC3D;IAOF,IAAI,OAAO,aACT,sBAAsB,IAAI,KAAK,UAAU,MAAM,WAAW;IAE5D,wBAAwB,IAAI,KAAK,QAAQ;IACzC,2BAA2B,IAAI,KAAK,UAAU,KAAK;IAInD,KAAK,qBAAqB,UAAU,SAAS,MAAM,SAAS;IAE5D,YAAY,GAAG,0BAA0B,QAAQ;IACjD,IAAI,aAAa,GAEf,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+FACF;IAEF,WAAW,GAAG,uBAAuB,SAAS,QAAQ;IACtD,IAAI,WAAW,GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,SAAS,gCAC9C;IAGF,MAAM,sBACJ,IACA,KACA,UACA,kBACA,UACA,gBAAgB,UAChB,eAAe,KAAK,OAAO,CAC7B;IACA,uBAAuB,KAAK,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC;GAC1D,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;GAEA,MAAM,YAAgC;IAAE,MAAM;IAAgB,OAAO;GAAU;GAI/E,IAAI,gBAAgB,KAAK,wBAAwB,kBAAkB,OAAO;GAE1E,MAAM,OAAmC,sBAAsB;IAC7D,UAAU;IACV;IACA,gBAJqB,KAAK,QAAQ,UAAU,gBAI/B;IACb,SAAS,iBAAiB,CAAC,WAAW,cAAc,IAAI,CAAC,SAAS;GACpE,CAAC;GAED,OAAO;IAAE,SAAS;IAAK;GAAK;EAC9B,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;CAEA,OACE,KACA,OACA,QACA,OACA,WACwB;EACxB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,IAAI,gBAAgB;EACjD,IAAI,WAAuB;EAC3B,IAAI;GACF,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GACnE,eAAe,MAAM;GAErB,MAAM,WAAW,KAAK,aAAa,SAAS,SAAS;GACrD,eAAe,OAAO,QAAQ;GAE9B,KAAK,6BAA6B,IAAI,kBAAkB,OAAO;GAC/D,MAAM,kBAAkB,KAAK,QAAQ,UAAU,IAAI,gBAAgB;GAInE,eAAe,MAAM;GAMrB,MAAM,WAAW,KAAK,uBAAuB,QAAQ;GAKrD,MAAM,oBAAoB,kBAAkB,GAAG,uBAAuB,QAAQ,CAAC;GAK/E,MAAM,WAAW,GAAG,uBAAuB,SAAS,QAAQ;GAC5D,IAAI,WAAW,GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,SAAS,eAC9C;GAEF,MAAM,aAAa,sBACjB,IACA,KACA,UACA,IAAI,kBACJ,UACA,gBAAgB,UAChB,eAAe,KAAK,OAAO,CAC7B;GAGA,WAAW,IAAI,KAAK,UAAU,OAAO,QAAQ;GAI7C,IAAI,iBAA4C;GAChD,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,cAAc,KAAA,GACvD,iBAAiB,4BACf,KAAK,SACL,KAAK,SACL,SACA,UACA,IAAI,kBACJ;IAAE,WAAW,MAAM;IAAW,WAAW,MAAM;GAAU,CAC3D;GAMF,wBAAwB,IAAI,KAAK,QAAQ;GACzC,2BAA2B,IAAI,KAAK,UAAU,KAAK;GAanD,MAAM,UAAA,GAAA,8BAAA,mBAAA,CAA4B,YAAY,KAAK;GACnD,IAAI;GACJ,IACE,WAAW,WACV,WAAW,iBACV,GAAG,8BAA8B,UAAU,sBAAsB,GAEnE,aAAa;IAAE,QAAQ;IAAa,SAAS;GAAM;QAOnD,aALW,KAAK,qBACd,UACA,SACA,MAAM,aAAa,iBAEP,IACV;IAAE,QAAQ;IAAe,SAAS;GAAK,IAKvC;IAAE,QAAQ;IAA0B,SAAS,WAAW;GAAa;GAO3E,GAAG,oBAAoB,QAAQ;GAC/B,WAAW;GACX,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GAInE,MAAM,WAAW,GAAG,uBAAuB,SAAS,QAAQ;GAC5D,IAAI,WAAW,GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,SAAS,cAC9C;GAEF,MAAM,MAAM,sBACV,IACA,KACA,UACA,IAAI,kBACJ,UACA,gBAAgB,UAChB,eAAe,KAAK,OAAO,CAC7B;GACA,uBAAuB,KAAK,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC;GAExD,KAAK,wBAAwB,IAAI,kBAAkB,OAAO;GAE1D,MAAM,OAAO,sBAAsB;IACjC,UAAU;IACV;IACA,gBAJqB,KAAK,QAAQ,UAAU,IAAI,gBAInC;IACb,SAAS,iBAAiB,CAAC,UAAU,cAAc,IAAI,CAAC,QAAQ;GAClE,CAAC;GACD,OAAO;IAAE,SAAS;IAAK;IAAY;GAAK;EAC1C,UAAU;GACR,IAAI,aAAa,MAAM,GAAG,oBAAoB,QAAQ;GACtD,KAAK,QAAQ,IAAI,gBAAgB;EACnC;CACF;;;;;;CAOA,wBAAgC,UAAqB;EACnD,MAAM,EAAE,OAAO,KAAK;EACpB,IAAI,GAAG,qBAAqB,QAAQ,MAAMC,8BAAAA,yBAAyB,QAAQ;EAC3E,MAAM,oBAAoB,GAAG,0BAA0B,QAAQ;EAC/D,IAAI,+BAA+B,KAAK,SAAS,KAAK,SAAS,iBAAiB,MAAM,GACpF;EAEF,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0FACF;CACF;CAEA,OAAO,KAAoB,QAA6C;EACtE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,IAAI,gBAAgB;EACjD,IAAI,gBAAgB;EACpB,IAAI;GACF,KAAK,6BAA6B,IAAI,kBAAkB,OAAO;GAC/D,MAAM,kBAAkB,KAAK,QAAQ,UAAU,IAAI,gBAAgB;GACnE,eAAe,MAAM;GAErB,IAAI;GACJ,IAAI,KAAK;GACT,QAAQ,IAAI,MAAZ;IACE,KAAK,gBAAgB;KAKnB,MAAM,QAAQ,GAAG,gCAAgC,SAAS,IAAI,iBAAiB;KAC/E,IAAI,CAAC,OACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,oCAAoC,IAAI,kBAAkB,WAAW,IAAI,kBAC3E;KAEF,IAAI;MACF,KAAK,wBAAwB,KAAK;KACpC,UAAU;MACR,GAAG,oBAAoB,KAAK;KAC9B;KACA,gBAAgB;KAChB,KAAK,GAAG,mCAAmC,SAAS,IAAI,iBAAiB;KACzE,UAAU;MAAE,MAAM;MAAgB,OAAO,IAAI;KAAkB;KAC/D;IACF;IACA,KAAK,MAAM;KACT,MAAM,UAAU,IAAI,eAAe,IAAI,EAAE;KACzC,IAAI;MACF,MAAM,QAAQ,GAAG,wBAAwB,SAAS,OAAO;MACzD,IAAI,CAAC,OACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,2BAA2B,IAAI,GAAG,YAAY,IAAI,kBACpD;MAEF,IAAI;OACF,KAAK,wBAAwB,KAAK;MACpC,UAAU;OACR,GAAG,oBAAoB,KAAK;MAC9B;MACA,gBAAgB;MAChB,KAAK,GAAG,2BAA2B,SAAS,OAAO;KACrD,UAAU;MACR,IAAI,KAAK,OAAO;KAClB;KACA,UAAU;MAAE,MAAM;MAAM,OAAO,IAAI;KAAG;KACtC;IACF;IACA,KAAK,SAAS;KACZ,KAAK,QAAQ,iBAAiB,IAAI,QAAQ;KAC1C,MAAM,WAAW,GAAG,kBAAkB,SAAS,IAAI,KAAK;KACxD,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,SAAS,IAAI,MAAM,wBAAwB,IAAI,kBACjD;KAEF,IAAI;KACJ,IAAI;KACJ,IAAI;MACF,eAAe,GAAG,0BAA0B,QAAQ;MACpD,WAAW,gBAAgB,IAAI,KAAK,UAAU,IAAI;KACpD,UAAU;MACR,GAAG,oBAAoB,QAAQ;KACjC;KACA,UACE,eAAe,IACX;MAAE,MAAM;MAAgB,OAAO;KAAa,IAC5C,aAAa,QAAQ,SAAS,SAAS,IACrC;MAAE,MAAM;MAAM,OAAO;KAAS,IAC9B;KACR,gBAAgB;KAIhB,KAAK,GAAG,qBAAqB,SAAS,IAAI,KAAK;KAC/C;IACF;GACF;GACA,IAAI,CAAC,IACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,gCAAgC,IAAI,MAAM;GAO3F,KAAK,QAAQ,aAAa,IAAI,gBAAgB;GAC9C,gBAAgB;GAChB,KAAK,wBAAwB,IAAI,kBAAkB,OAAO;GAG1D,MAAM,OAAO,sBAAsB;IACjC,UAAU;IACV;IACA,gBALqB,KAAK,QAAQ,UAAU,IAAI,gBAKnC;IACb,SAAS,UAAU,CAAC,OAAO,IAAI,CAAC;GAClC,CAAC;GACD,OAAO;IAAE;IAAS;GAAK;EACzB,UAAU;GACR,IAAI,eAAe,KAAK,QAAQ,aAAa,IAAI,gBAAgB;GACjE,KAAK,QAAQ,IAAI,gBAAgB;EACnC;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCA,KACE,kBACA,MACA,SACA,QACsB;EACtB,eAAe,MAAM;EACrB,IAAI,KAAK,WAAW,GAClB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,gCAAgC;EAEpF,IAAI,UAAU,KAAK,CAAC,OAAO,UAAU,OAAO,GAC1C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oDAAoD,QAAQ,EAC9D;EAEF,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,qBAAqB,kBACzB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,kCAAkC,iBAAiB,oBAAoB,EAAE,kBAC3E;EAIJ,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI,gBAAgB;EAEpB,IAAI;GACF,KAAK,6BAA6B,kBAAkB,OAAO;GAC3D,MAAM,kBAAkB,KAAK,QAAQ,UAAU,gBAAgB;GAC/D,eAAe,MAAM;GAOrB,MAAM,cAAwB,IAAI,MAAM,KAAK,MAAM;GACnD,MAAM,YAAkC,IAAI,MAAM,KAAK,MAAM;GAC7D,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,eAAe,MAAM;IACrB,MAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,KAAK,EAAE;IAC7E,IAAI;KACF,MAAM,MAAM,GAAG,uBAAuB,SAAS,QAAQ;KACvD,IAAI,MAAM,GACR,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,IAAI,wBACzC;KAEF,YAAY,KAAK;KACjB,UAAU,KAAK,KAAK,uBAAuB,QAAQ;IACrD,UAAU;KACR,GAAG,oBAAoB,QAAQ;IACjC;GACF;GAKA,MAAM,uBAAO,IAAI,IAAY;GAC7B,KAAK,MAAM,OAAO,aAAa;IAC7B,IAAI,KAAK,IAAI,GAAG,GACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gDAAgD,KAClD;IAEF,KAAK,IAAI,GAAG;GACd;GAKA,MAAM,mBADQ,GAAG,uBAAuB,OACX,IAAI,YAAY;GAC7C,IAAI,UAAU,kBACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gBAAgB,QAAQ,uCAAuC,kBACjE;GAMF,MAAM,WAAW,IAAI,YAAY;GACjC,MAAM,SAAS,IAAI,MAAM,QAAQ;GACjC,IAAI;GACJ,IAAI;IACF,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KACtC,IAAI,KAAK,QAAQ,OAAO,YAAY,IAAI,IAAI,CAAC;IAE/C,gBAAgB;IAChB,KAAK,GAAG,oBAAoB,SAAS,QAAQ,YAAY,QAAQ,OAAO;GAC1E,UAAU;IACR,IAAI,KAAK,MAAM;GACjB;GAEA,IAAI,CAAC,IAAI;IAIP,gBAAgB;IAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,qDAAqD,QAAQ,iBAAiB,YAAY,KACxF,GACF,EAAE,GACJ;GACF;GAMA,MAAM,YAAY,KAAK,QAAQ,aAAa,gBAAgB;GAC5D,gBAAgB;GAEhB,MAAM,QAAyB,IAAI,MAAM,YAAY,MAAM;GAC3D,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;IAC3C,eAAe,MAAM;IACrB,MAAM,SAAS,UAAU;IACzB,MAAM,WAAW,GAAG,kBAAkB,SAAS,MAAM;IACrD,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+CAA+C,QACjD;IAEF,IAAI;KACF,MAAM,KAAK,sBACT,IACA,KACA,UACA,kBACA,QACA,WACA,eAAe,KAAK,OAAO,CAC7B;IACF,UAAU;KACR,GAAG,oBAAoB,QAAQ;IACjC;GACF;GAEA,KAAK,wBAAwB,kBAAkB,OAAO;GAQtD,OAAO;IAAE;IAAO,MANyB,sBAAsB;KAC7D,UAAU;KACV;KACA,gBAJqB,KAAK,QAAQ,UAAU,gBAI/B;KACb,SAAS;IACX,CACmB;GAAE;EACvB,UAAU;GACR,IAAI,eAAe,KAAK,QAAQ,aAAa,gBAAgB;GAC7D,KAAK,QAAQ,gBAAgB;EAC/B;CACF;;;;;;;;;;;;;;;CAgBA,qBAA6B,UAAe,SAAc,WAAgC;EACxF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,KACJ,cAAc,KAAA,IACV,GAAG,6BAA6B,QAAQ,IACxC,GAAG,sCAAsC,UAAU,gBAAgB,SAAS,CAAC;EACnF,GAAG,yBAAyB,OAAO;EACnC,OAAO;CACT;CAEA,uBAA+B,UAAmC;EAChE,OAAO,uBAAuB,KAAK,SAAS,QAAQ;CACtD;CAEA,6BAAqC,kBAAoC,SAAoB;EAC3F,IAAI,KAAK,QAAQ,oBAAoB,gBAAgB,CAAC,CAAC,SAAS,SAC9D;EAEF,KAAK,wBAAwB,kBAAkB,OAAO;CACxD;CAEA,wBAAgC,kBAAoC,SAAoB;EACtF,KAAK,QAAQ,eAAe,kBAAkB,KAAK,0BAA0B,OAAO,CAAC;CACvF;CAEA,0BAAkC,SAAuB;EACvD,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,GAAG,uBAAuB,OAAO;EAC/C,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,MAAM,kCAC3C;EAEF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,MAAM,WAAW,GAAG,kBAAkB,SAAS,CAAC;GAChD,IAAI,CAAC,UACH;GAEF,IAAI;IAEF,IADe,GAAG,0BAA0B,QACnC,IAAI,GACX;IAEF,MAAM,KAAK,gBAAgB,IAAI,KAAK,UAAU,IAAI;IAClD,IAAI,OAAO,QAAQ,GAAG,WAAW,GAC/B,OAAO;GAEX,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;EACF;EACA,OAAO;CACT;AACF;;;AClwBA,MAAM,eAAe;AACrB,MAAM,kBAAkB;AACxB,MAAM,wBAAwB;;AAG9B,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,QACE,mBACA,OACA,QACmB;EACnB,eAAe,MAAM;EACrB,mBAAmB,iBAAiB;EACpC,KAAK,MAAM,oBAAoB,mBAC7B,KAAK,QAAQ,qBAAqB,gBAAgB;EAGpD,MAAM,UAAwC,CAAC;EAC/C,MAAM,2BAAW,IAAI,IAAsB;EAC3C,IAAI,OAAO;EACX,KAAK,MAAM,oBAAoB,mBAAmB;GAChD,IAAI,QAAS,OAAO,WAAW,SAAS,OAAO,GAAI;IACjD,OAAO;IACP,QAAQ,KAAK;KAAE;KAAkB,QAAQ;IAAU,CAAC;IACpD;GACF;GACA,IAAI,OAAO,SAAS,eAAe,MAAM;GAEzC,MAAM,OAAO,KAAK,QAAQ,SAAS;GACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;GAC7C,IAAI;GACJ,IAAI;IACF,OAAO,KAAK,QAAQ,GAAG,iBAAiB,SAAS,UAAU,UAAU,IAAI,CAAC;GAC5E,SAAS,OAAO;IACd,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KAAE;KAAkB,QAAQ;KAAU,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAAE,CAAC;IACjF,OAAO;IACP;GACF,UAAU;IACR,KAAK,QAAQ,gBAAgB;GAC/B;GAEA,IAAI,SAAS,uBACX,QAAQ,KAAK;IAAE;IAAkB,QAAQ;GAAY,CAAC;QACjD,IAAI,SAAS,iBAAiB;IACnC,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KAAE;KAAkB,QAAQ;IAAU,CAAC;GACtD,OAAO;IACL,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KACX;KACA,QAAQ;KACR,QAAA,GAAA,8BAAA,eAAA,CACE,IAAIE,8BAAAA,YACFC,8BAAAA,gBAAgB,SAChB,SAAS,eACL,+CACA,gDAAgD,MACtD,CACF;IACF,CAAC;IACD,OAAO;GACT;EACF;EAEA,IAAI,SAAS,SAAS,GAAG,OAAO;GAAE;GAAmB;GAAO;GAAS,MAAM;EAAK;EAEhF,KAAK,QAAQ,aAAa;EAC1B,KAAK,MAAM,oBAAoB,UAAU;GACvC,KAAK,QAAQ,aAAa,gBAAgB;GAC1C,IAAI;IAEF,IAAI,iBAAiB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,kBAAkB,MAAM;GAChF,QAAQ,CAGR;EACF;EAOA,OAAO;GAAE;GAAmB;GAAO;GAAS,MAAA;IAL1C,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,qBAChC,KAAK,QAAQ,UAAU,gBAAgB,CACzC;IACA,YAAY;GAEiC;EAAE;CACnD;AACF;AAEA,SAAS,mBAAmB,mBAA6C;CACvE,IAAI,kBAAkB,WAAW,GAC/B,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,0CAA0C;CAE9F,MAAM,uBAAO,IAAI,IAAsB;CACvC,KAAK,MAAM,oBAAoB,mBAAmB;EAChD,IAAI,KAAK,IAAI,gBAAgB,GAC3B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDAAwD,kBAC1D;EAEF,KAAK,IAAI,gBAAgB;CAC3B;AACF;;;;;;;;;;;;;;;;;;;;ACjFA,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,MAAM,OAA4B,QAA2C;EAC3E,eAAe,MAAM;EAErB,MAAM,OAAO,KAAK,UAAU,KAAK;EACjC,KAAK,MAAM,oBAAoB,KAAK,KAAK,GACvC,KAAK,QAAQ,qBAAqB,gBAAgB;EAEpD,KAAK,UAAU,MAAM,MAAM;EAE3B,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,UAA2C,CAAC;EAClD,MAAM,2BAAW,IAAI,IAAsB;EAC3C,IAAI,eAAe;EACnB,IAAI,OAAO;EAEX,KAAK,MAAM,CAAC,kBAAkB,SAAS,MAAM;GAC3C,IAAI,QAAS,OAAO,WAAW,SAAS,OAAO,GAAI;IACjD,OAAO;IACP,QAAQ,KAAK;KAAE;KAAkB,QAAQ;KAAW,wBAAwB;IAAE,CAAC;IAC/E;GACF;GACA,IAAI,OAAO,SAAS,eAAe,MAAM;GAEzC,MAAM,OAAO,KAAK,QAAQ,SAAS;GACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;GAC7C,IAAI;IACF,MAAM,UACJ,SAAS,OAAO,KAAK,eAAe,OAAO,IAAI,KAAK,gBAAgB,SAAS,IAAI;IACnF,IAAI,QAAQ,WAAW,WAAW;KAChC,GAAG,yBAAyB,OAAO;KACnC,SAAS,IAAI,gBAAgB;KAC7B,gBAAgB,QAAQ;IAC1B;IACA,QAAQ,KAAK;KACX;KACA,QAAQ,QAAQ;KAChB,wBAAwB,QAAQ;IAClC,CAAC;GACH,SAAS,OAAO;IACd,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KACX;KACA,QAAQ;KACR,wBAAwB;KACxB,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAC7B,CAAC;IACD,OAAO;GACT,UAAU;IACR,KAAK,QAAQ,gBAAgB;GAC/B;EACF;EAEA,IAAI,SAAS,SAAS,GACpB,OAAO;GAAE;GAAO;GAAS,wBAAwB;GAAc,MAAM;EAAK;EAG5E,KAAK,QAAQ,aAAa;EAC1B,KAAK,MAAM,oBAAoB,UAAU;GACvC,KAAK,QAAQ,aAAa,gBAAgB;GAC1C,IAAI;IAEF,IAAI,iBAAiB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,kBAAkB,MAAM;GAChF,QAAQ,CAGR;EACF;EACA,MAAM,OAAqB;GACzB,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,qBAChC,KAAK,QAAQ,UAAU,gBAAgB,CACzC;GACA,YAAY;EACd;EACA,OAAO;GAAE;GAAO;GAAS,wBAAwB;GAAc;EAAK;CACtE;;;;;CAMA,UAAkB,OAA2E;EAC3F,MAAM,uBAAO,IAAI,IAA8C;EAC/D,IAAI,MAAM,SAAS,SAAS;GAC1B,IAAI,MAAM,kBAAkB,WAAW,GACrC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,4CACF;GAEF,KAAK,MAAM,oBAAoB,MAAM,mBAAmB;IACtD,IAAI,KAAK,IAAI,gBAAgB,GAC3B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0DAA0D,kBAC5D;IAEF,KAAK,IAAI,kBAAkB,IAAI;GACjC;GACA,OAAO;EACT;EAEA,IAAI,MAAM,KAAK,WAAW,GACxB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sDACF;EAEF,KAAK,MAAM,OAAO,MAAM,MAAM;GAC5B,MAAM,WAAW,KAAK,IAAI,IAAI,gBAAgB;GAC9C,IAAI,aAAa,MACf,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oCAAoC;GAExF,IAAI,UAAU,SAAS,KAAK,GAAG;QAC1B,KAAK,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC;EAC3C;EAIA,KAAK,MAAM,CAAC,kBAAkB,SAAS,MACrC,IAAI,SAAS,QAAQ,KAAK,SAAS,KAAK,KAAK,MAAM,MAAM,EAAE,SAAS,OAAO,GACzE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,iBAAiB,4GAClD;EAGJ,OAAO;CACT;;;;;;CAOA,UACE,MACA,QACM;EACN,MAAM,EAAE,OAAO,KAAK;EACpB,KAAK,MAAM,CAAC,kBAAkB,SAAS,MAAM;GAC3C,IAAI,SAAS,MAAM;GACnB,eAAe,MAAM;GACrB,MAAM,OAAO,KAAK,QAAQ,SAAS;GACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;GAC7C,IAAI;IACF,KAAK,MAAM,OAAO,MAAM;KACtB,MAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;KACzE,IAAI;MACF,MAAM,WAAA,GAAA,8BAAA,gBAAA,CAA0B,GAAG,qBAAqB,QAAQ,CAAC;MACjE,IAAI,YAAY,UACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,iBAAiB,kBAAkB,QAAQ,sCAC5E;KAEJ,UAAU;MACR,GAAG,oBAAoB,QAAQ;KACjC;IACF;GACF,UAAU;IACR,KAAK,QAAQ,gBAAgB;GAC/B;EACF;CACF;CAEA,eAAuB,SAAoE;EACzF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,gBAAgB,KAAK,yBAAyB,OAAO;EAC3D,OAAO,YAAY,KAAA,IAAiB,aAAa;GAE/C,IAAI,CADO,GAAG,yBAAyB,SAAS,QAC1C,GAAG;IAKP,IAAI,eACF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC;IAErF,OAAO;KAAE,QAAQ;KAAsB,SAAS;IAAE;GACpD;GACA,OAAO;IAAE,QAAQ;IAAoB,SAAS,QAAQ,KAAK,QAAQ,MAAM;GAAE;EAC7E,CAAC;CACH;CAEA,yBAAiC,SAAuB;EACtD,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,GAAG,uBAAuB,OAAO;EAC/C,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;GAC1C,MAAM,WAAW,GAAG,kBAAkB,SAAS,KAAK;GACpD,IAAI,CAAC,UAAU;GACf,IAAI;IACF,KAAA,GAAA,8BAAA,gBAAA,CAAoB,GAAG,qBAAqB,QAAQ,CAAC,MAAM,UAAU,OAAO;GAC9E,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;EACF;EACA,OAAO;CACT;CAEA,gBACE,SACA,MACwC;EACxC,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,IAAI,UAAU;EACd,KAAK,MAAM,OAAO,MAAM;GAItB,MAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GACzE,IAAI;IAMF,IAAI,CALO,YAAY,KAAA,IAAiB,aAAa;KACnD,MAAM,UAAU,GAAG,yBAAyB,SAAS,UAAU,QAAQ;KACvE,IAAI,SAAS,WAAW,QAAQ,KAAK,QAAQ,MAAM;KACnD,OAAO;IACT,CACM,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+CACF;GAEJ,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;EACF;EACA,OAAO;GAAE,QAAQ;GAAW;EAAQ;CACtC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;AClPA,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,kBAAoC,QAAuC;EAC9E,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,eAAe,MAAM;GACrB,MAAM,cAAc,GAAG,kBAAkB,OAAO;GAChD,IAAI,CAAC,aACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,mDAAmD,kBACrD;GAEF,IAAI;IACF,eAAe,MAAM;IACrB,MAAM,YAAY,KAAK,IAAI,GAAG,oBAAoB,WAAW,GAAG,CAAC;IACjE,MAAM,OAAO,aAAa,KAAK,SAAS,aAAa,SAAS;IAC9D,MAAM,UAAU,YAAY,KAAK,SAAS,aAAa,gBAAgB;IAIvE,MAAM,aAAA,GAAA,8BAAA,iBAAA,CAA6B,WAAW,KAAK,QAAQ,OAAO;IAClE,IAAI,cAAc,MAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,+CAA+C,iBAAiB,IAAI,WACtE;IAEF,OAAO,QAAQ,SAAS,IAAI;KAAE;KAAM;KAAW;IAAQ,IAAI;KAAE;KAAM;IAAU;GAC/E,UAAU;IACR,GAAG,mBAAmB,WAAW;GACnC;EACF,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;AACF;;;;;;;AAQA,SAAS,aACP,SACA,aACA,WACQ;CACR,IAAI,aAAa,GAAG,OAAO;CAC3B,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,WAAW,YAAY,IAAI;CACjC,OAAO,YAAY,KAAK,WAAW,IAAI,QAAQ;EAC7C,MAAM,UAAU,GAAG,qBAAqB,aAAa,KAAK,QAAQ;EAClE,IAAI,WAAW,GAAG,OAAO;EACzB,OAAO,cAAc,IAAI,UAAU,MAAM,UAAU,KAAK,CAAC,CAAC;CAC5D,CAAC;AACH;AAEA,SAAS,cAAc,OAA2B;CAChD,MAAM,QAAQ,IAAI,YAAY,MAAM,QAAQ,MAAM,YAAY,MAAM,cAAc,CAAC;CACnF,IAAI,MAAM;CACV,MAAM,QAAQ;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,OACrC,OAAO,OAAO,aAAa,GAAG,MAAM,SAAS,GAAG,KAAK,IAAI,IAAI,OAAO,MAAM,MAAM,CAAC,CAAC;CAEpF,OAAO;AACT;;AAGA,MAAM,eAAe;AAErB,SAAS,YACP,SACA,aACA,kBACiB;CACjB,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,QAAQ,GAAG,0BAA0B,aAAaC,yBAAAA,UAAU,CAAC;CACnE,IAAI,QAAQ,GACV,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,oDAAoD,kBACtD;CAEF,IAAI,UAAU,GAAG,OAAO,CAAC;CACzB,OAAO,YAAY,KAAK,QAAQ,eAAe,QAAQ;EACrD,GAAG,0BAA0B,aAAa,KAAK,KAAK;EACpD,MAAM,QAAQ,IAAI,UAAU,KAAK,QAAQ,YAAY;EACrD,MAAM,QAAQ,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,QAAQ,CAAC;EACtE,MAAM,UAA2B,IAAI,MAAM,KAAK;EAChD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK,CAAC,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;EAE9C,OAAO;CACT,CAAC;AACH;;;;;;;;ACxGA,MAAM,2BAA2B;;;;;;;;;;;;;;AAgDjC,IAAa,qBAAb,MAAgC;CAC9B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,kBAAoC,QAA2C;EAClF,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,eAAe,MAAM;GACrB,MAAM,cAAc,GAAG,kBAAkB,OAAO;GAChD,IAAI,CAAC,aACH,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,mDAAmD,kBACrD;GAEF,IAAI;IACF,eAAe,MAAM;IACrB,MAAM,aAAa,KAAK,IAAI,GAAG,oBAAoB,WAAW,GAAG,CAAC;IAClE,MAAM,UAAoC,CAAC;IAC3C,MAAM,cAAc,IAAI,MAAM,0BAA0B,KAAK;IAE7D,IAAI;KACF,IAAI,gBAAwC;KAC5C,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;MACnC,eAAe,MAAM;MACrB,MAAM,YAAY,GAAG,uBAAuB,aAAa,CAAC;MAC1D,MAAM,SAAiC;OACrC;OACA,GAAG,KAAK,aAAa,aAAa,GAAG,WAAW;MAClD;MACA,IAAI,cAAc,eAAe;OAC/B,OAAO,WAAW,GAAG,qBAAqB,aAAa,CAAC;OACxD,gBAAgB;MAClB;MACA,QAAQ,KAAK,MAAM;KACrB;IACF,UAAU;KACR,IAAI,KAAK,WAAW;IACtB;IAEA,OAAO,EAAE,MAAM,uBAAuB,OAAO,EAAE;GACjD,UAAU;IACR,GAAG,mBAAmB,WAAW;GACnC;EACF,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;CAEA,aACE,aACA,WACA,aACwD;EACxD,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,IAAI,CAAC,GAAG,yBAAyB,aAAa,WAAW,WAAW,GAClE,OAAO,cAAc;EAGvB,MAAM,EAAE,SAAS,OAAO,SAAS;EACjC,MAAM,SAAS,QAAQ,KAAK,aAAa,QAAQ,KAAK,MAAM;EAG5D,IAAI,SAAS,KAAK,OAChB,OAAO,cAAc;EAGvB,MAAM,UAAU,QAAQ,SAAS,KAAK,OAAO;EAC7C,MAAM,MAA8D;GAClE,OAAO,SAAS,KAAK,QAAQ,IAAI;GACjC,WAAA,GAAA,8BAAA,iBAAA,CAA2B,UAAU,KAAK,aAAa,QAAQ,QAAQ,CAAC;GACxE;GACA,UAAU;GACV,YAAY;EACd;EACA,IAAI,SAAS,KAAK,aAChB,IAAI,YAAA,GAAA,8BAAA,iBAAA,CAA4B,UAAU,KAAK,aAAa,QAAQ,QAAQ,CAAC;EAE/E,IAAI,SAAS,KAAK,cAAc;GAC9B,IAAI,YAAY,SAAS,KAAK,aAAa,QAAQ,SAAS;GAC5D,IAAI,SAAS,KAAK,cAChB,IAAI,YAAY,SAAS,KAAK,aAAa,QAAQ,SAAS;GAE9D,IAAI,CAAC,SAAS;IACZ,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,MAAM;IAClD,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,SAAS,CAAC;IACtD,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,SAAS,CAAC;IACtD,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,SAAS,EAAE;IACvD,IAAI,WAAW,KAAK,MAAM,GAAG,CAAC;IAC9B,IAAI,aAAa,IAAI,IAAI,IAAI,IAAI;GACnC;EACF;EACA,OAAO;CACT;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,uBAAuB,SAAsD;CAC3F,MAAM,OAA0B,CAAC;CACjC,IAAI,SAAmC,CAAC;CACxC,IAAI,YAAY;CAChB,IAAI;CACJ,IAAI,YAAoC;CACxC,IAAI;CAEJ,MAAM,SAAS,cAAsB;EACnC,IAAI,OAAO,SAAS,GAAG;GACrB,KAAK,KAAK,eAAe,QAAQ,WAAW,UAAU,GAAG,CAAC;GAC1D,SAAS,CAAC;GACV,MAAM,KAAA;EACR;EACA,YAAY;CACd;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,SAAS,QAAQ;EACvB,IAAI,OAAO,cAAc,WAAW;GAClC,MAAM,CAAC;GACP,YAAY,OAAO;GACnB,WAAW,OAAO;EACpB;EACA,MAAM,cAAc,QAAQ,MAAM;EAClC,IAAI,aAAa;GACf,IAAI,OAAO,CAAC,UAAU,KAAK,WAAW,GAAG,MAAM,CAAC;GAChD,IAAI,CAAC,KAAK,MAAM;EAClB;EACA,OAAO,KAAK,MAAM;CACpB;CACA,MAAM,QAAQ,MAAM;CACpB,OAAO;AACT;AAEA,SAAS,QAAQ,QAAsD;CACrE,IAAI,OAAO,QAAQ,GAAG,OAAO,KAAA;CAC7B,IAAI,OAAO,aAAa,CAAC,OAAO,SAC9B,OAAO;EAAE,SAAS;EAAO,UAAU,OAAO;EAAU,YAAY,OAAO;CAAW;CAEpF,OAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,UAAU,GAAa,GAAsB;CACpD,IAAI,EAAE,WAAW,EAAE,SAAS,OAAO,EAAE,YAAY,EAAE;CACnD,IAAI,EAAE,eAAe,EAAE,YAAY,OAAO;CAC1C,MAAM,QAAQ,EAAE,WAAW,EAAE;CAC7B,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK;AACnE;AAEA,SAAS,eACP,QACA,WACA,UACA,KACiB;CACjB,IAAI,OAAO,CAAC,IAAI,SAAS;EACvB,MAAM,SAAiC,OAAO,KAAK,MACjD,EAAE,YACE;GACE,WAAW,EAAE;GACb,OAAO,EAAE;GACT,GAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;EAClD,IAGA;GAAE,WAAW,SAAS;GAAG,OAAO,EAAE;EAAM,CAC9C;EACA,OAAO;GACL,MAAM,UAAU,SAAS,MAAO,EAAE,aAAA,GAAA,8BAAA,cAAA,CAA0B,EAAE,SAAS,IAAI,SAAU;GACrF;GACA;GACA,UAAU,IAAI;GACd,YAAY,IAAI;GAChB,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;EAC/C;CACF;CAMA,MAAM,SAA8B,OAAO,KAAK,OAAO;EACrD,UAAU,EAAE;EACZ,OAAO,EAAE;EACT,GAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;CAC/C,EAAE;CACF,OAAO;EACL,MAAM,UAAU,SAAS,MAAM,EAAE,QAAQ;EACzC;EACA;EACA,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;CAC/C;AACF;;AAGA,SAAS,UACP,QACA,UACS;CACT,MAAM,OAAO,SAAS,OAAO,EAAE;CAC/B,MAAM,OAAO;EAAE,MAAM,KAAK;EAAM,QAAQ,KAAK;EAAQ,OAAO,KAAK;EAAO,KAAK,KAAK;CAAI;CACtF,KAAK,MAAM,KAAK,QAAQ;EACtB,IAAI,EAAE,QAAQ,GAAG;EACjB,MAAM,IAAI,SAAS,CAAC;EACpB,KAAK,OAAO,KAAK,IAAI,KAAK,MAAM,EAAE,IAAI;EACtC,KAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,EAAE,MAAM;EAC5C,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,EAAE,KAAK;EACzC,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,EAAE,GAAG;CACrC;CACA,OAAO;AACT;AAEA,MAAM,YAAqB;CAAE,MAAM;CAAG,QAAQ;CAAG,OAAO;CAAG,KAAK;AAAE;AAElE,SAAS,WAAoB;CAC3B,OAAO;EAAE,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;CAAE;AAC1F;AAEA,SAAS,gBAAwE;CAC/E,OAAO;EACL,OAAO;EACP,UAAU;GAAE,MAAM;GAAG,QAAQ;GAAG,OAAO;GAAG,KAAK;EAAE;EACjD,SAAS;EACT,UAAU;EACV,YAAY;CACd;AACF;AAEA,SAAS,SAAS,KAAuB,KAAU,YAA6B;CAC9E,MAAM,KAAK,WAAmB,QAAQ,KAAK,KAAK,aAAa,MAAM;CACnE,OAAO;EACL,IAAI;GAAE,GAAG,EAAE,CAAC;GAAG,GAAG,EAAE,CAAC;EAAE;EACvB,IAAI;GAAE,GAAG,EAAE,CAAC;GAAG,GAAG,EAAE,EAAE;EAAE;EACxB,IAAI;GAAE,GAAG,EAAE,EAAE;GAAG,GAAG,EAAE,EAAE;EAAE;EACzB,IAAI;GAAE,GAAG,EAAE,EAAE;GAAG,GAAG,EAAE,EAAE;EAAE;CAC3B;AACF;;;AC/TA,MAAM,oBAAoB;AAE1B,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OAAO,kBAAoC,SAA4B,QAAqB;EAC1F,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,eAAe,MAAM;GAErB,MAAM,YAAY,GAAG,mBAAmB,OAAO;GAC/C,MAAM,aAAa,GAAG,oBAAoB,OAAO;GACjD,MAAM,SAAS,cAAc,QAAQ,QAAQ,WAAW,UAAU;GAClE,MAAM,WAAW,QAAQ,YAAY;GACrC,MAAM,WAAW,QAAQ,YAAY;IAAE,MAAM;IAAS,OAAO;GAAE;GAE/D,IAAI,QAAA;GACJ,IAAI,QAAQ,sBAAsB,MAAM,SAAS;GAEjD,MAAM,SAAS,UAAU,KAAK,SAAS;IACrC,MAAM;IACN,MAAM;KAAE,OAAO;KAAW,QAAQ;IAAW;IAC7C;IACA;IACA,GAAI,QAAQ,oBAAoB,KAAA,IAC5B,EAAE,iBAAiB,QAAQ,gBAAgB,IAC3C,CAAC;IACL,YAAY,QAAQ,eAAe,gBAAgB,gBAAgB;IACnE,OAAO,WAAW,WAAW,YAAY;KACvC,eAAe,MAAM;KACrB,GAAG,gCAAgC,WAAW,SAAS,WAAW,SAAS,KAAK;KAChF,eAAe,MAAM;KACrB,OAAO;IACT;GACF,CAAC;GACD,IAAI,CAAC,QACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,gCAAgC,kBAClC;GAEF,OAAO;EACT,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;AACF;;AAGA,SAAS,cACP,QACA,WACA,YACS;CACT,IAAI,CAAC,UAAU,OAAO,SAAS,QAC7B,OAAO;EAAE,MAAM;EAAG,QAAQ;EAAG,OAAO;EAAW,KAAK;CAAW;CAEjE,MAAM,QAAA,GAAA,8BAAA,iBAAA,CAAwB,OAAO,IAAI;CACzC,IAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,OAAO,KAAK,QAC9C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,qCAAqC;CAEzF,OAAO;AACT;;;;;;;;;;;;;;;ACjDA,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;CAGH,KAAK,QAAyC;EAC5C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,QAAQ,GAAG,2BAA2B,MAAM;EAClD,MAAM,QAA4B,CAAC;EACnC,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;GAC1C,MAAM,gBAAgB,GAAG,sBAAsB,QAAQ,KAAK;GAC5D,IAAI,CAAC,eAAe;GACpB,MAAM,MAAM,kBAAkB,IAAI,KAAK,QAAQ,KAAK,KAAK;GACzD,MAAM,KAAK;IAAE,GAAG,uBAAuB,IAAI,KAAK,aAAa;IAAG;IAAK;GAAM,CAAC;EAC9E;EACA,OAAO;CACT;;CAGA,SACE,KACA,MACA,iBACA,QAC6B;EAC7B,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ,GAAG;EACzD,IAAI,QAAQ,GACV,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,IAAI,IAAI,kBACxC;EAEF,MAAM,gBAAgB,GAAG,sBAAsB,QAAQ,KAAK;EAC5D,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,2BAA2B,IAAI,IAAI,sBAAsB,MAAM,yBACjE;EAEF,MAAM,OAAO,uBAAuB,IAAI,KAAK,aAAa;EAC1D,OAAO,KAAK,QAAQ,eAAe,KAAK,MAAM,KAAK,UAAU,MAAM,eAAe;CACpF;;CAGA,mBACE,kBACA,KACA,MACA,iBACA,QAC6B;EAC7B,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI,WAAuB;EAC3B,IAAI;GACF,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GACnE,MAAM,gBAAgB,GAAG,4BAA4B,QAAQ;GAC7D,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uEACF;GAEF,MAAM,OAAO,uBAAuB,IAAI,KAAK,aAAa;GAC1D,OAAO,KAAK,QAAQ,eAAe,KAAK,MAAM,KAAK,UAAU,MAAM,eAAe;EACpF,UAAU;GACR,IAAI,aAAa,MAAM,GAAG,oBAAoB,QAAQ;GACtD,KAAK,QAAQ,gBAAgB;EAC/B;CACF;CAEA,QACE,eACA,MACA,UACA,MACA,iBAC6B;EAC7B,IAAI,SAAS,KAAA,GAAW;GACtB,MAAM,EAAE,SAAS,wBAAwB,KAAK,SAAS,eAAe,MAAM,eAAe;GAC3F,OAAO;IAAE;IAAM,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;IAAI;IAAM;GAAK;EAC/D;EACA,MAAM,EAAE,OAAO,SAAS,0BAA0B,KAAK,SAAS,eAAe,eAAe;EAC9F,OAAO;GAAE;GAAM,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;GAAI;GAAM;EAAM;CAChE;AACF;;;;;;;;;;;;;;;ACjGA,IAAa,oBAAb,MAA+B;CAC7B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;CAQH,OACE,MACA,WACA,QACwB;EACxB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,WAAW,YAAY,KAAK;EAClC,IAAI,CAAC,UACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wCAAwC,KAAK,SAAS,sDACxD;EAEF,IAAI,KAAK,KAAK,WAAW,GACvB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;EAMrF,IAAI,uBAAuB,IAAI,KAAK,QAAQ;GAAE,MAAM;GAAO,KAAK,KAAK;EAAK,CAAC,MAAM,IAC/E,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,8BAA8B,KAAK,KAAK,qDAC1C;EAGF,eAAe,MAAM;EACrB,MAAM,UAAU,IAAI,eAAe,KAAK,IAAI;EAC5C,IAAI;EACJ,IAAI;GACF,gBAAgB,GAAG,sBAAsB,QAAQ,OAAO;EAC1D,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;EACA,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;EAGtF,2BAA2B,IAAI,KAAK,eAAe,QAAQ,MAAM,QAAQ;EAGzE,MAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ;GAAE,MAAM;GAAO,KAAK,KAAK;EAAK,CAAC;EACrF,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,2DACF;EAEF,OAAO;GACL,SAAS;IAAE,GAAG,uBAAuB,IAAI,KAAK,aAAa;IAAG,KAAK,KAAK;IAAM;GAAM;GAEpF,OAAO;EACT;CACF;;CAGA,OAAO,KAAsB,QAA6C;EACxE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ,GAAG;EACzD,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,IAAI,IAAI,kBACxC;EAEF,IAAI,CAAC,GAAG,yBAAyB,QAAQ,KAAK,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;EAE1F,OAAO;GAAE,SAAS;GAAK,OAAO;EAAK;CACrC;AACF;;;;;;;;;;;;;;;ACrGA,SAAgB,kBAAkB,OAKJ;CAC5B,MAAM,YAAY,MAAM,aAAa;CACrC,OAAO;EACL,iBAAiB,YAAY,cAAc;EAC3C,4BAA4B;EAC5B,yBAAyB,YAAY,MAAM,0BAA0B;EACrE,oBAAoB,MAAM;EAC1B,0BAA0B,kCAAkC,MAAM,eAAe;EACjF,aAAa,MAAM;EACnB,kBAAkB,MAAM;CAC1B;AACF;;;;;AAMA,SAAgB,iBAAiB,MAAwB;CACvD,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,SAAS,GAAG,OAAO;CACvB,OAAO;AACT;;;ACnCA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;;;;;;;;;;;AAY1B,IAAa,iBAAb,MAA4B;CAC1B,YAAY,SAA4C;EAA3B,KAAA,UAAA;EAI3B,kBAAkB,KAAK,OAAO;CAChC;CAEA,UAAU,MAAc,WAA0B,MAAiC;EACjF,MAAM,MAAM,KAAK,IAAI;EACrB,IAAI,SAA4E;EAChF,IAAI,SAAqB;EACzB,IAAI;GACF,SAAS,KAAK,QAAQ,WAAW,aAAa,IAAI;GAClD,SAAS,KAAK,QAAQ,GAAG,wBAAwB,OAAO,KAAK,YAAY,EAAE;GAC3E,IAAI,CAAC,QAAQ;IACX,MAAM,MAAM,KAAK,QAAQ,GAAG,kBAAkB;IAC9C,IAAI,QAAQ,mBACV,OAAO;KACL,iBAAiB;KACjB,4BAA4B;KAC5B,yBAAyB;KACzB,oBAAoB;KACpB,0BAA0B;KAC1B,aAAa;KACb,kBAAkB;IACpB;IAEF,IAAI,QAAQ,mBACV,OAAO;KACL,iBAAiB;KACjB,4BAA4B;KAC5B,yBAAyB;KACzB,oBAAoB;KACpB,0BAA0B;KAC1B,aAAa;KACb,kBAAkB;IACpB;IAEF,OAAO,gBAAgB,GAAG;GAC5B;GAEA,MAAM,YAAY,KAAK,QAAQ,GAAG,iBAAiB,MAAM;GAKzD,MAAM,OAAO,aAAa,KAAK,QAAQ,GAAG,uBAAuB,MAAM,CAAC;GAMxE,OAAO,kBAAkB;IACvB,UANe,CAAC,YACd,SACA,KAAK,QAAQ,GAAG,qBAAqB,MAAM,IACzC,UACA;IAGJ,iBAAiB;IACjB,yBAAyB,YACrB,KAAK,QAAQ,GAAG,gCAAgC,MAAM,IACtD;IACJ,UAAU;GACZ,CAAC;EACH,UAAU;GACR,IAAI,QAAQ,KAAK,QAAQ,GAAG,mBAAmB,MAAM;GACrD,QAAQ,MAAM;EAChB;CACF;;;;;;;CAQA,qBAAqB,SAAqD;EACxE,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,QAAQ,cAAc;EACrC,MAAM,YAAY,GAAG,iBAAiB,MAAM;EAC5C,MAAM,OAAO,aAAa,GAAG,2BAA2B,MAAM,CAAC;EAE/D,OAAO,kBAAkB;GACvB,UAFe,CAAC,YAAY,SAAS,GAAG,qBAAqB,MAAM,IAAI,UAAU;GAGjF,iBAAiB;GACjB,yBAAyB,YAAY,GAAG,gCAAgC,MAAM,IAAI;GAClF,UAAU,KAAK,IAAI;EACrB,CAAC;CACH;;;;;;;CAQA,yBACE,SACA,UACA,OAAwB,OACG;EAC3B,MAAM,SAAS,QAAQ,cAAc;EACrC,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,MAAM,qBAAqB,IAAI,MAAM,CAAC;EACtC,MAAM,0BAA0B,IAAI,MAAM,CAAC;EAC3C,MAAM,cAAc,IAAI,MAAM,CAAC;EAC/B,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,IAAI,KAAK,oBAAoB,OAAO,CAAC;GACrC,IAAI,KAAK,yBAAyB,OAAO,CAAC;GAC1C,IAAI,KAAK,aAAa,OAAO,CAAC;GAS9B,IAAI,CARO,GAAG,8BACZ,QACA,UACA,SACA,oBACA,yBACA,WAEI,GACJ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,sBAAsB,6BAA6B;GAE3F,MAAM,WAAW,iBAAiB,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,CAAC;GAClE,IAAI,SAAS,WAAW,aAAa,SACnC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,sBAAsB,yBAAyB;GAEvF,OAAO,kBAAkB;IACvB;IACA,iBAAiB,aAAa,OAAO,IAAI,KAAK,yBAAyB,KAAK,CAAC,CAAC;IAC9E,yBAAyB,OAAO,IAAI,KAAK,aAAa,KAAK,CAAC;IAC5D,UAAU,KAAK,IAAI;GACrB,CAAC;EACH,UAAU;GACR,IAAI,KAAK,WAAW;GACpB,IAAI,KAAK,uBAAuB;GAChC,IAAI,KAAK,kBAAkB;GAC3B,IAAI,KAAK,OAAO;EAClB;CACF;AACF;AAEA,SAAS,gBAAgB,KAAwC;CAC/D,OAAO;EACL,iBAAiB;EACjB,4BAA4B;EAC5B,yBAAyB;EACzB,oBAAoB;EACpB,0BAA0B;EAC1B,aAAa;EACb,kBAAkB;CACpB;AACF;;;ACzKA,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAE5B,SAAgB,iBAAiB,MAA2B;CAC1D,OAAO,SAAS,gBAAgB,mBAAmB;AACrD;AAEA,SAAgB,eAAe,QAA6B;CAC1D,IAAI,WAAW,GACb,OAAO,IAAIC,8BAAAA,YACTC,8BAAAA,gBAAgB,eAChB,uFACF;CAEF,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,+BAA+B;AACvF;;;;;;;;;;;;;;;;;ACGA,IAAa,gBAAb,MAA2B;CACzB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,oBAA0D;EACxD,KAAK,aAAa;EAElB,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,IAAI,cAA0B;EAC9B,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,IAAI,KAAK,WAAW,OAAO,EAAE;GAC7B,cAAc,GAAG,yCACf,KAAK,QAAQ,cAAc,GAC3B,SACA,SACF;GACA,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,IAAI,CAAC,eAAe,WAAW,KAAK,QAAQ,GAC1C,MAAM,eAAe,MAAM;GAG7B,MAAM,QAAQ,IAAI,UAAU,aAAa,IAAI;GAC7C,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;GAAK;EAC/B,UAAU;GACR,IAAI,aAAa,GAAG,gBAAgB,WAAW;GAC/C,IAAI,KAAK,SAAS;GAClB,IAAI,KAAK,OAAO;EAClB;CACF;CAEA,wBAAwB,MAAgC;EACtD,KAAK,aAAa;EAElB,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,MAAM,SAAS,KAAK,QAAQ,UAAU,WAAW,IAAI;EACrD,IAAI;GACF,IAAI,KAAK,WAAW,OAAO,EAAE;GAC7B,MAAM,KAAK,GAAG,4BACZ,KAAK,QAAQ,cAAc,GAC3B,OAAO,KACP,SACF;GACA,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,IAAI,CAAC,MAAM,WAAW,GACpB,MAAM,eAAe,MAAM;GAE7B,OAAO,EAAE,KAAK;EAChB,UAAU;GACR,OAAO,MAAM;GACb,IAAI,KAAK,SAAS;EACpB;CACF;CAEA,uBAAuB,MAAyD;EAC9E,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,IAAI,SAAqB;EACzB,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAK1B,SAAS,GAAG,+BACV,KAAK,QAAQ,cAAc,GAC3B,iBAAiB,IAAI,GACrB,OACF;GACA,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,IAAI,CAAC,UAAU,QAAQ,GACrB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;GAGhF,MAAM,QAAQ,IAAI,UAAU,QAAQ,IAAI;GACxC,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;GAAK;EAC/B,UAAU;GACR,IAAI,QAAQ,GAAG,gBAAgB,MAAM;GACrC,IAAI,KAAK,OAAO;EAClB;CACF;CAEA,qBAAqB,MAAc,MAAqC;EACtE,MAAM,SAAS,KAAK,QAAQ,UAAU,WAAW,IAAI;EACrD,IAAI;GAQF,IAAI,CALO,KAAK,QAAQ,GAAG,gBACzB,KAAK,QAAQ,cAAc,GAC3B,OAAO,KACP,iBAAiB,IAAI,CAEjB,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;GAEhF,OAAO,EAAE,KAAK;EAChB,UAAU;GACR,OAAO,MAAM;EACf;CACF;CAEA,eAA6B;EAC3B,IAAI,KAAK,QAAQ,SAAS,SACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;CAEvF;AACF;;;;;;;;;;;;;;;;;;;;;AC7FA,IAAa,gBAAb,MAA2B;CASzB,YACE,SAEA,KACA;EAHiB,KAAA,UAAA;EAEA,KAAA,MAAA;EALF,gBAAA,MAAA,eAAqC,CAAC,CAAA;CAMpD;;;;;;;;;CAUH,SACE,SACA,YACA,QACA,QACA,OACM;EACN,IAAI,MAAM,eAAe,GACvB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oBAAoB,SAAS;EAEjF,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,MAAM,IAAI,MAAM,MAAM,UAAU;EACtC,IAAI;GACF,IAAI,WAAW,KAAK,KAAK;GACzB,MAAM,KAAK,GAAG,2BAA2B,YAAY,QAAQ,QAAQ,KAAK,MAAM,UAAU;GAC1F,IAAI,OAAO,GACT,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uDAAuD,SACzD;GAEF,KAAK,IAAI,IAAI,SAAS,EAAE;EAC1B,UAAU;GACR,IAAI,KAAK,GAAG;EACd;CACF;;;;;;;;CASA,qBACE,SACA,YACA,QACA,QACA,MACM;EACN,MAAM,SAAS,KAAK,QAAQ,WAAW,aAAa,IAAI;EACxD,IAAI,KAAK;EACT,IAAI;GACF,KAAK,KAAK,QAAQ,GAAG,sBAAsB,YAAY,QAAQ,QAAQ,OAAO,GAAG;EACnF,SAAS,OAAO;GACd,OAAO,MAAM;GACb,MAAM;EACR;EACA,IAAI,OAAO,GAAG;GACZ,OAAO,MAAM;GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uDAAuD,QAAQ,IAAI,KAAK,EAC1E;EACF;EACA,KAAK,IAAI,IAAI,SAAS,EAAE;EACxB,KAAK,YAAY,KAAK,MAAM;CAC9B;;;;;;;CAQA,gBAAgB,OAAyC;EACvD,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,KAAK,WAAW,KAAA,IAAY,KAAK,KAAK,SAAS,IAAI;GAClE,KAAK,qBACH,KAAK,KACL,KAAK,cAAc,IACnB,KAAK,UAAU,GACf,QACA,KAAK,IACP;GACA,IAAI,KAAK,UACP,KAAK,YAAY,KAAK,GAAG;EAE7B;CACF;;CAGA,YAAY,SAAuB;EACjC,MAAM,KAAK,KAAK,UAAU,OAAO;EACjC,IAAI,CAAC,KAAK,QAAQ,GAAG,yBAAyB,EAAE,GAC9C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uBAAuB,SAAS;CAEtF;CAEA,iBAAuB;EACrB,KAAK,QAAQ,GAAG,4BAA4B;CAC9C;;CAGA,QAAc;EACZ,KAAK,QAAQ,GAAG,8BAA8B;EAC9C,KAAK,IAAI,MAAM;EAEf,KAAK,MAAM,UAAU,KAAK,aACxB,OAAO,MAAM;EAEf,KAAK,YAAY,SAAS;CAC5B;;CAGA,MAAM,SAAyB;EAC7B,OAAO,KAAK,UAAU,OAAO;CAC/B;CAEA,UAAkB,SAAyB;EACzC,MAAM,KAAK,KAAK,IAAI,IAAI,OAAO;EAC/B,IAAI,OAAO,KAAA,GACT,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uCAAuC,SACzC;EAEF,OAAO;CACT;AACF;;;;;;;;ACxKA,SAAgB,gBACd,SACA,OACA,KACe;CACf,MAAM,EAAE,OAAO;CACf,IAAI,IAAI,SAAS,gBAAgB;EAC/B,MAAM,aAAa,GAAG,+BAA+B,OAAO,IAAI,iBAAiB;EACjF,IAAI,aAAa,GACf,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,gCAAgC,IAAI,mBACtC;EAEF,OAAO;GAAE;GAAY,mBAAmB,IAAI;EAAkB;CAChE;CAEA,MAAM,QAAQ,GAAG,qBAAqB,KAAK;CAC3C,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAIzB,KAFE,gBAAgB,QAAQ,MAAM,KAAK,QAAQ,GAAG,sBAAsB,OAAO,GAAG,KAAK,GAAG,CAAC,KACvF,QACW,IAAI,MACf,OAAO;EAAE,YAAY;EAAG,mBAAmB,GAAG,wBAAwB,OAAO,CAAC;CAAE;CAGpF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,0BAA0B,IAAI,KAAK,EAAE;AACvF;;;;;;;;ACxBA,IAAa,aAAb,MAAwB;CACtB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,SAAS,QAAmC;EAC1C,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,OAAO,iBAAiB,KAAK,SAAS,OAAO,KAAK,QAAQ,cAAc,CAAC;CAC3E;CAEA,MAAM,KAAmB,QAAmC;EAC1D,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,EAAE,eAAe,gBAAgB,KAAK,SAAS,OAAO,GAAG;EAC/D,OAAO,YAAY,KAAK,SAAS,OAAO,YAAY,KAAK,QAAQ,cAAc,CAAC;CAClF;;;;;;CAOA,WACE,QACA,QACgD;EAChD,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,OAAO,WAAW,QAAQ,GAAG,qBAAqB,GAAG;EAE3D,MAAM,SAAS,KAAK,QAAQC,yBAAAA,UAAU,GAAGA,yBAAAA,UAAU,CAAC;EACpD,IAAI,UAAU,GACZ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,QAAQ,OAAO,eAAe;EAE/E,OAAO,YAAY,KAAK,SAAS,QAAQ;GAEvC,IADgB,KAAK,QAAQF,yBAAAA,UAAU,GAAG,KAAK,MACrC,MAAM,QACd,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,QAAQ,OAAO,eAAe;GAE/E,MAAM,OAAO,IAAI,UAAU,KAAK,MAAM;GACtC,MAAM,QAAQ,IAAI,YAAY,KAAK,UAAU;GAC7C,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,IAAI;GAC9B,OAAO;IAAE;IAAQ;GAAM;EACzB,CAAC;CACH;AACF;;;AC7DA,MAAM,sBAAsB;;;;;;;;AAS5B,SAAgB,uBACd,SACA,SACA,WACQ;CACR,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,OAAO,QAAQ,SAAS;CAC9B,MAAM,UAAU,KAAK,QAAQ,UAAU,gBAAgB;CACvD,IAAI;EACF,MAAM,WAAW,GAAG,qBAAqB,SAAS,mBAAmB;EACrE,IAAI,aAAaC,yBAAAA,UACf,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC;EAErF,IAAI;GACF,aAAa,IAAI,KAAK,UAAU,UAAU,IAAI;GAC9C,IAAI,UAAU,YACZ,iBAAiB,IAAI,KAAK,UAAU,UAAU,UAAU;GAE1D,MAAM,qBAAqB,GAAG,0BAA0B,QAAQ;GAChE,IAAI,sBAAsB,GACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,wCAAwC;GAEzF,OAAO;EACT,UAAU;GACR,GAAG,oBAAoB,QAAQ;EACjC;CACF,UAAU;EACR,KAAK,QAAQ,UAAU,gBAAgB;CACzC;AACF;;;;;;;;;ACxCA,MAAa,kBAAkB;CAC7B,UAAU;CACV,UAAU;CACV,UAAU;CACV,WAAW;CACX,UAAU;CACV,eAAe;CACf,MAAM,KAAK;CACX,aAAa,KAAK;CAClB,MAAM,KAAK;CACX,gBAAgB,KAAK;AACvB;;;;;AAQA,SAAgB,UAAU,OAGxB;CACA,IAAI,UAAU;CACd,IAAI,YAAY;CAChB,KAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,eAAe,GAAG;EACzD,MAAM,QAAQ,MAAM;EACpB,IAAI,UAAU,MAAM,WAAW;OAC1B,IAAI,UAAU,OAAO,aAAa;CACzC;CACA,OAAO;EAAE;EAAS;CAAU;AAC9B;;;;;;;;;AC3BA,SAAgB,oBACd,SACA,QACA,MACG;CACH,MAAM,EAAE,QAAQ;CAChB,MAAM,aAAa,OAAO,KAAK,UAAU,IAAI,eAAe,KAAK,CAAC;CAClE,MAAM,SAAS,QAAQ,SAAS;CAChC,MAAM,UAAU,SAAS,IAAI;CAC7B,IAAI;EACF,OAAO,YAAY,KAAK,KAAK,IAAI,GAAG,WAAW,SAAS,OAAO,IAAI,aAAa;GAC9E,WAAW,SAAS,KAAK,MACvB,SACI,IAAI,KAAK,UAAU,OAAO,OAAO,GAAG,GAAG,IAAI,CAAC,IAC5C,IAAI,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC,CAC1C;GACA,OAAO,KAAK,UAAU,WAAW,MAAM;EACzC,CAAC;CACH,UAAU;EACR,KAAK,IAAI,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAC1C,IAAI,KAAK,WAAW,EAAE;CAE1B;AACF;;;ACLA,MAAM,cAAc;CAClB,UAAU;CACV,OAAO;CACP,MAAM;CACN,UAAU;CACV,SAAS;AACX;;AAGA,MAAMC,6BAA2B;AAGjC,MAAM,0BAA0B;;;;;AAMhC,MAAMC,eAA2B;CAAE,eAAe,CAAC;CAAG,YAAY;AAAK;AAEvE,MAAM,uBAA0E;CAC9E,MAAM,CAAC,MAAM;CACb,QAAQ,CAAC,YAAY,OAAO;CAC5B,QAAQ,CAAC,YAAY,SAAS;AAChC;;;;;;;AAQA,IAAa,cAAb,MAAyB;CACvB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,SAAS,KAAmB,OAAuB,QAAyC;EAC1F,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,SAAS,iBAAiB;EAE9C,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EAEjG,IAAI,CADY,qBAAqB,MAAM,KAC/B,CAAC,SAAS,OAAO,MAAM,GACjC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,eAAe,MAAM,KAAK,yBAAyB,OAAO,OAAO,QACnE;EAGF,MAAM,UAAU,KAAK,WAAW,SAAS,mBAAmB,KAAK;EACjE,OAAO,KAAK,SAAS,SAAS,mBAAmB,OAAO;CAC1D;CAEA,MAAM,KAAmB,QAAyC;EAChE,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,SAAS,iBAAiB;EAE9C,MAAM,UAAU,KAAK,oBAAoB,KAAK,KAAK,aACjD,KAAK,QAAQ,GAAG,oBACd,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,KACA,KACA,QACF,CACF;EACA,IAAI,YAAY,MACd,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,4BAA4B;EAEhF,OAAO,KAAK,SAAS,SAAS,mBAAmB,OAAO;CAC1D;CAEA,WACE,MACA,QACA,QACkB;EAClB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,IAAI,WAAW,IAAI;EACjC,IAAI,MAAM,eAAe,GACvB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;EAE7E,MAAM,iBAAiB,UAAU,YAAY,KAAK;EAClD,MAAM,OAAO,mBAAmB,QAAQ,GAAG,qBAAqB,GAAG;EACnE,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,WAAW,aAAa,KAAK,CAAC,MAAM,YAAY,EAAE,IAAI,CAAC,SAAS,eAAe;GACnF,IAAI,WAAW,SAAS,KAAK;GAE7B,IAAI,CADO,KAAK,QAAQ,SAAS,MAAM,YAAY,SAC7C,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wBAAwB,eAAe,YAAY,GACrD;GAEF,OAAO;IACL,aAAa,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACjD,eAAe,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACnD,eAAe,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACnD,gBAAgB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC;GACvD;EACF,CAAC;EAED,KAAK,QAAQ,aAAa;EAC1B,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,OAAO;GACL,GAAG;GACH,UAAU,iBAAiB,KAAK,SAAS,OAAO,KAAK,QAAQ,cAAc,CAAC;GAC5E,MAAMF;EACR;CACF;CAEA,OAAO,iBAA0B,QAAuC;EACtE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,kBAAkB,0BAA0B;EAE1D,MAAM,SAAS,YAAY,KAAK,KAAK,cAAc;GAEjD,IAAI,CADO,GAAG,gBAAgB,KAAK,QAAQ,cAAc,GAAG,OAAO,SAC7D,GACJ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oBAAoB;GAErE,OAAO;IACL,iBAAiB,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC,MAAM;IAC3D,cAAc,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IAClD,eAAe,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACnD,oBAAoB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC;IACzD,kBAAkB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC;IACvD,wBAAwB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC,MAAM;GACrE;EACF,CAAC;EAED,KAAK,QAAQ,aAAa;EAC1B,OAAO;GAAE,GAAG;GAAQ,MAAMF;EAAW;CACvC;;;;;;;;CASA,YAAY,OAAuB,QAA8C;EAC/E,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,aAAa,KAAK,aAAa,KAAK;EAC1C,IAAI,MAAM,WAAW,SACd;QAAA,MAAM,aAAa,YACtB,IAAI,CAAC,UAAU,WAAW,UAAU,YAAY,OAC9C,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gDACF;EAAA;EAKN,MAAM,aAAa,YAAY,MAAM;EACrC,MAAM,UAAU,IAAI,eAAe,MAAM,IAAI;EAC7C,IAAI;EACJ,IAAI;GACF,oBAAoB,GAAG,qBAAqB,QAAQ,YAAY,OAAO;EACzE,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;EACA,IAAI,qBAAqB,GACvB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wBAAwB,MAAM,KAAK,6BACrC;EAGF,MAAM,EAAE,SAAS,cAAc,UAC7B,KACF;EACA,IAAI,YAAY,KAAK,cAAc,GACjC,GAAG,uBAAuB,QAAQ,mBAAmB,SAAS,SAAS;EAEzE,IAAI,aAAa,SAAS,MAAM,SAC9B,KAAK,aAAa,mBAAmB,MAAM,OAAO;EAEpD,IAAI,kBAAkB,SAAS,MAAM,iBAAiB,KAAA,GACpD,KAAK,mBAAmB,mBAAmB,CAAC,MAAM,YAAY,CAAC;EAEjE,IAAI,eAAe,SAAS,MAAM,cAAc,KAAA,GAC1C;OAAA,CAAC,GAAG,wBAAwB,QAAQ,mBAAmB,MAAM,SAAS,GACxE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oBAAoB;EAAA;EAG1E,IAAI,MAAM,kBAAkB,KAAA,GAC1B,KAAK,gBACH,GAAG,gCACH,mBACA,MAAM,eACN,yBACF;EAEF,IAAI,MAAM,gBAAgB,KAAA,GACxB,KAAK,gBACH,GAAG,8BACH,mBACA,MAAM,aACN,uBACF;EAGF,KAAK,MAAM,aAAa,YAAY;GAClC,MAAM,qBAAqB,uBAAuB,KAAK,SAAS,KAAK,SAAS,SAAS;GACvF,MAAM,UACJ,MAAM,WAAW,UACb,UAAU,UACV,MAAM,WAAW,aACd,UAAU,WAAW,QACtB;GACR,IAAI,CAAC,GAAG,sBAAsB,QAAQ,mBAAmB,oBAAoB,OAAO,GAClF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,wBAAwB;EAE3E;EAEA,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,iBAAiB,EAAE;CACxD;CAEA,YACE,KACA,OACA,QACyB;EACzB,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,SAAS,iBAAiB;EAC9C,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EACjG,IAAI,OAAO,WAAW,MAAM,QAC1B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iBAAiB,MAAM,OAAO,iCAAiC,OAAO,OAAO,EAC/E;EAEF,MAAM,oBAAoB,SAAS;EAEnC,IAAI,MAAM,SAAS,KAAA,GACjB,KAAK,gBACH,GAAG,uBACH,mBACA,MAAM,MACN,qBAAqB,MAAM,KAAK,gCAClC;EAEF,MAAM,EAAE,SAAS,cAAc,UAC7B,KACF;EACA,IAAI,YAAY,KAAK,cAAc,GAC7B;OAAA,CAAC,GAAG,uBAAuB,QAAQ,mBAAmB,SAAS,SAAS,GAC1E,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAAA;EAG5E,IAAI,eAAe,SAAS,MAAM,cAAc,KAAA,GAC1C;OAAA,CAAC,GAAG,wBAAwB,QAAQ,mBAAmB,MAAM,aAAa,CAAC,GAC7E,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+CACF;EAAA;EAGJ,IAAI,kBAAkB,SAAS,MAAM,iBAAiB,KAAA,GACpD,IAAI,MAAM,iBAAiB,MACrB;OAAA,CAAC,GAAG,iCAAiC,QAAQ,iBAAiB,GAChE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,gCAAgC;EAAA,OAGpF,KAAK,mBAAmB,mBAAmB,CAAC,MAAM,YAAY,CAAC;EAGnE,IAAI,MAAM,kBAAkB,KAAA,GAC1B,KAAK,gBACH,GAAG,gCACH,mBACA,MAAM,iBAAiB,IACvB,yBACF;EAEF,IAAI,MAAM,gBAAgB,KAAA,GACxB,KAAK,gBACH,GAAG,8BACH,mBACA,MAAM,eAAe,IACrB,uBACF;EAEF,IAAI,aAAa,SAAS,MAAM,SAC9B,KAAK,aAAa,mBAAmB,MAAM,OAAO;EAGpD,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,iBAAiB,EAAE;CACxD;;;;;;CAOA,YACE,KACA,QACwE;EACxE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,SAAS,iBAAiB;EAC9C,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EAYjG,IAAI,CAVO,aAAa,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc;GAC9D,IAAI,KAAK,UAAU,OAAO,CAAC;GAC3B,OAAO,GAAG,qBACR,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,KACA,KACA,QACF;EACF,CACM,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;EAG7E,KAAK,QAAQ,aAAa;EAC1B,OAAO;GACL,0BAA0B,SAAS;GACnC,iBAAiB,OAAO,QAAQ,KAAK,OAAO;IAC1C,mBAAmB,EAAE;IACrB,kBAAkB,EAAE;GACtB,EAAE;EACJ;CACF;CAEA,aACE,KACA,QACA,SACA,QACyB;EACzB,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,SAAS,iBAAiB;EAC9C,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EACjG,MAAM,SAAS,OAAO,WAAW,cAAc,OAAO,WAAW;EACjE,MAAM,QAAQ,SAAU,YAAY,OAAO,WAAW,aAAa,QAAQ,MAAO;EAClF,IAAI,WAAW,CAAC,SAAS,UAAU,QACjC,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDACF;EAEF,IACE,CAAC,GAAG,sBACF,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,OAAO,mBACP,KACF,GAEA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sEACF;EAEF,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,SAAS,iBAAiB,EAAE;CACjE;CAEA,aACE,KACA,QACA,QACyB;EACzB,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,SAAS,iBAAiB;EAC9C,IACE,CAAC,GAAG,sBACF,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,OAAO,iBACT,GAEA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sCAAsC;EAE1F,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,SAAS,iBAAiB,EAAE;CACjE;CAEA,aAAqB,OAA0C;EAC7D,IAAI,MAAM,WAAW,SACnB,OAAO,MAAM,WAAW,CAAC;EAE3B,OAAO,MAAM,SAAS,CAAC,MAAM,MAAM,IAAI,CAAC;CAC1C;CAEA,aACE,mBACA,SACM;EACN,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAY1C,IAAI,CAXO,oBACT,KAAK,SACL,QAAQ,KAAK,MAAM,EAAE,KAAK,IACzB,cACC,oBACE,KAAK,SACL,QAAQ,KAAK,MAAM,EAAE,KAAK,IACzB,YAAY,UACX,GAAG,yBAAyB,QAAQ,mBAAmB,WAAW,YAAY,KAAK,CACvF,CAEE,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,kBAAkB;CAExE;CAEA,gBACE,QACA,mBACA,OACA,cACM;EACN,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,WAAW,IAAI,eAAe,KAAK;EACzC,IAAI;GACF,IAAI,CAAC,OAAO,QAAQ,mBAAmB,QAAQ,GAC7C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY;EAElE,UAAU;GACR,IAAI,KAAK,QAAQ;EACnB;CACF;CAEA,mBAA2B,mBAA2B,QAAiC;EACrF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAI1C,IAAI,CAHO,oBAAoB,KAAK,SAAS,SAAS,WAAW,UAC/D,GAAG,+BAA+B,QAAQ,mBAAmB,WAAW,KAAK,CAEzE,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wBAAwB;CAE9E;CAEA,cAAsB,mBAAyC;EAC7D,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,aAAa,KAAK,QAAQ,GAAG,+BAA+B,OAAO,iBAAiB;EAC1F,IAAI,aAAa,GACf,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,iCAAiC;EAElF,OAAO,YAAY,KAAK,SAAS,OAAO,YAAY,KAAK,QAAQ,cAAc,CAAC;CAClF;CAEA,eAAuB,mBAAiC;EACtD,IAAI,sBAAsB,GACxB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+DACF;CAEJ;;CAGA,WAAmB,mBAA2B,OAAiC;EAC7E,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,UAAU,KAAK,oBAAoB,KAAK,KAAK,aAAa;GAC9D,QAAQ,MAAM,MAAd;IACE,SACE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;IAC7E,KAAK,QAAQ;KACX,MAAM,UAAU,IAAI,eAAe,MAAM,KAAK;KAC9C,IAAI;MACF,OAAO,GAAG,sBAAsB,QAAQ,mBAAmB,SAAS,KAAK,KAAK,QAAQ;KACxF,UAAU;MACR,IAAI,KAAK,OAAO;KAClB;IACF;IACA,KAAK,UAEH,OAAO,GAAG,mBACR,QACA,mBACA,MAAM,SAAS,IACf,KACA,KACA,QACF;IACF,KAAK,UACH,OAAO,oBAAoB,KAAK,SAAS,MAAM,SAAS,UAAU,UAChE,GAAG,yBACD,QACA,mBACA,UACA,OACA,KACA,KACA,QACF,CACF;GACJ;EACF,CAAC;EAED,IAAI,YAAY,MACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gFACF;EAEF,OAAO;CACT;;CAGA,mBACE,MACiB;EACjB,MAAM,EAAE,QAAQ,KAAK;EACrB,OAAO,aAAa,KAAK,CAACH,6BAA2B,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc;GAC/E,IAAI,KAAK,UAAU,OAAO,CAAC;GAC3B,IAAI,CAAC,KAAK,KAAKA,4BAA0B,QAAQ,GAC/C,OAAO;GAET,MAAM,QAAQ,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC;GAC9C,MAAM,WAAW,KAAK,IAAI,OAAOA,0BAAwB;GACzD,MAAM,UAAoB,CAAC;GAC3B,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAC5B,QAAQ,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;GAElD,OAAO;EACT,CAAC;CACH;;CAGA,SAAiB,mBAA2B,gBAA8C;EACxF,KAAK,QAAQ,aAAa;EAC1B,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,aAAa,KAAK,QAAQ,GAAG,+BAA+B,OAAO,iBAAiB;EAC1F,IAAI,aAAa,GACf,MAAM,IAAIE,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,iCAAiC;EAElF,MAAM,QAAsB,YAC1B,KAAK,SACL,OACA,YACA,KAAK,QAAQ,cAAc,CAC7B;EACA,MAAM,aAAa,IAAI,IAAI,cAAc;EAOzC,OAAO;GAAE;GAAO,gBANwB,MAAM,QAC3C,QAAQ,MAAM,WAAW,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAClD,KAAK,OAAO;IACX,mBAAmB,EAAE;IACrB,kBAAkB,EAAE;GACtB,EAC2B;GAAG,MAAMF;EAAW;CACnD;AACF;;AAGA,SAAS,YAAY,OAAmC;CACtD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,QAAQ,EAAE,GAAG,KAAK;EACnD,MAAM,IAAI,MAAM;EAEhB,IAAI,MAAM,OAAQ,MAAM,OAAQ,MAAM,KAAM;EAC5C,IAAI,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,IAAM;EAC1D,OAAO,MAAM,KAAiB,SAAS;CACzC;CACA,OAAO;AACT;;;ACtlBA,MAAM,2BAA2B;AACjC,MAAM,aAA2B;CAAE,eAAe,CAAC;CAAG,YAAY;AAAK;AACvE,MAAM,eAAe;CAAE,SAAS;CAAG,QAAQ;CAAG,SAAS;CAAG,QAAQ;AAAE;;AAepE,IAAa,sBAAb,MAAiC;CAC/B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,MAAM,SAAuB,QAAwC;EACnE,eAAe,MAAM;EACrB,MAAM,wBAAwB,IAAI,wBAAwB;EAC1D,MAAM,qBAAqB,IAAI,wBAAwB;EACvD,MAAM,YAAY,QAAQ,KAAK,WAAW,KAAK,UAAU,QAAQ,qBAAqB,CAAC;EACvF,MAAM,UAA8B,CAAC;EACrC,MAAM,oCAAoB,IAAI,IAA2B;EACzD,IAAI,eAAe;EACnB,IAAI,OAAO;EAEX,KAAK,IAAI,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS;GACrD,MAAM,OAAO,UAAU;GACvB,IAAI,QAAS,OAAO,WAAW,cAAe;IAC5C,OAAO;IACP,QAAQ,KAAK,YAAY,OAAO,SAAS,CAAC;IAC1C;GACF;GACA,IAAI,OAAO,SAAS,eAAe,MAAM;GACzC,IAAI,KAAK,OAAO;IACd,QAAQ,KAAK;KACX,GAAG,YAAY,OAAO,UAAU;KAChC,QAAQ,KAAK;KACb,OAAO,KAAK;IACd,CAAC;IACD;GACF;GAEA,IAAI;GACJ,IAAI;IACF,SAAS,KAAK,mBAAmB,KAAK,iBAAiB,KAAK,UAAU,YAAY,CAAC;GACrF,SAAS,OAAO;IAGd,MAAM,SAAS,eAAe,WAAW;IACzC,QAAQ,KAAK;KAAE,GAAG,YAAY,OAAO,MAAM;KAAG,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAAE,CAAC;IAC5E,IAAI,WAAW,UAAU,OAAO;IAChC;GACF;GAEA,IAAI,OAAO,KAAK,QAAQ,MAAM,GAAG;IAC/B,QAAQ,KAAK;KAAE,GAAG,YAAY,OAAO,WAAW;KAAG,QAAQ;IAAO,CAAC;IACnE;GACF;GAEA,IAAI;IACF,MAAM,SAAS,KAAK,YAAY,KAAK,QAAQ,KAAK,kBAAkB;IACpE,IAAI,CAAC,OAAO,IAAI;KAGd,eAAe;KACf,KAAK,QAAQ,aAAa;KAC1B,MAAM,SAAS,KAAK,qBAAqB,KAAK,oBAAoB,kBAAkB;KACpF,MAAM,iBAAiB,WAAW,OAAO,4BAA4B,QAAQ,MAAM;KACnF,gBAAgB,mBAAmB,cAAc;KACjD,QAAQ,KAAK;MACX;MACA,QAAQ;MACR;MACA;MACA,QAAA,GAAA,8BAAA,eAAA,CACE,IAAIG,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,2CAA2C,CACtF;KACF,CAAC;KACD,OAAO;KACP;IACF;IAGA,IAAI,CADY,mBAAmB,KAAK,QAAQ,QAAQ,OAAO,0BACpD,GAAG;KACZ,QAAQ,KAAK;MAAE,GAAG,YAAY,OAAO,WAAW;MAAG,QAAQ;KAAO,CAAC;KACnE;IACF;IAEA,eAAe;IACf,KAAK,QAAQ,aAAa;IAC1B,MAAM,SAAS,KAAK,qBAAqB,KAAK,oBAAoB,kBAAkB;IACpF,MAAM,iBAAiB,WAAW,OAAO,4BAA4B,QAAQ,MAAM;IACnF,gBAAgB,mBAAmB,cAAc;IACjD,QAAQ,KAAK;KAAE;KAAO,QAAQ;KAAW;KAAQ;IAAe,CAAC;GACnE,SAAS,OAAO;IACd,eAAe;IACf,KAAK,QAAQ,aAAa;IAC1B,QAAQ,KAAK;KACX;KACA,QAAQ;KACR,QAAQ,KAAK,qBAAqB,KAAK,oBAAoB,kBAAkB;KAC7E,gBAAgB,CAAC;KACjB,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAC7B,CAAC;IACD,OAAO;GACT;EACF;EAEA,OAAO;GACL;GACA,gBAAgB,CAAC,GAAG,kBAAkB,OAAO,CAAC;GAC9C,MAAM,eAAe,aAAa;EACpC;CACF;CAEA,UAAkB,QAAoB,cAAwD;EAC5F,IAAI;GACF,MAAM,OAAO,OAAO,SAAS,UAAU,OAAO,OAAO,CAAC,OAAO,GAAG;GAChE,IAAI,KAAK,WAAW,GAClB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0CACF;GAEF,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;GACzD,MAAM,WAAW,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAO,GAAG,CAAC;GAC3D,MAAM,SAAS,SAAS,KAAK,EAAE,iBAC7B,YAAY,KAAK,SAAS,OAAO,YAAY,KAAK,QAAQ,cAAc,GAAG,YAAY,CACzF;GACA,eAAe,QAAQ,MAAM;GAC7B,OAAO;IACL;IACA,oBAAoB,SAAS,KAAK,EAAE,wBAAwB,iBAAiB;IAC7E;GACF;EACF,SAAS,OAAO;GACd,OAAO;IAAE;IAAQ,oBAAoB,CAAC;IAAG,QAAQ,CAAC;IAAG,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;GAAE;EACpF;CACF;CAEA,QACE,OACA,KACmD;EACnD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,IAAI,SAAS,qBAAqB,GAChC,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,6CACF;EAEF,OAAO;CACT;CAEA,UACE,mBACA,eAAe,IAAI,wBAAwB,GAC7B;EACd,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,QAAQ,KAAK,QAAQ,GAAG,+BAA+B,OAAO,iBAAiB;EACrF,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,wBAAwB;EAElF,OAAO,YAAY,KAAK,SAAS,OAAO,OAAO,KAAK,QAAQ,cAAc,GAAG,YAAY;CAC3F;CAEA,qBACE,oBACA,cACgB;EAChB,MAAM,SAAyB,CAAC;EAChC,KAAK,MAAM,gBAAgB,oBACzB,IAAI;GACF,OAAO,KAAK,KAAK,UAAU,cAAc,YAAY,CAAC;EACxD,QAAQ,CAGR;EAEF,OAAO;CACT;CAEA,YAAoB,QAAoB,oBAAkD;EACxF,IAAI,OAAO,SAAS,SAAS;GAC3B,MAAM,UAAoB,CAAC;GAC3B,KAAK,MAAM,gBAAgB,oBAAoB;IAC7C,MAAM,SAAS,KAAK,oBAAoB,KAAK,KAAK,aAChD,KAAK,QAAQ,GAAG,oBACd,KAAK,QAAQ,cAAc,GAC3B,cACA,KACA,KACA,QACF,CACF;IACA,QAAQ,KAAK,GAAG,OAAO,0BAA0B;IACjD,IAAI,CAAC,OAAO,IAAI,OAAO;KAAE,IAAI;KAAO,4BAA4B;IAAQ;GAC1E;GACA,OAAO;IAAE,IAAI;IAAM,4BAA4B;GAAQ;EACzD;EAEA,MAAM,eAAe,mBAAmB;EACxC,QAAQ,OAAO,MAAf;GACE,KAAK,YACH,OAAO,KAAK,WAAW,cAAc,OAAO,KAAK;GACnD,KAAK,cACH,OAAO,KAAK,oBAAoB,KAAK,KAAK,aACxC,KAAK,QAAQ,GAAG,yBACd,KAAK,QAAQ,cAAc,GAC3B,cACA,aAAa,OAAO,UACpB,KACA,KACA,QACF,CACF;GACF,KAAK,qBAAqB;IACxB,MAAM,UAAU,KAAK,QAAQ,IAAI,eAAe,OAAO,IAAI;IAC3D,IAAI;KACF,OAAO,KAAK,oBAAoB,KAAK,KAAK,aACxC,KAAK,QAAQ,GAAG,gCACd,KAAK,QAAQ,cAAc,GAC3B,cACA,SACA,KACA,KACA,QACF,CACF;IACF,UAAU;KACR,KAAK,QAAQ,IAAI,KAAK,OAAO;IAC/B;GACF;EACF;CACF;CAEA,WAAmB,mBAA2B,OAA2C;EACvF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,OAAO,KAAK,oBAAoB,KAAK,KAAK,aAAa;GACrD,IAAI,MAAM,SAAS,UACjB,OAAO,GAAG,mBACR,QACA,mBACA,MAAM,SAAS,IACf,KACA,KACA,QACF;GAEF,IAAI,MAAM,SAAS,UACjB,OAAO,oBAAoB,KAAK,SAAS,MAAM,SAAS,WAAW,UACjE,GAAG,yBACD,QACA,mBACA,WACA,OACA,KACA,KACA,QACF,CACF;GAEF,MAAM,WAAW,IAAI,eAAe,MAAM,KAAK;GAC/C,IAAI;IACF,OAAO,GAAG,sBAAsB,QAAQ,mBAAmB,UAAU,KAAK,KAAK,QAAQ;GACzF,UAAU;IACR,IAAI,KAAK,QAAQ;GACnB;EACF,CAAC;CACH;CAEA,mBACE,MACoB;EACpB,MAAM,EAAE,QAAQ,KAAK;EACrB,OAAO,aAAa,KAAK,CAAC,2BAA2B,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc;GAC/E,IAAI,KAAK,UAAU,OAAO,CAAC;GAC3B,MAAM,KAAK,KAAK,KAAK,0BAA0B,QAAQ;GACvD,MAAM,QAAQ,KAAK,IACjB,KAAK,IAAI,GAAG,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC,CAAC,GAC7C,wBACF;GACA,MAAM,6BAAuC,CAAC;GAC9C,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SACjC,2BAA2B,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC;GAEzE,OAAO;IAAE;IAAI;GAA2B;EAC1C,CAAC;CACH;AACF;AAEA,SAAS,eAAe,QAAoB,QAA8B;CACxE,IAAI,OAAO,SAAS,SAAS;EAC3B,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,WAAW,gBAAgB,MAAM,WAAW,aACpD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,GAAG,MAAM,OAAO,wBAAwB;EAG9F;CACF;CACA,MAAM,QAAQ,OAAO;CACrB,IAAI,OAAO,SAAS,qBAAqB;EACvC,IAAI,MAAM,WAAW,UAAU,MAAM,WAAW,YAC9C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uCAAuC,MAAM,OAAO,OACtD;EAEF;CACF;CACA,IAAI,OAAO,SAAS,cAAc;CAClC,cAAc,OAAO,OAAO,KAAK;AACnC;AAEA,SAAS,cAAc,OAAqB,OAA6B;CACvE,IAAI,MAAM,SAAS,QAAQ;EACzB,IAAI,MAAM,WAAW,QAAQ,SAAS,OAAO,KAAK;EAClD;CACF;CACA,IAAI,MAAM,SAAS,UAAU;EAC3B,IAAI,MAAM,WAAW,cAAc,MAAM,WAAW,SAAS,SAAS,OAAO,KAAK;EAClF,IAAI,MAAM,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,WAAW,OAAO,YAAY,MAAM,KAAK,GACxF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;EAErF;CACF;CACA,IAAI,MAAM,WAAW,cAAc,MAAM,WAAW,WAAW,SAAS,OAAO,KAAK;CACpF,IAAI,IAAI,IAAI,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,OAAO,QAC9C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,2CAA2C;CAE/F,IAAI,MAAM,WAAW,cAAc,MAAM,OAAO,SAAS,GACvD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sCAAsC;CAE1F,IAAI,MAAM,WAAW,aAAa,CAAC,MAAM,eAAe,MAAM,OAAO,SAAS,GAC5E,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,2CAA2C;CAE/F,MAAM,eAAe,IAAI,IAAI,MAAM,QAAQ,KAAK,WAAW,OAAO,KAAK,CAAC;CAExE,IAAI,EADa,MAAM,WAAW,cAAc,MAAM,QAAQ,MAAM,OAAO,WAAW,MACrE,MAAM,OAAO,MAAM,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC,GACpE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oCAAoC;AAE1F;AAEA,SAAS,SAAS,OAAqB,OAA8B;CACnE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,eAAe,MAAM,KAAK,yBAAyB,MAAM,OAAO,QAClE;AACF;AAEA,SAAS,OAAO,QAAoB,QAAiC;CACnE,IAAI,OAAO,SAAS,qBAAqB,OAAO,OAAO,EAAE,CAAC,QAAQ,WAAW;CAC7E,IAAI,OAAO,SAAS,cAAc,OAAO,OAAO,EAAE,CAAC,QAAQ,WAAW;CACtE,IAAI,OAAO,SAAS,SAClB,OAAO,OAAO,OAAO,UAAU,kBAAkB,MAAM,YAAY,MAAM,iBAAiB,CAAC;CAE7F,MAAM,QAAQ,OAAO;CACrB,MAAM,QAAQ,OAAO;CACrB,IAAI,MAAM,SAAS,UAAU,MAAM,WAAW,QAAQ,OAAO,MAAM,UAAU,MAAM;CACnF,IAAI,MAAM,SAAS,aAAa,MAAM,WAAW,cAAc,MAAM,WAAW,UAC9E,OAAO,MAAM,QAAQ,OAAO,WAAW,OAAO,aAAa,OAAO,YAAY,MAAM,MAAM;CAE5F,IAAI,MAAM,SAAS,YAAY,MAAM,WAAW,YAC9C,OAAO,MAAM,OAAO,WAAW,IAAI,MAAM,UAAU,KAAK,MAAM,UAAU,MAAM,OAAO;CAEvF,IAAI,MAAM,SAAS,YAAY,MAAM,WAAW,WAC9C,OAAO,YAAY,MAAM,gBAAgB,MAAM,MAAM;CAEvD,OAAO;AACT;AAEA,SAAS,mBACP,QACA,QACA,4BACS;CACT,IAAI,OAAO,SAAS,gBAAgB,OAAO,SAAS,qBAClD,OAAO,2BAA2B,SAAS;CAE7C,OAAO,CAAC,OAAO,QAAQ,MAAM,KAAK,2BAA2B,SAAS;AACxE;AAEA,SAAS,kBACP,MACA,OACS;CACT,IAAI,KAAK,SAAS,MAAM,MAAM,OAAO;CACrC,IAAI,KAAK,SAAS,YAAY,MAAM,SAAS,UAAU,OAAO,KAAK,UAAU,MAAM;CACnF,IAAI,KAAK,SAAS,WAAW,MAAM,SAAS,SAC1C,OAAO,YAAY,KAAK,QAAQ,MAAM,MAAM;CAC9C,OAAO;AACT;AAEA,SAAS,YAAY,MAAyB,OAAmC;CAC/E,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,OAAO,UAAU,UAAU,MAAM,MAAM;AAC5F;AAEA,SAAS,WACP,eACA,QACA,OACiB;CACjB,MAAM,iCAAiB,IAAI,IAA2B;CACtD,KAAK,MAAM,SAAS,CAAC,GAAG,QAAQ,GAAG,KAAK,GACtC,KAAK,MAAM,UAAU,MAAM,SAAS,eAAe,IAAI,OAAO,mBAAmB,MAAM;CAEzF,OAAO,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC,CAAC,CAC/B,KAAK,iBAAiB,eAAe,IAAI,YAAY,CAAC,CAAC,CACvD,QAAQ,WAAoC,WAAW,KAAA,CAAS,CAAC,CACjE,KAAK,EAAE,mBAAmB,wBAAwB;EAAE;EAAmB;CAAiB,EAAE;AAC/F;AAEA,SAAS,gBAAgB,QAAoC,SAAgC;CAC3F,KAAK,MAAM,UAAU,SACnB,OAAO,IAAI,GAAG,OAAO,iBAAiB,GAAG,OAAO,qBAAqB,MAAM;AAE/E;AAEA,SAAS,YAAY,OAAe,QAAsD;CACxF,OAAO;EAAE;EAAO;EAAQ,QAAQ,CAAC;EAAG,gBAAgB,CAAC;CAAE;AACzD;;;;;;;;;;;;;;;;;;;AC5ZA,MAAM,mBAAmB;AAEzB,MAAM,wBAAQ,IAAI,QAAiE;AAEnF,SAAgB,kBACd,SACA,SACA,kBACA,QACY;CACZ,MAAM,MAAM,QAAQ,YAAY;CAChC,IAAI,QAAQ,MAAM,IAAI,OAAO;CAC7B,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,MAAM,IAAI,SAAS,KAAK;CAC1B;CAEA,MAAM,MAAM,MAAM,IAAI,gBAAgB;CACtC,IAAI,OAAO,IAAI,QAAQ,KAAK,OAAO;CAEnC,MAAM,WAAW,IAAI,eAAe,SAAS,OAAO,CAAC,CAAC,KAAK,kBAAkB,MAAM;CACnF,MAAM,QAAyB;EAAE;EAAK,SAAA,GAAA,8BAAA,SAAA,CAAiB,SAAS,IAAI;EAAG;CAAS;CAEhF,MAAM,OAAO,gBAAgB;CAC7B,MAAM,IAAI,kBAAkB,KAAK;CACjC,IAAI,MAAM,OAAO,kBAAkB;EACjC,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;EACnC,IAAI,WAAW,KAAA,GAAW,MAAM,OAAO,MAAM;CAC/C;CACA,OAAO;AACT;;;;AC1CA,SAAgB,eAAe,OAAoB,MAAsB;CACvE,OAAO,KAAK,UAAU;EACpB,MAAM,QAAQ,MAAM;EACpB,MAAM;EACN,MAAM,YAAY,IAAI;EACtB,MAAM,kBAAkB,IAAI;EAC5B,MAAM,YAAY,IAAI;EACtB;CACF,CAAC;AACH;AAEA,SAAgB,mBAAmB,OAAkC;CACnE,OAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAgB,mBACd,SACA,QACA,aACA,aACmB;CACnB,IAAI;CACJ,IAAI;EACF,QAAQ,KAAK,MAAM,MAAM;CAC3B,QAAQ;EACN,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;CAC7E;CACA,IAAI,OAAO,MAAM,KAAK,OAAO,MAAM,YAAY,YAAY,OAAO,MAAM,QAAQ,UAC9E,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;CAE7E,IAAI,MAAM,QAAQ,aAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iEACF;CAEF,IAAI,MAAM,QAAQ,aAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,6EACA,EAAE,SAAS;EAAE,WAAW,MAAM;EAAK,YAAY;CAAY,EAAE,CAC/D;CAGF,IAAI,QAAQ,cAAc,KAAA,KAAa,QAAQ,cAAc,MAAM,OACjE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oEACF;CAEF,OAAO;AACT;;;;;;;;;;AC5CA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;;;;;;;;;;;;;;;;AAiB5B,IAAa,eAAb,MAA0B;CACxB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,MAAM,SAAwB,QAAkC;EAC9D,eAAe,MAAM;EACrB,MAAM,QAAQ,QAAQ;EACtB,MAAM,OAAO,QAAQ,QAAQ;EAK7B,MAAM,SAAA,GAAA,8BAAA,oBAAA,CAA4B,KAAK;EACvC,IAAI,CAAC,MAAM,IACT,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yBAAyB,MAAM,MAAM,KAAK,MAAM,SAClD;EAGF,MAAM,UAAU,KAAK,QAAQ,WAAW;EACxC,MAAM,aAAa,QAAQ;EAG3B,IAAI,CAAC,MAAM,UAAA,GAAA,8BAAA,SAAA,CAAkB,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,WAAW,GAChE,OAAO;GAAE,SAAS,CAAC;GAAG,YAAY;GAAM,cAAc;GAAG;EAAW;EAGtE,MAAM,MAAM,KAAK,QAAQ,YAAY;EACrC,MAAM,MAAM,eAAe,OAAO,IAAI;EAEtC,IAAI,QAAQ;EACZ,IAAI,UAAU;EACd,IAAI,QAAQ,WAAW,KAAA,GAAW;GAChC,MAAM,QAAQ,mBAAmB,SAAS,QAAQ,QAAQ,KAAK,GAAG;GAClE,QAAQ,MAAM;GACd,UAAU,MAAM;EAClB,OAAO;GACL,IAAI,QAAQ,cAAc,KAAA,GAAW;IAEnC,KAAK,QAAQ,qBAAqB,QAAQ,SAAS;IACnD,QAAQ,QAAQ;GAClB;GACA,IAAI,QAAQ,SAAS,KAAA,GAInB,UAAU,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,UAAU;EAExE;EAGA,IAAI,QAAQ;EACZ,IAAI,UAAU,GAAG;GACf,MAAM,KAAK,QAAQ,WAAW,MAAM,EAAE,qBAAqB,KAAK;GAChE,QAAQ,QAAQ,MAAM,EAAE,CAAC,CAAC,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC;EACvD;EAEA,MAAM,WAAW,MAAM,QAAQ,QAAQ,UAAU,mBAAmB,iBAAiB;EACrF,MAAM,aAAa,MAAM,QAAQ,QAAQ,YAAY,qBAAqB,mBAAmB;EAE7F,MAAM,UAAyB,CAAC;EAChC,IAAI,iBAAiB;EAGrB,OAAO,UAAU,MAAM,UAAU,iBAAiB,YAAY,QAAQ,SAAS,YAAY;GACzF,eAAe,MAAM;GACrB,MAAM,MAAM,MAAM,QAAQ,CAAC;GAC3B,MAAM,SAAS,kBAAkB,KAAK,SAAS,KAAK,SAAS,KAAK,MAAM;GAExE,MAAM,OAAO,OAAO,SAAS;GAC7B,IAAI;GACJ,IAAI,MAAM,OACR,UAAA,GAAA,8BAAA,WAAA,CAAoB,MAAM,KAAK;QAC1B,IAAI,MAAM,aAAa,MAAM,iBAElC,UAAA,GAAA,8BAAA,aAAA,EAAA,GAAA,8BAAA,SAAA,CAA+B,OAAA,GAAA,8BAAA,eAAA,CAAqB,KAAK,CAAC,GAAG,KAAK;QAElE,UAAA,GAAA,8BAAA,aAAA,CAAsB,OAAO,QAAQ,KAAK;GAG5C,IAAI,OAAO,SAAS,GAAG;IAGrB,MAAM,UAAA,GAAA,8BAAA,oBAAA,CAFW,IAAI,mBAAmB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK,MAEpC,CAAC;IAC3C,KAAK,MAAM,SAAS,QAAQ;KAM1B,MAAM,SAAA,GAAA,8BAAA,wBAAA,CAAgC,OAAO,UAAU,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM;KAC9F,QAAQ,KAAK;MACX,kBAAkB;MAClB,WAAW,MAAM;MACjB,WAAW,MAAM,MAAM,MAAM;MAC7B,WAAA,GAAA,8BAAA,qBAAA,CAA+B,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,KAAK;MAC3E,GAAI,SAAS,SAAS,EAAE,UAAA,GAAA,8BAAA,aAAA,CAAsB,MAAM,KAAK,EAAE,IAAI,CAAC;KAClE,CAAC;IACH;GACF;GAEA;GACA;EACF;EAEA,OAAO;GACL;GACA,YACE,UAAU,MAAM,SAAS,mBAAmB;IAAE,GAAG;IAAG;IAAK;IAAK;IAAO;GAAQ,CAAC,IAAI;GACpF,cAAc;GACd;EACF;CACF;AACF;AAEA,SAAS,MAAM,WAA+B,UAAkB,SAAyB;CACvF,IAAI,cAAc,KAAA,KAAa,CAAC,OAAO,SAAS,SAAS,GAAG,OAAO;CACnE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,SAAS,GAAG,OAAO,CAAC;AAC7D;;;ACrKA,MAAM,yBAAyB;CAC7B,CAAC,aAAa,CAAC;CACf,CAAC,YAAY,CAAC;CACd,CAAC,WAAW,CAAC;CACb,CAAC,aAAa,CAAC;CACf,CAAC,YAAY,CAAC;AAChB;;AAGA,IAAa,wBAAb,MAAmC;CACjC,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,QAA8C;EACjD,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,SAAS,IAAI,wBAAwB;EAC3C,MAAM,QAAQ,GAAG,iCAAiC,MAAM;EACxD,IAAI,QAAQ,GACV,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,2CACF;EAGF,MAAM,kBAA8D,CAAC;EACrE,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;GAC1C,eAAe,MAAM;GACrB,MAAM,WAAW,GAAG,4BAA4B,QAAQ,KAAK;GAC7D,IAAI,aAAaC,yBAAAA,UACf,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,sCAAsC,EACxF,SAAS,EAAE,MAAM,EACnB,CAAC;GAEH,IAAI;GACJ,IAAI;IACF,OACE,gBAAgB,MAAM,KAAK,aACzB,GAAG,6BAA6B,UAAU,KAAK,QAAQ,CACzD,KAAK;GACT,UAAU;IACR,GAAG,8BAA8B,QAAQ;GAC3C;GAGA,OAAO,oBAAoB,KAAK,MAAM;GACtC,MAAM,SAAS,cACb,gBACE,IACA,KACA,QACA,GAAG,sCAAsC,QAAQ,KAAK,GACtD,MACF,GACA,oBACA,KACF;GACA,gBAAgB,KAAK;IAAE;IAAM;GAAO,CAAC;EACvC;EAEA,MAAM,aAAa,gBACjB,IACA,KACA,QACA,GAAG,2BAA2B,MAAM,GACpC,MACF;EAGA,MAAM,cAAc,aAAaC,yBAAAA,WAAW,GAAG,0BAA0B,MAAM;EAC/E,MAAM,kBACJ,gBAAgBA,yBAAAA,WAAW,gBAAgB,IAAI,KAAK,QAAQ,WAAW,IAAI;EAC7E,MAAM,aACJ,CAAC;EACH,KAAK,MAAM,CAAC,KAAK,UAAU,wBAAwB;GACjD,eAAe,MAAM;GACrB,MAAM,SAAS,gBACb,IACA,KACA,QACA,GAAG,iCAAiC,QAAQ,KAAK,GACjD,MACF;GACA,IAAI,QAAQ,WAAW,OAAO;EAChC;EACA,OAAO;GAAE;GAAiB;GAAY;GAAiB,GAAG;EAAW;CACvE;AACF;AAEA,SAAS,cAAc,QAA8B,OAAe,OAA8B;CAChG,IAAI,QAAQ,OAAO;CACnB,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,kBAAkB,SAAS,EAC7E,SAAS,EAAE,MAAM,EACnB,CAAC;AACH;;;AC1FA,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,WAAW;AACjB,MAAM,YAAY;;;;;;;;;;;;AAalB,IAAa,oBAAb,MAA+B;CAC7B,YACE,SACA,SACA,kBACA;EAHiB,KAAA,UAAA;EACA,KAAA,UAAA;EACA,KAAA,mBAAA;EAEjB,IAAI,qBAAqB,KAAA,GAEvB,QAAQ,qBAAqB,gBAAgB;CAEjD;CAEA,KAAK,aAAqB,QAA+C;EACvE,eAAe,MAAM;EACrB,mBAAmB,WAAW;EAC9B,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAMjB,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,0BAA0B,QAAQ,WAAW,IAChD,GAAG,8BAA8B,QAAQ,KAAK,WAAW,IACrD,OAAO;EAEjB,MAAM,WACJ,QAAQ,KAAA,IACJ,GAAG,6BAA6B,QAAQ,WAAW,IACnD,GAAG,iCAAiC,QAAQ,KAAK,WAAW;EAElE,MAAM,UAA0C,CAAC;EACjD,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;GACjC,eAAe,MAAM;GACrB,MAAM,MAAM,eAAe,MAAM,KAAK,QACpC,QAAQ,KAAA,IACJ,GAAG,0BAA0B,QAAQ,aAAa,GAAG,KAAK,GAAG,IAC7D,GAAG,8BAA8B,QAAQ,KAAK,aAAa,GAAG,KAAK,GAAG,CAC5E;GACA,IAAI,QAAQ,MAAM;GAClB,QAAQ,OAAO,KAAK,UAAU,aAAa,GAAG;EAChD;EAEA,MAAM,kBAAkB,gBACtB,MACC,KAAK,QACJ,QAAQ,KAAA,IACJ,GAAG,iCAAiC,QAAQ,aAAa,KAAK,GAAG,IACjE,GAAG,qCAAqC,QAAQ,KAAK,aAAa,KAAK,GAAG,GAChF,IACF;EACA,OAAO;GACL;GACA,cAAc,kBAAkB,aAAa,eAAe,IAAI;EAClE;CACF;CAEA,OAAO,aAAqB,OAAuB,QAA2B;EAC5E,eAAe,MAAM;EACrB,mBAAmB,WAAW;EAC9B,aAAa,KAAK;EAClB,MAAM,OAAO,OAAO,KAAK,KAAK;EAC9B,IAAI,KAAK,WAAW,GAAG;EACvB,cAAc,OAAO,IAAI;EAMzB,eAAe,MAAM;EAErB,MAAM,EAAE,QAAQ,KAAK;EAErB,MAAM,eAAe,8BAAc,IAAI,KAAK,CAAC;EAC7C,MAAM,QAAQ,IAAI,eAAe,YAAY;EAC7C,IAAI;GACF,KAAK,MAAM,OAAO,MAAM;IACtB,MAAM,QAAQ,MAAM;IAEpB,IAAI,CADO,KAAK,WAAW,aAAa,KAAK,OAAO,KAC9C,GACJ,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,qCAAqC,IAAI,mBAC3C;GAEJ;EACF,UAAU;GACR,IAAI,KAAK,KAAK;EAChB;CACF;CAEA,aAAa,QAA+B;EAC1C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EACjB,MAAM,QACJ,QAAQ,KAAA,IACJ,GAAG,+BAA+B,MAAM,IACxC,GAAG,mCAAmC,QAAQ,GAAG;EACvD,MAAM,MAAgB,CAAC;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,MAAM,OAAO,eAAe,MAAM,KAAK,QACrC,QAAQ,KAAA,IACJ,GAAG,4BAA4B,QAAQ,GAAG,KAAK,GAAG,IAClD,GAAG,gCAAgC,QAAQ,KAAK,GAAG,KAAK,GAAG,CACjE;GACA,IAAI,SAAS,MAAM,IAAI,KAAK,IAAI;EAClC;EACA,OAAO;CACT;CAEA,MAAM,aAAqB,QAA2B;EACpD,eAAe,MAAM;EACrB,mBAAmB,WAAW;EAC9B,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAKjB,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,4BAA4B,QAAQ,WAAW,IAClD,GAAG,gCAAgC,QAAQ,KAAK,WAAW,IAE/D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,6CAA6C,YAAY,EAC3D;CAEJ;CAEA,UAAkB,aAAqB,KAA6B;EAClE,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAMjB,QAJE,QAAQ,KAAA,IACJ,GAAG,8BAA8B,QAAQ,aAAa,GAAG,IACzD,GAAG,kCAAkC,QAAQ,KAAK,aAAa,GAAG,GAExE;GACE,KAAK,YAAY;IACf,MAAM,QAAQ,gBACZ,MACC,KAAK,QACJ,QAAQ,KAAA,IACJ,GAAG,2BAA2B,QAAQ,aAAa,KAAK,KAAK,GAAG,IAChE,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,KAAK,GAAG,GAC/E,EACF;IACA,OAAO,UAAU,OAAO,EAAE,MAAM,UAAU,IAAI;KAAE,MAAM;KAAU;IAAM;GACxE;GACA,KAAK,UAAU;IACb,MAAM,QAAQ,eAAe,MAAM,KAAK,QACtC,QAAQ,KAAA,IACJ,GAAG,yBAAyB,QAAQ,aAAa,KAAK,KAAK,GAAG,IAC9D,GAAG,6BAA6B,QAAQ,KAAK,aAAa,KAAK,KAAK,GAAG,CAC7E;IACA,OAAO,UAAU,OAAO,EAAE,MAAM,UAAU,IAAI;KAAE,MAAM;KAAQ;IAAM;GACtE;GACA,KAAK,YAAY;IACf,MAAM,SAAS,IAAI,MAAM,CAAC;IAC1B,IAAI;KAKF,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,2BAA2B,QAAQ,aAAa,KAAK,MAAM,IAC9D,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,MAAM,IACpE,OAAO,EAAE,MAAM,UAAU;KAClC,OAAO;MAAE,MAAM;MAAU,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;KAAE;IAClE,UAAU;KACR,IAAI,KAAK,MAAM;IACjB;GACF;GACA,KAAK,aAAa;IAChB,MAAM,SAAS,IAAI,MAAM,CAAC;IAC1B,IAAI;KAKF,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,4BAA4B,QAAQ,aAAa,KAAK,MAAM,IAC/D,GAAG,gCAAgC,QAAQ,KAAK,aAAa,KAAK,MAAM,IACrE,OAAO,EAAE,MAAM,UAAU;KAClC,OAAO;MAAE,MAAM;MAAW,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC,MAAM;KAAE;IACzE,UAAU;KACR,IAAI,KAAK,MAAM;IACjB;GACF;GACA,KAAK,WAAW;IACd,MAAM,QACJ,QAAQ,KAAA,IACJ,GAAG,qCAAqC,QAAQ,aAAa,GAAG,IAChE,GAAG,yCAAyC,QAAQ,KAAK,aAAa,GAAG;IAE/E,IAAI,QAAQ,GAAG,OAAO,EAAE,MAAM,UAAU;IACxC,MAAM,QAAkB,CAAC;IACzB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;KAC9B,MAAM,OAAO,gBACX,MACC,KAAK,QACJ,QAAQ,KAAA,IACJ,GAAG,kCAAkC,QAAQ,aAAa,KAAK,GAAG,KAAK,GAAG,IAC1E,GAAG,sCACD,QACA,KACA,aACA,KACA,GACA,KACA,GACF,GACN,EACF;KACA,IAAI,SAAS,MAAM,OAAO,EAAE,MAAM,UAAU;KAC5C,MAAM,KAAK,IAAI;IACjB;IACA,OAAO;KAAE,MAAM;KAAgB;IAAM;GACvC;GACA,SACE,OAAO,EAAE,MAAM,UAAU;EAC7B;CACF;CAEA,WACE,aACA,KACA,OACA,OACS;EACT,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAEjB,IAAI,UAAU,MACZ,OAAO,QAAQ,KAAA,IACX,GAAG,0BAA0B,QAAQ,aAAa,KAAK,KAAK,IAC5D,GAAG,8BAA8B,QAAQ,KAAK,aAAa,KAAK,KAAK;EAE3E,IAAI,OAAO,UAAU,UACnB,OAAO,iBAAiB,KAAK,QAAQ,QACnC,QAAQ,KAAA,IACJ,GAAG,2BAA2B,QAAQ,aAAa,KAAK,KAAK,KAAK,IAClE,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,KAAK,KAAK,CACjF;EAEF,IAAI,OAAO,UAAU,UACnB,OAAO,QAAQ,KAAA,IACX,GAAG,2BAA2B,QAAQ,aAAa,KAAK,OAAO,KAAK,IACpE,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,OAAO,KAAK;EAEnF,IAAI,OAAO,UAAU,WACnB,OAAO,QAAQ,KAAA,IACX,GAAG,4BAA4B,QAAQ,aAAa,KAAK,OAAO,KAAK,IACrE,GAAG,gCAAgC,QAAQ,KAAK,aAAa,KAAK,OAAO,KAAK;EAEpF,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,oBAAoB,KAAK,SAAS,QAAQ,UAAU,UACzD,QAAQ,KAAA,IACJ,GAAG,gCAAgC,QAAQ,aAAa,KAAK,UAAU,OAAO,KAAK,IACnF,GAAG,oCACD,QACA,KACA,aACA,KACA,UACA,OACA,KACF,CACN;EAEF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,OAC3D,OAAO,QAAQ,KAAA,IACX,GAAG,yBAAyB,QAAQ,aAAa,KAAK,MAAM,MAAM,KAAK,IACvE,GAAG,6BAA6B,QAAQ,KAAK,aAAa,KAAK,MAAM,MAAM,KAAK;EAItF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC,IAAI,EAAE;CAC3F;AACF;AAEA,SAAS,mBAAmB,aAA2B;CACrD,IAAI,OAAO,gBAAgB,YAAY,YAAY,WAAW,GAC5D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yCAAyC;AAE/F;AAEA,SAAS,aAAa,OAA6B;CACjD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,mCAAmC;AAEzF;AAEA,SAAS,cAAc,OAAuB,MAAsB;CAClE,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,IAAI,WAAW,GACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,kCAAkC;EAEtF,mBAAmB,KAAK,MAAM,IAAI;CACpC;AACF;AAEA,SAAS,mBAAmB,KAAa,OAAqC;CAC5E,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;CAE/E,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI,CAAC,OAAO,SAAS,KAAK,GACxB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yBAAyB,IAAI,iBAC/B;EAEF;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,IAAI,CAAC,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ,GACjD,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,IAAI,4BACrC;EAEF;CACF;CAEA,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,OAAO;EAClE,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,GAC1D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,2BAA2B,IAAI,6BACjC;EAEF;CACF;CAEA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oCAAoC,IAAI,0DAC1C;AACF;;;;;;;;;;;;;ACxNA,IAAa,aAAb,MAAwB;CActB,YACE,SASA,MAEA,UAA8C,CAAC,GAC/C;EAZiB,KAAA,UAAA;EASA,KAAA,OAAA;EAEA,KAAA,UAAA;EAzBF,gBAAA,MAAA,4BAAW,IAAI,IAA6B,CAAA;EAC5C,gBAAA,MAAA,iBAAA,KAAA,CAAA;EACA,gBAAA,MAAA,0BAAS,IAAI,IAAkC,CAAA;EAO/C,gBAAA,MAAA,2BAAU,IAAI,IAAoB,CAAA;EAClC,gBAAA,MAAA,SAAA,KAAA,CAAA;EACT,gBAAA,MAAA,aAAY,KAAA;EAgBlB,kBAAkB,KAAK,OAAO;EAC9B,KAAK,gBAAgB,IAAI,qBAAqB,KAAK,OAAO;EAC1D,KAAK,QAAQ,IAAI,cAAc,KAAK,SAAS,KAAK,OAAO;CAC3D;;;;;;;;CASA,qBAAqB,OAAyC;EAC5D,KAAK,MAAM,gBAAgB,KAAK;CAClC;CAEA,QAAQ,KAA0B;EAChC,IAAI,IAAI,SAAS,SAAS;GACxB,KAAK,OAAO,IAAI,IAAI,KAAK,CAAC,EAAE,MAAM;GAClC;EACF;EAQA,IACE,IAAI,SAAS,yBACb,IAAI,SAAS,oCACb,IAAI,SAAS,wCACb;GACA,KAAU,eAAe,GAAG;GAC5B;EACF;EAEA,MAAM,OAAO,IAAI,gBAAgB;EACjC,KAAK,OAAO,IAAI,IAAI,OAAO,IAAI;EAO/B,IAAI;EACJ,IAAI;GACF,QAAQ,IAAI,MAAZ;IACE,KAAK;IACL,KAAK;IACL,KAAK;KACH,aAAa,KAAK,WAAW,GAAG;KAChC;IACF,KAAK;KACH,aAAa,KAAK,mBAAmB,KAAK,KAAK,MAAM;KACrD;IACF,KAAK;KACH,aAAa,KAAK,qBAAqB,KAAK,KAAK,MAAM;KACvD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,4BAA4B,KAAK,KAAK,MAAM;KAC9D;IACF,KAAK;KACH,aAAa,KAAK,6BAA6B,KAAK,KAAK,MAAM;KAC/D;IACF,KAAK;KACH,aAAa,KAAK,8BAA8B,KAAK,KAAK,MAAM;KAChE;IACF,KAAK;KACH,aAAa,KAAK,mCAAmC,KAAK,KAAK,MAAM;KACrE;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,KAAK,KAAK,MAAM;KACxD;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,KAAK,KAAK,MAAM;KACtD;IACF,KAAK;KACH,aAAa,KAAK,iBAAiB,KAAK,KAAK,MAAM;KACnD;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,mBAAmB,KAAK,KAAK,MAAM;KACrD;IACF,KAAK;KACH,aAAa,KAAK,qBAAqB,KAAK,KAAK,MAAM;KACvD;IACF,KAAK;KACH,aAAa,KAAK,mBAAmB,KAAK,KAAK,MAAM;KACrD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,KAAK,KAAK,MAAM;KACxD;IACF,KAAK;KACH,aAAa,KAAK,0BAA0B,KAAK,KAAK,MAAM;KAC5D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,0BAA0B,KAAK,KAAK,MAAM;KAC5D;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,KAAK,KAAK,MAAM;KACtD;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,KAAK,KAAK,MAAM;KACxD;IACF,KAAK;KACH,aAAa,KAAK,4BAA4B,KAAK,KAAK,MAAM;KAC9D;IACF,KAAK;KACH,aAAa,KAAK,qBAAqB,KAAK,KAAK,MAAM;KACvD;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,KAAK,KAAK,MAAM;KACtD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,yBAAyB,GAAG;KAC9C;IACF,KAAK;KACH,aAAa,KAAK,8BAA8B,GAAG;KACnD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,GAAG;KAC5C;IACF,KAAK;KACH,aAAa,KAAK,gCAAgC,GAAG;KACrD;IACF,KAAK;KACH,aAAa,KAAK,6BAA6B,KAAK,KAAK,MAAM;KAC/D;IACF,KAAK;KACH,aAAa,KAAK,uCAAuC,GAAG;KAC5D;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,GAAG;KACzC;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,GAAG;KAC5C;IACF,KAAK;KACH,aAAa,KAAK,0BAA0B,GAAG;KAC/C;IACF,KAAK;KACH,aAAa,KAAK,iBAAiB,GAAG;KACtC;IACF,KAAK;KACH,aAAa,KAAK,iBAAiB,GAAG;KACtC;IACF,KAAK;KACH,aAAa,KAAK,YAAY,GAAG;KACjC;IACF,KAAK;KACH,aAAa,KAAK,eAAe,GAAG;KACpC;IACF,SACE,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yBAA0B,IAAsB,MAClD;GACJ;GAIA,KAAK,MAAA,GAAA,8BAAA,SAAA,CAED;IAAE,MAAM;IAAW,OAAO,IAAI;IAAO,QAAQ,WAAW;GAAQ,GAChE,WAAW,QACb,CACF;EACF,SAAS,KAAK;GACZ,MAAM,SAAA,GAAA,8BAAA,eAAA,CAA8C,GAAG;GAGvD,KAAK,MAAA,GAAA,8BAAA,SAAA,CAAc;IAAE,MAAM;IAAU,OAAO,IAAI;IAAO;GAAM,GAAGC,8BAAAA,cAAc,CAAC;EACjF,UAAU;GACR,KAAK,OAAO,OAAO,IAAI,KAAK;EAC9B;CACF;CAEA,WAAmB,KAAuD;EACxE,MAAM,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS,gBAAgB,KAAA,IAAY,IAAI,SAAS;EACxF,IAAI,KAAK,SAAS,IAAI,GAAG,GACvB,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,kCAAkC,KAAK;EAE3F,MAAM,UAAU,IAAI,gBAAgB,KAAK,OAAO;EAChD,IAAI,IAAI,SAAS,eAAe;GAC9B,MAAM,QAAQ,IAAI,WAAW,IAAI,KAAK;GACtC,IAAI;IACF,QAAQ,eAAe,sBAAsB,KAAK,SAAS,OAAO,IAAI,QAAQ,CAAC;GACjF,SAAS,OAAO;IAMd,IAAI,CAAC,oBAAoB,KAAK,GAAG,MAAM;IACvC,QAAQ,WAAW,KAAK;IACxB,KAAK,SAAS,IAAI,KAAK,OAAO;IAC9B,QAAA,GAAA,8BAAA,SAAA,CAAgB;KACd,KAAK;KACL,OAAO,IAAI;KACX,UAAU,sBAAsB;IAClC,CAAC;GACH;EACF,OAAO,IAAI,IAAI,SAAS,qBAAqB;GAC3C,MAAM,OAAO,KAAK,cAAc,kBAAkB;IAChD,KAAK,IAAI;IACT,OAAO,IAAI,WAAW,IAAI,SAAS;IACnC,UAAU,IAAI;GAChB,CAAC;GACD,QAAQ,eAAe,kBAAkB,KAAK,SAAS,MAAM,IAAI,OAAO,IAAI,QAAQ,CAAC;EACvF,OAAO;GACL,MAAM,OAAO,KAAK,cAAc,gBAAgB;IAC9C,KAAK,IAAI;IACT,MAAM,IAAI;IACV,UAAU,IAAI;GAChB,CAAC;GACD,QAAQ,eAAe,kBAAkB,KAAK,SAAS,MAAM,IAAI,OAAO,IAAI,QAAQ,CAAC;EACvF;EACA,KAAK,SAAS,IAAI,KAAK,OAAO;EAC9B,QAAA,GAAA,8BAAA,SAAA,CAAgB;GACd,KAAK;GACL,OAAO,IAAI;GACX,UAAU,IAAI,eAAe,KAAK,OAAO,CAAC,CAAC,yBACzC,SACA,IAAI,YAAY,EAClB;EACF,CAAC;CACH;CAEA,mBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiB,UADvB,IAAI,eAAe,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MACjB;EAAE,CAAC;CACpD;CAEA,qBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,gBAAgB,KAAK,SAAS,OAC7B,CAAC,CAAC,OAAO,IAAI,OAAO,MAAM;EAC/C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAmB;EAAO,GAAG,IAAI,YAAY;CAC1F;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB,UADtB,IAAI,sBAAsB,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MACzB;EAAE,CAAC;CACnD;CAEA,4BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA0B,UADhC,IADE,oBAAoB,KAAK,SAAS,OAC/B,CAAC,CAAC,QAAQ,MACwB;EAAE,CAAC;CAC7D;CAEA,6BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA2B,UADjC,IADE,oBAAoB,KAAK,SAAS,OAC/B,CAAC,CAAC,QAAQ,IAAI,kBAAkB,MACG;EAAE,CAAC;CAC9D;CAEA,8BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA4B,UADlC,IADE,iBAAiB,KAAK,SAAS,OAC5B,CAAC,CAAC,KAAK,IAAI,kBAAkB,MACO;EAAE,CAAC;CAC/D;CAEA,mCACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADI,2BAA2B,KAAK,SAAS,OACxC,CAAC,CAAC,OAAO,IAAI,kBAAkB,IAAI,WAAW,CAAC,GAAG,MAAM;EAE5E,MAAM,WAAW,OAAO,YAAY,KAAK,MAAM,EAAE,OAAO,IAAI;EAC5D,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiC;EAAO,GAAG,QAAQ;CAC5E;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,SAAS,KAAK,KAC7C,CAAC,CAAC,OACrB,IAAI,kBACJ,IAAI,OACJ,QACA,IAAI,OACJ,IAAI,SACN;EACA,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,SAAS,KAAK,KAC7C,CAAC,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,QAAQ,IAAI,OAAO,IAAI,SAAS;EAClF,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,OAAO,IAAI,KAAK,MAAM;EAC7C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,sBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,KAAK,IAAI,kBAAkB,IAAI,MAAM,IAAI,SAAS,MAAM;EAC/E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAoB;EAAO,GAAG,IAAI,YAAY;CAC3F;CAEA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAc,UADpB,IADE,YAAY,KAAK,SAAS,OACvB,CAAC,CAAC,KAAK,MACe;EAAE,CAAC;CACjD;CAEA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,KAAK,IAAI,mBAAmB,IAAI,WAAW,MAAM;EACxE,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAc;EAAO,GAAG,IAAI,YAAY;CACrF;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,OAAO,IAAI,mBAAmB,IAAI,UAAU,MAAM;EACzE,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,OAAO,IAAI,mBAAmB,MAAM;EAC3D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,mBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,eAAe,KAAK,SAAS,OAAO,CAAC,CAAC,QACvD,IAAI,mBACJ,IAAI,OACJ,MACF;EACA,IAAI,OAAO,SAAS,MAAM,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiB;EAAO,CAAC;EAC1E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAiB;EAAO,GAAG,IAAI,YAAY;CACxF;CAEA,qBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM;EAClF,IAAI,OAAO,SAAS,MAAM,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAmB;EAAO,CAAC;EAC5E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAmB;EAAO,GAAG,IAAI,YAAY;CAC1F;CAEA,mBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,YAAY,IAAI,eAAe,KAAK,SAAS,OAAO,CAAC,CAAC,QAC1D,IAAI,mBACJ,MACF;EAEA,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiB,OAAO,UAAU;GAAO,MAAM,UAAU;EAAK,GAAG,CACtF,UAAU,KACZ,CAAC;CACH;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADM,cAAc,KAAK,SAAS,OAC3B,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,WAAW,MAAM;EAC/D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADM,cAAc,KAAK,SAAS,OAC3B,CAAC,CAAC,YAAY;GAAE,MAAM,IAAI;GAAM,OAAO,IAAI;EAAM,GAAG,IAAI,WAAW,MAAM;EAC/F,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAqB;EAAO,GAAG,IAAI,YAAY;CAC5F;CAEA,sBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAoB,OAD7B,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MAChB;EAAE,CAAC;CACpD;CAEA,0BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,UAAU,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,SAC1D,IAAI,KACJ,IAAI,MACJ,IAAI,iBACJ,MACF;EAGA,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAAwB;EAAQ,GACvC,QAAQ,UAAU,KAAA,IAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,CACnD;CACF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,OAAO,IAAI,MAAM,IAAI,WAAW,MAAM;EAC7D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,OAAO,IAAI,KAAK,MAAM;EAC7C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,0BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,UAAU,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,mBAC1D,IAAI,kBACJ,IAAI,KACJ,IAAI,MACJ,IAAI,iBACJ,MACF;EACA,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAAwB;EAAQ,GACvC,QAAQ,UAAU,KAAA,IAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,CACnD;CACF;CAEA,oBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAkB,UADxB,IADI,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBAC1C,CAAC,CAAC,KAAK,IAAI,aAAa,MACA;EAAE,CAAC;CACrD;CAEA,sBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,IADqB,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBAC3D,CAAC,CAAC,OAAO,IAAI,aAAa,IAAI,OAAO,MAAM;EAElD,OAAO,KAAK,eAAe,SAAS,EAAE,KAAK,mBAAmB,GAAG,IAAI,YAAY;CACnF;CAEA,4BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA0B,cAD5B,IADA,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBACtC,CAAC,CAAC,aAAa,MACiB;EAAE,CAAC;CACjE;CAEA,qBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,IADqB,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBAC3D,CAAC,CAAC,MAAM,IAAI,aAAa,MAAM;EACtC,OAAO,KAAK,eAAe,SAAS,EAAE,KAAK,kBAAkB,GAAG,IAAI,YAAY;CAClF;CAEA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAc,UADpB,IADE,eAAe,KAAK,SAAS,OAC1B,CAAC,CAAC,KAAK,IAAI,kBAAkB,MACP;EAAE,CAAC;CACjD;CAEA,oBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAkB,UADxB,IADE,mBAAmB,KAAK,SAAS,OAC9B,CAAC,CAAC,KAAK,IAAI,kBAAkB,MACH;EAAE,CAAC;CACrD;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB,OADzB,IADK,aAAa,KAAK,SAAS,OAC3B,CAAC,CAAC,MAAM,IAAI,SAAS,MACG;EAAE,CAAC;CAChD;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADI,iBAAiB,KAAK,SAAS,OAC9B,CAAC,CAAC,OAAO,IAAI,kBAAkB,IAAI,WAAW,CAAC,GAAG,MAAM;EAC5E,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB;EAAO,GAAG,CAAC,OAAO,IAAI,CAAC;CAChE;CAEA,MAAc,eACZ,KAIe;EAIf,IAAI,CAAC,KAAK,QAAQ,cAAc;GAC9B,KAAK,MAAA,GAAA,8BAAA,SAAA,CAED;IACE,MAAM;IACN,OAAO,IAAI;IACX,QAAA,GAAA,8BAAA,eAAA,CACE,IAAID,8BAAAA,YACFC,8BAAAA,gBAAgB,gBAChB,uFACF,CACF;GACF,GACAC,8BAAAA,cACF,CACF;GACA;EACF;EACA,MAAM,OAAO,IAAI,gBAAgB;EACjC,KAAK,OAAO,IAAI,IAAI,OAAO,IAAI;EAC/B,IAAI;GACF,IAAI;GACJ,QAAQ,IAAI,MAAZ;IACE,KAAK;KACH,aAAa,MAAM,KAAK,yBAAyB,KAAK,KAAK,MAAM;KACjE;IACF,KAAK;KACH,aAAa,MAAM,KAAK,oCAAoC,KAAK,KAAK,MAAM;KAC5E;IACF,KAAK;KACH,aAAa,MAAM,KAAK,0CAA0C,KAAK,KAAK,MAAM;KAClF;GACJ;GACA,KAAK,MAAA,GAAA,8BAAA,SAAA,CAED;IAAE,MAAM;IAAW,OAAO,IAAI;IAAO,QAAQ,WAAW;GAAQ,GAChE,WAAW,QACb,CACF;EACF,SAAS,KAAK;GACZ,KAAK,MAAA,GAAA,8BAAA,SAAA,CACM;IAAE,MAAM;IAAU,OAAO,IAAI;IAAO,QAAA,GAAA,8BAAA,eAAA,CAAsB,GAAG;GAAE,GAAGA,8BAAAA,cAAc,CAC3F;EACF,UAAU;GACR,KAAK,OAAO,OAAO,IAAI,KAAK;EAC9B;CACF;CAEA,MAAc,aACZ,QACA,QACA,QAC2B;EAC3B,MAAM,UAAU,KAAK,QAAQ;EAC7B,IAAI,CAAC,SACH,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,uFACF;EAEF,MAAM,EAAE,OAAO,gBAAgB,MAAM,QAAQ,OAAO,QAAQ,MAAM;EAGlE,IAAI,OAAO,SACT,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,6BAA6B;EAE9E,OAAO;GAAE;GAAa,OAAO,OAAO;GAAO,QAAQ,OAAO;GAAQ;EAAM;CAC1E;CAEA,MAAc,yBACZ,KACA,QACwC;EACxC,MAAM,QAAQ,KAAK,kBAAkB;GAAE,GAAG;GAAK,MAAM;EAAe,GAAG,MAAM;EAC7E,IAAI,MAAM,QAAQ,QAAQ,gBACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,cAAc,MAAM,QAAQ,KAAK;EAErF,MAAM,QAAQ,MAAM,KAAK,aAAa,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM;EAC9E,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAuB;EAAM,GAAG,CAAC,MAAM,MAAM,MAAM,CAAC;CAC7E;CAEA,MAAc,oCACZ,KACA,QACwC;EAGxC,MAAM,QAAQ,KAAK,6BACjB;GAAE,GAAG;GAAK,MAAM;EAA0B,GAC1C,MACF;EACA,IAAI,MAAM,QAAQ,QAAQ,2BACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,cAAc,MAAM,QAAQ,KAAK;EAErF,MAAM,QAAQ,MAAM,KAAK,aAAa,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM;EAC9E,QAAA,GAAA,8BAAA,SAAA,CACE;GACE,KAAK;GACL,kBAAkB,MAAM,QAAQ;GAChC,WAAW,MAAM,QAAQ;GACzB;EACF,GACA,CAAC,MAAM,MAAM,MAAM,CACrB;CACF;CAEA,MAAc,0CACZ,KACA,QACwC;EACxC,MAAM,QAAQ,KAAK,mCACjB;GAAE,GAAG;GAAK,MAAM;EAAgC,GAChD,MACF;EACA,IAAI,MAAM,QAAQ,QAAQ,iCACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,cAAc,MAAM,QAAQ,KAAK;EAErF,MAAM,EAAE,WAAW,gBAAgB,MAAM,QAAQ;EAOjD,MAAM,UAAmC,CAAC;EAC1C,KAAK,MAAM,KAAK,aACd,QAAQ,KAAK;GACX,KAAK,EAAE;GACP,MAAM,EAAE;GACR,MAAM,EAAE;GACR,OAAO,MAAM,KAAK,aAAa,EAAE,QAAQ,IAAI,QAAQ,MAAM;EAC7D,CAAC;EAEH,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAAwC,QAAQ;IAAE;IAAW,aAAa;GAAQ;EAAE,GAC3F,QAAQ,KAAK,MAAM,EAAE,MAAM,MAAM,MAAM,CACzC;CACF;CAEA,yBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,QAAQ,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,uBAAuB,IAAI,IAAI;EACtF,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAuB,OAAO,MAAM;GAAO,MAAM,MAAM;EAAK,GAAG,CACpF,MAAM,KACR,CAAC;CACH;CAEA,uBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAqB,MAD9B,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,qBAAqB,IAAI,MAAM,IAAI,IACpC,CAAC,CAAC;EAAK,CAAC;CAChE;CAEA,8BACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,IAAI,QAAQ,SAAS,SACnB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0DACF;EAEF,MAAM,WAAW,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,kBAAkB;EAC5E,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAA4B,OAAO,SAAS;GAAO,MAAM,SAAS;EAAK,GAC9E,CAAC,SAAS,KAAK,CACjB;CACF;CAEA,gCACE,KAC+B;EAG/B,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA8B,UADpC,IADE,eAAe,KAAK,OACjB,CAAC,CAAC,UAAU,IAAI,MAAM,IAAI,QACY;EAAE,CAAC;CACjE;;;;;;;;;CAUA,6BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,IAAI,gBAAgB,KAAK,OAAO;EAChD,MAAM,OAAO,KAAK,cAAc,gBAAgB;GAC9C,KAAK,cAAc,IAAI;GACvB,MAAM,IAAI;GACV,UAAU,IAAI;EAChB,CAAC;EACD,IAAI;GACF,QAAQ,eACN,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,IAAI,QAAQ,CACvE;GACA,MAAM,SAAS,IAAI,YAAY,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MAAM;GACjE,MAAM,OAAO,OAAO,MAAM,IAAI;GAC9B,IAAI,CAAC,MACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,oCAAoC,IAAI,UAAU,cAAc,OAAO,UAAU,EACnF;GAEF,MAAM,SAAS,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,OACzD,KAAK,kBACL,IAAI,WAAW,CAAC,GAChB,MACF;GACA,QAAA,GAAA,8BAAA,SAAA,CACE;IACE,KAAK;IACL,kBAAkB,KAAK;IACvB,WAAW,OAAO;IAClB;GACF,GACA,CAAC,OAAO,IAAI,CACd;EACF,UAAU;GAGR,QAAQ,MAAM;EAChB;CACF;CAEA,uCACE,KAC+B;EAK/B,MAAM,SAAS,KAAK,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC;EACtD,IAAI;EACJ,IAAI,QAAQ,SAAS,GAAG;GACtB,OAAO,eACL,sBAAsB,KAAK,SAAS,OAAO,YAAY,GAAG,IAAI,QAAQ,CACxE;GACA,UAAU;EACZ,OACE,UAAU,KAAK,eAAe,GAAG;EAOnC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAqC,UAL3C,IAAI,eAAe,KAAK,OAAO,CAAC,CAAC,yBAChD,SACA,IAAI,UACJ,IAAI,QAAQ,KAEqD;EAAE,CAAC;CACxE;CAEA,oBAA4B,KAAgE;EAC1F,KAAK,MAAM,SACT,IAAI,SACJ,IAAI,YACJ,IAAI,QACJ,IAAI,QACJ,IAAI,WAAW,IAAI,IAAI,CACzB;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAkB,SAAS,IAAI;EAAQ,CAAC;CACjE;CAEA,uBACE,KAC+B;EAC/B,KAAK,MAAM,YAAY,IAAI,OAAO;EAClC,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,oBAAoB,CAAC;CAC9C;CAEA,0BACE,MAC+B;EAC/B,KAAK,MAAM,eAAe;EAC1B,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,uBAAuB,CAAC;CACjD;CAEA,iBAAyB,MAA8D;EACrF,KAAK,MAAM,MAAM;EACjB,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,cAAc,CAAC;CACxC;;;;;;;;;CAUA,iBAAyB,KAA6D;EACpF,MAAM,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS;EAC/C,MAAM,UAAU,KAAK,SAAS,IAAI,GAAG;EACrC,IAAI,SAAS;GACX,iBAAiB,KAAK,SAAS,OAAO;GACtC,QAAQ,MAAM;GACd,KAAK,SAAS,OAAO,GAAG;EAC1B;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,QAAQ,CAAC;CAClC;CAEA,YAAoB,KAAwD;EAC1E,KAAK,MAAM,CAAC,KAAK,YAAY,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;GAChE,IAAI,CAAC,uBAAuB,KAAK,IAAI,KAAK,GAAG;GAC7C,iBAAiB,KAAK,SAAS,OAAO;GACtC,QAAQ,MAAM;GACd,KAAK,SAAS,OAAO,GAAG;EAC1B;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,QAAQ,CAAC;CAClC;CAEA,eAAuB,MAA4D;EACjF,IAAI,CAAC,KAAK,WAAW;GACnB,KAAK,YAAY;GACjB,KAAK,MAAM,WAAW,KAAK,SAAS,OAAO,GAAG;IAC5C,iBAAiB,KAAK,SAAS,OAAO;IACtC,QAAQ,MAAM;GAChB;GACA,KAAK,SAAS,MAAM;GACpB,KAAK,cAAc,WAAW;GAC9B,eAAe,KAAK,OAAO;EAC7B;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,WAAW,CAAC;CACrC;CAEA,eAAuB,KAA6D;EAClF,MAAM,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS;EAC/C,MAAM,UAAU,KAAK,SAAS,IAAI,GAAG;EACrC,IAAI,SAAS,SAAS,GAGpB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,qBAChB,wCAAwC,KAC1C;EAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,OAAO,GAC9B,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,8BAA8B,KAAK;EAEvF,OAAO;CACT;;;;;;;;;CAUA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAc,UAAU,IAD5B,WAAW,KAAK,SAAS,OACQ,CAAC,CAAC,SAAS,MAAM;EAAE,CAAC;CAC1E;CAEA,oBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,SAAS,IAAI,KAAK,IAAI,OAAO,MAAM;EAC1D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAkB;EAAO,GAAG,IAAI,YAAY;CACzF;CAEA,iBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,MAAM,IAAI,KAAK,MAAM;EAC5C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAe;EAAO,GAAG,IAAI,YAAY;CACtF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,oBAAoB,KAAK,SAAS,OAAO,CAAC,CAAC,MAAM,IAAI,SAAS,MAAM;EACvF,IAAI,OAAO,SAAS,MAAM,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAsB;EAAO,CAAC;EAC/E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,WAAW,IADE,WAAW,KAAK,SAAS,OACtB,CAAC,CAAC,WAAW,IAAI,QAAQ,MAAM;EACrD,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB,QAAQ,SAAS;GAAQ,OAAO,SAAS;EAAM,GAAG,CACvF,SAAS,KACX,CAAC;CACH;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,WAAW,IAAI,MAAM,IAAI,QAAQ,MAAM;EAC9D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,OAAO,IAAI,mBAAmB,OAAO,MAAM;EAClE,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,YAAY,IAAI,OAAO,MAAM;EACvD,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAqB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACrE,IAAI,YACN;CACF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,YAAY,IAAI,KAAK,IAAI,OAAO,MAAM;EAChE,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAqB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACrE,IAAI,YACN;CACF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,0BAA0B,oBAAoB,IADlC,YAAY,KAAK,SAAS,OACc,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM;EAKzF,MAAM,cAAc,IAAI,kBAAkB,KAAK,SAAS,OAAO;EAC/D,KAAK,MAAM,UAAU,iBAAiB;GACpC,IAAI,OAAO,qBAAqB,KAAK,OAAO,oBAAoB,GAAG;GACnE,YAAY,OACV;IACE,MAAM;IACN,kBAAkB,OAAO;IACzB,mBAAmB,OAAO;GAC5B,GACA,MACF;EACF;EAGA,QAAQ,aAAa;EAErB,OAAO,KAAK,eACV,SACA;GACE,KAAK;GACL,QAAQ;IACN;IACA,gBAAgB;IAChB,MAAM;GACR;EACF,GACA,IAAI,YACN;CACF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,aAAa,IAAI,KAAK,IAAI,QAAQ,IAAI,SAAS,MAAM;EAC/E,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAsB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACtE,IAAI,YACN;CACF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,aAAa,IAAI,KAAK,IAAI,QAAQ,MAAM;EAClE,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAsB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACtE,IAAI,YACN;CACF;CAEA,eACE,SACA,SACA,cAC+B;EAO/B,IACE,CAAC,QAAQ,IAAI,WAAW,QAAQ,KAChC,QAAQ,QAAQ,mBAChB,QAAQ,QAAQ,mBAEhB,QAAQ,aAAa;EAEvB,IAAI,QAAQ,SAAS,SACnB,QAAA,GAAA,8BAAA,SAAA,CAAgB,OAAO;EAEzB,MAAM,QAAQ,KAAK,kBAAkB,SAAS,YAAY;EAC1D,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,GAAG;GAAS,GAAG,MAAM;EAAQ,GAAG,MAAM,QAAQ;CAClE;CAEA,kBAA0B,SAA0B,cAA0C;EAC5F,MAAM,QAAQ,IAAI,cAAc,KAAK,SAAS,OAAO;EACrD,IAAI,cAEF,OAAO;GAAE,SAAS,EAAE,cADC,MAAM,wBAAwB,YACpB,EAAE;GAAG,UAAU,CAAC;EAAE;EAEnD,MAAM,WAAW,MAAM,kBAAkB;EACzC,OAAO;GAAE,SAAS,EAAE,SAAS;GAAG,UAAU,CAAC,SAAS,KAAK;EAAE;CAC7D;AACF;;AAQA,MAAM,kBAAgC;CAAE,eAAe,CAAC;CAAG,YAAY;AAAK;AAE5E,MAAM,sBAAsB;AAE5B,SAAS,WAAW,OAAe,WAA4B;CAC7D,OAAO,GAAG,MAAM,IAAI,YAAY,SAAS,cAAc;AACzD;AAEA,SAAS,uBAAuB,KAAa,OAAwB;CACnE,OAAO,QAAQ,WAAW,KAAK,KAAK,IAAI,WAAW,GAAG,MAAM,SAAS;AACvE;AAEA,SAAS,oBAAoB,OAAyB;CACpD,OACE,iBAAiBD,8BAAAA,gBAChB,MAAM,SAASC,8BAAAA,gBAAgB,uBAC9B,MAAM,SAASA,8BAAAA,gBAAgB;AAErC;;;;;;;;AASA,SAAS,wBAAwB;CAC/B,OAAO;EACL,iBAAiB;EACjB,4BAA4B;EAC5B,yBAAyB;EACzB,oBAAoB;EACpB,0BAA0B;EAC1B,aAAa;EACb,kBAAkB,KAAK,IAAI;CAC7B;AACF"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["AbortError","NULL_PTR","FPDF_ERR_PASSWORD","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","UNKNOWN_WEAK_ANNOTATION_STATE","EngineError","EngineErrorCode","FPDF_ERR_PASSWORD","EngineError","EngineErrorCode","TRAPPED_TRUE","TRAPPED_FALSE","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","FPDF_NO_INCREMENTAL","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","PAGE_INSERT_BLANK_MAX_COUNT","NO_ANNOTATION_FLAGS","NULL_PTR","readLine","KEY_ROTATION","KEY_UNROTATED_RECT","DEFAULT_CARET_COLOR","NULL_PTR","EngineError","EngineErrorCode","DEFAULT_FILE_ATTACHMENT_COLOR","familyKey","EngineError","EngineErrorCode","DEFAULT_COLOR","DEFAULT_FREETEXT_COLOR","DEFAULT_FONT_SIZE","readLinePoints","DEFAULT_REDACT_COLOR","DEFAULT_LABEL_COLOR","DEFAULT_FONT_SIZE","DEFAULT_NOTE_COLOR","DEFAULT_HIGHLIGHT_COLOR","DEFAULT_TEXT_MARKUP_COLOR","MK_BORDER_COLOR","MK_BACKGROUND_COLOR","cache","NULL_PTR","EngineError","EngineErrorCode","readWide","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","DEFAULT_OPACITY","DEFAULT_OPACITY","EngineError","EngineErrorCode","EngineError","EngineErrorCode","DEFAULT_OPACITY","EngineError","EngineErrorCode","DEFAULT_LINE_ENDINGS","EngineError","EngineErrorCode","NULL_PTR","DEFAULT_OPACITY","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","PDF_SUBTYPE_TO_CODE","EngineError","EngineErrorCode","PdfAnnotationSubtypeCode","FLATTEN_FAIL","FLATTEN_SUCCESS","FLATTEN_NOTHING_TO_DO","FPDF_NO_INCREMENTAL","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","cache","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","copyOut","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","SIGNATURE_POLICY_VERSION","sameEffectiveValue","NULL_PTR","EdgeResolver","USAGE_INCOMPLETE","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","CHANGED_WIDGETS_CAPACITY","EMPTY_META","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EngineError","EngineErrorCode","NULL_PTR","EngineError","EngineErrorCode","EngineError","EngineErrorCode","EMPTY_TRANSFER"],"sources":["../src/runtime/lifecycle/bootstrap.ts","../src/shared/abort.ts","../src/shared/uuid.ts","../src/shared/pdf-date.ts","../src/runtime/memory/bits.ts","../src/shared/securityPermissions.ts","../src/events/EventHub.ts","../src/runtime/memory/scratch.ts","../src/runtime/memory/strings.ts","../src/document-session/lifecycle/PdfDocumentOpener.ts","../src/document-session/pages/PagePtrPool.ts","../src/document-session/revisions/RevisionAuthority.ts","../src/document-session/DocumentSession.ts","../src/document-session/lifecycle/BaseDocumentRegistry.ts","../src/features/metadata/internal/readMetadataText.ts","../src/features/metadata/internal/readCustomMetadata.ts","../src/features/metadata/internal/readTrappedStatus.ts","../src/features/metadata/MetadataReader.ts","../src/features/metadata/internal/write/writeMetaText.ts","../src/features/metadata/internal/write/writeMetaTrapped.ts","../src/features/metadata/internal/write/applyMetadataPatch.ts","../src/features/metadata/MetadataMutator.ts","../src/runtime/memory/structs.ts","../src/features/destinations/destinationViewCodes.ts","../src/features/destinations/readDestination.ts","../src/features/actions/ActionModelReader.ts","../src/features/pages/PagesReader.ts","../src/features/pages/PagesMutator.ts","../src/features/pages/PagesExtractor.ts","../src/features/pages/PagesInserter.ts","../src/features/annotations/internal/read/annotationReadContext.ts","../src/features/annotations/internal/annotationFlagBits.ts","../src/features/annotations/internal/lineEnding.ts","../src/features/annotations/internal/read/annotationReadPrimitives.ts","../src/features/annotations/internal/read/readAnnotationTransformMetadata.ts","../src/features/annotations/internal/textEditIntent.ts","../src/features/annotations/internal/read/readCaretAnnotation.ts","../src/features/attachments/internal/attachmentPrimitives.ts","../src/features/annotations/internal/annotationIcon.ts","../src/features/annotations/internal/read/readFileAttachmentAnnotation.ts","../src/features/annotations/internal/colorType.ts","../src/features/annotations/internal/freeTextIntent.ts","../src/features/annotations/internal/standardFont.ts","../src/features/annotations/internal/richTextWire.ts","../src/features/annotations/internal/textAlignment.ts","../src/features/annotations/internal/shapeBorderStyle.ts","../src/features/annotations/internal/read/readStyle.ts","../src/features/annotations/internal/read/readFreeTextAnnotation.ts","../src/features/annotations/internal/inkIntent.ts","../src/features/annotations/internal/read/readInkAnnotation.ts","../src/features/annotations/internal/read/readLineAnnotation.ts","../src/features/annotations/internal/read/readLinkAnnotation.ts","../src/features/annotations/internal/read/readRedactAnnotation.ts","../src/features/annotations/internal/read/readShapeAnnotation.ts","../src/features/annotations/internal/read/readStampAnnotation.ts","../src/features/annotations/internal/annotationState.ts","../src/features/annotations/internal/read/readTextAnnotation.ts","../src/features/annotations/internal/read/readTextMarkupAnnotation.ts","../src/features/annotations/internal/read/readUnsupportedAnnotation.ts","../src/features/annotations/internal/read/readVertexAnnotation.ts","../src/features/annotations/internal/read/readWidgetAnnotation.ts","../src/features/annotations/internal/read/annotationReaderRegistry.ts","../src/features/forms/internal/formModelCache.ts","../src/features/forms/internal/readFormSnapshot.ts","../src/features/annotations/internal/read/joinWidgetField.ts","../src/features/annotations/internal/read/readAnnotationIdentity.ts","../src/features/annotations/internal/replyType.ts","../src/features/annotations/internal/read/readAnnotationRelationship.ts","../src/features/annotations/internal/read/readEmbedMetadata.ts","../src/features/annotations/internal/blendMode.ts","../src/features/annotations/internal/read/readAnnotationBase.ts","../src/features/annotations/internal/read/collectPageAnnotations.ts","../src/features/annotations/AnnotationReader.ts","../src/features/render/deviceRaster.ts","../src/features/annotations/AnnotationAppearanceReader.ts","../src/features/annotations/RawAnnotationReader.ts","../src/features/annotations/internal/write/annotationWritePrimitives.ts","../src/features/annotations/internal/write/writeAnnotationBase.ts","../src/features/annotations/internal/identity/captureOrStampStableId.ts","../src/features/annotations/internal/identity/resolveAnnotationPointer.ts","../src/features/annotations/internal/mutations/computeMutationImpact.ts","../src/features/annotations/internal/read/readAnnotationFromPtr.ts","../src/features/annotations/internal/write/writeEmbedMetadata.ts","../src/features/annotations/internal/write/writeAnnotationTransformMetadata.ts","../src/features/annotations/internal/write/writeCaretAnnotation.ts","../src/features/annotations/internal/write/writeFileAttachmentAnnotation.ts","../src/features/annotations/internal/write/writeDefaultAppearance.ts","../src/features/annotations/internal/write/writeStyle.ts","../src/features/annotations/internal/write/writeFreeTextAnnotation.ts","../src/features/annotations/internal/write/writeInkAnnotation.ts","../src/features/annotations/internal/write/writeLineAnnotation.ts","../src/features/annotations/internal/write/writeLinkAnnotation.ts","../src/features/annotations/internal/write/writeTextMarkupAnnotation.ts","../src/features/annotations/internal/write/writeRedactAnnotation.ts","../src/features/annotations/internal/write/writeShapeAnnotation.ts","../src/features/annotations/internal/write/writeStampAnnotation.ts","../src/features/annotations/internal/write/writeTextAnnotation.ts","../src/features/annotations/internal/write/writeVertexAnnotation.ts","../src/features/annotations/internal/write/writeWidgetAnnotation.ts","../src/features/annotations/internal/write/annotationWriterRegistry.ts","../src/features/annotations/internal/write/writeAnnotationRelationship.ts","../src/features/annotations/AnnotationMutator.ts","../src/features/annotations/AnnotationFlattener.ts","../src/features/pages/PagesFlattener.ts","../src/features/redaction/RedactionApplier.ts","../src/features/text/PageTextReader.ts","../src/features/geometry/PageGeometryReader.ts","../src/features/render/PageRenderReader.ts","../src/features/attachments/AttachmentReader.ts","../src/features/attachments/AttachmentMutator.ts","../src/features/security/internal/buildSecurityInfo.ts","../src/features/security/SecurityReader.ts","../src/features/save/internal/pdfSaveMode.ts","../src/runtime/memory/u64.ts","../src/features/signature/internal/readSignatureModel.ts","../src/features/signature/internal/signatureModelCache.ts","../src/features/signature/SignatureReader.ts","../src/features/save/DocumentSaver.ts","../src/features/signature/internal/candidateStore.ts","../src/features/signature/internal/appearance.ts","../src/features/signature/internal/sealCheck.ts","../src/features/forms/internal/wideStringArray.ts","../src/features/signature/SignatureMutator.ts","../src/features/signature/SignatureAnalyzer.ts","../src/features/signature/CandidateFinalizer.ts","../src/features/fonts/FontRegistrar.ts","../src/features/forms/internal/resolveFieldRef.ts","../src/features/forms/FormReader.ts","../src/features/forms/internal/authorWidget.ts","../src/features/forms/internal/fieldFlagBits.ts","../src/features/forms/FormMutator.ts","../src/features/forms/FormsEffectsApplier.ts","../src/features/search/internal/pageCorpusCache.ts","../src/features/search/internal/searchCursor.ts","../src/features/search/SearchReader.ts","../src/features/actions/DocumentActionsReader.ts","../src/features/pieceinfo/PieceInfoAccessor.ts","../src/worker-host/WorkerHost.ts"],"sourcesContent":["import type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nconst initialized = new WeakSet<PdfRuntimeModule>();\n\n/**\n * Initialize the thread-confined PDFium runtime for the calling thread. Each\n * worker thread owns its own PDFium state, so this must run on every thread\n * that uses the runtime. Safe to call multiple times.\n */\nexport function ensureInitialized(runtime: PdfRuntimeModule): void {\n if (initialized.has(runtime)) return;\n runtime.fn.EPDF_InitThread();\n initialized.add(runtime);\n}\n\n/**\n * Tear down PDFium for the calling thread. Lifecycle-strict: every PDFium\n * handle created on this thread must already be closed.\n */\nexport function destroyLibrary(runtime: PdfRuntimeModule): void {\n if (!initialized.has(runtime)) return;\n runtime.fn.EPDF_ShutdownThread();\n initialized.delete(runtime);\n}\n","import { AbortError } from '@embedpdf/engine-core/runtime';\n\n/**\n * Throw if the AbortSignal has been aborted. Service code peppers calls to\n * this between PDFium calls so cooperative cancellation works without\n * needing async/await.\n */\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n const reason = signal.reason;\n if (reason instanceof Error) throw reason;\n throw new AbortError(reason);\n }\n}\n","/**\n * Generate an RFC 4122 v4 UUID using the Web Crypto API surface that's\n * available in every realm we ship to: Node 19+ (global), Web Workers,\n * browsers (https), browsers (http/intranet/file:), and Edge runtimes.\n *\n * Why this implementation, exactly:\n * - `crypto.randomUUID()` was historically gated to *secure contexts*\n * in older browsers and we shipped that bug to production once.\n * `getRandomValues()` has no such restriction.\n * - `import { randomUUID } from 'crypto'` makes Vite externalize the\n * `crypto` module for browser builds and emit a build-time warning;\n * we then crash at runtime in the rare path that hits it.\n * - 16 bytes + RFC 4122 bit-twiddling is six lines and correct.\n *\n * Output is the canonical hex form: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`,\n * where `y` is one of `8/9/a/b` (variant nibble = 10xx).\n */\nexport function generateUuid(): string {\n const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16));\n // RFC 4122 §4.4: version nibble = 4, variant nibble = 10xx.\n bytes[6] = (bytes[6]! & 0x0f) | 0x40;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * PDF date string format conversion utilities.\n *\n * PDF stores timestamps as ASCII strings shaped like\n * `D:YYYYMMDDHHmmSSOHH'mm'`, where `O` is `+` / `-` / `Z` (Z means\n * UTC and omits the offset). See ISO 32000 §7.9.4.\n *\n * The wire format used by the engine DTOs is always ISO 8601;\n * readers convert PDF → ISO via {@link pdfDateToIso}, writers convert\n * the other way via {@link formatPdfDate}.\n */\n\n/**\n * Parse a PDF date string `D:YYYYMMDDHHmmSSOHH'mm'` to an ISO 8601\n * string. Returns null if the input is malformed.\n *\n * When the timezone is omitted, PDF defines the relationship to UTC as\n * unknown. Since the engine DTO wire format requires an absolute ISO 8601\n * timestamp, this converter retains the pre-existing fallback of treating\n * an omitted timezone as UTC.\n */\nexport function pdfDateToIso(pdf: string): string | null {\n const match =\n /^D:(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(?:(Z)|([+-])(\\d{2})'(\\d{2})')?$/.exec(pdf);\n if (!match) return null;\n\n const [, yText, moText, dText, HText, MText, SText, , sign, tzHText, tzMText] = match;\n const y = Number(yText);\n const mo = Number(moText) - 1;\n const d = Number(dText);\n const H = Number(HText);\n const M = Number(MText);\n const S = Number(SText);\n\n // Construct the local wall-clock fields in UTC space. setUTCFullYear is\n // intentional: Date.UTC maps years 0-99 to 1900-1999.\n const wallClock = new Date(0);\n wallClock.setUTCFullYear(y, mo, d);\n wallClock.setUTCHours(H, M, S, 0);\n\n // JavaScript normalizes invalid fields (for example February 31), so\n // compare them after construction rather than accepting the rollover.\n if (\n wallClock.getUTCFullYear() !== y ||\n wallClock.getUTCMonth() !== mo ||\n wallClock.getUTCDate() !== d ||\n wallClock.getUTCHours() !== H ||\n wallClock.getUTCMinutes() !== M ||\n wallClock.getUTCSeconds() !== S\n ) {\n return null;\n }\n\n let offsetMinutes = 0;\n if (sign) {\n const tzH = Number(tzHText);\n const tzM = Number(tzMText);\n if (tzH > 23 || tzM > 59) return null;\n\n offsetMinutes = (tzH * 60 + tzM) * (sign === '+' ? 1 : -1);\n }\n\n return new Date(wallClock.getTime() - offsetMinutes * 60_000).toISOString();\n}\n\n/**\n * Format a JS Date as a PDF date string `D:YYYYMMDDHHmmSSOHH'mm'`.\n *\n * Emits the offset in PDF's funny `OHH'mm'` form, where the apostrophe\n * after the hour is literal and the offset always carries a sign. UTC\n * is emitted as `+00'00'` (not `Z`) for maximum reader compatibility —\n * the `Z` shorthand is allowed by the spec but not universally\n * supported.\n *\n * Always uses the supplied Date's local fields and offset. For\n * server-side stamps callers typically pass `new Date()` (default).\n */\nexport function formatPdfDate(d: Date = new Date()): string {\n if (Number.isNaN(d.getTime())) throw new RangeError('Cannot format an invalid Date');\n\n const pad = (n: number, w = 2) => String(n).padStart(w, '0');\n const year = d.getFullYear();\n if (year < 0 || year > 9999) throw new RangeError('PDF dates require a four-digit year');\n\n const tzMinutes = -d.getTimezoneOffset();\n const sign = tzMinutes >= 0 ? '+' : '-';\n const tzH = pad(Math.floor(Math.abs(tzMinutes) / 60));\n const tzM = pad(Math.abs(tzMinutes) % 60);\n return (\n `D:${pad(year, 4)}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +\n `${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}` +\n `${sign}${tzH}'${tzM}'`\n );\n}\n","/**\n * Coerce a value to an unsigned 32-bit integer. PDFium permission words\n * arrive as signed JS numbers (the high bit makes them negative); reading\n * them as `u32` restores the bit pattern the PDF spec describes.\n */\nexport function u32(value: number): number {\n return value >>> 0;\n}\n","import { u32 } from '../runtime/memory/bits';\n\n/**\n * PDF Standard security handlers reserve bits 1-2 as 0, and PDFium masks\n * even owner permissions through that convention — so \"all permissions\"\n * for an encrypted document is `0xFFFFFFFC`, not `0xFFFFFFFF`.\n */\nexport const ALL_STANDARD_SECURITY_PERMISSIONS = 0xfffffffc;\n\n/** Coerce PDFium's signed permission word to its unsigned 32-bit value. */\nexport const normalizeU32 = u32;\n\n/** True when `bits` grants every standard security permission. */\nexport function hasAllStandardSecurityPermissions(bits: number): boolean {\n return (\n (u32(bits) & ALL_STANDARD_SECURITY_PERMISSIONS) >>> 0 === ALL_STANDARD_SECURITY_PERMISSIONS\n );\n}\n","import type {\n DocumentEvent,\n DocumentEventInit,\n DocumentEventStream,\n} from '@embedpdf/engine-core/runtime';\n\n/**\n * The in-process implementation of `DocumentEventStream`, shared by both\n * engine shells (one hub per open `DocumentHandle`). The engine that\n * performs a mutation publishes here at confirmation time; the cloud\n * engine's remote channel will also publish here for OTHER sessions'\n * mutations — listeners never learn which transport delivered an event.\n *\n * Delivery contract:\n * - synchronous fan-out in subscription order;\n * - error isolation: a throwing listener is re-thrown on a microtask\n * (so it surfaces to the host's unhandled-error reporting) without\n * blocking other listeners or failing the mutation path;\n * - `lastServerId` tracks the highest remote cursor seen, for the\n * remote channel's reconnect/backfill.\n */\nexport class EventHub implements DocumentEventStream {\n private readonly listeners = new Set<(event: DocumentEvent) => void>();\n private serverId: number | null = null;\n\n constructor(\n /** Where a throwing listener's error goes. Defaults to an async\n * rethrow so it reaches the host's unhandled-error reporting. */\n private readonly onListenerError: (err: unknown) => void = (err) => {\n queueMicrotask(() => {\n throw err;\n });\n },\n ) {}\n\n subscribe(listener: (event: DocumentEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n publish(event: DocumentEvent): void {\n // Transport notices (`stream.desynced`) carry no origin; only mutation\n // events advance the server cursor.\n if ('origin' in event) {\n const { serverId } = event.origin;\n if (serverId !== null) {\n this.serverId = this.serverId === null ? serverId : Math.max(this.serverId, serverId);\n }\n }\n // Snapshot so a listener that (un)subscribes mid-fan-out cannot skew\n // delivery for this event.\n for (const listener of [...this.listeners]) {\n try {\n listener(event);\n } catch (err) {\n this.onListenerError(err);\n }\n }\n }\n\n lastServerId(): number | null {\n return this.serverId;\n }\n\n /** Drop every listener (handle close). Idempotent. */\n clear(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * Stamps provenance onto events a mutation path produces. One per open\n * handle: the engine shell constructs it with the instance's `sessionId`\n * (and, on cloud, the authenticated `sub` when known) and hands it to the\n * mutation services — they publish results, never build origins.\n */\nexport class SessionEventPublisher {\n constructor(\n private readonly hub: EventHub,\n private readonly sessionId: string,\n private readonly sub: string | null = null,\n ) {}\n\n /** Publish a mutation THIS engine instance just confirmed. */\n publishLocal(event: DocumentEventInit): void {\n this.hub.publish({\n ...event,\n origin: {\n kind: 'local',\n sessionId: this.sessionId,\n sub: this.sub,\n ts: Date.now(),\n serverId: null,\n },\n } as DocumentEvent);\n }\n}\n","import type { PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * Allocate a scratch buffer, run `body` with it, and always free it.\n *\n * Every PDFium out-parameter call follows the same shape: malloc a\n * buffer, hand its pointer to the native function, read the result back,\n * free the buffer. Hand-rolling that `try/finally` at each call site is\n * how leaks and copy-paste bugs creep in, so it lives here once.\n */\nexport function withScratch<T>(mem: PdfRuntimeMemory, bytes: number, body: (ptr: Ptr) => T): T {\n const ptr = mem.alloc(bytes);\n try {\n return body(ptr);\n } finally {\n mem.free(ptr);\n }\n}\n\n/**\n * Like {@link withScratch} but for native calls that take several\n * out-parameters at once (e.g. `FPDFAnnot_GetColor` with one pointer per\n * channel). Buffers are freed in reverse allocation order.\n */\nexport function withScratchN<T>(\n mem: PdfRuntimeMemory,\n sizes: ReadonlyArray<number>,\n body: (ptrs: Ptr[]) => T,\n): T {\n const ptrs = sizes.map((size) => mem.alloc(size));\n try {\n return body(ptrs);\n } finally {\n for (let i = ptrs.length - 1; i >= 0; i--) {\n mem.free(ptrs[i]);\n }\n }\n}\n","import type { PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from './scratch';\n\n/**\n * Read a PDFium UTF-16LE string getter that uses the standard\n * (probe length, allocate, read) ABI. `call(buf, capacity)` must invoke\n * the native function and return the length in BYTES including the\n * trailing NUL (the value PDFium reports when `capacity` is 0).\n *\n * `emptyAs` decides what a present-but-empty value (`len === 2`, a lone\n * UTF-16 NUL) decodes to. This is the one knob different callers actually\n * disagree on: document Info strings treat `''` as a real value, whereas\n * a page label of `''` is indistinguishable from \"absent\" and reads as\n * `null`. Making it a parameter keeps that decision explicit instead of\n * forking the buffer dance.\n *\n * Returns `null` when the value is absent (`len <= 0`).\n */\nexport function readUtf16String(\n mem: PdfRuntimeMemory,\n call: (buf: Ptr, capacity: number) => number,\n emptyAs: '' | null = '',\n): string | null {\n const len = call(NULL_PTR, 0);\n if (len <= 0) return null; // absent\n if (len === 2) return emptyAs; // lone UTF-16 NUL\n return withScratch(mem, len, (buf) => {\n const written = call(buf, len);\n if (written <= 0) return null;\n return mem.readU16String(buf);\n });\n}\n\n/**\n * UTF-8 sibling of {@link readUtf16String} for the handful of native\n * getters that return UTF-8 (e.g. `EPDF_GetMetaKeyName`). UTF-8 has no\n * fixed empty-NUL width to special-case, so an empty value decodes to\n * `''`; absent (`len <= 0`) is `null`.\n */\nexport function readUtf8String(\n mem: PdfRuntimeMemory,\n call: (buf: Ptr, capacity: number) => number,\n): string | null {\n const len = call(NULL_PTR, 0);\n if (len <= 0) return null;\n return withScratch(mem, len, (buf) => {\n const written = call(buf, len);\n if (written <= 0) return null;\n return mem.readU8String(buf);\n });\n}\n\n/**\n * Write side of the UTF-16 convention: encode `value` into a scratch\n * buffer, hand the pointer to `set`, and always free it. `set` returns\n * the native call's success flag, which is propagated.\n */\nexport function writeUtf16String(\n mem: PdfRuntimeMemory,\n value: string,\n set: (ptr: Ptr) => boolean,\n): boolean {\n const ptr = mem.writeU16String(value);\n try {\n return set(ptr);\n } finally {\n mem.free(ptr);\n }\n}\n\n/**\n * A NUL-terminated UTF-8 copy of `value` in runtime memory for the duration\n * of `fn` (a `FPDF_STRING` parameter: a file system path, say).\n */\nexport function withUtf8CString<T>(\n mem: PdfRuntimeMemory,\n value: string,\n fn: (ptr: Ptr) => T,\n): T {\n const encoded = new TextEncoder().encode(value);\n const bytes = new Uint8Array(encoded.byteLength + 1);\n bytes.set(encoded);\n const ptr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(ptr, bytes);\n return fn(ptr);\n } finally {\n mem.free(ptr);\n }\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFileAccessHandle, PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\nimport { withUtf8CString } from '../../runtime/memory/strings';\n\nexport type OpenedPdfDocumentKind = 'fat-memory' | 'layer';\n\nconst FPDF_ERR_PASSWORD = 4;\n\n/**\n * Where a session's bytes come from, retained for the session's lifetime\n * so that every consumer (signing candidates, overlays, verbatim reads)\n * shares one interpretation: an immutable base in the registry (by key;\n * file bases also carry their path) and the layer the session was opened\n * with. A plain session has neither. Byte-backed layer sources keep their\n * bytes: they are what a candidate reopens over the same base.\n */\nexport type BaseSource =\n | { readonly kind: 'memory'; readonly key: string }\n | { readonly kind: 'file'; readonly key: string; readonly path: string };\n\nexport interface DocumentSource {\n readonly base: BaseSource | null;\n readonly layer: LayerSource | null;\n readonly password: string | null;\n}\n\nexport interface OpenedPdfDocument {\n readonly kind: OpenedPdfDocumentKind;\n readonly docPtr: Ptr;\n readonly source: DocumentSource;\n close(): void;\n}\n\nexport interface AcquiredBaseDocument {\n readonly key: string;\n readonly kind: 'memory' | 'file';\n /** File bases only. */\n readonly path?: string;\n readonly basePtr: Ptr;\n release(): void;\n}\n\nexport type LayerSource =\n | { readonly kind: 'fresh' }\n | { readonly kind: 'raw-delta'; readonly bytes: Uint8Array | ArrayBuffer }\n | { readonly kind: 'artifact'; readonly bytes: Uint8Array | ArrayBuffer }\n | { readonly kind: 'artifact-file'; readonly path: string };\n\nexport class CloseStack {\n private readonly actions: Array<() => void> = [];\n private closed = false;\n\n push(action: () => void): void {\n if (this.closed) {\n action();\n return;\n }\n this.actions.push(action);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n let firstError: unknown = null;\n for (let i = this.actions.length - 1; i >= 0; i--) {\n try {\n this.actions[i]?.();\n } catch (error) {\n firstError ??= error;\n }\n }\n this.actions.length = 0;\n if (firstError) throw firstError;\n }\n}\n\nexport function openFatMemoryDocument(\n runtime: PdfRuntimeModule,\n bytes: Uint8Array,\n password: string | null = null,\n): OpenedPdfDocument {\n const { mem, fn } = runtime;\n const stack = new CloseStack();\n const dataPtr = mem.alloc(bytes.byteLength);\n stack.push(() => mem.free(dataPtr));\n\n try {\n mem.writeBytes(dataPtr, bytes);\n const docPtr = fn.FPDF_LoadMemDocument64(dataPtr, bytes.byteLength, password ?? '');\n if (!docPtr) {\n // Distinguish \"locked\" from \"broken\": a password failure is a\n // recoverable state the caller can act on (prompt + unlock), never\n // a generic open failure.\n if (fn.FPDF_GetLastError() === FPDF_ERR_PASSWORD) {\n throw password\n ? new EngineError(EngineErrorCode.DocPasswordIncorrect, 'incorrect document password')\n : new EngineError(EngineErrorCode.DocPasswordRequired, 'document requires a password');\n }\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to open document');\n }\n setRuntimeOwnerPermissionsIfEncrypted(runtime, docPtr);\n stack.push(() => fn.FPDF_CloseDocument(docPtr));\n return {\n kind: 'fat-memory',\n docPtr,\n source: { base: null, layer: null, password },\n close: () => stack.close(),\n };\n } catch (error) {\n stack.close();\n throw error;\n }\n}\n\nexport function openLayerDocument(\n runtime: PdfRuntimeModule,\n base: AcquiredBaseDocument,\n layer: LayerSource = { kind: 'fresh' },\n password: string | null = null,\n): OpenedPdfDocument {\n const { mem, fn } = runtime;\n const stack = new CloseStack();\n stack.push(() => base.release());\n\n let layerAccess: PdfFileAccessHandle | null = null;\n const statusPtr = mem.alloc(4);\n try {\n mem.poke(statusPtr, 'i32', -1);\n let docPtr: Ptr;\n if (layer.kind === 'fresh') {\n docPtr = fn.EPDFLayer_OpenLayer(base.basePtr, NULL_PTR, password ?? '', statusPtr);\n } else if (layer.kind === 'artifact-file' && runtime.kind === 'native') {\n // The runtime opens the file itself and the layer keeps it open: the\n // delta is read in place, never copied, and every stream it carries\n // stays a view into the file (no overlay or twin copy either).\n docPtr = withUtf8CString(mem, layer.path, (pathPtr) =>\n fn.EPDFLayer_OpenLayerArtifactFromPath(base.basePtr, pathPtr, password ?? '', statusPtr),\n );\n } else {\n layerAccess =\n layer.kind === 'artifact-file'\n ? runtime.fileAccess.fromNodeFile(layer.path)\n : runtime.fileAccess.fromMemory(layer.bytes);\n stack.push(() => layerAccess?.close());\n docPtr =\n layer.kind === 'artifact' || layer.kind === 'artifact-file'\n ? fn.EPDFLayer_OpenLayerArtifact(base.basePtr, layerAccess.ptr, password ?? '', statusPtr)\n : fn.EPDFLayer_OpenLayer(base.basePtr, layerAccess.ptr, password ?? '', statusPtr);\n }\n\n const status = Number(mem.peek(statusPtr, 'i32'));\n if (!docPtr || status !== 0) {\n throw layerOpenError(status);\n }\n\n setRuntimeOwnerPermissionsIfEncrypted(runtime, docPtr);\n stack.push(() => fn.FPDF_CloseDocument(docPtr));\n const baseSource: BaseSource =\n base.kind === 'file' && base.path !== undefined\n ? { kind: 'file', key: base.key, path: base.path }\n : { kind: 'memory', key: base.key };\n return {\n kind: 'layer',\n docPtr,\n source: { base: baseSource, layer, password },\n close: () => stack.close(),\n };\n } catch (error) {\n stack.close();\n throw error;\n } finally {\n mem.free(statusPtr);\n }\n}\n\nexport function setRuntimeOwnerPermissionsIfEncrypted(\n runtime: PdfRuntimeModule,\n docPtr: Ptr,\n): void {\n const { fn } = runtime;\n if (fn.EPDF_IsEncrypted && fn.EPDF_SetRuntimeOwnerPermissions && fn.EPDF_IsEncrypted(docPtr)) {\n fn.EPDF_SetRuntimeOwnerPermissions(docPtr, true);\n }\n}\n\nfunction layerOpenError(status: number): EngineError {\n switch (status) {\n case 1:\n return new EngineError(EngineErrorCode.DocPasswordRequired, 'layer requires a password');\n case 2:\n return new EngineError(EngineErrorCode.MalformedPdf, 'layer delta is malformed');\n case 3:\n return new EngineError(\n EngineErrorCode.MalformedPdf,\n 'layer artifact does not match the supplied base document',\n );\n default:\n return new EngineError(EngineErrorCode.DocOpenFailed, 'failed to open layer document');\n }\n}\n","import type { PageObjectNumber } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * Manages pagePtr lifetime for a single open `DocumentSession`.\n *\n * `acquire(pon)` returns a loaded pagePtr for the given PDF object number,\n * loading it via `EPDFDoc_LoadPageByObjectNumberNormalized` (rotation forced\n * to 0deg so render/text/geometry/annotation coordinates all share one\n * normalized space) if not already in the pool. `release(pon)` decrements the\n * refcount and closes when it reaches\n * zero; `closeAll()` is called by `DocumentSession.close()`.\n *\n * While at least one holder is active the pagePtr is shared (refcounted),\n * so overlapping `acquire(pon)` calls for the same page reuse a single\n * load. Once the refcount reaches zero the page is closed; a later\n * `acquire` reloads it — there is no LRU retention across the zero-ref\n * boundary. A future slice could add that without changing callers.\n */\nexport class PagePtrPool {\n private readonly counts = new Map<PageObjectNumber, { ptr: Ptr; refs: number }>();\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly docPtr: Ptr,\n ) {}\n\n acquire(pageObjectNumber: PageObjectNumber): Ptr {\n const { fn } = this.runtime;\n const existing = this.counts.get(pageObjectNumber);\n if (existing) {\n existing.refs++;\n return existing.ptr;\n }\n const ptr = fn.EPDFDoc_LoadPageByObjectNumberNormalized(this.docPtr, pageObjectNumber);\n if (!ptr) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber}`,\n );\n }\n this.counts.set(pageObjectNumber, { ptr, refs: 1 });\n return ptr;\n }\n\n /**\n * True while at least one holder has the page open. Page-STRUCTURE\n * mutations (delete) assert on this: thread confinement means no other\n * job can be mid-flight, so a held pagePtr during a structural mutation\n * is a leaked `acquire` (an internal bug) — the mutator fails loudly\n * instead of mutating under a live handle.\n */\n isHeld(pageObjectNumber: PageObjectNumber): boolean {\n return this.counts.has(pageObjectNumber);\n }\n\n release(pageObjectNumber: PageObjectNumber): void {\n const entry = this.counts.get(pageObjectNumber);\n if (!entry) return;\n entry.refs--;\n if (entry.refs <= 0) {\n this.runtime.fn.FPDF_ClosePage(entry.ptr);\n this.counts.delete(pageObjectNumber);\n }\n }\n\n closeAll(): void {\n const { fn } = this.runtime;\n for (const { ptr } of this.counts.values()) {\n fn.FPDF_ClosePage(ptr);\n }\n this.counts.clear();\n }\n}\n","import type {\n PageObjectNumber,\n RevisionToken,\n WeakAnnotationState,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n UNKNOWN_WEAK_ANNOTATION_STATE,\n revisionTokensEqual,\n} from '@embedpdf/engine-core/runtime';\n\nexport interface RevisionAuthority {\n readonly docSessionId: string;\n token(pageObjectNumber: PageObjectNumber): RevisionToken;\n bump(pageObjectNumber: PageObjectNumber): RevisionToken;\n validate(token: RevisionToken): void;\n weakAnnotationState(pageObjectNumber: PageObjectNumber): WeakAnnotationState;\n recordWeakAnnotationState(pageObjectNumber: PageObjectNumber, state: WeakAnnotationState): void;\n /** Forget a page entirely (generation + weak state). Called when the page\n * is DELETED — its object number is retired, never recycled, so dropping\n * is hygiene, not correctness. */\n drop(pageObjectNumber: PageObjectNumber): void;\n clear(): void;\n}\n\n/**\n * Per-page generation counter. Backs `RevisionToken` so weak\n * `AnnotationRef.kind === 'index'` references can be validated against the\n * exact page state they were minted from.\n *\n * `bump()` is the only mutator; mutation services call it after a\n * structural change to the page (annotation create/delete/reorder).\n * Read paths never mutate the store.\n */\nexport class LocalRevisionAuthority implements RevisionAuthority {\n private readonly generations = new Map<PageObjectNumber, number>();\n private readonly weakAnnotationStates = new Map<PageObjectNumber, WeakAnnotationState>();\n\n constructor(public readonly docSessionId: string) {}\n\n /** Returns the current generation, defaulting to 0 for first read. */\n current(pageObjectNumber: PageObjectNumber): number {\n return this.generations.get(pageObjectNumber) ?? 0;\n }\n\n /** Mints a fresh `RevisionToken` for the page's current generation. */\n token(pageObjectNumber: PageObjectNumber): RevisionToken {\n return {\n docSessionId: this.docSessionId,\n pageObjectNumber,\n generation: this.current(pageObjectNumber),\n };\n }\n\n /**\n * Increments the generation counter for a page. Returns the new token.\n * Called by mutation services after every structural change.\n */\n bump(pageObjectNumber: PageObjectNumber): RevisionToken {\n const next = this.current(pageObjectNumber) + 1;\n this.generations.set(pageObjectNumber, next);\n return this.token(pageObjectNumber);\n }\n\n /**\n * Strict equality check. Throws `EngineError(InvalidReference)` when the\n * caller's token does not match what the store currently holds.\n */\n validate(token: RevisionToken): void {\n if (token.docSessionId !== this.docSessionId) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n 'revision token belongs to a different document session',\n { details: { token } },\n );\n }\n const current = this.token(token.pageObjectNumber);\n if (!revisionTokensEqual(current, token)) {\n throw new EngineError(EngineErrorCode.InvalidReference, 'revision token is stale', {\n details: { provided: token, current },\n });\n }\n }\n\n weakAnnotationState(pageObjectNumber: PageObjectNumber): WeakAnnotationState {\n return this.weakAnnotationStates.get(pageObjectNumber) ?? UNKNOWN_WEAK_ANNOTATION_STATE;\n }\n\n recordWeakAnnotationState(pageObjectNumber: PageObjectNumber, state: WeakAnnotationState): void {\n this.weakAnnotationStates.set(pageObjectNumber, state);\n }\n\n drop(pageObjectNumber: PageObjectNumber): void {\n this.generations.delete(pageObjectNumber);\n this.weakAnnotationStates.delete(pageObjectNumber);\n }\n\n clear(): void {\n this.generations.clear();\n this.weakAnnotationStates.clear();\n }\n}\n","import type {\n DocumentVersionRef,\n PageObjectNumber,\n PageState,\n RevisionToken,\n SessionKind,\n SignatureCompleteResult,\n SignaturePrepared,\n SignedDocumentPolicy,\n WeakAnnotationState,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n knownWeakAnnotationState,\n isValidPageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n openFatMemoryDocument,\n type DocumentSource,\n type OpenedPdfDocument,\n type OpenedPdfDocumentKind,\n} from './lifecycle/PdfDocumentOpener';\nimport { PagePtrPool } from './pages/PagePtrPool';\nimport type { PageRecord } from './pages/PageRecord';\nimport { LocalRevisionAuthority, type RevisionAuthority } from './revisions/RevisionAuthority';\n\n/**\n * Owns the lifecycle of a single open PDFium document and the v3\n * identity machinery: page registry (pageObjectNumber <-> pageIndex),\n * `RevisionAuthority` (per-page generation counters), and `PagePtrPool`\n * (refcounted pagePtr access).\n *\n * Both the local browser Worker and the server worker_thread instantiate\n * this exactly the same way; the only thing that differs is the\n * underlying PdfRuntimeModule (WASM vs native).\n */\n/**\n * A serialised signing candidate: the sealed-to-be file with the\n * zero-filled /Contents hole, either as one buffer in JS memory (the local\n * engine) or as a file beside the session's base (the server), plus where\n * the signature value object lies in it.\n */\nexport type SavedCandidate =\n | { kind: 'memory'; bytes: Uint8Array; size: number; objectOffset: number; objectLength: number }\n | { kind: 'file'; path: string; size: number; objectOffset: number; objectLength: number };\n\n/**\n * A sealed-to-be candidate parked on a session between `prepare` and\n * `complete`/`abort`. The native candidate documents are closed as soon as\n * the seal is computed; only the serialised candidate remains.\n */\nexport interface PendingSigning {\n readonly prepared: SignaturePrepared;\n readonly fieldObjectNumber: number;\n readonly saved: SavedCandidate;\n readonly contentsOffset: number;\n readonly contentsHexLength: number;\n}\n\n/** What a completed signing left behind, for idempotent replays. */\nexport interface SigningCompletion {\n readonly signingId: string;\n readonly cms: Uint8Array;\n readonly result: SignatureCompleteResult;\n}\n\nexport class DocumentSession {\n private docPtr: Ptr | null = null;\n private closeDocument: (() => void) | null = null;\n private _kind: OpenedPdfDocumentKind | null = null;\n private _source: DocumentSource | null = null;\n private readonly _sessionId: string;\n\n /** pon -> record */\n private readonly recordsByObjectNumber = new Map<PageObjectNumber, PageRecord>();\n /** pageIndex -> record */\n private readonly recordsByIndex = new Map<number, PageRecord>();\n private fullyEnumerated = false;\n\n private revisions: RevisionAuthority | null = null;\n private mutationSeqCounter = 0;\n private pages: PagePtrPool | null = null;\n /**\n * Whether writers honour what the document's signatures forbid (locked\n * fields, structural edits). Set at open from the engine option; the\n * main-thread guard subtracts the matching capabilities.\n */\n signedDocumentPolicy: SignedDocumentPolicy = 'protect';\n /**\n * The shape the caller asked for when opening plain bytes. `layer` (the\n * default) opens them as an immutable base with a fresh layer; `plain`\n * keeps one in-memory document unless the bytes already carry a\n * signature, which always opens as a layer.\n */\n sessionKind: SessionKind = 'layer';\n /** The password the document was opened with; signing candidates open with the same one. */\n password: string | null = null;\n /**\n * Whether mutations on a layer session also serialize the layer artifact\n * into their response (what a server persists). False for a session that\n * became a layer only because its document is signed (see\n * `WorkerHost.openSignedAware`): the caller opened plain bytes and never\n * asked for artifacts.\n */\n persistLayerArtifact = true;\n /** The mutation sequence the current bytes were loaded at (see `hasUnsavedEdits`). */\n private loadedSeq = 0;\n /** SHA-256 (hex) of a plain session's loaded bytes, hashed once per load. */\n private plainSha256: { loadedSeq: number; sha256: string } | null = null;\n /** The signing candidate parked by `signatures.prepare`, if any. */\n pendingSigning: PendingSigning | null = null;\n /** The last completed signing, so a replayed `complete` answers `already-completed`. */\n lastCompletion: SigningCompletion | null = null;\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n sessionId?: string,\n ) {\n this._sessionId = sessionId ?? generateSessionId();\n }\n\n get sessionId(): string {\n return this._sessionId;\n }\n\n get kind(): OpenedPdfDocumentKind | null {\n return this._kind;\n }\n\n /**\n * Where the current bytes come from: the immutable base (registry key,\n * file path for file bases) and the layer the session was opened with.\n * One interpretation for signing candidates, overlays and verbatim reads.\n */\n get source(): DocumentSource {\n if (!this._source) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document is not open');\n }\n return this._source;\n }\n\n isOpen(): boolean {\n return this.docPtr !== null;\n }\n\n open(bytes: Uint8Array, password: string | null = null): void {\n this.openFromHandle(openFatMemoryDocument(this.runtime, bytes, password));\n }\n\n openFromHandle(handle: OpenedPdfDocument): void {\n if (this.docPtr) {\n handle.close();\n throw new EngineError(EngineErrorCode.InvalidArg, 'document already open');\n }\n this.docPtr = handle.docPtr;\n this.closeDocument = () => handle.close();\n this._kind = handle.kind;\n this._source = handle.source;\n this.revisions = new LocalRevisionAuthority(this._sessionId);\n this.pages = new PagePtrPool(this.runtime, handle.docPtr);\n this.parkedBytes = null;\n this.loadedSeq = this.mutationSeqCounter;\n }\n\n /**\n * Whether anything was mutated since the current bytes were loaded. When\n * false, the loaded bytes ARE the document: a save returns them verbatim\n * and a signing candidate is built straight on them.\n */\n hasUnsavedEdits(): boolean {\n return this.mutationSeqCounter !== this.loadedSeq;\n }\n\n /** Cached hash of the current loaded bytes, or `null` when not computed since the last load. */\n cachedPlainSha256(): string | null {\n return this.plainSha256 && this.plainSha256.loadedSeq === this.loadedSeq\n ? this.plainSha256.sha256\n : null;\n }\n\n rememberPlainSha256(sha256: string): void {\n this.plainSha256 = { loadedSeq: this.loadedSeq, sha256 };\n }\n\n /**\n * Re-point this session at new bytes — the one operation that changes\n * what an open session is backed by, used when a completed signature\n * installs its sealed file. The session id, its page object numbers\n * (an incremental save never renumbers) and its retained resources\n * survive; the old document is closed, every page is re-pinned (its\n * revision bumped, its cached pointer dropped), and the mutation\n * sequence advances so every version-keyed cache rebuilds.\n */\n install(handle: OpenedPdfDocument): void {\n if (!this.docPtr) {\n handle.close();\n throw new EngineError(EngineErrorCode.DocNotOpen, 'no document to replace');\n }\n const previousPages = Array.from(this.recordsByObjectNumber.keys());\n let firstError: unknown = null;\n try {\n this.pages?.closeAll();\n } catch (error) {\n firstError = error;\n }\n try {\n this.closeDocument?.();\n } catch (error) {\n firstError ??= error;\n }\n this.docPtr = handle.docPtr;\n this.closeDocument = () => handle.close();\n this._kind = handle.kind;\n this._source = handle.source;\n this.pages = new PagePtrPool(this.runtime, handle.docPtr);\n this.recordsByIndex.clear();\n this.recordsByObjectNumber.clear();\n this.fullyEnumerated = false;\n for (const pon of previousPages) this.requireRevisions().bump(pon);\n this.mutationSeqCounter++;\n this.loadedSeq = this.mutationSeqCounter;\n this.pendingSigning = null;\n if (firstError) throw firstError;\n }\n\n /** The two publish fences a candidate is built on. */\n versionRef(baseSha256: string): DocumentVersionRef {\n return { baseSha256, editsVersion: this.mutationSeqCounter };\n }\n\n /**\n * Park this session in the password-locked state: the document could not\n * be loaded because a (correct) password is missing, so the session keeps\n * the already-transferred bytes and waits for an unlock attempt to load\n * them. A locked session occupies its docId key like an open one — every\n * operation except the password check rejects with DocPasswordRequired.\n */\n parkLocked(bytes: Uint8Array): void {\n if (this.docPtr) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'document already open');\n }\n this.parkedBytes = bytes;\n }\n\n isLocked(): boolean {\n return this.docPtr === null && this.parkedBytes !== null;\n }\n\n /** The bytes retained for a later unlock attempt. Locked sessions only. */\n lockedBytes(): Uint8Array {\n if (!this.parkedBytes) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document session is not locked');\n }\n return this.parkedBytes;\n }\n\n private parkedBytes: Uint8Array | null = null;\n\n /** Number of pages in the document. */\n pageCount(): number {\n return this.runtime.fn.FPDF_GetPageCount(this.requireDocPtr());\n }\n\n /**\n * Lazily enumerate every page and cache (pageObjectNumber, pageIndex).\n * Necessary before `listRawAll()` and any pon -> pageIndex resolution.\n */\n ensureFullPageRegistry(): void {\n if (this.fullyEnumerated) return;\n const { fn } = this.runtime;\n const docPtr = this.requireDocPtr();\n const count = fn.FPDF_GetPageCount(docPtr);\n for (let i = 0; i < count; i++) {\n if (this.recordsByIndex.has(i)) continue;\n const pon = fn.EPDFDoc_GetPageObjectNumberByIndex(docPtr, i);\n if (!isValidPageObjectNumber(pon)) {\n // Spec violation: ISO 32000-1 §7.7.3.3 requires every\n // /Page to be referenced indirectly from the /Pages tree.\n // PDFium's loader is permissive enough to surface direct\n // page dicts from broken generators, but the engine's\n // identity model requires a real indirect object number,\n // so we refuse the document here with a clear, actionable\n // error rather than silently routing through a weak\n // identity path.\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n `page at index ${i} is a direct (non-indirect) PDF object; the engine requires every page to have a stable indirect object number`,\n { details: { pageIndex: i, pon } },\n );\n }\n const record: PageRecord = { pageObjectNumber: pon, pageIndex: i };\n this.recordsByIndex.set(i, record);\n this.recordsByObjectNumber.set(pon, record);\n }\n this.fullyEnumerated = true;\n }\n\n /** Lookup; populates the cache for one page only on cache miss. */\n recordByObjectNumber(pageObjectNumber: PageObjectNumber): PageRecord {\n const cached = this.recordsByObjectNumber.get(pageObjectNumber);\n if (cached) return cached;\n\n // Probe the doc by loading the page directly via its object number;\n // walk the index range to find which page index it lives at.\n const { fn } = this.runtime;\n const docPtr = this.requireDocPtr();\n const probePtr = fn.EPDFDoc_LoadPageByObjectNumber(docPtr, pageObjectNumber);\n if (!probePtr) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber}`,\n );\n }\n fn.FPDF_ClosePage(probePtr);\n\n // Now we know the page exists; fall back to a full enumeration to get\n // its display index. This is O(pageCount) once per session.\n this.ensureFullPageRegistry();\n const found = this.recordsByObjectNumber.get(pageObjectNumber);\n if (!found) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `page with object number ${pageObjectNumber} present but unindexable`,\n );\n }\n return found;\n }\n\n /** All page records, in display order. Forces full enumeration. */\n allRecords(): PageRecord[] {\n this.ensureFullPageRegistry();\n return Array.from(this.recordsByIndex.entries())\n .sort(([a], [b]) => a - b)\n .map(([, r]) => r);\n }\n\n /**\n * Drop the cached `pageIndex <-> pageObjectNumber` mapping and force a\n * fresh enumeration on next access. Called by `PagesMutator`\n * after `FPDF_MovePages` shuffles page positions; we keep\n * weak-annotation knowledge and per-page revision counters intact, both of\n * which are keyed by durable `pageObjectNumber` and survive a page reorder.\n */\n refreshPageRegistry(): void {\n this.recordsByIndex.clear();\n this.recordsByObjectNumber.clear();\n this.fullyEnumerated = false;\n this.ensureFullPageRegistry();\n }\n\n /** Per-page liveness envelope used by annotation read/mutation results. */\n pageState(pageObjectNumber: PageObjectNumber): PageState {\n // Validate the page exists (throws NotFound for bad pons); liveness is\n // keyed by pon and carries no display order — that lives in PageLayout.\n this.recordByObjectNumber(pageObjectNumber);\n const weakAnnotationState = this.requireRevisions().weakAnnotationState(pageObjectNumber);\n return {\n pageObjectNumber,\n revision: this.requireRevisions().token(pageObjectNumber),\n weakAnnotationState,\n };\n }\n\n /** Set by readers as they discover whether a page has weak annotations. */\n recordWeakFlag(pageObjectNumber: PageObjectNumber, hasWeak: boolean): void {\n this.recordWeakAnnotationState(pageObjectNumber, knownWeakAnnotationState(hasWeak));\n }\n\n recordWeakAnnotationState(pageObjectNumber: PageObjectNumber, state: WeakAnnotationState): void {\n this.requireRevisions().recordWeakAnnotationState(pageObjectNumber, state);\n }\n\n weakAnnotationState(pageObjectNumber: PageObjectNumber): WeakAnnotationState {\n return this.requireRevisions().weakAnnotationState(pageObjectNumber);\n }\n\n /** Bump and return the new revision token; called by mutation paths. */\n bumpRevision(pageObjectNumber: PageObjectNumber): RevisionToken {\n return this.requireRevisions().bump(pageObjectNumber);\n }\n\n /**\n * Monotonic count of successful document mutations in this session.\n * Version key for detached-snapshot caches (e.g. the forms model):\n * a cache entry built at sequence N is exactly valid while the\n * sequence is still N. Coarse on purpose — widgets are annotations\n * and page ops move widgets, so ANY mutation may affect derived\n * form state; per-domain counters are a later optimization.\n */\n mutationSeq(): number {\n return this.mutationSeqCounter;\n }\n\n /** Record one successful mutation; called by mutation paths. */\n noteMutation(): void {\n this.mutationSeqCounter++;\n }\n\n /**\n * Forget a page's per-session state (revision generation + weak-annotation\n * flag). Called by `pages.delete` after the page object is retired; the\n * PON is never recycled, so this is hygiene, not correctness.\n */\n dropPageState(pageObjectNumber: PageObjectNumber): void {\n this.requireRevisions().drop(pageObjectNumber);\n }\n\n validateRevision(token: RevisionToken): void {\n this.requireRevisions().validate(token);\n }\n\n pagePool(): PagePtrPool {\n if (!this.pages) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document is not open');\n }\n return this.pages;\n }\n\n requireDocPtr(): Ptr {\n if (!this.docPtr) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document is not open');\n }\n return this.docPtr;\n }\n\n /**\n * Park a disposer to run when THIS session closes. Used by operations\n * whose native side leaves the session document referencing another\n * resource — e.g. `pages.insert`: `FPDF_ImportPagesByIndex` does not\n * fully detach imported objects from their source document, so the\n * source doc + its byte buffer must stay alive until the destination\n * can no longer be saved (i.e. until this session closes).\n */\n retainUntilClose(dispose: () => void): void {\n this.retained.push(dispose);\n }\n\n private readonly retained: Array<() => void> = [];\n\n close(): void {\n let firstError: unknown = null;\n try {\n this.pages?.closeAll();\n } catch (error) {\n firstError = error;\n } finally {\n this.pages = null;\n }\n\n // A candidate written to a file must not outlive the session that parked it.\n if (this.pendingSigning?.saved.kind === 'file') {\n try {\n this.runtime.fileWrite.removeFile(this.pendingSigning.saved.path);\n } catch (error) {\n firstError ??= error;\n }\n }\n\n try {\n this.closeDocument?.();\n } catch (error) {\n firstError ??= error;\n } finally {\n this.closeDocument = null;\n this.docPtr = null;\n this._kind = null;\n this._source = null;\n this.parkedBytes = null;\n this.pendingSigning = null;\n this.lastCompletion = null;\n this.revisions?.clear();\n this.revisions = null;\n this.recordsByIndex.clear();\n this.recordsByObjectNumber.clear();\n this.fullyEnumerated = false;\n }\n\n // Retained resources go LAST (reverse order): the session doc that\n // referenced them is closed above, so they are safe to release now.\n for (let i = this.retained.length - 1; i >= 0; i--) {\n try {\n this.retained[i]();\n } catch (error) {\n firstError ??= error;\n }\n }\n this.retained.length = 0;\n\n if (firstError) throw firstError;\n }\n\n private requireRevisions(): RevisionAuthority {\n if (!this.revisions) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document is not open');\n }\n return this.revisions;\n }\n}\n\n// Monotonic per-realm counter: the docSessionId exists only for the local\n// bleed-over check (a revision token minted by one session must not validate\n// against another), so uniqueness is the whole requirement — a counter makes\n// collisions structurally impossible within a realm, and the timestamp\n// distinguishes ids across realm restarts. Deliberately not random: there is\n// no adversary to hide the id from (anyone in-process can call the engine\n// directly), and pulling in crypto would add runtime constraints for nothing.\nlet sessionCounter = 0;\n\nfunction generateSessionId(): string {\n return `sess_${(++sessionCounter).toString(36)}_${Date.now().toString(36)}`;\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFileAccessHandle, PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AcquiredBaseDocument } from './PdfDocumentOpener';\nimport { CloseStack, setRuntimeOwnerPermissionsIfEncrypted } from './PdfDocumentOpener';\n\nconst FPDF_ERR_PASSWORD = 4;\n\n/**\n * A password failure is a recoverable STATE the caller can act on (prompt,\n * unlock), never a generic open failure — the same distinction\n * `openFatMemoryDocument` draws, so a plain-bytes open that becomes a base\n * parks and unlocks exactly like it always did.\n */\nfunction baseOpenError(runtime: PdfRuntimeModule, password: string | null | undefined): EngineError {\n if (runtime.fn.FPDF_GetLastError() === FPDF_ERR_PASSWORD) {\n return password\n ? new EngineError(EngineErrorCode.DocPasswordIncorrect, 'incorrect document password')\n : new EngineError(EngineErrorCode.DocPasswordRequired, 'document requires a password');\n }\n return new EngineError(EngineErrorCode.DocOpenFailed, 'failed to open base document');\n}\n\ninterface BaseEntry {\n key: string;\n kind: 'memory' | 'file';\n path?: string;\n basePtr: Ptr;\n refs: number;\n close: () => void;\n}\n\nexport class BaseDocumentRegistry {\n private readonly entries = new Map<string, BaseEntry>();\n\n constructor(private readonly runtime: PdfRuntimeModule) {}\n\n acquireMemoryBase(opts: {\n key: string;\n bytes: Uint8Array;\n password?: string | null;\n /** A verified SHA-256 (hex) of `bytes`; spares the runtime a full hashing pass. */\n knownSha256?: string;\n }): AcquiredBaseDocument {\n const existing = this.retain(opts.key);\n if (existing) return existing;\n\n const { mem, fn } = this.runtime;\n const stack = new CloseStack();\n const dataPtr = mem.alloc(opts.bytes.byteLength);\n stack.push(() => mem.free(dataPtr));\n\n try {\n mem.writeBytes(dataPtr, opts.bytes);\n const basePtr = fn.EPDF_LoadMemBaseDocument64(\n dataPtr,\n opts.bytes.byteLength,\n opts.password ?? '',\n );\n if (!basePtr) {\n throw baseOpenError(this.runtime, opts.password);\n }\n setRuntimeOwnerPermissionsIfEncrypted(this.runtime, basePtr);\n stack.push(() => fn.EPDF_ReleaseBaseDocument(basePtr));\n this.supplyKnownSha(basePtr, opts.knownSha256);\n return this.insert({ key: opts.key, kind: 'memory', basePtr, refs: 1, close: () => stack.close() });\n } catch (error) {\n stack.close();\n throw error;\n }\n }\n\n acquireFileBase(opts: {\n key: string;\n path: string;\n password?: string | null;\n /** A verified SHA-256 (hex) of the file; spares the runtime a full hashing pass. */\n knownSha256?: string;\n }): AcquiredBaseDocument {\n const existing = this.retain(opts.key);\n if (existing) return existing;\n\n const { fn } = this.runtime;\n const stack = new CloseStack();\n let access: PdfFileAccessHandle | null = null;\n\n try {\n access = this.runtime.fileAccess.fromNodeFile(opts.path);\n stack.push(() => access?.close());\n const basePtr = fn.EPDF_LoadBaseDocument(access.ptr, opts.password ?? '');\n if (!basePtr) {\n throw baseOpenError(this.runtime, opts.password);\n }\n setRuntimeOwnerPermissionsIfEncrypted(this.runtime, basePtr);\n stack.push(() => fn.EPDF_ReleaseBaseDocument(basePtr));\n this.supplyKnownSha(basePtr, opts.knownSha256);\n return this.insert({ key: opts.key, kind: 'file', path: opts.path, basePtr, refs: 1, close: () => stack.close() });\n } catch (error) {\n stack.close();\n throw error;\n }\n }\n\n /**\n * One more retain on a base already in the registry (a session holds one\n * for its lifetime, so its key is live while it is open), or null. The\n * way a signing candidate reopens over its session's own base without\n * copying a byte.\n */\n retainByKey(key: string): AcquiredBaseDocument | null {\n return this.retain(key);\n }\n\n /**\n * Hand the runtime a hash the host already verified for these exact\n * bytes, so it never hashes them itself. Malformed values are ignored:\n * the runtime then hashes lazily on first use, which is always correct.\n */\n private supplyKnownSha(basePtr: Ptr, sha256Hex: string | undefined): void {\n if (!sha256Hex || !/^[0-9a-fA-F]{64}$/.test(sha256Hex)) return;\n const { mem, fn } = this.runtime;\n const bytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) bytes[i] = parseInt(sha256Hex.slice(i * 2, i * 2 + 2), 16);\n const ptr = mem.alloc(32);\n try {\n mem.writeBytes(ptr, bytes);\n fn.EPDF_SetBaseDocumentSha256(basePtr, ptr);\n } finally {\n mem.free(ptr);\n }\n }\n\n releaseAll(): void {\n const entries = Array.from(this.entries.values());\n this.entries.clear();\n let firstError: unknown = null;\n for (const entry of entries) {\n try {\n entry.close();\n } catch (error) {\n firstError ??= error;\n }\n }\n if (firstError) throw firstError;\n }\n\n /** @internal Test-only probe of the per-key share refcount. */\n getRefCountForTesting(key: string): number {\n return this.entries.get(key)?.refs ?? 0;\n }\n\n private retain(key: string): AcquiredBaseDocument | null {\n const entry = this.entries.get(key);\n if (!entry) return null;\n entry.refs++;\n return this.handleFor(entry);\n }\n\n private insert(entry: BaseEntry): AcquiredBaseDocument {\n this.entries.set(entry.key, entry);\n return this.handleFor(entry);\n }\n\n private handleFor(entry: BaseEntry): AcquiredBaseDocument {\n let released = false;\n return {\n key: entry.key,\n kind: entry.kind,\n ...(entry.path !== undefined ? { path: entry.path } : {}),\n basePtr: entry.basePtr,\n release: () => {\n if (released) return;\n released = true;\n const live = this.entries.get(entry.key);\n if (!live) return;\n live.refs--;\n if (live.refs > 0) return;\n this.entries.delete(entry.key);\n live.close();\n },\n };\n }\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readUtf16String } from '../../../runtime/memory/strings';\n\n/**\n * Read a key from the document's Info dictionary. Returns null if the key\n * does not exist, '' if it exists but is empty, otherwise the UTF-16 string.\n *\n * `EPDF_HasMetaText` distinguishes an absent key (null) from a present\n * empty one (''); the value itself uses the standard UTF-16 getter ABI\n * (see `readUtf16String`, which keeps `''` as a real value here).\n */\nexport function readMetaText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n key: string,\n): string | null {\n if (!fn.EPDF_HasMetaText(docPtr, key)) return null;\n return readUtf16String(\n mem,\n (buf, capacity) => fn.FPDF_GetMetaText(docPtr, key, buf, capacity),\n '',\n );\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readMetaText } from './readMetadataText';\nimport { readUtf8String } from '../../../runtime/memory/strings';\n\n/**\n * Read the name of one key in the document's Info dictionary.\n * customOnly = true returns only non-reserved (custom) keys, matching the\n * behavior of `getMetaKeyName` in the legacy engine. Key names come back\n * as UTF-8.\n */\nfunction readMetaKeyName(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n customOnly: boolean,\n): string | null {\n return readUtf8String(mem, (buf, capacity) =>\n fn.EPDF_GetMetaKeyName(docPtr, index, customOnly, buf, capacity),\n );\n}\n\n/**\n * Read all custom metadata key/value pairs from the document's Info\n * dictionary. The wire format guarantees `string` values, so absent keys\n * are dropped (rather than represented as null).\n *\n * Mirrors the legacy `readAllMeta` (engine.ts:4698) but tightens the type\n * to Record<string, string> for the wire format.\n */\nexport function readAllCustomMeta(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n): Record<string, string> {\n const count = Number(fn.EPDF_GetMetaKeyCount(docPtr, true)) | 0;\n const out: Record<string, string> = {};\n for (let i = 0; i < count; i++) {\n const key = readMetaKeyName(fn, mem, docPtr, i, true);\n if (!key) continue;\n const value = readMetaText(fn, mem, docPtr, key);\n if (value == null) continue;\n out[key] = value;\n }\n return out;\n}\n","import type { DocumentMetadataTrapped } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, Ptr } from '@embedpdf/engine-runtime';\n\n// PDFium /Trapped values:\n// 0 = NotSet, 1 = True, 2 = False, 3 = Unknown.\n// The v3 wire DTO has only true/false/unknown, so NotSet folds into 'unknown'.\nconst TRAPPED_TRUE = 1;\nconst TRAPPED_FALSE = 2;\n\nexport function readTrapped(fn: PdfFunctions, docPtr: Ptr): DocumentMetadataTrapped {\n const raw = Number(fn.EPDF_GetMetaTrapped(docPtr));\n if (raw === TRAPPED_TRUE) return 'true';\n if (raw === TRAPPED_FALSE) return 'false';\n return 'unknown';\n}\n","import type { DocumentMetadata } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { readAllCustomMeta } from './internal/readCustomMetadata';\nimport { readMetaText } from './internal/readMetadataText';\nimport { readTrapped } from './internal/readTrappedStatus';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { pdfDateToIso } from '../../shared/pdf-date';\n\n/**\n * Synchronous, runtime-agnostic implementation of the metadata read.\n *\n * Lives in @embedpdf/engine-services so it can be reused unchanged by:\n * - @embedpdf/engine (inside a browser Worker, WASM runtime)\n * - @cloudpdf/server (inside a Node worker_thread, native runtime)\n *\n * Async-ness lives at the worker boundary, not here.\n */\nexport class MetadataReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(signal: AbortSignal): DocumentMetadata {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const doc = this.session.requireDocPtr();\n\n const title = readMetaText(fn, mem, doc, 'Title');\n throwIfAborted(signal);\n const author = readMetaText(fn, mem, doc, 'Author');\n throwIfAborted(signal);\n const subject = readMetaText(fn, mem, doc, 'Subject');\n throwIfAborted(signal);\n const keywords = readMetaText(fn, mem, doc, 'Keywords');\n throwIfAborted(signal);\n const producer = readMetaText(fn, mem, doc, 'Producer');\n throwIfAborted(signal);\n const creator = readMetaText(fn, mem, doc, 'Creator');\n throwIfAborted(signal);\n const creationRaw = readMetaText(fn, mem, doc, 'CreationDate');\n throwIfAborted(signal);\n const modRaw = readMetaText(fn, mem, doc, 'ModDate');\n throwIfAborted(signal);\n const trapped = readTrapped(fn, doc);\n throwIfAborted(signal);\n const custom = readAllCustomMeta(fn, mem, doc);\n\n return {\n title,\n author,\n subject,\n keywords,\n producer,\n creator,\n created: creationRaw ? pdfDateToIso(creationRaw) : null,\n modified: modRaw ? pdfDateToIso(modRaw) : null,\n trapped,\n custom,\n };\n }\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\nimport { writeUtf16String } from '../../../../runtime/memory/strings';\n\n/**\n * Write (or clear) one key in the document's Info dictionary.\n *\n * value = null -> remove the key (pass NULL_PTR; the fork's\n * `EPDF_SetMetaText` deletes the entry on a null value)\n * value = \"...\" -> set the key to the UTF-16 string (an empty string is\n * a real, present-but-empty value, matching the reader's\n * `emptyAs = ''` decode)\n *\n * Returns the native success flag. Mirrors v2 `setMetaText` (engine.ts),\n * minus v2's \"empty string removes\" quirk — three-state patch semantics\n * keep `null` (clear) and `''` (set empty) distinct.\n */\nexport function writeMetaText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n key: string,\n value: string | null,\n): boolean {\n if (value === null) {\n return fn.EPDF_SetMetaText(docPtr, key, NULL_PTR);\n }\n return writeUtf16String(mem, value, (ptr) => fn.EPDF_SetMetaText(docPtr, key, ptr));\n}\n","import type { DocumentMetadataTrapped } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, Ptr } from '@embedpdf/engine-runtime';\n\n// PDFium /Trapped values mirror `readTrappedStatus`:\n// 0 = NotSet, 1 = True, 2 = False, 3 = Unknown.\nconst TRAPPED_TRUE = 1;\nconst TRAPPED_FALSE = 2;\nconst TRAPPED_UNKNOWN = 3;\n\n/**\n * Set the document's /Trapped Info entry from the wire enum. The v3 DTO\n * only carries `true | false | unknown`, so there is no \"clear\" form here\n * (unlike v2, which folded null into NotSet/removal); omit `trapped` from\n * the patch to leave it untouched.\n */\nexport function writeMetaTrapped(\n fn: PdfFunctions,\n docPtr: Ptr,\n status: DocumentMetadataTrapped,\n): boolean {\n const code =\n status === 'true' ? TRAPPED_TRUE : status === 'false' ? TRAPPED_FALSE : TRAPPED_UNKNOWN;\n return fn.EPDF_SetMetaTrapped(docPtr, code);\n}\n","import { EngineError, EngineErrorCode, type MetadataPatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { writeMetaText } from './writeMetaText';\nimport { writeMetaTrapped } from './writeMetaTrapped';\nimport { formatPdfDate } from '../../../../shared/pdf-date';\n\n/**\n * Standard Info-dict keys the patch maps to explicitly. Custom keys may\n * not collide with these (a custom write to `Title` would shadow the\n * structured field), so they are skipped with the date keys and /Trapped.\n */\nconst RESERVED_INFO_KEYS = new Set([\n 'Title',\n 'Author',\n 'Subject',\n 'Keywords',\n 'Producer',\n 'Creator',\n 'CreationDate',\n 'ModDate',\n 'Trapped',\n]);\n\n/**\n * Standard string field -> PDF Info key. Date fields and /Trapped are\n * handled separately because they need format conversion / a dedicated\n * native setter.\n */\nconst STRING_FIELDS: ReadonlyArray<[keyof MetadataPatch, string]> = [\n ['title', 'Title'],\n ['author', 'Author'],\n ['subject', 'Subject'],\n ['keywords', 'Keywords'],\n ['producer', 'Producer'],\n ['creator', 'Creator'],\n];\n\n/**\n * A custom key must be writable as a PDF Name and must not shadow a\n * reserved standard key. Mirrors v2 `isValidCustomKey` (helper.ts):\n * non-empty ASCII printable, <= 127 chars, no leading slash.\n */\nfunction isValidCustomKey(key: string): boolean {\n if (!key || key.length > 127) return false;\n if (RESERVED_INFO_KEYS.has(key)) return false;\n if (key[0] === '/') return false;\n for (let i = 0; i < key.length; i++) {\n const c = key.charCodeAt(i);\n if (c < 0x20 || c > 0x7e) return false;\n }\n return true;\n}\n\n/**\n * Apply a three-state {@link MetadataPatch} to the document's Info dict\n * in place. `undefined` leaves a field, `null` clears it, a value sets\n * it (dates are formatted to PDF date syntax). Custom keys are set/cleared\n * per-key; reserved or malformed keys are skipped.\n *\n * Throws {@link EngineError} `Unknown` if any native write fails, so the\n * caller never reports a partially-applied edit as success.\n */\nexport function applyMetadataPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n patch: MetadataPatch,\n): void {\n const fail = (what: string): never => {\n throw new EngineError(EngineErrorCode.Unknown, `failed to write metadata ${what}`);\n };\n\n for (const [field, key] of STRING_FIELDS) {\n const value = patch[field] as string | null | undefined;\n if (value === undefined) continue;\n if (!writeMetaText(fn, mem, docPtr, key, value)) fail(key);\n }\n\n if (patch.created !== undefined) {\n const value = patch.created === null ? null : formatPdfDate(new Date(patch.created));\n if (!writeMetaText(fn, mem, docPtr, 'CreationDate', value)) fail('CreationDate');\n }\n if (patch.modified !== undefined) {\n const value = patch.modified === null ? null : formatPdfDate(new Date(patch.modified));\n if (!writeMetaText(fn, mem, docPtr, 'ModDate', value)) fail('ModDate');\n }\n\n if (patch.trapped !== undefined) {\n if (!writeMetaTrapped(fn, docPtr, patch.trapped)) fail('Trapped');\n }\n\n if (patch.custom !== undefined) {\n for (const [key, value] of Object.entries(patch.custom)) {\n if (!isValidCustomKey(key)) continue;\n if (!writeMetaText(fn, mem, docPtr, key, value)) fail(key);\n }\n }\n}\n","import type { MetadataPatch, MetadataUpdateResult } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { applyMetadataPatch } from './internal/write/applyMetadataPatch';\nimport { MetadataReader } from './MetadataReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Synchronous orchestrator for document metadata writes. Lives next to\n * `MetadataReader` (one orchestrator per feature) so both worker hosts\n * (browser Web Worker and Node `worker_thread`) share the same code path.\n *\n * A metadata write rewrites the document Info dictionary in place. Like\n * `PagesMutator.move`, it is a structural layer edit: it returns the\n * re-read metadata and a `null` cache (the worker never fills cloud\n * coherence pins — the server does, after persisting the artifact and\n * bumping `metadataVersion`).\n */\nexport class MetadataMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n update(patch: MetadataPatch, signal: AbortSignal): MetadataUpdateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n applyMetadataPatch(fn, mem, docPtr, patch);\n throwIfAborted(signal);\n\n // Re-read the canonical metadata off the mutated session via the\n // shared reader (identical output local + cloud). `cache` is null —\n // local engines have no manifest/CDN.\n const metadata = new MetadataReader(this.runtime, this.session).read(signal);\n return { metadata, cache: null };\n }\n}\n","import type { PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\n/** `FS_RECTF { float left, top, right, bottom }` → 16 bytes. */\nexport const RECTF_BYTES = 16;\n/** `FS_SIZEF { float width, height }` → 8 bytes. */\nexport const SIZEF_BYTES = 8;\n/** A single 32-bit float (e.g. a user-unit out-parameter). */\nexport const F32_BYTES = 4;\n/** A single 32-bit int (e.g. a color channel out-parameter). */\nexport const I32_BYTES = 4;\n/** `FS_QUADPOINTSF` — 8 floats → 32 bytes. */\nexport const QUADPOINTSF_BYTES = 32;\n/** `FS_POINTF { float x, y }` → 8 bytes. */\nexport const POINTF_BYTES = 8;\n\n/** Generated from `EPDF_CHAR_GEOMETRY`; pinned by native static_asserts. */\nexport const EPDF_CHAR_GEOMETRY_LAYOUT = {\n bytes: 124,\n offsets: {\n looseBox: 0,\n tightBox: 16,\n looseQuad: 32,\n tightQuad: 64,\n matrix: 96,\n flags: 120,\n },\n flags: {\n hasTightBox: 1 << 0,\n hasLooseQuad: 1 << 1,\n hasTightQuad: 1 << 2,\n upright: 1 << 3,\n space: 1 << 4,\n empty: 1 << 5,\n synthesized: 1 << 6,\n },\n} as const;\n\nexport interface RectF {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport interface SizeF {\n width: number;\n height: number;\n}\n\n/** Decode an `FS_RECTF` struct that a native call wrote into `ptr`. */\nexport function readRectF(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset = 0): RectF {\n return {\n left: readF32(mem, ptr, byteOffset),\n top: readF32(mem, ptr, byteOffset + 4),\n right: readF32(mem, ptr, byteOffset + 8),\n bottom: readF32(mem, ptr, byteOffset + 12),\n };\n}\n\n/** Decode an `FS_SIZEF` struct that a native call wrote into `ptr`. */\nexport function readSizeF(mem: PdfRuntimeMemory, ptr: Ptr): SizeF {\n return {\n width: readF32(mem, ptr, 0),\n height: readF32(mem, ptr, 4),\n };\n}\n\n/** Read a single 32-bit float at `byteOffset` within `ptr`. */\nexport function readF32(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset = 0): number {\n return Number(mem.peek(ptr, 'f32', byteOffset));\n}\n\n/** Read a single 32-bit int at `byteOffset` within `ptr`. */\nexport function readI32(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset = 0): number {\n return Number(mem.peek(ptr, 'i32', byteOffset));\n}\n","import type { PdfDestination } from '@embedpdf/engine-core/runtime';\n\n/**\n * `PDFDEST_VIEW_*` fit-type codes (public/fpdf_doc.h) — the shared\n * vocabulary of `FPDFDest_GetView` (read) and `EPDFDest_CreateView`\n * (write). XYZ is listed for completeness but never goes through\n * CreateView (it has its own null-aware constructor).\n */\nexport const DEST_VIEW = {\n unknown: 0,\n xyz: 1,\n fit: 2,\n fitH: 3,\n fitV: 4,\n fitR: 5,\n fitB: 6,\n fitBH: 7,\n fitBV: 8,\n} as const;\n\ntype NonXyzKind = Exclude<PdfDestination['kind'], 'xyz'>;\n\n/** Wire destination kind → PDFDEST_VIEW code, for the non-XYZ kinds. */\nexport const VIEW_CODE_BY_KIND: Record<NonXyzKind, number> = {\n fit: DEST_VIEW.fit,\n fitH: DEST_VIEW.fitH,\n fitV: DEST_VIEW.fitV,\n fitR: DEST_VIEW.fitR,\n fitB: DEST_VIEW.fitB,\n fitBH: DEST_VIEW.fitBH,\n fitBV: DEST_VIEW.fitBV,\n};\n","import type { PdfDestination } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { F32_BYTES, I32_BYTES, readF32, readI32 } from '../../runtime/memory/structs';\nimport { DEST_VIEW } from './destinationViewCodes';\n\nconst MAX_VIEW_PARAMS = 4; // /FitR carries the most: left, bottom, right, top\n\n/**\n * Materialise one explicit `PdfDestination` from a live `destPtr`. PDFium\n * already resolved named destinations before handing us the pointer, so\n * only explicit arrays arrive here (the rule `PdfDestination` documents).\n *\n * Returns `null` when the destination is unreadable: no visible indirect page\n * in the document, or an unknown fit type. Coordinates stay raw PDF user\n * space — no conversion at this layer.\n *\n * Shared by the link reader, `goto` action-node payloads, and the document\n * `openDestination`; the outline/bookmark port reuses it too.\n */\nexport function readDestination(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n destPtr: Ptr,\n): PdfDestination | null {\n const pageObjectNumber = fn.EPDFDest_GetPageObjectNumber(docPtr, destPtr);\n if (pageObjectNumber === 0) return null;\n\n const view = withScratchN(\n mem,\n [I32_BYTES, MAX_VIEW_PARAMS * F32_BYTES],\n ([countPtr, paramsPtr]) => {\n const code = fn.FPDFDest_GetView(destPtr, countPtr, paramsPtr);\n const count = Math.min(readI32(mem, countPtr), MAX_VIEW_PARAMS);\n const params: number[] = [];\n for (let i = 0; i < count; i++) params.push(readF32(mem, paramsPtr, i * F32_BYTES));\n return { code, params };\n },\n );\n const at = (i: number): number | null => (i < view.params.length ? view.params[i]! : null);\n\n switch (view.code) {\n case DEST_VIEW.xyz:\n return { kind: 'xyz', pageObjectNumber, ...readXyzLocation(fn, mem, destPtr) };\n case DEST_VIEW.fit:\n return { kind: 'fit', pageObjectNumber };\n case DEST_VIEW.fitH:\n return { kind: 'fitH', pageObjectNumber, top: at(0) };\n case DEST_VIEW.fitV:\n return { kind: 'fitV', pageObjectNumber, left: at(0) };\n case DEST_VIEW.fitR: {\n // /FitR is only meaningful with the full rect; a malformed one\n // degrades to the whole page rather than inventing coordinates.\n if (view.params.length < 4) return { kind: 'fit', pageObjectNumber };\n return {\n kind: 'fitR',\n pageObjectNumber,\n left: view.params[0]!,\n bottom: view.params[1]!,\n right: view.params[2]!,\n top: view.params[3]!,\n };\n }\n case DEST_VIEW.fitB:\n return { kind: 'fitB', pageObjectNumber };\n case DEST_VIEW.fitBH:\n return { kind: 'fitBH', pageObjectNumber, top: at(0) };\n case DEST_VIEW.fitBV:\n return { kind: 'fitBV', pageObjectNumber, left: at(0) };\n default:\n return null;\n }\n}\n\n/** `/XYZ` null-aware axes via `FPDFDest_GetLocationInPage` (FPDF_BOOL is 4 bytes). */\nfunction readXyzLocation(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n destPtr: Ptr,\n): { left: number | null; top: number | null; zoom: number | null } {\n return withScratchN(\n mem,\n [I32_BYTES, I32_BYTES, I32_BYTES, F32_BYTES, F32_BYTES, F32_BYTES],\n ([hasLeft, hasTop, hasZoom, left, top, zoom]) => {\n if (!fn.FPDFDest_GetLocationInPage(destPtr, hasLeft, hasTop, hasZoom, left, top, zoom)) {\n // Unreadable location: every axis \"retains current\" — still a valid /XYZ.\n return { left: null, top: null, zoom: null };\n }\n return {\n left: readI32(mem, hasLeft) ? readF32(mem, left) : null,\n top: readI32(mem, hasTop) ? readF32(mem, top) : null,\n zoom: readI32(mem, hasZoom) ? readF32(mem, zoom) : null,\n };\n },\n );\n}\n","import type {\n ActionReadBudget,\n PdfActionNode,\n PdfActionTargetRef,\n PdfActionTree,\n PdfActionType,\n PdfActionWarning,\n} from '@embedpdf/engine-core/runtime';\nimport {\n decodeSubmitFormFlags,\n EngineError,\n EngineErrorCode,\n} from '@embedpdf/engine-core/runtime';\nimport {\n NULL_PTR,\n type PdfFunctions,\n type PdfRuntimeMemory,\n type Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport { readUtf8String, readUtf16String } from '../../runtime/memory/strings';\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { I32_BYTES, readI32 } from '../../runtime/memory/structs';\nimport { readDestination } from '../destinations/readDestination';\n\nconst DEFAULT_ACTION_READ_BUDGET: ActionReadBudget = {\n maxModels: 512,\n maxNodes: 16_384,\n maxScriptCodeUnits: 16_000_000,\n maxTargetEntries: 4_096,\n maxPayloadCodeUnits: 262_144,\n};\n\nconst ACTION_TYPE_BY_CODE: Record<number, PdfActionType> = {\n 0: 'unknown',\n 1: 'goto',\n 2: 'goto-remote',\n 3: 'goto-embedded',\n 4: 'launch',\n 5: 'thread',\n 6: 'uri',\n 7: 'sound',\n 8: 'movie',\n 9: 'hide',\n 10: 'named',\n 11: 'submit-form',\n 12: 'reset-form',\n 13: 'import-data',\n 14: 'javascript',\n 15: 'set-ocg-state',\n 16: 'rendition',\n 17: 'transition',\n 18: 'goto-3d-view',\n};\n\nconst WARNING_CYCLE_DROPPED = 0x1;\nconst WARNING_MALFORMED_NEXT = 0x2;\nconst WARNING_INCOMPLETE = 0x4;\nconst INVALID_NODE_U32 = 0xffff_ffff;\n\n/** `EPDF_ANNOT_ACTION_ACTIVATE` — the `/A` slot of the per-annotation event\n * table (the same table `readAnnotationBase` walks). */\nexport const ANNOT_ACTION_ACTIVATE = 0;\n\n/** Decode one `EPDF_ACTION_TYPE_*` code — the shared vocabulary consumers\n * use so action-shaped surfaces cannot drift. */\nexport function actionTypeFromCode(code: number): PdfActionType {\n return ACTION_TYPE_BY_CODE[code] ?? 'unknown';\n}\n\n/** Is this `EPDFAction_GetRootNode`/`GetNextAt` result a real node id?\n * (`EPDF_ACTION_NODE_INVALID` may surface as -1 or u32 max via cwrap.) */\nexport function isValidActionNodeId(raw: number): boolean {\n return raw !== -1 && raw >>> 0 !== INVALID_NODE_U32;\n}\n\n/** Mutable aggregate budget shared by every action model in one read job.\n * Payload budgets are RESERVED before the backing buffer is allocated. */\nexport class ActionReadBudgetTracker {\n private models = 0;\n private nodes = 0;\n private scriptCodeUnits = 0;\n private targetEntries = 0;\n private payloadCodeUnits = 0;\n\n constructor(private readonly limits: ActionReadBudget = DEFAULT_ACTION_READ_BUDGET) {}\n\n addModel(nodeCount: number): void {\n this.models += 1;\n this.nodes += nodeCount;\n this.assertWithinBudget();\n }\n\n addScript(script: string): void {\n this.scriptCodeUnits += script.length;\n this.assertWithinBudget();\n }\n\n /** Charge target entries BEFORE the target array is walked. */\n reserveTargets(count: number): void {\n this.targetEntries += count;\n this.assertWithinBudget();\n }\n\n /** Charge payload text BEFORE the scratch buffer for it is allocated. */\n reservePayloadBytes(length: number): void {\n this.payloadCodeUnits += length;\n this.assertWithinBudget();\n }\n\n private assertWithinBudget(): void {\n if (\n this.models > this.limits.maxModels ||\n this.nodes > this.limits.maxNodes ||\n this.scriptCodeUnits > this.limits.maxScriptCodeUnits ||\n this.targetEntries > this.limits.maxTargetEntries ||\n this.payloadCodeUnits > this.limits.maxPayloadCodeUnits\n ) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'aggregate PDF action read budget exceeded',\n {\n details: {\n models: this.models,\n nodes: this.nodes,\n scriptCodeUnits: this.scriptCodeUnits,\n targetEntries: this.targetEntries,\n payloadCodeUnits: this.payloadCodeUnits,\n limits: this.limits,\n },\n },\n );\n }\n }\n}\n\n/**\n * Convert and close one detached native action model. This is the only\n * native-model walker used by document, page, field, and annotation reads.\n *\n * `docPtr` resolves `goto` destinations (page identity + named-destination\n * lookup); every caller reads within an open document session.\n *\n * Payload rule: a node whose payload cannot be materialised (a goto without\n * a resolvable destination, a javascript node with no `/JS`, a withheld\n * target list) degrades to `{ type: 'unknown' }` with its original `/S` on\n * `subtype`, and the tree gains the `'payload-dropped'` warning — impossible\n * states stay unrepresentable while malformed documents stay readable.\n */\nexport function readActionModel(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n modelPtr: Ptr,\n budget: ActionReadBudgetTracker,\n): PdfActionTree | null {\n if (modelPtr === NULL_PTR) return null;\n try {\n const nodeCount = fn.EPDFAction_GetNodeCount(modelPtr);\n if (!Number.isInteger(nodeCount) || nodeCount < 0) {\n throw malformedActionModel('invalid node count', { nodeCount });\n }\n budget.addModel(nodeCount);\n\n const warningFlags = fn.EPDFAction_GetWarningFlags(modelPtr) >>> 0;\n const incomplete = !fn.EPDFAction_IsComplete(modelPtr);\n const rootId = normalizeOptionalNodeId(fn.EPDFAction_GetRootNode(modelPtr), nodeCount);\n const visiting = new Set<number>();\n let payloadDropped = false;\n\n /** Probe the two-call length first and charge the budget BEFORE the\n * scratch buffer for the value is allocated. */\n const readPayloadString = (call: (buf: Ptr, capacity: number) => number): string | null => {\n const length = call(NULL_PTR, 0);\n if (length <= 0) return null;\n budget.reservePayloadBytes(length);\n return readUtf8String(mem, call);\n };\n\n const readOutBool = (read: (outPtr: Ptr) => boolean | number): boolean | null =>\n withScratchN(mem, [I32_BYTES], ([outPtr]) =>\n read(outPtr) ? readI32(mem, outPtr) !== 0 : null,\n );\n\n const readTargetObjectNumber = (nodeId: number, index: number): number | null =>\n withScratchN(mem, [I32_BYTES], ([outPtr]) => {\n if (!fn.EPDFAction_GetNodeTargetObjectNumber(modelPtr, nodeId, index, outPtr)) {\n return null;\n }\n const value = readI32(mem, outPtr) >>> 0;\n return value === 0 ? null : value;\n });\n\n const readTargets = (nodeId: number, count: number): PdfActionTargetRef[] | null => {\n const targets: PdfActionTargetRef[] = [];\n for (let index = 0; index < count; index++) {\n const name = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeTargetName(modelPtr, nodeId, index, buf, capacity),\n );\n if (name !== null) {\n targets.push({ kind: 'name', name });\n continue;\n }\n const objectNumber = readTargetObjectNumber(nodeId, index);\n if (objectNumber === null) return null; // neither form: unreadable list\n targets.push({ kind: 'objectNumber', objectNumber });\n }\n return targets;\n };\n\n const readResetFormState = (\n nodeId: number,\n ): { hasFields: boolean; exclude: boolean } | null =>\n withScratchN(mem, [I32_BYTES, I32_BYTES], ([hasFieldsPtr, excludePtr]) => {\n if (!fn.EPDFAction_GetNodeResetForm(modelPtr, nodeId, hasFieldsPtr, excludePtr)) {\n return null;\n }\n return {\n hasFields: readI32(mem, hasFieldsPtr) !== 0,\n exclude: readI32(mem, excludePtr) !== 0,\n };\n });\n\n const readSubmitFormState = (nodeId: number): { hasFields: boolean; flags: number } | null =>\n withScratchN(mem, [I32_BYTES, I32_BYTES], ([hasFieldsPtr, flagsPtr]) => {\n if (!fn.EPDFAction_GetNodeSubmitForm(modelPtr, nodeId, hasFieldsPtr, flagsPtr)) {\n return null;\n }\n return {\n hasFields: readI32(mem, hasFieldsPtr) !== 0,\n flags: readI32(mem, flagsPtr) >>> 0,\n };\n });\n\n const readNode = (nodeId: number): PdfActionNode => {\n if (visiting.has(nodeId)) {\n throw malformedActionModel('native action model contains a cycle', { nodeId });\n }\n visiting.add(nodeId);\n try {\n const type = actionTypeFromCode(fn.EPDFAction_GetNodeType(modelPtr, nodeId));\n const subtype =\n readUtf8String(mem, (buf, capacity) =>\n fn.EPDFAction_GetNodeSubtype(modelPtr, nodeId, buf, capacity),\n ) ?? '';\n\n const nextCount = fn.EPDFAction_GetNextCount(modelPtr, nodeId);\n if (!Number.isInteger(nextCount) || nextCount < 0) {\n throw malformedActionModel('invalid action child count', { nodeId, nextCount });\n }\n const next: PdfActionNode[] = [];\n for (let index = 0; index < nextCount; index++) {\n const childId = normalizeNodeId(\n fn.EPDFAction_GetNextAt(modelPtr, nodeId, index),\n nodeCount,\n );\n next.push(readNode(childId));\n }\n\n const degraded = (): PdfActionNode => {\n payloadDropped = true;\n return { type: 'unknown', subtype, next };\n };\n\n switch (type) {\n case 'javascript': {\n if (!fn.EPDFAction_NodeHasJavaScript(modelPtr, nodeId)) return degraded();\n const script =\n readUtf16String(mem, (buf, capacity) =>\n fn.EPDFAction_GetNodeJavaScript(modelPtr, nodeId, buf, capacity),\n ) ?? '';\n budget.addScript(script);\n return { type, subtype, script, next };\n }\n case 'rendition': {\n if (!fn.EPDFAction_NodeHasJavaScript(modelPtr, nodeId)) {\n return { type, subtype, next };\n }\n const script =\n readUtf16String(mem, (buf, capacity) =>\n fn.EPDFAction_GetNodeJavaScript(modelPtr, nodeId, buf, capacity),\n ) ?? '';\n budget.addScript(script);\n return { type, subtype, script, next };\n }\n case 'goto': {\n const destPtr = fn.EPDFAction_GetNodeDest(docPtr, modelPtr, nodeId);\n const destination =\n destPtr !== NULL_PTR ? readDestination(fn, mem, docPtr, destPtr) : null;\n return destination ? { type, subtype, destination, next } : degraded();\n }\n case 'uri': {\n const uri = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeURI(docPtr, modelPtr, nodeId, buf, capacity),\n );\n if (uri === null) return degraded();\n const isMap =\n readOutBool((outPtr) => fn.EPDFAction_GetNodeURIIsMap(modelPtr, nodeId, outPtr)) ??\n false;\n return { type, subtype, uri, isMap, next };\n }\n case 'named': {\n const name = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeName(modelPtr, nodeId, buf, capacity),\n );\n return name === null ? degraded() : { type, subtype, name, next };\n }\n case 'hide': {\n const count = fn.EPDFAction_GetNodeTargetCount(modelPtr, nodeId);\n if (!Number.isInteger(count) || count < 0) return degraded();\n budget.reserveTargets(count);\n const targets = readTargets(nodeId, count);\n if (targets === null) return degraded();\n const hide =\n readOutBool((outPtr) => fn.EPDFAction_GetNodeHideFlag(modelPtr, nodeId, outPtr)) ??\n true;\n return { type, subtype, targets, hide, next };\n }\n case 'reset-form': {\n const state = readResetFormState(nodeId);\n const count = fn.EPDFAction_GetNodeTargetCount(modelPtr, nodeId);\n if (state === null || !Number.isInteger(count) || count < 0) return degraded();\n budget.reserveTargets(count);\n const fields = state.hasFields ? readTargets(nodeId, count) : null;\n if (state.hasFields && fields === null) return degraded();\n return { type, subtype, fields, exclude: state.exclude, next };\n }\n case 'submit-form': {\n // Feature-detect: an older runtime payload (pin lag) exposes no\n // submit getters — the node stays payload-less recognized-inert,\n // the pre-payload behavior, NOT a degraded unknown.\n if (typeof fn.EPDFAction_GetNodeSubmitForm !== 'function') {\n return { type, subtype, next };\n }\n const state = readSubmitFormState(nodeId);\n // The getter refuses when the REQUIRED /F did not resolve to a\n // URL: the native side withheld the payload — the atomic rule\n // degrades the whole node, never a half payload.\n if (state === null) return degraded();\n const url = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeSubmitFormURL(modelPtr, nodeId, buf, capacity),\n );\n if (url === null) return degraded();\n const count = fn.EPDFAction_GetNodeTargetCount(modelPtr, nodeId);\n if (!Number.isInteger(count) || count < 0) return degraded();\n budget.reserveTargets(count);\n const fields = state.hasFields ? readTargets(nodeId, count) : null;\n if (state.hasFields && fields === null) return degraded();\n const charSet = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeSubmitFormCharSet(modelPtr, nodeId, buf, capacity),\n );\n return {\n type,\n subtype,\n payload: {\n url,\n fields,\n flags: decodeSubmitFormFlags(state.flags),\n ...(charSet === null ? {} : { charSet }),\n },\n next,\n };\n }\n case 'goto-remote':\n case 'goto-embedded':\n case 'launch': {\n const filePath = readPayloadString((buf, capacity) =>\n fn.EPDFAction_GetNodeFilePath(modelPtr, nodeId, buf, capacity),\n );\n return filePath === null ? degraded() : { type, subtype, filePath, next };\n }\n default:\n return { type, subtype, next };\n }\n } finally {\n visiting.delete(nodeId);\n }\n };\n\n const root = rootId === null ? null : readNode(rootId);\n const warnings = warningsFromFlags(warningFlags, incomplete);\n if (payloadDropped) warnings.push('payload-dropped');\n return { root, incomplete, warningFlags, warnings };\n } finally {\n fn.EPDFAction_CloseModel(modelPtr);\n }\n}\n\nfunction normalizeOptionalNodeId(raw: number, nodeCount: number): number | null {\n const invalid = raw === -1 || raw === INVALID_NODE_U32 || raw >>> 0 === INVALID_NODE_U32;\n return invalid ? null : normalizeNodeId(raw, nodeCount);\n}\n\nfunction normalizeNodeId(raw: number, nodeCount: number): number {\n if (!Number.isInteger(raw) || raw < 0 || raw >= nodeCount) {\n throw malformedActionModel('native action model returned an invalid node id', {\n raw,\n nodeCount,\n });\n }\n return raw;\n}\n\nfunction warningsFromFlags(flags: number, incomplete: boolean): PdfActionWarning[] {\n const warnings: PdfActionWarning[] = [];\n if ((flags & WARNING_CYCLE_DROPPED) !== 0) warnings.push('cycle-dropped');\n if ((flags & WARNING_MALFORMED_NEXT) !== 0) warnings.push('malformed-next');\n if ((flags & WARNING_INCOMPLETE) !== 0 || incomplete) warnings.push('incomplete');\n return warnings;\n}\n\nfunction malformedActionModel(message: string, details: Record<string, unknown>): EngineError {\n return new EngineError(EngineErrorCode.MalformedPdf, message, { details });\n}\n","import type {\n NamedPageEntry,\n PageBoxes,\n PageLayout,\n PageListSnapshot,\n PdfRect,\n PdfPageActions,\n} from '@embedpdf/engine-core/runtime';\nimport { normalizePdfRect } from '@embedpdf/engine-core/runtime';\nimport type {\n PdfFunctions,\n PdfRuntimeMemory,\n PdfRuntimeModule,\n Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { readUtf16String } from '../../runtime/memory/strings';\nimport {\n F32_BYTES,\n RECTF_BYTES,\n SIZEF_BYTES,\n readF32,\n readRectF,\n readSizeF,\n} from '../../runtime/memory/structs';\nimport { throwIfAborted } from '../../shared/abort';\nimport { ActionReadBudgetTracker, readActionModel } from '../actions/ActionModelReader';\n\n// EPDF_PAGE_BOX_TYPE (public/fpdfview.h).\nconst BOX_MEDIA = 0;\nconst BOX_CROP = 1;\nconst BOX_BLEED = 2;\nconst BOX_TRIM = 3;\nconst BOX_ART = 4;\n\n/**\n * Runtime-agnostic page geometry reader. Produces the `pages.list()`\n * snapshot from the lightweight `...ByIndex` PDFium bindings, none of which\n * load or parse a page (no `pagePtr`), so listing stays cheap. Shared\n * verbatim by the local WASM worker and the server native worker, so a\n * given PDF yields an identical `PageListSnapshot` on both engines.\n */\nexport class PagesReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(signal: AbortSignal): PageListSnapshot {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const records = this.session.allRecords();\n const actionBudget = new ActionReadBudgetTracker();\n\n // One scratch buffer per struct kind, reused across every page.\n return withScratchN(\n mem,\n [RECTF_BYTES, SIZEF_BYTES, F32_BYTES],\n ([rectPtr, sizePtr, userUnitPtr]) => {\n const pages: PageLayout[] = records.map((record) => {\n throwIfAborted(signal);\n const index = record.pageIndex;\n const actions = readPageActions(fn, mem, docPtr, record.pageObjectNumber, actionBudget);\n return {\n index,\n pageObjectNumber: record.pageObjectNumber,\n label: readLabel(fn, mem, docPtr, index),\n size: readSize(fn, mem, docPtr, index, sizePtr),\n rotation: readRotation(fn, docPtr, index),\n userUnit: readUserUnit(fn, mem, docPtr, index, userUnitPtr),\n boxes: readBoxes(fn, mem, docPtr, index, rectPtr),\n ...(actions ? { actions } : {}),\n };\n });\n return { pageCount: pages.length, pages, namedPages: readNamedPages(fn, mem, docPtr) };\n },\n );\n }\n}\n\nfunction readPageActions(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n pageObjectNumber: number,\n budget: ActionReadBudgetTracker,\n): PdfPageActions | undefined {\n const actions: PdfPageActions = {};\n const open = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetPageActionModel(docPtr, pageObjectNumber, 0),\n budget,\n );\n const close = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetPageActionModel(docPtr, pageObjectNumber, 1),\n budget,\n );\n if (open) actions.open = open;\n if (close) actions.close = close;\n return open || close ? actions : undefined;\n}\n\n/**\n * Read one FS_RECTF box and canonicalize to a y-up `PdfRect`\n * (`{ left, bottom, right, top }`, equivalent to `[llx, lly, urx, ury]`) so\n * the lower-left/upper-right invariant holds regardless of how the PDF\n * ordered the corners. Returns null when the optional box is absent.\n */\nfunction readBox(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n boxType: number,\n rectPtr: Ptr,\n): PdfRect | null {\n if (!fn.EPDF_GetPageBoxByIndex(docPtr, index, boxType, rectPtr)) return null;\n // FS_RECTF → y-up `PdfRect`, normalized so the lower-left/upper-right invariant\n // holds regardless of how the PDF ordered the corners.\n return normalizePdfRect(readRectF(mem, rectPtr));\n}\n\nfunction readBoxes(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n rectPtr: Ptr,\n): PageBoxes {\n // MediaBox always resolves (page-tree inheritance + PDFium default).\n // CropBox falls back to MediaBox, so both are guaranteed present.\n const media = readBox(fn, mem, docPtr, index, BOX_MEDIA, rectPtr) ?? {\n left: 0,\n bottom: 0,\n right: 0,\n top: 0,\n };\n const crop = readBox(fn, mem, docPtr, index, BOX_CROP, rectPtr) ?? media;\n const bleed = readBox(fn, mem, docPtr, index, BOX_BLEED, rectPtr);\n const trim = readBox(fn, mem, docPtr, index, BOX_TRIM, rectPtr);\n const art = readBox(fn, mem, docPtr, index, BOX_ART, rectPtr);\n return {\n media,\n crop,\n ...(bleed ? { bleed } : {}),\n ...(trim ? { trim } : {}),\n ...(art ? { art } : {}),\n };\n}\n\nfunction readSize(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n sizePtr: Ptr,\n): { width: number; height: number } {\n if (!fn.EPDF_GetPageSizeByIndexNormalized(docPtr, index, sizePtr)) {\n return { width: 0, height: 0 };\n }\n return readSizeF(mem, sizePtr);\n}\n\nfunction readRotation(fn: PdfFunctions, docPtr: Ptr, index: number): 0 | 90 | 180 | 270 {\n // Returns quarter-turns (0..3), or -1 on error.\n const quarterTurns = fn.EPDF_GetPageRotationByIndex(docPtr, index);\n switch (quarterTurns) {\n case 1:\n return 90;\n case 2:\n return 180;\n case 3:\n return 270;\n default:\n return 0;\n }\n}\n\nfunction readUserUnit(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n userUnitPtr: Ptr,\n): number {\n if (!fn.EPDF_GetPageUserUnitByIndex(docPtr, index, userUnitPtr)) return 1;\n const value = readF32(mem, userUnitPtr, 0);\n return Number.isFinite(value) && value > 0 ? value : 1;\n}\n\nfunction readLabel(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n): string | null {\n // A page label of '' is indistinguishable from \"absent\" for our DTO, so\n // empty reads as null (`emptyAs: null`); the trailing `|| null` also maps\n // a decoded-but-empty buffer to null.\n return (\n readUtf16String(\n mem,\n (buf, capacity) => fn.FPDF_GetPageLabel(docPtr, index, buf, capacity),\n null,\n ) || null\n );\n}\n\n// `EPDF_NAMED_PAGE_TREE_*` / `EPDF_NAMED_PAGE_KIND_*` from public/epdf_named_pages.h.\nconst NAMED_PAGE_TREES = [0, 1] as const; // Pages, Templates\nconst NAMED_PAGE_KIND_PAGE = 0;\nconst NAMED_PAGE_KIND_TEMPLATE = 1;\n\n/**\n * The catalog's `/Names /Pages` and `/Names /Templates` registrations, in\n * tree order, each value classified by the fork (page / template /\n * dangling). Page-identity data like `label`, so it ships inside the same\n * snapshot — a registration is only meaningful against the page set that\n * contains its target.\n */\nfunction readNamedPages(fn: PdfFunctions, mem: PdfRuntimeMemory, docPtr: Ptr): NamedPageEntry[] {\n const entries: NamedPageEntry[] = [];\n withScratchN(mem, [4, 4], ([objNumPtr, kindPtr]) => {\n for (const tree of NAMED_PAGE_TREES) {\n const count = fn.EPDFDoc_GetNamedPageCount(docPtr, tree);\n for (let index = 0; index < count; index++) {\n const name = readUtf16String(\n mem,\n (buf, capacity) =>\n fn.EPDFDoc_GetNamedPageAt(docPtr, tree, index, buf, capacity, objNumPtr, kindPtr),\n '',\n );\n if (name === null) continue;\n const objectNumber = Number(mem.peek(objNumPtr, 'i32')) >>> 0;\n const kind = Number(mem.peek(kindPtr, 'i32'));\n entries.push({\n name,\n target:\n kind === NAMED_PAGE_KIND_PAGE\n ? { kind: 'page', pageObjectNumber: objectNumber }\n : kind === NAMED_PAGE_KIND_TEMPLATE\n ? { kind: 'template', objectNumber }\n : { kind: 'dangling' },\n });\n }\n }\n });\n return entries;\n}\n","import {\n EngineError,\n EngineErrorCode,\n type PageDeleteResult,\n type PageMoveResult,\n type PageNameInput,\n type PageNameResult,\n type PageObjectNumber,\n type PageRemoveNameInput,\n type PageRotateResult,\n type PageRotation,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { PagesReader } from './PagesReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { writeUtf16String } from '../../runtime/memory/strings';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Synchronous orchestrator for page-level reads and reorder mutations.\n * Lives next to `AnnotationMutator` (one orchestrator per\n * mutation domain) so both worker hosts (browser Web Worker and Node\n * `worker_thread`) share the same code path.\n *\n * Architectural anchor — locked with the user, do not loosen without\n * re-reading the doc comments on `PageMoveResult` and `RevisionAuthority`:\n *\n * - Pages are addressed by their durable `pageObjectNumber`. There is\n * no \"weak page ref\" model in the engine; therefore there is no\n * document-level revision token, no `DocumentRevisionStore`, and no\n * \"doc-level shouldRefetch\" semantic. Anything that *is* listed\n * here must remain stable across every reorder permutation.\n *\n * - Per-page `RevisionToken`s do NOT bump on `move()`. The /Annots\n * array of each affected page is untouched (PDFium just rewrites\n * pointer entries in the doc-level pages tree), so weak\n * `AnnotationRef.kind === 'index'` references the caller is\n * holding remain valid across a page reorder. This is the right\n * semantic for an editing UI: shuffling pages must NOT silently\n * break a pending highlight edit.\n *\n * - Identity strengthening (the opportunistic `/NM` stamping that\n * applies to weak annotations on `update()` / `move()`) is also\n * intentionally absent here. Pages are durable by construction;\n * there is nothing to upgrade.\n */\nexport class PagesMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * Reorder pages. Mirrors `FPDF_MovePages`: detach the supplied pages,\n * then re-insert them as a contiguous block at `destIndex` in the\n * post-removal index space, preserving caller order.\n *\n * Atomicity:\n * - `FPDF_MovePages` rejects atomically: if it returns false, no\n * change has happened. We surface that as `InvalidArg`.\n * - On success we refresh the per-session page registry and read the\n * new layout back, which is what the result returns.\n *\n * Validation done up front (the helper repeats these checks; we do\n * them here for clean error messages):\n * - non-empty inputs;\n * - duplicate `pageObjectNumber`s rejected;\n * - every `pon` resolvable via the session's page registry;\n * - `destIndex` in `[0, pageCount - len]`.\n */\n move(\n pageObjectNumbers: PageObjectNumber[],\n destIndex: number,\n signal: AbortSignal,\n ): PageMoveResult {\n throwIfAborted(signal);\n this.requireUniquePons('pages.move', pageObjectNumbers);\n if (destIndex < 0 || !Number.isInteger(destIndex)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.move destIndex must be a non-negative integer (got ${destIndex})`,\n );\n }\n\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const totalPages = fn.FPDF_GetPageCount(docPtr);\n const postRemoval = totalPages - pageObjectNumbers.length;\n if (destIndex > postRemoval) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.move destIndex ${destIndex} out of range; post-removal page count is ${postRemoval}`,\n );\n }\n\n // Resolve every pon to its current pageIndex via the session\n // registry. Bad pons throw `NotFound` from the session, which is\n // exactly what we want — the caller asked to move a page that does\n // not exist.\n const fromIndices = pageObjectNumbers.map((pon) => {\n throwIfAborted(signal);\n return this.session.recordByObjectNumber(pon).pageIndex;\n });\n\n // Marshal int[] and call the helper.\n const arrPtr = mem.alloc(4 * fromIndices.length);\n let ok: boolean;\n try {\n for (let i = 0; i < fromIndices.length; i++) {\n mem.poke(arrPtr, 'i32', fromIndices[i], 4 * i);\n }\n ok = fn.FPDF_MovePages(docPtr, arrPtr, fromIndices.length, destIndex);\n } finally {\n mem.free(arrPtr);\n }\n\n if (!ok) {\n // FPDF_MovePages validates atomically: a `false` return means no\n // change happened. Most likely cause is a contiguous-block\n // overlap our up-front checks did not catch — surface it cleanly.\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `FPDF_MovePages rejected the request (destIndex=${destIndex}, fromIndices=[${fromIndices.join(\n ',',\n )}])`,\n );\n }\n\n // Page positions changed; rebuild the index<->pon map. Per-page\n // revisions and weak-flag bookkeeping survive — both keyed by pon,\n // both untouched by the reorder.\n this.session.refreshPageRegistry();\n\n // A move returns geometry, not liveness: read the new layout off the\n // reordered session via the shared reader (identical output local +\n // cloud). `cache` is null — local engines have no manifest/CDN.\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /**\n * Set the ABSOLUTE display rotation of the supplied pages. Rotation is\n * presentation metadata over normalized content (pages always load with\n * rotation forced to 0 — see `PagePtrPool`), so:\n * - no cached render, text run, or geometry coordinate changes;\n * - per-page `RevisionToken`s do NOT bump;\n * - page identity and order are untouched — no registry refresh.\n *\n * Atomicity: every PON is resolved up front (`NotFound` on caller error),\n * so the apply loop below operates on validated pages only and each write\n * is absolute + idempotent — a retry after an unexpected mid-loop engine\n * fault converges to the requested state. Abort is honored BEFORE the\n * loop, never inside it.\n */\n rotate(\n pageObjectNumbers: PageObjectNumber[],\n rotation: PageRotation,\n signal: AbortSignal,\n ): PageRotateResult {\n throwIfAborted(signal);\n this.requireUniquePons('pages.rotate', pageObjectNumbers);\n if (rotation !== 0 && rotation !== 90 && rotation !== 180 && rotation !== 270) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.rotate rotation must be 0, 90, 180 or 270 (got ${rotation})`,\n );\n }\n\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n for (const pon of pageObjectNumbers) {\n this.session.recordByObjectNumber(pon); // NotFound on unknown pon\n }\n\n // The EPDF helper takes quarter-turns (0..3); the wire speaks degrees.\n const quarterTurns = rotation / 90;\n for (const pon of pageObjectNumbers) {\n if (!fn.EPDFDoc_SetPageRotationByObjectNumber(docPtr, pon, quarterTurns)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFDoc_SetPageRotationByObjectNumber rejected page ${pon} after validation`,\n );\n }\n }\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /**\n * Delete pages. Deleted object numbers are RETIRED — the engine nulls the\n * page object rather than freeing the number — so per-page state keyed by\n * PON can never silently attach to an unrelated future page; we still drop\n * the session's revision/weak entries as hygiene. Surviving pages keep\n * their identity and `RevisionToken`s.\n *\n * Guards:\n * - a document must keep at least one page (`InvalidArg`);\n * - every PON must resolve (`NotFound`);\n * - no target page may have a live pooled `pagePtr`. Thread confinement\n * means no other job can be mid-flight, so a held ptr here is a leaked\n * `acquire` — an internal bug we surface loudly instead of deleting\n * under a live handle.\n *\n * Abort is honored BEFORE the apply loop, never inside it.\n */\n delete(pageObjectNumbers: PageObjectNumber[], signal: AbortSignal): PageDeleteResult {\n throwIfAborted(signal);\n this.requireUniquePons('pages.delete', pageObjectNumbers);\n\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const totalPages = fn.FPDF_GetPageCount(docPtr);\n if (pageObjectNumbers.length >= totalPages) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.delete would remove every page (${pageObjectNumbers.length} of ${totalPages}); a document must keep at least one`,\n );\n }\n\n const pool = this.session.pagePool();\n for (const pon of pageObjectNumbers) {\n this.session.recordByObjectNumber(pon); // NotFound on unknown pon\n if (pool.isHeld(pon)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `internal invariant violation: pagePtr for page ${pon} is still held during pages.delete`,\n );\n }\n }\n\n for (const pon of pageObjectNumbers) {\n if (!fn.EPDFDoc_DeletePageByObjectNumber(docPtr, pon)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFDoc_DeletePageByObjectNumber rejected page ${pon} after validation`,\n );\n }\n this.session.dropPageState(pon);\n }\n\n // Page count and order changed; rebuild the index<->pon map. Surviving\n // pages' revisions and weak-flag bookkeeping stay put (keyed by pon).\n this.session.refreshPageRegistry();\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /**\n * Register `name` → page in `/Names /Pages` (create, or replace what the\n * key points at); with `replace`, drop that other key first — a rename as\n * one job. Named pages are LAYOUT: page identity and order are untouched\n * (no registry refresh, no revision bumps) and the fresh snapshot is\n * returned like `move()`.\n */\n setName(input: PageNameInput, signal: AbortSignal): PageNameResult {\n throwIfAborted(signal);\n if (input.name.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.setName requires a non-empty name');\n }\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n this.session.recordByObjectNumber(input.pageObjectNumber); // NotFound on an unknown pon\n\n if (input.replace !== undefined && input.replace !== input.name && input.replace.length > 0) {\n writeUtf16String(mem, input.replace, (ptr) => fn.EPDFDoc_RemoveNamedPage(docPtr, ptr));\n }\n const ok = writeUtf16String(mem, input.name, (ptr) =>\n fn.EPDFDoc_SetNamedPage(docPtr, ptr, input.pageObjectNumber),\n );\n if (!ok) {\n // The fork refuses only what we already validated (empty key, a page\n // outside the tree) — reaching here means the catalog is unwritable.\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFDoc_SetNamedPage rejected '${input.name}' for page ${input.pageObjectNumber}`,\n );\n }\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /** Remove one `/Names /Pages` registration; the page stays. */\n removeName(input: PageRemoveNameInput, signal: AbortSignal): PageNameResult {\n throwIfAborted(signal);\n if (input.name.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'pages.removeName requires a non-empty name',\n );\n }\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const removed = writeUtf16String(mem, input.name, (ptr) =>\n fn.EPDFDoc_RemoveNamedPage(docPtr, ptr),\n );\n if (!removed) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `pages.removeName: no /Names /Pages registration '${input.name}'`,\n );\n }\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n return { layout, cache: null };\n }\n\n /** Shared input check: non-empty, no duplicate PONs. */\n private requireUniquePons(op: string, pageObjectNumbers: PageObjectNumber[]): void {\n if (pageObjectNumbers.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, `${op} requires at least one page`);\n }\n const seen = new Set<PageObjectNumber>();\n for (const pon of pageObjectNumbers) {\n if (seen.has(pon)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `${op} was given duplicate page object number ${pon}`,\n );\n }\n seen.add(pon);\n }\n }\n}\n","import { EngineError, EngineErrorCode, type PageObjectNumber } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\nconst FPDF_NO_INCREMENTAL = 1 << 1;\n\n/**\n * Export a subset of pages as a standalone PDF. A READ over the session:\n * `FPDF_ImportPagesByIndex` copies pages into a scratch document, so the\n * source is untouched — no revision bumps, no registry refresh, no layer\n * artifact. Lives next to `PagesReader`/`PagesMutator` (one file per page\n * verb family) so both worker hosts share the code path.\n */\nexport class PagesExtractor {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * Copy the given pages, in the supplied caller order, into a new\n * document and serialize it. Validation up front: non-empty, no\n * duplicates, every PON resolvable (`NotFound` from the session on a\n * bad one). The scratch document is always closed, success or throw.\n */\n extract(\n pageObjectNumbers: PageObjectNumber[],\n signal: AbortSignal,\n ): { bytes: ArrayBuffer; size: number } {\n throwIfAborted(signal);\n if (pageObjectNumbers.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.extract requires at least one page');\n }\n const seen = new Set<PageObjectNumber>();\n for (const pon of pageObjectNumbers) {\n if (seen.has(pon)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.extract was given duplicate page object number ${pon}`,\n );\n }\n seen.add(pon);\n }\n\n // Resolve every pon to its CURRENT index via the session registry —\n // NotFound on caller error, and caller order is preserved in the output.\n const indices = pageObjectNumbers.map(\n (pon) => this.session.recordByObjectNumber(pon).pageIndex,\n );\n\n const { fn, mem } = this.runtime;\n const srcPtr = this.session.requireDocPtr();\n\n const destPtr = fn.FPDF_CreateNewDocument();\n if (!destPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDF_CreateNewDocument failed');\n }\n const idxPtr = mem.alloc(4 * indices.length);\n const sizePtr = mem.alloc(4);\n let pdfPtr: Ptr | null = null;\n try {\n for (let i = 0; i < indices.length; i++) {\n mem.poke(idxPtr, 'i32', indices[i], 4 * i);\n }\n if (!fn.FPDF_ImportPagesByIndex(destPtr, srcPtr, idxPtr, indices.length, 0)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDF_ImportPagesByIndex rejected the request (indices=[${indices.join(',')}])`,\n );\n }\n\n mem.poke(sizePtr, 'i32', 0);\n pdfPtr = fn.EPDF_SaveDocumentToOwnedBuffer(destPtr, FPDF_NO_INCREMENTAL, sizePtr);\n const size = Number(mem.peek(sizePtr, 'i32'));\n if (!pdfPtr || size <= 0) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save extracted pages');\n }\n\n const bytes = mem.readBytes(pdfPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size };\n } finally {\n if (pdfPtr) fn.EPDF_FreeBuffer(pdfPtr);\n mem.free(sizePtr);\n mem.free(idxPtr);\n fn.FPDF_CloseDocument(destPtr);\n }\n }\n}\n","import {\n EngineError,\n EngineErrorCode,\n PAGE_INSERT_BLANK_MAX_COUNT,\n type PageInsertBlankSpec,\n type PageInsertResult,\n type PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { PagesReader } from './PagesReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Insert every page of a standalone PDF into the session document. A\n * structural MUTATION (like move/delete): the source bytes are loaded as a\n * throwaway PDFium document, `FPDF_ImportPagesByIndex` deep-copies its\n * pages in at `destIndex`, and the page registry is rebuilt. Pre-existing\n * pages keep their identity and `RevisionToken`s; the inserted copies get\n * fresh object numbers, resolved from the post-insert registry.\n */\nexport class PagesInserter {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n insert(bytes: ArrayBuffer, destIndex: number | undefined, signal: AbortSignal): PageInsertResult {\n throwIfAborted(signal);\n if (bytes.byteLength === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.insert requires non-empty bytes');\n }\n\n const { fn, mem } = this.runtime;\n const destPtr = this.session.requireDocPtr();\n const beforeCount = fn.FPDF_GetPageCount(destPtr);\n const at = destIndex ?? beforeCount;\n if (!Number.isInteger(at) || at < 0 || at > beforeCount) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insert destIndex ${at} out of range [0, ${beforeCount}]`,\n );\n }\n\n // FPDF_ImportPagesByIndex does NOT fully detach imported objects from\n // their source document (imported streams still read through it), so\n // the source doc and its buffer must outlive every future save of the\n // destination. On failure they are released immediately; on success\n // they are parked on the session and released at session close.\n // TODO(fork): a deep-detaching import would let this close eagerly.\n const dataPtr = mem.alloc(bytes.byteLength);\n let srcPtr: Ptr | null = null;\n let insertedCount = 0;\n try {\n mem.writeBytes(dataPtr, new Uint8Array(bytes));\n srcPtr = fn.FPDF_LoadMemDocument(dataPtr, bytes.byteLength, '');\n if (!srcPtr) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'pages.insert source PDF could not be opened',\n );\n }\n insertedCount = fn.FPDF_GetPageCount(srcPtr);\n if (insertedCount <= 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.insert source PDF has no pages');\n }\n // Null index array + count 0 = \"import every page\", in order.\n if (!fn.FPDF_ImportPagesByIndex(destPtr, srcPtr, NULL_PTR, 0, at)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDF_ImportPagesByIndex rejected the insert at index ${at}`,\n );\n }\n const retainedSrc = srcPtr;\n this.session.retainUntilClose(() => {\n fn.FPDF_CloseDocument(retainedSrc);\n mem.free(dataPtr);\n });\n } catch (error) {\n if (srcPtr) fn.FPDF_CloseDocument(srcPtr);\n mem.free(dataPtr);\n throw error;\n }\n\n // Page count and order changed; rebuild the index<->pon map. Existing\n // pages' revisions and weak-flag bookkeeping stay put (keyed by pon).\n this.session.refreshPageRegistry();\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n const insertedPageObjectNumbers: PageObjectNumber[] = layout.pages\n .slice(at, at + insertedCount)\n .map((page) => page.pageObjectNumber);\n return { insertedPageObjectNumbers, layout, cache: null };\n }\n\n /**\n * Create `count` blank pages of `size` at `destIndex`. Same mutation\n * contract as `insert`, but native creation (`FPDFPage_New`) instead of a\n * deep copy: no source document, so none of the retain-until-close\n * lifetime hazard above. Each page gets an empty content stream\n * (`FPDFPage_GenerateContent`) so the saved PDF renders identically in\n * third-party viewers.\n */\n insertBlank(\n spec: PageInsertBlankSpec,\n destIndex: number | undefined,\n signal: AbortSignal,\n ): PageInsertResult {\n throwIfAborted(signal);\n const { size } = spec;\n const count = spec.count ?? 1;\n if (\n !Number.isFinite(size?.width) ||\n !Number.isFinite(size?.height) ||\n size.width <= 0 ||\n size.height <= 0\n ) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insertBlank size must have positive finite dimensions, got ${size?.width}x${size?.height}`,\n );\n }\n if (!Number.isInteger(count) || count < 1 || count > PAGE_INSERT_BLANK_MAX_COUNT) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insertBlank count ${count} out of range [1, ${PAGE_INSERT_BLANK_MAX_COUNT}]`,\n );\n }\n\n const { fn } = this.runtime;\n const destPtr = this.session.requireDocPtr();\n const beforeCount = fn.FPDF_GetPageCount(destPtr);\n const at = destIndex ?? beforeCount;\n if (!Number.isInteger(at) || at < 0 || at > beforeCount) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.insertBlank destIndex ${at} out of range [0, ${beforeCount}]`,\n );\n }\n\n for (let i = 0; i < count; i++) {\n // FPDFPage_New would clamp an out-of-range index to \"append\"; the\n // guard above keeps that PDFium leniency out of the contract.\n const pagePtr = fn.FPDFPage_New(destPtr, at + i, size.width, size.height);\n if (!pagePtr) {\n // Undo the pages already created so a failure leaves the document\n // untouched (the registry was never refreshed, so it still agrees).\n for (let j = 0; j < i; j++) fn.FPDFPage_Delete(destPtr, at);\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_New rejected page ${i + 1}/${count} at index ${at + i}`,\n );\n }\n fn.FPDFPage_GenerateContent(pagePtr);\n fn.FPDF_ClosePage(pagePtr);\n }\n\n this.session.refreshPageRegistry();\n\n const layout = new PagesReader(this.runtime, this.session).read(signal);\n const insertedPageObjectNumbers: PageObjectNumber[] = layout.pages\n .slice(at, at + count)\n .map((page) => page.pageObjectNumber);\n return { insertedPageObjectNumbers, layout, cache: null };\n }\n}\n","import type { Ptr } from '@embedpdf/engine-runtime';\n\nimport type { FontRegistrar } from '../../../fonts/FontRegistrar';\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\n\n/**\n * Document-scoped capabilities threaded into per-subtype annotation\n * READERS — the read-side mirror of `AnnotationWriteContext`. Most kinds\n * materialise from the `annotPtr` alone and ignore it; the link reader\n * needs the document because destination, action, and URI resolution are\n * document-scoped PDFium operations.\n */\nexport interface AnnotationReadContext {\n readonly docPtr: Ptr;\n /** This thread's font registry, when the host has one: a FreeText body\n * face reads back as the registered `key` whose identity matches. */\n readonly fonts?: FontRegistrar;\n}\n\n/** Build the read context both read paths (list loop, mutator read-back) use. */\nexport function readContextFor(\n session: DocumentSession,\n fonts?: FontRegistrar,\n): AnnotationReadContext {\n return { docPtr: session.requireDocPtr(), ...(fonts ? { fonts } : {}) };\n}\n","import type { AnnotationFlags } from '@embedpdf/engine-core/runtime';\nimport { NO_ANNOTATION_FLAGS } from '@embedpdf/engine-core/runtime';\n\n/**\n * Bit positions of the `/F` (Annotation Flags) entry per ISO 32000 §12.5.3.\n * The single source of truth shared by the flag reader and writer so they\n * can never drift apart.\n */\nexport const ANNOT_FLAG_BITS = {\n invisible: 1 << 0,\n hidden: 1 << 1,\n print: 1 << 2,\n noZoom: 1 << 3,\n noRotate: 1 << 4,\n noView: 1 << 5,\n readOnly: 1 << 6,\n locked: 1 << 7,\n toggleNoView: 1 << 8,\n lockedContents: 1 << 9,\n} as const satisfies Record<keyof AnnotationFlags, number>;\n\nconst FLAG_KEYS = Object.keys(ANNOT_FLAG_BITS) as (keyof AnnotationFlags)[];\n\n/** Expand a raw `/F` bitset into the typed boolean object. */\nexport function bitsToFlags(bits: number): AnnotationFlags {\n if (bits === 0) return { ...NO_ANNOTATION_FLAGS };\n const flags = { ...NO_ANNOTATION_FLAGS };\n for (const key of FLAG_KEYS) {\n flags[key] = (bits & ANNOT_FLAG_BITS[key]) !== 0;\n }\n return flags;\n}\n\n/**\n * Fold a partial flag patch onto an existing `/F` bitset. Only keys present\n * in `partial` are touched; absent keys preserve their current bit. This is\n * what lets `create` start from 0 and `update` merge onto the live value.\n */\nexport function flagsToBits(current: number, partial: Partial<AnnotationFlags>): number {\n let bits = current;\n for (const key of FLAG_KEYS) {\n const value = partial[key];\n if (value === undefined) continue;\n if (value) {\n bits |= ANNOT_FLAG_BITS[key];\n } else {\n bits &= ~ANNOT_FLAG_BITS[key];\n }\n }\n return bits;\n}\n","import type { LineEnding } from '@embedpdf/engine-core/runtime';\n\n/**\n * `FPDF_ANNOT_LINE_END` enum codes from `public/fpdf_annot.h`, mapped to the\n * wire-stable kebab-case `LineEnding` strings. We keep this PDFium-specific\n * mapping in engine-services so engine-core stays free of any PDFium\n * dependency (mirrors `shapeBorderStyle.ts`).\n *\n * None=0, Square=1, Circle=2, Diamond=3, OpenArrow=4, ClosedArrow=5,\n * Butt=6, ROpenArrow=7, RClosedArrow=8, Slash=9, Unknown=10\n *\n * `Unknown` has no wire representation, so it round-trips as `'none'`.\n */\nconst LE_NONE = 0;\nconst LE_SQUARE = 1;\nconst LE_CIRCLE = 2;\nconst LE_DIAMOND = 3;\nconst LE_OPEN_ARROW = 4;\nconst LE_CLOSED_ARROW = 5;\nconst LE_BUTT = 6;\nconst LE_R_OPEN_ARROW = 7;\nconst LE_R_CLOSED_ARROW = 8;\nconst LE_SLASH = 9;\n\nexport function lineEndingToCode(ending: LineEnding): number {\n switch (ending) {\n case 'square':\n return LE_SQUARE;\n case 'circle':\n return LE_CIRCLE;\n case 'diamond':\n return LE_DIAMOND;\n case 'open-arrow':\n return LE_OPEN_ARROW;\n case 'closed-arrow':\n return LE_CLOSED_ARROW;\n case 'butt':\n return LE_BUTT;\n case 'r-open-arrow':\n return LE_R_OPEN_ARROW;\n case 'r-closed-arrow':\n return LE_R_CLOSED_ARROW;\n case 'slash':\n return LE_SLASH;\n case 'none':\n default:\n return LE_NONE;\n }\n}\n\nexport function lineEndingFromCode(code: number): LineEnding {\n switch (code) {\n case LE_SQUARE:\n return 'square';\n case LE_CIRCLE:\n return 'circle';\n case LE_DIAMOND:\n return 'diamond';\n case LE_OPEN_ARROW:\n return 'open-arrow';\n case LE_CLOSED_ARROW:\n return 'closed-arrow';\n case LE_BUTT:\n return 'butt';\n case LE_R_OPEN_ARROW:\n return 'r-open-arrow';\n case LE_R_CLOSED_ARROW:\n return 'r-closed-arrow';\n case LE_SLASH:\n return 'slash';\n case LE_NONE:\n default:\n return 'none';\n }\n}\n","import type {\n AnnotationFlags,\n Color,\n InkList,\n LineEndings,\n LinePoints,\n PdfPoint,\n PdfQuad,\n PdfRect,\n PdfRectDifferences,\n} from '@embedpdf/engine-core/runtime';\nimport {\n NULL_PTR,\n type PdfFunctions,\n type PdfRuntimeMemory,\n type Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport { withScratch, withScratchN } from '../../../../runtime/memory/scratch';\nimport { readUtf8String, readUtf16String } from '../../../../runtime/memory/strings';\nimport {\n F32_BYTES,\n I32_BYTES,\n POINTF_BYTES,\n QUADPOINTSF_BYTES,\n RECTF_BYTES,\n readF32,\n readI32,\n readRectF,\n} from '../../../../runtime/memory/structs';\nimport { bitsToFlags } from '../annotationFlagBits';\nimport { lineEndingFromCode } from '../lineEnding';\n\n/**\n * Reads a UTF-16 string entry from an annotation dictionary. Returns\n * `null` if the key is not present, otherwise the (possibly empty) string.\n */\nexport function readAnnotString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n): string | null {\n if (!fn.FPDFAnnot_HasKey(annotPtr, key)) return null;\n return readUtf16String(\n mem,\n (buf, capacity) => fn.FPDFAnnot_GetStringValue(annotPtr, key, buf, capacity),\n '',\n );\n}\n\n/**\n * Read /Rect from an annot dict via FPDFAnnot_GetRect.\n * FS_RECTF layout: { float left, top, right, bottom } -> 16 bytes.\n */\nexport function readAnnotRect(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): PdfRect {\n return withScratch(mem, RECTF_BYTES, (buf) => {\n if (!fn.FPDFAnnot_GetRect(annotPtr, buf)) {\n return { left: 0, bottom: 0, right: 0, top: 0 };\n }\n return readRectF(mem, buf);\n });\n}\n\nexport function readAnnotFlags(fn: PdfFunctions, annotPtr: Ptr): AnnotationFlags {\n return bitsToFlags(fn.FPDFAnnot_GetFlags(annotPtr));\n}\n\n/**\n * Read an annotation color via the EmbedPDF `EPDFAnnot_GetColor`\n * extension. The `type` arg (FPDFANNOT_COLORTYPE) selects which color to\n * read — `0` (default) is the stroke/fill `/C`, `1` is the interior `/IC`\n * of square/circle/polygon annotations. Unlike the stock\n * `FPDFAnnot_GetColor`, the extension exposes interior color. Returns RGB\n * only — annotation opacity lives in `/CA`, not a per-color alpha.\n *\n * Returns `null` when the requested color entry is absent.\n */\nexport function readAnnotColor(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n type: number = 0, // FPDFANNOT_COLORTYPE_Color\n): Color | null {\n return withScratchN(mem, [I32_BYTES, I32_BYTES, I32_BYTES], ([r, g, b]) => {\n if (!fn.EPDFAnnot_GetColor(annotPtr, type, r, g, b)) return null;\n return {\n r: readI32(mem, r) & 0xff,\n g: readI32(mem, g) & 0xff,\n b: readI32(mem, b) & 0xff,\n };\n });\n}\n\n/**\n * Read annotation opacity via the EmbedPDF `EPDFAnnot_GetOpacity`\n * extension. Returns a 0..1 value (the native alpha is 0..255). Returns\n * `null` when the annotation has no opacity entry. This is the path that\n * stays consistent across native `EPDFAnnot_GenerateAppearance`, unlike a\n * raw `/CA` number read.\n */\nexport function readAnnotOpacity(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number | null {\n return withScratch(mem, I32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetOpacity(annotPtr, buf)) return null;\n return (readI32(mem, buf) & 0xff) / 255;\n });\n}\n\n/**\n * Read the effective border style and width via\n * `EPDFAnnot_GetBorderStyle`, which resolves `/BS`, legacy `/Border`, and\n * the ISO defaults. The return value is the raw `FPDF_ANNOT_BORDER_STYLE`\n * enum code; the width is written into the scratch out-parameter.\n * Style/width string mapping lives in the shape reader (engine-core stays\n * PDFium-free).\n */\nexport function readBorderStyle(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): { styleCode: number; width: number } {\n return withScratch(mem, F32_BYTES, (buf) => {\n const styleCode = fn.EPDFAnnot_GetBorderStyle(annotPtr, buf);\n return { styleCode, width: readF32(mem, buf) };\n });\n}\n\n/**\n * Read the dash pattern of a dashed border. Resolves modern `/BS /D` first,\n * then the fourth element of the legacy `/Border` array. Returns an empty\n * array when the effective border is not dashed or has no explicit pattern.\n */\nexport function readBorderDashPattern(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number[] {\n const count = fn.EPDFAnnot_GetBorderDashPatternCount(annotPtr);\n if (count <= 0) return [];\n return withScratch(mem, count * F32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetBorderDashPattern(annotPtr, buf, count)) return [];\n const out: number[] = [];\n for (let i = 0; i < count; i++) out.push(readF32(mem, buf, i * F32_BYTES));\n return out;\n });\n}\n\n/**\n * Read the `/BE` cloudy border intensity. Returns `null` when the\n * annotation has no cloudy border effect. The DTO domain is positive-or-null,\n * so a degenerate foreign `/BE /I 0` (no visible clouds) normalizes to `null`\n * rather than leaking an out-of-schema zero; a `/BE` without `/I` reads as 1\n * (the runtime's default).\n */\nexport function readBorderEffect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number | null {\n return withScratch(mem, F32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetBorderEffect(annotPtr, buf)) return null;\n const intensity = readF32(mem, buf);\n return intensity > 0 ? intensity : null;\n });\n}\n\n/**\n * Read the `/RD` rectangle differences. Returns `null` when the\n * annotation has no `/RD` entry. PDFium reports `/RD` in\n * `[left, bottom, right, top]` order; we surface the wire-stable\n * `{ left, top, right, bottom }` shape.\n */\nexport function readRectangleDifferences(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): PdfRectDifferences | null {\n return withScratchN(\n mem,\n [F32_BYTES, F32_BYTES, F32_BYTES, F32_BYTES],\n ([left, bottom, right, top]) => {\n if (!fn.EPDFAnnot_GetRectangleDifferences(annotPtr, left, bottom, right, top)) return null;\n return {\n left: readF32(mem, left),\n bottom: readF32(mem, bottom),\n right: readF32(mem, right),\n top: readF32(mem, top),\n };\n },\n );\n}\n\n/**\n * Read the `/Vertices` point list of a polygon/polyline annotation via\n * the two-call `FPDFAnnot_GetVertices` pattern (probe for the count with\n * a NULL buffer, then read into a `count * FS_POINTF` buffer). Returns an\n * empty array when the annotation has no vertices.\n */\nexport function readVertices(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): PdfPoint[] {\n const count = fn.FPDFAnnot_GetVertices(annotPtr, NULL_PTR, 0);\n if (count <= 0) return [];\n return withScratch(mem, count * POINTF_BYTES, (buf) => {\n const got = fn.FPDFAnnot_GetVertices(annotPtr, buf, count);\n if (got <= 0) return [];\n const out: PdfPoint[] = [];\n for (let i = 0; i < got; i++) {\n const off = i * POINTF_BYTES;\n out.push({ x: readF32(mem, buf, off), y: readF32(mem, buf, off + 4) });\n }\n return out;\n });\n}\n\n/**\n * Read the `/InkList` of an ink annotation. `FPDFAnnot_GetInkListCount`\n * gives the number of strokes; each stroke is sized with a probe call to\n * `FPDFAnnot_GetInkListPath` (NULL buffer) and then read into a\n * `count * FS_POINTF` buffer. Empty strokes are skipped; the result is an\n * array of non-empty point paths.\n */\nexport function readInkList(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): InkList {\n const pathCount = fn.FPDFAnnot_GetInkListCount(annotPtr);\n if (pathCount <= 0) return [];\n const out: InkList = [];\n for (let p = 0; p < pathCount; p++) {\n const count = fn.FPDFAnnot_GetInkListPath(annotPtr, p, NULL_PTR, 0);\n if (count <= 0) continue;\n const stroke = withScratch(mem, count * POINTF_BYTES, (buf) => {\n const got = fn.FPDFAnnot_GetInkListPath(annotPtr, p, buf, count);\n if (got <= 0) return [];\n const pts: PdfPoint[] = [];\n for (let i = 0; i < got; i++) {\n const off = i * POINTF_BYTES;\n pts.push({ x: readF32(mem, buf, off), y: readF32(mem, buf, off + 4) });\n }\n return pts;\n });\n if (stroke.length > 0) out.push(stroke);\n }\n return out;\n}\n\n/**\n * Read the `/L` endpoints of a line annotation via `FPDFAnnot_GetLine`\n * (two `FS_POINTF` out-params). Returns `null` when the annotation is not\n * a line or has no `/L` entry.\n */\nexport function readLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): LinePoints | null {\n return withScratchN(mem, [POINTF_BYTES, POINTF_BYTES], ([start, end]) => {\n if (!fn.FPDFAnnot_GetLine(annotPtr, start, end)) return null;\n return {\n start: { x: readF32(mem, start, 0), y: readF32(mem, start, 4) },\n end: { x: readF32(mem, end, 0), y: readF32(mem, end, 4) },\n };\n });\n}\n\n/**\n * Read the `/LE` line endings of a line/polyline annotation via the\n * EmbedPDF `EPDFAnnot_GetLineEndings` extension (two int out-params).\n * Returns `{ start: 'none', end: 'none' }` when the annotation has no\n * `/LE` entry, so callers always get a well-formed pair.\n */\nexport function readLineEndings(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): LineEndings {\n return withScratchN(mem, [I32_BYTES, I32_BYTES], ([start, end]) => {\n if (!fn.EPDFAnnot_GetLineEndings(annotPtr, start, end)) {\n return { start: 'none', end: 'none' };\n }\n return {\n start: lineEndingFromCode(readI32(mem, start)),\n end: lineEndingFromCode(readI32(mem, end)),\n };\n });\n}\n\n/**\n * Read the `/DA` default appearance (font + size + colour) of a free-text\n * annotation via `EPDFAnnot_GetDefaultAppearance` (font int, size f32, and\n * r/g/b int out-params). `fontCode` is the raw `FPDF_STANDARD_FONT` enum\n * value. Returns `null` when the annotation has no `/DA`.\n */\nexport function readDefaultAppearance(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): { fontCode: number; fontSize: number; color: Color } | null {\n return withScratchN(\n mem,\n [I32_BYTES, F32_BYTES, I32_BYTES, I32_BYTES, I32_BYTES],\n ([font, size, r, g, b]) => {\n if (!fn.EPDFAnnot_GetDefaultAppearance(annotPtr, font, size, r, g, b)) return null;\n return {\n fontCode: readI32(mem, font),\n fontSize: readF32(mem, size),\n color: {\n r: readI32(mem, r) & 0xff,\n g: readI32(mem, g) & 0xff,\n b: readI32(mem, b) & 0xff,\n },\n };\n },\n );\n}\n\n/**\n * Read the `/Q` text alignment quadding code of a free-text annotation via\n * `EPDFAnnot_GetTextAlignment`. The code<->string mapping lives in\n * `textAlignment.ts`; an absent `/Q` reads back as `0` (left).\n */\nexport function readTextAlignment(fn: PdfFunctions, annotPtr: Ptr): number {\n return fn.EPDFAnnot_GetTextAlignment(annotPtr);\n}\n\n/**\n * Read `/OverlayText` of a redact annotation via `EPDFAnnot_GetOverlayText`\n * (standard UTF-16 byte-length ABI). Returns `null` when the key is absent\n * (the redaction has no label), otherwise the — possibly empty — label.\n */\nexport function readOverlayText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): string | null {\n if (!fn.FPDFAnnot_HasKey(annotPtr, 'OverlayText')) return null;\n return readUtf16String(\n mem,\n (buf, capacity) => fn.EPDFAnnot_GetOverlayText(annotPtr, buf, capacity),\n '',\n );\n}\n\n/**\n * Read `/Repeat` of a redact annotation via `EPDFAnnot_GetOverlayTextRepeat`\n * (an absent key reads as `false`, the PDF default).\n */\nexport function readOverlayTextRepeat(fn: PdfFunctions, annotPtr: Ptr): boolean {\n return fn.EPDFAnnot_GetOverlayTextRepeat(annotPtr);\n}\n\n/**\n * Read the `/IT` intent name via `EPDFAnnot_GetIntent`. Unlike the standard\n * `FPDFAnnot_GetStringValue` ABI, this getter reports the count of UTF-16\n * code units (excluding the NUL), so we size the buffer as\n * `(count + 1) * 2` bytes. Returns `null` when no intent is present.\n */\nexport function readIntent(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): string | null {\n const codeUnits = fn.EPDFAnnot_GetIntent(annotPtr, NULL_PTR, 0);\n if (codeUnits <= 0) return null;\n const bytes = (codeUnits + 1) * 2;\n return withScratch(mem, bytes, (buf) => {\n fn.EPDFAnnot_GetIntent(annotPtr, buf, bytes);\n return mem.readU16String(buf);\n });\n}\n\n/**\n * Read the `/CL` callout leader line of a free-text callout via\n * `EPDFAnnot_GetCalloutLineCount` + `EPDFAnnot_GetCalloutLine` (the points\n * are read into a `count * FS_POINTF` buffer, like {@link readVertices}).\n * Returns an empty array when there is no callout line.\n */\nexport function readCalloutLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): PdfPoint[] {\n const count = fn.EPDFAnnot_GetCalloutLineCount(annotPtr);\n if (count <= 0) return [];\n return withScratch(mem, count * POINTF_BYTES, (buf) => {\n const got = fn.EPDFAnnot_GetCalloutLine(annotPtr, buf, count);\n if (got <= 0) return [];\n const out: PdfPoint[] = [];\n for (let i = 0; i < got; i++) {\n const off = i * POINTF_BYTES;\n out.push({ x: readF32(mem, buf, off), y: readF32(mem, buf, off + 4) });\n }\n return out;\n });\n}\n\n/**\n * Read attachment points for a text-markup annotation.\n * Each `FS_QUADPOINTSF` is 8 floats = 32 bytes.\n */\nexport function readQuadPoints(fn: PdfFunctions, mem: PdfRuntimeMemory, annotPtr: Ptr): PdfQuad[] {\n const count = fn.FPDFAnnot_CountAttachmentPoints(annotPtr);\n if (count <= 0) return [];\n\n return withScratch(mem, QUADPOINTSF_BYTES, (buf) => {\n const out: PdfQuad[] = [];\n for (let i = 0; i < count; i++) {\n if (!fn.FPDFAnnot_GetAttachmentPoints(annotPtr, i, buf)) continue;\n const f = (off: number) => readF32(mem, buf, off);\n // Positional, in PDFium FS_QUADPOINTSF slot order (PDF 32000 12.5.6.10):\n // { x1,y1, x2,y2, x3,y3, x4,y4 } -> p1 p2 p3 p4. We do NOT relabel these\n // as named corners: PdfQuad asserts no corner semantics (see its docs).\n out.push({\n p1: { x: f(0), y: f(4) },\n p2: { x: f(8), y: f(12) },\n p3: { x: f(16), y: f(20) },\n p4: { x: f(24), y: f(28) },\n });\n }\n return out;\n });\n}\n\n/**\n * `/Name` as text, whatever its value (`EPDFAnnot_GetName`): a standard\n * icon/stamp name or a custom identifier. `null` when absent.\n */\nexport function readAnnotName(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): string | null {\n return readUtf8String(mem, (buf, capacity) => fn.EPDFAnnot_GetName(annotPtr, buf, capacity));\n}\n","import type { PdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from '../../../../runtime/memory/scratch';\nimport { F32_BYTES, RECTF_BYTES, readF32, readRectF } from '../../../../runtime/memory/structs';\n\n/**\n * Read-side twin of `writers/.../writeAnnotationTransformMetadata.ts`. Decodes\n * the EmbedPDF rotation keys from /EMBD_Metadata back onto the DTO:\n *\n * - `Rotation` — degrees, PDF convention. Returned for EVERY rotatable\n * kind (box AND vertex); the plugin converts it back to its CW-content\n * `rot` once at the repository seam.\n * - `UnrotatedRect` — the logical box. BOX kinds only (square/circle/\n * free-text); a vertex annotation never carries one (its points are the\n * visual), so vertex readers don't ask for it.\n *\n * Both are absent on un-rotated annotations (and on everything authored before\n * rotation shipped), so both reads return `undefined` and the DTO field stays\n * unset.\n */\n\nconst KEY_ROTATION = 'Rotation';\nconst KEY_UNROTATED_RECT = 'UnrotatedRect';\n\n/** The advisory/portable rotation scalar (degrees, PDF convention), or\n * `undefined` when absent or zero. */\nexport function readAnnotationRotation(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): number | undefined {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) return undefined;\n return withScratch(mem, F32_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetEmbedMetadataNumber(annotPtr, KEY_ROTATION, buf)) return undefined;\n const v = readF32(mem, buf);\n return v ? v : undefined; // 0 ≡ \"no rotation\"\n });\n}\n\n/** The logical (unrotated) box of a rotated BOX annotation, or `undefined`. */\nexport function readAnnotationUnrotatedRect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): PdfRect | undefined {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) return undefined;\n return withScratch(mem, RECTF_BYTES, (buf) => {\n if (!fn.EPDFAnnot_GetEmbedMetadataRect(annotPtr, KEY_UNROTATED_RECT, buf)) return undefined;\n // FS_RECTF { left, top, right, bottom } → wire-stable PdfRect.\n const r = readRectF(mem, buf);\n return { left: r.left, bottom: r.bottom, right: r.right, top: r.top };\n });\n}\n","import type { CaretIntent, StrikeoutIntent } from '@embedpdf/engine-core/runtime';\n\n/** Adobe-compatible `/IT` names, normalized at the engine-core boundary. */\nconst IT_REPLACE = 'Replace';\nconst IT_STRIKEOUT_TEXT_EDIT = 'StrikeOutTextEdit';\n\nexport function caretIntentToName(intent: CaretIntent): string {\n switch (intent) {\n case 'replace':\n return IT_REPLACE;\n }\n}\n\nexport function caretIntentFromName(name: string | null): CaretIntent | null {\n return name === IT_REPLACE ? 'replace' : null;\n}\n\nexport function strikeoutIntentToName(intent: StrikeoutIntent): string {\n switch (intent) {\n case 'strikeout-text-edit':\n return IT_STRIKEOUT_TEXT_EDIT;\n }\n}\n\nexport function strikeoutIntentFromName(name: string | null): StrikeoutIntent | null {\n return name === IT_STRIKEOUT_TEXT_EDIT ? 'strikeout-text-edit' : null;\n}\n","import type { AnnotationBase, CaretAnnotationDTO, Color } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readIntent,\n readRectangleDifferences,\n} from './annotationReadPrimitives';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\nimport { caretIntentFromName } from '../textEditIntent';\n\n/** Default `/C` colour when a caret has none (matches the writer default). */\nconst DEFAULT_CARET_COLOR: Color = { r: 255, g: 0, b: 0 };\n\nexport function readCaret(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): CaretAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...DEFAULT_CARET_COLOR };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const rd = readRectangleDifferences(fn, mem, annotPtr);\n const intent = caretIntentFromName(readIntent(fn, mem, annotPtr));\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n\n return {\n ...base,\n subtype: 'caret',\n intent,\n color,\n opacity,\n rectDifferences: rd,\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect ? { unrotatedRect } : {}),\n };\n}\n","import type {\n AttachmentFileInfo,\n EmbeddedFileRef,\n WireResource,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\nimport type {\n PdfFunctions,\n PdfRuntimeMemory,\n PdfRuntimeModule,\n Ptr,\n} from '@embedpdf/engine-runtime';\n\nimport { readUtf16String, writeUtf16String } from '../../../runtime/memory/strings';\n\n/**\n * Shared primitives over an `FPDF_ATTACHMENT` handle (an unretained\n * filespec pointer — no close call exists or is needed). Used by both\n * homes an embedded file can have: the document-level `/EmbeddedFiles`\n * name tree (`AttachmentReader`) and a FileAttachment annotation's `/FS`\n * (the annotation reader + `downloadFile`).\n */\n\n/** Read the name-tree KEY at |index| — the durable EmbeddedFileRef address. */\nexport function readAttachmentKey(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n index: number,\n): string | null {\n return readUtf16String(mem, (buf, cap) => fn.EPDFDoc_GetAttachmentKey(docPtr, index, buf, cap));\n}\n\n/** Resolve an EmbeddedFileRef to its CURRENT name-tree index, or -1. */\nexport function resolveAttachmentIndex(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n ref: EmbeddedFileRef,\n): number {\n const keyPtr = mem.writeU16String(ref.key);\n try {\n return fn.EPDFDoc_GetAttachmentIndexByKey(docPtr, keyPtr);\n } finally {\n mem.free(keyPtr);\n }\n}\n\n/**\n * Write an embedded file's payload onto an existing FPDF_ATTACHMENT:\n * bytes via FPDFAttachment_SetFile (which also writes /Params\n * Size/CheckSum/CreationDate), declared mime via EPDFAttachment_SetSubtype\n * (attachments accept any format — no sniffing), optional /Desc. Shared\n * by the file-attachment annotation writer and the document-level\n * `attachments.create` mutation — the write half of the one attachment\n * vocabulary.\n */\nexport function writeAttachmentFilePayload(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n docPtr: Ptr,\n file: { mimeType?: string; description?: string },\n resource: WireResource,\n): void {\n const byteLength = resource.bytes.byteLength;\n if (byteLength === 0) {\n // Valid zero-byte attachment: PDFium accepts (NULL, 0).\n if (!fn.FPDFAttachment_SetFile(attachmentPtr, docPtr, NULL_PTR, 0)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAttachment_SetFile returned false');\n }\n } else {\n const dataPtr = mem.alloc(byteLength);\n try {\n mem.writeBytes(dataPtr, new Uint8Array(resource.bytes));\n if (!fn.FPDFAttachment_SetFile(attachmentPtr, docPtr, dataPtr, byteLength)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAttachment_SetFile returned false');\n }\n } finally {\n mem.free(dataPtr);\n }\n }\n\n if (!fn.EPDFAttachment_SetSubtype(attachmentPtr, file.mimeType ?? 'application/octet-stream')) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAttachment_SetSubtype returned false');\n }\n if (file.description !== undefined) {\n const ok = writeUtf16String(mem, file.description, (ptr) =>\n fn.EPDFAttachment_SetDescription(attachmentPtr, ptr),\n );\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAttachment_SetDescription returned false',\n );\n }\n }\n}\n\n/** Read the metadata projection of an embedded file (never its bytes). */\nexport function readAttachmentFileInfo(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n): AttachmentFileInfo {\n const name =\n readUtf16String(mem, (buf, cap) => fn.FPDFAttachment_GetName(attachmentPtr, buf, cap)) ?? '';\n const mimeType = readUtf16String(mem, (buf, cap) =>\n fn.FPDFAttachment_GetSubtype(attachmentPtr, buf, cap),\n );\n const description = readUtf16String(mem, (buf, cap) =>\n fn.EPDFAttachment_GetDescription(attachmentPtr, buf, cap),\n );\n const creationDate = readAttachmentString(fn, mem, attachmentPtr, 'CreationDate');\n const checksum = normalizeChecksum(readAttachmentString(fn, mem, attachmentPtr, 'CheckSum'));\n const size = readAttachmentSize(fn, mem, attachmentPtr);\n\n return {\n name,\n ...(mimeType ? { mimeType } : {}),\n ...(description ? { description } : {}),\n ...(size !== null ? { size } : {}),\n ...(checksum ? { checksum } : {}),\n ...(creationDate ? { creationDate } : {}),\n };\n}\n\n/**\n * Decode the embedded file into a standalone buffer via the fork's\n * single-decode `EPDFAttachment_ExtractFileToOwnedBuffer`. A zero-byte\n * embedded file is a valid `{ size: 0 }` result.\n */\nexport function extractAttachmentToBuffer(\n runtime: PdfRuntimeModule,\n attachmentPtr: Ptr,\n maxDecodedBytes: number | undefined,\n): { bytes: ArrayBuffer; size: number } {\n const { fn, mem } = runtime;\n const bufPtrSlot = mem.alloc(8); // void** — 8 bytes covers wasm32 and native\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n let dataPtr: Ptr | null = null;\n try {\n // Plain 0 (not 0n): the wasm memory writes pointer slots via\n // Emscripten setValue, which rejects BigInt for 32-bit pointers.\n mem.poke(bufPtrSlot, 'ptr', 0);\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', -1);\n const ok = fn.EPDFAttachment_ExtractFileToOwnedBuffer(\n attachmentPtr,\n BigInt(maxDecodedBytes ?? 0),\n bufPtrSlot,\n sizePtr,\n statusPtr,\n );\n if (!ok) {\n throw extractStatusError(Number(mem.peek(statusPtr, 'i32')));\n }\n const size = Number(mem.peek(sizePtr, 'i32')) >>> 0;\n dataPtr = mem.peek(bufPtrSlot, 'ptr') as Ptr;\n if (size === 0 || !dataPtr) {\n return { bytes: new ArrayBuffer(0), size: 0 };\n }\n const view = mem.readBytes(dataPtr, size);\n const buffer = new ArrayBuffer(view.byteLength);\n new Uint8Array(buffer).set(view);\n return { bytes: buffer, size };\n } finally {\n if (dataPtr) fn.EPDF_FreeBuffer(dataPtr);\n mem.free(statusPtr);\n mem.free(sizePtr);\n mem.free(bufPtrSlot);\n }\n}\n\n/**\n * Decode the embedded file straight to `path` via the fork's streaming\n * `EPDFAttachment_ExtractFile` + `FPDF_FILEWRITE` — the server mode: the\n * decoded payload never crosses the thread boundary and HTTP streams it\n * from disk. On failure the destination may hold a partial file (the\n * caller owns temp-file cleanup, as with `document.saveFile`).\n */\nexport function extractAttachmentToFile(\n runtime: PdfRuntimeModule,\n attachmentPtr: Ptr,\n path: string,\n maxDecodedBytes: number | undefined,\n): { size: number } {\n const { fn, mem } = runtime;\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n const writer = runtime.fileWrite.toNodeFile(path);\n try {\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', -1);\n const ok = fn.EPDFAttachment_ExtractFile(\n attachmentPtr,\n writer.ptr,\n BigInt(maxDecodedBytes ?? 0),\n sizePtr,\n statusPtr,\n );\n if (!ok) {\n throw extractStatusError(Number(mem.peek(statusPtr, 'i32')));\n }\n return { size: Number(mem.peek(sizePtr, 'i32')) >>> 0 };\n } finally {\n writer.close();\n mem.free(statusPtr);\n mem.free(sizePtr);\n }\n}\n\n/** `EPDFAttachmentExtractStatus` (public/fpdf_attachment.h) → EngineError. */\nfunction extractStatusError(status: number): EngineError {\n switch (status) {\n case 1: // kNoFileStream\n return new EngineError(\n EngineErrorCode.InvalidArg,\n 'attachment has no embedded file stream (missing /EF)',\n );\n case 2: // kDecodeFailed\n return new EngineError(EngineErrorCode.MalformedPdf, 'embedded file stream failed to decode');\n case 3: // kSizeLimitExceeded\n return new EngineError(\n EngineErrorCode.InvalidArg,\n 'embedded file exceeds the configured decoded-size limit',\n );\n case 4: // kWriteFailed\n return new EngineError(EngineErrorCode.Unknown, 'writing the extracted attachment failed');\n default:\n return new EngineError(\n EngineErrorCode.Unknown,\n `attachment extraction failed (status ${status})`,\n );\n }\n}\n\nfunction readAttachmentString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n key: string,\n): string | null {\n if (!fn.FPDFAttachment_HasKey(attachmentPtr, key)) return null;\n return readUtf16String(\n mem,\n (buf, cap) => fn.FPDFAttachment_GetStringValue(attachmentPtr, key, buf, cap),\n null,\n );\n}\n\nfunction readAttachmentSize(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n attachmentPtr: Ptr,\n): number | null {\n const out = mem.alloc(4);\n try {\n if (!fn.EPDFAttachment_GetIntegerValue(attachmentPtr, 'Size', out)) return null;\n const size = Number(mem.peek(out, 'i32'));\n return size >= 0 ? size : null;\n } finally {\n mem.free(out);\n }\n}\n\n/** PDFium reports `/CheckSum` hex strings as `<ABCD…>` — normalize to bare lowercase hex. */\nfunction normalizeChecksum(raw: string | null): string | null {\n if (!raw) return null;\n const inner = raw.startsWith('<') && raw.endsWith('>') ? raw.slice(1, -1) : raw;\n return /^[0-9a-fA-F]+$/.test(inner) ? inner.toLowerCase() : raw;\n}\n","import type { FileAttachmentIcon, NoteIcon } from '@embedpdf/engine-core/runtime';\n\n/**\n * `/Name` icon vocabulary ↔ PDF name mapping for text and file-attachment\n * annotations (ISO 32000-2 tables 175 and 184). The wire speaks the\n * kebab-case ids; `EPDFAnnot_SetName` / `EPDFAnnot_GetName` speak the PDF\n * names. An unknown PDF name reads as the subtype's default (the reader\n * draws the default glyph for names it does not know — spec behavior).\n */\n\nexport const NOTE_ICON_TO_NAME: Readonly<Record<NoteIcon, string>> = Object.freeze({\n comment: 'Comment',\n key: 'Key',\n note: 'Note',\n help: 'Help',\n 'new-paragraph': 'NewParagraph',\n paragraph: 'Paragraph',\n insert: 'Insert',\n});\n\nexport const NOTE_NAME_TO_ICON: Readonly<Record<string, NoteIcon>> = Object.freeze(\n Object.fromEntries(\n Object.entries(NOTE_ICON_TO_NAME).map(([icon, name]) => [name, icon as NoteIcon]),\n ),\n);\n\nexport const FILE_ICON_TO_NAME: Readonly<Record<FileAttachmentIcon, string>> = Object.freeze({\n graph: 'Graph',\n 'push-pin': 'PushPin',\n paperclip: 'Paperclip',\n tag: 'Tag',\n});\n\nexport const FILE_NAME_TO_ICON: Readonly<Record<string, FileAttachmentIcon>> = Object.freeze(\n Object.fromEntries(\n Object.entries(FILE_ICON_TO_NAME).map(([icon, name]) => [name, icon as FileAttachmentIcon]),\n ),\n);\n","import type {\n AnnotationBase,\n AttachmentFileInfo,\n Color,\n FileAttachmentAnnotationDTO,\n FileAttachmentIcon,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAttachmentFileInfo } from '../../../attachments/internal/attachmentPrimitives';\nimport { FILE_NAME_TO_ICON } from '../annotationIcon';\nimport { readAnnotColor, readAnnotOpacity, readAnnotName } from './annotationReadPrimitives';\n\n/** Default `/C` — matches the generator's default icon fill and the writer default. */\nconst DEFAULT_FILE_ATTACHMENT_COLOR: Color = { r: 255, g: 255, b: 0 };\n\n/** An absent or foreign `/Name` reads as 'push-pin' (ISO 32000 §12.5.6.15 default). */\nconst DEFAULT_FILE_ATTACHMENT_ICON: FileAttachmentIcon = 'push-pin';\n\n/**\n * FileAttachment DTO: base + icon presentation + the attached file's\n * METADATA (bytes are downloaded explicitly via\n * `PageAnnotationsService.downloadFile`). A malformed annotation without\n * a readable `/FS` filespec still reads — `file.name` is `''` and the\n * download call reports the precise error.\n */\nexport function readFileAttachment(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): FileAttachmentAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...DEFAULT_FILE_ATTACHMENT_COLOR };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const icon =\n FILE_NAME_TO_ICON[readAnnotName(fn, mem, annotPtr) ?? ''] ?? DEFAULT_FILE_ATTACHMENT_ICON;\n\n const attachmentPtr = fn.FPDFAnnot_GetFileAttachment(annotPtr);\n const file: AttachmentFileInfo = attachmentPtr\n ? readAttachmentFileInfo(fn, mem, attachmentPtr)\n : { name: '' };\n\n return {\n ...base,\n subtype: 'file-attachment',\n icon,\n file,\n color,\n opacity,\n };\n}\n","/**\n * `FPDFANNOT_COLORTYPE` enum codes from `public/fpdf_annot.h`. Shared by\n * the annotation read/write primitives and the shape reader/writer so the\n * color-selector magic numbers live in exactly one place.\n *\n * Color=0 (the stroke/fill `/C`)\n * InteriorColor=1 (the `/IC` of square/circle/polygon)\n * OverlayColor=2 (the redaction overlay)\n * TextColor=3 (the free-text `/DA` color)\n */\nexport const FPDFANNOT_COLORTYPE = {\n Color: 0,\n InteriorColor: 1,\n OverlayColor: 2,\n TextColor: 3,\n} as const;\n\nexport type AnnotationColorType = (typeof FPDFANNOT_COLORTYPE)[keyof typeof FPDFANNOT_COLORTYPE];\n","import type { FreeTextIntent } from '@embedpdf/engine-core/runtime';\n\n/**\n * Free-text `/IT` intent names (ISO 32000 §12.5.6.6) mapped to the\n * wire-stable `FreeTextIntent` strings. Kept in engine-services so\n * engine-core stays PDFium-free.\n *\n * FreeText -> 'free-text' (plain text box)\n * FreeTextCallout -> 'free-text-callout' (with /CL leader line)\n *\n * `FreeTextTypeWriter` (a typewriter variant) round-trips as the plain\n * `'free-text'` intent — we don't author it.\n */\nconst IT_FREE_TEXT = 'FreeText';\nconst IT_FREE_TEXT_CALLOUT = 'FreeTextCallout';\n\nexport function freeTextIntentToName(intent: FreeTextIntent): string {\n return intent === 'free-text-callout' ? IT_FREE_TEXT_CALLOUT : IT_FREE_TEXT;\n}\n\nexport function freeTextIntentFromName(name: string | null): FreeTextIntent {\n return name === IT_FREE_TEXT_CALLOUT ? 'free-text-callout' : 'free-text';\n}\n","import type { FreeTextFont, StandardFont } from '@embedpdf/engine-core/runtime';\n\n/**\n * `FPDF_STANDARD_FONT` enum codes (the 14 standard PDF fonts) mapped to the\n * wire-stable kebab-case `StandardFont` strings. We keep this PDFium-specific\n * mapping in engine-services so engine-core stays free of any PDFium\n * dependency (mirrors `lineEnding.ts` / `shapeBorderStyle.ts`).\n *\n * Courier=0, Courier-Bold=1, Courier-BoldOblique=2, Courier-Oblique=3,\n * Helvetica=4, Helvetica-Bold=5, Helvetica-BoldOblique=6,\n * Helvetica-Oblique=7, Times-Roman=8, Times-Bold=9, Times-BoldItalic=10,\n * Times-Italic=11, Symbol=12, ZapfDingbats=13\n */\nconst FONT_TO_CODE: Record<StandardFont, number> = {\n courier: 0,\n 'courier-bold': 1,\n 'courier-bold-oblique': 2,\n 'courier-oblique': 3,\n helvetica: 4,\n 'helvetica-bold': 5,\n 'helvetica-bold-oblique': 6,\n 'helvetica-oblique': 7,\n 'times-roman': 8,\n 'times-bold': 9,\n 'times-bold-italic': 10,\n 'times-italic': 11,\n symbol: 12,\n 'zapf-dingbats': 13,\n};\n\nconst CODE_TO_FONT: Record<number, StandardFont> = Object.fromEntries(\n Object.entries(FONT_TO_CODE).map(([font, code]) => [code, font as StandardFont]),\n) as Record<number, StandardFont>;\n\n/** Default when a `/DA` font is missing or unrecognised. */\nexport const DEFAULT_STANDARD_FONT: StandardFont = 'helvetica';\n\nexport function standardFontToCode(font: StandardFont): number {\n return FONT_TO_CODE[font] ?? FONT_TO_CODE[DEFAULT_STANDARD_FONT];\n}\n\n/**\n * Narrow a FreeText `fontFamily` to one of the 14 standard fonts. A `false`\n * result means the value is a registered-font `key`. The standard names are\n * therefore reserved — a registered font keyed `'helvetica'` resolves as the\n * standard font.\n */\nexport function isStandardFont(font: FreeTextFont): font is StandardFont {\n return Object.prototype.hasOwnProperty.call(FONT_TO_CODE, font);\n}\n\nexport function standardFontFromCode(code: number): StandardFont {\n return CODE_TO_FONT[code] ?? DEFAULT_STANDARD_FONT;\n}\n","import {\n EngineError,\n EngineErrorCode,\n richTextPlainText,\n type FontIdentityInfo,\n type FreeTextFont,\n type RichTextBody,\n type RichTextDocument,\n type RichTextDocumentInput,\n type RichTextParagraph,\n type RichTextRunStyle,\n type StandardFont,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readUtf8String } from '../../../runtime/memory/strings';\nimport { isStandardFont } from './standardFont';\n\n/**\n * The rich text wire: the engine's `EPDFAnnot_GetRichTextJSON` /\n * `EPDFAnnot_SetRichTextJSON` JSON shape is the DTO shape plus `source` and\n * `diagnostics`, so reading is a parse and writing is a stringify — except\n * for FACES. The DTO names a face the way the host does (a registered\n * font's `key`, a standard font's kebab name); the engine names it the way\n * a PDF does (family, weight, italic). Both directions map here.\n */\n\nexport interface FaceRequest {\n family: string;\n weight?: number;\n italic?: boolean;\n}\n\ninterface StandardFace {\n family: 'Helvetica' | 'Times' | 'Courier' | 'Symbol' | 'ZapfDingbats';\n weight: number;\n italic: boolean;\n}\n\nconst STANDARD_FACES: Record<StandardFont, StandardFace> = {\n courier: { family: 'Courier', weight: 400, italic: false },\n 'courier-bold': { family: 'Courier', weight: 700, italic: false },\n 'courier-bold-oblique': { family: 'Courier', weight: 700, italic: true },\n 'courier-oblique': { family: 'Courier', weight: 400, italic: true },\n helvetica: { family: 'Helvetica', weight: 400, italic: false },\n 'helvetica-bold': { family: 'Helvetica', weight: 700, italic: false },\n 'helvetica-bold-oblique': { family: 'Helvetica', weight: 700, italic: true },\n 'helvetica-oblique': { family: 'Helvetica', weight: 400, italic: true },\n 'times-roman': { family: 'Times', weight: 400, italic: false },\n 'times-bold': { family: 'Times', weight: 700, italic: false },\n 'times-bold-italic': { family: 'Times', weight: 700, italic: true },\n 'times-italic': { family: 'Times', weight: 400, italic: true },\n symbol: { family: 'Symbol', weight: 400, italic: false },\n 'zapf-dingbats': { family: 'ZapfDingbats', weight: 400, italic: false },\n};\n\n/** Family names compare without case, spaces, hyphens and underscores\n * (the engine's own rule): \"Noto Sans\" == \"NotoSans\" == \"noto-sans\". */\nexport function familyKey(family: string): string {\n return family.toLowerCase().replace(/[\\s\\-_'\"]/g, '');\n}\n\nconst STANDARD_FAMILY_KEYS: Record<string, StandardFace['family']> = {\n helvetica: 'Helvetica',\n arial: 'Helvetica',\n arialmt: 'Helvetica',\n sansserif: 'Helvetica',\n times: 'Times',\n timesroman: 'Times',\n timesnewroman: 'Times',\n timesnewromanpsmt: 'Times',\n serif: 'Times',\n courier: 'Courier',\n couriernew: 'Courier',\n couriernewpsmt: 'Courier',\n monospace: 'Courier',\n symbol: 'Symbol',\n zapfdingbats: 'ZapfDingbats',\n dingbats: 'ZapfDingbats',\n};\n\n/**\n * The face a DTO `fontFamily` (or a rich run's `family`) asks for: a\n * standard font's family/weight/italic, a registered key's resolved\n * identity, or — for anything else — the string itself as a family name\n * (a face the document embeds, or one the engine will substitute).\n */\nexport function faceForFreeTextFont(\n font: FreeTextFont,\n describe?: (fontKey: string) => FontIdentityInfo | undefined,\n): FaceRequest {\n if (isStandardFont(font)) {\n const face = STANDARD_FACES[font];\n return { family: face.family, weight: face.weight, italic: face.italic };\n }\n const registered = describe?.(font);\n if (registered) {\n return { family: registered.familyName, weight: registered.weight, italic: registered.italic };\n }\n return { family: font };\n}\n\n/**\n * The DTO `fontFamily` for a body face: the registered `key` whose identity\n * matches, else the standard font's kebab name, else the family itself.\n */\nexport function freeTextFontForFace(\n face: { family: string; weight: number; italic: boolean },\n keyForFace?: (family: string, weight: number, italic: boolean) => string | undefined,\n): FreeTextFont {\n const key = keyForFace?.(face.family, face.weight, face.italic);\n if (key !== undefined) return key;\n const standard = STANDARD_FAMILY_KEYS[familyKey(face.family)];\n if (standard) {\n const bold = face.weight >= 600;\n for (const [name, spec] of Object.entries(STANDARD_FACES) as [StandardFont, StandardFace][]) {\n if (spec.family === standard && spec.weight >= 600 === bold && spec.italic === face.italic) {\n return name;\n }\n }\n // Symbol / ZapfDingbats have no bold or italic faces.\n for (const [name, spec] of Object.entries(STANDARD_FACES) as [StandardFont, StandardFace][]) {\n if (spec.family === standard) return name;\n }\n }\n return face.family;\n}\n\n/** A run style or body with its `family` (and the weight/italic a key or\n * standard name implies) rewritten to what the engine resolves by. */\nfunction withEngineFace<T extends Partial<RichTextRunStyle>>(\n style: T,\n describe?: (fontKey: string) => FontIdentityInfo | undefined,\n): T {\n if (style.family === undefined) return style;\n const face = faceForFreeTextFont(style.family, describe);\n const out: T = { ...style, family: face.family };\n // A key or a standard name carries its weight and italic; an explicit\n // `weight`/`italic` in the style still wins.\n if (face.weight !== undefined && style.weight === undefined) out.weight = face.weight;\n if (face.italic !== undefined && style.italic === undefined) out.italic = face.italic;\n return out;\n}\n\n/** The engine's JSON for a write: the input shape with faces resolved. */\nexport function engineRichTextJson(\n input: RichTextDocumentInput,\n describe?: (fontKey: string) => FontIdentityInfo | undefined,\n): string {\n const body = input.body ? withEngineFace(input.body, describe) : undefined;\n const paragraphs = input.paragraphs.map((p) => ({\n ...p,\n runs: p.runs.map((r) => (r.style ? { ...r, style: withEngineFace(r.style, describe) } : r)),\n }));\n return JSON.stringify(body ? { body, paragraphs } : { paragraphs });\n}\n\ninterface EngineRichText {\n source?: string;\n body?: Record<string, unknown>;\n paragraphs?: Array<Record<string, unknown> & { runs?: Array<Record<string, unknown>> }>;\n}\n\n/** The engine's JSON, parsed into the DTO shape (its `source` and\n * `diagnostics` dropped). `null` when it is not what the engine writes. */\nexport function parseEngineRichText(json: string): RichTextDocument | null {\n let raw: EngineRichText;\n try {\n raw = JSON.parse(json) as EngineRichText;\n } catch {\n return null;\n }\n if (!raw || typeof raw !== 'object' || !raw.body || !Array.isArray(raw.paragraphs)) {\n return null;\n }\n const { source: _source, ...bodyRest } = raw.body as Record<string, unknown> & {\n source?: unknown;\n };\n void _source;\n const body = bodyRest as unknown as RichTextBody;\n const paragraphs: RichTextParagraph[] = raw.paragraphs.map((p) => {\n const { runs, ...props } = p;\n return {\n ...(props as Partial<RichTextParagraph>),\n runs: (runs ?? []).map((r) => r as unknown as RichTextParagraph['runs'][number]),\n } as RichTextParagraph;\n });\n return { body, paragraphs };\n}\n\n/** Read an annotation's rich text through `EPDFAnnot_GetRichTextJSON`. */\nexport function readEngineRichText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): RichTextDocument | null {\n const json = readUtf8String(mem, (buf, cap) => fn.EPDFAnnot_GetRichTextJSON(annotPtr, buf, cap));\n return json ? parseEngineRichText(json) : null;\n}\n\n/**\n * A draft or patch that carries both `contents` and `richText` must agree:\n * `contents` is the plain projection of the rich text (plan §4.7). A stale\n * DTO echo fails loud here instead of quietly restoring old text.\n */\nexport function assertRichTextAgreement(input: {\n subtype: string;\n contents?: string | null;\n richText?: RichTextDocumentInput;\n}): void {\n if (input.subtype !== 'free-text' || input.richText === undefined) return;\n if (input.contents === undefined || input.contents === null) return;\n if (input.contents !== richTextPlainText(input.richText)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'free-text: `contents` must equal the plain projection of `richText` when both are given',\n );\n }\n}\n","import type { TextAlignment } from '@embedpdf/engine-core/runtime';\n\n/**\n * `/Q` quadding codes (ISO 32000 §12.7.3.3) mapped to the wire-stable\n * `TextAlignment` strings. Kept in engine-services so engine-core stays\n * PDFium-free (mirrors `lineEnding.ts`).\n *\n * Left=0, Center=1, Right=2\n */\nconst Q_LEFT = 0;\nconst Q_CENTER = 1;\nconst Q_RIGHT = 2;\n\nexport function textAlignmentToCode(align: TextAlignment): number {\n switch (align) {\n case 'center':\n return Q_CENTER;\n case 'right':\n return Q_RIGHT;\n case 'left':\n default:\n return Q_LEFT;\n }\n}\n\nexport function textAlignmentFromCode(code: number): TextAlignment {\n switch (code) {\n case Q_CENTER:\n return 'center';\n case Q_RIGHT:\n return 'right';\n case Q_LEFT:\n default:\n return 'left';\n }\n}\n","import type { AnnotationBorderStyle } from '@embedpdf/engine-core/runtime';\n\n/**\n * `FPDF_ANNOT_BORDER_STYLE` enum codes from `public/fpdf_annot.h`. We keep\n * this PDFium-specific mapping in engine-services so engine-core stays free\n * of any PDFium dependency (mirrors `PDF_SUBTYPE_TO_CODE`).\n *\n * UNKNOWN=0, SOLID=1, DASHED=2, BEVELED=3, INSET=4, UNDERLINE=5, CLOUDY=6\n *\n * The wire-stable `AnnotationBorderStyle` union covers the four styles a\n * shape annotation realistically authors; cloudy borders are surfaced\n * separately via `cloudyIntensity` (the `/BE` border effect).\n */\nconst BS_SOLID = 1;\nconst BS_DASHED = 2;\nconst BS_BEVELED = 3;\nconst BS_INSET = 4;\n\nexport function borderStyleToCode(style: AnnotationBorderStyle): number {\n switch (style) {\n case 'dashed':\n return BS_DASHED;\n case 'beveled':\n return BS_BEVELED;\n case 'inset':\n return BS_INSET;\n case 'solid':\n default:\n return BS_SOLID;\n }\n}\n\nexport function borderStyleFromCode(code: number): AnnotationBorderStyle {\n switch (code) {\n case BS_DASHED:\n return 'dashed';\n case BS_BEVELED:\n return 'beveled';\n case BS_INSET:\n return 'inset';\n case BS_SOLID:\n default:\n return 'solid';\n }\n}\n","import type {\n AnnotationBorderStyle,\n Color,\n FilledStyleFields,\n GeometryStyleFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { borderStyleFromCode } from '../shapeBorderStyle';\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readBorderDashPattern,\n readBorderStyle,\n} from './annotationReadPrimitives';\n\n/**\n * Default `/C` colour when an annotation has none. Matches the v2 engine\n * (circle/square/polygon/polyline/line/ink all default red).\n */\nconst DEFAULT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Effective `/BS` or legacy `/Border` fields shared by bordered kinds. */\nexport interface BorderFields {\n strokeWidth: number;\n borderStyle: AnnotationBorderStyle;\n dashArray?: number[];\n}\n\n/**\n * Shared reader for the effective border (style + width + dash), resolving\n * `/BS`, legacy `/Border`, and the ISO defaults. The border-only slice of\n * {@link readGeometryStyleExtras}, reused by the free-text box border (which\n * reads `/C` and `/DA` itself).\n */\nexport function readBorderFields(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): BorderFields {\n const { styleCode, width } = readBorderStyle(fn, mem, annotPtr);\n const dashArray = readBorderDashPattern(fn, mem, annotPtr);\n return {\n strokeWidth: width,\n borderStyle: borderStyleFromCode(styleCode),\n ...(dashArray.length > 0 ? { dashArray } : {}),\n };\n}\n\n/**\n * Shared reader for the geometry styling (`/C`, `/CA`, border, dash) — the\n * no-fill layer shared by ink and the filled families. Family readers layer\n * their own geometry + extras on top; filled families add `/IC` via\n * {@link readFilledStyleExtras}.\n */\nexport function readGeometryStyleExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): GeometryStyleFields {\n const color = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.Color) ?? {\n ...DEFAULT_COLOR,\n };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n\n return {\n color,\n opacity,\n ...readBorderFields(fn, mem, annotPtr),\n };\n}\n\n/**\n * Shared reader for the full stroke/fill styling (geometry styling + `/IC`).\n * Reused by every filled family (shape/vertex/line); each layers its own\n * geometry + extras on top.\n */\nexport function readFilledStyleExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): FilledStyleFields {\n const interiorColor = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n return {\n ...readGeometryStyleExtras(fn, mem, annotPtr),\n interiorColor: interiorColor ?? null,\n };\n}\n","import type {\n AnnotationBase,\n CalloutLine,\n Color,\n FreeTextAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { freeTextIntentFromName } from '../freeTextIntent';\nimport { freeTextFontForFace, readEngineRichText } from '../richTextWire';\nimport { standardFontFromCode, DEFAULT_STANDARD_FONT } from '../standardFont';\nimport { textAlignmentFromCode } from '../textAlignment';\nimport type { AnnotationReadContext } from './annotationReadContext';\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readCalloutLine,\n readDefaultAppearance,\n readIntent,\n readLineEndings,\n readRectangleDifferences,\n readTextAlignment,\n} from './annotationReadPrimitives';\nimport { readBorderFields } from './readStyle';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\n\n/** Default `/DA` colour (black) when an annotation has no default appearance. */\nconst DEFAULT_FREETEXT_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/** Default font size when `/DA` has none (or an unusable 0). */\nconst DEFAULT_FONT_SIZE = 12;\n\nfunction colorsEqual(a: Color, b: Color): boolean {\n return a.r === b.r && a.g === b.g && a.b === b.b;\n}\n\nexport function readFreeText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n _subtypeCode?: number,\n ctx?: AnnotationReadContext,\n): FreeTextAnnotationDTO {\n const da = readDefaultAppearance(fn, mem, annotPtr);\n const color = da?.color ?? { ...DEFAULT_FREETEXT_COLOR };\n // The rich text is always there: the annotation's own /RC, else a one-run\n // document the engine synthesises from /Contents + /DA. Its body is the\n // face the /DA names, resolved by identity — so a registered font reads\n // back as its key (the `standardFontFromCode` path only knows the 14).\n const rich = readEngineRichText(fn, mem, annotPtr);\n const fonts = ctx?.fonts;\n const fontFamily = rich\n ? freeTextFontForFace(\n rich.body,\n fonts ? (family, weight, italic) => fonts.keyForFace(family, weight, italic) : undefined,\n )\n : da\n ? standardFontFromCode(da.fontCode)\n : DEFAULT_STANDARD_FONT;\n const fontSize =\n rich && rich.body.size > 0\n ? rich.body.size\n : da && da.fontSize > 0\n ? da.fontSize\n : DEFAULT_FONT_SIZE;\n const richText = rich ?? {\n body: {\n family: 'Helvetica',\n weight: 400,\n italic: false,\n size: fontSize,\n color: '#000000',\n decoration: [],\n script: 'normal',\n letterSpacing: 0,\n horizontalScale: 1,\n align: 'left',\n dir: 'ltr',\n },\n paragraphs: [{ runs: [{ text: base.contents ?? '' }] }],\n };\n\n // `TextColor` overrides text only; surface it as `fontColor` solely when it\n // is present AND differs from the `/DA` colour (otherwise text follows `color`).\n const textColor = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.TextColor);\n const fontColor = textColor && !colorsEqual(textColor, color) ? textColor : undefined;\n\n // For free text `/C` (color type 0) is the box background, not a stroke.\n const background = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.Color);\n\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n\n // The rich body's alignment is what the appearance paints (it wins over\n // /Q); a plain box's synthesised body carries /Q, so both agree. Justify\n // has no /Q value and reads back as the /Q alignment.\n const quadding = textAlignmentFromCode(readTextAlignment(fn, annotPtr));\n const textAlign = rich && rich.body.align !== 'justify' ? rich.body.align : quadding;\n const intent = freeTextIntentFromName(readIntent(fn, mem, annotPtr));\n\n const points = readCalloutLine(fn, mem, annotPtr);\n const calloutLine: CalloutLine | undefined =\n points.length === 2\n ? [points[0]!, points[1]!]\n : points.length === 3\n ? [points[0]!, points[1]!, points[2]!]\n : undefined;\n const leaderEnd = readLineEndings(fn, mem, annotPtr).end;\n\n const rd = readRectangleDifferences(fn, mem, annotPtr);\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n\n return {\n ...base,\n subtype: 'free-text',\n intent,\n fontFamily,\n fontSize,\n textAlign,\n richText,\n color,\n ...(fontColor !== undefined ? { fontColor } : {}),\n interiorColor: background ?? null,\n opacity,\n ...readBorderFields(fn, mem, annotPtr),\n rectDifferences: rd,\n ...(calloutLine !== undefined ? { calloutLine } : {}),\n ...(calloutLine !== undefined && leaderEnd !== 'none' ? { lineEnding: leaderEnd } : {}),\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect ? { unrotatedRect } : {}),\n };\n}\n","import type { InkIntent } from '@embedpdf/engine-core/runtime';\n\nexport function inkIntentToName(intent: InkIntent): string {\n switch (intent) {\n case 'ink-highlight':\n return 'InkHighlight';\n }\n}\n\nexport function inkIntentFromName(name: string | null): InkIntent | null {\n switch (name) {\n case 'InkHighlight':\n return 'ink-highlight';\n default:\n return null;\n }\n}\n","import type { AnnotationBase, InkAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readInkList, readIntent } from './annotationReadPrimitives';\nimport { readGeometryStyleExtras } from './readStyle';\nimport { readAnnotationRotation } from './readAnnotationTransformMetadata';\nimport { inkIntentFromName } from '../inkIntent';\n\nexport function readInk(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): InkAnnotationDTO {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const intent = inkIntentFromName(readIntent(fn, mem, annotPtr));\n return {\n ...base,\n subtype: 'ink',\n ...readGeometryStyleExtras(fn, mem, annotPtr),\n intent,\n inkList: readInkList(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n };\n}\n","import type { AnnotationBase, LineAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readLine as readLinePoints, readLineEndings } from './annotationReadPrimitives';\nimport { readFilledStyleExtras } from './readStyle';\nimport { readAnnotationRotation } from './readAnnotationTransformMetadata';\n\n/** Fallback `/L` when the annotation has no line geometry. */\nconst ZERO_LINE = { start: { x: 0, y: 0 }, end: { x: 0, y: 0 } };\n\nexport function readLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): LineAnnotationDTO {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n return {\n ...base,\n subtype: 'line',\n ...readFilledStyleExtras(fn, mem, annotPtr),\n linePoints: readLinePoints(fn, mem, annotPtr) ?? ZERO_LINE,\n lineEndings: readLineEndings(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n };\n}\n","import type {\n AnnotationBase,\n LinkAnnotationDTO,\n PdfActionTree,\n PdfLinkTarget,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readDestination } from '../../../destinations/readDestination';\nimport type { AnnotationReadContext } from './annotationReadContext';\n\n/**\n * Link reader: rect/flags/relationship ride the base (a link grouped to an\n * annotation is plain `inReplyTo` + `replyType: 'group'`); this module only\n * materialises the normalized target.\n *\n * ONE truth, one projection: the target is a pure function of the SAME\n * payload-carrying action tree the scripting plane reads\n * (`base.actions.activate`) — no second native read exists any more, so the\n * two action-shaped surfaces cannot drift by construction.\n *\n * `/A` precedence, pinned: an activate action that exists but cannot be\n * executed (an `incomplete` tree, a degraded/unreadable root) projects\n * `unsupported` — a broken action is a dead link, never an invitation to\n * guess. The direct `/Dest` (which is data, not an action) is consulted\n * ONLY when no `/A` exists at all.\n */\nexport function readLink(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n _rawSubtypeCode: number,\n ctx: AnnotationReadContext,\n): LinkAnnotationDTO {\n return { ...base, subtype: 'link', target: readLinkTarget(fn, mem, annotPtr, base, ctx) };\n}\n\n/**\n * Project the navigation view from a payload-carrying activate tree. Pure —\n * shared with any consumer that wants the root-level navigation reading of a\n * tree (the link plugin's no-actions-plugin fallback uses the same law).\n */\nexport function linkTargetFromActionTree(tree: PdfActionTree): PdfLinkTarget | null {\n // The law, enforced at the projection too: never execute — not even\n // navigate the root of — a tree marked incomplete.\n if (tree.incomplete) return { kind: 'unsupported' };\n const root = tree.root;\n if (!root) return { kind: 'unsupported' };\n switch (root.type) {\n case 'goto':\n return { kind: 'goto', destination: root.destination };\n case 'uri':\n return { kind: 'uri', uri: root.uri };\n // Reported, never followed/executed (and never writable — see the DTO).\n case 'goto-remote':\n return { kind: 'goto-remote', file: root.filePath };\n case 'launch':\n return { kind: 'launch', path: root.filePath };\n case 'javascript':\n // No script payload here by design: the text rides the action tree —\n // the scripting plane's single home.\n return { kind: 'javascript' };\n case 'named':\n return { kind: 'named', name: root.name };\n default:\n return { kind: 'unsupported' };\n }\n}\n\nfunction readLinkTarget(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n ctx: AnnotationReadContext,\n): PdfLinkTarget | null {\n const activate = base.actions?.activate;\n if (activate) return linkTargetFromActionTree(activate);\n\n // No /A at all → the direct `/Dest`, normalized onto `goto`.\n const linkPtr = fn.FPDFAnnot_GetLink(annotPtr);\n if (!linkPtr) return null;\n const destPtr = fn.FPDFLink_GetDest(ctx.docPtr, linkPtr);\n if (!destPtr) return null; // neither /A nor /Dest: a dead link, reported as-is\n const destination = readDestination(fn, mem, ctx.docPtr, destPtr);\n return destination ? { kind: 'goto', destination } : { kind: 'unsupported' };\n}\n","import type { AnnotationBase, Color, RedactAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { DEFAULT_STANDARD_FONT, standardFontFromCode } from '../standardFont';\nimport { textAlignmentFromCode } from '../textAlignment';\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readDefaultAppearance,\n readOverlayText,\n readOverlayTextRepeat,\n readQuadPoints,\n readTextAlignment,\n} from './annotationReadPrimitives';\n\n/** Default `/C` marking outline (red) — the redaction marking convention and\n * the AP generator's default. */\nconst DEFAULT_REDACT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Default label colour (black) when a redaction carries no `/DA`. */\nconst DEFAULT_LABEL_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/** Default label size when there is no `/DA`. When a `/DA` IS present its\n * size is kept verbatim — including `0`, which means auto-fit for a\n * redaction label (unlike free text, which normalizes 0 away). */\nconst DEFAULT_FONT_SIZE = 12;\n\nexport function readRedact(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): RedactAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.Color) ?? {\n ...DEFAULT_REDACT_COLOR,\n };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const interiorColor =\n readAnnotColor(fn, mem, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor) ?? null;\n\n const da = readDefaultAppearance(fn, mem, annotPtr);\n const fontFamily = da ? standardFontFromCode(da.fontCode) : DEFAULT_STANDARD_FONT;\n const fontSize = da ? da.fontSize : DEFAULT_FONT_SIZE;\n const fontColor = da?.color ?? { ...DEFAULT_LABEL_COLOR };\n\n return {\n ...base,\n subtype: 'redact',\n quadPoints: readQuadPoints(fn, mem, annotPtr),\n color,\n opacity,\n interiorColor,\n overlayText: readOverlayText(fn, mem, annotPtr),\n repeat: readOverlayTextRepeat(fn, annotPtr),\n fontFamily,\n fontSize,\n fontColor,\n textAlign: textAlignmentFromCode(readTextAlignment(fn, annotPtr)),\n };\n}\n","import type {\n AnnotationBase,\n CircleAnnotationDTO,\n ShapeAnnotationFields,\n SquareAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readBorderEffect, readRectangleDifferences } from './annotationReadPrimitives';\nimport { readFilledStyleExtras } from './readStyle';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\n\n/**\n * Shared reader for the two shape subtypes. Materialises the common\n * stroke/fill styling plus the shape-only cloudy (`/BE`) and rect-diff\n * (`/RD`) fields; the caller fills in the `subtype` literal. Absent `/BE`\n * and `/RD` read as explicit `null` (never omission), so a read DTO\n * compares structurally against a clearing patch.\n */\nexport function readShapeExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): ShapeAnnotationFields {\n const cloudyIntensity = readBorderEffect(fn, mem, annotPtr);\n const rectDifferences = readRectangleDifferences(fn, mem, annotPtr);\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n\n return {\n ...readFilledStyleExtras(fn, mem, annotPtr),\n cloudyIntensity,\n rectDifferences,\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect ? { unrotatedRect } : {}),\n };\n}\n\nexport function readCircle(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): CircleAnnotationDTO {\n return { ...base, subtype: 'circle', ...readShapeExtras(fn, mem, annotPtr) };\n}\n\nexport function readSquare(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): SquareAnnotationDTO {\n return { ...base, subtype: 'square', ...readShapeExtras(fn, mem, annotPtr) };\n}\n","import type { AnnotationBase, StampAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotName } from './annotationReadPrimitives';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './readAnnotationTransformMetadata';\n\n/**\n * Stamp DTO: base + `/Name` (standard or custom identifier, verbatim) +\n * transform metadata. The visual content\n * stays in the `/AP` stream — rendered via `renderAppearanceImages()`,\n * never surfaced as DTO data.\n */\nexport function readStamp(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): StampAnnotationDTO {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n const unrotatedRect = readAnnotationUnrotatedRect(fn, mem, annotPtr);\n return {\n ...base,\n subtype: 'stamp',\n name: readAnnotName(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n ...(unrotatedRect != null ? { unrotatedRect } : {}),\n };\n}\n","/**\n * `/State` + `/StateModel` spelling maps — ISO 32000 §12.5.6.3, Table 174.\n *\n * Known values are wire-stable lowercase (the house vocabulary — same\n * rationale as `AnnotationReplyType` / `AnnotationBorderStyle`); the PDF\n * stores the capitalized Table 174 spellings. Unknown values — custom\n * Acrobat state models and their states — pass through VERBATIM in both\n * directions, so foreign review workflows survive a round trip.\n */\n\nconst STATE_MODEL_TO_PDF: Record<string, string> = {\n review: 'Review',\n marked: 'Marked',\n};\n\nconst STATE_TO_PDF: Record<string, string> = {\n accepted: 'Accepted',\n rejected: 'Rejected',\n cancelled: 'Cancelled',\n completed: 'Completed',\n none: 'None',\n marked: 'Marked',\n unmarked: 'Unmarked',\n};\n\nconst PDF_TO_STATE_MODEL: Record<string, string> = invert(STATE_MODEL_TO_PDF);\nconst PDF_TO_STATE: Record<string, string> = invert(STATE_TO_PDF);\n\nexport function stateModelToPdf(value: string): string {\n return STATE_MODEL_TO_PDF[value] ?? value;\n}\n\nexport function stateModelFromPdf(value: string): string {\n return PDF_TO_STATE_MODEL[value] ?? value;\n}\n\nexport function stateToPdf(value: string): string {\n return STATE_TO_PDF[value] ?? value;\n}\n\nexport function stateFromPdf(value: string): string {\n return PDF_TO_STATE[value] ?? value;\n}\n\nfunction invert(map: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(map).map(([wire, pdf]) => [pdf, wire]));\n}\n","import type {\n AnnotationBase,\n Color,\n NoteIcon,\n TextAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { NOTE_NAME_TO_ICON } from '../annotationIcon';\nimport { stateFromPdf, stateModelFromPdf } from '../annotationState';\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readAnnotString,\n readAnnotName,\n} from './annotationReadPrimitives';\n\n/** Default `/C` — matches the generator's yellow note fill and the writer default. */\nconst DEFAULT_NOTE_COLOR: Color = { r: 255, g: 255, b: 0 };\n\n/** An absent or foreign `/Name` reads as 'note' (ISO 32000 §12.5.6.4 default). */\nconst DEFAULT_NOTE_ICON: NoteIcon = 'note';\n\nexport function readText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): TextAnnotationDTO {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...DEFAULT_NOTE_COLOR };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const icon = NOTE_NAME_TO_ICON[readAnnotName(fn, mem, annotPtr) ?? ''] ?? DEFAULT_NOTE_ICON;\n // /State + /StateModel (ISO 32000 §12.5.6.3): faithful read — `null` iff\n // the key is absent. Known Table 174 spellings normalize to the lowercase\n // wire vocabulary; custom state models pass through verbatim. ISO\n // defaulting (a model with no explicit state) is a composer concern.\n const stateRaw = readAnnotString(fn, mem, annotPtr, 'State');\n const stateModelRaw = readAnnotString(fn, mem, annotPtr, 'StateModel');\n\n return {\n ...base,\n subtype: 'text',\n icon,\n color,\n opacity,\n state: stateRaw === null ? null : stateFromPdf(stateRaw),\n stateModel: stateModelRaw === null ? null : stateModelFromPdf(stateModelRaw),\n };\n}\n","import type {\n AnnotationBase,\n Color,\n HighlightAnnotationDTO,\n PdfQuad,\n SquigglyAnnotationDTO,\n StrikeoutAnnotationDTO,\n UnderlineAnnotationDTO,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n readAnnotColor,\n readAnnotOpacity,\n readIntent,\n readQuadPoints,\n} from './annotationReadPrimitives';\nimport { strikeoutIntentFromName } from '../textEditIntent';\n\nconst DEFAULT_HIGHLIGHT_COLOR: Color = { r: 255, g: 255, b: 0 };\nconst DEFAULT_TEXT_MARKUP_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/**\n * Shared reader for the four text-markup subtypes. Wires color, opacity,\n * and quadPoints; the caller fills in the `subtype` literal so the\n * result matches the requested DTO shape.\n */\nexport function readTextMarkupExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n fallbackColor: Color = DEFAULT_TEXT_MARKUP_COLOR,\n): {\n color: Color;\n opacity: number;\n quadPoints: PdfQuad[];\n} {\n const color = readAnnotColor(fn, mem, annotPtr) ?? { ...fallbackColor };\n const ca = readAnnotOpacity(fn, mem, annotPtr);\n const opacity = ca == null ? 1 : Math.max(0, Math.min(1, ca));\n const quadPoints = readQuadPoints(fn, mem, annotPtr);\n return { color, opacity, quadPoints };\n}\n\nexport function readHighlight(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): HighlightAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr, DEFAULT_HIGHLIGHT_COLOR);\n return { ...base, subtype: 'highlight', ...extras };\n}\n\nexport function readUnderline(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): UnderlineAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr);\n return { ...base, subtype: 'underline', ...extras };\n}\n\nexport function readSquiggly(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): SquigglyAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr);\n return { ...base, subtype: 'squiggly', ...extras };\n}\n\nexport function readStrikeout(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): StrikeoutAnnotationDTO {\n const extras = readTextMarkupExtras(fn, mem, annotPtr);\n const intent = strikeoutIntentFromName(readIntent(fn, mem, annotPtr));\n return { ...base, subtype: 'strikeout', intent, ...extras };\n}\n","import type { AnnotationBase, UnsupportedAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotString } from './annotationReadPrimitives';\n\n/**\n * Forward-compat fallback. Captures the raw subtype code (and best-effort\n * subtype name from the dict) so debugging information survives across\n * the wire even when no per-subtype reader has been wired yet.\n */\nexport function readUnsupported(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n rawSubtypeCode: number,\n): UnsupportedAnnotationDTO {\n const rawSubtypeName = readAnnotString(fn, mem, annotPtr, 'Subtype');\n return {\n ...base,\n subtype: 'unsupported',\n rawSubtypeCode,\n rawSubtypeName,\n };\n}\n","import type {\n AnnotationBase,\n PolygonAnnotationDTO,\n PolylineAnnotationDTO,\n VertexAnnotationFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readBorderEffect, readLineEndings, readVertices } from './annotationReadPrimitives';\nimport { readFilledStyleExtras } from './readStyle';\nimport { readAnnotationRotation } from './readAnnotationTransformMetadata';\n\n/**\n * Shared reader for the two vertex subtypes (polygon/polyline). Reads the\n * common stroke/fill styling plus the `/Vertices` point list; each caller\n * layers its own subtype-specific extras (polygon: cloudy border; polyline:\n * line endings) and the `subtype` literal.\n */\nexport function readVertexExtras(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): VertexAnnotationFields {\n const rotation = readAnnotationRotation(fn, mem, annotPtr);\n return {\n ...readFilledStyleExtras(fn, mem, annotPtr),\n vertices: readVertices(fn, mem, annotPtr),\n ...(rotation != null ? { rotation } : {}),\n };\n}\n\nexport function readPolygon(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): PolygonAnnotationDTO {\n return {\n ...base,\n subtype: 'polygon',\n ...readVertexExtras(fn, mem, annotPtr),\n // Absent /BE reads as explicit `null` (never omission), so a read DTO\n // compares structurally against a clearing patch.\n cloudyIntensity: readBorderEffect(fn, mem, annotPtr),\n };\n}\n\nexport function readPolyline(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): PolylineAnnotationDTO {\n return {\n ...base,\n subtype: 'polyline',\n ...readVertexExtras(fn, mem, annotPtr),\n lineEndings: readLineEndings(fn, mem, annotPtr),\n };\n}\n","import type { AnnotationBase, Color, WidgetAnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport { type PdfFunctions, type PdfRuntimeMemory, type Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratchN } from '../../../../runtime/memory/scratch';\nimport { readI32 } from '../../../../runtime/memory/structs';\nimport { standardFontFromCode } from '../standardFont';\nimport { textAlignmentFromCode } from '../textAlignment';\nimport { readDefaultAppearance, readTextAlignment } from './annotationReadPrimitives';\nimport { readBorderFields } from './readStyle';\n\nconst MK_BORDER_COLOR = 0; // EPDF_MK_COLOR_BC\nconst MK_BACKGROUND_COLOR = 1; // EPDF_MK_COLOR_BG\nconst I32_BYTES = 4;\n\nfunction readMKColor(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n which: number,\n): Color | null {\n return withScratchN(mem, [I32_BYTES, I32_BYTES, I32_BYTES], ([r, g, b]) => {\n if (!fn.EPDFAnnot_GetMKColor(annotPtr, which, r, g, b)) return null;\n return {\n r: readI32(mem, r) & 0xff,\n g: readI32(mem, g) & 0xff,\n b: readI32(mem, b) & 0xff,\n };\n });\n}\n\n/**\n * Widget-plane read: /MK colours, /BS border, /DA text defaults, /Q, and\n * the field join. Field-plane data (value, options, flags) lives on\n * `doc.forms` — join via `fieldObjectNumber`.\n */\nexport function readWidget(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n): WidgetAnnotationDTO {\n const border = readBorderFields(fn, mem, annotPtr);\n const da = readDefaultAppearance(fn, mem, annotPtr);\n return {\n ...base,\n subtype: 'widget',\n color: readMKColor(fn, mem, annotPtr, MK_BORDER_COLOR),\n interiorColor: readMKColor(fn, mem, annotPtr, MK_BACKGROUND_COLOR),\n strokeWidth: border.strokeWidth,\n borderStyle: border.borderStyle,\n ...(da\n ? {\n fontFamily: standardFontFromCode(da.fontCode),\n fontSize: da.fontSize,\n fontColor: da.color,\n }\n : {}),\n textAlign: textAlignmentFromCode(readTextAlignment(fn, annotPtr)),\n // Joined by the caller (joinWidgetFieldNumbers): the /Parent target is\n // a FIELD dictionary, which annotation-plane primitives cannot follow.\n fieldObjectNumber: 0,\n fieldFamily: 'unknown',\n };\n}\n","import type {\n AnnotationBase,\n AnnotationDTO,\n AnnotationSubtype,\n} from '@embedpdf/engine-core/runtime';\nimport { subtypeFromCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AnnotationReadContext } from './annotationReadContext';\nimport { readCaret } from './readCaretAnnotation';\nimport { readFileAttachment } from './readFileAttachmentAnnotation';\nimport { readFreeText } from './readFreeTextAnnotation';\nimport { readInk } from './readInkAnnotation';\nimport { readLine } from './readLineAnnotation';\nimport { readLink } from './readLinkAnnotation';\nimport { readRedact } from './readRedactAnnotation';\nimport { readCircle, readSquare } from './readShapeAnnotation';\nimport { readStamp } from './readStampAnnotation';\nimport { readText } from './readTextAnnotation';\nimport {\n readHighlight,\n readSquiggly,\n readStrikeout,\n readUnderline,\n} from './readTextMarkupAnnotation';\nimport { readUnsupported } from './readUnsupportedAnnotation';\nimport { readPolygon, readPolyline } from './readVertexAnnotation';\nimport { readWidget } from './readWidgetAnnotation';\n\n/**\n * One reader per `AnnotationSubtype`. Each reader produces the DTO type\n * the registry promised: `kinds/<subtype>/dto.ts`. Readers receive the\n * pre-built `AnnotationBase` (identity + flags + rect + dates) so each\n * implementation only has to materialise its own fields, plus the\n * document-scoped `AnnotationReadContext` — most readers ignore it (they\n * work off the `annotPtr` alone); the link reader consumes it.\n *\n * The `unsupported` fallback preserves the raw subtype code so a future\n * reader landing for that subtype can replace it without a wire-format\n * version bump.\n */\nexport type AnnotationSubtypeReader = (\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n base: AnnotationBase,\n rawSubtypeCode: number,\n ctx: AnnotationReadContext,\n) => AnnotationDTO;\n\nconst READER_BY_SUBTYPE: Partial<Record<AnnotationSubtype, AnnotationSubtypeReader>> = {\n highlight: readHighlight,\n underline: readUnderline,\n squiggly: readSquiggly,\n strikeout: readStrikeout,\n circle: readCircle,\n square: readSquare,\n polygon: readPolygon,\n polyline: readPolyline,\n line: readLine,\n link: readLink,\n ink: readInk,\n 'free-text': readFreeText,\n caret: readCaret,\n text: readText,\n stamp: readStamp,\n 'file-attachment': readFileAttachment,\n widget: readWidget,\n redact: readRedact,\n unsupported: readUnsupported,\n};\n\n/**\n * Maps a PDFium subtype code onto the reader that should handle it.\n * Returns the `unsupported` reader for any subtype that doesn't have a\n * dedicated reader yet.\n */\nexport function pickReader(rawSubtypeCode: number): {\n reader: AnnotationSubtypeReader;\n subtype: AnnotationSubtype;\n} {\n const subtype = subtypeFromCode(rawSubtypeCode);\n const reader = READER_BY_SUBTYPE[subtype];\n if (reader) return { reader, subtype };\n return { reader: READER_BY_SUBTYPE.unsupported!, subtype: 'unsupported' };\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../document-session/DocumentSession';\n\ninterface FormModelEntry {\n /** The session mutation sequence the model was built at. */\n seq: number;\n ptr: Ptr;\n}\n\n/**\n * Per-session cache of the native `EPDFForm_LoadModel` snapshot, keyed on\n * the session's mutation sequence.\n *\n * The native model is an immutable, detached snapshot: correct forever,\n * stale after any document mutation. Rebuilding it per call would walk the\n * field tree and sweep every page's /Annots on each read (widget lists on\n * multi-page documents read it constantly); keeping one forever would\n * serve stale values. Version-keying gives exact coherence for free:\n * `DocumentSession.noteMutation()` bumps the sequence on EVERY successful\n * mutation (annotations, pages, metadata, forms — widgets are annotations,\n * so all of them can affect the form model), and the next read rebuilds.\n *\n * The cache also owns the native handle's lifetime: exactly one live model\n * per session, closed before replacement and on session teardown via\n * {@link disposeFormModel}.\n */\nconst cache = new WeakMap<DocumentSession, FormModelEntry>();\n\nexport function acquireFormModel(runtime: PdfRuntimeModule, session: DocumentSession): Ptr {\n const seq = session.mutationSeq();\n const hit = cache.get(session);\n if (hit && hit.seq === seq) {\n return hit.ptr;\n }\n if (hit) {\n runtime.fn.EPDFForm_CloseModel(hit.ptr);\n cache.delete(session);\n }\n const ptr = runtime.fn.EPDFForm_LoadModel(session.requireDocPtr());\n if (ptr === NULL_PTR) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to build form model');\n }\n cache.set(session, { seq, ptr });\n return ptr;\n}\n\n/** Close and forget the session's cached model, if any. */\nexport function disposeFormModel(runtime: PdfRuntimeModule, session: DocumentSession): void {\n const hit = cache.get(session);\n if (!hit) {\n return;\n }\n runtime.fn.EPDFForm_CloseModel(hit.ptr);\n cache.delete(session);\n}\n","import type {\n FormFieldBase,\n FormFieldDTO,\n FormFieldFamily,\n FormFieldOption,\n FormKind,\n FormSnapshot,\n FormWidgetRef,\n ToggleFieldWidget,\n FormValueEntry,\n PdfFieldActions,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readUtf16String, readUtf8String } from '../../../runtime/memory/strings';\nimport { ActionReadBudgetTracker, readActionModel } from '../../actions/ActionModelReader';\n\n// Mirrors EPDF_FORMFIELD_FAMILY_* in public/epdf_form.h.\nexport const FAMILY_BY_CODE: Record<number, FormFieldFamily> = {\n 0: 'unknown',\n 1: 'pushbutton',\n 2: 'checkbox',\n 3: 'radio',\n 4: 'text',\n 5: 'combobox',\n 6: 'listbox',\n 7: 'signature',\n};\n\n// Mirrors EPDF_FORMKIND_* in public/epdf_form.h.\nconst FORM_KIND_BY_CODE: Record<number, FormKind> = {\n 0: 'none',\n 1: 'acroform',\n 2: 'xfa',\n};\n\n// PDF /Ff bits (1-based bit numbers per ISO 32000 Table 226/228/230).\nconst FF_READ_ONLY = 1 << 0;\nconst FF_REQUIRED = 1 << 1;\nconst FF_NO_EXPORT = 1 << 2;\nconst FF_MULTILINE = 1 << 12;\nconst FF_PASSWORD = 1 << 13;\nconst FF_NO_TOGGLE_TO_OFF = 1 << 14;\nconst FF_EDIT = 1 << 18;\nconst FF_MULTI_SELECT = 1 << 21;\nconst FF_COMB = 1 << 24;\nconst FF_RADIOS_IN_UNISON = 1 << 25;\n\nfunction readWide(runtime: PdfRuntimeModule, call: (buf: Ptr, capacity: number) => number): string {\n return readUtf16String(runtime.mem, call) ?? '';\n}\n\nfunction readWideOrNull(\n runtime: PdfRuntimeModule,\n call: (buf: Ptr, capacity: number) => number,\n): string | null {\n return readUtf16String(runtime.mem, call, null);\n}\n\nfunction readToggleWidgets(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n): ToggleFieldWidget[] {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFieldWidgets(model, fieldIndex);\n const widgets: ToggleFieldWidget[] = [];\n for (let w = 0; w < count; w++) {\n widgets.push({\n annotObjectNumber: fn.EPDFForm_GetFieldWidgetObjNum(model, fieldIndex, w),\n pageObjectNumber: fn.EPDFForm_GetFieldWidgetPageObjNum(model, fieldIndex, w),\n onState:\n readUtf8String(runtime.mem, (buf, cap) =>\n fn.EPDFForm_GetFieldWidgetOnState(model, fieldIndex, w, buf, cap),\n ) ?? '',\n exportValue: readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldWidgetExportValue(model, fieldIndex, w, buf, cap),\n ),\n checked: fn.EPDFForm_IsFieldWidgetChecked(model, fieldIndex, w),\n });\n }\n return widgets;\n}\n\nfunction readPlainWidgets(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n): FormWidgetRef[] {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFieldWidgets(model, fieldIndex);\n const widgets: FormWidgetRef[] = [];\n for (let w = 0; w < count; w++) {\n widgets.push({\n annotObjectNumber: fn.EPDFForm_GetFieldWidgetObjNum(model, fieldIndex, w),\n pageObjectNumber: fn.EPDFForm_GetFieldWidgetPageObjNum(model, fieldIndex, w),\n });\n }\n return widgets;\n}\n\nfunction readOptions(runtime: PdfRuntimeModule, model: Ptr, fieldIndex: number): FormFieldOption[] {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFieldOptions(model, fieldIndex);\n const options: FormFieldOption[] = [];\n for (let o = 0; o < count; o++) {\n options.push({\n label: readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldOptionLabel(model, fieldIndex, o, buf, cap),\n ),\n value: readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldOptionValue(model, fieldIndex, o, buf, cap),\n ),\n selected: fn.EPDFForm_IsFieldOptionSelected(model, fieldIndex, o),\n });\n }\n return options;\n}\n\n/** Read one field of the native model into its per-family DTO. */\nexport function readFieldAt(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n docPtr: Ptr,\n actionBudget = new ActionReadBudgetTracker(),\n): FormFieldDTO {\n const { fn } = runtime;\n const fieldObjectNumber = fn.EPDFForm_GetFieldObjNum(model, fieldIndex);\n const name = readWide(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldName(model, fieldIndex, buf, cap),\n );\n const rawFlags = fn.EPDFForm_GetFieldFlags(model, fieldIndex);\n const family = FAMILY_BY_CODE[fn.EPDFForm_GetFieldFamily(model, fieldIndex)] ?? 'unknown';\n const valueEntry = readValueEntry(runtime, model, fieldIndex, false);\n const defaultValueEntry = readValueEntry(runtime, model, fieldIndex, true);\n const actions = readFieldActions(runtime, model, fieldIndex, docPtr, actionBudget);\n\n const base: FormFieldBase = {\n ref:\n fieldObjectNumber > 0 ? { kind: 'objectNumber', fieldObjectNumber } : { kind: 'fqn', name },\n fieldObjectNumber,\n name,\n family,\n origin: fn.EPDFForm_GetFieldOrigin(model, fieldIndex) === 1 ? 'recovered' : 'acroform',\n flags: {\n readOnly: (rawFlags & FF_READ_ONLY) !== 0,\n required: (rawFlags & FF_REQUIRED) !== 0,\n noExport: (rawFlags & FF_NO_EXPORT) !== 0,\n raw: rawFlags,\n },\n alternateName: readWideOrNull(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldAlternateName(model, fieldIndex, buf, cap),\n ),\n mappingName: readWideOrNull(runtime, (buf, cap) =>\n fn.EPDFForm_GetFieldMappingName(model, fieldIndex, buf, cap),\n ),\n valueEntry,\n defaultValueEntry,\n ...(actions ? { actions } : {}),\n widgets: [],\n };\n const scalarValue = entryScalar(valueEntry);\n const scalarDefault = entryScalar(defaultValueEntry);\n\n switch (family) {\n case 'text': {\n const maxLen = fn.EPDFForm_GetFieldMaxLen(model, fieldIndex);\n return {\n ...base,\n family,\n value: scalarValue,\n defaultValue: scalarDefault,\n maxLength: maxLen > 0 ? maxLen : null,\n multiline: (rawFlags & FF_MULTILINE) !== 0,\n password: (rawFlags & FF_PASSWORD) !== 0,\n comb: (rawFlags & FF_COMB) !== 0,\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n case 'checkbox': {\n const widgets = readToggleWidgets(runtime, model, fieldIndex);\n return {\n ...base,\n family,\n checked: widgets.some((w) => w.checked),\n exportValue: widgets[0]?.exportValue ?? 'Yes',\n widgets,\n };\n }\n case 'radio': {\n const widgets = readToggleWidgets(runtime, model, fieldIndex);\n return {\n ...base,\n family,\n value: widgets.find((widget) => widget.checked)?.exportValue ?? 'Off',\n radiosInUnison: (rawFlags & FF_RADIOS_IN_UNISON) !== 0,\n noToggleToOff: (rawFlags & FF_NO_TOGGLE_TO_OFF) !== 0,\n widgets,\n };\n }\n case 'combobox': {\n return {\n ...base,\n family,\n value: scalarValue,\n defaultValue: scalarDefault,\n edit: (rawFlags & FF_EDIT) !== 0,\n options: readOptions(runtime, model, fieldIndex),\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n case 'listbox': {\n const options = readOptions(runtime, model, fieldIndex);\n return {\n ...base,\n family,\n selectedValues: options.filter((o) => o.selected).map((o) => o.value),\n multiSelect: (rawFlags & FF_MULTI_SELECT) !== 0,\n options,\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n case 'pushbutton':\n case 'signature': {\n return { ...base, family, widgets: readPlainWidgets(runtime, model, fieldIndex) };\n }\n default: {\n return {\n ...base,\n family: 'unknown',\n rawValue:\n valueEntry.kind === 'array' ? valueEntry.values.join(',') : entryScalar(valueEntry),\n widgets: readPlainWidgets(runtime, model, fieldIndex),\n };\n }\n }\n}\n\n/** Read the whole native model into a detached {@link FormSnapshot}. */\nexport function readFormSnapshot(runtime: PdfRuntimeModule, model: Ptr, docPtr: Ptr): FormSnapshot {\n const { fn } = runtime;\n const count = fn.EPDFForm_CountFields(model);\n const fields: FormFieldDTO[] = [];\n const actionBudget = new ActionReadBudgetTracker();\n for (let i = 0; i < count; i++) {\n fields.push(readFieldAt(runtime, model, i, docPtr, actionBudget));\n }\n const calculationOrder: FormSnapshot['calculationOrder'] = [];\n const calculationCount = fn.EPDFForm_CountCalculationOrder(model);\n for (let index = 0; index < calculationCount; index++) {\n const fieldIndex = fn.EPDFForm_GetCalculationOrderFieldIndex(model, index);\n calculationOrder.push(\n fieldIndex >= 0 && fieldIndex < fields.length ? fields[fieldIndex].ref : null,\n );\n }\n return {\n formKind: FORM_KIND_BY_CODE[fn.EPDFForm_GetFormKind(model)] ?? 'none',\n needsAppearances: fn.EPDFForm_GetNeedAppearances(model),\n fields,\n calculationOrder,\n };\n}\n\nfunction readValueEntry(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n isDefault: boolean,\n): FormValueEntry {\n const { fn } = runtime;\n const kind = isDefault\n ? fn.EPDFForm_GetFieldDefaultValueKind(model, fieldIndex)\n : fn.EPDFForm_GetFieldValueKind(model, fieldIndex);\n if (kind === 0) return { kind: 'none' };\n if (kind === 3) return { kind: 'unsupported' };\n if (kind !== 1 && kind !== 2) return { kind: 'unsupported' };\n const count = isDefault\n ? fn.EPDFForm_CountFieldDefaultValues(model, fieldIndex)\n : fn.EPDFForm_CountFieldValues(model, fieldIndex);\n const values: string[] = [];\n for (let index = 0; index < count; index++) {\n values.push(\n readWide(runtime, (buf, capacity) =>\n isDefault\n ? fn.EPDFForm_GetFieldDefaultValueAt(model, fieldIndex, index, buf, capacity)\n : fn.EPDFForm_GetFieldValueAt(model, fieldIndex, index, buf, capacity),\n ),\n );\n }\n return kind === 1 ? { kind: 'scalar', value: values[0] ?? '' } : { kind: 'array', values };\n}\n\nfunction entryScalar(entry: FormValueEntry): string {\n if (entry.kind === 'scalar') return entry.value;\n if (entry.kind === 'array') return entry.values[0] ?? '';\n return '';\n}\n\nfunction readFieldActions(\n runtime: PdfRuntimeModule,\n model: Ptr,\n fieldIndex: number,\n docPtr: Ptr,\n budget: ActionReadBudgetTracker,\n): PdfFieldActions | undefined {\n const { fn, mem } = runtime;\n const entries = [\n ['keystroke', 0],\n ['format', 1],\n ['validate', 2],\n ['calculate', 3],\n ] as const;\n const actions: PdfFieldActions = {};\n for (const [key, event] of entries) {\n const action = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFForm_GetFieldActionModel(model, fieldIndex, event),\n budget,\n );\n if (action) actions[key] = action;\n }\n return Object.keys(actions).length > 0 ? actions : undefined;\n}\n","import type { AnnotationDTO } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\n// Cross-feature read into the forms model cache: the widget<->field join is\n// form-tree knowledge, and the version-keyed cache makes it O(1) between\n// mutations. No module cycle: the cache imports nothing from annotations.\nimport { acquireFormModel } from '../../../forms/internal/formModelCache';\nimport { FAMILY_BY_CODE } from '../../../forms/internal/readFormSnapshot';\n\n/**\n * Resolve the owning field's object number for a widget annotation, or 0\n * when unattached. (The /Parent of a widget is a FIELD dictionary - not an\n * annotation - so FPDFAnnot_GetLinkedAnnot cannot follow it; the reconciled\n * form model is the authoritative join.)\n */\nexport function resolveWidgetFieldObjectNumber(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n annotObjectNumber: number,\n): number {\n if (annotObjectNumber <= 0) return 0;\n const model = acquireFormModel(runtime, session);\n const fieldIndex = runtime.fn.EPDFForm_GetFieldIndexForWidget(model, annotObjectNumber);\n if (fieldIndex < 0) return 0;\n return runtime.fn.EPDFForm_GetFieldObjNum(model, fieldIndex);\n}\n\n/** Stamp `fieldObjectNumber` onto every widget DTO in a freshly read list. */\nexport function joinWidgetFieldNumbers(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n annotations: AnnotationDTO[],\n): void {\n for (const annotation of annotations) {\n if (annotation.subtype !== 'widget') continue;\n if (annotation.ref.kind !== 'objectNumber') continue;\n const model = acquireFormModel(runtime, session);\n const fieldIndex = runtime.fn.EPDFForm_GetFieldIndexForWidget(\n model,\n annotation.ref.annotObjectNumber,\n );\n if (fieldIndex < 0) {\n annotation.fieldObjectNumber = 0;\n annotation.fieldFamily = 'unknown';\n continue;\n }\n annotation.fieldObjectNumber = runtime.fn.EPDFForm_GetFieldObjNum(model, fieldIndex);\n annotation.fieldFamily =\n FAMILY_BY_CODE[runtime.fn.EPDFForm_GetFieldFamily(model, fieldIndex)] ?? 'unknown';\n }\n}\n","import type {\n AnnotationIdentityQuality,\n AnnotationRef,\n PageObjectNumber,\n RevisionToken,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotString } from './annotationReadPrimitives';\n\nexport interface AnnotationIdentity {\n ref: AnnotationRef;\n identityQuality: AnnotationIdentityQuality;\n nm: string | null;\n}\n\n/**\n * Decides which `AnnotationRef` form to expose on the wire and the\n * `identityQuality` flag.\n *\n * Order:\n * 1. `EPDFAnnot_GetObjectNumber(annot)` - if `> 0`, use `objectNumber`.\n * Always durable.\n * 2. /NM - if present and non-empty, use `nm`. Always durable.\n * 3. Fallback: `index + revision`. Always weak. The revision must be\n * provided by the caller (sourced from the live `RevisionAuthority`).\n */\nexport function readAnnotationIdentity(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n index: number,\n revision: RevisionToken,\n): AnnotationIdentity {\n const objectNumber = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n const nm = readAnnotString(fn, mem, annotPtr, 'NM');\n\n if (objectNumber > 0) {\n return {\n ref: {\n kind: 'objectNumber',\n pageObjectNumber,\n annotObjectNumber: objectNumber,\n },\n identityQuality: 'durable',\n nm: nm ?? null,\n };\n }\n\n if (nm && nm.length > 0) {\n return {\n ref: { kind: 'nm', pageObjectNumber, nm },\n identityQuality: 'durable',\n nm,\n };\n }\n\n return {\n ref: { kind: 'index', pageObjectNumber, index, revision },\n identityQuality: 'weak',\n nm: nm ?? null,\n };\n}\n","import type { AnnotationReplyType } from '@embedpdf/engine-core/runtime';\n\n/**\n * `/RT` (reply type) codec between the wire-stable {@link AnnotationReplyType}\n * strings and PDFium's `FPDF_ANNOT_REPLY_TYPE` integer codes (see\n * `public/fpdf_annot.h`). Kept in engine-services so engine-core stays\n * PDFium-free.\n *\n * 0 FPDF_ANNOT_RT_UNKNOWN (RT absent / unrecognized)\n * 1 FPDF_ANNOT_RT_REPLY /R — the ISO default when /RT is missing\n * 2 FPDF_ANNOT_RT_GROUP /Group\n */\nexport const RT_UNKNOWN = 0;\nexport const RT_REPLY = 1;\nexport const RT_GROUP = 2;\n\n/**\n * Map a PDFium reply-type code to the wire string, GATED on the presence\n * of `/IRT`. PDFium's `EPDFAnnot_GetReplyType` returns `RT_REPLY` even\n * when there is no `/IRT` (it reports the `/RT` default in isolation), so\n * callers must only invoke this for annotations that actually carry an\n * `/IRT` link. `RT_GROUP` -> `'group'`; everything else -> `'reply'`.\n */\nexport function replyTypeFromCode(code: number): AnnotationReplyType {\n return code === RT_GROUP ? 'group' : 'reply';\n}\n\n/** Map the wire string to the PDFium code written via `EPDFAnnot_SetReplyType`. */\nexport function replyTypeToCode(replyType: AnnotationReplyType): number {\n return replyType === 'group' ? RT_GROUP : RT_REPLY;\n}\n","import type {\n AnnotationRef,\n AnnotationReplyType,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotString } from './annotationReadPrimitives';\nimport { replyTypeFromCode } from '../replyType';\n\nexport interface AnnotationRelationship {\n inReplyTo: AnnotationRef | null;\n replyType: AnnotationReplyType | null;\n}\n\nconst NO_RELATIONSHIP: AnnotationRelationship = { inReplyTo: null, replyType: null };\n\n/**\n * Read the `/IRT` + `/RT` relationship edge of an annotation.\n *\n * `/IRT` is an indirect reference to the parent annotation, which (per ISO\n * 32000 §12.5.6.2) lives on the SAME page — so we surface the parent with\n * the same `pageObjectNumber` and the same identity precedence the rest of\n * the engine uses (objectNumber, then `/NM`). We do NOT fall back to an\n * index ref: an `/IRT` target is by construction an indirect object, so its\n * object number is always available. In the pathological case where neither\n * an object number nor an `/NM` can be read (a malformed direct-object\n * target), we report no relationship rather than an unaddressable parent —\n * keeping the invariant `replyType === null` iff `inReplyTo === null`.\n *\n * `/RT` is read via `EPDFAnnot_GetReplyType`, which returns the `/R` default\n * when `/RT` is absent; we only consult it when `/IRT` is present, so a\n * top-level annotation never spuriously reports `'reply'`.\n */\nexport function readAnnotationRelationship(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n): AnnotationRelationship {\n const parentPtr = fn.FPDFAnnot_GetLinkedAnnot(annotPtr, 'IRT');\n if (!parentPtr) return NO_RELATIONSHIP;\n\n try {\n const inReplyTo = readParentRef(fn, mem, parentPtr, pageObjectNumber);\n if (!inReplyTo) return NO_RELATIONSHIP;\n return { inReplyTo, replyType: replyTypeFromCode(fn.EPDFAnnot_GetReplyType(annotPtr)) };\n } finally {\n fn.FPDFPage_CloseAnnot(parentPtr);\n }\n}\n\nfunction readParentRef(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n parentPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n): AnnotationRef | null {\n const objectNumber = fn.EPDFAnnot_GetObjectNumber(parentPtr);\n if (objectNumber > 0) {\n return { kind: 'objectNumber', pageObjectNumber, annotObjectNumber: objectNumber };\n }\n const nm = readAnnotString(fn, mem, parentPtr, 'NM');\n if (nm && nm.length > 0) {\n return { kind: 'nm', pageObjectNumber, nm };\n }\n return null;\n}\n","import type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\n/**\n * Decoded /EMBD_Metadata dictionary as seen from a single annotation.\n *\n * Mirrors the schema written by `writers/annotations/embed-metadata.ts`.\n * Each field is optional because:\n * - older annotations (pre-cloud, or imported from other tools) have no\n * /EMBD_Metadata at all,\n * - the dict may be partially populated (e.g. only UserID, no GroupID),\n * - future schema versions may add or drop fields.\n *\n * Readers tolerate missing fields by returning `undefined`; callers\n * decide how to render the absence (typically \"unknown author\" /\n * \"no group\").\n */\nexport interface EmbedMetadata {\n schemaVersion?: number;\n userId?: string;\n groupId?: string;\n createdBy?: string;\n updatedBy?: string;\n}\n\n/**\n * Read /EMBD_Metadata from an annotation, if present. Returns `null`\n * (not an empty object) when the annotation has no EMBD_Metadata\n * dictionary at all — the caller can distinguish \"no metadata\" from\n * \"metadata with only some fields set\".\n *\n * Uses the same UTF-16LE two-pass read pattern as `readAnnotString` in\n * `./util.ts` so a future change to the underlying memory helpers\n * propagates uniformly.\n */\nexport function readEmbedMetadata(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n): EmbedMetadata | null {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) return null;\n\n const schemaVersion = readMetaNumber(fn, mem, annotPtr, 'SchemaVersion');\n const userId = readMetaString(fn, mem, annotPtr, 'UserID');\n const groupId = readMetaString(fn, mem, annotPtr, 'GroupID');\n const createdBy = readMetaString(fn, mem, annotPtr, 'CreatedBy');\n const updatedBy = readMetaString(fn, mem, annotPtr, 'UpdatedBy');\n\n const out: EmbedMetadata = {};\n if (schemaVersion !== undefined) out.schemaVersion = schemaVersion;\n if (userId !== undefined) out.userId = userId;\n if (groupId !== undefined) out.groupId = groupId;\n if (createdBy !== undefined) out.createdBy = createdBy;\n if (updatedBy !== undefined) out.updatedBy = updatedBy;\n return out;\n}\n\nfunction readMetaString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n): string | undefined {\n // Two-pass UTF-16LE read mirroring readAnnotString:\n // pass 1: NULL_PTR + 0 → returns required byte count (incl. null\n // terminator, so an empty string returns 2)\n // pass 2: alloc buf, fill it, decode\n const len = fn.EPDFAnnot_GetEmbedMetadataString(annotPtr, key, NULL_PTR, 0);\n if (len <= 0) return undefined;\n if (len === 2) return '';\n\n const buf = mem.alloc(len);\n try {\n const written = fn.EPDFAnnot_GetEmbedMetadataString(annotPtr, key, buf, len);\n if (written <= 0) return undefined;\n return mem.readU16String(buf);\n } finally {\n mem.free(buf);\n }\n}\n\nfunction readMetaNumber(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n): number | undefined {\n const buf = mem.alloc(4); // float\n try {\n const ok = fn.EPDFAnnot_GetEmbedMetadataNumber(annotPtr, key, buf);\n if (!ok) return undefined;\n return Number(mem.peek(buf, 'f32'));\n } finally {\n mem.free(buf);\n }\n}\n","import type { BlendMode } from '@embedpdf/engine-core/runtime';\n\n/** Explicit wire-domain ↔ PDFium `FPDF_BLENDMODE` mapping. */\nexport function blendModeToCode(mode: BlendMode): number {\n switch (mode) {\n case 'normal':\n return 0;\n case 'multiply':\n return 1;\n case 'screen':\n return 2;\n case 'overlay':\n return 3;\n case 'darken':\n return 4;\n case 'lighten':\n return 5;\n case 'color-dodge':\n return 6;\n case 'color-burn':\n return 7;\n case 'hard-light':\n return 8;\n case 'soft-light':\n return 9;\n case 'difference':\n return 10;\n case 'exclusion':\n return 11;\n case 'hue':\n return 12;\n case 'saturation':\n return 13;\n case 'color':\n return 14;\n case 'luminosity':\n return 15;\n }\n}\n\nexport function blendModeFromCode(code: number): BlendMode {\n switch (code) {\n case 1:\n return 'multiply';\n case 2:\n return 'screen';\n case 3:\n return 'overlay';\n case 4:\n return 'darken';\n case 5:\n return 'lighten';\n case 6:\n return 'color-dodge';\n case 7:\n return 'color-burn';\n case 8:\n return 'hard-light';\n case 9:\n return 'soft-light';\n case 10:\n return 'difference';\n case 11:\n return 'exclusion';\n case 12:\n return 'hue';\n case 13:\n return 'saturation';\n case 14:\n return 'color';\n case 15:\n return 'luminosity';\n default:\n return 'normal';\n }\n}\n","import type {\n AnnotationBase,\n PageObjectNumber,\n RevisionToken,\n PdfAnnotationActions,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readAnnotFlags, readAnnotRect, readAnnotString } from './annotationReadPrimitives';\nimport { readAnnotationIdentity } from './readAnnotationIdentity';\nimport { readAnnotationRelationship } from './readAnnotationRelationship';\nimport { readEmbedMetadata } from './readEmbedMetadata';\nimport { blendModeFromCode } from '../blendMode';\nimport { pdfDateToIso } from '../../../../shared/pdf-date';\nimport { ActionReadBudgetTracker, readActionModel } from '../../../actions/ActionModelReader';\n\n/**\n * Reads the wire shell every annotation DTO carries: identity, flags,\n * rect, contents, author, dates. No subtype-specific fields. The\n * per-subtype reader builds its DTO by extending this with its own\n * fields and `subtype: '...'` discriminator.\n */\nexport function readAnnotationBase(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n index: number,\n revision: RevisionToken,\n actionBudget = new ActionReadBudgetTracker(),\n): AnnotationBase {\n const identity = readAnnotationIdentity(fn, mem, annotPtr, pageObjectNumber, index, revision);\n const rect = readAnnotRect(fn, mem, annotPtr);\n const flags = readAnnotFlags(fn, annotPtr);\n const contents = readAnnotString(fn, mem, annotPtr, 'Contents');\n const subject = readAnnotString(fn, mem, annotPtr, 'Subj');\n const author = readAnnotString(fn, mem, annotPtr, 'T');\n const createdRaw = readAnnotString(fn, mem, annotPtr, 'CreationDate');\n const modifiedRaw = readAnnotString(fn, mem, annotPtr, 'M');\n const blendMode = blendModeFromCode(fn.EPDFAnnot_GetBlendMode(annotPtr));\n // EmbedPDF /EMBD_Metadata is optional; absent for legacy or anonymous\n // annotations. We spread the present fields into the DTO so the wire\n // never carries explicit `undefined` keys.\n const embd = readEmbedMetadata(fn, mem, annotPtr);\n const relationship = readAnnotationRelationship(fn, mem, annotPtr, pageObjectNumber);\n const actions = readAnnotationActions(fn, mem, docPtr, annotPtr, actionBudget);\n\n return {\n ref: identity.ref,\n pageObjectNumber,\n index,\n identityQuality: identity.identityQuality,\n nm: identity.nm,\n flags,\n rect,\n contents,\n subject,\n author,\n created: createdRaw ? pdfDateToIso(createdRaw) : null,\n modified: modifiedRaw ? pdfDateToIso(modifiedRaw) : null,\n blendMode,\n inReplyTo: relationship.inReplyTo,\n replyType: relationship.replyType,\n ...(embd?.userId !== undefined ? { userId: embd.userId } : {}),\n ...(embd?.groupId !== undefined ? { groupId: embd.groupId } : {}),\n ...(embd?.createdBy !== undefined ? { createdBy: embd.createdBy } : {}),\n ...(embd?.updatedBy !== undefined ? { updatedBy: embd.updatedBy } : {}),\n ...(actions ? { actions } : {}),\n };\n}\n\nfunction readAnnotationActions(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n annotPtr: Ptr,\n budget: ActionReadBudgetTracker,\n): PdfAnnotationActions | undefined {\n const events = [\n ['activate', 0],\n ['cursorEnter', 1],\n ['cursorExit', 2],\n ['mouseDown', 3],\n ['mouseUp', 4],\n ['focus', 5],\n ['blur', 6],\n ['pageOpen', 7],\n ['pageClose', 8],\n ['pageVisible', 9],\n ['pageInvisible', 10],\n ] as const;\n const actions: PdfAnnotationActions = {};\n for (const [key, event] of events) {\n const action = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFAnnot_GetActionModel(annotPtr, event),\n budget,\n );\n if (action) actions[key] = action;\n }\n return Object.keys(actions).length > 0 ? actions : undefined;\n}\n","import type {\n AnnotationDTO,\n AnnotationListPageSnapshot,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readContextFor } from './annotationReadContext';\nimport { pickReader } from './annotationReaderRegistry';\nimport { joinWidgetFieldNumbers } from './joinWidgetField';\nimport { readAnnotationBase } from './readAnnotationBase';\nimport type { FontRegistrar } from '../../../fonts/FontRegistrar';\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../../../shared/abort';\nimport { ActionReadBudgetTracker } from '../../../actions/ActionModelReader';\n\n/**\n * Shared per-page annotation read loop, used by both read paths. The raw\n * path (off `docPtr`, no `pagePtr`) and the full path (off an acquired\n * `pagePtr`) differ only in how they obtain the annotation count and each\n * `annotPtr`; everything after that — per-subtype dispatch, weak-flag\n * accounting, `pageState` decoration — is identical, so it lives here once.\n *\n * `getAnnotPtrAt(i)` returns the annotation handle at index `i`; this loop\n * always closes it via `FPDFPage_CloseAnnot`. The caller owns acquiring and\n * releasing any enclosing `pagePtr`.\n */\nexport function collectPageAnnotations(input: {\n runtime: PdfRuntimeModule;\n session: DocumentSession;\n pageObjectNumber: PageObjectNumber;\n count: number;\n getAnnotPtrAt: (index: number) => Ptr;\n signal: AbortSignal;\n fonts?: FontRegistrar;\n}): AnnotationListPageSnapshot {\n const { runtime, session, pageObjectNumber, count, getAnnotPtrAt, signal, fonts } = input;\n const { fn, mem } = runtime;\n\n const annotations: AnnotationDTO[] = [];\n let hasWeak = false;\n const revision = session.pageState(pageObjectNumber).revision;\n const actionBudget = new ActionReadBudgetTracker();\n const readCtx = readContextFor(session, fonts);\n\n for (let i = 0; i < count; i++) {\n throwIfAborted(signal);\n const annotPtr = getAnnotPtrAt(i);\n if (!annotPtr) continue;\n try {\n const base = readAnnotationBase(\n fn,\n mem,\n readCtx.docPtr,\n annotPtr,\n pageObjectNumber,\n i,\n revision,\n actionBudget,\n );\n const subtypeCode = fn.FPDFAnnot_GetSubtype(annotPtr);\n const { reader } = pickReader(subtypeCode);\n const dto = reader(fn, mem, annotPtr, base, subtypeCode, readCtx);\n annotations.push(dto);\n if (dto.identityQuality === 'weak') hasWeak = true;\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n joinWidgetFieldNumbers(runtime, session, annotations);\n session.recordWeakFlag(pageObjectNumber, hasWeak);\n return { pageState: session.pageState(pageObjectNumber), annotations };\n}\n","import type { AnnotationListPageSnapshot, PageObjectNumber } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport type { FontRegistrar } from '../fonts/FontRegistrar';\nimport { throwIfAborted } from '../../shared/abort';\nimport { collectPageAnnotations } from './internal/read/collectPageAnnotations';\n\n/**\n * Per-page slow-path reader. Acquires a `pagePtr` from the\n * `PagePtrPool`, dispatches the same per-subtype catalog as the raw\n * reader (via `collectPageAnnotations`), and releases the page on exit.\n *\n * Currently the dispatched readers do not use the `pagePtr` parameter\n * (text-markup is fully readable from the dict). Subtype readers that\n * need form/widget access (e.g. widget) will plug into this code path\n * as they land - the public DTO surface stays the same.\n */\nexport class AnnotationReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n /** This thread's font registry: FreeText faces read back as keys. */\n private readonly fonts?: FontRegistrar,\n ) {}\n\n list(pageObjectNumber: PageObjectNumber, signal: AbortSignal): AnnotationListPageSnapshot {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n return collectPageAnnotations({\n runtime: this.runtime,\n session: this.session,\n pageObjectNumber,\n count,\n getAnnotPtrAt: (i) => fn.FPDFPage_GetAnnot(pagePtr, i),\n signal,\n ...(this.fonts ? { fonts: this.fonts } : {}),\n });\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n}\n","import type {\n PageRaster,\n PageRenderBackground,\n PageRenderViewport,\n PdfRect,\n PdfRotation,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * The ONE place a PDF user-space region becomes a device raster.\n *\n * Every PDFium rasterizer — `PageRenderReader`, `AnnotationAppearanceReader`,\n * and any future one (thumbnails, stamps, flatten) — composes these three\n * pieces and supplies only its own `draw` call. The geometry is a pure affine\n * (the engine twin of the viewer's `Mat2D`/`rotateScaleMatrix`); the bitmap\n * lifecycle (alloc → fill → draw → read back → free) lives in `rasterize`.\n */\n\nconst FPDF_BITMAP_BGRA = 4;\n/** Emit RGBA byte order (vs PDFium's native BGRA) so callers get `rgba8` directly. */\nexport const FPDF_REVERSE_BYTE_ORDER = 0x10;\n\n/** A 2D affine as the same six numbers as the viewer `Mat2D`, CSS `matrix()`, FS_MATRIX. */\nexport type Mat2D = readonly [a: number, b: number, c: number, d: number, e: number, f: number];\n\n/**\n * Map a normalized post-`GetDisplayMatrix()` display-space rect onto an\n * `outW × outH` device bitmap, baking in the caller's viewport rotation.\n *\n * PDFium's page and annotation renderers pre-apply `CPDF_Page::GetDisplayMatrix()`\n * before concatenating the caller matrix. That display matrix has already\n * converted PDF page coordinates (y-up) into bitmap/display coordinates\n * (y-down), so the caller matrix must target that post-display rect.\n */\nexport function displayRectToDeviceMatrix(\n rect: PdfRect,\n rotation: PdfRotation,\n outW: number,\n outH: number,\n): Mat2D {\n const left = rect.left;\n const bottom = rect.bottom;\n const width = rect.right - rect.left;\n const height = rect.top - rect.bottom;\n const sx0 = outW / width;\n const sy0 = outH / height;\n const sx90 = outW / height;\n const sy90 = outH / width;\n\n switch (rotation) {\n case 90:\n return [0, sy90, -sx90, 0, sx90 * (bottom + height), -sy90 * left];\n case 180:\n return [-sx0, 0, 0, -sy0, sx0 * (left + width), sy0 * (bottom + height)];\n case 270:\n return [0, -sy90, sx90, 0, -sx90 * bottom, sy90 * (left + width)];\n case 0:\n return [sx0, 0, 0, sy0, -sx0 * left, -sy0 * bottom];\n }\n}\n\n/**\n * Device pixel size for a region under a rotation + viewport. `width` swaps with\n * height on quarter-turns. Validates the viewport (the public-API contract).\n */\nexport function deviceSize(\n rect: PdfRect,\n rotation: PdfRotation,\n viewport: PageRenderViewport,\n): { width: number; height: number } {\n const rectWidth = rect.right - rect.left;\n const rectHeight = rect.top - rect.bottom;\n const swap = rotation === 90 || rotation === 270;\n const baseWidth = swap ? rectHeight : rectWidth;\n const baseHeight = swap ? rectWidth : rectHeight;\n\n if (viewport.kind === 'width') {\n if (!Number.isFinite(viewport.width) || viewport.width <= 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'render viewport width must be positive');\n }\n const width = Math.max(1, Math.round(viewport.width));\n return { width, height: Math.max(1, Math.round((width * baseHeight) / baseWidth)) };\n }\n\n const scale = viewport.scale ?? 1;\n if (!Number.isFinite(scale) || scale <= 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'render viewport scale must be positive');\n }\n return {\n width: Math.max(1, Math.round(baseWidth * scale)),\n height: Math.max(1, Math.round(baseHeight * scale)),\n };\n}\n\nexport interface RasterizeOptions {\n /** The region to render, in PDF user space — ALREADY normalized by the caller. */\n rect: PdfRect;\n /** Page dimensions in PDF user space, used to mirror PDFium's display matrix. */\n page: { width: number; height: number };\n rotation: PdfRotation;\n viewport: PageRenderViewport;\n background: PageRenderBackground;\n /**\n * Output-pixel budget: reject BEFORE allocating when the computed device\n * size exceeds it (the decode-bomb-guard pattern — the check lives where\n * the allocation happens). PDF page space is effectively unbounded, so a\n * width-bounded request can still explode vertically on degenerate\n * geometry. Optional: LOCAL renders omit it (exactness is the local\n * product promise); server renders carry the deployment policy's budget.\n */\n maxOutputPixels?: number;\n /**\n * Perform the PDFium draw into `bitmapPtr` with the prepared user `matrixPtr`\n * (and `clipPtr`, the full-bitmap clip — annotation renders ignore it). Return\n * false to abort the raster (e.g. the PDFium call failed).\n */\n draw: (bitmapPtr: Ptr, matrixPtr: Ptr, clipPtr: Ptr) => boolean;\n}\n\n/**\n * Owns the whole bitmap lifecycle: allocate the pixel buffer + bitmap + matrix\n * (+ clip), fill the background, run the caller's `draw`, read the pixels back\n * into a `PageRaster`, and free everything. Returns null on a degenerate rect or\n * a failed allocation/draw.\n */\nexport function rasterize(runtime: PdfRuntimeModule, opts: RasterizeOptions): PageRaster | null {\n const { fn, mem } = runtime;\n const { rect, page, rotation, viewport, background, draw } = opts;\n\n // Degenerate (zero/negative area) has no renderable output and would divide by\n // zero in the matrix.\n if (rect.right <= rect.left || rect.top <= rect.bottom) return null;\n\n const displayRect = pdfRectToDisplayRect(rect, page.height);\n const { width, height } = deviceSize(displayRect, rotation, viewport);\n if (opts.maxOutputPixels !== undefined && width * height > opts.maxOutputPixels) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `render output ${width}x${height} exceeds the ${opts.maxOutputPixels}-pixel budget — ` +\n 'request a smaller width (or tiles, once available)',\n );\n }\n const stride = width * 4;\n const bytes = stride * height;\n\n let pixelPtr: Ptr | null = null;\n let bitmapPtr: Ptr | null = null;\n let matrixPtr: Ptr | null = null;\n let clipPtr: Ptr | null = null;\n try {\n pixelPtr = mem.alloc(bytes);\n bitmapPtr = fn.FPDFBitmap_CreateEx(width, height, FPDF_BITMAP_BGRA, pixelPtr, stride);\n if (!bitmapPtr) return null;\n\n fn.FPDFBitmap_FillRect(\n bitmapPtr,\n 0,\n 0,\n width,\n height,\n background === 'transparent' ? 0x00000000 : 0xffffffff,\n );\n\n matrixPtr = mem.alloc(6 * 4);\n pokeMat2D(mem, matrixPtr, displayRectToDeviceMatrix(displayRect, rotation, width, height));\n\n clipPtr = mem.alloc(4 * 4);\n mem.poke(clipPtr, 'f32', 0, 0);\n mem.poke(clipPtr, 'f32', 0, 4);\n mem.poke(clipPtr, 'f32', width, 8);\n mem.poke(clipPtr, 'f32', height, 12);\n\n if (!draw(bitmapPtr, matrixPtr, clipPtr)) return null;\n\n const pixels = mem.readBytes(pixelPtr, bytes);\n return {\n width,\n height,\n stride,\n color: 'rgba8',\n premultipliedAlpha: false,\n data: toExactArrayBuffer(pixels),\n };\n } finally {\n if (bitmapPtr) fn.FPDFBitmap_Destroy(bitmapPtr);\n if (clipPtr) mem.free(clipPtr);\n if (matrixPtr) mem.free(matrixPtr);\n if (pixelPtr) mem.free(pixelPtr);\n }\n}\n\nfunction pdfRectToDisplayRect(rect: PdfRect, pageHeight: number): PdfRect {\n return {\n left: rect.left,\n right: rect.right,\n bottom: pageHeight - rect.top,\n top: pageHeight - rect.bottom,\n };\n}\n\nfunction pokeMat2D(mem: PdfRuntimeModule['mem'], ptr: Ptr, m: Mat2D): void {\n for (let i = 0; i < 6; i++) mem.poke(ptr, 'f32', m[i], i * 4);\n}\n\nfunction toExactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n const out = new Uint8Array(bytes.byteLength);\n out.set(bytes);\n return out.buffer;\n}\n","import type {\n AnnotationAppearanceMode,\n AnnotationAppearanceRaster,\n AnnotationAppearanceRenderOptions,\n AnnotationAppearancesResult,\n PageObjectNumber,\n PageRaster,\n PdfRect,\n PdfRotation,\n} from '@embedpdf/engine-core/runtime';\nimport { normalizePdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { FPDF_REVERSE_BYTE_ORDER, rasterize } from '../render/deviceRaster';\nimport { readAnnotRect, readIntent } from './internal/read/annotationReadPrimitives';\nimport { readAnnotationIdentity } from './internal/read/readAnnotationIdentity';\nimport {\n readAnnotationRotation,\n readAnnotationUnrotatedRect,\n} from './internal/read/readAnnotationTransformMetadata';\nimport { freeTextIntentFromName } from './internal/freeTextIntent';\n\n/** `FPDF_ANNOT_WIDGET` — form-field annotation subtype code. */\nconst ANNOT_SUBTYPE_WIDGET = 20;\n\n/** `FPDF_ANNOT_FREETEXT` — free-text annotation subtype code. */\nconst ANNOT_SUBTYPE_FREETEXT = 3;\n\n/**\n * BOX-family subtypes (free-text 3, square 5, circle 6, stamp 13, caret 14):\n * the kinds whose v3 writers put rotation in the AP `/Matrix` +\n * `/EMBD_Metadata` `/UnrotatedRect`. Only these are eligible for\n * rotation-stripped appearance rendering — vertex kinds\n * (line/polyline/polygon/ink) pre-rotate their geometry, so their rasters must\n * stay on the classic path. This set MUST cover every kind whose reader\n * surfaces the rotation pair: `fromDTO` (plugin-annotation repository) mirrors\n * this exact condition to re-apply the stripped rotation as `apRot`.\n */\nconst BOX_FAMILY_SUBTYPES: ReadonlySet<number> = new Set([3, 5, 6, 13, 14]);\n\n/**\n * Per-appearance output-pixel ceiling (see the clamp in `renderOne`).\n * 16 M px ≈ a 4000² raster ≈ 64 MB of transient RGBA — safely inside the\n * wasm heap for the one-at-a-time batch loop, while a page-sized annotation\n * stays crisp to roughly 5–6× before its appearance starts stretching.\n * Small annotations (the overwhelming majority) never come near it.\n */\nconst APPEARANCE_PIXEL_CLAMP = 16_000_000;\n\n/**\n * Maps an `AnnotationAppearanceMode` onto the PDFium appearance-mode int and\n * the `EPDFAnnot_GetAvailableAppearanceModes` bit it occupies.\n * N -> mode 0 / bit 1, R -> mode 1 / bit 2, D -> mode 2 / bit 4.\n */\nconst APPEARANCE_MODES: ReadonlyArray<{\n name: AnnotationAppearanceMode;\n modeInt: number;\n bit: number;\n}> = [\n { name: 'normal', modeInt: 0, bit: 1 },\n { name: 'rollover', modeInt: 1, bit: 2 },\n { name: 'down', modeInt: 2, bit: 4 },\n];\n\n/**\n * Batch-renders the appearance streams (`/AP`) of every annotation on a page,\n * one bitmap per requested mode. Ported from the v2 PDFium engine's\n * `renderPageAnnotationsRaw` / `renderSingleAnnotAppearance`, but expressed in\n * PDF user space and against the `PdfRuntimeModule` (`fn` + `mem`).\n *\n * Each appearance bitmap is sized to its annotation's `/Rect` scaled by\n * `options.scale`. The shared raster helper handles PDFium's display matrix\n * convention, so this reader stays in normalized PDF page coordinates.\n */\nexport class AnnotationAppearanceReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n render(\n pageObjectNumber: PageObjectNumber,\n options: AnnotationAppearanceRenderOptions,\n signal: AbortSignal,\n ): AnnotationAppearancesResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n const scale = normalizeScale(options.scale);\n const rotation = (options.rotation ?? 0) as PdfRotation;\n const modes = resolveModes(options.modes);\n const revision = this.session.pageState(pageObjectNumber).revision;\n\n const appearances: AnnotationAppearanceRaster[] = [];\n\n try {\n const page = {\n width: fn.FPDF_GetPageWidthF(pagePtr),\n height: fn.FPDF_GetPageHeightF(pagePtr),\n };\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n for (let i = 0; i < count; i++) {\n throwIfAborted(signal);\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, i);\n if (!annotPtr) continue;\n\n try {\n const available = fn.EPDFAnnot_GetAvailableAppearanceModes(annotPtr);\n // Skip annotations without any /AP sub-dictionary. Mirrors v2.\n if (!available) continue;\n\n const identity = readAnnotationIdentity(fn, mem, annotPtr, pageObjectNumber, i, revision);\n // Rotation-stripped rendering (see AnnotationRender.ts) applies ONLY\n // where the rotation demonstrably lives in the AP Matrix: a BOX-family\n // kind carrying BOTH `/EMBD_Metadata` `/Rotation` and `/UnrotatedRect`.\n // There the raster renders flat, `rect` is the logical unrotated box,\n // and the DTO's `rotation` (same two fields, surfaced by the box\n // readers) is the consumer's view transform. Everything else — vertex\n // kinds (rotation pre-baked into their geometry), foreign PDFs with\n // arbitrary AP matrices — renders on the classic path, placed by\n // `/Rect`, bit-identical to before.\n // A free-text CALLOUT is excluded even with both fields present: only\n // its text box tilts, via an INLINE `cm` mid-stream (the leader stays\n // page-space), so the form `/Matrix` is identity — nothing to strip.\n const subtypeCode = fn.FPDFAnnot_GetSubtype(annotPtr);\n const isCallout =\n subtypeCode === ANNOT_SUBTYPE_FREETEXT &&\n freeTextIntentFromName(readIntent(fn, mem, annotPtr)) === 'free-text-callout';\n const stripRotation =\n BOX_FAMILY_SUBTYPES.has(subtypeCode) &&\n !isCallout &&\n readAnnotationRotation(fn, mem, annotPtr) !== undefined;\n const unrotatedRect = stripRotation\n ? readAnnotationUnrotatedRect(fn, mem, annotPtr)\n : undefined;\n // Normalize once at the read boundary — the wire `rect` and the render\n // matrix both rely on the normalized invariant.\n const rect = normalizePdfRect(unrotatedRect ?? readAnnotRect(fn, mem, annotPtr));\n\n for (const mode of modes) {\n if (!(available & mode.bit)) continue;\n const raster = this.renderOne(\n pagePtr,\n annotPtr,\n mode.modeInt,\n rect,\n page,\n rotation,\n scale,\n unrotatedRect !== undefined,\n options.maxOutputPixels,\n );\n if (!raster) continue;\n appearances.push({\n ref: identity.ref,\n mode: mode.name,\n rect,\n raster,\n });\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n return { pageState: this.session.pageState(pageObjectNumber), appearances };\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n /**\n * Render a single annotation appearance into its own raster. Returns `null`\n * when the mode has no appearance stream (after an optional form-field AP\n * generation fallback) or the render fails.\n */\n private renderOne(\n pagePtr: Ptr,\n annotPtr: Ptr,\n modeInt: number,\n rect: PdfRect,\n page: { width: number; height: number },\n rotation: PdfRotation,\n scale: number,\n stripRotation: boolean,\n maxOutputPixels?: number,\n ): PageRaster | null {\n const { fn } = this.runtime;\n\n if (!fn.EPDFAnnot_HasAppearanceStream(annotPtr, modeInt)) {\n // Form widgets frequently ship without a baked /AP. Generate one on the\n // fly (same fallback as the v2 engine), then re-check.\n const subtype = fn.FPDFAnnot_GetSubtype(annotPtr);\n if (subtype === ANNOT_SUBTYPE_WIDGET && !fn.FPDFAnnot_HasKey(annotPtr, 'AP')) {\n fn.EPDFAnnot_GenerateFormFieldAP(annotPtr);\n if (!fn.EPDFAnnot_HasAppearanceStream(annotPtr, modeInt)) return null;\n } else {\n return null;\n }\n }\n\n // SAFETY CLAMP — an engine invariant, not an option: no single appearance\n // raster exceeds APPEARANCE_PIXEL_CLAMP output pixels. Appearance size is\n // `rect × scale`, and rects span orders of magnitude — a page-sized stamp\n // at a deep-zoom scale would ask for gigabytes and OOM the wasm heap\n // (observed: a ~600pt annotation at scale ~47 → 3.3 GB malloc). The clamp\n // REDUCES the effective scale for that appearance instead of rejecting:\n // the raster still covers the same rect, so the consumer's box-stretch\n // shows it slightly soft rather than missing — bounded memory with\n // graceful degradation. `options.maxOutputPixels` (the deployment budget,\n // reject semantics) still applies after it, unchanged.\n const rectArea = Math.max(1, (rect.right - rect.left) * (rect.top - rect.bottom));\n const effScale = Math.min(scale, Math.sqrt(APPEARANCE_PIXEL_CLAMP / rectArea));\n\n // `rect` is already normalized at the read boundary; `rasterize` handles the\n // degenerate-rect / device-size / matrix / bitmap lifecycle. We supply only\n // the annotation draw (transparent background — appearances composite over\n // page content).\n return rasterize(this.runtime, {\n rect,\n page,\n rotation,\n viewport: { kind: 'scale', scale: effScale },\n ...(maxOutputPixels !== undefined ? { maxOutputPixels } : {}),\n background: 'transparent',\n // `stripRotation` (EmbedPDF box-kind rotation only): render the AP form\n // content WITHOUT its rotation Matrix, MatchRect-mapped to the unrotated\n // box — the consumer re-applies the DTO's `rotation` as a view transform.\n draw: (bitmapPtr, matrixPtr) =>\n (stripRotation ? fn.EPDF_RenderAnnotBitmapUnrotated : fn.EPDF_RenderAnnotBitmap)(\n bitmapPtr,\n pagePtr,\n annotPtr,\n modeInt,\n matrixPtr,\n FPDF_REVERSE_BYTE_ORDER,\n ),\n });\n }\n}\n\nfunction resolveModes(\n requested: AnnotationAppearanceMode[] | undefined,\n): ReadonlyArray<(typeof APPEARANCE_MODES)[number]> {\n if (!requested || requested.length === 0) {\n return APPEARANCE_MODES.filter((m) => m.name === 'normal');\n }\n const wanted = new Set(requested);\n return APPEARANCE_MODES.filter((m) => wanted.has(m.name));\n}\n\nfunction normalizeScale(scale: number | undefined): number {\n if (scale === undefined) return 1;\n if (!Number.isFinite(scale) || scale <= 0) return 1;\n return scale;\n}\n","import type {\n AnnotationListPageSnapshot,\n AnnotationListSnapshotAllPages,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport type { FontRegistrar } from '../fonts/FontRegistrar';\nimport { throwIfAborted } from '../../shared/abort';\nimport { collectPageAnnotations } from './internal/read/collectPageAnnotations';\n\n/**\n * Whole-document and per-page raw read paths. Never acquires a pagePtr;\n * uses `EPDFPage_GetAnnotCountRaw` / `EPDFPage_GetAnnotRaw` /\n * `EPDFAnnot_GetObjectNumber` directly off the docPtr.\n *\n * Per-subtype dispatch is the same as the full reader (both share\n * `collectPageAnnotations`), so the wire shape `AnnotationDTO[]` is\n * identical between raw and full read paths for the subtypes that don't\n * actually need a pagePtr to materialise their fields.\n */\nexport class RawAnnotationReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n /** This thread's font registry: FreeText faces read back as keys. */\n private readonly fonts?: FontRegistrar,\n ) {}\n\n listAll(signal: AbortSignal): AnnotationListSnapshotAllPages {\n throwIfAborted(signal);\n this.session.ensureFullPageRegistry();\n const records = this.session.allRecords();\n const pages: AnnotationListPageSnapshot[] = [];\n for (const record of records) {\n throwIfAborted(signal);\n pages.push(this.listOne(record.pageObjectNumber, signal));\n }\n return { pages };\n }\n\n listOne(pageObjectNumber: PageObjectNumber, signal: AbortSignal): AnnotationListPageSnapshot {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const record = this.session.recordByObjectNumber(pageObjectNumber);\n\n const count = fn.EPDFPage_GetAnnotCountRaw(docPtr, record.pageIndex);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFPage_GetAnnotCountRaw returned ${count} for page ${pageObjectNumber}`,\n );\n }\n\n return collectPageAnnotations({\n runtime: this.runtime,\n session: this.session,\n pageObjectNumber,\n count,\n getAnnotPtrAt: (i) => fn.EPDFPage_GetAnnotRaw(docPtr, record.pageIndex, i),\n signal,\n ...(this.fonts ? { fonts: this.fonts } : {}),\n });\n }\n}\n","import {\n EngineError,\n EngineErrorCode,\n type AnnotationFlags,\n type Color,\n type InkList,\n type LineEndings,\n type LinePoints,\n type PdfPoint,\n type PdfRect,\n type PdfRectDifferences,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { F32_BYTES, POINTF_BYTES, RECTF_BYTES } from '../../../../runtime/memory/structs';\nimport { flagsToBits } from '../annotationFlagBits';\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { lineEndingToCode } from '../lineEnding';\n\n/**\n * Write-side twin of `annotationReadPrimitives.ts`. Every annotation\n * family (text-markup, shape, and upcoming polygon/polyline/line/free-text)\n * composes these low-level setters so the PDFium FFI surface lives in one\n * place. All colour/opacity/border writes go through the EmbedPDF\n * `EPDFAnnot_*` extensions — the same path v2 used and the read primitives\n * read back — so values survive native `EPDFAnnot_GenerateAppearance`.\n */\n\n/**\n * Set an annotation colour via the EmbedPDF `EPDFAnnot_SetColor`\n * extension. The `type` arg (FPDFANNOT_COLORTYPE) selects which colour to\n * write — `Color` is the stroke/fill `/C`, `InteriorColor` is the `/IC`\n * of square/circle/polygon. RGB only; annotation opacity lives in `/CA`\n * (see {@link setAnnotOpacity}), not a per-colour alpha. The stock\n * `FPDFAnnot_SetColor` cannot author interior colour, which is why we use\n * the extension uniformly.\n */\nexport function setAnnotColor(\n fn: PdfFunctions,\n annotPtr: Ptr,\n color: Color,\n type: number = FPDFANNOT_COLORTYPE.Color,\n): void {\n const ok = fn.EPDFAnnot_SetColor(annotPtr, type, color.r & 0xff, color.g & 0xff, color.b & 0xff);\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetColor returned false');\n }\n}\n\n/**\n * Remove an annotation colour entry via `EPDFAnnot_ClearColor` (e.g. a\n * transparent fill clears `/IC`). A false return is benign — there was no\n * entry to clear — so we don't treat it as an error.\n */\nexport function clearAnnotColor(fn: PdfFunctions, annotPtr: Ptr, type: number): void {\n fn.EPDFAnnot_ClearColor(annotPtr, type);\n}\n\n/**\n * Set annotation opacity (`/CA`) via the dedicated `EPDFAnnot_SetOpacity`\n * extension. Input is 0..1; the native alpha is 0..255. This is the path\n * that stores `/CA` in the form native appearance generation expects, so\n * opacity survives the bake.\n */\nexport function setAnnotOpacity(fn: PdfFunctions, annotPtr: Ptr, opacity: number): void {\n const alpha = Math.max(0, Math.min(255, Math.round(opacity * 255)));\n if (!fn.EPDFAnnot_SetOpacity(annotPtr, alpha)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetOpacity returned false');\n }\n}\n\n/**\n * Set the `/F` (Annotation Flags) entry via `FPDFAnnot_SetFlags`. Only the\n * keys present in `partial` are changed; the rest preserve their current\n * value (read back via `FPDFAnnot_GetFlags` first). On create the dict\n * starts at 0, so this is equivalently \"set exactly these\"; on update it\n * merges onto the live flags.\n */\nexport function setAnnotFlags(\n fn: PdfFunctions,\n annotPtr: Ptr,\n partial: Partial<AnnotationFlags>,\n): void {\n const next = flagsToBits(fn.FPDFAnnot_GetFlags(annotPtr), partial);\n if (!fn.FPDFAnnot_SetFlags(annotPtr, next)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_SetFlags returned false');\n }\n}\n\n/**\n * Write `/Rect` without touching `/AP`. Appearance preservation/regeneration\n * belongs to AnnotationMutator; a geometry primitive must not silently rewrite\n * an existing appearance `/BBox`. FS_RECTF layout is\n * `{ left, top, right, bottom }` (top > bottom in PDF coords).\n */\nexport function setAnnotRect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n rect: PdfRect,\n): void {\n const buf = mem.alloc(RECTF_BYTES);\n try {\n mem.poke(buf, 'f32', rect.left, 0);\n mem.poke(buf, 'f32', rect.top, 4);\n mem.poke(buf, 'f32', rect.right, 8);\n mem.poke(buf, 'f32', rect.bottom, 12);\n if (!fn.EPDFAnnot_SetRect(annotPtr, buf)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetRect returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Write a UTF-16 string entry into an annotation dictionary. The write\n * side of `readAnnotString`.\n */\nexport function writeAnnotString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n value: string,\n): void {\n const ptr = mem.writeU16String(value);\n try {\n fn.FPDFAnnot_SetStringValue(annotPtr, key, ptr);\n } finally {\n mem.free(ptr);\n }\n}\n\n/**\n * Three-state string write: `null` REMOVES the dictionary entry.\n *\n * Clearing goes through `EPDFAnnot_RemoveKey` because\n * `FPDFAnnot_SetStringValue` with a NULL value writes an EMPTY string —\n * it never removes. True removal is what keeps the read side honest:\n * `readAnnotString` returns `null` iff the key is absent, so a cleared\n * field reads back as `null`, not `''`.\n */\nexport function writeAnnotStringOrClear(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n value: string | null,\n): void {\n if (value === null) {\n fn.EPDFAnnot_RemoveKey(annotPtr, key);\n return;\n }\n writeAnnotString(fn, mem, annotPtr, key, value);\n}\n\n/**\n * Set `/BS /S` (border style code) and `/BS /W` (width) in one call via\n * `EPDFAnnot_SetBorderStyle`. `styleCode` is a raw\n * `FPDF_ANNOT_BORDER_STYLE` enum value — the string<->code mapping lives\n * in `shapeBorderStyle.ts` so engine-core stays PDFium-free.\n */\nexport function setBorderStyle(\n fn: PdfFunctions,\n annotPtr: Ptr,\n styleCode: number,\n width: number,\n): void {\n if (!fn.EPDFAnnot_SetBorderStyle(annotPtr, styleCode, width)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetBorderStyle returned false');\n }\n}\n\n/**\n * Write the dashed-border pattern (`/BS /D`) via\n * `EPDFAnnot_SetBorderDashPattern`. Each entry is clamped to >= 0.\n */\nexport function setBorderDashPattern(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n dashArray: number[],\n): void {\n const buf = mem.alloc(dashArray.length * F32_BYTES);\n try {\n for (let i = 0; i < dashArray.length; i++) {\n mem.poke(buf, 'f32', Math.max(0, dashArray[i]!), i * F32_BYTES);\n }\n if (!fn.EPDFAnnot_SetBorderDashPattern(annotPtr, buf, dashArray.length)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetBorderDashPattern returned false',\n );\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/** Set the `/BE` cloudy border effect intensity. */\nexport function setBorderEffect(fn: PdfFunctions, annotPtr: Ptr, intensity: number): void {\n if (!fn.EPDFAnnot_SetBorderEffect(annotPtr, intensity)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetBorderEffect returned false');\n }\n}\n\n/**\n * Remove the `/BE` cloudy border effect. A false return is benign (there\n * was no effect to clear), so we don't treat it as an error.\n */\nexport function clearBorderEffect(fn: PdfFunctions, annotPtr: Ptr): void {\n fn.EPDFAnnot_ClearBorderEffect(annotPtr);\n}\n\n/**\n * Write `/RD` rectangle differences via\n * `EPDFAnnot_SetRectangleDifferences`. PDFium core stores `/RD` as\n * `[left, bottom, right, top]`; we accept the wire-stable\n * `{ left, top, right, bottom }` shape and reorder at the boundary.\n */\nexport function setRectangleDifferences(\n fn: PdfFunctions,\n annotPtr: Ptr,\n rd: PdfRectDifferences,\n): void {\n if (!fn.EPDFAnnot_SetRectangleDifferences(annotPtr, rd.left, rd.bottom, rd.right, rd.top)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetRectangleDifferences returned false',\n );\n }\n}\n\n/**\n * Remove the `/RD` rectangle-differences entry. A false return is benign\n * (there was no entry to clear), so we don't treat it as an error.\n */\nexport function clearRectangleDifferences(fn: PdfFunctions, annotPtr: Ptr): void {\n fn.EPDFAnnot_ClearRectangleDifferences(annotPtr);\n}\n\n/**\n * Replace the `/Vertices` point list of a polygon/polyline annotation via\n * the EmbedPDF `EPDFAnnot_SetVertices` extension. Writes the points into a\n * contiguous `count * FS_POINTF` buffer.\n */\nexport function setVertices(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n vertices: PdfPoint[],\n): void {\n const buf = mem.alloc(vertices.length * POINTF_BYTES);\n try {\n for (let i = 0; i < vertices.length; i++) {\n const off = i * POINTF_BYTES;\n mem.poke(buf, 'f32', vertices[i]!.x, off);\n mem.poke(buf, 'f32', vertices[i]!.y, off + 4);\n }\n if (!fn.EPDFAnnot_SetVertices(annotPtr, buf, vertices.length)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetVertices returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Write the `/L` endpoints of a line annotation via the EmbedPDF\n * `EPDFAnnot_SetLine` extension. Uses one 16-byte buffer holding two\n * `FS_POINTF` structs (start at offset 0, end at offset 8).\n */\nexport function setLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n line: LinePoints,\n): void {\n const start = mem.alloc(POINTF_BYTES);\n const end = mem.alloc(POINTF_BYTES);\n try {\n mem.poke(start, 'f32', line.start.x, 0);\n mem.poke(start, 'f32', line.start.y, 4);\n mem.poke(end, 'f32', line.end.x, 0);\n mem.poke(end, 'f32', line.end.y, 4);\n if (!fn.EPDFAnnot_SetLine(annotPtr, start, end)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetLine returned false');\n }\n } finally {\n mem.free(start);\n mem.free(end);\n }\n}\n\n/**\n * Replace the `/InkList` of an ink annotation. PDFium has no single\n * \"set ink list\" call, so we clear any existing list with\n * `FPDFAnnot_RemoveInkList` (a false return is benign on a freshly-created\n * annotation that has none) and re-add each non-empty stroke via\n * `FPDFAnnot_AddInkStroke`, which takes a contiguous `count * FS_POINTF`\n * buffer and returns the new stroke index (`< 0` on failure).\n */\nexport function setInkList(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n inkList: InkList,\n): void {\n fn.FPDFAnnot_RemoveInkList(annotPtr);\n for (const stroke of inkList) {\n if (stroke.length === 0) continue;\n const buf = mem.alloc(stroke.length * POINTF_BYTES);\n try {\n for (let i = 0; i < stroke.length; i++) {\n const off = i * POINTF_BYTES;\n mem.poke(buf, 'f32', stroke[i]!.x, off);\n mem.poke(buf, 'f32', stroke[i]!.y, off + 4);\n }\n if (fn.FPDFAnnot_AddInkStroke(annotPtr, buf, stroke.length) < 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_AddInkStroke returned < 0');\n }\n } finally {\n mem.free(buf);\n }\n }\n}\n\n/**\n * Write the `/LE` line endings of a line/polyline annotation via the\n * EmbedPDF `EPDFAnnot_SetLineEndings` extension. The string<->code mapping\n * lives in `lineEnding.ts` so engine-core stays PDFium-free.\n */\nexport function setLineEndings(fn: PdfFunctions, annotPtr: Ptr, endings: LineEndings): void {\n if (\n !fn.EPDFAnnot_SetLineEndings(\n annotPtr,\n lineEndingToCode(endings.start),\n lineEndingToCode(endings.end),\n )\n ) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetLineEndings returned false');\n }\n}\n\n/**\n * Write the `/DA` default appearance (font + size + colour) of a free-text\n * annotation via `EPDFAnnot_SetDefaultAppearance`. The `/DA` colour paints\n * the border and the default text colour; a separate `TextColor` entry (see\n * {@link setAnnotColor}) overrides the text only. `fontCode` is the raw\n * `FPDF_STANDARD_FONT` enum value — the string<->code mapping lives in\n * `standardFont.ts` so engine-core stays PDFium-free.\n */\nexport function setDefaultAppearance(\n fn: PdfFunctions,\n annotPtr: Ptr,\n fontCode: number,\n fontSize: number,\n color: Color,\n): void {\n if (\n !fn.EPDFAnnot_SetDefaultAppearance(\n annotPtr,\n fontCode,\n fontSize,\n color.r & 0xff,\n color.g & 0xff,\n color.b & 0xff,\n )\n ) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetDefaultAppearance returned false');\n }\n}\n\n/**\n * Write the `/DA` default appearance using a runtime font registered through\n * `engine.fonts` (via `EPDFAnnot_SetDefaultAppearanceRegisteredFont`). `fontId`\n * is the thread-local `CFX_FontRegistry::FontId` resolved from the stable\n * `registeredFontKey` at authoring time. The font's glyph subset is embedded\n * into the annotation's appearance stream when the document/layer is saved.\n */\nexport function setDefaultAppearanceRegisteredFont(\n fn: PdfFunctions,\n annotPtr: Ptr,\n fontId: number,\n fontSize: number,\n color: Color,\n): void {\n if (\n !fn.EPDFAnnot_SetDefaultAppearanceRegisteredFont(\n annotPtr,\n fontId,\n fontSize,\n color.r & 0xff,\n color.g & 0xff,\n color.b & 0xff,\n )\n ) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetDefaultAppearanceRegisteredFont returned false',\n );\n }\n}\n\n/**\n * Write the `/Q` text alignment of a free-text annotation via\n * `EPDFAnnot_SetTextAlignment`. `code` is the raw quadding value — the\n * string<->code mapping lives in `textAlignment.ts`.\n */\nexport function setTextAlignment(fn: PdfFunctions, annotPtr: Ptr, code: number): void {\n if (!fn.EPDFAnnot_SetTextAlignment(annotPtr, code)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetTextAlignment returned false');\n }\n}\n\n/**\n * Write the `/IT` intent name via `EPDFAnnot_SetIntent` (expects a UTF-8\n * bytestring without the leading slash, e.g. `'FreeTextCallout'`). The\n * string<->name mapping lives in `freeTextIntent.ts`.\n */\nexport function setIntent(fn: PdfFunctions, annotPtr: Ptr, name: string): void {\n if (!fn.EPDFAnnot_SetIntent(annotPtr, name)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetIntent returned false');\n }\n}\n\n/**\n * Write the `/CL` callout leader line of a free-text callout via\n * `EPDFAnnot_SetCalloutLine`. Accepts 2 points (straight leader) or 3\n * (knee-jointed); writes them into a contiguous `count * FS_POINTF` buffer\n * (like {@link setVertices}).\n */\n/**\n * Write `/OverlayText` of a redact annotation via `EPDFAnnot_SetOverlayText`.\n * The native setter removes the key for an empty string, so passing `''`\n * clears the label.\n */\nexport function setOverlayText(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n text: string,\n): void {\n const ptr = mem.writeU16String(text);\n try {\n if (!fn.EPDFAnnot_SetOverlayText(annotPtr, ptr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetOverlayText returned false');\n }\n } finally {\n mem.free(ptr);\n }\n}\n\n/**\n * Write `/Repeat` of a redact annotation via `EPDFAnnot_SetOverlayTextRepeat`\n * (`false` removes the key — absent is the PDF default).\n */\nexport function setOverlayTextRepeat(fn: PdfFunctions, annotPtr: Ptr, repeat: boolean): void {\n if (!fn.EPDFAnnot_SetOverlayTextRepeat(annotPtr, repeat)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetOverlayTextRepeat returned false');\n }\n}\n\nexport function setCalloutLine(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n points: readonly PdfPoint[],\n): void {\n const buf = mem.alloc(points.length * POINTF_BYTES);\n try {\n for (let i = 0; i < points.length; i++) {\n const off = i * POINTF_BYTES;\n mem.poke(buf, 'f32', points[i]!.x, off);\n mem.poke(buf, 'f32', points[i]!.y, off + 4);\n }\n if (!fn.EPDFAnnot_SetCalloutLine(annotPtr, buf, points.length)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetCalloutLine returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n","import type { AnnotationDraftBase, AnnotationPatchBase } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n setAnnotFlags,\n writeAnnotString,\n writeAnnotStringOrClear,\n} from './annotationWritePrimitives';\nimport { formatPdfDate } from '../../../../shared/pdf-date';\n\n/**\n * Write the annotation-wide base fields shared by every Draft\n * (contents/subject/nm). The kind-specific writer calls this BEFORE its\n * own field writes; order doesn't actually matter at the PDF level, but\n * keeping the base first makes the writers symmetric with the readers.\n *\n * `/T` (author display) is stamped by the mutator from\n * `AnnotationActor.displayName` via {@link writeAnnotationAuthor}.\n *\n * `nm` is written verbatim if the caller supplied one. The mutator\n * decides whether to opportunistically stamp a UUID v4 on a weak\n * annotation; the writer does not.\n */\nexport function applyAnnotationBaseDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: AnnotationDraftBase,\n): void {\n if (draft.contents !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Contents', draft.contents);\n }\n if (draft.subject !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Subj', draft.subject);\n }\n if (draft.nm !== undefined && draft.nm.length > 0) {\n writeAnnotString(fn, mem, annotPtr, 'NM', draft.nm);\n }\n if (draft.flags !== undefined) {\n setAnnotFlags(fn, annotPtr, draft.flags);\n }\n}\n\n/**\n * Write the annotation-wide base fields shared by every Patch\n * (contents/subject). /T is bound at creation and not patchable — see\n * `AnnotationPatchBase`. /NM is monotonic per annotation; the mutator\n * may stamp /NM opportunistically on a weak annotation via\n * `writeAnnotationNm`.\n *\n * Three-state semantics on string|null fields:\n * undefined -> don't touch the dict\n * null -> remove the entry\n * \"...\" -> set the entry to that value\n */\nexport function applyAnnotationBasePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: AnnotationPatchBase,\n): void {\n if (patch.contents !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Contents', patch.contents);\n }\n if (patch.subject !== undefined) {\n writeAnnotStringOrClear(fn, mem, annotPtr, 'Subj', patch.subject);\n }\n if (patch.flags !== undefined) {\n setAnnotFlags(fn, annotPtr, patch.flags);\n }\n}\n\n/**\n * Stamp /T (the standard PDF \"author\" display field) on an annotation.\n * Called by the mutator on CREATE — /T is bound to the caller's\n * `display_name` at creation. No-op when `displayName` is empty so\n * callers don't need to gate it.\n */\nexport function writeAnnotationAuthor(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n displayName: string,\n): void {\n if (displayName.length === 0) return;\n writeAnnotString(fn, mem, annotPtr, 'T', displayName);\n}\n\n/**\n * Stamp /NM on an annotation that didn't have one. Used by the mutator\n * (not by the writers proper) to upgrade a weak annotation to durable\n * identity during update. Idempotent and silent if the value is empty.\n */\nexport function writeAnnotationNm(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n nm: string,\n): void {\n if (nm.length === 0) return;\n writeAnnotString(fn, mem, annotPtr, 'NM', nm);\n}\n\n/**\n * Stamp /M (modification date) on an annotation. /M is a standard\n * ISO 32000 base annotation field — the moment of the last edit — so\n * it lives here alongside /T / /NM / /Contents rather than in any\n * vendor-namespaced extension.\n *\n * Called by the mutator on every annotation create AND every update;\n * the existing base draft/patch writers leave /M alone because the\n * value is derived from the moment of the write, not from the\n * draft/patch payload. The base reader already extracts /M and\n * surfaces it on `AnnotationBase.modified`.\n *\n * Format: `D:YYYYMMDDHHmmSSOHH'mm'` (see formatPdfDate).\n */\nexport function writeAnnotationModified(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n now: Date = new Date(),\n): void {\n writeAnnotString(fn, mem, annotPtr, 'M', formatPdfDate(now));\n}\n","import type { AnnotationStableId } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { generateUuid } from '../../../../shared/uuid';\nimport { readAnnotString } from '../read/annotationReadPrimitives';\nimport { writeAnnotationNm } from '../write/writeAnnotationBase';\n\n/**\n * Read an annotation's stable id, opportunistically stamping a fresh\n * engine-generated UUID v4 as `/NM` if it is currently weak (no object\n * number, no `/NM`). Monotonic `/NM` rule: an already-durable annotation\n * is NEVER touched. Caller owns the lifecycle of `annotPtr`.\n *\n * Shared by the create/update/move mutator paths and the `/IRT`\n * relationship writer (which strengthens a weak parent before linking to\n * it, so the strengthened id can be reported in `meta.changed`).\n */\nexport function captureOrStampStableId(\n runtime: PdfRuntimeModule,\n annotPtr: Ptr,\n): AnnotationStableId {\n const { fn, mem } = runtime;\n const objNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (objNum > 0) return { kind: 'objectNumber', value: objNum };\n const nm = readAnnotString(fn, mem, annotPtr, 'NM');\n if (nm !== null && nm.length > 0) return { kind: 'nm', value: nm };\n const minted = generateUuid();\n writeAnnotationNm(fn, mem, annotPtr, minted);\n return { kind: 'nm', value: minted };\n}\n","import type { AnnotationRef } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\n\n/**\n * Resolve an `AnnotationRef` to a live `annotPtr` on an ALREADY-acquired\n * `pagePtr`. This does NOT acquire/release the page and does NOT close the\n * returned annot — the caller owns both lifetimes.\n *\n * Resolution order matches the wire spec:\n * 1. `objectNumber` -> `EPDFPage_GetAnnotByObjectNumber`\n * 2. `nm` -> `EPDFPage_GetAnnotByName`\n * 3. `index` -> revision validation, then `FPDFPage_GetAnnot`\n *\n * Surfaces `InvalidReference` deterministically when the ref doesn't\n * resolve, so mutation paths can fail fast before doing any work.\n */\nexport function resolveAnnotPtr(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n pagePtr: Ptr,\n ref: AnnotationRef,\n): Ptr {\n const { fn, mem } = runtime;\n switch (ref.kind) {\n case 'objectNumber': {\n const annotPtr = fn.EPDFPage_GetAnnotByObjectNumber(pagePtr, ref.annotObjectNumber);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with object number ${ref.annotObjectNumber} on page ${ref.pageObjectNumber}`,\n );\n }\n return annotPtr;\n }\n case 'nm': {\n const namePtr = mem.writeU16String(ref.nm);\n try {\n const annotPtr = fn.EPDFPage_GetAnnotByName(pagePtr, namePtr);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with /NM '${ref.nm}' on page ${ref.pageObjectNumber}`,\n );\n }\n return annotPtr;\n } finally {\n mem.free(namePtr);\n }\n }\n case 'index': {\n session.validateRevision(ref.revision);\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, ref.index);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `index ${ref.index} out of range on page ${ref.pageObjectNumber}`,\n );\n }\n return annotPtr;\n }\n }\n throw new EngineError(EngineErrorCode.InvalidArg, `unsupported annotation ref kind`);\n}\n","import type {\n AnnotationListMutationMeta,\n AnnotationStableId,\n PageState,\n} from '@embedpdf/engine-core/runtime';\nimport {\n invalidatesWeakIndexRefs,\n shiftsExistingAnnotationIndices,\n type AnnotationMutationKind,\n} from '@embedpdf/engine-core/runtime';\n\n/**\n * The kind of mutation that just happened on a page.\n *\n * Index-space behaviour drives whether weak (`kind: 'index'`) refs\n * the client may be holding stay valid:\n *\n * - `update` does not touch the /Annots array at all.\n * - `create` is append-only — the new annotation lands at\n * `index = previousCount`, so no existing index ever shifts.\n * The array grows, but every pre-existing weak ref still points\n * at the same physical annotation.\n * - `delete` removes an entry and shifts every later index down by\n * one. Pre-existing weak refs at or after the removed index are\n * now off-by-one and stale.\n * - `move` detaches a contiguous block and re-inserts it, rewriting\n * indices on both ends of the gap. Existing weak refs across that\n * range are stale.\n *\n * So the doctrine for `MutationKind` is: only `delete` and `move`\n * actually invalidate weak refs. `update` and `create` leave them\n * alone. (A future explicit-position `createAt(index)` API would\n * shift indices >= toIndex and would join the structural cohort —\n * see `MutationKind` extension note in `compute()` below.)\n */\nexport type MutationKind = AnnotationMutationKind;\n\n/**\n * Inputs that decide whether a mutation should make a client refetch.\n *\n * `pageStateBefore` is captured BEFORE the mutation. Its known\n * `weakAnnotationState` drives the locked rule:\n * index-shifting mutation × any weak annotation on the page ⇒ refetch.\n *\n * `pageStateAfter` is captured AFTER the mutation. It carries the\n * bumped revision token (for index-shifting ops) and the recomputed\n * weak-annotation state (for any op that might have changed it, e.g.\n * opportunistic /NM stamping during update).\n *\n * `changed` is the list of stable ids the mutation actually touched.\n * Empty for a weak delete (we have no durable id to report).\n */\nexport interface ImpactInputs {\n mutation: MutationKind;\n pageStateBefore: PageState;\n pageStateAfter: PageState;\n changed: AnnotationStableId[];\n}\n\n/**\n * Pure helper: turn a mutation outcome into the side-effect envelope\n * every result type carries on its `meta` field.\n *\n * The rules — locked with the user, do not change without re-reading\n * the doc comment on `AnnotationListMutationMeta` and the\n * `MutationKind` definition above:\n *\n * 1. `update` and `create` are non-invalidating.\n *\n * - `update` doesn't touch the /Annots array; indices on the page\n * do not move, so weak refs the client may be holding stay\n * valid. Opportunistic /NM stamping during an update is also\n * non-structural — it changes the annotation's identity quality\n * but not its position.\n *\n * - `create` is append-only. The new annotation goes at\n * `index = previousCount`, so no existing index shifts and no\n * pre-existing weak ref ever becomes stale. We treat `create`\n * the same as `update` for impact purposes: no revision bump,\n * `weakRefsInvalidated = false`, `shouldRefetch = null`.\n *\n * The \"revisions exist solely for weak-ref authentication\"\n * doctrine (see `pages.move()`'s identical reasoning) means we\n * deliberately do NOT bump on `create` — bumping a revision\n * that nobody's weak ref depends on would erode the invariant\n * and turn revisions into a generic \"something changed\" signal.\n *\n * 2. `delete` and `move` ARE index-shifting. They genuinely move\n * pre-existing indices:\n * - `delete` removes an annotation, shifting every later index\n * down by one.\n * - `move` detaches a contiguous block and re-inserts it\n * elsewhere, rewriting indices on both ends of the gap.\n * They invalidate weak refs iff the page actually had any weak\n * refs *before* the mutation — if every annotation already had a\n * durable identity, no client could possibly be holding a stale\n * index, and we keep `shouldRefetch = null`.\n *\n * (`move` opportunistically stamps /NM on weak refs in the batch\n * BEFORE the move, so the annotations actually being moved end up\n * durable on the way out; but other weak annotations on the page\n * still need a refetch.)\n *\n * 3. When rule (2) fires, the reason is always `'weakRefsInvalidated'`.\n * `'pageRebuilt'` and `'externalChange'` are reserved for higher-\n * level signals the engine doesn't emit yet (insert/delete-page\n * that rebuilds /Annots, watch-based refresh). Page **reorder**\n * explicitly does NOT bump per-page revisions and does NOT emit\n * `pageRebuilt` — see `PagesMutator`.\n *\n * Future note: when an explicit-position `createAt(index)` API\n * ships, add `'createAt'` to `MutationKind` and slot it into rule\n * (2) — it shifts every index >= toIndex and is structural in the\n * same way `delete` and `move` are.\n */\nexport function computeMutationImpact(inputs: ImpactInputs): AnnotationListMutationMeta {\n const { mutation, pageStateBefore, pageStateAfter, changed } = inputs;\n\n if (!shiftsExistingAnnotationIndices(mutation)) {\n return {\n affectedPages: [pageStateAfter],\n cacheDelta: null,\n changed,\n weakRefsInvalidated: false,\n shouldRefetch: null,\n };\n }\n\n // delete / move: index-shifting.\n const weakRefsInvalidated = invalidatesWeakIndexRefs(\n mutation,\n pageStateBefore.weakAnnotationState,\n );\n return {\n affectedPages: [pageStateAfter],\n cacheDelta: null,\n changed,\n weakRefsInvalidated,\n shouldRefetch: weakRefsInvalidated ? { reason: 'weakRefsInvalidated' } : null,\n };\n}\n","import type { AnnotationDTO, PageObjectNumber, RevisionToken } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AnnotationReadContext } from './annotationReadContext';\nimport { pickReader } from './annotationReaderRegistry';\nimport { readAnnotationBase } from './readAnnotationBase';\n\n/**\n * Materialise a single annotation DTO from a live `annotPtr`, reusing the\n * exact same code paths the list readers use. Caller owns the lifecycle of\n * `annotPtr` (this function does NOT close it) so the mutator can keep it\n * for follow-up writes.\n *\n * Used by:\n * - `AnnotationMutator.create()` after `EPDFPage_CreateAnnot` to\n * produce `AnnotationCreateResult.created`.\n * - `AnnotationMutator.update()` after writes complete to produce\n * `AnnotationUpdateResult.updated`.\n */\nexport function readAnnotationFromPtr(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n index: number,\n revision: RevisionToken,\n ctx: AnnotationReadContext,\n): AnnotationDTO {\n const base = readAnnotationBase(fn, mem, ctx.docPtr, annotPtr, pageObjectNumber, index, revision);\n const subtypeCode = fn.FPDFAnnot_GetSubtype(annotPtr);\n const { reader } = pickReader(subtypeCode);\n return reader(fn, mem, annotPtr, base, subtypeCode, ctx);\n}\n","import type { AnnotationActor } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * Write the EmbedPDF-namespaced /EMBD_Metadata annotation dictionary.\n *\n * This module owns ONLY the vendor-extension dictionary. Standard PDF\n * base fields (/T, /M, /NM, /Contents) are handled by\n * `writers/annotations/base.ts` — /EMBD_Metadata is a separate\n * dictionary nested under the annotation that carries cloud-side\n * identity bookkeeping which has no PDF-spec equivalent.\n *\n * Schema (v1):\n * /EMBD_Metadata <<\n * /SchemaVersion 1 % EmbedPDF metadata schema version\n * /UserID (acme/alice) % identity that created the annotation\n * /GroupID (engineering) % group the annotation belongs to\n * /CreatedBy (acme/alice) % same as UserID on create\n * /UpdatedBy (acme/alice) % last editor; refreshed on every update\n * >>\n *\n * Read side: see `readers/annotations/embed-metadata.ts` (commit 12).\n *\n * PDFium bindings used: the `EPDFAnnot_*EmbedMetadata*` extension API\n * shipped in the EmbedPDF PDFium fork. Values are written as UTF-16LE\n * strings via the same `mem.writeU16String` pattern the base writer\n * uses for /T.\n */\n\nconst KEY_SCHEMA_VERSION = 'SchemaVersion';\nconst KEY_USER_ID = 'UserID';\nconst KEY_GROUP_ID = 'GroupID';\nconst KEY_CREATED_BY = 'CreatedBy';\nconst KEY_UPDATED_BY = 'UpdatedBy';\n\n/**\n * Current EmbedPDF metadata schema version. Bump if/when the field set\n * or semantics change; readers tolerate older versions by falling back\n * to the fields they recognise.\n */\nexport const EMBD_METADATA_SCHEMA_VERSION = 1;\n\n/**\n * Stamp /EMBD_Metadata on a freshly created annotation. No-op if the\n * actor has no identity fields — the worker still emits the standard\n * /M timestamp via the base writer; only the vendor dictionary is\n * skipped.\n *\n * actor.userId → /UserID, /CreatedBy, /UpdatedBy\n * actor.groupId → /GroupID\n *\n * /SchemaVersion is written whenever any field is written.\n */\nexport function applyEmbedMetadataOnCreate(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n actor: AnnotationActor | undefined,\n): void {\n if (!actor || (!actor.userId && !actor.groupId)) return;\n\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, KEY_SCHEMA_VERSION, EMBD_METADATA_SCHEMA_VERSION);\n\n if (actor.userId) {\n setMetadataString(fn, mem, annotPtr, KEY_USER_ID, actor.userId);\n setMetadataString(fn, mem, annotPtr, KEY_CREATED_BY, actor.userId);\n setMetadataString(fn, mem, annotPtr, KEY_UPDATED_BY, actor.userId);\n }\n if (actor.groupId) {\n setMetadataString(fn, mem, annotPtr, KEY_GROUP_ID, actor.groupId);\n }\n}\n\n/**\n * Apply /EMBD_Metadata refreshes on update. Two fields can change on\n * update; everything else (UserID, CreatedBy) is immutable.\n *\n * actor.userId → /UpdatedBy (refreshed every update where the\n * caller has an identity)\n * actor.groupId → /GroupID (reassigned only when the patch\n * explicitly contains a new groupId; route runs\n * `checkSetGroup` first)\n *\n * If the target annotation has no EMBD_Metadata yet (created before\n * the cloud started stamping, or by a non-cloud writer), we seed\n * /SchemaVersion so subsequent readers can find the marker.\n *\n * No-op when the actor has neither userId nor groupId.\n */\nexport function applyEmbedMetadataOnUpdate(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n actor: AnnotationActor | undefined,\n): void {\n if (!actor || (!actor.userId && !actor.groupId)) return;\n\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) {\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, KEY_SCHEMA_VERSION, EMBD_METADATA_SCHEMA_VERSION);\n }\n if (actor.userId) {\n setMetadataString(fn, mem, annotPtr, KEY_UPDATED_BY, actor.userId);\n }\n if (actor.groupId) {\n setMetadataString(fn, mem, annotPtr, KEY_GROUP_ID, actor.groupId);\n }\n}\n\nfunction setMetadataString(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n key: string,\n value: string,\n): void {\n // Mirror the UTF-16LE pattern from writers/annotations/base.ts:\n // FPDFAnnot_SetStringValue and EPDFAnnot_SetEmbedMetadataString share\n // the same FPDF_WIDESTRING value shape, so we use the same helper.\n const ptr = mem.writeU16String(value);\n try {\n fn.EPDFAnnot_SetEmbedMetadataString(annotPtr, key, ptr);\n } finally {\n mem.free(ptr);\n }\n}\n","import { EngineError, EngineErrorCode, type PdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { RECTF_BYTES } from '../../../../runtime/memory/structs';\nimport { readAnnotationUnrotatedRect } from '../read/readAnnotationTransformMetadata';\nimport { EMBD_METADATA_SCHEMA_VERSION } from './writeEmbedMetadata';\n\n/**\n * Write the EmbedPDF transform keys under /EMBD_Metadata. This is the seam\n * PDFium's native AP generator reads to bake a ROTATED appearance:\n *\n * /EMBD_Metadata <<\n * /Rotation 45 % degrees, PDF convention (CCW)\n * /UnrotatedRect [x0 y0 x1 y1] % BOX kinds only — the logical box\n * >>\n *\n * The family split (see the v3 plan):\n * - BOX kinds (square/circle/free-text): `/Rotation` + `/UnrotatedRect`.\n * With BOTH present the AP generator emits an `/AP /Matrix` that rotates a\n * box-sized appearance about the box centre, and `/Rect` is the enclosing\n * AABB. This is the portable, externally-correct rotation.\n * - VERTEX kinds (line/polyline/polygon/ink): `/Rotation` ONLY (advisory).\n * The points are already rotated (they are the visual), so a lone\n * `/Rotation` is INERT for the AP generator (it ignores `/Rotation` with no\n * `/UnrotatedRect`) — it just records the applied angle so EmbedPDF can\n * reconstruct an oriented selection box + offer reset.\n *\n * Both fields follow the engine-wide tri-state law (\"a patch touches what it\n * states, preserves what it omits\"):\n * - `undefined` → the key is UNTOUCHED (a rect-only move keeps its rotation).\n * - `null` or `0` → CLEAR just that key via `EPDFAnnot_ClearEmbedMetadataKey`\n * (0 ≡ no rotation is the canonical identity, not a sentinel; never clear\n * the whole dict — identity fields UserID/GroupID/CreatedBy/UpdatedBy must\n * survive).\n * - a value → SET the key. Setting a nonzero rotation with no\n * `/UnrotatedRect` (neither in the patch nor already on the annotation)\n * is an unsatisfiable state for the AP generator and throws `InvalidArg`.\n *\n * MUST run BEFORE `EPDFAnnot_GenerateAppearance` so the bake sees the rotation.\n * `/SchemaVersion` is seeded (stays 1) if this is the first key in the dict.\n */\n\nconst KEY_ROTATION = 'Rotation';\nconst KEY_UNROTATED_RECT = 'UnrotatedRect';\n\n/** Transform fields a rotatable draft/patch can carry (off the engine DTO).\n * Tri-state: `undefined` preserves, `null` clears, a value sets. */\nexport interface AnnotationTransform {\n /** `/EMBD_Metadata/Rotation` — degrees, PDF convention. 0 ≡ none. */\n rotation?: number | null;\n /** `/EMBD_Metadata/UnrotatedRect` — the logical box (BOX kinds only). */\n unrotatedRect?: PdfRect | null;\n}\n\n/** Seed `/SchemaVersion` when we are about to create the dict by writing the\n * first transform key, so the marker readers look for is always present. */\nfunction ensureSchemaVersion(fn: PdfFunctions, annotPtr: Ptr): void {\n if (!fn.EPDFAnnot_HasEmbedMetadata(annotPtr)) {\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, 'SchemaVersion', EMBD_METADATA_SCHEMA_VERSION);\n }\n}\n\nfunction setRotation(fn: PdfFunctions, annotPtr: Ptr, rotation: number): void {\n ensureSchemaVersion(fn, annotPtr);\n fn.EPDFAnnot_SetEmbedMetadataNumber(annotPtr, KEY_ROTATION, rotation);\n}\n\nfunction setUnrotatedRect(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n rect: PdfRect,\n): void {\n ensureSchemaVersion(fn, annotPtr);\n const buf = mem.alloc(RECTF_BYTES);\n try {\n // FS_RECTF { left, top, right, bottom } — same layout as setAnnotRect.\n mem.poke(buf, 'f32', rect.left, 0);\n mem.poke(buf, 'f32', rect.top, 4);\n mem.poke(buf, 'f32', rect.right, 8);\n mem.poke(buf, 'f32', rect.bottom, 12);\n fn.EPDFAnnot_SetEmbedMetadataRect(annotPtr, KEY_UNROTATED_RECT, buf);\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Write transform metadata for a BOX kind (square/circle/free-text/stamp),\n * tri-state per field: `undefined` never touches the document (safe to call on\n * every patch), `null`/`0` clears, a value sets. A nonzero rotation with no\n * unrotated box anywhere (patch or annotation) is unsatisfiable — the AP\n * generator needs the pair — and throws instead of writing a broken state.\n */\nexport function writeBoxTransformMetadata(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n t: AnnotationTransform,\n): void {\n if (t.rotation !== undefined) {\n if (t.rotation !== null && t.rotation !== 0) {\n const hasBox =\n t.unrotatedRect != null ||\n (t.unrotatedRect === undefined && readAnnotationUnrotatedRect(fn, mem, annotPtr) != null);\n if (!hasBox) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'rotation requires unrotatedRect: supply the pair together (or rely on an existing /EMBD_Metadata/UnrotatedRect)',\n );\n }\n setRotation(fn, annotPtr, t.rotation);\n } else {\n fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_ROTATION);\n }\n }\n if (t.unrotatedRect !== undefined) {\n if (t.unrotatedRect !== null) setUnrotatedRect(fn, mem, annotPtr, t.unrotatedRect);\n else fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_UNROTATED_RECT);\n }\n}\n\n/**\n * Write the advisory `/Rotation` scalar for a VERTEX kind\n * (line/polyline/polygon/ink), tri-state: `undefined` never touches the\n * document, `null`/`0` clears, a value sets. Whenever it does write, any\n * `/UnrotatedRect` is defensively cleared — that key is an impossible state on\n * a vertex kind and must never accidentally drive the AP generator.\n */\nexport function writeVertexTransformMetadata(\n fn: PdfFunctions,\n annotPtr: Ptr,\n t: AnnotationTransform,\n): void {\n if (t.rotation === undefined) return;\n if (t.rotation !== null && t.rotation !== 0) setRotation(fn, annotPtr, t.rotation);\n else fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_ROTATION);\n fn.EPDFAnnot_ClearEmbedMetadataKey(annotPtr, KEY_UNROTATED_RECT);\n}\n","import type { CaretDraft, CaretPatch, Color } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n clearRectangleDifferences,\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setIntent,\n setRectangleDifferences,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\nimport { caretIntentToName } from '../textEditIntent';\n\n/** Default `/C` colour when a caret draft omits it (engine-wide default mark). */\nconst DEFAULT_CARET_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Default opacity, set explicitly so reads always round-trip the same value. */\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Apply a caret draft to a freshly-created annotation. Caret carries no\n * geometry of its own beyond `/Rect`. Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` (required — supplied by the caller; never derived)\n * 3. `/C` color + `/CA` opacity\n * 4. `/RD` rectangle differences (optional)\n */\nexport function applyCaretDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: CaretDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n // Box-family rotation pair — MUST land before the AP bake sees the caret.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: draft.rotation,\n unrotatedRect: draft.unrotatedRect,\n });\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_CARET_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n if (draft.intent !== undefined) setIntent(fn, annotPtr, caretIntentToName(draft.intent));\n if (draft.rectDifferences != null) {\n setRectangleDifferences(fn, annotPtr, draft.rectDifferences);\n }\n}\n\n/**\n * Apply a caret patch to an existing annotation. Only present fields are\n * touched.\n */\nexport function applyCaretPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: CaretPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.rotation !== undefined || patch.unrotatedRect !== undefined) {\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n }\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.intent !== undefined) {\n setIntent(fn, annotPtr, caretIntentToName(patch.intent));\n }\n if (patch.rectDifferences === null) {\n clearRectangleDifferences(fn, annotPtr);\n } else if (patch.rectDifferences !== undefined) {\n setRectangleDifferences(fn, annotPtr, patch.rectDifferences);\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the caret\n * writer for a draft/patch's `subtype`.\n */\nexport function isCaretSubtype(subtype: string): subtype is 'caret' {\n return subtype === 'caret';\n}\n","import type {\n Color,\n FileAttachmentPatch,\n FileAttachmentWireDraft,\n WireAttachmentFile,\n WireResource,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { writeAttachmentFilePayload } from '../../../attachments/internal/attachmentPrimitives';\nimport { FILE_ICON_TO_NAME } from '../annotationIcon';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { setAnnotColor, setAnnotOpacity, setAnnotRect } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\n\n/** Default `/C` — the generator's default icon fill, set explicitly so reads round-trip. */\nconst DEFAULT_FILE_ATTACHMENT_COLOR: Color = { r: 255, g: 255, b: 0 };\n\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Validate a file-attachment draft before any native write: the wire\n * `file.resource` ref must have arrived with the mutation. No format\n * sniffing — unlike stamps, ANY bytes are a valid attachment.\n */\nexport function preflightFileAttachmentDraft(\n draft: FileAttachmentWireDraft,\n ctx: AnnotationWriteContext | undefined,\n): void {\n requireFileResource(draft.file, ctx);\n if (ctx?.docPtr === undefined) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'file-attachment writer requires docPtr on the write context',\n );\n }\n}\n\n/**\n * Apply a file-attachment draft. Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` + `/C` + `/CA` + `/Name` icon\n * 3. the embedded file: `/FS` filespec via `FPDFAnnot_AddFileAttachment`,\n * bytes via `FPDFAttachment_SetFile` (which also writes `/Params`\n * Size/CheckSum/CreationDate), declared mime via\n * `EPDFAttachment_SetSubtype`, optional `/Desc`.\n *\n * The icon appearance itself is generator-owned: the mutator's closing\n * `regenerateAppearance` bakes it from `/C` + `/Name`\n * (GenerateFileAttachmentAP), exactly like the text note.\n */\nexport function applyFileAttachmentDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: FileAttachmentWireDraft,\n ctx: AnnotationWriteContext | undefined,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_FILE_ATTACHMENT_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n setFileAttachmentIcon(fn, annotPtr, draft.icon ?? 'paperclip');\n attachFile(fn, mem, annotPtr, draft.file, requireFileResource(draft.file, ctx), ctx!.docPtr!);\n}\n\n/** Patch: presentation only — the attached file is create-only by design. */\nexport function applyFileAttachmentPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: FileAttachmentPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.icon !== undefined) {\n setFileAttachmentIcon(fn, annotPtr, patch.icon);\n }\n}\n\nexport function isFileAttachmentSubtype(subtype: string): subtype is 'file-attachment' {\n return subtype === 'file-attachment';\n}\n\nfunction setFileAttachmentIcon(\n fn: PdfFunctions,\n annotPtr: Ptr,\n icon: keyof typeof FILE_ICON_TO_NAME,\n): void {\n if (!fn.EPDFAnnot_SetName(annotPtr, FILE_ICON_TO_NAME[icon])) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetName returned false');\n }\n}\n\nfunction requireFileResource(\n file: WireAttachmentFile,\n ctx: AnnotationWriteContext | undefined,\n): WireResource {\n const resource = ctx?.resources?.[file.resource];\n if (!resource) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `attachment file references resource '${file.resource}' but no such binary payload accompanied the mutation`,\n );\n }\n return resource;\n}\n\nfunction attachFile(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n file: WireAttachmentFile,\n resource: WireResource,\n docPtr: Ptr,\n): void {\n const namePtr = mem.writeU16String(file.name);\n let attachmentPtr: Ptr;\n try {\n attachmentPtr = fn.FPDFAnnot_AddFileAttachment(annotPtr, namePtr);\n } finally {\n mem.free(namePtr);\n }\n if (!attachmentPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_AddFileAttachment returned NULL');\n }\n\n writeAttachmentFilePayload(fn, mem, attachmentPtr, docPtr, file, resource);\n}\n","import {\n EngineError,\n EngineErrorCode,\n type Color,\n type FreeTextFont,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, Ptr } from '@embedpdf/engine-runtime';\n\nimport { isStandardFont, standardFontToCode } from '../standardFont';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport {\n setDefaultAppearance,\n setDefaultAppearanceRegisteredFont,\n} from './annotationWritePrimitives';\n\n/**\n * Write `/DA`. A standard font name goes through the native standard-font\n * path; anything else is treated as a registered-font `key` and resolved to\n * this thread's FontId. A key with no resolver wired (e.g. a host without a\n * font registry) is a programming error — fail loud rather than silently\n * downgrade to Helvetica and embed the wrong glyphs.\n *\n * Shared by the free-text and redact writers: `/DA` styles a free-text body\n * and a redaction `/OverlayText` label through the exact same triple.\n */\nexport function applyDefaultAppearance(\n fn: PdfFunctions,\n annotPtr: Ptr,\n fontFamily: FreeTextFont,\n fontSize: number,\n color: Color,\n ctx: AnnotationWriteContext | undefined,\n): void {\n if (isStandardFont(fontFamily)) {\n setDefaultAppearance(fn, annotPtr, standardFontToCode(fontFamily), fontSize, color);\n return;\n }\n if (!ctx?.resolveRegisteredFontId) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `fontFamily '${fontFamily}' is not a standard font and no font registry is available on this host`,\n );\n }\n setDefaultAppearanceRegisteredFont(\n fn,\n annotPtr,\n ctx.resolveRegisteredFontId(fontFamily),\n fontSize,\n color,\n );\n}\n","import {\n type Color,\n type FilledStyleDraftFields,\n type GeometryStyleDraftFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { readBorderStyle } from '../read/annotationReadPrimitives';\nimport { borderStyleFromCode, borderStyleToCode } from '../shapeBorderStyle';\nimport {\n clearAnnotColor,\n setAnnotColor,\n setAnnotOpacity,\n setBorderDashPattern,\n setBorderStyle,\n} from './annotationWritePrimitives';\n\n/** The `/BS` (border) subset shared by every kind that draws a border. */\nexport type BorderDraftFields = Pick<\n GeometryStyleDraftFields,\n 'strokeWidth' | 'borderStyle' | 'dashArray'\n>;\n\n/**\n * Defaults applied when a draft omits a styling field. Shared by every\n * geometric family (shape/vertex/line/ink) so circle, square, polygon,\n * polyline, line, and ink all default to a 1pt solid red stroke.\n */\nexport const DEFAULT_OPACITY = 1;\nexport const DEFAULT_STROKE_WIDTH = 1;\nexport const DEFAULT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/**\n * Apply the geometry styling (`/C`, `/CA`, `/BS`, dash) from a draft to a\n * freshly-created annotation. This is the no-fill layer shared by ink and\n * the filled families; `interiorColor` (`/IC`) is layered on by\n * {@link applyFilledStyleDraft}. Geometry (`/Rect`, `/Vertices`, `/L`,\n * `/InkList`), cloudy borders, rect-differences, and line endings are\n * layered on by the family-specific writer around this call.\n */\nexport function applyGeometryStyleDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: GeometryStyleDraftFields,\n): void {\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n applyBorderDraft(fn, mem, annotPtr, draft);\n}\n\n/**\n * Write the `/BS` border (style + width, then dash) from a draft. This is\n * the border-only slice of {@link applyGeometryStyleDraft}, shared with the\n * free-text box border (which manages `/C` and `/DA` itself). A missing\n * `borderStyle`/`strokeWidth` falls back to a 1pt solid border.\n */\nexport function applyBorderDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: BorderDraftFields,\n): void {\n setBorderStyle(\n fn,\n annotPtr,\n borderStyleToCode(draft.borderStyle ?? 'solid'),\n draft.strokeWidth ?? DEFAULT_STROKE_WIDTH,\n );\n if (draft.dashArray !== undefined && draft.dashArray.length > 0) {\n setBorderDashPattern(fn, mem, annotPtr, draft.dashArray);\n }\n}\n\n/**\n * Apply the geometry styling from a patch to an existing annotation. Only\n * present fields are touched. Border style + width share the single\n * `EPDFAnnot_SetBorderStyle` call, so when only one is patched we read the\n * current pair first and preserve the other.\n */\nexport function applyGeometryStylePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: GeometryStyleDraftFields,\n): void {\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n applyBorderPatch(fn, mem, annotPtr, patch);\n}\n\n/**\n * Write the `/BS` border from a patch, touching only present fields. Border\n * style + width share the single `EPDFAnnot_SetBorderStyle` call, so when\n * only one is patched we read the current pair first and preserve the other.\n * The border-only slice of {@link applyGeometryStylePatch}, shared with the\n * free-text box border.\n */\nexport function applyBorderPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: BorderDraftFields,\n): void {\n if (patch.borderStyle !== undefined || patch.strokeWidth !== undefined) {\n const current = readBorderStyle(fn, mem, annotPtr);\n const style = patch.borderStyle ?? borderStyleFromCode(current.styleCode);\n const width = patch.strokeWidth ?? current.width;\n setBorderStyle(fn, annotPtr, borderStyleToCode(style), width);\n }\n if (patch.dashArray !== undefined && patch.dashArray.length > 0) {\n setBorderDashPattern(fn, mem, annotPtr, patch.dashArray);\n }\n}\n\n/**\n * Apply the full stroke/fill styling (geometry styling + `/IC`) from a\n * draft. A `null`/omitted fill clears `/IC` so the shape renders unfilled.\n * Used by the filled families (circle/square/polygon/polyline/line).\n */\nexport function applyFilledStyleDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: FilledStyleDraftFields,\n): void {\n const interior = draft.interiorColor ?? null;\n if (interior === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n } else {\n setAnnotColor(fn, annotPtr, interior, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n applyGeometryStyleDraft(fn, mem, annotPtr, draft);\n}\n\n/**\n * Apply the full stroke/fill styling from a patch. Only present fields are\n * touched; `interiorColor: null` clears `/IC`.\n */\nexport function applyFilledStylePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: FilledStyleDraftFields,\n): void {\n if (patch.interiorColor !== undefined) {\n if (patch.interiorColor === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n } else {\n setAnnotColor(fn, annotPtr, patch.interiorColor, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n }\n applyGeometryStylePatch(fn, mem, annotPtr, patch);\n}\n","import {\n EngineError,\n EngineErrorCode,\n richTextParagraphsFromPlainText,\n type Color,\n type FreeTextDraft,\n type FreeTextPatch,\n type RichTextDocumentInput,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { freeTextIntentToName } from '../freeTextIntent';\nimport { readDefaultAppearance } from '../read/annotationReadPrimitives';\nimport { engineRichTextJson, faceForFreeTextFont, readEngineRichText } from '../richTextWire';\nimport { DEFAULT_STANDARD_FONT, standardFontFromCode } from '../standardFont';\nimport { textAlignmentToCode } from '../textAlignment';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport {\n clearAnnotColor,\n clearRectangleDifferences,\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setCalloutLine,\n setIntent,\n setLineEndings,\n setRectangleDifferences,\n setTextAlignment,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyDefaultAppearance } from './writeDefaultAppearance';\nimport { applyBorderDraft, applyBorderPatch, DEFAULT_OPACITY } from './writeStyle';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\n\n/**\n * Default `/DA` colour for free text: black (border + default text). Unlike\n * the geometric families (which default to red `/C`), a text box reads best\n * with a black mark.\n */\nconst DEFAULT_FREETEXT_COLOR: Color = { r: 0, g: 0, b: 0 };\n\n/**\n * Write rich text through the engine's rich writer: `/RC`, `/DS`, `/DA`,\n * `/Contents` and the appearance, all or nothing. Faces in the input are\n * resolved from keys / standard names to the identities the engine names.\n */\nfunction writeRichText(\n fn: PdfFunctions,\n annotPtr: Ptr,\n input: RichTextDocumentInput,\n ctx: AnnotationWriteContext | undefined,\n): void {\n const json = engineRichTextJson(input, ctx?.describeRegisteredFont);\n if (!fn.EPDFAnnot_SetRichTextJSON(annotPtr, json)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'rich text could not be written (empty rect, or a font resource could not be built)',\n );\n }\n}\n\n/** `#RRGGBB` for a rich body colour. */\nfunction hexColor(color: Color): string {\n const hex = (n: number) =>\n Math.max(0, Math.min(255, Math.round(n)))\n .toString(16)\n .padStart(2, '0');\n return `#${hex(color.r)}${hex(color.g)}${hex(color.b)}`.toUpperCase();\n}\n\n/**\n * Apply a free-text draft to a freshly-created annotation. Colour model:\n * - `color` -> `/DA` colour = border + default text colour.\n * - `fontColor` (optional) -> `TextColor` channel, overriding text only;\n * written AFTER `/DA` so the override wins.\n * - `interiorColor` -> `/C` box background (`null`/omitted clears it).\n *\n * Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` (required — supplied by the caller; never derived)\n * 3. `/C` background (set or clear) + `/CA` opacity\n * 4. `/BS` border (style + width + dash)\n * 5. `/DA` default appearance (font + size + `color`)\n * 6. `TextColor` override (only when `fontColor` is given)\n * 7. `/Q` text alignment\n * 8. `/IT` intent\n * 9. `/RD` rectangle differences (optional)\n * 10. callout `/CL` + leader `/LE` ending (only for callouts with geometry)\n */\nexport function applyFreeTextDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: FreeTextDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n\n const background = draft.interiorColor ?? null;\n if (background === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.Color);\n } else {\n setAnnotColor(fn, annotPtr, background, FPDFANNOT_COLORTYPE.Color);\n }\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n\n applyBorderDraft(fn, mem, annotPtr, draft);\n\n const daColor = draft.color ?? DEFAULT_FREETEXT_COLOR;\n applyDefaultAppearance(fn, annotPtr, draft.fontFamily, draft.fontSize, daColor, ctx);\n if (draft.fontColor !== undefined) {\n setAnnotColor(fn, annotPtr, draft.fontColor, FPDFANNOT_COLORTYPE.TextColor);\n }\n\n setTextAlignment(fn, annotPtr, textAlignmentToCode(draft.textAlign));\n setIntent(fn, annotPtr, freeTextIntentToName(draft.intent));\n\n if (draft.rectDifferences != null) {\n setRectangleDifferences(fn, annotPtr, draft.rectDifferences);\n }\n\n if (draft.calloutLine !== undefined) {\n setCalloutLine(fn, mem, annotPtr, draft.calloutLine);\n }\n if (draft.lineEnding !== undefined) {\n setLineEndings(fn, annotPtr, { start: 'none', end: draft.lineEnding });\n }\n // A plain text box rotates like square/circle (box model). A callout's\n // rotation applies to its text BOX only (`unrotatedRect` = the logical text\n // box; the /CL leader stays page-space) — the AP generator bakes it as an\n // inline matrix, not the form /Matrix. Absent fields simply clear the keys.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: draft.rotation,\n unrotatedRect: draft.unrotatedRect,\n });\n\n // Rich text last, always: a box is born with all four forms (/RC, /DS,\n // /DA, /Contents) and its appearance, Acrobat's shape — from the draft's\n // rich document, else from its plain contents as body-style paragraphs.\n // The body becomes the body style (the /DA font and size follow it; the\n // /DA colour written above is kept). Must come after the geometry, which\n // the layout needs.\n writeRichText(\n fn,\n annotPtr,\n draft.richText ?? { paragraphs: richTextParagraphsFromPlainText(draft.contents ?? '') },\n ctx,\n );\n}\n\n/**\n * Apply a free-text patch to an existing annotation. Only present fields are\n * touched. `/DA` packs the font, size, and `color` into ONE string, so a\n * partial patch preserves the unpatched members by READING the current triple\n * first (the same read-modify-write as {@link applyBorderPatch}'s shared\n * `/BS` call) — a `{fontSize}` patch must never reset the font or colour.\n * Registered (embedded) fonts are the one caveat: the current `/DA` reads\n * back as a font CODE, so preserving a registered family requires the patch\n * to restate `fontFamily` (an unknown code falls back to the standard-font\n * default).\n *\n * `fontColor` here only sets an override; clearing it back to \"follow\n * `color`\" is out of scope this iteration.\n */\nexport function applyFreeTextPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: FreeTextPatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n // Transform metadata is tri-state per field (undefined preserves, null\n // clears, value sets) — independent of whether /Rect was rewritten. A\n // rect-only patch on a rotated box keeps its rotation.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n\n if (patch.interiorColor !== undefined) {\n if (patch.interiorColor === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.Color);\n } else {\n setAnnotColor(fn, annotPtr, patch.interiorColor, FPDFANNOT_COLORTYPE.Color);\n }\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n\n applyBorderPatch(fn, mem, annotPtr, patch);\n\n // The patch table (plan §4.7, one engine since D4): every text write goes\n // through the rich document — the body style lives there and the engine\n // derives /DA from it — so the legacy /DA read-modify-write only carries\n // the DA COLOUR (the border and leader), and the font, size, text colour\n // and alignment are body-style changes.\n const current = readEngineRichText(fn, mem, annotPtr);\n if (patch.color !== undefined) {\n const cur = readDefaultAppearance(fn, mem, annotPtr);\n applyDefaultAppearance(\n fn,\n annotPtr,\n cur ? standardFontFromCode(cur.fontCode) : DEFAULT_STANDARD_FONT,\n cur && cur.fontSize > 0 ? cur.fontSize : 12,\n patch.color,\n ctx,\n );\n }\n if (patch.fontColor !== undefined) {\n setAnnotColor(fn, annotPtr, patch.fontColor, FPDFANNOT_COLORTYPE.TextColor);\n }\n {\n if (patch.richText !== undefined) {\n // Rich replacement: everything regenerated. (`contents`, if also\n // given, was checked against its projection before the write.)\n writeRichText(fn, annotPtr, patch.richText, ctx);\n } else if (patch.contents !== undefined) {\n // Plain-text replacement: body-style paragraphs, one per line break.\n // Run formatting is lost by design — a plain-text client cannot\n // preserve what it cannot see.\n writeRichText(\n fn,\n annotPtr,\n { paragraphs: richTextParagraphsFromPlainText(patch.contents ?? '') },\n ctx,\n );\n } else if (\n current &&\n (patch.fontFamily !== undefined ||\n patch.fontSize !== undefined ||\n patch.fontColor !== undefined ||\n patch.textAlign !== undefined)\n ) {\n // Default-style change: the body moves; runs are deltas, so every run\n // that did not override the property follows. Alignment is a body\n // property too: the /RC body's text-align wins over /Q on\n // regeneration, so /Q alone (set below) would not move a rich box.\n const body = { ...current.body };\n if (patch.fontFamily !== undefined) {\n const face = faceForFreeTextFont(patch.fontFamily, ctx?.describeRegisteredFont);\n body.family = face.family;\n if (face.weight !== undefined) body.weight = face.weight;\n if (face.italic !== undefined) body.italic = face.italic;\n }\n if (patch.fontSize !== undefined) body.size = patch.fontSize;\n if (patch.fontColor !== undefined) body.color = hexColor(patch.fontColor);\n if (patch.textAlign !== undefined) body.align = patch.textAlign;\n writeRichText(fn, annotPtr, { body, paragraphs: current.paragraphs }, ctx);\n }\n }\n\n if (patch.textAlign !== undefined) {\n setTextAlignment(fn, annotPtr, textAlignmentToCode(patch.textAlign));\n }\n if (patch.intent !== undefined) {\n setIntent(fn, annotPtr, freeTextIntentToName(patch.intent));\n }\n\n if (patch.rectDifferences === null) {\n clearRectangleDifferences(fn, annotPtr);\n } else if (patch.rectDifferences !== undefined) {\n setRectangleDifferences(fn, annotPtr, patch.rectDifferences);\n }\n\n if (patch.calloutLine !== undefined) {\n setCalloutLine(fn, mem, annotPtr, patch.calloutLine);\n }\n if (patch.lineEnding !== undefined) {\n setLineEndings(fn, annotPtr, { start: 'none', end: patch.lineEnding });\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the\n * free-text writer for a draft/patch's `subtype`.\n */\nexport function isFreeTextSubtype(subtype: string): subtype is 'free-text' {\n return subtype === 'free-text';\n}\n","import type { InkDraft, InkPatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { setAnnotRect, setInkList, setIntent } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyGeometryStyleDraft, applyGeometryStylePatch } from './writeStyle';\nimport { writeVertexTransformMetadata } from './writeAnnotationTransformMetadata';\nimport { inkIntentToName } from '../inkIntent';\n\n/**\n * Apply an ink draft to a freshly-created annotation. Ink has a stroke but\n * no `/IC`, so it uses the geometry styling layer (not the filled one).\n * Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin; the engine never derives it)\n * 3. geometry styling (/C, /CA, /BS, dash)\n * 4. /InkList freehand strokes\n */\nexport function applyInkDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: InkDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n if (draft.intent !== undefined) setIntent(fn, annotPtr, inkIntentToName(draft.intent));\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyGeometryStyleDraft(fn, mem, annotPtr, draft);\n setInkList(fn, mem, annotPtr, draft.inkList);\n // Advisory rotation: the strokes are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyInkPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: InkPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.intent !== undefined) setIntent(fn, annotPtr, inkIntentToName(patch.intent));\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyGeometryStylePatch(fn, mem, annotPtr, patch);\n if (patch.inkList !== undefined) {\n setInkList(fn, mem, annotPtr, patch.inkList);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the ink\n * writer for a draft/patch's `subtype`.\n */\nexport function isInkSubtype(subtype: string): subtype is 'ink' {\n return subtype === 'ink';\n}\n","import type { LineDraft, LinePatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { setAnnotRect, setLine, setLineEndings } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyFilledStyleDraft, applyFilledStylePatch } from './writeStyle';\nimport { writeVertexTransformMetadata } from './writeAnnotationTransformMetadata';\n\n/** Default line endings when a line draft omits them. */\nconst DEFAULT_LINE_ENDINGS = { start: 'none', end: 'none' } as const;\n\n/**\n * Apply a line draft to a freshly-created annotation. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin; the engine never derives it)\n * 3. shared stroke/fill styling (/C, /CA, /BS, dash)\n * 4. /L line geometry\n * 5. /LE line endings (default none/none)\n */\nexport function applyLineDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: LineDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n setLine(fn, mem, annotPtr, draft.linePoints);\n setLineEndings(fn, annotPtr, draft.lineEndings ?? DEFAULT_LINE_ENDINGS);\n // Advisory rotation: the endpoints are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyLinePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: LinePatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n if (patch.linePoints !== undefined) {\n setLine(fn, mem, annotPtr, patch.linePoints);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n if (patch.lineEndings !== undefined) {\n setLineEndings(fn, annotPtr, patch.lineEndings);\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the line\n * writer for a draft/patch's `subtype`.\n */\nexport function isLineSubtype(subtype: string): subtype is 'line' {\n return subtype === 'line';\n}\n","import {\n EngineError,\n EngineErrorCode,\n type LinkDraft,\n type LinkPatch,\n type PdfDestination,\n type PdfLinkTargetWritable,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\nimport { NULL_PTR } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from '../../../../runtime/memory/scratch';\nimport { F32_BYTES } from '../../../../runtime/memory/structs';\nimport { VIEW_CODE_BY_KIND } from '../../../destinations/destinationViewCodes';\nimport { setAnnotRect } from './annotationWritePrimitives';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\n\n/**\n * Link writer: rect + the `/A` action. Only `goto`/`uri` targets are\n * writable (the draft/patch types enforce it; `goto-remote`/`launch` are\n * read-only by design). Relationship (`/IRT` + `/RT` — v2's grouped links)\n * is written by the mutator's kind-agnostic relationship pass, never here.\n *\n * A retarget REPLACES `/A`; it cannot remove a pre-existing direct `/Dest`\n * (no dict-entry removal primitive in the runtime), which is why the link\n * READER gives `/A` precedence — see readLinkAnnotation.ts.\n */\nexport function applyLinkDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: LinkDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n // `target: null` is the create-then-edit flow: the rect exists first, a\n // later patch supplies the destination/URI. Nothing to write yet.\n if (draft.target) applyLinkTarget(fn, mem, annotPtr, draft.target, ctx);\n}\n\nexport function applyLinkPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: LinkPatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) setAnnotRect(fn, mem, annotPtr, patch.rect);\n if (patch.target === null) clearLinkTarget(fn, annotPtr);\n else if (patch.target !== undefined) applyLinkTarget(fn, mem, annotPtr, patch.target, ctx);\n}\n\n/**\n * `target: null` → a dead link. The model treats the target as ONE concept\n * with two spellings, so THIS layer composes the two single-purpose\n * removal primitives — removing only `/A` would resurrect a stale direct\n * `/Dest` as the live target.\n */\nfunction clearLinkTarget(fn: PdfFunctions, annotPtr: Ptr): void {\n if (!fn.EPDFAnnot_RemoveAction(annotPtr) || !fn.EPDFAnnot_RemoveDest(annotPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to clear link target');\n }\n}\n\nexport function isLinkSubtype(subtype: string): subtype is 'link' {\n return subtype === 'link';\n}\n\nfunction applyLinkTarget(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n target: PdfLinkTargetWritable,\n ctx?: AnnotationWriteContext,\n): void {\n const docPtr = ctx?.docPtr;\n if (!docPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'writing a link target requires a document pointer on the write context',\n );\n }\n\n const actionPtr =\n target.kind === 'uri'\n ? fn.EPDFAction_CreateURI(docPtr, target.uri)\n : fn.EPDFAction_CreateGoTo(docPtr, createDestination(fn, mem, docPtr, target.destination));\n if (!actionPtr) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to create '${target.kind}' action`);\n }\n if (!fn.EPDFAnnot_SetAction(annotPtr, actionPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetAction failed for link');\n }\n}\n\n/**\n * Build an INDIRECT explicit-destination array for `dest`. The target page\n * is loaded just to reference its dictionary and closed immediately —\n * destinations routinely point at pages the mutator's pool never touches.\n */\nfunction createDestination(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n docPtr: Ptr,\n dest: PdfDestination,\n): Ptr {\n const pagePtr = fn.EPDFDoc_LoadPageByObjectNumber(docPtr, dest.pageObjectNumber);\n if (!pagePtr) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `link destination page not found: pageObjectNumber=${dest.pageObjectNumber}`,\n );\n }\n try {\n const destPtr =\n dest.kind === 'xyz'\n ? // Absent axes write PDF nulls (spec: \"retain current value\").\n fn.EPDFDest_CreateXYZ(\n pagePtr,\n dest.left != null,\n dest.left ?? 0,\n dest.top != null,\n dest.top ?? 0,\n dest.zoom != null,\n dest.zoom ?? 0,\n )\n : createViewDestination(fn, mem, pagePtr, dest);\n if (!destPtr) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to create '${dest.kind}' destination`);\n }\n return destPtr;\n } finally {\n fn.FPDF_ClosePage(pagePtr);\n }\n}\n\nfunction createViewDestination(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n pagePtr: Ptr,\n dest: Exclude<PdfDestination, { kind: 'xyz' }>,\n): Ptr {\n // The runtime pads missing params with 0 up to the fit type's arity —\n // a null top/left therefore writes as 0 (v2 parity; the array form has\n // no per-param null encoding through this API).\n const params: number[] = (() => {\n switch (dest.kind) {\n case 'fitH':\n case 'fitBH':\n return dest.top != null ? [dest.top] : [];\n case 'fitV':\n case 'fitBV':\n return dest.left != null ? [dest.left] : [];\n case 'fitR':\n return [dest.left, dest.bottom, dest.right, dest.top];\n default:\n return [];\n }\n })();\n\n const view = VIEW_CODE_BY_KIND[dest.kind];\n if (!params.length) return fn.EPDFDest_CreateView(pagePtr, view, NULL_PTR, 0);\n return withScratch(mem, params.length * F32_BYTES, (buf) => {\n for (let i = 0; i < params.length; i++) mem.poke(buf, 'f32', params[i]!, i * F32_BYTES);\n return fn.EPDFDest_CreateView(pagePtr, view, buf, params.length);\n });\n}\n","import {\n EngineError,\n EngineErrorCode,\n type Color,\n type HighlightDraft,\n type HighlightPatch,\n type PdfQuad,\n type SquigglyDraft,\n type SquigglyPatch,\n type StrikeoutDraft,\n type StrikeoutPatch,\n type UnderlineDraft,\n type UnderlinePatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setIntent,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { strikeoutIntentToName } from '../textEditIntent';\n\n/**\n * Default opacity when a draft omits `opacity`. PDFium's /CA defaults to\n * 1.0 if absent from the dict, but we set it explicitly so reads always\n * round-trip the same value.\n */\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Default fill colour per text-markup subtype. Matches the read-side\n * fallback in `readers/annotations/text-markup.ts`.\n */\nconst DEFAULT_HIGHLIGHT_COLOR: Color = { r: 255, g: 255, b: 0 };\nconst DEFAULT_TEXT_MARKUP_COLOR: Color = { r: 0, g: 0, b: 0 };\n\nexport type TextMarkupDraft = HighlightDraft | UnderlineDraft | SquigglyDraft | StrikeoutDraft;\nexport type TextMarkupPatch = HighlightPatch | UnderlinePatch | SquigglyPatch | StrikeoutPatch;\n\n/**\n * Apply a text-markup draft to a freshly-created annotation. Caller is\n * responsible for `EPDFPage_CreateAnnot`; this function only writes\n * fields. Order:\n * 1. base author-metadata (contents/author/nm)\n * 2. quadPoints (required for text-markup; 0-length is a typed error)\n * 3. rect (computed from quadPoints when not supplied — text-markup\n * annotations require /Rect to be the smallest enclosing box)\n * 4. color (with subtype-aware fallback)\n * 5. opacity (/CA)\n */\nexport function applyTextMarkupDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: TextMarkupDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n\n const quadPoints = draft.quadPoints;\n if (!Array.isArray(quadPoints) || quadPoints.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `text-markup draft (${draft.subtype}) requires at least one quadPoint`,\n );\n }\n appendQuadPoints(fn, mem, annotPtr, quadPoints);\n setRectFromQuadPoints(fn, mem, annotPtr, quadPoints);\n\n const fallback =\n draft.subtype === 'highlight' ? DEFAULT_HIGHLIGHT_COLOR : DEFAULT_TEXT_MARKUP_COLOR;\n setAnnotColor(fn, annotPtr, draft.color ?? fallback);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n if (draft.subtype === 'strikeout' && draft.intent !== undefined) {\n setIntent(fn, annotPtr, strikeoutIntentToName(draft.intent));\n }\n}\n\n/**\n * Apply a text-markup patch to an existing annotation. Order:\n * 1. base author-metadata (contents/author; never /NM)\n * 2. color (only if present)\n * 3. opacity (only if present)\n * 4. quadPoints (only if present, AND non-empty — the schema accepts an\n * empty array but PDFium would treat it as a deletion of the\n * attachment-point list, which is never the user's intent. We\n * explicitly reject the empty-array case).\n *\n * `rect` is recomputed only when quadPoints change, to keep /Rect in sync\n * with the smallest enclosing box.\n */\nexport function applyTextMarkupPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: TextMarkupPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.subtype === 'strikeout' && patch.intent !== undefined) {\n setIntent(fn, annotPtr, strikeoutIntentToName(patch.intent));\n }\n if (patch.quadPoints !== undefined) {\n if (patch.quadPoints.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `text-markup patch quadPoints, when present, must be non-empty`,\n );\n }\n replaceQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n setRectFromQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n }\n}\n\n/**\n * Type-narrowing predicate. Mirrors the reader-side dispatch. Used by\n * the writer registry to pick the right writer for a draft/patch's\n * `subtype` discriminator.\n */\nexport function isTextMarkupSubtype(\n subtype: string,\n): subtype is 'highlight' | 'underline' | 'squiggly' | 'strikeout' {\n return (\n subtype === 'highlight' ||\n subtype === 'underline' ||\n subtype === 'squiggly' ||\n subtype === 'strikeout'\n );\n}\n\nexport function appendQuadPoints(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n quadPoints: PdfQuad[],\n): void {\n const buf = mem.alloc(32);\n try {\n for (const qp of quadPoints) {\n writeQuadPointStruct(mem, buf, qp);\n const ok = fn.FPDFAnnot_AppendAttachmentPoints(annotPtr, buf);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'FPDFAnnot_AppendAttachmentPoints returned false',\n );\n }\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Replace the existing quadPoints with the supplied list. PDFium has\n * `FPDFAnnot_SetAttachmentPoints` which writes at index, but no truncate\n * helper, so we overwrite as many existing slots as we can and append\n * the rest. PDFium will GROW the list via append, but it cannot SHRINK\n * it; for that reason `applyTextMarkupPatch` rejects an empty patch and\n * the conformance suite covers the \"patch must not shrink quadPoints\"\n * rule (`patch.quadPoints.length >= existingCount`).\n */\nexport function replaceQuadPoints(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n quadPoints: PdfQuad[],\n): void {\n const existing = fn.FPDFAnnot_CountAttachmentPoints(annotPtr);\n if (quadPoints.length < existing) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `text-markup patch cannot shrink quadPoints (have ${existing}, patch supplies ${quadPoints.length})`,\n );\n }\n\n const buf = mem.alloc(32);\n try {\n for (let i = 0; i < existing; i++) {\n writeQuadPointStruct(mem, buf, quadPoints[i]!);\n const ok = fn.FPDFAnnot_SetAttachmentPoints(annotPtr, i, buf);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFAnnot_SetAttachmentPoints failed at index ${i}`,\n );\n }\n }\n for (let i = existing; i < quadPoints.length; i++) {\n writeQuadPointStruct(mem, buf, quadPoints[i]!);\n const ok = fn.FPDFAnnot_AppendAttachmentPoints(annotPtr, buf);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFAnnot_AppendAttachmentPoints failed at index ${i}`,\n );\n }\n }\n } finally {\n mem.free(buf);\n }\n}\n\nfunction writeQuadPointStruct(mem: PdfRuntimeMemory, buf: Ptr, qp: PdfQuad): void {\n // FS_QUADPOINTSF layout per public/fpdf_annot.h: { x1,y1, x2,y2, x3,y3, x4,y4 }\n // = p1 p2 p3 p4 — same positional slot order as readQuadPoints.\n mem.poke(buf, 'f32', qp.p1.x, 0);\n mem.poke(buf, 'f32', qp.p1.y, 4);\n mem.poke(buf, 'f32', qp.p2.x, 8);\n mem.poke(buf, 'f32', qp.p2.y, 12);\n mem.poke(buf, 'f32', qp.p3.x, 16);\n mem.poke(buf, 'f32', qp.p3.y, 20);\n mem.poke(buf, 'f32', qp.p4.x, 24);\n mem.poke(buf, 'f32', qp.p4.y, 28);\n}\n\nexport function setRectFromQuadPoints(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n quadPoints: PdfQuad[],\n): void {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const qp of quadPoints) {\n for (const p of [qp.p1, qp.p2, qp.p3, qp.p4]) {\n if (p.x < minX) minX = p.x;\n if (p.x > maxX) maxX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.y > maxY) maxY = p.y;\n }\n }\n\n // /Rect must be the smallest box enclosing every quad.\n setAnnotRect(fn, mem, annotPtr, { left: minX, top: maxY, right: maxX, bottom: minY });\n}\n","import type { Color, RedactDraft, RedactPatch } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { FPDFANNOT_COLORTYPE } from '../colorType';\nimport { DEFAULT_STANDARD_FONT } from '../standardFont';\nimport { textAlignmentToCode } from '../textAlignment';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport {\n clearAnnotColor,\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n setOverlayText,\n setOverlayTextRepeat,\n setTextAlignment,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyDefaultAppearance } from './writeDefaultAppearance';\nimport { DEFAULT_OPACITY } from './writeStyle';\nimport {\n appendQuadPoints,\n replaceQuadPoints,\n setRectFromQuadPoints,\n} from './writeTextMarkupAnnotation';\n\n/** Default `/C` marking outline: red — the redaction marking convention (and\n * the AP generator's default). */\nconst DEFAULT_REDACT_COLOR: Color = { r: 255, g: 0, b: 0 };\n\n/** Default `/DA` label colour: black, mirroring free text. Tools that pair a\n * label with a dark `interiorColor` should set a light `fontColor`\n * explicitly. */\nconst DEFAULT_LABEL_COLOR: Color = { r: 0, g: 0, b: 0 };\n\nconst DEFAULT_FONT_SIZE = 12;\n\n/**\n * True when the draft/patch carries the label or any `/DA` member — i.e. the\n * `/DA` must be (re)written. ISO 32000-2 requires a `/DA` alongside\n * `/OverlayText`, so setting a label always emits one (defaults filling any\n * omitted triple member). Clearing the label (`overlayText: null`) does not.\n */\nfunction touchesLabelStyle(p: {\n overlayText?: string | null;\n fontFamily?: unknown;\n fontSize?: number;\n fontColor?: Color;\n}): boolean {\n return (\n (p.overlayText !== undefined && p.overlayText !== null) ||\n p.fontFamily !== undefined ||\n p.fontSize !== undefined ||\n p.fontColor !== undefined\n );\n}\n\n/**\n * Apply a redact draft to a freshly-created annotation. Colour model:\n * - `color` -> `/C` marking-stage outline.\n * - `interiorColor` -> `/IC` post-apply fill (`null`/omitted = the key is\n * never written; ISO leaves the region transparent).\n * - `fontColor` -> the `/DA` colour (label text).\n *\n * Order:\n * 1. base author-metadata (contents/nm/flags)\n * 2. `/Rect` (required — supplied by the caller; never derived)\n * 3. `/QuadPoints` (text redactions only)\n * 4. `/C` outline + `/CA` opacity + `/IC` fill\n * 5. `/OverlayText` + `/Repeat`\n * 6. `/DA` (only when a label field is present)\n * 7. `/Q` label alignment\n */\nexport function applyRedactDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: RedactDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n if (draft.quadPoints && draft.quadPoints.length > 0) {\n appendQuadPoints(fn, mem, annotPtr, draft.quadPoints);\n }\n\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_REDACT_COLOR, FPDFANNOT_COLORTYPE.Color);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n const fill = draft.interiorColor ?? null;\n if (fill !== null) {\n setAnnotColor(fn, annotPtr, fill, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n\n if (draft.overlayText !== undefined && draft.overlayText.length > 0) {\n setOverlayText(fn, mem, annotPtr, draft.overlayText);\n }\n if (draft.repeat) {\n setOverlayTextRepeat(fn, annotPtr, true);\n }\n if (touchesLabelStyle(draft)) {\n applyDefaultAppearance(\n fn,\n annotPtr,\n draft.fontFamily ?? DEFAULT_STANDARD_FONT,\n draft.fontSize ?? DEFAULT_FONT_SIZE,\n draft.fontColor ?? DEFAULT_LABEL_COLOR,\n ctx,\n );\n }\n if (draft.textAlign !== undefined) {\n setTextAlignment(fn, annotPtr, textAlignmentToCode(draft.textAlign));\n }\n}\n\n/**\n * Apply a redact patch to an existing annotation. Only present fields are\n * touched. `/DA` follows the free-text triple rule: send `fontFamily` +\n * `fontSize` + `fontColor` together when changing any of them. `quadPoints`\n * shares the text-markup no-shrink constraint (PDFium can grow but not\n * shrink the attachment-points list); patching quads re-derives `/Rect` from\n * their bounds unless the patch also carries an explicit `rect`.\n */\nexport function applyRedactPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: RedactPatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.quadPoints !== undefined) {\n replaceQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n if (patch.rect === undefined) {\n setRectFromQuadPoints(fn, mem, annotPtr, patch.quadPoints);\n }\n }\n\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color, FPDFANNOT_COLORTYPE.Color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.interiorColor !== undefined) {\n if (patch.interiorColor === null) {\n clearAnnotColor(fn, annotPtr, FPDFANNOT_COLORTYPE.InteriorColor);\n } else {\n setAnnotColor(fn, annotPtr, patch.interiorColor, FPDFANNOT_COLORTYPE.InteriorColor);\n }\n }\n\n if (patch.overlayText !== undefined) {\n // The native setter removes the key for an empty string, so `null`\n // (clear the label) maps to ''.\n setOverlayText(fn, mem, annotPtr, patch.overlayText ?? '');\n }\n if (patch.repeat !== undefined) {\n setOverlayTextRepeat(fn, annotPtr, patch.repeat);\n }\n if (touchesLabelStyle(patch)) {\n applyDefaultAppearance(\n fn,\n annotPtr,\n patch.fontFamily ?? DEFAULT_STANDARD_FONT,\n patch.fontSize ?? DEFAULT_FONT_SIZE,\n patch.fontColor ?? DEFAULT_LABEL_COLOR,\n ctx,\n );\n }\n if (patch.textAlign !== undefined) {\n setTextAlignment(fn, annotPtr, textAlignmentToCode(patch.textAlign));\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the redact\n * writer for a draft/patch's `subtype`.\n */\nexport function isRedactSubtype(subtype: string): subtype is 'redact' {\n return subtype === 'redact';\n}\n","import {\n type CircleDraft,\n type CirclePatch,\n type SquareDraft,\n type SquarePatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n clearBorderEffect,\n clearRectangleDifferences,\n setAnnotRect,\n setBorderEffect,\n setRectangleDifferences,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyFilledStyleDraft, applyFilledStylePatch } from './writeStyle';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\n\nexport type ShapeDraft = CircleDraft | SquareDraft;\nexport type ShapePatch = CirclePatch | SquarePatch;\n\n/**\n * Apply a shape draft to a freshly-created annotation. Caller is\n * responsible for `EPDFPage_CreateAnnot`; this function only writes\n * fields. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — shapes carry their geometry as /Rect, not quads)\n * 3. shared stroke/fill styling (/IC, /C, /CA, /BS, dash)\n * 4. optional cloudy (/BE), rect-diff (/RD)\n */\nexport function applyShapeDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: ShapeDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n\n if (draft.cloudyIntensity != null && draft.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, draft.cloudyIntensity);\n }\n if (draft.rectDifferences != null) {\n setRectangleDifferences(fn, annotPtr, draft.rectDifferences);\n }\n // /Rect above is the rotated visual AABB; the rotation metadata tells the AP\n // generator to bake a /Matrix from the unrotated box.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: draft.rotation,\n unrotatedRect: draft.unrotatedRect,\n });\n}\n\n/**\n * Apply a shape patch to an existing annotation. Only fields present on\n * the patch are touched; `cloudyIntensity` and `rectDifferences` are\n * tri-state (as `interiorColor`): a value sets the entry, `null` removes it.\n */\nexport function applyShapePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: ShapePatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n // Transform metadata is tri-state per field (undefined preserves, null\n // clears, value sets) — independent of whether /Rect was rewritten. A\n // rect-only patch on a rotated box keeps its rotation.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n\n if (patch.cloudyIntensity !== undefined) {\n if (patch.cloudyIntensity !== null && patch.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, patch.cloudyIntensity);\n } else {\n // `null` removes /BE (tri-state). The schema forbids 0, but treat any\n // non-positive value defensively as a clear — never write a degenerate\n // /BE the read side would normalize away.\n clearBorderEffect(fn, annotPtr);\n }\n }\n if (patch.rectDifferences === null) {\n clearRectangleDifferences(fn, annotPtr);\n } else if (patch.rectDifferences !== undefined) {\n setRectangleDifferences(fn, annotPtr, patch.rectDifferences);\n }\n}\n\n/**\n * Type-narrowing predicate. Mirrors the reader-side dispatch. Used by the\n * writer registry to pick the shape writer for a draft/patch's `subtype`.\n */\nexport function isShapeSubtype(subtype: string): subtype is 'circle' | 'square' {\n return subtype === 'circle' || subtype === 'square';\n}\n","import {\n EngineError,\n EngineErrorCode,\n sniffBinaryMetadata,\n type BinaryMetadata,\n type PdfRect,\n type ResourceRef,\n type StampFit,\n type StampWireDraft,\n type StampWirePatch,\n type WireResource,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { F32_BYTES } from '../../../../runtime/memory/structs';\nimport { readAnnotRect } from '../read/annotationReadPrimitives';\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { setAnnotRect } from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { writeBoxTransformMetadata } from './writeAnnotationTransformMetadata';\n\n/** `EPDF_STAMP_FIT` codes from `public/fpdf_annot.h` (CSS `object-fit` naming on the wire). */\nconst STAMP_FIT_TO_CODE: Record<StampFit, number> = {\n contain: 0, // EPDF_STAMP_FIT_CONTAIN\n cover: 1, // EPDF_STAMP_FIT_COVER\n fill: 2, // EPDF_STAMP_FIT_STRETCH\n};\n\n/**\n * Validate every caller-controlled stamp input before the mutation owner\n * performs its first native write. AnnotationMutator invokes these before\n * creating an annotation or strengthening a weak annotation id.\n */\nexport function preflightStampDraft(draft: StampWireDraft, ctx?: AnnotationWriteContext): void {\n if (draft.name !== undefined) requireStampName(draft.name);\n requireStampFit(draft.fit ?? 'contain');\n requireStampContent(draft.source, ctx);\n}\n\nexport function preflightStampPatch(patch: StampWirePatch, ctx?: AnnotationWriteContext): void {\n if (patch.name !== undefined && patch.name !== null) requireStampName(patch.name);\n requireStampFit(patch.fit ?? 'contain');\n if (patch.source !== undefined) requireStampContent(patch.source, ctx);\n}\n\n/**\n * Apply a stamp draft. Order mirrors the other writers (base → subtype\n * fields), then the appearance pipeline via {@link authorStampAppearance}:\n * 1. resolve the `{ resource }` ref against the mutation's binary payloads\n * 2. sniff the bytes (PNG/JPEG → image object, PDF → cloned form XObject)\n * 3. `EPDFAnnot_UpdateAppearanceToRect` fits the appearance into the box\n * honouring `fit` and any `/EMBD_Metadata` rotation.\n * The mutator's `EPDFAnnot_GenerateAppearance` pass afterwards is a no-op\n * for stamps (CPDF_GenerateAP has no stamp arm), so the appearance built\n * here is what ships.\n */\nexport function applyStampDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: StampWireDraft,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n if (draft.name !== undefined) {\n setStampName(fn, annotPtr, draft.name);\n }\n authorStampAppearance(\n fn,\n mem,\n annotPtr,\n draft.source,\n draft.fit ?? 'contain',\n {\n rect: draft.rect,\n // The appearance author wants values-or-absent; a tri-state `null`\n // (no rotation) authors the same as an omitted field.\n unrotatedRect: draft.unrotatedRect ?? undefined,\n rotation: draft.rotation ?? undefined,\n },\n ctx,\n );\n}\n\nexport function applyStampPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: StampWirePatch,\n ctx?: AnnotationWriteContext,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.name === null) {\n // Removal is the generic key removal — the reader then reports the\n // spec default; the appearance (the artwork) is untouched.\n fn.EPDFAnnot_RemoveKey(annotPtr, 'Name');\n } else if (patch.name !== undefined) {\n setStampName(fn, annotPtr, patch.name);\n }\n if (patch.source !== undefined) {\n // Content replacement: rebuild the appearance from the new bytes, authored\n // in the unrotated frame (see authorStampAppearance) so a rotated stamp\n // never double-fits into its padded AABB.\n const rect = patch.rect ?? readAnnotRect(fn, mem, annotPtr);\n authorStampAppearance(\n fn,\n mem,\n annotPtr,\n patch.source,\n patch.fit ?? 'contain',\n {\n rect,\n unrotatedRect: patch.unrotatedRect ?? undefined,\n rotation: patch.rotation ?? undefined,\n },\n ctx,\n );\n return;\n }\n // No new bytes: geometry / rotation / fit only.\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n // Transform metadata is tri-state per field (undefined preserves, null/0\n // clears, value sets) — a rect-only re-position keeps the rotation, and\n // rotate-back-to-0 is stated explicitly (`rotation: null`/`0`) by the\n // emitter rather than implied by omission.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: patch.rotation,\n unrotatedRect: patch.unrotatedRect,\n });\n if (\n patch.rect !== undefined ||\n patch.fit !== undefined ||\n patch.rotation !== undefined ||\n patch.unrotatedRect !== undefined\n ) {\n // Geometry-only patch: re-fit the existing appearance into the new /Rect.\n refitAppearance(fn, annotPtr, patch.fit ?? 'contain');\n }\n}\n\nexport function isStampSubtype(subtype: string): subtype is 'stamp' {\n return subtype === 'stamp';\n}\n\n/** Any non-empty name: standard ('Approved') or custom ('#LBGiYhk8V…') —\n * the fork writes a name object and escapes it; predefined sets are a\n * reader concern (ISO 32000-2 table 187 allows additional names). */\nfunction setStampName(fn: PdfFunctions, annotPtr: Ptr, name: string): void {\n if (!fn.EPDFAnnot_SetName(annotPtr, name)) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetName returned false');\n }\n}\n\nfunction requireStampName(name: string): void {\n if (name.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'stamp name must be non-empty');\n }\n}\n\nfunction requireStampFit(fit: StampFit): void {\n if (STAMP_FIT_TO_CODE[fit] === undefined) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `unknown stamp fit '${String(fit)}'; expected contain, cover, or fill`,\n );\n }\n}\n\nfunction requireStampResource(\n ref: ResourceRef,\n ctx: AnnotationWriteContext | undefined,\n): WireResource {\n const resource = ctx?.resources?.[ref.resource];\n if (!resource) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `stamp source references resource '${ref.resource}' but no such binary payload accompanied the mutation`,\n );\n }\n return resource;\n}\n\nfunction requireStampContent(ref: ResourceRef, ctx: AnnotationWriteContext | undefined): void {\n const resource = requireStampResource(ref, ctx);\n if (!(resource.bytes instanceof ArrayBuffer) || !sniffBinaryMetadata(resource.bytes)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'stamp source must be PNG, JPEG, or single-page PDF bytes',\n );\n }\n if (ctx?.docPtr === undefined || ctx.pagePtr === undefined) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'stamp writer requires docPtr/pagePtr on the write context',\n );\n }\n}\n\n/** The box transform a stamp draft/patch carries (the box-kind rotation split). */\ninterface StampBox {\n /** `/Rect` — the rotated visual AABB when rotated; the box itself otherwise. */\n rect: PdfRect;\n /** The logical (pre-rotation) box; present only alongside a non-zero rotation. */\n unrotatedRect?: PdfRect;\n /** `/EMBD_Metadata/Rotation` (deg, PDF convention). */\n rotation?: number;\n}\n\n/**\n * Author a stamp's appearance from `source`, correct under rotation.\n *\n * The appearance MUST be built in the UNROTATED frame and rotated by an\n * `/AP /Matrix` afterwards — the \"FreeText pattern\" the stamp draft documents.\n * If instead the image is fit into the rotated AABB `/Rect` (a portrait box for\n * a landscape image, say), the letterboxed bands get baked into the appearance,\n * and the closing native re-fit — which records `EPDFOrigContentRect` from that\n * padded box and then fits it into the unrotated box — shrinks the image by the\n * aspect ratio a SECOND time. The result is a small image adrift in white\n * padding, and only when rotated (at 0° the two frames coincide, so it fills).\n *\n * So for a rotated stamp we: author the image into the UNROTATED box with no\n * rotation metadata active (its recorded `EPDFOrigContentRect` is the\n * image-filled logical box), then write the rotation metadata, set the real\n * AABB `/Rect`, and re-fit once — which bakes the `/Matrix` and leaves the\n * appearance filling the box exactly as the 0° case does. The unrotated path is\n * unchanged: author straight into `/Rect`.\n */\nfunction authorStampAppearance(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n source: ResourceRef,\n fit: StampFit,\n box: StampBox,\n ctx: AnnotationWriteContext | undefined,\n): void {\n const rotated = !!box.rotation && box.unrotatedRect !== undefined;\n if (!rotated) {\n setAnnotRect(fn, mem, annotPtr, box.rect);\n setStampContent(fn, mem, annotPtr, source, fit, box.rect, ctx);\n return;\n }\n const unrotated = box.unrotatedRect!;\n // 1. Author in the unrotated frame — clear any rotation metadata first so the\n // internal re-fit records an image-shaped EPDFOrigContentRect, not the AABB.\n writeBoxTransformMetadata(fn, mem, annotPtr, {});\n setAnnotRect(fn, mem, annotPtr, unrotated);\n setStampContent(fn, mem, annotPtr, source, fit, unrotated, ctx);\n // 2. Apply the transform: metadata bakes the /Matrix, /Rect becomes the AABB,\n // and one re-fit reconciles BBox + Matrix from the now-recorded content.\n writeBoxTransformMetadata(fn, mem, annotPtr, {\n rotation: box.rotation,\n unrotatedRect: unrotated,\n });\n setAnnotRect(fn, mem, annotPtr, box.rect);\n refitAppearance(fn, annotPtr, fit);\n}\n\nfunction setStampContent(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n ref: ResourceRef,\n fit: StampFit,\n rect: PdfRect,\n ctx: AnnotationWriteContext | undefined,\n): void {\n const resource = ctx?.resources?.[ref.resource];\n const meta = resource ? sniffBinaryMetadata(resource.bytes) : null;\n if (!resource || !meta || ctx?.docPtr === undefined || ctx.pagePtr === undefined) {\n throw new EngineError(EngineErrorCode.Unknown, 'stamp content preflight invariant broken');\n }\n\n // Replace, not merge: drop any existing appearance objects (no-op on create).\n for (let i = fn.FPDFAnnot_GetObjectCount(annotPtr) - 1; i >= 0; i--) {\n fn.FPDFAnnot_RemoveObject(annotPtr, i);\n }\n\n if (meta.mimeType === 'application/pdf') {\n setAppearanceFromPdfBytes(fn, mem, annotPtr, resource.bytes);\n } else {\n appendImageObject(fn, mem, annotPtr, ctx.docPtr, ctx.pagePtr, resource.bytes, meta, rect, fit);\n }\n\n // Normalises the AP (BBox, EPDFOrigContentRect for future re-fits) and\n // applies any /EMBD_Metadata rotation — same closing step as v2.\n refitAppearance(fn, annotPtr, fit);\n}\n\nfunction refitAppearance(fn: PdfFunctions, annotPtr: Ptr, fit: StampFit): void {\n if (!fn.EPDFAnnot_UpdateAppearanceToRect(annotPtr, STAMP_FIT_TO_CODE[fit])) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_UpdateAppearanceToRect returned false',\n );\n }\n}\n\n/**\n * PNG/JPEG → image object appended to the appearance.\n *\n * The AP's coordinate space aligns with page space (its BBox is the annot\n * `/Rect`, same as v2), so the image must be painted INSIDE `/Rect` or it\n * falls outside the form's clip and renders blank. The `fit` placement is\n * computed here from the sniffed intrinsic dimensions; the closing\n * `EPDFAnnot_UpdateAppearanceToRect` pass then normalises the BBox and\n * records `EPDFOrigContentRect` so later geometry-only patches can re-fit\n * natively.\n */\nfunction appendImageObject(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n docPtr: Ptr,\n pagePtr: Ptr,\n bytes: ArrayBuffer,\n meta: Extract<BinaryMetadata, { width: number }>,\n rect: PdfRect,\n fit: StampFit,\n): void {\n const imageObjPtr = fn.FPDFPageObj_NewImageObj(docPtr);\n if (!imageObjPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFPageObj_NewImageObj returned NULL');\n }\n\n let appended = false;\n try {\n const dataPtr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(dataPtr, new Uint8Array(bytes));\n const ok =\n meta.mimeType === 'image/png'\n ? fn.EPDFImageObj_SetPng(pagePtr, 0, imageObjPtr, dataPtr, bytes.byteLength)\n : fn.EPDFImageObj_SetJpeg(pagePtr, 0, imageObjPtr, dataPtr, bytes.byteLength);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `${meta.mimeType === 'image/png' ? 'EPDFImageObj_SetPng' : 'EPDFImageObj_SetJpeg'} rejected the image data`,\n );\n }\n } finally {\n mem.free(dataPtr);\n }\n\n const placement = fitIntoRect(meta.width, meta.height, rect, fit);\n setImageMatrix(fn, mem, imageObjPtr, placement.width, placement.height);\n fn.FPDFPageObj_Transform(imageObjPtr, 1, 0, 0, 1, placement.left, placement.bottom);\n\n if (!fn.FPDFAnnot_AppendObject(annotPtr, imageObjPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFAnnot_AppendObject returned false');\n }\n appended = true;\n } finally {\n // The annotation owns the object once appended; on failure we own it.\n if (!appended) {\n fn.FPDFPageObj_Destroy(imageObjPtr);\n }\n }\n}\n\n/** Fit-policy placement of `w×h` content inside `rect` (centered for the aspect-preserving fits). */\nfunction fitIntoRect(\n w: number,\n h: number,\n rect: PdfRect,\n fit: StampFit,\n): { left: number; bottom: number; width: number; height: number } {\n const boxW = Math.max(0, rect.right - rect.left);\n const boxH = Math.max(0, rect.top - rect.bottom);\n if (fit === 'fill' || w <= 0 || h <= 0) {\n return { left: rect.left, bottom: rect.bottom, width: boxW, height: boxH };\n }\n const scale = fit === 'contain' ? Math.min(boxW / w, boxH / h) : Math.max(boxW / w, boxH / h);\n const width = w * scale;\n const height = h * scale;\n return {\n left: rect.left + (boxW - width) / 2,\n bottom: rect.bottom + (boxH - height) / 2,\n width,\n height,\n };\n}\n\n/** FS_MATRIX { a, b, c, d, e, f } — six f32s. */\nfunction setImageMatrix(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n imageObjPtr: Ptr,\n width: number,\n height: number,\n): void {\n const buf = mem.alloc(6 * F32_BYTES);\n try {\n mem.poke(buf, 'f32', width, 0);\n mem.poke(buf, 'f32', 0, 4);\n mem.poke(buf, 'f32', 0, 8);\n mem.poke(buf, 'f32', height, 12);\n mem.poke(buf, 'f32', 0, 16);\n mem.poke(buf, 'f32', 0, 20);\n if (!fn.FPDFPageObj_SetMatrix(imageObjPtr, buf)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFPageObj_SetMatrix returned false');\n }\n } finally {\n mem.free(buf);\n }\n}\n\n/**\n * Single-page PDF → deep-cloned Form XObject as AP/N (the v2 rubber-stamp\n * path). The source buffer must stay alive until the temp document closes.\n */\nfunction setAppearanceFromPdfBytes(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n bytes: ArrayBuffer,\n): void {\n const dataPtr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(dataPtr, new Uint8Array(bytes));\n const tempDocPtr = fn.FPDF_LoadMemDocument(dataPtr, bytes.byteLength, '');\n if (!tempDocPtr) {\n throw new EngineError(EngineErrorCode.MalformedPdf, 'stamp source PDF could not be opened');\n }\n try {\n if (!fn.EPDFAnnot_SetAppearanceFromPage(annotPtr, tempDocPtr, 0)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'EPDFAnnot_SetAppearanceFromPage returned false',\n );\n }\n } finally {\n fn.FPDF_CloseDocument(tempDocPtr);\n }\n } finally {\n mem.free(dataPtr);\n }\n}\n","import type { Color, TextDraft, TextPatch } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { NOTE_ICON_TO_NAME } from '../annotationIcon';\nimport { stateModelToPdf, stateToPdf } from '../annotationState';\nimport {\n setAnnotColor,\n setAnnotOpacity,\n setAnnotRect,\n writeAnnotString,\n writeAnnotStringOrClear,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\n\n/** Default `/C` — the generator's yellow note fill, set explicitly so reads round-trip. */\nconst DEFAULT_NOTE_COLOR: Color = { r: 255, g: 255, b: 0 };\n\nconst DEFAULT_OPACITY = 1;\n\n/**\n * Apply a text (sticky-note) draft. The visual is entirely generator-owned:\n * the mutator's closing `regenerateAppearance` bakes the 20×20 note icon\n * from `/C` + `/Name` (GenerateTextAP), so this writer only records state.\n * `/State` + `/StateModel` are dictionary-only (ISO 32000 §12.5.6.3) and\n * never reach the generator.\n */\nexport function applyTextDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: TextDraft,\n): void {\n if (draft.state !== undefined && draft.stateModel === undefined) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'text draft: state requires stateModel (ISO 32000 §12.5.6.3)',\n );\n }\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n setAnnotColor(fn, annotPtr, draft.color ?? DEFAULT_NOTE_COLOR);\n setAnnotOpacity(fn, annotPtr, draft.opacity ?? DEFAULT_OPACITY);\n setNoteIcon(fn, annotPtr, draft.icon ?? 'note');\n if (draft.stateModel !== undefined) {\n writeAnnotString(fn, mem, annotPtr, 'StateModel', stateModelToPdf(draft.stateModel));\n }\n if (draft.state !== undefined) {\n writeAnnotString(fn, mem, annotPtr, 'State', stateToPdf(draft.state));\n }\n}\n\nexport function applyTextPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: TextPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n if (patch.color !== undefined) {\n setAnnotColor(fn, annotPtr, patch.color);\n }\n if (patch.opacity !== undefined) {\n setAnnotOpacity(fn, annotPtr, patch.opacity);\n }\n if (patch.icon !== undefined) {\n setNoteIcon(fn, annotPtr, patch.icon);\n }\n // Three-state; a patch may touch one entry alone (the other may already\n // be on the annotation), so no cross-field rule here — that is draft-only.\n if (patch.stateModel !== undefined) {\n writeAnnotStringOrClear(\n fn,\n mem,\n annotPtr,\n 'StateModel',\n patch.stateModel === null ? null : stateModelToPdf(patch.stateModel),\n );\n }\n if (patch.state !== undefined) {\n writeAnnotStringOrClear(\n fn,\n mem,\n annotPtr,\n 'State',\n patch.state === null ? null : stateToPdf(patch.state),\n );\n }\n}\n\nexport function isTextSubtype(subtype: string): subtype is 'text' {\n return subtype === 'text';\n}\n\nfunction setNoteIcon(fn: PdfFunctions, annotPtr: Ptr, icon: keyof typeof NOTE_ICON_TO_NAME): void {\n if (!fn.EPDFAnnot_SetName(annotPtr, NOTE_ICON_TO_NAME[icon])) {\n throw new EngineError(EngineErrorCode.Unknown, 'EPDFAnnot_SetName returned false');\n }\n}\n","import type {\n PolygonDraft,\n PolygonPatch,\n PolylineDraft,\n PolylinePatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n clearBorderEffect,\n setAnnotRect,\n setBorderEffect,\n setLineEndings,\n setVertices,\n} from './annotationWritePrimitives';\nimport { applyAnnotationBaseDraft, applyAnnotationBasePatch } from './writeAnnotationBase';\nimport { applyFilledStyleDraft, applyFilledStylePatch } from './writeStyle';\nimport { writeVertexTransformMetadata } from './writeAnnotationTransformMetadata';\n\nexport type VertexDraft = PolygonDraft | PolylineDraft;\nexport type VertexPatch = PolygonPatch | PolylinePatch;\n\n/** Default line endings when a polyline draft omits them. */\nconst DEFAULT_LINE_ENDINGS = { start: 'none', end: 'none' } as const;\n\n/**\n * Apply a polygon draft to a freshly-created annotation. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin; the engine never derives it)\n * 3. shared stroke/fill styling (/IC, /C, /CA, /BS, dash)\n * 4. /Vertices geometry\n * 5. optional cloudy (/BE)\n *\n * Note: polygon does NOT use /RD (rectangle differences) — its geometry is\n * fully described by /Vertices + /Rect, so /RD is redundant. Per ISO 32000\n * /RD applies to Square/Circle (and FreeText/Caret), not Polygon.\n */\nexport function applyPolygonDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: PolygonDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n setVertices(fn, mem, annotPtr, draft.vertices);\n\n if (draft.cloudyIntensity != null && draft.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, draft.cloudyIntensity);\n }\n // Advisory rotation: the vertices are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyPolygonPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: PolygonPatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n if (patch.vertices !== undefined) {\n setVertices(fn, mem, annotPtr, patch.vertices);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n if (patch.cloudyIntensity !== undefined) {\n if (patch.cloudyIntensity !== null && patch.cloudyIntensity > 0) {\n setBorderEffect(fn, annotPtr, patch.cloudyIntensity);\n } else {\n // `null` removes /BE (tri-state). The schema forbids 0, but treat any\n // non-positive value defensively as a clear — never write a degenerate\n // /BE the read side would normalize away.\n clearBorderEffect(fn, annotPtr);\n }\n }\n}\n\n/**\n * Apply a polyline draft to a freshly-created annotation. Order:\n * 1. base author-metadata (contents/nm)\n * 2. /Rect (required — supplied by the plugin)\n * 3. shared stroke/fill styling (/IC, /C, /CA, /BS, dash)\n * 4. /Vertices geometry\n * 5. /LE line endings (default none/none)\n */\nexport function applyPolylineDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: PolylineDraft,\n): void {\n applyAnnotationBaseDraft(fn, mem, annotPtr, draft);\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyFilledStyleDraft(fn, mem, annotPtr, draft);\n setVertices(fn, mem, annotPtr, draft.vertices);\n setLineEndings(fn, annotPtr, draft.lineEndings ?? DEFAULT_LINE_ENDINGS);\n // Advisory rotation: the vertices are already rotated; this just records θ.\n writeVertexTransformMetadata(fn, annotPtr, { rotation: draft.rotation });\n}\n\nexport function applyPolylinePatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: PolylinePatch,\n): void {\n applyAnnotationBasePatch(fn, mem, annotPtr, patch);\n if (patch.rect !== undefined) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyFilledStylePatch(fn, mem, annotPtr, patch);\n if (patch.vertices !== undefined) {\n setVertices(fn, mem, annotPtr, patch.vertices);\n }\n // Advisory rotation is tri-state (undefined preserves, null/0 clears).\n writeVertexTransformMetadata(fn, annotPtr, { rotation: patch.rotation });\n if (patch.lineEndings !== undefined) {\n setLineEndings(fn, annotPtr, patch.lineEndings);\n }\n}\n\n/**\n * Type-narrowing predicate used by the writer registry to pick the vertex\n * writer for a draft/patch's `subtype`.\n */\nexport function isVertexSubtype(subtype: string): subtype is 'polygon' | 'polyline' {\n return subtype === 'polygon' || subtype === 'polyline';\n}\n","import type {\n AnnotationSubtype,\n WidgetDraft,\n WidgetPatch,\n WidgetStyleDraftFields,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport { borderStyleToCode } from '../shapeBorderStyle';\nimport { standardFontToCode } from '../standardFont';\nimport { textAlignmentToCode } from '../textAlignment';\nimport { setAnnotRect } from './annotationWritePrimitives';\n\nconst MK_BORDER_COLOR = 0; // EPDF_MK_COLOR_BC\nconst MK_BACKGROUND_COLOR = 1; // EPDF_MK_COLOR_BG\n\nexport function isWidgetSubtype(subtype: AnnotationSubtype): subtype is 'widget' {\n return subtype === 'widget';\n}\n\n/**\n * THE widget-plane style writer: /MK colours, /BS, /DA, /Q. Both entry\n * points funnel here — the widget annotation kind (create/patch) and\n * `doc.forms.createField`'s inline placements — so creation-time and\n * edit-time styling can never drift apart.\n */\nexport function applyWidgetStyle(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n style: WidgetStyleDraftFields,\n): void {\n if (style.color === null) {\n fn.EPDFAnnot_ClearMKColor(annotPtr, MK_BORDER_COLOR);\n } else if (style.color) {\n fn.EPDFAnnot_SetMKColor(annotPtr, MK_BORDER_COLOR, style.color.r, style.color.g, style.color.b);\n }\n if (style.interiorColor === null) {\n fn.EPDFAnnot_ClearMKColor(annotPtr, MK_BACKGROUND_COLOR);\n } else if (style.interiorColor) {\n fn.EPDFAnnot_SetMKColor(\n annotPtr,\n MK_BACKGROUND_COLOR,\n style.interiorColor.r,\n style.interiorColor.g,\n style.interiorColor.b,\n );\n }\n\n if (style.strokeWidth !== undefined || style.borderStyle !== undefined) {\n fn.EPDFAnnot_SetBorderStyle(\n annotPtr,\n borderStyleToCode(style.borderStyle ?? 'solid'),\n style.strokeWidth ?? 1,\n );\n }\n\n if (\n style.fontFamily !== undefined ||\n style.fontSize !== undefined ||\n style.fontColor !== undefined\n ) {\n const color = style.fontColor ?? { r: 0, g: 0, b: 0 };\n fn.EPDFAnnot_SetDefaultAppearance(\n annotPtr,\n standardFontToCode(style.fontFamily ?? 'helvetica'),\n style.fontSize ?? 12,\n color.r,\n color.g,\n color.b,\n );\n }\n\n if (style.textAlign !== undefined) {\n fn.EPDFAnnot_SetTextAlignment(annotPtr, textAlignmentToCode(style.textAlign));\n }\n}\n\n/** Create an INERT widget: placement + style. Adoption is a forms concern. */\nexport function applyWidgetDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: WidgetDraft,\n): void {\n setAnnotRect(fn, mem, annotPtr, draft.rect);\n applyWidgetStyle(fn, mem, annotPtr, draft);\n}\n\n/**\n * Move/restyle a widget. When the widget is attached to a field the\n * family-correct appearance is re-baked afterwards; on inert widgets the\n * regenerator is a no-op (no /FT context) and that is fine.\n */\nexport function applyWidgetPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: WidgetPatch,\n): void {\n if (patch.rect) {\n setAnnotRect(fn, mem, annotPtr, patch.rect);\n }\n applyWidgetStyle(fn, mem, annotPtr, patch);\n fn.EPDFAnnot_GenerateFormFieldAP(annotPtr);\n}\n","import {\n EngineError,\n EngineErrorCode,\n type WireAnnotationDraft,\n type WireAnnotationPatch,\n} from '@embedpdf/engine-core/runtime';\nimport type {\n CaretDraft,\n CaretPatch,\n WidgetDraft,\n WidgetPatch,\n FreeTextDraft,\n FreeTextPatch,\n InkDraft,\n InkPatch,\n LineDraft,\n LinePatch,\n LinkDraft,\n LinkPatch,\n PolygonDraft,\n PolygonPatch,\n PolylineDraft,\n PolylinePatch,\n RedactDraft,\n RedactPatch,\n StampWireDraft,\n StampWirePatch,\n TextDraft,\n TextPatch,\n FileAttachmentWireDraft,\n FileAttachmentPatch,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFunctions, PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { AnnotationWriteContext } from './annotationWriteContext';\nimport { applyCaretDraft, applyCaretPatch, isCaretSubtype } from './writeCaretAnnotation';\nimport {\n applyFileAttachmentDraft,\n applyFileAttachmentPatch,\n isFileAttachmentSubtype,\n preflightFileAttachmentDraft,\n} from './writeFileAttachmentAnnotation';\nimport {\n applyFreeTextDraft,\n applyFreeTextPatch,\n isFreeTextSubtype,\n} from './writeFreeTextAnnotation';\nimport { applyInkDraft, applyInkPatch, isInkSubtype } from './writeInkAnnotation';\nimport { applyLineDraft, applyLinePatch, isLineSubtype } from './writeLineAnnotation';\nimport { applyLinkDraft, applyLinkPatch, isLinkSubtype } from './writeLinkAnnotation';\nimport { applyRedactDraft, applyRedactPatch, isRedactSubtype } from './writeRedactAnnotation';\nimport {\n applyShapeDraft,\n applyShapePatch,\n isShapeSubtype,\n type ShapeDraft,\n type ShapePatch,\n} from './writeShapeAnnotation';\nimport {\n applyStampDraft,\n applyStampPatch,\n isStampSubtype,\n preflightStampDraft,\n preflightStampPatch,\n} from './writeStampAnnotation';\nimport { applyTextDraft, applyTextPatch, isTextSubtype } from './writeTextAnnotation';\nimport {\n applyTextMarkupDraft,\n applyTextMarkupPatch,\n isTextMarkupSubtype,\n type TextMarkupDraft,\n type TextMarkupPatch,\n} from './writeTextMarkupAnnotation';\nimport {\n applyPolygonDraft,\n applyPolygonPatch,\n applyPolylineDraft,\n applyPolylinePatch,\n isVertexSubtype,\n} from './writeVertexAnnotation';\nimport { applyWidgetDraft, applyWidgetPatch, isWidgetSubtype } from './writeWidgetAnnotation';\n\n/** Validate subtype inputs before AnnotationMutator performs any native write. */\nexport function preflightDraft(draft: WireAnnotationDraft, ctx?: AnnotationWriteContext): void {\n if (isStampSubtype(draft.subtype)) {\n preflightStampDraft(draft as StampWireDraft, ctx);\n }\n if (isFileAttachmentSubtype(draft.subtype)) {\n preflightFileAttachmentDraft(draft as FileAttachmentWireDraft, ctx);\n }\n}\n\n/** Validate subtype inputs before AnnotationMutator performs any native write. */\nexport function preflightPatch(patch: WireAnnotationPatch, ctx?: AnnotationWriteContext): void {\n if (isStampSubtype(patch.subtype)) {\n preflightStampPatch(patch as StampWirePatch, ctx);\n }\n}\n\n/**\n * Per-subtype write dispatch, mirroring the read-side registry. Adding a\n * new subtype is one extra arm here plus its writer module — no other\n * file in this package needs to change.\n *\n * The mutator calls `applyDraft` or `applyPatch` once per mutation; the\n * actual `EPDFPage_CreateAnnot` / identity resolution happens around\n * these calls in `AnnotationMutator`.\n */\nexport function applyDraft(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n draft: WireAnnotationDraft,\n ctx?: AnnotationWriteContext,\n): void {\n if (isTextMarkupSubtype(draft.subtype)) {\n applyTextMarkupDraft(fn, mem, annotPtr, draft as TextMarkupDraft);\n return;\n }\n if (isShapeSubtype(draft.subtype)) {\n applyShapeDraft(fn, mem, annotPtr, draft as ShapeDraft);\n return;\n }\n if (isVertexSubtype(draft.subtype)) {\n if (draft.subtype === 'polygon') {\n applyPolygonDraft(fn, mem, annotPtr, draft as PolygonDraft);\n } else {\n applyPolylineDraft(fn, mem, annotPtr, draft as PolylineDraft);\n }\n return;\n }\n if (isLineSubtype(draft.subtype)) {\n applyLineDraft(fn, mem, annotPtr, draft as LineDraft);\n return;\n }\n if (isLinkSubtype(draft.subtype)) {\n applyLinkDraft(fn, mem, annotPtr, draft as LinkDraft, ctx);\n return;\n }\n if (isInkSubtype(draft.subtype)) {\n applyInkDraft(fn, mem, annotPtr, draft as InkDraft);\n return;\n }\n if (isFreeTextSubtype(draft.subtype)) {\n applyFreeTextDraft(fn, mem, annotPtr, draft as FreeTextDraft, ctx);\n return;\n }\n if (isCaretSubtype(draft.subtype)) {\n applyCaretDraft(fn, mem, annotPtr, draft as CaretDraft);\n return;\n }\n if (isTextSubtype(draft.subtype)) {\n applyTextDraft(fn, mem, annotPtr, draft as TextDraft);\n return;\n }\n if (isStampSubtype(draft.subtype)) {\n applyStampDraft(fn, mem, annotPtr, draft as StampWireDraft, ctx);\n return;\n }\n if (isFileAttachmentSubtype(draft.subtype)) {\n applyFileAttachmentDraft(fn, mem, annotPtr, draft as FileAttachmentWireDraft, ctx);\n return;\n }\n if (isWidgetSubtype(draft.subtype)) {\n applyWidgetDraft(fn, mem, annotPtr, draft as WidgetDraft);\n return;\n }\n if (isRedactSubtype(draft.subtype)) {\n applyRedactDraft(fn, mem, annotPtr, draft as RedactDraft, ctx);\n return;\n }\n // Should be unreachable: AnnotationDraft is the closed union of writable\n // subtypes (which today is exactly the four text-markup kinds — the\n // unsupported kind has Draft = never). The check is here so a future\n // subtype that lands in `AnnotationDraft` without a writer entry fails\n // loud at runtime instead of silently no-op-ing.\n throw new EngineError(\n EngineErrorCode.NotImplemented,\n `no writer registered for draft.subtype='${(draft as { subtype: string }).subtype}'`,\n );\n}\n\nexport function applyPatch(\n fn: PdfFunctions,\n mem: PdfRuntimeMemory,\n annotPtr: Ptr,\n patch: WireAnnotationPatch,\n ctx?: AnnotationWriteContext,\n): void {\n if (isTextMarkupSubtype(patch.subtype)) {\n applyTextMarkupPatch(fn, mem, annotPtr, patch as TextMarkupPatch);\n return;\n }\n if (isShapeSubtype(patch.subtype)) {\n applyShapePatch(fn, mem, annotPtr, patch as ShapePatch);\n return;\n }\n if (isVertexSubtype(patch.subtype)) {\n if (patch.subtype === 'polygon') {\n applyPolygonPatch(fn, mem, annotPtr, patch as PolygonPatch);\n } else {\n applyPolylinePatch(fn, mem, annotPtr, patch as PolylinePatch);\n }\n return;\n }\n if (isLineSubtype(patch.subtype)) {\n applyLinePatch(fn, mem, annotPtr, patch as LinePatch);\n return;\n }\n if (isLinkSubtype(patch.subtype)) {\n applyLinkPatch(fn, mem, annotPtr, patch as LinkPatch, ctx);\n return;\n }\n if (isInkSubtype(patch.subtype)) {\n applyInkPatch(fn, mem, annotPtr, patch as InkPatch);\n return;\n }\n if (isFreeTextSubtype(patch.subtype)) {\n applyFreeTextPatch(fn, mem, annotPtr, patch as FreeTextPatch, ctx);\n return;\n }\n if (isCaretSubtype(patch.subtype)) {\n applyCaretPatch(fn, mem, annotPtr, patch as CaretPatch);\n return;\n }\n if (isTextSubtype(patch.subtype)) {\n applyTextPatch(fn, mem, annotPtr, patch as TextPatch);\n return;\n }\n if (isStampSubtype(patch.subtype)) {\n applyStampPatch(fn, mem, annotPtr, patch as StampWirePatch, ctx);\n return;\n }\n if (isFileAttachmentSubtype(patch.subtype)) {\n applyFileAttachmentPatch(fn, mem, annotPtr, patch as FileAttachmentPatch);\n return;\n }\n if (isWidgetSubtype(patch.subtype)) {\n applyWidgetPatch(fn, mem, annotPtr, patch as WidgetPatch);\n return;\n }\n if (isRedactSubtype(patch.subtype)) {\n applyRedactPatch(fn, mem, annotPtr, patch as RedactPatch, ctx);\n return;\n }\n throw new EngineError(\n EngineErrorCode.NotImplemented,\n `no writer registered for patch.subtype='${(patch as { subtype: string }).subtype}'`,\n );\n}\n","import type {\n AnnotationRef,\n AnnotationReplyType,\n AnnotationStableId,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../../document-session/DocumentSession';\nimport { captureOrStampStableId } from '../identity/captureOrStampStableId';\nimport { resolveAnnotPtr } from '../identity/resolveAnnotationPointer';\nimport { RT_UNKNOWN, replyTypeToCode } from '../replyType';\n\n/**\n * The `/IRT` + `/RT` slice of a draft or patch, normalized to the three\n * cases the writer handles.\n */\nexport interface RelationshipWrite {\n /**\n * undefined -> leave `/IRT` untouched\n * null -> clear `/IRT` (+ `/RT`)\n * ref -> set/relink `/IRT` to this parent\n */\n inReplyTo?: AnnotationRef | null;\n /** `/RT` to write; defaults to `'reply'` when a link is set without it. */\n replyType?: AnnotationReplyType;\n}\n\n/**\n * Apply the `/IRT` + `/RT` relationship to `annotPtr` on an\n * already-acquired `pagePtr`. Returns the parent's (possibly newly\n * strengthened) {@link AnnotationStableId} when a link was SET, so the\n * mutator can report the side-effecting promotion in `meta.changed`;\n * `null` for the clear / RT-only / no-op cases.\n *\n * Linking to a parent that is a weak/direct object promotes it to an\n * indirect object (`/IRT` must be an indirect reference). This is\n * non-structural — it assigns the parent an object number in place\n * without shifting any `/Annots` index — so it does not invalidate weak\n * refs or warrant a revision bump. We strengthen the parent with a\n * durable `/NM` BEFORE linking (via {@link captureOrStampStableId}) so its\n * identity survives a full save/reload, and report that id upstream.\n *\n * ISO 32000 §12.5.6.2 requires the reply and its parent to share a page;\n * we enforce that here with a fast `InvalidArg` (PDFium itself only checks\n * same-document).\n */\nexport function writeAnnotationRelationship(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n pagePtr: Ptr,\n annotPtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n rel: RelationshipWrite,\n): AnnotationStableId | null {\n const { fn } = runtime;\n\n // Clear: remove /IRT and /RT; the annotation becomes top-level.\n if (rel.inReplyTo === null) {\n fn.EPDFAnnot_SetLinkedAnnot(annotPtr, 'IRT', NULL_PTR);\n fn.EPDFAnnot_SetReplyType(annotPtr, RT_UNKNOWN);\n return null;\n }\n\n // Set / relink.\n if (rel.inReplyTo) {\n if (rel.inReplyTo.pageObjectNumber !== pageObjectNumber) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `/IRT parent must be on the same page as the reply (parent page ${rel.inReplyTo.pageObjectNumber}, reply page ${pageObjectNumber})`,\n );\n }\n const parentPtr = resolveAnnotPtr(runtime, session, pagePtr, rel.inReplyTo);\n try {\n // Strengthen BEFORE the link promotes the parent to indirect, so the\n // reported id is the save-stable /NM rather than a renumberable objNum.\n const parentStableId = captureOrStampStableId(runtime, parentPtr);\n if (!fn.EPDFAnnot_SetLinkedAnnot(annotPtr, 'IRT', parentPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to set /IRT linked annotation');\n }\n fn.EPDFAnnot_SetReplyType(annotPtr, replyTypeToCode(rel.replyType ?? 'reply'));\n return parentStableId;\n } finally {\n fn.FPDFPage_CloseAnnot(parentPtr);\n }\n }\n\n // inReplyTo undefined: a standalone /RT change only applies if the\n // annotation already has an /IRT link (RT without IRT is meaningless per\n // ISO 32000 §12.5.6.2). Silently skip otherwise.\n if (rel.replyType !== undefined) {\n const linkedPtr = fn.FPDFAnnot_GetLinkedAnnot(annotPtr, 'IRT');\n if (linkedPtr) {\n try {\n fn.EPDFAnnot_SetReplyType(annotPtr, replyTypeToCode(rel.replyType));\n } finally {\n fn.FPDFPage_CloseAnnot(linkedPtr);\n }\n }\n }\n return null;\n}\n","import {\n appearanceImpactOf,\n EngineError,\n EngineErrorCode,\n PDF_SUBTYPE_TO_CODE,\n type AnnotationActor,\n type AppearanceOutcome,\n type BlendMode,\n type AnnotationCreateResult,\n type AnnotationDeleteResult,\n type AnnotationDTO,\n type WireAnnotationDraft,\n type AnnotationListMutationMeta,\n type AnnotationMoveResult,\n type WireAnnotationPatch,\n type WireResourceMap,\n type AnnotationRef,\n type AnnotationStableId,\n type AnnotationUpdateResult,\n type PageObjectNumber,\n PdfAnnotationSubtypeCode,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { blendModeFromCode, blendModeToCode } from './internal/blendMode';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport type { FontRegistrar } from '../fonts';\nimport { captureOrStampStableId } from './internal/identity/captureOrStampStableId';\nimport { resolveAnnotPtr } from './internal/identity/resolveAnnotationPointer';\nimport { computeMutationImpact } from './internal/mutations/computeMutationImpact';\nimport { assertRichTextAgreement } from './internal/richTextWire';\nimport { readContextFor } from './internal/read/annotationReadContext';\nimport { readAnnotString } from './internal/read/annotationReadPrimitives';\nimport {\n joinWidgetFieldNumbers,\n resolveWidgetFieldObjectNumber,\n} from './internal/read/joinWidgetField';\nimport { readAnnotationFromPtr } from './internal/read/readAnnotationFromPtr';\nimport type { AnnotationWriteContext } from './internal/write/annotationWriteContext';\nimport {\n applyDraft,\n applyPatch,\n preflightDraft,\n preflightPatch,\n} from './internal/write/annotationWriterRegistry';\nimport {\n writeAnnotationAuthor,\n writeAnnotationModified,\n} from './internal/write/writeAnnotationBase';\nimport { writeAnnotationRelationship } from './internal/write/writeAnnotationRelationship';\nimport {\n applyEmbedMetadataOnCreate,\n applyEmbedMetadataOnUpdate,\n} from './internal/write/writeEmbedMetadata';\n\n/** `FPDF_ANNOT_APPEARANCEMODE_NORMAL` — the `/AP /N` stream. */\nconst APPEARANCE_MODE_NORMAL = 0;\n\n/**\n * Synchronous orchestrator for `create` / `update` / `delete` annotation\n * mutations. Owns the dance between PDFium calls, identity bookkeeping,\n * revision bumping (only for structural ops), and the\n * `AnnotationListMutationMeta` envelope every result type carries.\n *\n * Lives in `engine-services` (not the worker hosts) so the local Web\n * Worker, the Node `worker_thread` server, and any future direct-thread\n * embedding share the exact same code path. The only difference between\n * them is the underlying `PdfRuntimeModule` (WASM vs native).\n *\n * Identity rules enforced here, locked with the user:\n * - `create` always uses `EPDFPage_CreateAnnot` (the fork helper that\n * creates an INDIRECT object) so new annotations are born durable.\n * If the fork helper ever returns a direct object, we throw — never\n * silently produce a weak annotation.\n * - `update` is non-structural. /NM is monotonic per annotation:\n * * already durable (objectNumber > 0 OR /NM present) -> NEVER touched.\n * * weak (no objectNumber, no /NM) -> stamp engine-generated UUID v4.\n * The patch type has no `nm` field, so the writer surface enforces\n * \"callers cannot rename a stable id\" at the type level. Updates do\n * not bump the revision.\n * - `delete` is subtype-agnostic. Three native fork helpers handle the\n * three ref kinds without round-tripping through index. For weak\n * deletes (`AnnotationStableId | null`-shaped result), we set\n * `deleted: null` so callers can detect that no durable id was\n * reportable.\n */\nexport class AnnotationMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n /**\n * Registered-font registry for this thread. Optional: when absent, the\n * registered-font authoring path is unavailable and a draft/patch carrying\n * a `registeredFontKey` fails loud (rather than silently using a standard\n * font). Standard-font FreeText and all other subtypes are unaffected.\n */\n private readonly fonts?: FontRegistrar,\n ) {}\n\n /** Build the per-write context handed to subtype writers: font resolver\n * (FreeText `/DA`), doc/page pointers and binary resources (stamp). */\n private writeContext(pagePtr: Ptr, resources?: WireResourceMap): AnnotationWriteContext {\n const fonts = this.fonts;\n return {\n ...(fonts\n ? {\n resolveRegisteredFontId: (key: string) => fonts.idFor(key),\n describeRegisteredFont: (key: string) => fonts.describeOrUndefined(key),\n }\n : {}),\n docPtr: this.session.requireDocPtr(),\n pagePtr,\n ...(resources ? { resources } : {}),\n };\n }\n\n create(\n pageObjectNumber: PageObjectNumber,\n draft: WireAnnotationDraft,\n signal: AbortSignal,\n actor?: AnnotationActor,\n resources?: WireResourceMap,\n ): AnnotationCreateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const subtypeCode = PDF_SUBTYPE_TO_CODE[draft.subtype];\n\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n try {\n this.ensureKnownWeakStateFromPage(pageObjectNumber, pagePtr);\n const writeCtx = this.writeContext(pagePtr, resources);\n preflightDraft(draft, writeCtx);\n assertRichTextAgreement(draft);\n // `create` is append-only: PDFium drops the new annotation at\n // `index = previousCount`, so no existing index ever shifts. Per\n // the locked rule in `computeMutationImpact`, that means create is\n // non-invalidating — no per-page revision bump, no weak-ref\n // staleness signal. The DTO is read against the page's current\n // revision (which both pre-existing and freshly-created\n // annotations share, since nothing bumped it).\n const pageStateBefore = this.session.pageState(pageObjectNumber);\n throwIfAborted(signal);\n\n const annotPtr = fn.EPDFPage_CreateAnnot(pagePtr, subtypeCode);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFPage_CreateAnnot returned NULL for subtype '${draft.subtype}'`,\n );\n }\n\n let dto;\n let newObjNum: number;\n let newIndex: number;\n let linkedParentId: AnnotationStableId | null = null;\n try {\n applyDraft(fn, mem, annotPtr, draft, writeCtx);\n // Link to an /IRT parent when the draft asks for one. This may\n // promote a weak/direct parent to an indirect object (non-structural,\n // no index shift); the strengthened parent id is folded into\n // `meta.changed` below so the client can reconcile its cached ref.\n if (draft.inReplyTo !== undefined || draft.replyType !== undefined) {\n linkedParentId = writeAnnotationRelationship(\n this.runtime,\n this.session,\n pagePtr,\n annotPtr,\n pageObjectNumber,\n { inReplyTo: draft.inReplyTo, replyType: draft.replyType },\n );\n }\n // Stamp identity + modification metadata AFTER the per-subtype\n // writer so a buggy subtype writer can't clobber them:\n // /T ← actor.displayName (when present)\n // /M ← now (always)\n // /EMBD_Metadata ← actor.userId/groupId (when present)\n if (actor?.displayName) {\n writeAnnotationAuthor(fn, mem, annotPtr, actor.displayName);\n }\n writeAnnotationModified(fn, mem, annotPtr);\n applyEmbedMetadataOnCreate(fn, mem, annotPtr, actor);\n // Bake the /AP appearance stream now that every visual field is\n // written, so the new annotation ships with a standard-compliant\n // appearance (matches the v2 engine).\n this.regenerateAppearance(annotPtr, pagePtr, draft.blendMode);\n\n newObjNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (newObjNum <= 0) {\n // Defensive: the fork helper guarantees an indirect object.\n throw new EngineError(\n EngineErrorCode.Unknown,\n `EPDFPage_CreateAnnot produced a direct object (no objectNumber); fork helper invariant broken`,\n );\n }\n newIndex = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (newIndex < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${newIndex} for freshly created annotation`,\n );\n }\n\n dto = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n pageObjectNumber,\n newIndex,\n pageStateBefore.revision,\n readContextFor(this.session, this.fonts),\n );\n joinWidgetFieldNumbers(this.runtime, this.session, [dto]);\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n\n const createdId: AnnotationStableId = { kind: 'objectNumber', value: newObjNum };\n // Linking promoted the parent in place, so the page may now have one\n // fewer weak annotation — refresh the flag that future delete/move\n // refetch decisions read. (A plain create touches no existing annot.)\n if (linkedParentId) this.recordWeakStateFromPage(pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(pageObjectNumber);\n const meta: AnnotationListMutationMeta = computeMutationImpact({\n mutation: 'create',\n pageStateBefore,\n pageStateAfter,\n changed: linkedParentId ? [createdId, linkedParentId] : [createdId],\n });\n\n return { created: dto, meta };\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n update(\n ref: AnnotationRef,\n patch: WireAnnotationPatch,\n signal: AbortSignal,\n actor?: AnnotationActor,\n resources?: WireResourceMap,\n ): AnnotationUpdateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(ref.pageObjectNumber);\n let annotPtr: Ptr | null = null;\n try {\n annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n throwIfAborted(signal);\n\n const writeCtx = this.writeContext(pagePtr, resources);\n preflightPatch(patch, writeCtx);\n assertRichTextAgreement(patch);\n\n this.ensureKnownWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateBefore = this.session.pageState(ref.pageObjectNumber);\n\n // Apply boundary: validation and cancellation are complete before the\n // first possible document write (weak-id strengthening below).\n throwIfAborted(signal);\n\n // Opportunistic /NM stamp for weak annotations + capture the\n // resulting stable id for `meta.changed`. Same monotonic /NM\n // rule that `move()` uses; sharing the helper guarantees the\n // two paths cannot drift in their identity bookkeeping.\n const stableId = this.captureOrStampStableId(annotPtr);\n\n // Blend mode lives inside the existing /AP graphics state rather than in\n // the annotation dictionary. Capture it before re-baking so an unrelated\n // patch (colour, geometry, contents...) cannot silently reset it.\n const previousBlendMode = blendModeFromCode(fn.EPDFAnnot_GetBlendMode(annotPtr));\n\n // Pre-patch DTO for the appearance classifier: it value-diffs the patch\n // against this, so no-op keys (full-projection clients) drop away and a\n // pure move is recognized no matter how verbose the patch is.\n const preIndex = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (preIndex < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${preIndex} before update`,\n );\n }\n const currentDto = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n ref.pageObjectNumber,\n preIndex,\n pageStateBefore.revision,\n readContextFor(this.session, this.fonts),\n );\n\n // Apply caller-supplied subtype-specific writes.\n applyPatch(fn, mem, annotPtr, patch, writeCtx);\n // Apply /IRT + /RT changes (set/relink/clear, or RT-only). Setting a\n // link may promote a weak parent to indirect (non-structural); the\n // strengthened parent id is folded into `meta.changed` below.\n let linkedParentId: AnnotationStableId | null = null;\n if (patch.inReplyTo !== undefined || patch.replyType !== undefined) {\n linkedParentId = writeAnnotationRelationship(\n this.runtime,\n this.session,\n pagePtr,\n annotPtr,\n ref.pageObjectNumber,\n { inReplyTo: patch.inReplyTo, replyType: patch.replyType },\n );\n }\n // Refresh standard /M (modified date) on every update — independent\n // of whether the patch touched any subtype-specific field. Then\n // refresh /EMBD_Metadata/UpdatedBy if an actor was supplied;\n // UserID/GroupID/CreatedBy are preserved across updates.\n writeAnnotationModified(fn, mem, annotPtr);\n applyEmbedMetadataOnUpdate(fn, mem, annotPtr, actor);\n // The appearance decision (engine-core `appearanceImpactOf`): an /AP is\n // content, not cache — a foreign-authored stream (Acrobat's rich /AP, an\n // image stamp) is destroyed only as the explicit consequence of a\n // semantic edit, never as a side effect of writing back values nobody\n // changed. `inert` patches (metadata-only, or all values no-ops) never\n // touch /AP; a VERIFIED rigid translation preserves an existing /AP\n // byte-for-byte (ISO 32000: BBox→/Rect fitting translates the pixels);\n // everything else re-bakes. With no existing normal /AP there is\n // nothing to preserve, so any appearance-relevant write bakes one (v2\n // parity — otherwise the annotation renders as nothing). The verdict is\n // echoed on the result: clients drive raster invalidation off\n // `appearance.changed` instead of guessing from the patch they sent.\n const impact = appearanceImpactOf(currentDto, patch);\n let appearance: AppearanceOutcome;\n if (\n impact === 'inert' ||\n (impact === 'translation' &&\n fn.EPDFAnnot_HasAppearanceStream(annotPtr, APPEARANCE_MODE_NORMAL))\n ) {\n appearance = { action: 'preserved', changed: false };\n } else {\n const ok = this.regenerateAppearance(\n annotPtr,\n pagePtr,\n patch.blendMode ?? previousBlendMode,\n );\n appearance = ok\n ? { action: 'regenerated', changed: true }\n : // No generic generator for this subtype (e.g. widgets). The\n // dictionary still changed when the patch was appearance-relevant,\n // so `changed` stays true in that case — form-layer renderers may\n // paint differently even though no /AP was written.\n { action: 'generation-unavailable', changed: impact === 'regenerate' };\n }\n\n // PDFium caches the parsed appearance form on an annotation context. A\n // regenerated /AP is persisted immediately, but reading blend mode through\n // the same handle can still observe that old form. Reopen the non-structural\n // target before read-back so the returned DTO reflects the new stream.\n fn.FPDFPage_CloseAnnot(annotPtr);\n annotPtr = null;\n annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n\n // Read back. Update is non-structural, so the index does NOT move\n // and the revision does NOT bump.\n const newIndex = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (newIndex < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${newIndex} after update`,\n );\n }\n const dto = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n ref.pageObjectNumber,\n newIndex,\n pageStateBefore.revision,\n readContextFor(this.session, this.fonts),\n );\n joinWidgetFieldNumbers(this.runtime, this.session, [dto]);\n\n this.recordWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(ref.pageObjectNumber);\n const meta = computeMutationImpact({\n mutation: 'update',\n pageStateBefore,\n pageStateAfter,\n changed: linkedParentId ? [stableId, linkedParentId] : [stableId],\n });\n return { updated: dto, appearance, meta };\n } finally {\n if (annotPtr !== null) fn.FPDFPage_CloseAnnot(annotPtr);\n pool.release(ref.pageObjectNumber);\n }\n }\n\n /**\n * Attached widgets are views of a form field: deleting one here would\n * orphan the field's /Kids (the corruption class doc.forms.repair\n * exists to fix). Detach first, or use the forms-plane cascade.\n */\n private assertNotAttachedWidget(annotPtr: Ptr): void {\n const { fn } = this.runtime;\n if (fn.FPDFAnnot_GetSubtype(annotPtr) !== PdfAnnotationSubtypeCode.WIDGET) return;\n const annotObjectNumber = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (resolveWidgetFieldObjectNumber(this.runtime, this.session, annotObjectNumber) === 0) {\n return; // inert widget: an ordinary annotation, ordinary delete\n }\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'widget is attached to a form field - use doc.forms.detachWidget or doc.forms.deleteField',\n );\n }\n\n delete(ref: AnnotationRef, signal: AbortSignal): AnnotationDeleteResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(ref.pageObjectNumber);\n let bumpRequested = false;\n try {\n this.ensureKnownWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateBefore = this.session.pageState(ref.pageObjectNumber);\n throwIfAborted(signal);\n\n let deleted: AnnotationStableId | null;\n let ok = false;\n switch (ref.kind) {\n case 'objectNumber': {\n // Probe so we 404 honestly before mutating. The fork helper\n // does its own existence check too, but we want a clean\n // InvalidReference up front rather than a \"false\" return code\n // we'd have to translate.\n const probe = fn.EPDFPage_GetAnnotByObjectNumber(pagePtr, ref.annotObjectNumber);\n if (!probe) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with object number ${ref.annotObjectNumber} on page ${ref.pageObjectNumber}`,\n );\n }\n try {\n this.assertNotAttachedWidget(probe);\n } finally {\n fn.FPDFPage_CloseAnnot(probe);\n }\n bumpRequested = true;\n ok = fn.EPDFPage_RemoveAnnotByObjectNumber(pagePtr, ref.annotObjectNumber);\n deleted = { kind: 'objectNumber', value: ref.annotObjectNumber };\n break;\n }\n case 'nm': {\n const namePtr = mem.writeU16String(ref.nm);\n try {\n const probe = fn.EPDFPage_GetAnnotByName(pagePtr, namePtr);\n if (!probe) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `no annotation with /NM '${ref.nm}' on page ${ref.pageObjectNumber}`,\n );\n }\n try {\n this.assertNotAttachedWidget(probe);\n } finally {\n fn.FPDFPage_CloseAnnot(probe);\n }\n bumpRequested = true;\n ok = fn.EPDFPage_RemoveAnnotByName(pagePtr, namePtr);\n } finally {\n mem.free(namePtr);\n }\n deleted = { kind: 'nm', value: ref.nm };\n break;\n }\n case 'index': {\n this.session.validateRevision(ref.revision);\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, ref.index);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n `index ${ref.index} out of range on page ${ref.pageObjectNumber}`,\n );\n }\n let probedObjNum: number;\n let probedNm: string | null;\n try {\n probedObjNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n probedNm = readAnnotString(fn, mem, annotPtr, 'NM');\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n deleted =\n probedObjNum > 0\n ? { kind: 'objectNumber', value: probedObjNum }\n : probedNm !== null && probedNm.length > 0\n ? { kind: 'nm', value: probedNm }\n : null;\n bumpRequested = true;\n // EPDFPage_RemoveAnnot is the fork helper that ALSO cleans up\n // the indirect object if the annotation has one. The vanilla\n // FPDFPage_RemoveAnnot would leak the indirect object.\n ok = fn.EPDFPage_RemoveAnnot(pagePtr, ref.index);\n break;\n }\n }\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to remove annotation: ${ref.kind}`);\n }\n\n // Structural change; bump the local index-space epoch now and stop\n // the finally-bump. Do not gate this on the page's current weak state:\n // old snapshots can still hold index refs from before annotations were\n // strengthened, and delete/move can make those refs point elsewhere.\n this.session.bumpRevision(ref.pageObjectNumber);\n bumpRequested = false;\n this.recordWeakStateFromPage(ref.pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(ref.pageObjectNumber);\n\n const meta = computeMutationImpact({\n mutation: 'delete',\n pageStateBefore,\n pageStateAfter,\n changed: deleted ? [deleted] : [],\n });\n return { deleted, meta };\n } finally {\n if (bumpRequested) this.session.bumpRevision(ref.pageObjectNumber);\n pool.release(ref.pageObjectNumber);\n }\n }\n\n /**\n * Batch reorder of a contiguous block of annotations within a single\n * page's /Annots array. Symmetric with `pages.move()` for pages.\n *\n * Semantics (locked with the user, mirrors `EPDFPage_MoveAnnots`):\n * - Each ref in `refs` is resolved to its current /Annots index.\n * The block is detached, then re-inserted at `toIndex` in the\n * post-removal index space, preserving caller-supplied order.\n * - Single-annotation case is `move([ref], toIndex)`. There is no\n * separate single-move path; one batch primitive serves both.\n * - Atomic from the caller's perspective:\n * * one revision bump per batch, regardless of `refs.length`.\n * * one `AnnotationListMutationMeta` envelope.\n * * if `EPDFPage_MoveAnnots` rejects (returns false) the page is\n * untouched and we throw `InvalidArg` without bumping.\n * - Identity strengthening: each weak ref in the batch (no\n * `objectNumber`, no `/NM`) is opportunistically stamped with a\n * fresh engine-generated UUID v4 BEFORE the move. So\n * `meta.changed` always lists durable stable ids, and the moved\n * DTOs come out durable. Same monotonic `/NM` rule as `update()`.\n *\n * Validation rules applied here BEFORE calling the helper, so callers\n * get clean errors instead of an opaque `false` return code:\n * - `refs.length >= 1`.\n * - All refs target the page identified by `pageObjectNumber`.\n * - `toIndex >= 0` and `toIndex <= count - refs.length` (count is\n * captured AFTER ref resolution, so the helper sees the same view).\n * - Resolved indices have no duplicates.\n *\n * The `EPDFPage_MoveAnnots` helper itself enforces the same rules; the\n * up-front validation is purely for a usable error surface.\n */\n move(\n pageObjectNumber: PageObjectNumber,\n refs: AnnotationRef[],\n toIndex: number,\n signal: AbortSignal,\n ): AnnotationMoveResult {\n throwIfAborted(signal);\n if (refs.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'move requires at least one ref');\n }\n if (toIndex < 0 || !Number.isInteger(toIndex)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move toIndex must be a non-negative integer (got ${toIndex})`,\n );\n }\n for (const r of refs) {\n if (r.pageObjectNumber !== pageObjectNumber) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move refs must all target page ${pageObjectNumber}; got ref on page ${r.pageObjectNumber}`,\n );\n }\n }\n\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n let bumpRequested = false;\n\n try {\n this.ensureKnownWeakStateFromPage(pageObjectNumber, pagePtr);\n const pageStateBefore = this.session.pageState(pageObjectNumber);\n throwIfAborted(signal);\n\n // 1. Resolve every ref in caller order. For each: capture its\n // current /Annots index and its (possibly newly-stamped)\n // stable id. We close each annotPtr right after probing — the\n // move helper takes the page-level pointer, and we'll re-open\n // annotPtrs later by *new* index for the readback.\n const fromIndices: number[] = new Array(refs.length);\n const stableIds: AnnotationStableId[] = new Array(refs.length);\n for (let i = 0; i < refs.length; i++) {\n throwIfAborted(signal);\n const annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, refs[i]);\n try {\n const idx = fn.FPDFPage_GetAnnotIndex(pagePtr, annotPtr);\n if (idx < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotIndex returned ${idx} during move resolution`,\n );\n }\n fromIndices[i] = idx;\n stableIds[i] = this.captureOrStampStableId(annotPtr);\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n // 2. Reject duplicate source indices up front. Two refs that\n // resolve to the same index would violate the helper's\n // invariant (and would also be a confused caller).\n const seen = new Set<number>();\n for (const idx of fromIndices) {\n if (seen.has(idx)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move refs resolve to duplicate /Annots index ${idx}`,\n );\n }\n seen.add(idx);\n }\n\n // 3. Range-check toIndex against the post-removal count, matching\n // the helper's contract.\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n const postRemovalCount = count - fromIndices.length;\n if (toIndex > postRemovalCount) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `move toIndex ${toIndex} out of range; post-removal count is ${postRemovalCount}`,\n );\n }\n\n // 4. Marshal fromIndices into an i32 array in runtime memory and\n // invoke the helper. From this call onward a structural change\n // may have happened; finally-bump on any failure.\n const arrBytes = 4 * fromIndices.length;\n const arrPtr = mem.alloc(arrBytes);\n let ok: boolean;\n try {\n for (let i = 0; i < fromIndices.length; i++) {\n mem.poke(arrPtr, 'i32', fromIndices[i], 4 * i);\n }\n bumpRequested = true;\n ok = fn.EPDFPage_MoveAnnots(pagePtr, arrPtr, fromIndices.length, toIndex);\n } finally {\n mem.free(arrPtr);\n }\n\n if (!ok) {\n // The helper validates atomically: a `false` return means it\n // rejected the request and made no changes. Cancel the pending\n // bump and surface a clean error.\n bumpRequested = false;\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `EPDFPage_MoveAnnots rejected the request (toIndex=${toIndex}, fromIndices=[${fromIndices.join(\n ',',\n )}])`,\n );\n }\n\n // 5. Single revision bump for the whole batch. This is the local\n // index-space epoch, so it advances for every successful move even\n // if the page is currently strong. Read back DTOs against the\n // bumped revision so they are internally consistent.\n const bumpedRev = this.session.bumpRevision(pageObjectNumber);\n bumpRequested = false;\n\n const moved: AnnotationDTO[] = new Array(fromIndices.length);\n for (let i = 0; i < fromIndices.length; i++) {\n throwIfAborted(signal);\n const newIdx = toIndex + i;\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, newIdx);\n if (!annotPtr) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `failed to re-read moved annotation at index ${newIdx}`,\n );\n }\n try {\n moved[i] = readAnnotationFromPtr(\n fn,\n mem,\n annotPtr,\n pageObjectNumber,\n newIdx,\n bumpedRev,\n readContextFor(this.session, this.fonts),\n );\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n\n this.recordWeakStateFromPage(pageObjectNumber, pagePtr);\n const pageStateAfter = this.session.pageState(pageObjectNumber);\n const meta: AnnotationListMutationMeta = computeMutationImpact({\n mutation: 'move',\n pageStateBefore,\n pageStateAfter,\n changed: stableIds,\n });\n return { moved, meta };\n } finally {\n if (bumpRequested) this.session.bumpRevision(pageObjectNumber);\n pool.release(pageObjectNumber);\n }\n }\n\n /**\n * Bake (or re-bake) an annotation's `/AP` normal appearance stream from\n * its current dictionary properties using PDFium's native AP generator,\n * then flush the page content so the result is persisted into the\n * page/object tree. Same path the v2 engine used after every\n * create/update; runs for every writable subtype (shapes + text-markup).\n *\n * Best-effort: `EPDFAnnot_GenerateAppearance` returns false for subtypes\n * PDFium has no generator for (e.g. widgets), in which case the\n * annotation simply ships without a baked `/AP` and viewers synthesize\n * one — so a false return is not a hard error; it is surfaced to `update`\n * callers as the `generation-unavailable` appearance outcome. This step is\n * non-structural: it never shifts annotation indices or bumps revisions.\n */\n private regenerateAppearance(annotPtr: Ptr, pagePtr: Ptr, blendMode?: BlendMode): boolean {\n const { fn } = this.runtime;\n const ok =\n blendMode === undefined\n ? fn.EPDFAnnot_GenerateAppearance(annotPtr)\n : fn.EPDFAnnot_GenerateAppearanceWithBlend(annotPtr, blendModeToCode(blendMode));\n fn.FPDFPage_GenerateContent(pagePtr);\n return ok;\n }\n\n private captureOrStampStableId(annotPtr: Ptr): AnnotationStableId {\n return captureOrStampStableId(this.runtime, annotPtr);\n }\n\n private ensureKnownWeakStateFromPage(pageObjectNumber: PageObjectNumber, pagePtr: Ptr): void {\n if (this.session.weakAnnotationState(pageObjectNumber).kind === 'known') {\n return;\n }\n this.recordWeakStateFromPage(pageObjectNumber, pagePtr);\n }\n\n private recordWeakStateFromPage(pageObjectNumber: PageObjectNumber, pagePtr: Ptr): void {\n this.session.recordWeakFlag(pageObjectNumber, this.computeHasWeakAnnotations(pagePtr));\n }\n\n private computeHasWeakAnnotations(pagePtr: Ptr): boolean {\n const { fn, mem } = this.runtime;\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `FPDFPage_GetAnnotCount returned ${count} while computing weak annotations`,\n );\n }\n for (let i = 0; i < count; i++) {\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, i);\n if (!annotPtr) {\n continue;\n }\n try {\n const objNum = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (objNum > 0) {\n continue;\n }\n const nm = readAnnotString(fn, mem, annotPtr, 'NM');\n if (nm === null || nm.length === 0) {\n return true;\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n return false;\n }\n}\n","import type {\n AnnotationFlattenResult,\n AnnotationRef,\n MutationMeta,\n PageFlattenUsage,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { AnnotationReader } from './AnnotationReader';\nimport { resolveAnnotPtr } from './internal/identity/resolveAnnotationPointer';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { throwIfAborted } from '../../shared/abort';\n\n// `FLATTEN_*` / `EPDF_FLATTEN_STATUS_*` from public/fpdf_flatten.h.\nconst FLATTEN_FAIL = 0;\nconst FLATTEN_SUCCESS = 1;\nconst FLATTEN_NOTHING_TO_DO = 2;\nconst STATUS_APPLIED = 0;\nconst STATUS_SKIPPED = 1;\nconst STATUS_NOT_ON_PAGE = 2;\nconst FPDF_NO_INCREMENTAL = 1 << 1;\n\n/**\n * The annotation-plane flatten verbs — `pages.flatten` for a chosen set:\n * in place (`flatten`) or into a new single-page document\n * (`exportAppearance`). Both resolve refs to native handles on the page,\n * hand the SET to the fork (one candidate plan, one placement writer — the\n * same code whole-page flatten runs), and release every handle afterwards.\n */\nexport class AnnotationFlattener {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n flatten(\n pageObjectNumber: PageObjectNumber,\n refs: AnnotationRef[],\n usage: PageFlattenUsage,\n signal: AbortSignal,\n ): AnnotationFlattenResult {\n throwIfAborted(signal);\n this.requireRefs('annotations.flatten', pageObjectNumber, refs);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n try {\n const annotPtrs = this.resolveAll(pagePtr, refs);\n let code: number;\n let statuses: number[];\n try {\n [code, statuses] = this.withHandleArray(annotPtrs, (arrayPtr) =>\n withScratch(mem, 4 * refs.length, (statusPtr) => {\n const rc = fn.EPDFPage_FlattenAnnotations(\n pagePtr,\n arrayPtr,\n refs.length,\n usage === 'print' ? 1 : 0,\n statusPtr,\n );\n const out: number[] = [];\n for (let i = 0; i < refs.length; i++) {\n out.push(Number(mem.peek(statusPtr, 'i32', 4 * i)));\n }\n return [rc, out] as const;\n }),\n );\n } finally {\n for (const annotPtr of annotPtrs) fn.FPDFPage_CloseAnnot(annotPtr);\n }\n\n if (code === FLATTEN_FAIL) {\n // Every ref resolved on THIS page (resolveAll), so a FAIL is the\n // fork disagreeing with /Annots or a catalog write failing.\n const foreign = statuses.findIndex((status) => status === STATUS_NOT_ON_PAGE);\n throw new EngineError(\n foreign >= 0 ? EngineErrorCode.InvalidArg : EngineErrorCode.Unknown,\n foreign >= 0\n ? `annotations.flatten: ref ${foreign} is not an annotation of page ${pageObjectNumber}`\n : 'native annotation flatten failed after preflight',\n );\n }\n\n const results = refs.map((ref, i) => ({\n ref,\n status: statuses[i] === STATUS_APPLIED ? ('applied' as const) : ('skipped' as const),\n }));\n if (code === FLATTEN_NOTHING_TO_DO || code !== FLATTEN_SUCCESS) {\n return { pageObjectNumber, usage, results, meta: null };\n }\n\n // Content + annotation liveness changed on this page — the same\n // bookkeeping PagesFlattener performs per affected page.\n this.session.noteMutation();\n this.session.bumpRevision(pageObjectNumber);\n try {\n new AnnotationReader(this.runtime, this.session).list(pageObjectNumber, signal);\n } catch {\n // Weak-annotation state stays conservatively unknown; never lose\n // the layer artifact over a post-flatten diagnostic read.\n }\n const meta: MutationMeta = {\n affectedPages: [this.session.pageState(pageObjectNumber)],\n cacheDelta: null,\n };\n return { pageObjectNumber, usage, results, meta };\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n exportAppearance(\n pageObjectNumber: PageObjectNumber,\n refs: AnnotationRef[],\n signal: AbortSignal,\n ): { bytes: ArrayBuffer; size: number } {\n throwIfAborted(signal);\n this.requireRefs('annotations.exportAppearance', pageObjectNumber, refs);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n let exportedPtr: Ptr | null = null;\n let pdfPtr: Ptr | null = null;\n try {\n const annotPtrs = this.resolveAll(pagePtr, refs);\n try {\n exportedPtr = this.withHandleArray(annotPtrs, (arrayPtr) =>\n fn.EPDFPage_ExportAnnotationsAsDocument(pagePtr, arrayPtr, refs.length),\n );\n } finally {\n for (const annotPtr of annotPtrs) fn.FPDFPage_CloseAnnot(annotPtr);\n }\n if (!exportedPtr) {\n // All-or-nothing by contract: a ref without a usable normal\n // appearance (hidden, popup, no /AP) refuses the whole export.\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'annotations.exportAppearance: every ref must be a visible annotation of this page with a normal appearance',\n );\n }\n return withScratch(mem, 4, (sizePtr) => {\n mem.poke(sizePtr, 'i32', 0);\n pdfPtr = fn.EPDF_SaveDocumentToOwnedBuffer(exportedPtr!, FPDF_NO_INCREMENTAL, sizePtr);\n const size = Number(mem.peek(sizePtr, 'i32'));\n if (!pdfPtr || size <= 0) {\n throw new EngineError(\n EngineErrorCode.DocOpenFailed,\n 'failed to save exported appearances',\n );\n }\n const bytes = mem.readBytes(pdfPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size };\n });\n } finally {\n if (pdfPtr) fn.EPDF_FreeBuffer(pdfPtr);\n if (exportedPtr) fn.FPDF_CloseDocument(exportedPtr);\n pool.release(pageObjectNumber);\n }\n }\n\n /** Resolve every ref on `pagePtr` (NotFound / InvalidReference from the\n * resolver on caller error); on any failure, close what was opened. */\n private resolveAll(pagePtr: Ptr, refs: AnnotationRef[]): Ptr[] {\n const { fn } = this.runtime;\n const annotPtrs: Ptr[] = [];\n try {\n for (const ref of refs) {\n annotPtrs.push(resolveAnnotPtr(this.runtime, this.session, pagePtr, ref));\n }\n return annotPtrs;\n } catch (error) {\n for (const annotPtr of annotPtrs) fn.FPDFPage_CloseAnnot(annotPtr);\n throw error;\n }\n }\n\n /** Marshal an `FPDF_ANNOTATION*` array for the call's duration. */\n private withHandleArray<T>(annotPtrs: Ptr[], body: (arrayPtr: Ptr) => T): T {\n const { mem } = this.runtime;\n const isWasm = this.runtime.kind === 'wasm';\n const ptrSize = isWasm ? 4 : 8;\n return withScratch(mem, Math.max(1, annotPtrs.length * ptrSize), (arrayPtr) => {\n annotPtrs.forEach((ptr, i) =>\n isWasm\n ? mem.poke(arrayPtr, 'i32', Number(ptr), i * 4)\n : mem.poke(arrayPtr, 'i64', ptr, i * 8),\n );\n return body(arrayPtr);\n });\n }\n\n private requireRefs(op: string, pageObjectNumber: PageObjectNumber, refs: AnnotationRef[]): void {\n if (refs.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, `${op} requires at least one ref`);\n }\n for (const ref of refs) {\n if (ref.pageObjectNumber !== pageObjectNumber) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `${op} refs must all target page ${pageObjectNumber}; got ref on page ${ref.pageObjectNumber}`,\n );\n }\n }\n }\n}\n","import type {\n MutationMeta,\n PageFlattenResult,\n PageFlattenUsage,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, serializeError } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { AnnotationReader } from '../annotations';\n\nconst FLATTEN_FAIL = 0;\nconst FLATTEN_SUCCESS = 1;\nconst FLATTEN_NOTHING_TO_DO = 2;\n\n/** Layer-safe page flattening. Content and annotation liveness change together. */\nexport class PagesFlattener {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n flatten(\n pageObjectNumbers: PageObjectNumber[],\n usage: PageFlattenUsage,\n signal: AbortSignal,\n ): PageFlattenResult {\n throwIfAborted(signal);\n requireUniquePages(pageObjectNumbers);\n for (const pageObjectNumber of pageObjectNumbers) {\n this.session.recordByObjectNumber(pageObjectNumber);\n }\n\n const results: PageFlattenResult['results'] = [];\n const affected = new Set<PageObjectNumber>();\n let stop = false;\n for (const pageObjectNumber of pageObjectNumbers) {\n if (stop || (signal.aborted && affected.size > 0)) {\n stop = true;\n results.push({ pageObjectNumber, status: 'skipped' });\n continue;\n }\n if (signal.aborted) throwIfAborted(signal);\n\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n let code: number;\n try {\n code = this.runtime.fn.EPDFPage_Flatten(pagePtr, usage === 'print' ? 1 : 0);\n } catch (error) {\n affected.add(pageObjectNumber);\n results.push({ pageObjectNumber, status: 'failed', error: serializeError(error) });\n stop = true;\n continue;\n } finally {\n pool.release(pageObjectNumber);\n }\n\n if (code === FLATTEN_NOTHING_TO_DO) {\n results.push({ pageObjectNumber, status: 'unchanged' });\n } else if (code === FLATTEN_SUCCESS) {\n affected.add(pageObjectNumber);\n results.push({ pageObjectNumber, status: 'applied' });\n } else {\n affected.add(pageObjectNumber);\n results.push({\n pageObjectNumber,\n status: 'failed',\n error: serializeError(\n new EngineError(\n EngineErrorCode.Unknown,\n code === FLATTEN_FAIL\n ? 'native page flatten failed after preflight'\n : `native page flatten returned unexpected code ${code}`,\n ),\n ),\n });\n stop = true;\n }\n }\n\n if (affected.size === 0) return { pageObjectNumbers, usage, results, meta: null };\n\n this.session.noteMutation();\n for (const pageObjectNumber of affected) {\n this.session.bumpRevision(pageObjectNumber);\n try {\n // Recompute the weak-annotation flag from the annotations that remain.\n new AnnotationReader(this.runtime, this.session).list(pageObjectNumber, signal);\n } catch {\n // The page state remains conservatively unknown. Never lose the layer\n // artifact because a post-flatten diagnostic read failed.\n }\n }\n const meta: MutationMeta = {\n affectedPages: [...affected].map((pageObjectNumber) =>\n this.session.pageState(pageObjectNumber),\n ),\n cacheDelta: null,\n };\n return { pageObjectNumbers, usage, results, meta };\n }\n}\n\nfunction requireUniquePages(pageObjectNumbers: PageObjectNumber[]): void {\n if (pageObjectNumbers.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pages.flatten requires at least one page');\n }\n const seen = new Set<PageObjectNumber>();\n for (const pageObjectNumber of pageObjectNumbers) {\n if (seen.has(pageObjectNumber)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pages.flatten was given duplicate page object number ${pageObjectNumber}`,\n );\n }\n seen.add(pageObjectNumber);\n }\n}\n","import type {\n AnnotationRef,\n MutationMeta,\n PageObjectNumber,\n RedactionApplyResult,\n RedactionApplyScope,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n serializeError,\n subtypeFromCode,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { I32_BYTES, readI32 } from '../../runtime/memory/structs';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { throwIfAborted } from '../../shared/abort';\nimport { AnnotationReader } from '../annotations';\nimport { resolveAnnotPtr } from '../annotations/internal/identity/resolveAnnotationPointer';\n\n/**\n * The destructive half of redaction (see `DocumentRedactionService` for the\n * model and the layer trust boundary). Content and annotation liveness\n * change together, exactly like {@link PagesFlattener} — this class mirrors\n * its validate-then-apply boundary and ordered-batch semantics.\n *\n * Scope semantics:\n * - `pages`: every REDACT annotation on each listed page is applied; a\n * page with none is `unchanged`.\n * - `annotations`: exactly the referenced REDACT annotations are applied.\n * Every ref is resolved and subtype-checked BEFORE the first native\n * write; a non-REDACT ref rejects the whole call with `InvalidArg`.\n *\n * The per-page `removedAnnotationCount` is the native collateral count:\n * annotations other than REDACT ones removed alongside the apply (popup\n * cascades and detached widgets included).\n */\nexport class RedactionApplier {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n apply(scope: RedactionApplyScope, signal: AbortSignal): RedactionApplyResult {\n throwIfAborted(signal);\n\n const plan = this.buildPlan(scope);\n for (const pageObjectNumber of plan.keys()) {\n this.session.recordByObjectNumber(pageObjectNumber);\n }\n this.preflight(plan, signal);\n\n const { fn } = this.runtime;\n const results: RedactionApplyResult['results'] = [];\n const affected = new Set<PageObjectNumber>();\n let totalRemoved = 0;\n let stop = false;\n\n for (const [pageObjectNumber, refs] of plan) {\n if (stop || (signal.aborted && affected.size > 0)) {\n stop = true;\n results.push({ pageObjectNumber, status: 'skipped', removedAnnotationCount: 0 });\n continue;\n }\n if (signal.aborted) throwIfAborted(signal);\n\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n try {\n const outcome =\n refs === null ? this.applyAllOnPage(pagePtr) : this.applyRefsOnPage(pagePtr, refs);\n if (outcome.status === 'applied') {\n fn.FPDFPage_GenerateContent(pagePtr);\n affected.add(pageObjectNumber);\n totalRemoved += outcome.removed;\n }\n results.push({\n pageObjectNumber,\n status: outcome.status,\n removedAnnotationCount: outcome.removed,\n });\n } catch (error) {\n affected.add(pageObjectNumber);\n results.push({\n pageObjectNumber,\n status: 'failed',\n removedAnnotationCount: 0,\n error: serializeError(error),\n });\n stop = true;\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n if (affected.size === 0) {\n return { scope, results, removedAnnotationCount: totalRemoved, meta: null };\n }\n\n this.session.noteMutation();\n for (const pageObjectNumber of affected) {\n this.session.bumpRevision(pageObjectNumber);\n try {\n // Recompute the weak-annotation flag from the annotations that remain.\n new AnnotationReader(this.runtime, this.session).list(pageObjectNumber, signal);\n } catch {\n // The page state remains conservatively unknown. Never lose the layer\n // artifact because a post-apply diagnostic read failed.\n }\n }\n const meta: MutationMeta = {\n affectedPages: [...affected].map((pageObjectNumber) =>\n this.session.pageState(pageObjectNumber),\n ),\n cacheDelta: null,\n };\n return { scope, results, removedAnnotationCount: totalRemoved, meta };\n }\n\n /**\n * Normalize the scope into an ordered per-page plan. `null` refs means\n * \"every REDACT annotation on the page\" (the `pages` scope).\n */\n private buildPlan(scope: RedactionApplyScope): Map<PageObjectNumber, AnnotationRef[] | null> {\n const plan = new Map<PageObjectNumber, AnnotationRef[] | null>();\n if (scope.kind === 'pages') {\n if (scope.pageObjectNumbers.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'redaction.apply requires at least one page',\n );\n }\n for (const pageObjectNumber of scope.pageObjectNumbers) {\n if (plan.has(pageObjectNumber)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `redaction.apply was given duplicate page object number ${pageObjectNumber}`,\n );\n }\n plan.set(pageObjectNumber, null);\n }\n return plan;\n }\n\n if (scope.refs.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'redaction.apply requires at least one annotation ref',\n );\n }\n for (const ref of scope.refs) {\n const existing = plan.get(ref.pageObjectNumber);\n if (existing === null) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'mixed redaction scopes on one page');\n }\n if (existing) existing.push(ref);\n else plan.set(ref.pageObjectNumber, [ref]);\n }\n // Applying removes annotations, which shifts positional indices — a\n // batch of multiple refs on one page can only address the survivors\n // stably through durable ref kinds.\n for (const [pageObjectNumber, refs] of plan) {\n if (refs !== null && refs.length > 1 && refs.some((r) => r.kind === 'index')) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `multiple redactions on page ${pageObjectNumber} cannot be addressed by positional 'index' refs — use objectNumber/nm refs, or one apply call per index ref`,\n );\n }\n }\n return plan;\n }\n\n /**\n * Validate every ref BEFORE the first native write: it must resolve and\n * it must be a REDACT annotation. After this returns, the apply loop's\n * writes begin and per-page failures are recorded, not thrown.\n */\n private preflight(\n plan: Map<PageObjectNumber, AnnotationRef[] | null>,\n signal: AbortSignal,\n ): void {\n const { fn } = this.runtime;\n for (const [pageObjectNumber, refs] of plan) {\n if (refs === null) continue;\n throwIfAborted(signal);\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n try {\n for (const ref of refs) {\n const annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n try {\n const subtype = subtypeFromCode(fn.FPDFAnnot_GetSubtype(annotPtr));\n if (subtype !== 'redact') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `redaction.apply ref on page ${pageObjectNumber} resolves to a '${subtype}' annotation, not a redact annotation`,\n );\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n }\n\n private applyAllOnPage(pagePtr: Ptr): { status: 'applied' | 'unchanged'; removed: number } {\n const { fn, mem } = this.runtime;\n const hasRedactions = this.pageHasRedactAnnotations(pagePtr);\n return withScratch(mem, I32_BYTES, (countPtr) => {\n const ok = fn.EPDFPage_ApplyRedactions(pagePtr, countPtr);\n if (!ok) {\n // Native FALSE is overloaded: it means either \"no REDACT annotations\"\n // or that applying one failed. Distinguish those cases before the\n // destructive call so a sanitizer failure is never reported as an\n // unchanged page.\n if (hasRedactions) {\n throw new EngineError(EngineErrorCode.Unknown, 'native page redaction apply failed');\n }\n return { status: 'unchanged' as const, removed: 0 };\n }\n return { status: 'applied' as const, removed: readI32(mem, countPtr) >>> 0 };\n });\n }\n\n private pageHasRedactAnnotations(pagePtr: Ptr): boolean {\n const { fn } = this.runtime;\n const count = fn.FPDFPage_GetAnnotCount(pagePtr);\n for (let index = 0; index < count; index++) {\n const annotPtr = fn.FPDFPage_GetAnnot(pagePtr, index);\n if (!annotPtr) continue;\n try {\n if (subtypeFromCode(fn.FPDFAnnot_GetSubtype(annotPtr)) === 'redact') return true;\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n return false;\n }\n\n private applyRefsOnPage(\n pagePtr: Ptr,\n refs: AnnotationRef[],\n ): { status: 'applied'; removed: number } {\n const { fn, mem } = this.runtime;\n let removed = 0;\n for (const ref of refs) {\n // Re-resolve at apply time: an earlier apply on this page may have\n // removed collateral annotations, and durable refs stay valid across\n // that (preflight rejected fragile batched index refs).\n const annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n try {\n const ok = withScratch(mem, I32_BYTES, (countPtr) => {\n const applied = fn.EPDFAnnot_ApplyRedaction(pagePtr, annotPtr, countPtr);\n if (applied) removed += readI32(mem, countPtr) >>> 0;\n return applied;\n });\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'native redaction apply failed after preflight',\n );\n }\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n }\n return { status: 'applied', removed };\n }\n}\n","import type { CharMapAnchor, PageObjectNumber, PageTextSnapshot } from '@embedpdf/engine-core/runtime';\nimport { charMapViolation, EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Per-page slow-path text reader. Acquires a `pagePtr` from the\n * `PagePtrPool`, opens a PDFium text page (`FPDFText_LoadPage`), extracts\n * the page text, and releases everything in reverse order.\n *\n * Index spaces (see engine-core `text/charmap.ts`): `charCount` is the\n * CHARACTER space (`FPDFText_CountChars` — the space geometry runs tile);\n * `text` is the TEXT projection. The two diverge when a character\n * contributes zero text units (non-printing) or two (supplementary plane);\n * `charMap` anchors encode exactly those deviations.\n *\n * Both come from the fork's batched extension calls, which share one\n * encoding authority (`FX_UTF16Encode`) so text and map can never\n * disagree:\n *\n * - `EPDFText_GetTextFull` — true UTF-16LE extraction; supplementary\n * characters arrive as surrogate pairs instead of being silently\n * dropped by `FPDFText_GetText`'s UCS-2 encoder. Called once with an\n * upper-bound buffer (2 units per character + NUL), so no measure\n * round-trip.\n * - `EPDFText_GetCharToTextMap` — the anchors, measure-then-fill. Zero\n * anchors is the common (identity) page and skips the fill call.\n */\nexport class PageTextReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(pageObjectNumber: PageObjectNumber, signal: AbortSignal): PageTextSnapshot {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n throwIfAborted(signal);\n const textPagePtr = fn.FPDFText_LoadPage(pagePtr);\n if (!textPagePtr) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `FPDFText_LoadPage returned null for page object ${pageObjectNumber}`,\n );\n }\n try {\n throwIfAborted(signal);\n const charCount = Math.max(fn.FPDFText_CountChars(textPagePtr), 0);\n const text = readTextFull(this.runtime, textPagePtr, charCount);\n const charMap = readCharMap(this.runtime, textPagePtr, pageObjectNumber);\n // Cross-check the two calls against the shared invariants — a\n // disagreement is an engine bug and must fail loudly, never ship a\n // snapshot that slices wrong.\n const violation = charMapViolation(charCount, text.length, charMap);\n if (violation !== null) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `char map invariant violated for page object ${pageObjectNumber}: ${violation}`,\n );\n }\n return charMap.length > 0 ? { text, charCount, charMap } : { text, charCount };\n } finally {\n fn.FPDFText_ClosePage(textPagePtr);\n }\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n}\n\n/**\n * Full-fidelity page text in one call: the buffer is sized at the maximum\n * possible expansion (every character a surrogate pair, plus the NUL), so\n * the returned requirement always fits and the measure round-trip is\n * skipped. The return value counts UTF-16 units INCLUDING the terminator.\n */\nfunction readTextFull(\n runtime: PdfRuntimeModule,\n textPagePtr: Ptr,\n charCount: number,\n): string {\n if (charCount <= 0) return '';\n const { fn, mem } = runtime;\n const bufUnits = charCount * 2 + 1;\n return withScratch(mem, bufUnits * 2, (buf) => {\n const written = fn.EPDFText_GetTextFull(textPagePtr, buf, bufUnits);\n if (written <= 1) return '';\n return decodeUtf16Le(mem.readBytes(buf, (written - 1) * 2));\n });\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n const units = new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1);\n let out = '';\n const CHUNK = 0x2000;\n for (let i = 0; i < units.length; i += CHUNK) {\n out += String.fromCharCode(...units.subarray(i, Math.min(i + CHUNK, units.length)));\n }\n return out;\n}\n\n/** Anchor struct layout: two little-endian i32s (see EPDF_CHAR_MAP_ANCHOR). */\nconst ANCHOR_BYTES = 8;\n\nfunction readCharMap(\n runtime: PdfRuntimeModule,\n textPagePtr: Ptr,\n pageObjectNumber: PageObjectNumber,\n): CharMapAnchor[] {\n const { fn, mem } = runtime;\n const count = fn.EPDFText_GetCharToTextMap(textPagePtr, NULL_PTR, 0);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `EPDFText_GetCharToTextMap failed for page object ${pageObjectNumber}`,\n );\n }\n if (count === 0) return [];\n return withScratch(mem, count * ANCHOR_BYTES, (buf) => {\n fn.EPDFText_GetCharToTextMap(textPagePtr, buf, count);\n const bytes = mem.readBytes(buf, count * ANCHOR_BYTES);\n const words = new Int32Array(bytes.buffer, bytes.byteOffset, count * 2);\n const anchors: CharMapAnchor[] = new Array(count);\n for (let i = 0; i < count; i++) {\n anchors[i] = [words[i * 2], words[i * 2 + 1]];\n }\n return anchors;\n });\n}\n","import type {\n PageGeometryGlyph,\n PageGeometryRun,\n PageGeometrySnapshot,\n PageObjectNumber,\n PdfQuad,\n PdfRect,\n RotatedGeometryGlyph,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n normalizePdfRect,\n pdfQuadBounds,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeMemory, PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport {\n EPDF_CHAR_GEOMETRY_LAYOUT,\n readF32,\n readI32,\n readRectF,\n} from '../../runtime/memory/structs';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Mid-object orientation drift that forces a run split (~0.5°). Real content\n * keeps one char matrix per text object; this guards the exotic cases so a\n * run's `rotation` is always representative of every glyph in it.\n */\nconst ROTATION_SPLIT_TOLERANCE = 0.0087;\n\n/**\n * One glyph as read from `EPDFText_GetCharGeometry`, plus the run-grouping\n * context sampled alongside it. Pure data — no native handles — so the\n * grouping stage below is a pure function the tests can drive directly.\n */\nexport interface RawGeometryGlyphRecord {\n /** Grouping key: the glyph's text object handle (opaque identity). */\n objectKey: number | bigint;\n /** Sampled at each text object's first glyph (run splits inherit it). */\n fontSize?: number;\n /**\n * Wire flags (bit 1 = space, bit 2 = empty). Synthesized-but-visible\n * glyphs (/ActualText pieces) stay 0, exactly like the legacy reader —\n * they represent real, selectable text.\n */\n flags: number;\n /** Page-space AABB (zeroed when empty). */\n looseBox: PdfRect;\n tightBox?: PdfRect;\n /** Oriented cells — real glyphs with a usable (non-singular) matrix only. */\n looseQuad?: PdfQuad;\n tightQuad?: PdfQuad;\n /** Native uprightness of the char matrix (empty glyphs: true, inert). */\n upright: boolean;\n /** Baseline angle (radians CCW, PDF y-up); 0 when upright. */\n rotation: number;\n /** True when the ascent vector maps opposite the rotated +y (det < 0). */\n ascentFlip: boolean;\n}\n\n/** The orientation class a run commits to at its first classifiable glyph. */\ntype RunClass = { upright: true } | { upright: false; rotation: number; ascentFlip: boolean };\n\n/**\n * Geometry-only text layout reader.\n *\n * Emits geometry in PDF user space (y-up edges) — the canonical engine\n * geometry. The viewer converts to content/view space via the page geometry\n * matrix; this reader applies NO Y-flip or device transform.\n *\n * One `EPDFText_GetCharGeometry` call per glyph supplies boxes, oriented\n * cells, and flags together; `buildRunsFromRawGlyphs` then groups glyphs\n * into the upright/rotated run union. Upright runs are byte-identical to the\n * pre-orientation reader (quads the native layer offers are deliberately\n * dropped — the dominant case never pays for orientation).\n */\nexport class PageGeometryReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(pageObjectNumber: PageObjectNumber, signal: AbortSignal): PageGeometrySnapshot {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n throwIfAborted(signal);\n const textPagePtr = fn.FPDFText_LoadPage(pagePtr);\n if (!textPagePtr) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `FPDFText_LoadPage returned null for page object ${pageObjectNumber}`,\n );\n }\n try {\n throwIfAborted(signal);\n const glyphCount = Math.max(fn.FPDFText_CountChars(textPagePtr), 0);\n const records: RawGeometryGlyphRecord[] = [];\n const geometryPtr = mem.alloc(EPDF_CHAR_GEOMETRY_LAYOUT.bytes);\n\n try {\n let prevObjectKey: number | bigint | null = null;\n for (let i = 0; i < glyphCount; i++) {\n throwIfAborted(signal);\n const objectKey = fn.FPDFText_GetTextObject(textPagePtr, i);\n const record: RawGeometryGlyphRecord = {\n objectKey,\n ...this.readGlyphRaw(textPagePtr, i, geometryPtr),\n };\n if (objectKey !== prevObjectKey) {\n record.fontSize = fn.FPDFText_GetFontSize(textPagePtr, i);\n prevObjectKey = objectKey;\n }\n records.push(record);\n }\n } finally {\n mem.free(geometryPtr);\n }\n\n return { runs: buildRunsFromRawGlyphs(records) };\n } finally {\n fn.FPDFText_ClosePage(textPagePtr);\n }\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n\n private readGlyphRaw(\n textPagePtr: Ptr,\n charIndex: number,\n geometryPtr: Ptr,\n ): Omit<RawGeometryGlyphRecord, 'objectKey' | 'fontSize'> {\n const { fn, mem } = this.runtime;\n if (!fn.EPDFText_GetCharGeometry(textPagePtr, charIndex, geometryPtr)) {\n return emptyRawGlyph();\n }\n\n const { offsets, flags: bits } = EPDF_CHAR_GEOMETRY_LAYOUT;\n const native = readI32(mem, geometryPtr, offsets.flags) >>> 0;\n // Degenerate geometry keeps the legacy zeroed-glyph convention so\n // upright snapshots stay bit-identical to the pre-orientation reader.\n if (native & bits.empty) {\n return emptyRawGlyph();\n }\n\n const upright = Boolean(native & bits.upright);\n const raw: Omit<RawGeometryGlyphRecord, 'objectKey' | 'fontSize'> = {\n flags: native & bits.space ? 1 : 0,\n looseBox: normalizePdfRect(readRectF(mem, geometryPtr, offsets.looseBox)),\n upright,\n rotation: 0,\n ascentFlip: false,\n };\n if (native & bits.hasTightBox) {\n raw.tightBox = normalizePdfRect(readRectF(mem, geometryPtr, offsets.tightBox));\n }\n if (native & bits.hasLooseQuad) {\n raw.looseQuad = readQuad(mem, geometryPtr, offsets.looseQuad);\n if (native & bits.hasTightQuad) {\n raw.tightQuad = readQuad(mem, geometryPtr, offsets.tightQuad);\n }\n if (!upright) {\n const a = readF32(mem, geometryPtr, offsets.matrix);\n const b = readF32(mem, geometryPtr, offsets.matrix + 4);\n const c = readF32(mem, geometryPtr, offsets.matrix + 8);\n const d = readF32(mem, geometryPtr, offsets.matrix + 12);\n raw.rotation = Math.atan2(b, a);\n raw.ascentFlip = a * d - b * c < 0;\n }\n }\n return raw;\n }\n}\n\n/**\n * Group per-glyph records into the run union. Pure — exported for tests.\n *\n * Runs split on text-object change (the legacy rule) and on orientation\n * change between classifiable glyphs (θ drift / mixed orientation). A run's\n * variant is decided by its FIRST classifiable glyph:\n * - empty glyphs never classify (they adopt the run's variant);\n * - real glyphs WITHOUT an oriented cell (singular matrix, synthesized\n * /ActualText pieces) classify as upright — box-only data degrades to\n * exactly the legacy behavior;\n * - real glyphs with a non-upright matrix classify as rotated.\n * Runs that never see a classifiable glyph emit as upright (degenerate,\n * legacy behavior).\n */\nexport function buildRunsFromRawGlyphs(records: RawGeometryGlyphRecord[]): PageGeometryRun[] {\n const runs: PageGeometryRun[] = [];\n let buffer: RawGeometryGlyphRecord[] = [];\n let charStart = 0;\n let fontSize: number | undefined;\n let objectKey: number | bigint | null = null;\n let cls: RunClass | undefined;\n\n const flush = (nextStart: number) => {\n if (buffer.length > 0) {\n runs.push(materializeRun(buffer, charStart, fontSize, cls));\n buffer = [];\n cls = undefined;\n }\n charStart = nextStart;\n };\n\n for (let i = 0; i < records.length; i++) {\n const record = records[i];\n if (record.objectKey !== objectKey) {\n flush(i);\n objectKey = record.objectKey;\n fontSize = record.fontSize;\n }\n const recordClass = classOf(record);\n if (recordClass) {\n if (cls && !sameClass(cls, recordClass)) flush(i);\n if (!cls) cls = recordClass;\n }\n buffer.push(record);\n }\n flush(records.length);\n return runs;\n}\n\nfunction classOf(record: RawGeometryGlyphRecord): RunClass | undefined {\n if (record.flags & 2) return undefined; // empty glyphs never classify\n if (record.looseQuad && !record.upright) {\n return { upright: false, rotation: record.rotation, ascentFlip: record.ascentFlip };\n }\n return { upright: true };\n}\n\nfunction sameClass(a: RunClass, b: RunClass): boolean {\n if (a.upright || b.upright) return a.upright === b.upright;\n if (a.ascentFlip !== b.ascentFlip) return false;\n const delta = a.rotation - b.rotation;\n return Math.abs(Math.atan2(Math.sin(delta), Math.cos(delta))) <= ROTATION_SPLIT_TOLERANCE;\n}\n\nfunction materializeRun(\n buffer: RawGeometryGlyphRecord[],\n charStart: number,\n fontSize: number | undefined,\n cls: RunClass | undefined,\n): PageGeometryRun {\n if (cls && !cls.upright) {\n const glyphs: RotatedGeometryGlyph[] = buffer.map((g) =>\n g.looseQuad\n ? {\n looseQuad: g.looseQuad,\n flags: g.flags,\n ...(g.tightQuad ? { tightQuad: g.tightQuad } : {}),\n }\n : // Empty glyphs inside a rotated run: zeroed quad + the empty flag,\n // mirroring the upright variant's zeroed-box convention.\n { looseQuad: zeroQuad(), flags: g.flags },\n );\n return {\n rect: runBounds(buffer, (g) => (g.looseQuad ? pdfQuadBounds(g.looseQuad) : ZERO_RECT)),\n charStart,\n glyphs,\n rotation: cls.rotation,\n ascentFlip: cls.ascentFlip,\n ...(fontSize !== undefined ? { fontSize } : {}),\n };\n }\n\n // Upright (and degenerate-only) runs: the legacy materialization verbatim —\n // native-offered quads are dropped, the rect seeds from the FIRST glyph's\n // box (zeroed for empty glyphs, quirk included) and expands over non-empty\n // glyphs only.\n const glyphs: PageGeometryGlyph[] = buffer.map((g) => ({\n looseBox: g.looseBox,\n flags: g.flags,\n ...(g.tightBox ? { tightBox: g.tightBox } : {}),\n }));\n return {\n rect: runBounds(buffer, (g) => g.looseBox),\n charStart,\n glyphs,\n ...(fontSize !== undefined ? { fontSize } : {}),\n };\n}\n\n/** Legacy run-rect algorithm: seed from the first glyph, expand on non-empty. */\nfunction runBounds(\n buffer: RawGeometryGlyphRecord[],\n boundsOf: (g: RawGeometryGlyphRecord) => PdfRect,\n): PdfRect {\n const seed = boundsOf(buffer[0]);\n const rect = { left: seed.left, bottom: seed.bottom, right: seed.right, top: seed.top };\n for (const g of buffer) {\n if (g.flags & 2) continue;\n const b = boundsOf(g);\n rect.left = Math.min(rect.left, b.left);\n rect.bottom = Math.min(rect.bottom, b.bottom);\n rect.right = Math.max(rect.right, b.right);\n rect.top = Math.max(rect.top, b.top);\n }\n return rect;\n}\n\nconst ZERO_RECT: PdfRect = { left: 0, bottom: 0, right: 0, top: 0 };\n\nfunction zeroQuad(): PdfQuad {\n return { p1: { x: 0, y: 0 }, p2: { x: 0, y: 0 }, p3: { x: 0, y: 0 }, p4: { x: 0, y: 0 } };\n}\n\nfunction emptyRawGlyph(): Omit<RawGeometryGlyphRecord, 'objectKey' | 'fontSize'> {\n return {\n flags: 2,\n looseBox: { left: 0, bottom: 0, right: 0, top: 0 },\n upright: true,\n rotation: 0,\n ascentFlip: false,\n };\n}\n\nfunction readQuad(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset: number): PdfQuad {\n const f = (offset: number) => readF32(mem, ptr, byteOffset + offset);\n return {\n p1: { x: f(0), y: f(4) },\n p2: { x: f(8), y: f(12) },\n p3: { x: f(16), y: f(20) },\n p4: { x: f(24), y: f(28) },\n };\n}\n","import type {\n PageObjectNumber,\n PageRenderOptions,\n PageRenderTarget,\n PdfRect,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, normalizePdfRect } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { FPDF_REVERSE_BYTE_ORDER, rasterize } from './deviceRaster';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\nconst FPDF_RENDER_ANNOT = 0x01;\n\nexport class PageRenderReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n render(pageObjectNumber: PageObjectNumber, options: PageRenderOptions, signal: AbortSignal) {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n\n try {\n throwIfAborted(signal);\n\n const pageWidth = fn.FPDF_GetPageWidthF(pagePtr);\n const pageHeight = fn.FPDF_GetPageHeightF(pagePtr);\n const target = resolveTarget(options.target, pageWidth, pageHeight);\n const rotation = options.rotation ?? 0;\n const viewport = options.viewport ?? { kind: 'scale', scale: 1 };\n\n let flags = FPDF_REVERSE_BYTE_ORDER;\n if (options.includeAnnotations ?? true) flags |= FPDF_RENDER_ANNOT;\n\n const raster = rasterize(this.runtime, {\n rect: target,\n page: { width: pageWidth, height: pageHeight },\n rotation,\n viewport,\n ...(options.maxOutputPixels !== undefined\n ? { maxOutputPixels: options.maxOutputPixels }\n : {}),\n background: options.background === 'transparent' ? 'transparent' : 'white',\n draw: (bitmapPtr, matrixPtr, clipPtr) => {\n throwIfAborted(signal);\n fn.FPDF_RenderPageBitmapWithMatrix(bitmapPtr, pagePtr, matrixPtr, clipPtr, flags);\n throwIfAborted(signal);\n return true;\n },\n });\n if (!raster) {\n throw new EngineError(\n EngineErrorCode.RuntimeUnavailable,\n `failed to render page object ${pageObjectNumber}`,\n );\n }\n return raster;\n } finally {\n pool.release(pageObjectNumber);\n }\n }\n}\n\n/** Resolve the render target to a normalized PDF-space rect (page box, or a sub-rect). */\nfunction resolveTarget(\n target: PageRenderTarget | undefined,\n pageWidth: number,\n pageHeight: number,\n): PdfRect {\n if (!target || target.kind === 'page') {\n return { left: 0, bottom: 0, right: pageWidth, top: pageHeight };\n }\n const rect = normalizePdfRect(target.rect);\n if (rect.right <= rect.left || rect.top <= rect.bottom) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'render rect must have positive area');\n }\n return rect;\n}\n","import type {\n AnnotationRef,\n AttachmentFileWorkerPayload,\n EmbeddedFileItem,\n EmbeddedFileRef,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n extractAttachmentToBuffer,\n extractAttachmentToFile,\n readAttachmentFileInfo,\n readAttachmentKey,\n resolveAttachmentIndex,\n} from './internal/attachmentPrimitives';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { resolveAnnotPtr } from '../annotations/internal/identity/resolveAnnotationPointer';\n\n/**\n * Read-only access to embedded files, at both of their homes: the\n * document catalog's `/EmbeddedFiles` name tree (list / readFile by\n * index) and a FileAttachment annotation's `/FS` (readAnnotationFile by\n * ref). Pure READS over the session — no revision bumps, no layer\n * artifacts (the `PagesExtractor` shape).\n *\n * Byte delivery mirrors the request's `path?`: absent → a standalone\n * buffer for the transfer list (browser); present → the decoded file is\n * streamed to `path` via `FPDF_FILEWRITE` (server), and only metadata\n * rides the response.\n */\nexport class AttachmentReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /** Snapshot of the `/EmbeddedFiles` name tree, in tree (key-sorted) order. */\n list(signal: AbortSignal): EmbeddedFileItem[] {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const count = fn.FPDFDoc_GetAttachmentCount(docPtr);\n const items: EmbeddedFileItem[] = [];\n for (let index = 0; index < count; index++) {\n const attachmentPtr = fn.FPDFDoc_GetAttachment(docPtr, index);\n if (!attachmentPtr) continue;\n const key = readAttachmentKey(fn, mem, docPtr, index) ?? '';\n items.push({ ...readAttachmentFileInfo(fn, mem, attachmentPtr), key, index });\n }\n return items;\n }\n\n /** Decode one document-level embedded file, addressed by key. */\n readFile(\n ref: EmbeddedFileRef,\n path: string | undefined,\n maxDecodedBytes: number | undefined,\n signal: AbortSignal,\n ): AttachmentFileWorkerPayload {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const index = resolveAttachmentIndex(fn, mem, docPtr, ref);\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no embedded file with key '${ref.key}' in the document`,\n );\n }\n const attachmentPtr = fn.FPDFDoc_GetAttachment(docPtr, index);\n if (!attachmentPtr) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `embedded file with key '${ref.key}' resolved to index ${index} but could not be opened`,\n );\n }\n const info = readAttachmentFileInfo(fn, mem, attachmentPtr);\n return this.extract(attachmentPtr, info.name, info.mimeType, path, maxDecodedBytes);\n }\n\n /** Decode the file embedded in a FileAttachment annotation's `/FS`. */\n readAnnotationFile(\n pageObjectNumber: PageObjectNumber,\n ref: AnnotationRef,\n path: string | undefined,\n maxDecodedBytes: number | undefined,\n signal: AbortSignal,\n ): AttachmentFileWorkerPayload {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const pool = this.session.pagePool();\n const pagePtr = pool.acquire(pageObjectNumber);\n let annotPtr: Ptr | null = null;\n try {\n annotPtr = resolveAnnotPtr(this.runtime, this.session, pagePtr, ref);\n const attachmentPtr = fn.FPDFAnnot_GetFileAttachment(annotPtr);\n if (!attachmentPtr) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'annotation is not a file attachment or carries no embedded file (/FS)',\n );\n }\n const info = readAttachmentFileInfo(fn, mem, attachmentPtr);\n return this.extract(attachmentPtr, info.name, info.mimeType, path, maxDecodedBytes);\n } finally {\n if (annotPtr !== null) fn.FPDFPage_CloseAnnot(annotPtr);\n pool.release(pageObjectNumber);\n }\n }\n\n private extract(\n attachmentPtr: Ptr,\n name: string,\n mimeType: string | undefined,\n path: string | undefined,\n maxDecodedBytes: number | undefined,\n ): AttachmentFileWorkerPayload {\n if (path !== undefined) {\n const { size } = extractAttachmentToFile(this.runtime, attachmentPtr, path, maxDecodedBytes);\n return { name, ...(mimeType ? { mimeType } : {}), size, path };\n }\n const { bytes, size } = extractAttachmentToBuffer(this.runtime, attachmentPtr, maxDecodedBytes);\n return { name, ...(mimeType ? { mimeType } : {}), size, bytes };\n }\n}\n","import type {\n AttachmentCreateResult,\n AttachmentDeleteResult,\n EmbeddedFileRef,\n WireAttachmentFile,\n WireResourceMap,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n readAttachmentFileInfo,\n resolveAttachmentIndex,\n writeAttachmentFilePayload,\n} from './internal/attachmentPrimitives';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\n\n/**\n * Create/delete mutations over the document catalog's `/EmbeddedFiles`\n * name tree — the doc-level sibling of `AnnotationMutator`, sharing the\n * write path (`writeAttachmentFilePayload`) with the file-attachment\n * annotation writer.\n *\n * Identity is the name-tree KEY (unique by construction), so unlike\n * annotations there is no weak-ref/revision bookkeeping here. Note the\n * tree is key-sorted: both mutations shift OTHER entries' indices; keys\n * never move. Layer persistence (`finishMutation`) and event publication\n * happen in the callers, exactly like every other mutation family.\n */\nexport class AttachmentMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * Create an embedded file. `file.name` becomes the tree key (PDFium\n * writes key = /UF = /F); a duplicate key rejects with `InvalidArg`.\n * The result carries the read-back entry, `checksum`/`size`/dates\n * included.\n */\n create(\n file: WireAttachmentFile,\n resources: WireResourceMap | undefined,\n signal: AbortSignal,\n ): AttachmentCreateResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const resource = resources?.[file.resource];\n if (!resource) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `attachment file references resource '${file.resource}' but no such binary payload accompanied the mutation`,\n );\n }\n if (file.name.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'attachment file requires a name');\n }\n\n // Duplicate keys are an identity violation, not a replace.\n // (FPDFDoc_AddAttachment would also refuse, but a probe first gives\n // the caller a precise error instead of a generic native failure.)\n if (resolveAttachmentIndex(fn, mem, docPtr, { kind: 'key', key: file.name }) !== -1) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `an embedded file with key '${file.name}' already exists — keys are unique; rename and retry`,\n );\n }\n\n throwIfAborted(signal);\n const namePtr = mem.writeU16String(file.name);\n let attachmentPtr: Ptr;\n try {\n attachmentPtr = fn.FPDFDoc_AddAttachment(docPtr, namePtr);\n } finally {\n mem.free(namePtr);\n }\n if (!attachmentPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFDoc_AddAttachment returned NULL');\n }\n\n writeAttachmentFilePayload(fn, mem, attachmentPtr, docPtr, file, resource);\n\n // Read back the materialised entry at its (name-sorted) position.\n const index = resolveAttachmentIndex(fn, mem, docPtr, { kind: 'key', key: file.name });\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'created attachment did not resolve by key after the write',\n );\n }\n return {\n created: { ...readAttachmentFileInfo(fn, mem, attachmentPtr), key: file.name, index },\n // Cloud coherence pins are a server concern; the worker reports none.\n cache: null,\n };\n }\n\n /** Delete an embedded file by key. Unlinks the tree entry only. */\n delete(ref: EmbeddedFileRef, signal: AbortSignal): AttachmentDeleteResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const index = resolveAttachmentIndex(fn, mem, docPtr, ref);\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no embedded file with key '${ref.key}' in the document`,\n );\n }\n if (!fn.FPDFDoc_DeleteAttachment(docPtr, index)) {\n throw new EngineError(EngineErrorCode.Unknown, 'FPDFDoc_DeleteAttachment returned false');\n }\n return { deleted: ref, cache: null };\n }\n}\n","import type { DocumentSecurityProbeInfo } from '@embedpdf/engine-core/runtime';\n\nimport { hasAllStandardSecurityPermissions } from '../../../shared/securityPermissions';\n\nexport type OpenedAs = 'none' | 'user' | 'owner';\n\n/**\n * Single constructor for the \"successfully inspected\" shape of\n * `DocumentSecurityProbeInfo`. Every path that actually resolves a\n * permission word — the cold file probe, the live-session snapshot, and\n * the password-permission check — funnels through here so the encrypted/\n * none distinction, the revision-nulling rule, and the\n * `pdfPermissionsAllAllowed` derivation stay defined in exactly one place.\n *\n * The password-blocked / unsupported / unknown shapes are NOT built here:\n * those carry null permission words and only the cold probe can produce\n * them, so they stay local to `SecurityReader.probeFile`.\n */\nexport function buildSecurityInfo(input: {\n openedAs: OpenedAs;\n permissionsBits: number;\n securityHandlerRevision: number | null;\n probedAt: number;\n}): DocumentSecurityProbeInfo {\n const encrypted = input.openedAs !== 'none';\n return {\n encryptionState: encrypted ? 'encrypted' : 'none',\n encryptionRequiresPassword: false,\n securityHandlerRevision: encrypted ? input.securityHandlerRevision : null,\n pdfPermissionsBits: input.permissionsBits,\n pdfPermissionsAllAllowed: hasAllStandardSecurityPermissions(input.permissionsBits),\n pdfOpenedAs: input.openedAs,\n securityProbedAt: input.probedAt,\n };\n}\n\n/**\n * Mirrors `EPDF_PASSWORD_PERMISSION_*` in public/fpdfview.h:\n * invalid=0, none=1, user=2, owner=3.\n */\nexport function openedAsFromCode(code: number): OpenedAs {\n if (code === 3) return 'owner';\n if (code === 2) return 'user';\n return 'none';\n}\n","import type { DocumentSecurityProbeInfo } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { buildSecurityInfo, openedAsFromCode } from './internal/buildSecurityInfo';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { ensureInitialized } from '../../runtime/lifecycle/bootstrap';\nimport { normalizeU32 } from '../../shared/securityPermissions';\n\nconst FPDF_ERR_PASSWORD = 4;\nconst FPDF_ERR_SECURITY = 5;\n\n/**\n * Reads document security/permission state. Three entry points:\n *\n * - `probeFile` is the only doc-less path: it opens, inspects, and\n * closes its own document straight off a file. It is the intentional\n * exception to the package's `(runtime, session)` reader shape — it\n * answers \"what is this file's security?\" before any session exists.\n * - `readLiveSecurityInfo` / `checkPasswordPermissions` inspect an\n * already-open `DocumentSession`.\n */\nexport class SecurityReader {\n constructor(private readonly runtime: PdfRuntimeModule) {\n // WorkerHost initializes the runtime before dispatching jobs, but\n // this reader is intentionally usable as a one-shot probe too.\n // `ensureInitialized()` is idempotent per runtime instance.\n ensureInitialized(this.runtime);\n }\n\n probeFile(path: string, password: string | null = null): DocumentSecurityProbeInfo {\n const now = Date.now();\n let access: ReturnType<PdfRuntimeModule['fileAccess']['fromNodeFile']> | null = null;\n let docPtr: Ptr | null = null;\n try {\n access = this.runtime.fileAccess.fromNodeFile(path);\n docPtr = this.runtime.fn.FPDF_LoadCustomDocument(access.ptr, password ?? '');\n if (!docPtr) {\n const err = this.runtime.fn.FPDF_GetLastError();\n if (err === FPDF_ERR_PASSWORD) {\n return {\n encryptionState: 'encrypted',\n encryptionRequiresPassword: true,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: now,\n };\n }\n if (err === FPDF_ERR_SECURITY) {\n return {\n encryptionState: 'unsupported',\n encryptionRequiresPassword: null,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: now,\n };\n }\n return unknownSecurity(now);\n }\n\n const encrypted = this.runtime.fn.EPDF_IsEncrypted(docPtr);\n // Cold probe (no password session): `FPDF_GetDocPermissions` reports\n // the document's declared permission word. Contrast with the live\n // session, which reads `FPDF_GetDocUserPermissions` (the effective\n // word after any owner unlock). See `readLiveSecurityInfo`.\n const bits = normalizeU32(this.runtime.fn.FPDF_GetDocPermissions(docPtr));\n const openedAs = !encrypted\n ? 'none'\n : this.runtime.fn.EPDF_IsOwnerUnlocked(docPtr)\n ? 'owner'\n : 'user';\n return buildSecurityInfo({\n openedAs,\n permissionsBits: bits,\n securityHandlerRevision: encrypted\n ? this.runtime.fn.FPDF_GetSecurityHandlerRevision(docPtr)\n : null,\n probedAt: now,\n });\n } finally {\n if (docPtr) this.runtime.fn.FPDF_CloseDocument(docPtr);\n access?.close();\n }\n }\n\n /**\n * Snapshot of the live session's EFFECTIVE security state.\n * `FPDF_GetDocUserPermissions` reports the permission word in force\n * right now (e.g. after an owner unlock), as opposed to the declared\n * word the cold `probeFile` path reads.\n */\n readLiveSecurityInfo(session: DocumentSession): DocumentSecurityProbeInfo {\n const { fn } = this.runtime;\n const docPtr = session.requireDocPtr();\n const encrypted = fn.EPDF_IsEncrypted(docPtr);\n const bits = normalizeU32(fn.FPDF_GetDocUserPermissions(docPtr));\n const openedAs = !encrypted ? 'none' : fn.EPDF_IsOwnerUnlocked(docPtr) ? 'owner' : 'user';\n return buildSecurityInfo({\n openedAs,\n permissionsBits: bits,\n securityHandlerRevision: encrypted ? fn.FPDF_GetSecurityHandlerRevision(docPtr) : null,\n probedAt: Date.now(),\n });\n }\n\n /**\n * Verify a password against the live session and report the resulting\n * effective permissions. Throws `DocPasswordIncorrect` when the\n * password is rejected, or (in `'owner'` mode) when it unlocks only as\n * a user.\n */\n checkPasswordPermissions(\n session: DocumentSession,\n password: string,\n mode: 'any' | 'owner' = 'any',\n ): DocumentSecurityProbeInfo {\n const docPtr = session.requireDocPtr();\n const { mem, fn } = this.runtime;\n const kindPtr = mem.alloc(4);\n const userPermissionsPtr = mem.alloc(4);\n const effectivePermissionsPtr = mem.alloc(4);\n const revisionPtr = mem.alloc(4);\n try {\n mem.poke(kindPtr, 'i32', 0);\n mem.poke(userPermissionsPtr, 'i32', 0);\n mem.poke(effectivePermissionsPtr, 'i32', 0);\n mem.poke(revisionPtr, 'i32', 0);\n const ok = fn.EPDF_CheckPasswordPermissions(\n docPtr,\n password,\n kindPtr,\n userPermissionsPtr,\n effectivePermissionsPtr,\n revisionPtr,\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.DocPasswordIncorrect, 'incorrect document password');\n }\n const openedAs = openedAsFromCode(Number(mem.peek(kindPtr, 'i32')));\n if (mode === 'owner' && openedAs !== 'owner') {\n throw new EngineError(EngineErrorCode.DocPasswordIncorrect, 'owner password required');\n }\n return buildSecurityInfo({\n openedAs,\n permissionsBits: normalizeU32(Number(mem.peek(effectivePermissionsPtr, 'i32'))),\n securityHandlerRevision: Number(mem.peek(revisionPtr, 'i32')),\n probedAt: Date.now(),\n });\n } finally {\n mem.free(revisionPtr);\n mem.free(effectivePermissionsPtr);\n mem.free(userPermissionsPtr);\n mem.free(kindPtr);\n }\n }\n}\n\nfunction unknownSecurity(now: number): DocumentSecurityProbeInfo {\n return {\n encryptionState: 'unknown',\n encryptionRequiresPassword: null,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: now,\n };\n}\n","import { EngineError, EngineErrorCode, type PdfSaveMode } from '@embedpdf/engine-core/runtime';\n\nconst FPDF_INCREMENTAL = 1 << 0;\nconst FPDF_NO_INCREMENTAL = 1 << 1;\n\nexport function pdfSaveModeFlags(mode: PdfSaveMode): number {\n return mode === 'incremental' ? FPDF_INCREMENTAL : FPDF_NO_INCREMENTAL;\n}\n\nexport function layerSaveError(status: number): EngineError {\n if (status === 1) {\n return new EngineError(\n EngineErrorCode.DocOpenFailed,\n 'layer artifact cannot be saved because append-only offsets exceed the supported range',\n );\n }\n return new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save layer artifact');\n}\n","import type { PdfRuntimeMemory, Ptr } from '@embedpdf/engine-runtime';\n\n/**\n * 64-bit out-params as two little-endian 32-bit halves: the wasm memory\n * helpers have no 64-bit accessors (Emscripten's `setValue(i64)` needs\n * WASM_BIGINT), and the native runtime reads the same layout.\n */\nexport function pokeU64(mem: PdfRuntimeMemory, ptr: Ptr, value: number, byteOffset = 0): void {\n const big = BigInt(value);\n mem.poke(ptr, 'i32', Number(big & 0xffffffffn) | 0, byteOffset);\n mem.poke(ptr, 'i32', Number((big >> 32n) & 0xffffffffn) | 0, byteOffset + 4);\n}\n\nexport function peekU64(mem: PdfRuntimeMemory, ptr: Ptr, byteOffset = 0): number {\n const lo = Number(mem.peek(ptr, 'i32', byteOffset)) >>> 0;\n const hi = Number(mem.peek(ptr, 'i32', byteOffset + 4)) >>> 0;\n return hi * 0x100000000 + lo;\n}\n\nexport const U64_BYTES = 8;\n","import type {\n DocMdpPermission,\n FieldLockSpec,\n PdfRevision,\n RevisionField,\n RevisionStructure,\n SignatureCoverage,\n SignatureDTO,\n SignatureSeedValue,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratch, withScratchN } from '../../../runtime/memory/scratch';\nimport { readUtf16String } from '../../../runtime/memory/strings';\nimport { U64_BYTES, peekU64, pokeU64 } from '../../../runtime/memory/u64';\nimport { readFormSnapshot } from '../../forms/internal/readFormSnapshot';\n\n// Mirrors public/epdf_signature.h.\nconst KIND_DOC_TIMESTAMP = 1;\nconst COVERAGE_BY_CODE: Record<number, SignatureCoverage> = {\n 0: 'whole-revision',\n 1: 'partial',\n 2: 'malformed',\n};\nconst STRING_FILTER = 0;\nconst STRING_SUBFILTER = 1;\nconst STRING_NAME = 2;\nconst STRING_REASON = 3;\nconst STRING_LOCATION = 4;\nconst STRING_CONTACT_INFO = 5;\nconst STRING_M = 6;\nconst FIELD_ACTION_BY_CODE: Record<number, FieldLockSpec['action']> = {\n 1: 'all',\n 2: 'include',\n 3: 'exclude',\n};\nconst FIELDS_FIELDMDP = 0;\nconst FIELDS_LOCK = 1;\nconst SV_V = 1 << 2;\nconst SV_LEGAL_ATTESTATION = 1 << 4;\nconst SV_ADD_REV_INFO = 1 << 5;\nconst SV_LOCK_DOCUMENT = 1 << 7;\nconst SV_APPEARANCE_FILTER = 1 << 8;\nconst SV_MDP = 1 << 17;\nconst SV_LIST_SUBFILTER = 0;\nconst SV_LIST_DIGEST_METHOD = 1;\nconst SV_LIST_REASONS = 2;\n/** The PDF 1.7 seed-value entry set this engine implements. */\nconst SUPPORTED_SEED_VALUE_VERSION = 2;\nconst SV_UNSUPPORTED_REQUIRED =\n SV_LEGAL_ATTESTATION | SV_ADD_REV_INFO | SV_LOCK_DOCUMENT | SV_APPEARANCE_FILTER;\n\nfunction readWide(\n runtime: PdfRuntimeModule,\n call: (buf: Ptr, capacity: number) => number,\n): string | null {\n return readUtf16String(runtime.mem, call, '');\n}\n\nfunction isPermission(value: number): value is DocMdpPermission {\n return value === 1 || value === 2 || value === 3;\n}\n\nexport function readByteRange(\n runtime: PdfRuntimeModule,\n model: Ptr,\n index: number,\n): [number, number, number, number] | null {\n const { fn, mem } = runtime;\n return withScratch(mem, 4 * U64_BYTES, (ptr) => {\n for (let k = 0; k < 4; k++) pokeU64(mem, ptr, 0, k * U64_BYTES);\n if (!fn.EPDFSig_GetByteRange(model, index, ptr)) return null;\n return [\n peekU64(mem, ptr, 0),\n peekU64(mem, ptr, U64_BYTES),\n peekU64(mem, ptr, 2 * U64_BYTES),\n peekU64(mem, ptr, 3 * U64_BYTES),\n ];\n });\n}\n\nfunction readLock(\n runtime: PdfRuntimeModule,\n model: Ptr,\n index: number,\n which: number,\n): FieldLockSpec | null {\n const { fn } = runtime;\n const code =\n which === FIELDS_LOCK\n ? fn.EPDFSig_GetLockAction(model, index)\n : fn.EPDFSig_GetFieldMDPAction(model, index);\n const action = FIELD_ACTION_BY_CODE[code];\n if (!action) return null;\n const fields: string[] = [];\n const count = fn.EPDFSig_GetFieldNameCount(model, index, which);\n for (let n = 0; n < count; n++) {\n fields.push(\n readWide(runtime, (buf, cap) =>\n fn.EPDFSig_GetFieldNameAt(model, index, which, n, buf, cap),\n ) ?? '',\n );\n }\n const spec: FieldLockSpec = { action, fields };\n if (which === FIELDS_LOCK) {\n const permission = fn.EPDFSig_GetLockPermission(model, index);\n if (isPermission(permission)) spec.permission = permission;\n }\n return spec;\n}\n\nfunction readSeedValue(\n runtime: PdfRuntimeModule,\n model: Ptr,\n index: number,\n): SignatureSeedValue | null {\n const { fn } = runtime;\n if (!fn.EPDFSig_HasSeedValue(model, index)) return null;\n const requiredFlags = fn.EPDFSig_GetSeedValueRequiredFlags(model, index) >>> 0;\n const presentFlags = fn.EPDFSig_GetSeedValuePresentFlags(model, index) >>> 0;\n const version = fn.EPDFSig_GetSeedValueVersion(model, index);\n const mdp = fn.EPDFSig_GetSeedValueMDP(model, index);\n const list = (which: number): string[] => {\n const count = fn.EPDFSig_GetSeedValueListCount(model, index, which);\n const items: string[] = [];\n for (let n = 0; n < count; n++) {\n items.push(\n readWide(runtime, (buf, cap) =>\n fn.EPDFSig_GetSeedValueListAt(model, index, which, n, buf, cap),\n ) ?? '',\n );\n }\n return items;\n };\n return {\n requiredFlags,\n presentFlags,\n version: version > 0 ? version : null,\n mdp: (presentFlags & SV_MDP) !== 0 && mdp >= 0 && mdp <= 3 ? (mdp as 0 | 1 | 2 | 3) : null,\n filter: readWide(runtime, (buf, cap) => fn.EPDFSig_GetSeedValueFilter(model, index, buf, cap)),\n subFilters: list(SV_LIST_SUBFILTER),\n digestMethods: list(SV_LIST_DIGEST_METHOD),\n reasons: list(SV_LIST_REASONS),\n unsupportedRequired:\n (requiredFlags & SV_UNSUPPORTED_REQUIRED) !== 0 ||\n ((requiredFlags & SV_V) !== 0 && version > SUPPORTED_SEED_VALUE_VERSION),\n };\n}\n\n/** Every signature field of a native signature model, in model order. */\nexport function readSignaturesFromModel(runtime: PdfRuntimeModule, model: Ptr): SignatureDTO[] {\n const { fn } = runtime;\n const count = fn.EPDFSig_Count(model);\n const out: SignatureDTO[] = [];\n const str = (i: number, key: number) =>\n readWide(runtime, (buf, cap) => fn.EPDFSig_GetString(model, i, key, buf, cap));\n for (let i = 0; i < count; i++) {\n const signed = fn.EPDFSig_IsSigned(model, i);\n const widgetObjNum = fn.EPDFSig_GetWidgetObjNum(model, i);\n const revisionIndex = fn.EPDFSig_GetRevisionIndex(model, i);\n const docMdp = fn.EPDFSig_GetDocMDPPermission(model, i);\n out.push({\n index: i,\n field: { kind: 'objectNumber', fieldObjectNumber: fn.EPDFSig_GetFieldObjNum(model, i) },\n fieldName: readWide(runtime, (buf, cap) => fn.EPDFSig_GetFieldName(model, i, buf, cap)) ?? '',\n widget:\n widgetObjNum > 0\n ? {\n annotObjectNumber: widgetObjNum,\n pageObjectNumber: fn.EPDFSig_GetWidgetPageObjNum(model, i),\n }\n : null,\n signed,\n kind: fn.EPDFSig_GetKind(model, i) === KIND_DOC_TIMESTAMP ? 'timestamp' : 'signature',\n filter: str(i, STRING_FILTER),\n subFilter: str(i, STRING_SUBFILTER),\n byteRange: signed ? readByteRange(runtime, model, i) : null,\n contentsSize: signed ? Math.max(0, fn.EPDFSig_GetContents(model, i, NULL_PTR, 0)) : 0,\n coverage: signed ? (COVERAGE_BY_CODE[fn.EPDFSig_GetCoverage(model, i)] ?? 'malformed') : null,\n revisionIndex: signed && revisionIndex >= 0 ? revisionIndex : null,\n signer: {\n name: str(i, STRING_NAME),\n reason: str(i, STRING_REASON),\n location: str(i, STRING_LOCATION),\n contactInfo: str(i, STRING_CONTACT_INFO),\n claimedTime: str(i, STRING_M),\n },\n docMdp: isPermission(docMdp) ? docMdp : null,\n catalogCertification: fn.EPDFSig_IsCatalogCertification(model, i),\n fieldMdp: readLock(runtime, model, i, FIELDS_FIELDMDP),\n lock: readLock(runtime, model, i, FIELDS_LOCK),\n seedValue: readSeedValue(runtime, model, i),\n });\n }\n return out;\n}\n\n/** The DER `/Contents` of signature `index`, copied out; `NotFound` when unsigned or malformed. */\nexport function readContentsAt(runtime: PdfRuntimeModule, model: Ptr, index: number): Uint8Array {\n const { fn, mem } = runtime;\n const length = fn.EPDFSig_GetContents(model, index, NULL_PTR, 0);\n if (length <= 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n 'signature has no usable /Contents (malformed encoding)',\n );\n }\n return withScratch(mem, length, (buf) => {\n const written = fn.EPDFSig_GetContents(model, index, buf, length);\n if (written !== length) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to read signature contents');\n }\n const out = new Uint8Array(length);\n out.set(mem.readBytes(buf, length));\n return out;\n });\n}\n\n/** The chained revisions of a document, oldest first; empty when the chain is not valid. */\nexport function readRevisions(\n runtime: PdfRuntimeModule,\n docPtr: Ptr,\n signatures: ReadonlyArray<SignatureDTO>,\n): PdfRevision[] {\n const { fn, mem } = runtime;\n const count = fn.EPDFDoc_GetRevisionCount(docPtr);\n const revisions: PdfRevision[] = [];\n if (count <= 0) return revisions;\n withScratchN(mem, [U64_BYTES, U64_BYTES], ([endPtr, xrefPtr]) => {\n for (let i = 0; i < count; i++) {\n pokeU64(mem, endPtr, 0);\n pokeU64(mem, xrefPtr, 0);\n if (!fn.EPDFDoc_GetRevision(docPtr, i, endPtr, xrefPtr)) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to read revision ${i}`);\n }\n const sealedBy = signatures.find((s) => s.revisionIndex === i);\n revisions.push({\n index: i,\n end: peekU64(mem, endPtr),\n xrefOffset: peekU64(mem, xrefPtr),\n signatureIndex: sealedBy ? sealedBy.index : null,\n });\n }\n });\n return revisions;\n}\n\n/** Whether any signature field of the document carries a signed value (fields alone do not count). */\nexport function hasSignedSignature(runtime: PdfRuntimeModule, docPtr: Ptr): boolean {\n const { fn } = runtime;\n return withSignatureModel(runtime, docPtr, (model) => {\n const count = fn.EPDFSig_Count(model);\n for (let i = 0; i < count; i++) if (fn.EPDFSig_IsSigned(model, i)) return true;\n return false;\n });\n}\n\n/** Run `body` with a fresh signature model of `docPtr`, closing it afterwards. */\nexport function withSignatureModel<T>(\n runtime: PdfRuntimeModule,\n docPtr: Ptr,\n body: (model: Ptr) => T,\n): T {\n const model = runtime.fn.EPDFSig_LoadModel(docPtr);\n if (model === NULL_PTR) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to build signature model');\n }\n try {\n return body(model);\n } finally {\n runtime.fn.EPDFSig_CloseModel(model);\n }\n}\n\n/**\n * The structure of one document (a revision prefix, usually): catalog,\n * AcroForm and page-tree object numbers, the pages, the terminal fields\n * with their widgets, and the signatures. What the rule engine needs to\n * give every changed object a role.\n */\nexport function readStructure(runtime: PdfRuntimeModule, docPtr: Ptr): RevisionStructure {\n const { fn, mem } = runtime;\n const [root, acroForm, pagesRoot] = withScratchN(mem, [4, 4, 4], ([r, a, p]) => {\n mem.poke(r, 'i32', 0);\n mem.poke(a, 'i32', 0);\n mem.poke(p, 'i32', 0);\n fn.EPDFDoc_GetStructureObjectNumbers(docPtr, r, a, p);\n return [\n Number(mem.peek(r, 'i32')) >>> 0,\n Number(mem.peek(a, 'i32')) >>> 0,\n Number(mem.peek(p, 'i32')) >>> 0,\n ];\n });\n const pages: number[] = [];\n const pageCount = fn.FPDF_GetPageCount(docPtr);\n for (let i = 0; i < pageCount; i++) pages.push(fn.EPDFDoc_GetPageObjectNumberByIndex(docPtr, i));\n\n const fields: RevisionField[] = [];\n const formModel = fn.EPDFForm_LoadModel(docPtr);\n if (formModel !== NULL_PTR) {\n try {\n const snapshot = readFormSnapshot(runtime, formModel, docPtr);\n for (const f of snapshot.fields) {\n fields.push({\n objectNumber: f.fieldObjectNumber,\n name: f.name,\n family: f.family,\n widgets: f.widgets.map((w) => w.annotObjectNumber),\n flags: f.flags.raw,\n });\n }\n } finally {\n fn.EPDFForm_CloseModel(formModel);\n }\n }\n const signatures = withSignatureModel(runtime, docPtr, (model) =>\n readSignaturesFromModel(runtime, model),\n );\n return { root, acroForm, pagesRoot, pages, fields, signatures };\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../document-session/DocumentSession';\n\ninterface SignatureModelEntry {\n seq: number;\n ptr: Ptr;\n}\n\n/**\n * Per-session cache of the native `EPDFSig_LoadModel` snapshot, keyed on\n * the session's mutation sequence exactly like the form model: the model\n * walks the revision chain, the field tree and every widget, so it is\n * built once per document state and rebuilt after any mutation.\n */\nconst cache = new WeakMap<DocumentSession, SignatureModelEntry>();\n\nexport function acquireSignatureModel(runtime: PdfRuntimeModule, session: DocumentSession): Ptr {\n const seq = session.mutationSeq();\n const hit = cache.get(session);\n if (hit && hit.seq === seq) {\n return hit.ptr;\n }\n if (hit) {\n runtime.fn.EPDFSig_CloseModel(hit.ptr);\n cache.delete(session);\n }\n const ptr = runtime.fn.EPDFSig_LoadModel(session.requireDocPtr());\n if (ptr === NULL_PTR) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to build signature model');\n }\n cache.set(session, { seq, ptr });\n return ptr;\n}\n\nexport function disposeSignatureModel(runtime: PdfRuntimeModule, session: DocumentSession): void {\n const hit = cache.get(session);\n if (!hit) {\n return;\n }\n runtime.fn.EPDFSig_CloseModel(hit.ptr);\n cache.delete(session);\n}\n","import type {\n BaseVersionInfo,\n DigestAlgorithm,\n DocumentProtection,\n FormFieldRef,\n SignatureDTO,\n SignatureSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, deriveProtection } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n readByteRange,\n readRevisions,\n readSignaturesFromModel,\n readContentsAt,\n} from './internal/readSignatureModel';\nimport { acquireSignatureModel } from './internal/signatureModelCache';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratch, withScratchN } from '../../runtime/memory/scratch';\nimport { readUtf16String } from '../../runtime/memory/strings';\nimport { U64_BYTES, pokeU64 } from '../../runtime/memory/u64';\n\nexport const DIGEST_CODE: Record<DigestAlgorithm, number> = {\n sha1: 0,\n sha256: 1,\n sha384: 2,\n sha512: 3,\n};\nconst DIGEST_LENGTH: Record<DigestAlgorithm, number> = {\n sha1: 20,\n sha256: 32,\n sha384: 48,\n sha512: 64,\n};\n\n/**\n * Reads the signature model of a session: revisions, every signature\n * field with its signed state, and the protection those signatures\n * impose. Byte facts (revisions, coverage, digests, loaded bytes) come\n * from the bytes the document was loaded from — for a layer session the\n * base plus the delta it was opened with — never from unsaved edits.\n */\nexport class SignatureReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n readSnapshot(): SignatureSnapshot {\n const model = acquireSignatureModel(this.runtime, this.session);\n const chainValid = this.runtime.fn.EPDFSig_IsRevisionChainValid(model);\n const signatures = readSignaturesFromModel(this.runtime, model);\n const revisions = chainValid\n ? readRevisions(this.runtime, this.session.requireDocPtr(), signatures)\n : [];\n return { chainValid, revisions, signatures, protection: deriveProtection(signatures) };\n }\n\n /** The protection alone, for the open probe and the form write guard. */\n readProtection(): DocumentProtection {\n const model = acquireSignatureModel(this.runtime, this.session);\n return deriveProtection(readSignaturesFromModel(this.runtime, model));\n }\n\n /** The DER `/Contents` of a signed field, padding stripped. */\n readContents(ref: FormFieldRef): ArrayBuffer {\n const model = acquireSignatureModel(this.runtime, this.session);\n const index = this.requireSignedIndex(model, ref);\n return readContentsAt(this.runtime, model, index).buffer as ArrayBuffer;\n }\n\n /** Hash a signed field's `/ByteRange` straight from the loaded bytes. */\n digest(ref: FormFieldRef, algorithm: DigestAlgorithm): ArrayBuffer {\n const model = acquireSignatureModel(this.runtime, this.session);\n const index = this.requireSignedIndex(model, ref);\n const range = readByteRange(this.runtime, model, index);\n if (!range) {\n throw new EngineError(EngineErrorCode.NotFound, 'signature has no usable /ByteRange');\n }\n return this.digestRange(range, algorithm);\n }\n\n /** The exact bytes of one revision. */\n revisionBytes(revisionIndex: number): ArrayBuffer {\n const snapshot = this.readSnapshot();\n if (!snapshot.chainValid) {\n throw new EngineError(EngineErrorCode.MalformedPdf, 'revision chain is not valid');\n }\n const revision = snapshot.revisions[revisionIndex];\n if (!revision) {\n throw new EngineError(EngineErrorCode.NotFound, `no revision ${revisionIndex}`);\n }\n return this.readLoadedBytes(0, revision.end);\n }\n\n /** Resolve a signature-field ref to its identity in the current model. */\n resolveField(ref: FormFieldRef): {\n index: number;\n fieldObjectNumber: number;\n signed: boolean;\n widget: { annotObjectNumber: number; pageObjectNumber: number } | null;\n } {\n const { fn } = this.runtime;\n const model = acquireSignatureModel(this.runtime, this.session);\n const index = this.indexOf(model, ref);\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n ref.kind === 'objectNumber'\n ? `signature field not found: object ${ref.fieldObjectNumber}`\n : `signature field not found: \"${ref.name}\"`,\n );\n }\n const widgetObjNum = fn.EPDFSig_GetWidgetObjNum(model, index);\n return {\n index,\n fieldObjectNumber: fn.EPDFSig_GetFieldObjNum(model, index),\n signed: fn.EPDFSig_IsSigned(model, index),\n widget:\n widgetObjNum > 0\n ? {\n annotObjectNumber: widgetObjNum,\n pageObjectNumber: fn.EPDFSig_GetWidgetPageObjNum(model, index),\n }\n : null,\n };\n }\n\n /** One signature by field object number, from the current model. */\n readSignatureByObjectNumber(fieldObjectNumber: number): SignatureDTO {\n const snapshot = this.readSnapshot();\n const found = snapshot.signatures.find(\n (s) => s.field.kind === 'objectNumber' && s.field.fieldObjectNumber === fieldObjectNumber,\n );\n if (!found) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `signature field not found: object ${fieldObjectNumber}`,\n );\n }\n return found;\n }\n\n /** The complete loaded bytes (a plain file, or a layer's base + delta). */\n loadedBytes(): ArrayBuffer {\n const size = Number(this.runtime.fn.EPDFDoc_GetLoadedBytesSize(this.session.requireDocPtr()));\n return this.readLoadedBytes(0, size);\n }\n\n /**\n * SHA-256 and length of the base the session is on. A layer session\n * reports its base's hash (supplied by the host or computed once by the\n * runtime); a plain session hashes its loaded bytes once per load.\n */\n version(): BaseVersionInfo {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const byteLength = Number(fn.EPDFDoc_GetBaseBytesSize(docPtr));\n if (byteLength <= 0) {\n throw new EngineError(EngineErrorCode.DocNotOpen, 'document has no loaded bytes');\n }\n if (this.session.kind === 'layer') {\n const sha256 = withScratch(mem, 32, (out) => {\n if (!fn.EPDFLayer_GetBaseSha256(docPtr, out)) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to read the base hash');\n }\n return toHex(mem.readBytes(out, 32));\n });\n return { sha256, byteLength };\n }\n const cached = this.session.cachedPlainSha256();\n if (cached) return { sha256: cached, byteLength };\n const digest = new Uint8Array(this.digestRange([0, byteLength, byteLength, 0], 'sha256'));\n const sha256 = toHex(digest);\n this.session.rememberPlainSha256(sha256);\n return { sha256, byteLength };\n }\n\n // -------------------------------------------------------------------------\n\n private digestRange(\n range: [number, number, number, number],\n algorithm: DigestAlgorithm,\n ): ArrayBuffer {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const outLength = DIGEST_LENGTH[algorithm];\n return withScratchN(\n mem,\n [4 * U64_BYTES, outLength, U64_BYTES],\n ([rangePtr, outPtr, lenPtr]) => {\n for (let k = 0; k < 4; k++) pokeU64(mem, rangePtr, range[k], k * U64_BYTES);\n // `unsigned long*`: 4 bytes on wasm32, 8 on native — write the whole\n // 8-byte slot so either width reads the capacity.\n pokeU64(mem, lenPtr, outLength);\n const ok = fn.EPDFSig_DigestByteRange(\n docPtr,\n rangePtr,\n DIGEST_CODE[algorithm],\n outPtr,\n lenPtr,\n );\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'byte range is not within the loaded bytes',\n );\n }\n const written = Number(mem.peek(lenPtr, 'i32'));\n return copyOut(mem.readBytes(outPtr, written));\n },\n );\n }\n\n /** `[offset, offset + length)` of the loaded bytes (base + loaded delta for a layer), copied out. */\n readLoadedBytes(offset: number, length: number): ArrayBuffer {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n if (length === 0) return new ArrayBuffer(0);\n return withScratch(mem, length, (ptr) => {\n const read = fn.EPDFDoc_ReadLoadedBytes(docPtr, BigInt(offset), ptr, length);\n if (read !== length) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to read the loaded bytes');\n }\n return copyOut(mem.readBytes(ptr, length));\n });\n }\n\n private indexOf(model: Ptr, ref: FormFieldRef): number {\n const { fn } = this.runtime;\n if (ref.kind === 'objectNumber') {\n return fn.EPDFSig_GetIndexByFieldObjNum(model, ref.fieldObjectNumber);\n }\n const count = fn.EPDFSig_Count(model);\n for (let i = 0; i < count; i++) {\n const name = this.readWide((buf, cap) => fn.EPDFSig_GetFieldName(model, i, buf, cap));\n if (name === ref.name) return i;\n }\n return -1;\n }\n\n private requireSignedIndex(model: Ptr, ref: FormFieldRef): number {\n const { fn } = this.runtime;\n const index = this.indexOf(model, ref);\n if (index < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n ref.kind === 'objectNumber'\n ? `signature field not found: object ${ref.fieldObjectNumber}`\n : `signature field not found: \"${ref.name}\"`,\n );\n }\n if (!fn.EPDFSig_IsSigned(model, index)) {\n throw new EngineError(EngineErrorCode.NotFound, 'signature field is not signed');\n }\n return index;\n }\n\n private readString(model: Ptr, index: number, key: number): string | null {\n return this.readWide((buf, cap) =>\n this.runtime.fn.EPDFSig_GetString(model, index, key, buf, cap),\n );\n }\n\n private readWide(call: (buf: Ptr, capacity: number) => number): string | null {\n return readUtf16String(this.runtime.mem, call, '');\n }\n}\n\nfunction copyOut(view: Uint8Array): ArrayBuffer {\n const buffer = new ArrayBuffer(view.byteLength);\n new Uint8Array(buffer).set(view);\n return buffer;\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (const b of bytes) out += b.toString(16).padStart(2, '0');\n return out;\n}\n","import { EngineError, EngineErrorCode, type PdfSaveMode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { layerSaveError, pdfSaveModeFlags } from './internal/pdfSaveMode';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { SignatureReader } from '../signature/SignatureReader';\n\n/** Whose bytes a snapshot holds: the loaded file, or the file a save would write. */\nexport type SaveSource = 'loaded' | 'working-copy';\n\n/** The fork's `EPDFSaveStatus`. */\nconst EPDF_SAVE_WRITTEN = 1;\nconst EPDF_SAVE_UNCHANGED_SINCE_LOAD = 2;\n\n/**\n * Owns every \"serialize the open document\" path for a `DocumentSession`.\n * Two distinct outputs:\n *\n * - Layer artifacts (`saveLayerArtifact*`) are the storage-optimized\n * `.layer` delta used by server-side persistence. Only valid for a\n * `layer` session.\n * - Standalone saves (`saveStandalone*`) export a self-contained PDF\n * view (base + applied delta) via `FPDF_SaveAsCopy` /\n * `EPDF_SaveDocumentToOwnedBuffer`, valid for any session kind.\n *\n * Lives in `engine-services` so the browser Worker and the Node\n * `worker_thread` server share the exact same save code path.\n */\nexport class DocumentSaver {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * The bytes a save would produce, and whether they are the loaded bytes.\n * Three answers, cheapest first: nothing was mutated since load (the\n * session's counter); something was mutated but the document is still\n * the one it was opened with — the fork's save pass found no reachable\n * object that differs from its loaded version, an annotation added and\n * removed again being the common case; or a real delta. The one pass\n * answers the second and produces the third, comparing only the objects\n * that were touched. A signed file must come back exactly as sealed, so\n * the loaded bytes are returned verbatim in the first two cases.\n */\n snapshot(): { bytes: ArrayBuffer; source: SaveSource } {\n if (!this.session.hasUnsavedEdits()) {\n return { bytes: this.loadedBytes(), source: 'loaded' };\n }\n const saved = this.saveStandaloneToBufferEx('incremental');\n if (saved.unchangedSinceLoad) {\n return { bytes: this.loadedBytes(), source: 'loaded' };\n }\n return { bytes: saved.bytes, source: 'working-copy' };\n }\n\n /** The complete loaded bytes: a plain file, or a layer's base plus the delta it was opened with. */\n loadedBytes(): ArrayBuffer {\n return new SignatureReader(this.runtime, this.session).loadedBytes();\n }\n\n /**\n * The loaded bytes streamed to `path` in chunks: a plain file, or a\n * layer's base plus the delta it was opened with, never the base alone.\n * Native only. Replaces whatever `path` held.\n */\n copyLoadedBytesToFile(path: string): void {\n const reader = new SignatureReader(this.runtime, this.session);\n const size = Number(this.runtime.fn.EPDFDoc_GetLoadedBytesSize(this.session.requireDocPtr()));\n const chunk = 4 * 1024 * 1024;\n this.runtime.fileWrite.removeFile(path);\n for (let offset = 0; offset < size; offset += chunk) {\n const length = Math.min(chunk, size - offset);\n this.runtime.fileWrite.appendBytes(path, new Uint8Array(reader.readLoadedBytes(offset, length)));\n }\n if (size === 0) this.runtime.fileWrite.appendBytes(path, new Uint8Array(0));\n }\n\n /**\n * `snapshot()` onto a file: `path` ends up holding the document a save\n * would write — the loaded bytes when nothing changed, else the standalone\n * save — without the document ever being an in-memory buffer. Native only.\n */\n snapshotToFile(path: string): { path: string; source: SaveSource } {\n if (!this.session.hasUnsavedEdits()) {\n this.copyLoadedBytesToFile(path);\n return { path, source: 'loaded' };\n }\n const saved = this.saveStandaloneToFileEx(path, 'incremental');\n if (saved.unchangedSinceLoad) {\n this.copyLoadedBytesToFile(path);\n return { path, source: 'loaded' };\n }\n return { path, source: 'working-copy' };\n }\n\n /** Whether this runtime and session can put scratch output beside the base file. */\n canWriteScratchFiles(): boolean {\n return this.runtime.kind === 'native' && this.session.source.base?.kind === 'file';\n }\n\n saveLayerArtifact(): { bytes: ArrayBuffer; size: number } {\n const saved = this.saveLayerArtifactImpl(/*reporting=*/ false);\n if (saved.size <= 0) {\n throw layerSaveError(-1);\n }\n return { bytes: saved.bytes, size: saved.size };\n }\n\n /**\n * `saveLayerArtifact` that says whether anything reachable changed since\n * the layer was opened. When nothing did, `bytes` is empty and the\n * artifact the session was opened with stands. The artifact written\n * otherwise is cumulative against the base (empty delta when the layer\n * came to equal its base).\n */\n saveLayerArtifactEx(): { bytes: ArrayBuffer; size: number; changedSinceLoad: boolean } {\n return this.saveLayerArtifactImpl(/*reporting=*/ true);\n }\n\n /**\n * `saveLayerArtifactEx` onto a file: nothing reaches `path` when nothing\n * changed since load. The delta inside is streamed, never held whole.\n * Native only.\n */\n saveLayerArtifactToFileEx(path: string): { path: string; changedSinceLoad: boolean } {\n this.requireLayer();\n return this.saveLayerToFileImpl(path, 'artifact');\n }\n\n /** `saveLayerDeltaEx` onto a file: the cumulative delta, or nothing when nothing changed since load. Native only. */\n saveLayerDeltaToFileEx(path: string): { path: string; changedSinceLoad: boolean } {\n this.requireLayer();\n return this.saveLayerToFileImpl(path, 'delta');\n }\n\n private saveLayerToFileImpl(\n path: string,\n what: 'artifact' | 'delta',\n ): { path: string; changedSinceLoad: boolean } {\n const { mem, fn } = this.runtime;\n const statusPtr = mem.alloc(4);\n const changedPtr = mem.alloc(4);\n this.runtime.fileWrite.removeFile(path);\n const writer = this.runtime.fileWrite.toNodeFile(path);\n try {\n mem.poke(statusPtr, 'i32', -1);\n mem.poke(changedPtr, 'i32', 1);\n const ok =\n what === 'artifact'\n ? fn.EPDFLayer_SaveLayerArtifactEx(this.session.requireDocPtr(), writer.ptr, statusPtr, changedPtr)\n : fn.EPDFLayer_SaveDeltaEx(this.session.requireDocPtr(), writer.ptr, statusPtr, changedPtr);\n const status = Number(mem.peek(statusPtr, 'i32'));\n if (!ok || status !== 0) {\n throw layerSaveError(status);\n }\n return { path, changedSinceLoad: Number(mem.peek(changedPtr, 'i32')) !== 0 };\n } finally {\n writer.close();\n mem.free(changedPtr);\n mem.free(statusPtr);\n }\n }\n\n private saveLayerArtifactImpl(reporting: boolean): {\n bytes: ArrayBuffer;\n size: number;\n changedSinceLoad: boolean;\n } {\n this.requireLayer();\n\n const { mem, fn } = this.runtime;\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n const changedPtr = mem.alloc(4);\n let artifactPtr: Ptr | null = null;\n try {\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', -1);\n mem.poke(changedPtr, 'i32', 1);\n artifactPtr = reporting\n ? fn.EPDFLayer_SaveLayerArtifactToOwnedBufferEx(\n this.session.requireDocPtr(),\n sizePtr,\n statusPtr,\n changedPtr,\n )\n : fn.EPDFLayer_SaveLayerArtifactToOwnedBuffer(\n this.session.requireDocPtr(),\n sizePtr,\n statusPtr,\n );\n const status = Number(mem.peek(statusPtr, 'i32'));\n const size = Number(mem.peek(sizePtr, 'i32'));\n const changedSinceLoad = reporting ? Number(mem.peek(changedPtr, 'i32')) !== 0 : true;\n if (status !== 0) {\n throw layerSaveError(status);\n }\n if (reporting && !changedSinceLoad) {\n return { bytes: new ArrayBuffer(0), size: 0, changedSinceLoad: false };\n }\n if (!artifactPtr || size <= 0) {\n throw layerSaveError(status);\n }\n\n const bytes = mem.readBytes(artifactPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size, changedSinceLoad };\n } finally {\n if (artifactPtr) fn.EPDF_FreeBuffer(artifactPtr);\n mem.free(changedPtr);\n mem.free(statusPtr);\n mem.free(sizePtr);\n }\n }\n\n /**\n * The raw cumulative delta a layer save writes (every promoted object,\n * offsets notional from the base's append offset), without the artifact\n * header: what `EPDFDoc_OpenBaseOverlay` composes with the base. Empty\n * when nothing was promoted.\n */\n saveLayerDelta(): { bytes: ArrayBuffer; size: number } {\n const saved = this.saveLayerDeltaImpl(/*reporting=*/ false);\n return { bytes: saved.bytes, size: saved.size };\n }\n\n /**\n * `saveLayerDelta` that says whether anything reachable changed since the\n * layer was opened; empty bytes when nothing did (keep what you have), or\n * when the layer came to equal its base (then `changedSinceLoad` is true\n * and the document IS the base).\n */\n saveLayerDeltaEx(): { bytes: ArrayBuffer; size: number; changedSinceLoad: boolean } {\n return this.saveLayerDeltaImpl(/*reporting=*/ true);\n }\n\n private saveLayerDeltaImpl(reporting: boolean): {\n bytes: ArrayBuffer;\n size: number;\n changedSinceLoad: boolean;\n } {\n this.requireLayer();\n\n const { mem, fn } = this.runtime;\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n const changedPtr = mem.alloc(4);\n let deltaPtr: Ptr | null = null;\n try {\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', -1);\n mem.poke(changedPtr, 'i32', 1);\n deltaPtr = reporting\n ? fn.EPDFLayer_SaveDeltaToOwnedBufferEx(\n this.session.requireDocPtr(),\n sizePtr,\n statusPtr,\n changedPtr,\n )\n : fn.EPDFLayer_SaveDeltaToOwnedBuffer(this.session.requireDocPtr(), sizePtr, statusPtr);\n const status = Number(mem.peek(statusPtr, 'i32'));\n const size = Number(mem.peek(sizePtr, 'i32'));\n const changedSinceLoad = reporting ? Number(mem.peek(changedPtr, 'i32')) !== 0 : true;\n if (status !== 0) {\n throw layerSaveError(status);\n }\n if (!deltaPtr || size <= 0) {\n return { bytes: new ArrayBuffer(0), size: 0, changedSinceLoad };\n }\n const bytes = mem.readBytes(deltaPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size, changedSinceLoad };\n } finally {\n if (deltaPtr) fn.EPDF_FreeBuffer(deltaPtr);\n mem.free(changedPtr);\n mem.free(statusPtr);\n mem.free(sizePtr);\n }\n }\n\n saveLayerArtifactToFile(path: string): { path: string } {\n this.requireLayer();\n\n const { mem, fn } = this.runtime;\n const statusPtr = mem.alloc(4);\n const writer = this.runtime.fileWrite.toNodeFile(path);\n try {\n mem.poke(statusPtr, 'i32', -1);\n const ok = fn.EPDFLayer_SaveLayerArtifact(\n this.session.requireDocPtr(),\n writer.ptr,\n statusPtr,\n );\n const status = Number(mem.peek(statusPtr, 'i32'));\n if (!ok || status !== 0) {\n throw layerSaveError(status);\n }\n return { path };\n } finally {\n writer.close();\n mem.free(statusPtr);\n }\n }\n\n saveStandaloneToBuffer(mode: PdfSaveMode): { bytes: ArrayBuffer; size: number } {\n const { mem, fn } = this.runtime;\n const sizePtr = mem.alloc(4);\n let pdfPtr: Ptr | null = null;\n try {\n mem.poke(sizePtr, 'i32', 0);\n // Standalone saves are not layer artifacts. For a CPDF_LayerDocument,\n // FPDF_INCREMENTAL copies the base bytes through and appends the layer\n // delta as a normal PDF revision. The EPDFLayer_* artifact APIs are only\n // for internal server storage.\n pdfPtr = fn.EPDF_SaveDocumentToOwnedBuffer(\n this.session.requireDocPtr(),\n pdfSaveModeFlags(mode),\n sizePtr,\n );\n const size = Number(mem.peek(sizePtr, 'i32'));\n if (!pdfPtr || size <= 0) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save document');\n }\n\n const bytes = mem.readBytes(pdfPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size };\n } finally {\n if (pdfPtr) fn.EPDF_FreeBuffer(pdfPtr);\n mem.free(sizePtr);\n }\n }\n\n /**\n * `saveStandaloneToBuffer` that says whether the save wrote anything. An\n * incremental save of a layer never rewrites an object equal to its base\n * twin, and when no reachable object differs from the document the layer\n * was opened with it writes nothing at all: `unchangedSinceLoad`, empty\n * bytes — the loaded bytes are the document.\n */\n saveStandaloneToBufferEx(mode: PdfSaveMode): {\n bytes: ArrayBuffer;\n size: number;\n unchangedSinceLoad: boolean;\n } {\n const { mem, fn } = this.runtime;\n const sizePtr = mem.alloc(4);\n const statusPtr = mem.alloc(4);\n let pdfPtr: Ptr | null = null;\n try {\n mem.poke(sizePtr, 'i32', 0);\n mem.poke(statusPtr, 'i32', 0);\n pdfPtr = fn.EPDF_SaveDocumentToOwnedBufferEx(\n this.session.requireDocPtr(),\n pdfSaveModeFlags(mode),\n 0,\n sizePtr,\n statusPtr,\n );\n const status = Number(mem.peek(statusPtr, 'i32'));\n if (status === EPDF_SAVE_UNCHANGED_SINCE_LOAD) {\n return { bytes: new ArrayBuffer(0), size: 0, unchangedSinceLoad: true };\n }\n const size = Number(mem.peek(sizePtr, 'i32'));\n if (!pdfPtr || size <= 0 || status !== EPDF_SAVE_WRITTEN) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save document');\n }\n const bytes = mem.readBytes(pdfPtr, size);\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n return { bytes: buffer, size, unchangedSinceLoad: false };\n } finally {\n if (pdfPtr) fn.EPDF_FreeBuffer(pdfPtr);\n mem.free(statusPtr);\n mem.free(sizePtr);\n }\n }\n\n saveStandaloneToFile(path: string, mode: PdfSaveMode): { path: string } {\n const writer = this.runtime.fileWrite.toNodeFile(path);\n try {\n // See saveStandaloneToBuffer(): this exports a standalone PDF view,\n // not the storage-optimized `.layer` artifact.\n const ok = this.runtime.fn.FPDF_SaveAsCopy(\n this.session.requireDocPtr(),\n writer.ptr,\n pdfSaveModeFlags(mode),\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save document');\n }\n return { path };\n } finally {\n writer.close();\n }\n }\n\n /**\n * `saveStandaloneToFile` with the report of `saveStandaloneToBufferEx`.\n * On `unchangedSinceLoad` no byte reached the file: the caller streams\n * the loaded bytes instead.\n */\n saveStandaloneToFileEx(path: string, mode: PdfSaveMode): { path: string; unchangedSinceLoad: boolean } {\n const { mem, fn } = this.runtime;\n const writer = this.runtime.fileWrite.toNodeFile(path);\n const statusPtr = mem.alloc(4);\n try {\n mem.poke(statusPtr, 'i32', 0);\n const ok = fn.EPDF_SaveAsCopyEx(\n this.session.requireDocPtr(),\n writer.ptr,\n pdfSaveModeFlags(mode),\n statusPtr,\n );\n const status = Number(mem.peek(statusPtr, 'i32'));\n if (!ok || status === 0) {\n throw new EngineError(EngineErrorCode.DocOpenFailed, 'failed to save document');\n }\n return { path, unchangedSinceLoad: status === EPDF_SAVE_UNCHANGED_SINCE_LOAD };\n } finally {\n mem.free(statusPtr);\n writer.close();\n }\n }\n\n private requireLayer(): void {\n if (this.session.kind !== 'layer') {\n throw new EngineError(EngineErrorCode.InvalidArg, 'document session is not a layer');\n }\n }\n}\n","import type { DigestAlgorithm } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { SavedCandidate } from '../../../document-session/DocumentSession';\nimport type { BaseDocumentRegistry } from '../../../document-session/lifecycle/BaseDocumentRegistry';\nimport {\n openLayerDocument,\n type OpenedPdfDocument,\n} from '../../../document-session/lifecycle/PdfDocumentOpener';\nimport { withScratchN } from '../../../runtime/memory/scratch';\nimport { U64_BYTES, peekU64, pokeU64 } from '../../../runtime/memory/u64';\nimport { generateUuid } from '../../../shared/uuid';\nimport { DIGEST_CODE } from '../SignatureReader';\n\nexport interface SealedCandidate {\n byteRange: [number, number, number, number];\n contentsOffset: number;\n contentsHexLength: number;\n digest: Uint8Array;\n}\n\n/**\n * Where a signing candidate is persisted between `prepare` and\n * `complete`, and how its bytes are sealed and installed. The signing\n * orchestration is the same for both stores; only the byte operations\n * differ. `memory` holds the candidate as one buffer (the local engine).\n * `file` writes it next to the session's base file and never holds more\n * than the signature object's span in memory (the server).\n */\nexport interface CandidateStore {\n /** Serialise the candidate; the signature value object's span is reported. */\n save(candidateDocPtr: Ptr, sigObjNum: number, signingId: string): SavedCandidate;\n /** Patch /ByteRange in place and hash the two ranges. */\n seal(saved: SavedCandidate, algorithm: Exclude<DigestAlgorithm, 'sha1'>): SealedCandidate;\n /** Hex-encode the CMS into the /Contents placeholder, in place. */\n writeContents(saved: SavedCandidate, sealed: SealedCandidate, cms: Uint8Array): void;\n /** The sealed bytes as a new immutable base with a fresh layer on top. */\n openSealed(saved: SavedCandidate, password: string | null): OpenedPdfDocument;\n /** Forget a candidate that will never complete. */\n discard(saved: SavedCandidate): void;\n}\n\nfunction copyOut(view: Uint8Array): Uint8Array {\n const out = new Uint8Array(view.byteLength);\n out.set(view);\n return out;\n}\n\n/** Marshal `EPDFSig_SealSpan` over a span held in the runtime heap. */\nfunction sealSpanInHeap(\n runtime: PdfRuntimeModule,\n spanPtr: Ptr,\n spanLength: number,\n objectOffset: number,\n fileLength: number,\n): Omit<SealedCandidate, 'digest'> {\n const { fn, mem } = runtime;\n return withScratchN(mem, [4 * U64_BYTES, U64_BYTES, U64_BYTES], ([rangePtr, coPtr, chPtr]) => {\n for (let k = 0; k < 4; k++) pokeU64(mem, rangePtr, 0, k * U64_BYTES);\n pokeU64(mem, coPtr, 0);\n pokeU64(mem, chPtr, 0);\n const ok = fn.EPDFSig_SealSpan(\n spanPtr,\n BigInt(spanLength),\n BigInt(objectOffset),\n BigInt(fileLength),\n rangePtr,\n coPtr,\n chPtr,\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to seal the signing candidate');\n }\n return {\n byteRange: [\n peekU64(mem, rangePtr, 0),\n peekU64(mem, rangePtr, U64_BYTES),\n peekU64(mem, rangePtr, 2 * U64_BYTES),\n peekU64(mem, rangePtr, 3 * U64_BYTES),\n ],\n contentsOffset: peekU64(mem, coPtr),\n contentsHexLength: peekU64(mem, chPtr),\n };\n });\n}\n\n/** Marshal `EPDFSig_WriteContents` over a buffer in the heap whose first byte is file offset `bufferOffset`. */\nfunction writeContentsInHeap(\n runtime: PdfRuntimeModule,\n bufPtr: Ptr,\n bufferLength: number,\n bufferOffset: number,\n sealed: SealedCandidate,\n cms: Uint8Array,\n): void {\n const { fn, mem } = runtime;\n const cmsPtr = mem.alloc(cms.byteLength);\n try {\n mem.writeBytes(cmsPtr, cms);\n const ok = fn.EPDFSig_WriteContents(\n bufPtr,\n BigInt(bufferLength),\n BigInt(sealed.contentsOffset - bufferOffset),\n BigInt(sealed.contentsHexLength),\n cmsPtr,\n cms.byteLength,\n );\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n 'the CMS is not one DER object that fits the reserved /Contents',\n );\n }\n } finally {\n mem.free(cmsPtr);\n }\n}\n\n/**\n * Hex-encode `cms` into the /Contents hole of a candidate FILE, in place.\n * Only the hole (`<`, the hex digits, `>`) is read and written back; the\n * delimiters are checked so a wrong offset patches nothing.\n */\nexport function writeContentsIntoFile(\n runtime: PdfRuntimeModule,\n path: string,\n hole: { holeOffset: number; hexLength: number },\n cms: Uint8Array,\n): void {\n const { mem } = runtime;\n const span = runtime.fileAccess.readRange(path, hole.holeOffset, hole.hexLength + 2);\n if (\n span.byteLength !== hole.hexLength + 2 ||\n span[0] !== 0x3c ||\n span[span.byteLength - 1] !== 0x3e\n ) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'the byteRange gap is not a <…> /Contents hole of the candidate',\n );\n }\n const spanPtr = mem.alloc(span.byteLength);\n try {\n mem.writeBytes(spanPtr, span);\n writeContentsInHeap(\n runtime,\n spanPtr,\n span.byteLength,\n hole.holeOffset,\n {\n byteRange: [0, 0, 0, 0],\n contentsOffset: hole.holeOffset + 1,\n contentsHexLength: hole.hexLength,\n digest: new Uint8Array(),\n },\n cms,\n );\n runtime.fileWrite.writeRange(path, hole.holeOffset, mem.readBytes(spanPtr, span.byteLength));\n } finally {\n mem.free(spanPtr);\n }\n}\n\n// ---------------------------------------------------------------------------\n\nexport class MemoryCandidateStore implements CandidateStore {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly baseDocuments: BaseDocumentRegistry,\n ) {}\n\n save(candidateDocPtr: Ptr, sigObjNum: number): SavedCandidate {\n const { mem, fn } = this.runtime;\n return withScratchN(mem, [U64_BYTES, U64_BYTES, U64_BYTES], ([sizePtr, offPtr, lenPtr]) => {\n pokeU64(mem, sizePtr, 0);\n pokeU64(mem, offPtr, 0);\n pokeU64(mem, lenPtr, 0);\n const bufPtr = fn.EPDFSig_SaveCandidateToOwnedBuffer(\n candidateDocPtr,\n sigObjNum,\n sizePtr,\n offPtr,\n lenPtr,\n );\n if (!bufPtr) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to save the signing candidate');\n }\n try {\n const size = peekU64(mem, sizePtr);\n return {\n kind: 'memory',\n bytes: copyOut(mem.readBytes(bufPtr, size)),\n size,\n objectOffset: peekU64(mem, offPtr),\n objectLength: peekU64(mem, lenPtr),\n };\n } finally {\n fn.EPDF_FreeBuffer(bufPtr);\n }\n });\n }\n\n seal(saved: SavedCandidate, algorithm: Exclude<DigestAlgorithm, 'sha1'>): SealedCandidate {\n if (saved.kind !== 'memory')\n throw new EngineError(EngineErrorCode.InvalidArg, 'not a memory candidate');\n const { mem, fn } = this.runtime;\n const bufPtr = mem.alloc(saved.bytes.byteLength);\n try {\n mem.writeBytes(bufPtr, saved.bytes);\n return withScratchN(\n mem,\n [4 * U64_BYTES, U64_BYTES, U64_BYTES, 64, U64_BYTES],\n ([rangePtr, coPtr, chPtr, digestPtr, lenPtr]) => {\n for (let k = 0; k < 4; k++) pokeU64(mem, rangePtr, 0, k * U64_BYTES);\n pokeU64(mem, coPtr, 0);\n pokeU64(mem, chPtr, 0);\n pokeU64(mem, lenPtr, 64);\n const ok = fn.EPDFSig_Seal(\n bufPtr,\n BigInt(saved.bytes.byteLength),\n BigInt(saved.objectOffset),\n BigInt(saved.objectLength),\n DIGEST_CODE[algorithm],\n rangePtr,\n coPtr,\n chPtr,\n digestPtr,\n lenPtr,\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to seal the signing candidate');\n }\n saved.bytes = copyOut(mem.readBytes(bufPtr, saved.bytes.byteLength));\n const digestLength = Number(mem.peek(lenPtr, 'i32'));\n return {\n byteRange: [\n peekU64(mem, rangePtr, 0),\n peekU64(mem, rangePtr, U64_BYTES),\n peekU64(mem, rangePtr, 2 * U64_BYTES),\n peekU64(mem, rangePtr, 3 * U64_BYTES),\n ],\n contentsOffset: peekU64(mem, coPtr),\n contentsHexLength: peekU64(mem, chPtr),\n digest: copyOut(mem.readBytes(digestPtr, digestLength)),\n };\n },\n );\n } finally {\n mem.free(bufPtr);\n }\n }\n\n writeContents(saved: SavedCandidate, sealed: SealedCandidate, cms: Uint8Array): void {\n if (saved.kind !== 'memory')\n throw new EngineError(EngineErrorCode.InvalidArg, 'not a memory candidate');\n const { mem } = this.runtime;\n const bufPtr = mem.alloc(saved.bytes.byteLength);\n try {\n mem.writeBytes(bufPtr, saved.bytes);\n writeContentsInHeap(this.runtime, bufPtr, saved.bytes.byteLength, 0, sealed, cms);\n saved.bytes = copyOut(mem.readBytes(bufPtr, saved.bytes.byteLength));\n } finally {\n mem.free(bufPtr);\n }\n }\n\n openSealed(saved: SavedCandidate, password: string | null): OpenedPdfDocument {\n if (saved.kind !== 'memory')\n throw new EngineError(EngineErrorCode.InvalidArg, 'not a memory candidate');\n const base = this.baseDocuments.acquireMemoryBase({\n key: `signed:${generateUuid()}`,\n bytes: saved.bytes,\n password,\n });\n return openLayerDocument(this.runtime, base, { kind: 'fresh' }, password);\n }\n\n discard(): void {\n // The buffer is dropped with the pending record.\n }\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * A candidate written next to the session's base file, through the\n * runtime's local-file surface: the base streams through the writer, the\n * seal patches the object span in place, the digest streams the file, and\n * the sealed file becomes a file base. Only the object span and the CMS\n * are ever held in memory. Node runtimes only.\n */\nexport class FileCandidateStore implements CandidateStore {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly baseDocuments: BaseDocumentRegistry,\n private readonly basePath: string,\n private readonly candidatePath: (\n basePath: string,\n signingId: string,\n ) => string = defaultCandidatePath,\n ) {}\n\n save(candidateDocPtr: Ptr, sigObjNum: number, signingId: string): SavedCandidate {\n const { mem, fn } = this.runtime;\n const path = this.candidatePath(this.basePath, signingId);\n this.runtime.fileWrite.removeFile(path);\n const writer = this.runtime.fileWrite.toNodeFile(path);\n try {\n return withScratchN(mem, [U64_BYTES, U64_BYTES, U64_BYTES], ([sizePtr, offPtr, lenPtr]) => {\n pokeU64(mem, sizePtr, 0);\n pokeU64(mem, offPtr, 0);\n pokeU64(mem, lenPtr, 0);\n const ok = fn.EPDFSig_SaveCandidate(\n candidateDocPtr,\n sigObjNum,\n writer.ptr,\n sizePtr,\n offPtr,\n lenPtr,\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to save the signing candidate');\n }\n return {\n kind: 'file',\n path,\n size: peekU64(mem, sizePtr),\n objectOffset: peekU64(mem, offPtr),\n objectLength: peekU64(mem, lenPtr),\n };\n });\n } catch (error) {\n writer.close();\n this.runtime.fileWrite.removeFile(path);\n throw error;\n } finally {\n writer.close();\n }\n }\n\n seal(saved: SavedCandidate, algorithm: Exclude<DigestAlgorithm, 'sha1'>): SealedCandidate {\n if (saved.kind !== 'file')\n throw new EngineError(EngineErrorCode.InvalidArg, 'not a file candidate');\n const { mem, fn } = this.runtime;\n const span = this.runtime.fileAccess.readRange(\n saved.path,\n saved.objectOffset,\n saved.objectLength,\n );\n if (span.byteLength !== saved.objectLength) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'the signing candidate file is shorter than its object span',\n );\n }\n const spanPtr = mem.alloc(span.byteLength);\n let plan: Omit<SealedCandidate, 'digest'>;\n try {\n mem.writeBytes(spanPtr, span);\n plan = sealSpanInHeap(this.runtime, spanPtr, span.byteLength, saved.objectOffset, saved.size);\n this.runtime.fileWrite.writeRange(\n saved.path,\n saved.objectOffset,\n mem.readBytes(spanPtr, span.byteLength),\n );\n } finally {\n mem.free(spanPtr);\n }\n const access = this.runtime.fileAccess.fromNodeFile(saved.path);\n try {\n const digest = withScratchN(\n mem,\n [4 * U64_BYTES, 64, U64_BYTES],\n ([rangePtr, digestPtr, lenPtr]) => {\n for (let k = 0; k < 4; k++) pokeU64(mem, rangePtr, plan.byteRange[k], k * U64_BYTES);\n pokeU64(mem, lenPtr, 64);\n const ok = fn.EPDFSig_DigestFileRange(\n access.ptr,\n rangePtr,\n DIGEST_CODE[algorithm],\n digestPtr,\n lenPtr,\n );\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'failed to digest the signing candidate file',\n );\n }\n return copyOut(mem.readBytes(digestPtr, Number(mem.peek(lenPtr, 'i32'))));\n },\n );\n return { ...plan, digest };\n } finally {\n access.close();\n }\n }\n\n writeContents(saved: SavedCandidate, sealed: SealedCandidate, cms: Uint8Array): void {\n if (saved.kind !== 'file')\n throw new EngineError(EngineErrorCode.InvalidArg, 'not a file candidate');\n const { mem } = this.runtime;\n const span = this.runtime.fileAccess.readRange(\n saved.path,\n saved.objectOffset,\n saved.objectLength,\n );\n const spanPtr = mem.alloc(span.byteLength);\n try {\n mem.writeBytes(spanPtr, span);\n writeContentsInHeap(this.runtime, spanPtr, span.byteLength, saved.objectOffset, sealed, cms);\n this.runtime.fileWrite.writeRange(\n saved.path,\n saved.objectOffset,\n mem.readBytes(spanPtr, span.byteLength),\n );\n } finally {\n mem.free(spanPtr);\n }\n }\n\n openSealed(saved: SavedCandidate, password: string | null): OpenedPdfDocument {\n if (saved.kind !== 'file')\n throw new EngineError(EngineErrorCode.InvalidArg, 'not a file candidate');\n const base = this.baseDocuments.acquireFileBase({\n key: `signed:${saved.path}`,\n path: saved.path,\n password,\n });\n return openLayerDocument(this.runtime, base, { kind: 'fresh' }, password);\n }\n\n discard(saved: SavedCandidate): void {\n if (saved.kind === 'file') this.runtime.fileWrite.removeFile(saved.path);\n }\n}\n\n/** Beside the base file, named by the signing; the host may override this (server storage layout). */\nexport function defaultCandidatePath(basePath: string, signingId: string): string {\n return `${basePath}.signing-${signingId}.pdf`;\n}\n\n/**\n * A scratch file beside the base: `<base>.<tag>-<id>.<ext>`. Unique per\n * id, so a file a document holds open is never rewritten; the caller that\n * names it registers its removal before anything writes it.\n */\nexport function scratchPath(basePath: string, tag: string, id: string, ext: string): string {\n return `${basePath}.${tag}-${id}.${ext}`;\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { CloseStack } from '../../../document-session/lifecycle/PdfDocumentOpener';\n\n/** `EPDF_STAMP_FIT_CONTAIN`: uniform scale, letterboxed and centred in the rect. */\nconst FIT_CONTAIN = 0;\n\n/**\n * Draw one page of a PDF into a widget annotation's normal appearance —\n * what a signature's mark is, whether the field is being signed\n * (`SignatureMutator`) or only filled visually (`FormMutator`).\n *\n * Two fork calls, the same pair the stamp path makes: `SetAppearanceFromPage`\n * clones the page into the document as a wrapped Form XObject (page content\n * and resources in a child form, the outer stream a placement matrix), then\n * `UpdateAppearanceToRect` writes that placement — the page fitted uniformly\n * into the widget's rect. Without the second call the page sits in its own\n * box and the viewer's BBox→/Rect mapping stretches it to the rect's aspect.\n */\nexport function bakeWidgetAppearance(\n runtime: PdfRuntimeModule,\n docPtr: Ptr,\n widget: { annotObjectNumber: number; pageObjectNumber: number },\n pdf: Uint8Array,\n pageIndex: number,\n): void {\n const { mem, fn } = runtime;\n const stack = new CloseStack();\n try {\n const pagePtr = fn.EPDFDoc_LoadPageByObjectNumber(docPtr, widget.pageObjectNumber);\n if (!pagePtr) {\n throw new EngineError(EngineErrorCode.NotFound, 'the widget page could not be loaded');\n }\n stack.push(() => fn.FPDF_ClosePage(pagePtr));\n const annotPtr = fn.EPDFPage_GetAnnotByObjectNumber(pagePtr, widget.annotObjectNumber);\n if (!annotPtr) {\n throw new EngineError(EngineErrorCode.NotFound, 'the signature widget could not be loaded');\n }\n stack.push(() => fn.FPDFPage_CloseAnnot(annotPtr));\n const dataPtr = mem.alloc(pdf.byteLength);\n stack.push(() => mem.free(dataPtr));\n mem.writeBytes(dataPtr, pdf);\n const artworkPtr = fn.FPDF_LoadMemDocument64(dataPtr, pdf.byteLength, '');\n if (!artworkPtr) {\n throw new EngineError(EngineErrorCode.MalformedPdf, 'the appearance PDF could not be opened');\n }\n stack.push(() => fn.FPDF_CloseDocument(artworkPtr));\n if (!fn.EPDFAnnot_SetAppearanceFromPage(annotPtr, artworkPtr, pageIndex)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'the appearance page could not be drawn into the widget',\n );\n }\n if (!fn.EPDFAnnot_UpdateAppearanceToRect(annotPtr, FIT_CONTAIN)) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'the appearance page could not be fitted into the widget',\n );\n }\n } finally {\n stack.close();\n }\n}\n","import type { SignatureDTO } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readContentsAt, readRevisions, readSignaturesFromModel } from './readSignatureModel';\n\n/** What a completion installed, as the sealed bytes must report it back. */\nexport interface SealExpectation {\n fieldObjectNumber: number;\n /** The /ByteRange the prepare reported. */\n byteRange: [number, number, number, number];\n /** The CMS written into /Contents. */\n cms: Uint8Array;\n}\n\n/**\n * The one check both signing paths make before sealed bytes become a\n * version — the in-session complete and the server's session-less\n * finalize. Reading the result back through the ordinary signature model\n * proves the bytes, not the writer: the field is signed, its signature\n * covers the whole LAST revision (the candidate's own, never an earlier\n * one), its /ByteRange is the one the digest was computed over, and the\n * /Contents decode to exactly the CMS installed. Anything else is refused\n * and the bytes are never installed.\n */\nexport function assertSealedSignature(\n runtime: PdfRuntimeModule,\n docPtr: Ptr,\n model: Ptr,\n expected: SealExpectation,\n): SignatureDTO {\n const refuse = (why: string) =>\n new EngineError(EngineErrorCode.SignatureRefused, `the sealed bytes ${why}`);\n const signatures = readSignaturesFromModel(runtime, model);\n const signature = signatures.find(\n (s) =>\n s.field.kind === 'objectNumber' && s.field.fieldObjectNumber === expected.fieldObjectNumber,\n );\n if (!signature) throw refuse('lost the signature field');\n if (!signature.signed || signature.coverage !== 'whole-revision' || !signature.byteRange) {\n throw refuse('do not carry a whole-revision signature on the field');\n }\n if (!sameRange(signature.byteRange, expected.byteRange)) {\n throw refuse(\n `carry /ByteRange [${signature.byteRange.join(' ')}] where [${expected.byteRange.join(' ')}] was sealed`,\n );\n }\n if (!runtime.fn.EPDFSig_IsRevisionChainValid(model)) {\n throw refuse('have a broken cross-reference chain');\n }\n const revisions = readRevisions(runtime, docPtr, signatures);\n if (signature.revisionIndex !== revisions.length - 1) {\n throw refuse('seal an earlier revision than the candidate');\n }\n if (!bytesEqual(readContentsAt(runtime, model, signature.index), expected.cms)) {\n throw refuse('carry /Contents that are not the CMS installed');\n }\n return signature;\n}\n\nexport function sameRange(\n a: readonly [number, number, number, number],\n b: readonly [number, number, number, number],\n): boolean {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n\nexport function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) return false;\n for (let i = 0; i < a.byteLength; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n","import type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { withScratch } from '../../../runtime/memory/scratch';\n\n/**\n * Marshal a `const FPDF_WIDESTRING*` array: encode every string into the\n * runtime heap, write the pointer table with the runtime's pointer width\n * (bigint pointers cannot be poked into the wasm 32-bit heap), run |body|,\n * free everything.\n */\nexport function withWideStringArray<T>(\n runtime: PdfRuntimeModule,\n values: readonly string[],\n body: (arrayPtr: Ptr, count: number) => T,\n): T {\n const { mem } = runtime;\n const stringPtrs = values.map((value) => mem.writeU16String(value));\n const isWasm = runtime.kind === 'wasm';\n const ptrSize = isWasm ? 4 : 8;\n try {\n return withScratch(mem, Math.max(1, stringPtrs.length * ptrSize), (arrayPtr) => {\n stringPtrs.forEach((ptr, i) =>\n isWasm\n ? mem.poke(arrayPtr, 'i32', Number(ptr), i * 4)\n : mem.poke(arrayPtr, 'i64', ptr, i * 8),\n );\n return body(arrayPtr, stringPtrs.length);\n });\n } finally {\n for (let i = stringPtrs.length - 1; i >= 0; i--) {\n mem.free(stringPtrs[i]);\n }\n }\n}\n","import type {\n DigestAlgorithm,\n DocumentVersionRef,\n SignatureAbortResult,\n SignatureCompleteInput,\n SignatureCompleteResult,\n SignaturePrepareInput,\n SignaturePrepared,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport {\n FileCandidateStore,\n MemoryCandidateStore,\n type CandidateStore,\n scratchPath,\n} from './internal/candidateStore';\nimport { bakeWidgetAppearance } from './internal/appearance';\nimport { assertSealedSignature, bytesEqual, type SealExpectation } from './internal/sealCheck';\nimport { disposeSignatureModel } from './internal/signatureModelCache';\nimport { DIGEST_CODE, SignatureReader } from './SignatureReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport type { BaseDocumentRegistry } from '../../document-session/lifecycle/BaseDocumentRegistry';\nimport {\n CloseStack,\n openLayerDocument,\n type LayerSource,\n type OpenedPdfDocument,\n} from '../../document-session/lifecycle/PdfDocumentOpener';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { generateUuid } from '../../shared/uuid';\nimport { disposeFormModel } from '../forms/internal/formModelCache';\nimport { withWideStringArray } from '../forms/internal/wideStringArray';\nimport { DocumentSaver } from '../save/DocumentSaver';\n\n// Mirrors public/epdf_signature.h.\nconst SUBFILTER_CODE = {\n 'adbe.pkcs7.detached': 0,\n 'ETSI.CAdES.detached': 1,\n 'ETSI.RFC3161': 2,\n} as const;\nconst FIELD_ACTION_CODE = { all: 1, include: 2, exclude: 3 } as const;\nconst DEFAULT_CONTENTS_SIZE = 8192;\nconst MIN_CONTENTS_SIZE = 256;\nconst MAX_CONTENTS_SIZE = 4 * 1024 * 1024;\n\n/**\n * `EPDF_SIG_PREPARE` as the C compiler lays it out. Two layouts: ILP32\n * (wasm32: int, unsigned long and pointers are 4 bytes) and LP64 (the\n * native darwin/linux runtimes: unsigned long and pointers are 8 bytes,\n * 8-aligned). Field order follows the header.\n */\ninterface PrepareLayout {\n bytes: number;\n ptrBytes: number;\n subfilter: number;\n digest: number;\n contentsSize: number;\n name: number;\n reason: number;\n location: number;\n contactInfo: number;\n signingTime: number;\n docmdpPermission: number;\n fieldmdpAction: number;\n fieldmdpFields: number;\n fieldmdpFieldCount: number;\n lockPermission: number;\n}\nconst PREPARE_ILP32: PrepareLayout = {\n bytes: 52,\n ptrBytes: 4,\n subfilter: 0,\n digest: 4,\n contentsSize: 8,\n name: 12,\n reason: 16,\n location: 20,\n contactInfo: 24,\n signingTime: 28,\n docmdpPermission: 32,\n fieldmdpAction: 36,\n fieldmdpFields: 40,\n fieldmdpFieldCount: 44,\n lockPermission: 48,\n};\nconst PREPARE_LP64: PrepareLayout = {\n bytes: 80,\n ptrBytes: 8,\n subfilter: 0,\n digest: 4,\n contentsSize: 8,\n name: 16,\n reason: 24,\n location: 32,\n contactInfo: 40,\n signingTime: 48,\n docmdpPermission: 56,\n fieldmdpAction: 60,\n fieldmdpFields: 64,\n fieldmdpFieldCount: 72,\n lockPermission: 76,\n};\n\n/**\n * The two-phase signing protocol on a session, local and native alike.\n *\n * `prepare` never touches the live document: it builds a CANDIDATE — a\n * fresh layer over the session's own immutable base (see `openCandidate`)\n * — writes the signature there, saves it through a `CandidateStore`\n * (memory locally, a file beside the base on file-backed sessions), seals\n * it, and parks the saved candidate on the session. `complete` writes the\n * CMS into it, opens it as a new base with a fresh layer, proves the new\n * signature seals a whole revision, and installs it as the session's\n * document. `abort` discards the candidate.\n */\nexport class SignatureMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n private readonly baseDocuments: BaseDocumentRegistry,\n /** Where a file-backed session's candidate is written; defaults to beside the base file. */\n private readonly candidatePath?: (basePath: string, signingId: string) => string,\n ) {}\n\n prepare(input: SignaturePrepareInput): SignaturePrepared {\n if (this.session.pendingSigning) {\n throw new EngineError(\n EngineErrorCode.SigningPending,\n `a signing is pending (${this.session.pendingSigning.prepared.signingId}); complete or abort it first`,\n );\n }\n const reader = new SignatureReader(this.runtime, this.session);\n const field = reader.resolveField(input.field);\n if (field.signed) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n 'the signature field is already signed',\n );\n }\n if (input.appearance && !field.widget) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n 'the signature field has no widget to carry an appearance',\n );\n }\n const algorithm: Exclude<DigestAlgorithm, 'sha1'> = input.digest ?? 'sha256';\n if (!(algorithm in DIGEST_CODE) || algorithm === ('sha1' as string)) {\n throw new EngineError(EngineErrorCode.SignatureRefused, `unsupported digest '${algorithm}'`);\n }\n const kind = input.kind ?? 'signature';\n const subFilter: keyof typeof SUBFILTER_CODE =\n kind === 'timestamp' ? 'ETSI.RFC3161' : (input.subFilter ?? 'ETSI.CAdES.detached');\n if (!(subFilter in SUBFILTER_CODE)) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n `unsupported subFilter '${subFilter}'`,\n );\n }\n const contentsSize = input.contentsSize ?? DEFAULT_CONTENTS_SIZE;\n if (\n !Number.isInteger(contentsSize) ||\n contentsSize < MIN_CONTENTS_SIZE ||\n contentsSize > MAX_CONTENTS_SIZE\n ) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n `contentsSize must be an integer in [${MIN_CONTENTS_SIZE}, ${MAX_CONTENTS_SIZE}]`,\n );\n }\n const expectedVersion = this.session.versionRef(reader.version().sha256);\n\n const signingId = generateUuid();\n const stack = new CloseStack();\n try {\n // Scratch files the candidate needs are registered on |stack| before\n // they are written and go when the candidate closes (LIFO: the\n // candidate closes first, then its files are removed).\n const candidate = this.openCandidate(signingId, stack);\n stack.push(() => candidate.close());\n\n // `signer` is the pre-rename wire spelling: older clients still send it.\n const attribution =\n input.attribution ??\n (input as { signer?: SignaturePrepareInput['attribution'] }).signer;\n const valueObjNum = this.callPrepare(candidate.docPtr, field.fieldObjectNumber, {\n subfilter: SUBFILTER_CODE[subFilter],\n digest: DIGEST_CODE[algorithm],\n contentsSize,\n name: attribution?.name ?? null,\n reason: attribution?.reason ?? null,\n location: attribution?.location ?? null,\n contactInfo: attribution?.contactInfo ?? null,\n signingTime: input.signingTime ?? null,\n docmdpPermission: input.certify?.permission ?? 0,\n fieldmdpAction: input.lock ? FIELD_ACTION_CODE[input.lock.action] : 0,\n fieldmdpFields: input.lock?.action === 'all' ? [] : (input.lock?.fields ?? []),\n lockPermission: input.lock?.permission ?? 0,\n });\n if (valueObjNum === 0) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n 'the engine refused to author the signature (the field is signed, read-only or locked, a certification is not allowed here, the seed value requires what is not implemented, or the request is inconsistent)',\n );\n }\n if (input.appearance && field.widget) {\n bakeWidgetAppearance(this.runtime, \n candidate.docPtr,\n field.widget,\n input.appearance.pdf,\n input.appearance.pageIndex ?? 0,\n );\n }\n\n const store = this.storeFor();\n const saved = store.save(candidate.docPtr, valueObjNum, signingId);\n let sealed;\n try {\n sealed = store.seal(saved, algorithm);\n } catch (error) {\n store.discard(saved);\n throw error;\n }\n const prepared: SignaturePrepared = {\n signingId,\n digest: sealed.digest,\n algorithm,\n byteRange: sealed.byteRange,\n contentsSize,\n subFilter,\n expectedVersion,\n expiresAt: null,\n };\n this.session.pendingSigning = {\n prepared,\n fieldObjectNumber: field.fieldObjectNumber,\n saved,\n contentsOffset: sealed.contentsOffset,\n contentsHexLength: sealed.contentsHexLength,\n };\n return prepared;\n } finally {\n stack.close();\n }\n }\n\n complete(input: SignatureCompleteInput): SignatureCompleteResult {\n const pending = this.session.pendingSigning;\n if (!pending || pending.prepared.signingId !== input.signingId) {\n const last = this.session.lastCompletion;\n if (last && last.signingId === input.signingId) {\n if (!bytesEqual(last.cms, input.cms)) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n 'this signing already completed with a different CMS',\n );\n }\n return { ...last.result, status: 'already-completed' };\n }\n throw new EngineError(EngineErrorCode.NotFound, `no pending signing '${input.signingId}'`);\n }\n if (!sameVersion(pending.prepared.expectedVersion, input.expectedVersion)) {\n throw new EngineError(\n EngineErrorCode.SigningVersionMismatch,\n 'expectedVersion is not the version the candidate was prepared on',\n );\n }\n if (input.cms.byteLength === 0 || input.cms[0] !== 0x30) {\n throw new EngineError(EngineErrorCode.SignatureRefused, 'the CMS is not a DER SEQUENCE');\n }\n if (input.cms.byteLength > pending.prepared.contentsSize) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n `the CMS (${input.cms.byteLength} bytes) does not fit the reserved ${pending.prepared.contentsSize} bytes`,\n );\n }\n\n const store = this.storeFor();\n const sealed = {\n byteRange: pending.prepared.byteRange,\n contentsOffset: pending.contentsOffset,\n contentsHexLength: pending.contentsHexLength,\n digest: pending.prepared.digest,\n };\n store.writeContents(pending.saved, sealed, input.cms);\n const handle = store.openSealed(pending.saved, this.session.password);\n this.verifySealed(handle, {\n fieldObjectNumber: pending.fieldObjectNumber,\n byteRange: pending.prepared.byteRange,\n cms: input.cms,\n });\n\n // Install: the one place a live session changes its bytes.\n this.session.install(handle);\n disposeFormModel(this.runtime, this.session);\n disposeSignatureModel(this.runtime, this.session);\n\n const reader = new SignatureReader(this.runtime, this.session);\n const snapshot = reader.readSnapshot();\n const signature = snapshot.signatures.find(\n (s) =>\n s.field.kind === 'objectNumber' && s.field.fieldObjectNumber === pending.fieldObjectNumber,\n );\n if (!signature) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n 'the installed document lost the signature field',\n );\n }\n const result: SignatureCompleteResult = {\n status: 'completed',\n signature,\n version: reader.version(),\n previous: pending.prepared.expectedVersion,\n protection: snapshot.protection,\n meta: {\n affectedPages: this.session\n .allRecords()\n .map((r) => this.session.pageState(r.pageObjectNumber)),\n cacheDelta: null,\n },\n };\n this.session.lastCompletion = { signingId: input.signingId, cms: input.cms.slice(), result };\n return result;\n }\n\n abort(signingId: string): SignatureAbortResult {\n const pending = this.session.pendingSigning;\n if (pending && pending.prepared.signingId === signingId) {\n this.session.pendingSigning = null;\n this.storeFor().discard(pending.saved);\n return { status: 'aborted' };\n }\n if (this.session.lastCompletion?.signingId === signingId) {\n return { status: 'already-completed' };\n }\n return { status: 'unknown' };\n }\n\n // -------------------------------------------------------------------------\n\n private callPrepare(\n docPtr: Ptr,\n fieldObjectNumber: number,\n opts: {\n subfilter: number;\n digest: number;\n contentsSize: number;\n name: string | null;\n reason: string | null;\n location: string | null;\n contactInfo: string | null;\n signingTime: string | null;\n docmdpPermission: number;\n fieldmdpAction: number;\n fieldmdpFields: string[];\n lockPermission: number;\n },\n ): number {\n const { mem, fn } = this.runtime;\n const layout = this.runtime.kind === 'wasm' ? PREPARE_ILP32 : PREPARE_LP64;\n const owned: Ptr[] = [];\n const wide = (value: string | null): Ptr => {\n if (value === null) return NULL_PTR;\n const ptr = mem.writeU16String(value);\n owned.push(ptr);\n return ptr;\n };\n const utf8 = (value: string | null): Ptr => {\n if (value === null) return NULL_PTR;\n const ptr = mem.writeU8String(value);\n owned.push(ptr);\n return ptr;\n };\n try {\n return withWideStringArray(this.runtime, opts.fieldmdpFields, (fieldsPtr, fieldCount) =>\n withScratch(mem, layout.bytes, (structPtr) => {\n for (let off = 0; off < layout.bytes; off += 4) mem.poke(structPtr, 'i32', 0, off);\n const pokePtr = (offset: number, ptr: Ptr) => {\n if (layout.ptrBytes === 4) mem.poke(structPtr, 'i32', Number(ptr), offset);\n else mem.poke(structPtr, 'i64', ptr, offset);\n };\n mem.poke(structPtr, 'i32', opts.subfilter, layout.subfilter);\n mem.poke(structPtr, 'i32', opts.digest, layout.digest);\n // unsigned long: 4 bytes on ILP32, 8 on LP64 (low word first either way).\n mem.poke(structPtr, 'i32', opts.contentsSize, layout.contentsSize);\n pokePtr(layout.name, wide(opts.name));\n pokePtr(layout.reason, wide(opts.reason));\n pokePtr(layout.location, wide(opts.location));\n pokePtr(layout.contactInfo, wide(opts.contactInfo));\n pokePtr(layout.signingTime, utf8(opts.signingTime));\n mem.poke(structPtr, 'i32', opts.docmdpPermission, layout.docmdpPermission);\n mem.poke(structPtr, 'i32', opts.fieldmdpAction, layout.fieldmdpAction);\n pokePtr(layout.fieldmdpFields, fieldCount > 0 ? fieldsPtr : NULL_PTR);\n mem.poke(structPtr, 'i32', fieldCount, layout.fieldmdpFieldCount);\n mem.poke(structPtr, 'i32', opts.lockPermission, layout.lockPermission);\n return fn.EPDFSig_Prepare(docPtr, fieldObjectNumber, structPtr);\n }),\n );\n } finally {\n for (let i = owned.length - 1; i >= 0; i--) mem.free(owned[i]);\n }\n }\n\n /** Draw a page of `pdf` into the widget's appearance stream on the candidate. */\n\n /**\n * File-backed sessions (a file base in the registry: the server) persist\n * the candidate as a file beside the base; everything else keeps it in\n * memory. The choice follows the SESSION's base, not the candidate's.\n */\n private storeFor(): CandidateStore {\n const base = this.session.source.base;\n if (base?.kind === 'file') {\n return new FileCandidateStore(\n this.runtime,\n this.baseDocuments,\n base.path,\n this.candidatePath,\n );\n }\n return new MemoryCandidateStore(this.runtime, this.baseDocuments);\n }\n\n /**\n * Prove the sealed bytes carry a whole-revision signature on the field\n * before anything is installed; closes the handle on failure.\n */\n /**\n * Read the sealed candidate back before it is installed: the checks in\n * `assertSealedSignature` are made on a model loaded from the sealed\n * bytes themselves, so a candidate the writer got wrong never becomes\n * the session's bytes.\n */\n private verifySealed(handle: OpenedPdfDocument, expected: SealExpectation): void {\n const { fn } = this.runtime;\n try {\n const model = fn.EPDFSig_LoadModel(handle.docPtr);\n if (!model) {\n throw new EngineError(EngineErrorCode.Unknown, 'the sealed bytes have no signature model');\n }\n try {\n assertSealedSignature(this.runtime, handle.docPtr, model, expected);\n } finally {\n fn.EPDFSig_CloseModel(model);\n }\n if (this.session.kind !== 'layer') {\n this.session.persistLayerArtifact = false;\n }\n } catch (error) {\n handle.close();\n throw error;\n }\n }\n\n /**\n * The candidate the signature is authored on. A layer session reopens a\n * fresh layer over ITS OWN immutable base (a registry retain, no copy of\n * the file), fed the layer it was opened with — or, with unsaved edits,\n * the artifact a save would write, which is cumulative: the edits and\n * the signature then share one revision, as Acrobat saves a\n * fill-and-sign. The fallback freezes the complete loaded bytes as a new\n * memory base: for a plain session, and for a layer whose loaded delta\n * already holds signed bytes (a layer save rewrites the delta and would\n * drop them; the fork refuses to prepare such a candidate).\n */\n private openCandidate(signingId: string, stack: CloseStack): OpenedPdfDocument {\n const password = this.session.password;\n const source = this.session.source;\n const saver = new DocumentSaver(this.runtime, this.session);\n // On a native runtime over a file base, everything document- or\n // layer-sized goes through scratch files beside the base (the signing\n // root the file candidate store owns); the wasm client keeps buffers —\n // its bytes are in memory anyway.\n const scratch = saver.canWriteScratchFiles() && source.base?.kind === 'file' ? source.base.path : null;\n if (this.session.kind === 'layer' && source.base && !this.loadedDeltaHoldsSignedBytes()) {\n const base = this.baseDocuments.retainByKey(source.base.key);\n if (base) {\n // With unsaved edits, the artifact a save would write — unless the\n // save pass finds nothing reachable changed since load (an\n // annotation added and removed again): then the layer the session\n // was opened with IS the document, and the candidate seals it.\n let layer: LayerSource = source.layer ?? { kind: 'fresh' };\n if (this.session.hasUnsavedEdits()) {\n if (scratch) {\n const path = scratchPath(scratch, 'signing', signingId, 'layer');\n stack.push(() => this.runtime.fileWrite.removeFile(path));\n const saved = saver.saveLayerArtifactToFileEx(path);\n if (saved.changedSinceLoad) {\n layer = { kind: 'artifact-file', path };\n }\n } else {\n const artifact = saver.saveLayerArtifactEx();\n if (artifact.changedSinceLoad) {\n layer = { kind: 'artifact', bytes: artifact.bytes };\n }\n }\n }\n return openLayerDocument(this.runtime, base, layer, password);\n }\n }\n if (scratch) {\n // The whole document as a file base: never an in-memory buffer.\n const path = scratchPath(scratch, 'signing', signingId, 'base.pdf');\n stack.push(() => this.runtime.fileWrite.removeFile(path));\n saver.snapshotToFile(path);\n const base = this.baseDocuments.acquireFileBase({\n key: `candidate:${signingId}`,\n path,\n password,\n });\n return openLayerDocument(this.runtime, base, { kind: 'fresh' }, password);\n }\n const candidateBytes = saver.snapshot().bytes;\n const base = this.baseDocuments.acquireMemoryBase({\n key: `candidate:${signingId}`,\n bytes: new Uint8Array(candidateBytes),\n password,\n });\n return openLayerDocument(this.runtime, base, { kind: 'fresh' }, password);\n }\n\n /** Whether a signature's byte range reaches into the layer's loaded delta (past the base). */\n private loadedDeltaHoldsSignedBytes(): boolean {\n const layer = this.session.source.layer;\n if (!layer || layer.kind === 'fresh') return false;\n const baseSize = Number(this.runtime.fn.EPDFDoc_GetBaseBytesSize(this.session.requireDocPtr()));\n const snapshot = new SignatureReader(this.runtime, this.session).readSnapshot();\n return snapshot.signatures.some(\n (s) => s.signed && s.byteRange !== null && s.byteRange[2] + s.byteRange[3] > baseSize,\n );\n }\n}\n\nfunction sameVersion(a: DocumentVersionRef, b: DocumentVersionRef): boolean {\n return a.baseSha256 === b.baseSha256 && a.editsVersion === b.editsVersion;\n}\n","import type {\n AnalyzeInput,\n ChangeAnalysis,\n DocumentFieldLock,\n ModificationLevel,\n ObjectChange,\n ObjectChangeKind,\n ObjectChangeType,\n ObjectReadStatus,\n ObjectReferrer,\n PdfRevision,\n RevisionAnalysis,\n RevisionHealth,\n RevisionStructure,\n SignatureSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport {\n assessmentOf,\n combine,\n EdgeResolver,\n EngineError,\n EngineErrorCode,\n evaluateStep,\n parsePdfValue,\n restrictionsFor,\n sameEffectiveValue,\n SIGNATURE_POLICY_VERSION,\n USAGE_INCOMPLETE,\n} from '@embedpdf/engine-core/runtime';\nimport { deriveProtection } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule, type Ptr } from '@embedpdf/engine-runtime';\n\nimport { SignatureReader } from './SignatureReader';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport {\n CloseStack,\n openFatMemoryDocument,\n} from '../../document-session/lifecycle/PdfDocumentOpener';\nimport { withScratch, withScratchN } from '../../runtime/memory/scratch';\nimport { DocumentSaver } from '../save/DocumentSaver';\nimport { scratchPath } from './internal/candidateStore';\nimport { generateUuid } from '../../shared/uuid';\nimport {\n readRevisions,\n readSignaturesFromModel,\n readStructure,\n withSignatureModel,\n} from './internal/readSignatureModel';\nimport { withUtf8CString } from '../../runtime/memory/strings';\n\n// Mirrors public/epdf_signature.h.\nconst CHANGE_BY_CODE: Record<number, ObjectChangeType> = { 0: 'added', 1: 'modified', 2: 'freed' };\nconst KIND_BY_CODE: Record<number, ObjectChangeKind> = {\n 0: 'dictionary',\n 1: 'stream',\n 2: 'array',\n 3: 'scalar',\n 4: 'xref',\n 5: 'objstm',\n 6: 'trailer',\n};\nconst DIFF_OLD = 0;\nconst DIFF_NEW = 1;\n/** EPDF_DIFF_READ_OK / FAILED / ABSENT. */\nconst READ_BY_CODE: Record<number, ObjectReadStatus> = { 0: 'ok', 1: 'failed', 2: 'absent' };\n\n/** The objects an edge may be anchored at: the trailer, the structure of the revision, and every changed object. */\nfunction anchorSet(s: RevisionStructure, changed: ReadonlySet<number>): Set<number> {\n const out = new Set<number>([0, s.root, s.pagesRoot, ...s.pages, ...changed]);\n if (s.acroForm) out.add(s.acroForm);\n for (const f of s.fields) {\n out.add(f.objectNumber);\n for (const w of f.widgets) out.add(w);\n }\n return out;\n}\n\n/**\n * Modification analysis over a session: which revisions to compare, the\n * fork's exact object diff for each adjacent pair, each revision's\n * structure, and the pure rule engine's verdict per step. Every revision\n * is opened as its own prefix document from the target's loaded bytes;\n * `working-copy` first snapshots the session the way a save would.\n */\nexport class SignatureAnalyzer {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n /**\n * The signature snapshot of the session's working copy: the unsaved\n * state snapshotted the way a save would write it, as one more revision\n * over the loaded bytes. Identical to the loaded-bytes snapshot when\n * nothing is unsaved.\n */\n readWorkingCopySnapshot(): SignatureSnapshot {\n const stack = new CloseStack();\n try {\n const copy = this.openWorkingCopy(stack);\n if (copy.source === 'loaded') {\n return new SignatureReader(this.runtime, this.session).readSnapshot();\n }\n const target = copy.target;\n return withSignatureModel(this.runtime, target, (model) => {\n const chainValid = this.runtime.fn.EPDFSig_IsRevisionChainValid(model);\n const signatures = readSignaturesFromModel(this.runtime, model);\n const revisions = chainValid ? readRevisions(this.runtime, target, signatures) : [];\n return { chainValid, revisions, signatures, protection: deriveProtection(signatures) };\n });\n } finally {\n stack.close();\n }\n }\n\n analyze(input: AnalyzeInput): ChangeAnalysis {\n const reader = new SignatureReader(this.runtime, this.session);\n const snapshot = reader.readSnapshot();\n const version = reader.version();\n const mode = input.exploratoryLevel ? 'exploratory' : 'authoritative';\n const detail = input.detail ?? 'summary';\n // Which bytes are judged, truthfully: the working copy only when a save\n // would change the document — the saver's pass decides that once the\n // working copy is opened below (an annotation added and removed again\n // leaves the loaded bytes as the document); otherwise the loaded bytes.\n let basisSource: 'persisted' | 'working-copy' = 'persisted';\n const editsVersion = this.session.mutationSeq();\n\n let sinceRevision: number;\n let sinceSignature: number | null = null;\n if ('signatureIndex' in input.since) {\n const sig = snapshot.signatures[input.since.signatureIndex];\n if (!sig) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no signature ${input.since.signatureIndex}`,\n );\n }\n if (!sig.signed || sig.revisionIndex === null) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `signature ${input.since.signatureIndex} seals no whole revision; nothing to analyze from`,\n );\n }\n sinceRevision = sig.revisionIndex;\n sinceSignature = sig.index;\n } else {\n sinceRevision = input.since.revisionIndex;\n }\n if (!snapshot.chainValid) {\n const current = {\n verdict: 'indeterminate' as const,\n complete: false,\n findings: [\n {\n rule: 'revision-chain',\n verdict: 'incomplete' as const,\n objectNumber: 0,\n detail: 'the cross-reference chain is broken or was rebuilt: no revision can be told from another',\n },\n ],\n method: 'net-state' as const,\n };\n return {\n mode,\n policyVersion: SIGNATURE_POLICY_VERSION,\n basis: { version, editsVersion, source: 'persisted' },\n since: { revisionIndex: sinceRevision, signatureIndex: sinceSignature },\n until: { revisionIndex: sinceRevision },\n restrictions: [],\n current: { ...current, primary: current.findings[0] },\n later: { revisionCount: 0, undoneObjectNumbers: [] },\n verdict: 'indeterminate',\n steps: [],\n };\n }\n if (\n !Number.isInteger(sinceRevision) ||\n sinceRevision < 0 ||\n sinceRevision >= snapshot.revisions.length\n ) {\n throw new EngineError(EngineErrorCode.InvalidArg, `no revision ${sinceRevision}`);\n }\n\n const stack = new CloseStack();\n try {\n // The target: the loaded bytes, or a snapshot of the unsaved state.\n let target = this.session.requireDocPtr();\n let revisions: PdfRevision[] = snapshot.revisions;\n const copy = input.until === 'working-copy' ? this.openWorkingCopy(stack) : null;\n if (copy && copy.source === 'working-copy') {\n basisSource = 'working-copy';\n target = copy.target;\n const signatures = withSignatureModel(this.runtime, target, (m) =>\n readSignaturesFromModel(this.runtime, m),\n );\n revisions = readRevisions(this.runtime, target, signatures);\n if (revisions.length === 0) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'the working copy has no valid revision chain',\n );\n }\n }\n let untilRevision = revisions.length - 1;\n if (typeof input.until === 'object') {\n untilRevision = input.until.revisionIndex;\n if (\n !Number.isInteger(untilRevision) ||\n untilRevision < sinceRevision ||\n untilRevision >= revisions.length\n ) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `no revision ${untilRevision} at or after ${sinceRevision}`,\n );\n }\n }\n\n // The two revisions that decide the verdict: the sealed one and the\n // judged one, opened as their own prefix documents from the target's\n // bytes (the judged one IS the target when it is the last revision).\n // Nothing in between is opened for the net state.\n const pair = new CloseStack();\n let before: RevisionStructure;\n let after: RevisionStructure;\n let changes: ObjectChange[] = [];\n let health: { old: RevisionHealth; new: RevisionHealth } | undefined;\n try {\n const sealed = this.openPrefix(target, revisions, sinceRevision, pair);\n const judged =\n untilRevision === revisions.length - 1\n ? target\n : this.openPrefix(target, revisions, untilRevision, pair);\n before = readStructure(this.runtime, sealed);\n after = untilRevision === sinceRevision ? before : readStructure(this.runtime, judged);\n if (untilRevision > sinceRevision) {\n ({ changes, health } = this.compare(sealed, judged, before, after));\n }\n } finally {\n pair.close();\n }\n\n const judgedSignature =\n sinceSignature === null ? null : (before.signatures[sinceSignature] ?? null);\n const restrictions = restrictionsFor(before, judgedSignature);\n const levelOverride = input.exploratoryLevel as ModificationLevel | undefined;\n const net = evaluateStep({\n older: sinceRevision,\n newer: untilRevision,\n changes,\n before,\n after,\n health,\n restrictions: { level: restrictions.level, locks: restrictions.locks },\n levelOverride,\n });\n\n // A certification's window is also replayed revision by revision\n // (corpus v3/82-83): an intermediate violation invalidates it even\n // when the final state no longer shows it. Approval and lock windows\n // are judged on their net state alone (v2/15, 42, 44; v3/81, 85).\n const certifies = restrictions.anchors.some((r) => r.source === 'docmdp' && r.own);\n const intermediate = untilRevision - sinceRevision;\n let steps: RevisionAnalysis[];\n if (intermediate <= 1) {\n steps = intermediate === 1 ? [net] : [];\n } else if (certifies || detail === 'full') {\n steps = this.walkSteps(target, revisions, sinceRevision, untilRevision, before, {\n level: restrictions.level,\n locks: restrictions.locks,\n levelOverride,\n });\n } else {\n steps = [];\n }\n const current = certifies\n ? { ...combine(net, steps), method: 'net-state+replay' as const }\n : { ...assessmentOf(net), method: 'net-state' as const };\n return {\n mode,\n policyVersion: SIGNATURE_POLICY_VERSION,\n basis: { version, editsVersion, source: basisSource },\n since: { revisionIndex: sinceRevision, signatureIndex: sinceSignature },\n until: { revisionIndex: untilRevision },\n restrictions: restrictions.anchors,\n current,\n later: {\n revisionCount: intermediate,\n undoneObjectNumbers: changes.filter(sameEffectiveValue).map((c) => c.objectNumber),\n },\n verdict: current.verdict,\n steps,\n };\n } finally {\n stack.close();\n }\n }\n\n /** Revision `index` of `target`'s bytes as its own document, owned by `stack`. */\n private openPrefix(target: Ptr, revisions: PdfRevision[], index: number, stack: CloseStack): Ptr {\n const prefix = this.runtime.fn.EPDFDoc_OpenRevision(target, BigInt(revisions[index].end));\n if (prefix === NULL_PTR) {\n throw new EngineError(EngineErrorCode.MalformedPdf, `revision ${index} does not open as a document`);\n }\n stack.push(() => this.runtime.fn.FPDF_CloseDocument(prefix));\n return prefix;\n }\n\n /**\n * Every pairwise step between `since` and `until`, two prefix documents\n * open at a time whatever the revision count. `sealedStructure` is the\n * structure of `since` (already read); every later structure is read once\n * and dropped with its document.\n */\n private walkSteps(\n target: Ptr,\n revisions: PdfRevision[],\n since: number,\n until: number,\n sealedStructure: RevisionStructure,\n restrictions: { level: ModificationLevel; locks: DocumentFieldLock[]; levelOverride?: ModificationLevel },\n ): RevisionAnalysis[] {\n const { fn } = this.runtime;\n const steps: RevisionAnalysis[] = [];\n let older = this.openPrefix(target, revisions, since, new CloseStack());\n let olderStructure = sealedStructure;\n try {\n for (let r = since + 1; r <= until; r++) {\n const newer = r === revisions.length - 1 ? target : this.openPrefix(target, revisions, r, new CloseStack());\n try {\n const newerStructure = readStructure(this.runtime, newer);\n const { changes, health } = this.compare(older, newer, olderStructure, newerStructure);\n steps.push(\n evaluateStep({\n older: r - 1,\n newer: r,\n changes,\n before: olderStructure,\n after: newerStructure,\n health,\n restrictions: { level: restrictions.level, locks: restrictions.locks },\n levelOverride: restrictions.levelOverride,\n }),\n );\n olderStructure = newerStructure;\n } finally {\n fn.FPDF_CloseDocument(older);\n older = newer;\n }\n }\n } finally {\n if (older !== target) fn.FPDF_CloseDocument(older);\n }\n return steps;\n }\n\n /**\n * The document as a save would write it, opened read-only, and whose\n * bytes that is. `loaded`: nothing was mutated since load, or the saver's\n * pass found no reachable object that differs from its loaded version —\n * the session's own document is the working copy. `working-copy`: a\n * layer session composes its immutable base with the cumulative delta\n * the pass emits (`EPDFDoc_OpenBaseOverlay`: no copy of the base, one\n * cross-reference parse, the loaded delta's revision REPLACED, as an\n * artifact is), or — when every edit brought the layer back to its base\n * — a fresh layer over that base; a plain session (unsigned by law 9, so\n * this is exploratory) materialises a standalone incremental save and\n * opens it whole.\n */\n private openWorkingCopy(stack: CloseStack): { target: Ptr; source: 'loaded' | 'working-copy' } {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n if (!this.session.hasUnsavedEdits()) return { target: docPtr, source: 'loaded' };\n const saver = new DocumentSaver(this.runtime, this.session);\n if (this.session.kind === 'layer') {\n const base = this.session.source.base;\n if (saver.canWriteScratchFiles() && base?.kind === 'file') {\n // The delta on disk, composed over the base in place: no buffer of\n // the delta, no copy of it. The file is owned from the moment it is\n // named and goes with the stack, whatever happens next.\n const path = scratchPath(base.path, 'working-copy', generateUuid(), 'delta');\n stack.push(() => this.runtime.fileWrite.removeFile(path));\n const delta = saver.saveLayerDeltaToFileEx(path);\n if (!delta.changedSinceLoad) return { target: docPtr, source: 'loaded' };\n if (this.runtime.fileAccess.sizeOf(path) === 0) return this.freshLayerOverBase(stack);\n const overlay = withUtf8CString(mem, path, (pathPtr) =>\n fn.EPDFDoc_OpenBaseOverlayFromPath(docPtr, pathPtr),\n );\n if (overlay === NULL_PTR) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'the working copy does not compose with its base',\n );\n }\n stack.push(() => fn.FPDF_CloseDocument(overlay)); // closes before the file goes (LIFO)\n return { target: overlay, source: 'working-copy' };\n }\n const delta = saver.saveLayerDeltaEx();\n if (!delta.changedSinceLoad) return { target: docPtr, source: 'loaded' };\n if (delta.size === 0) return this.freshLayerOverBase(stack);\n const bytes = new Uint8Array(delta.bytes);\n const ptr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(ptr, bytes);\n const overlay = fn.EPDFDoc_OpenBaseOverlay(docPtr, ptr, bytes.byteLength);\n if (overlay === NULL_PTR) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'the working copy does not compose with its base',\n );\n }\n stack.push(() => fn.FPDF_CloseDocument(overlay));\n return { target: overlay, source: 'working-copy' };\n } finally {\n mem.free(ptr);\n }\n }\n const saved = saver.saveStandaloneToBufferEx('incremental');\n if (saved.unchangedSinceLoad) return { target: docPtr, source: 'loaded' };\n const opened = openFatMemoryDocument(\n this.runtime,\n new Uint8Array(saved.bytes),\n this.session.password,\n );\n stack.push(() => opened.close());\n return { target: opened.docPtr, source: 'working-copy' };\n }\n\n /** Changed since load, nothing to write: the layer equals its base, and a fresh layer over it IS that document. */\n private freshLayerOverBase(stack: CloseStack): { target: Ptr; source: 'working-copy' } {\n const { fn, mem } = this.runtime;\n const base = fn.EPDFLayer_GetBaseDocument(this.session.requireDocPtr());\n const statusPtr = mem.alloc(4);\n try {\n mem.poke(statusPtr, 'i32', -1);\n const fresh = fn.EPDFLayer_OpenLayer(base, NULL_PTR, this.session.password ?? '', statusPtr);\n if (fresh === NULL_PTR || Number(mem.peek(statusPtr, 'i32')) !== 0) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'the working copy could not be opened over its base',\n );\n }\n stack.push(() => fn.FPDF_CloseDocument(fresh));\n return { target: fresh, source: 'working-copy' };\n } finally {\n mem.free(statusPtr);\n }\n }\n\n /**\n * The fork's exact object diff between two revision documents,\n * marshalled: values in pass one, anchored edges in pass two (the anchors\n * are the changed objects plus each side's structural objects).\n */\n private compare(\n older: Ptr,\n newer: Ptr,\n before: RevisionStructure,\n after: RevisionStructure,\n ): { changes: ObjectChange[]; health: { old: RevisionHealth; new: RevisionHealth } } {\n const { fn, mem } = this.runtime;\n const diff = fn.EPDFDoc_CompareRevisions(older, newer);\n if (diff === NULL_PTR) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'the revisions do not share a byte history',\n );\n }\n try {\n const count = fn.EPDFObjectDiff_GetCount(diff);\n const changes: ObjectChange[] = [];\n withScratchN(\n mem,\n [4, 4, 4, 4, 4, 4],\n ([numPtr, changePtr, kindPtr, oldGenPtr, newGenPtr, streamPtr]) => {\n for (let i = 0; i < count; i++) {\n for (const p of [numPtr, changePtr, kindPtr, oldGenPtr, newGenPtr, streamPtr])\n mem.poke(p, 'i32', 0);\n if (\n !fn.EPDFObjectDiff_GetEntry(\n diff,\n i,\n numPtr,\n changePtr,\n kindPtr,\n oldGenPtr,\n newGenPtr,\n streamPtr,\n )\n ) {\n throw new EngineError(EngineErrorCode.Unknown, `failed to read diff entry ${i}`);\n }\n const objectNumber = Number(mem.peek(numPtr, 'i32')) >>> 0;\n const oldGen = Number(mem.peek(oldGenPtr, 'i32'));\n const newGen = Number(mem.peek(newGenPtr, 'i32'));\n const oldValue = this.readValue(diff, i, DIFF_OLD);\n const newValue = this.readValue(diff, i, DIFF_NEW);\n let truncated = oldValue.truncated || newValue.truncated;\n let oldParsed = null;\n let newParsed = null;\n try {\n oldParsed =\n oldValue.text === null || oldValue.truncated ? null : parsePdfValue(oldValue.text);\n newParsed =\n newValue.text === null || newValue.truncated ? null : parsePdfValue(newValue.text);\n } catch {\n // A serialisation this engine cannot read carries no evidence.\n truncated = true;\n }\n const change = CHANGE_BY_CODE[Number(mem.peek(changePtr, 'i32'))] ?? 'modified';\n changes.push({\n objectNumber,\n change,\n kind: KIND_BY_CODE[Number(mem.peek(kindPtr, 'i32'))] ?? 'scalar',\n // The trailer carries no generation numbers: presence follows the change type.\n present: { old: change !== 'added', new: change !== 'freed' },\n generation: { old: oldGen < 0 ? null : oldGen, new: newGen < 0 ? null : newGen },\n value: { old: oldParsed, new: newParsed, truncated },\n raw: { old: oldValue.text, new: newValue.text },\n // A live mapping whose bytes do not parse serialises as \"null\"\n // but reads as failed: the evaluator treats that as missing\n // evidence, never as a value equal to another failed read.\n read: {\n old: READ_BY_CODE[fn.EPDFObjectDiff_GetReadStatus(diff, i, DIFF_OLD)] ?? 'failed',\n new: READ_BY_CODE[fn.EPDFObjectDiff_GetReadStatus(diff, i, DIFF_NEW)] ?? 'failed',\n },\n streamDataChanged: Number(mem.peek(streamPtr, 'i32')) !== 0,\n usage: { old: [], new: [] },\n });\n }\n },\n );\n return {\n changes: this.withAnchoredUsage(diff, changes, before, after),\n health: { old: this.readHealth(diff, DIFF_OLD), new: this.readHealth(diff, DIFF_NEW) },\n };\n } finally {\n fn.EPDFObjectDiff_Close(diff);\n }\n }\n\n /** What the fork learned about one revision as a whole (see `RevisionHealth`). */\n private readHealth(diff: Ptr, which: number): RevisionHealth {\n const { fn, mem } = this.runtime;\n return withScratchN(mem, [4, 4, 4], ([sparsePtr, barePtr, completePtr]) => {\n for (const p of [sparsePtr, barePtr, completePtr]) mem.poke(p, 'i32', 0);\n if (!fn.EPDFObjectDiff_GetRevisionHealth(diff, which, sparsePtr, barePtr, completePtr)) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to read revision health');\n }\n return {\n sparseXref: Number(mem.peek(sparsePtr, 'i32')) !== 0,\n bareReferences: Number(mem.peek(barePtr, 'i32')) >>> 0,\n referrersComplete: Number(mem.peek(completePtr, 'i32')) !== 0,\n };\n });\n }\n\n /**\n * Pass two: every changed object's inbound edges, resolved through\n * unchanged non-structural objects to the nearest anchor (the fork's\n * referrer index covers every reachable object, so the walk never leaves\n * the diff). An object whose edges exceed the resolver's budget is\n * marked `usageIncomplete` and the evaluator refuses to permit it.\n */\n private withAnchoredUsage(\n diff: Ptr,\n changes: ObjectChange[],\n before: RevisionStructure,\n after: RevisionStructure,\n ): ObjectChange[] {\n const changed = new Set(changes.map((c) => c.objectNumber));\n const resolvers = {\n old: new EdgeResolver(\n (n) => this.readReferrers(diff, DIFF_OLD, n),\n anchorSet(before, changed),\n ),\n new: new EdgeResolver(\n (n) => this.readReferrers(diff, DIFF_NEW, n),\n anchorSet(after, changed),\n ),\n };\n return changes.map((c) => {\n const old = c.present.old ? resolvers.old.resolve(c.objectNumber) : [];\n const now = c.present.new ? resolvers.new.resolve(c.objectNumber) : [];\n const incomplete = old === USAGE_INCOMPLETE || now === USAGE_INCOMPLETE;\n return {\n ...c,\n usage: {\n old: old === USAGE_INCOMPLETE ? [] : old,\n new: now === USAGE_INCOMPLETE ? [] : now,\n },\n ...(incomplete ? { usageIncomplete: true } : {}),\n };\n });\n }\n\n private readValue(\n diff: Ptr,\n index: number,\n which: number,\n ): { text: string | null; truncated: boolean } {\n const { fn, mem } = this.runtime;\n return withScratch(mem, 4, (truncPtr) => {\n mem.poke(truncPtr, 'i32', 0);\n const length = fn.EPDFObjectDiff_GetValue(diff, index, which, NULL_PTR, 0, truncPtr);\n // A value past the fork's inspection cap reports length 0 WITH the flag set: read it first.\n const truncatedProbe = Number(mem.peek(truncPtr, 'i32')) !== 0;\n if (length <= 0) return { text: null, truncated: truncatedProbe };\n return withScratch(mem, length, (buf) => {\n mem.poke(truncPtr, 'i32', 0);\n const written = fn.EPDFObjectDiff_GetValue(diff, index, which, buf, length, truncPtr);\n const truncated = Number(mem.peek(truncPtr, 'i32')) !== 0;\n if (written <= 0) return { text: null, truncated };\n // Bytes, one to one: the serialisation may carry binary string data.\n const bytes = mem.readBytes(buf, written - 1);\n let text = '';\n for (const b of bytes) text += String.fromCharCode(b);\n return { text, truncated };\n });\n });\n }\n\n private readReferrers(diff: Ptr, which: number, objectNumber: number): ObjectReferrer[] {\n const { fn, mem } = this.runtime;\n const count = fn.EPDFObjectDiff_GetReferrerCount(diff, which, objectNumber);\n const out: ObjectReferrer[] = [];\n if (count <= 0) return out;\n withScratch(mem, 4, (parentPtr) => {\n for (let k = 0; k < count; k++) {\n mem.poke(parentPtr, 'i32', 0);\n const length = fn.EPDFObjectDiff_GetReferrer(\n diff,\n which,\n objectNumber,\n k,\n parentPtr,\n NULL_PTR,\n 0,\n );\n const label =\n length <= 0\n ? ''\n : withScratch(mem, length, (buf) => {\n const written = fn.EPDFObjectDiff_GetReferrer(\n diff,\n which,\n objectNumber,\n k,\n parentPtr,\n buf,\n length,\n );\n if (written <= 0) return '';\n const bytes = mem.readBytes(buf, written - 1);\n let text = '';\n for (const b of bytes) text += String.fromCharCode(b);\n return text;\n });\n out.push({ parent: Number(mem.peek(parentPtr, 'i32')) >>> 0, label });\n }\n });\n return out;\n }\n}\n","import type {\n BaseVersionInfo,\n DocumentProtection,\n SignatureDTO,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { writeContentsIntoFile } from './internal/candidateStore';\nimport { assertSealedSignature } from './internal/sealCheck';\nimport { acquireSignatureModel } from './internal/signatureModelCache';\nimport { SignatureReader } from './SignatureReader';\nimport { DocumentSession } from '../../document-session/DocumentSession';\nimport type { BaseDocumentRegistry } from '../../document-session/lifecycle/BaseDocumentRegistry';\nimport { openLayerDocument } from '../../document-session/lifecycle/PdfDocumentOpener';\nimport { generateUuid } from '../../shared/uuid';\n\nexport interface FinalizeCandidateInput {\n /** The rebuilt candidate on this filesystem; patched in place. */\n path: string;\n byteRange: [number, number, number, number];\n contentsSize: number;\n fieldObjectNumber: number;\n cms: Uint8Array;\n password: string | null;\n}\n\nexport interface FinalizedCandidate {\n signature: SignatureDTO;\n protection: DocumentProtection;\n version: BaseVersionInfo;\n}\n\n/**\n * The session-less half of a durable signing. A server prepares a\n * candidate on one replica, keeps only its tail, and may complete it on\n * another: the completing replica rebuilds base ⊕ tail into a private\n * file and hands it here with what the prepare reported. The CMS is\n * hex-encoded into the /Contents hole in place — never more than the\n * hole itself is held in memory — and the file is then opened like any\n * other base and read back through the signature model, so the version\n * returned is the file's own hash and the signature is what the file\n * says, not what the writer meant. Nothing here touches a live session.\n */\nexport class CandidateFinalizer {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly baseDocuments: BaseDocumentRegistry,\n ) {}\n\n finalize(input: FinalizeCandidateInput): FinalizedCandidate {\n const [r0, r1, r2, r3] = input.byteRange;\n const size = this.runtime.fileAccess.sizeOf(input.path);\n const isOffset = (n: number) => Number.isSafeInteger(n) && n >= 0;\n if (!input.byteRange.every(isOffset) || r0 !== 0 || r1 >= r2 || r2 + r3 !== size) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `byteRange [${input.byteRange.join(' ')}] does not span a ${size}-byte candidate`,\n );\n }\n // The hole is `<` + hex digits + `>`: the range's gap, less the delimiters.\n const hexLength = r2 - r1 - 2;\n if (!Number.isSafeInteger(input.contentsSize) || hexLength !== 2 * input.contentsSize) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `the /Contents hole holds ${hexLength} hex digits, not the ${2 * input.contentsSize} of contentsSize`,\n );\n }\n if (input.cms.byteLength === 0 || input.cms[0] !== 0x30) {\n throw new EngineError(EngineErrorCode.SignatureRefused, 'the CMS is not a DER SEQUENCE');\n }\n if (input.cms.byteLength > input.contentsSize) {\n throw new EngineError(\n EngineErrorCode.SignatureRefused,\n `the CMS (${input.cms.byteLength} bytes) does not fit the reserved ${input.contentsSize} bytes`,\n );\n }\n\n writeContentsIntoFile(this.runtime, input.path, { holeOffset: r1, hexLength }, input.cms);\n\n // A private, never-reused key: the file is this attempt's own and must\n // not alias a base another session holds under the same path.\n const session = new DocumentSession(this.runtime);\n const base = this.baseDocuments.acquireFileBase({\n key: `finalize:${generateUuid()}`,\n path: input.path,\n password: input.password,\n });\n try {\n session.openFromHandle(\n openLayerDocument(this.runtime, base, { kind: 'fresh' }, input.password),\n );\n const model = acquireSignatureModel(this.runtime, session);\n assertSealedSignature(this.runtime, session.requireDocPtr(), model, {\n fieldObjectNumber: input.fieldObjectNumber,\n byteRange: input.byteRange,\n cms: input.cms,\n });\n const reader = new SignatureReader(this.runtime, session);\n const snapshot = reader.readSnapshot();\n const signature = snapshot.signatures.find(\n (s) =>\n s.field.kind === 'objectNumber' && s.field.fieldObjectNumber === input.fieldObjectNumber,\n )!;\n return { signature, protection: snapshot.protection, version: reader.version() };\n } finally {\n // Releases the base acquisition through the handle's close stack.\n session.close();\n }\n }\n}\n","import {\n EngineError,\n EngineErrorCode,\n type FontEmbeddingPermission,\n type FontIdentityInfo,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfFileAccessHandle, PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { readUtf8String } from '../../runtime/memory/strings';\n\n/** `EPDF_FONT_EMBEDDING_*` codes. Restricted (3) and bitmap-only (4) are\n * refused at registration, so they never reach a handle. */\nfunction permissionFromCode(code: number): FontEmbeddingPermission {\n switch (code) {\n case 1:\n return 'editable';\n case 2:\n return 'preview-and-print';\n default:\n return 'installable';\n }\n}\n\n/** The engine's family comparison: no case, spaces, hyphens, underscores. */\nfunction familyKey(family: string): string {\n return family.toLowerCase().replace(/[\\s\\-_'\"]/g, '');\n}\n\n/**\n * A font to register at thread startup from a local file. Used by hosts that\n * own their font policy (the cloud server's fallback fonts), as opposed to the\n * per-request `fonts.register` wire path the browser engine drives.\n *\n * Registration is by path, mirroring how the server opens base documents\n * (`fileAccess.fromNodeFile`): the bytes are range-read on demand and never\n * held resident in the JS heap, so a deployment can configure many large\n * fallback fonts (CJK families) without paying RAM per font.\n */\nexport interface StartupFontSpec {\n key: string;\n /** Absolute path to a TTF/OTF file (native/node runtimes only). */\n path: string;\n familyName?: string;\n weight?: number;\n /** `undefined` → infer from the file. */\n italic?: boolean;\n /** Also add to the glyph-fallback chain (automatic missing-glyph fill). */\n fallback?: boolean;\n}\n\n/**\n * Thread-confined runtime font registry binding.\n *\n * Wraps the `EPDFFont_*` C API on a single PDFium thread. PDFium's font\n * registry is thread-local: a font registered here is visible only to this\n * thread's page rendering and annotation-authoring calls, and the numeric\n * `CFX_FontRegistry::FontId` it returns is a per-thread `next_font_id++`.\n *\n * That id is volatile, so we never let it cross the worker boundary. The host\n * owns the `fontKey → id` map (passed in by reference) and every wire message\n * references the stable `fontKey`. The FreeText writer resolves a key to the\n * current thread's id through {@link idFor} at authoring time.\n *\n * Lives in `engine-services` (not a worker host) so the browser Web Worker,\n * the Node `worker_thread` server, and any future direct-thread embedding\n * share the exact same binding — only the `PdfRuntimeModule` (WASM vs native)\n * differs.\n */\nexport class FontRegistrar {\n /**\n * File-access handles retained for path-registered fonts. PDFium range-reads\n * the file lazily (on each face creation), so the FPDF_FILEACCESS must stay\n * alive until the registry is cleared — same lifetime rule as a file-backed\n * base document. Closed in {@link clear}.\n */\n private readonly fileHandles: PdfFileAccessHandle[] = [];\n /** What the runtime resolved for each key: the identity a document names\n * the face by, and the licence. */\n private readonly identities = new Map<string, FontIdentityInfo>();\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n /** Host-owned `fontKey → native FontId` map for this thread. */\n private readonly ids: Map<string, number>,\n ) {}\n\n /**\n * Register a font from its bytes. Copies into the WASM heap, hands the\n * pointer to `EPDFFont_RegisterMemFont64` (which copies the bytes into the\n * native registry), then frees the scratch — so the heap holds exactly one\n * retained copy per registered font.\n *\n * Throws `InvalidArg` when the runtime rejects the font (corrupt, no glyphs).\n */\n register(\n fontKey: string,\n familyName: string,\n weight: number,\n italic: number,\n bytes: Uint8Array,\n ): void {\n if (bytes.byteLength === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, `empty font data: ${fontKey}`);\n }\n const { mem, fn } = this.runtime;\n const ptr = mem.alloc(bytes.byteLength);\n try {\n mem.writeBytes(ptr, bytes);\n const id = fn.EPDFFont_RegisterMemFont64(familyName, weight, italic, ptr, bytes.byteLength);\n if (id === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `font registration failed (unloadable or no glyphs): ${fontKey}`,\n );\n }\n this.ids.set(fontKey, id);\n this.identities.set(fontKey, this.readIdentity(id, { familyName, weight, italic }));\n } finally {\n mem.free(ptr);\n }\n }\n\n /**\n * Register a font from a local file via `EPDFFont_RegisterFont`. The runtime\n * range-reads the file on demand (it is not loaded into the JS heap), and the\n * file-access handle is retained until {@link clear}. Native/node only.\n *\n * Throws `InvalidArg` when the runtime rejects the font (corrupt, no glyphs).\n */\n registerFromNodeFile(\n fontKey: string,\n familyName: string,\n weight: number,\n italic: number,\n path: string,\n ): void {\n const access = this.runtime.fileAccess.fromNodeFile(path);\n let id = 0;\n try {\n id = this.runtime.fn.EPDFFont_RegisterFont(familyName, weight, italic, access.ptr);\n } catch (error) {\n access.close();\n throw error;\n }\n if (id === 0) {\n access.close();\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `font registration failed (unloadable or no glyphs): ${fontKey} (${path})`,\n );\n }\n this.ids.set(fontKey, id);\n this.identities.set(fontKey, this.readIdentity(id, { familyName, weight, italic }));\n this.fileHandles.push(access);\n }\n\n /** The identity and licence the runtime resolved for a key. Throws if unknown. */\n describe(fontKey: string): FontIdentityInfo {\n const identity = this.identities.get(fontKey);\n if (!identity) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `font not registered on this thread: ${fontKey}`,\n );\n }\n return identity;\n }\n\n /** {@link describe} for callers that treat an unknown key as \"not a key\". */\n describeOrUndefined(fontKey: string): FontIdentityInfo | undefined {\n return this.identities.get(fontKey);\n }\n\n /**\n * The key of the registered font whose identity matches a face (family\n * compared the engine's way; the closest weight, italic first), or\n * undefined when no registered family matches.\n */\n keyForFace(family: string, weight: number, italic: boolean): string | undefined {\n const wanted = familyKey(family);\n let best: { key: string; score: number } | undefined;\n for (const [key, identity] of this.identities) {\n if (familyKey(identity.familyName) !== wanted) continue;\n const score = Math.abs(identity.weight - weight) + (identity.italic === italic ? 0 : 1000);\n if (!best || score < best.score) best = { key, score };\n }\n return best?.key;\n }\n\n /** The application asserts a licence permitting editing with the font. */\n authorizeEditing(fontKey: string): FontIdentityInfo {\n const id = this.requireId(fontKey);\n if (!this.runtime.fn.EPDFFont_AuthorizeEditing(id)) {\n throw new EngineError(EngineErrorCode.InvalidArg, `authorizeEditing failed: ${fontKey}`);\n }\n const previous = this.describe(fontKey);\n const identity = this.readIdentity(id, {\n familyName: previous.familyName,\n weight: previous.weight,\n italic: previous.italic ? 1 : 0,\n });\n this.identities.set(fontKey, identity);\n return identity;\n }\n\n private readIdentity(\n id: number,\n given: { familyName: string; weight: number; italic: number },\n ): FontIdentityInfo {\n const { fn, mem } = this.runtime;\n // A runtime built before a getter existed reports what was given at\n // registration (its own inference stays unknown to the host). A missing\n // export surfaces as an absent binding or as a wrapper that throws when\n // called, so each read falls back on its own.\n const attempt = <T>(read: () => T, fallback: T): T => {\n try {\n return read();\n } catch {\n return fallback;\n }\n };\n return {\n familyName: attempt(\n () =>\n readUtf8String(mem, (buf, cap) => fn.EPDFFont_GetFamilyName(id, buf, cap)) ??\n given.familyName,\n given.familyName,\n ),\n weight: attempt(() => fn.EPDFFont_GetWeight(id), given.weight || 400),\n italic: attempt(() => fn.EPDFFont_IsItalic(id), given.italic === 1),\n embeddingPermission: attempt(\n () => permissionFromCode(fn.EPDFFont_GetEmbeddingPermission(id)),\n 'installable' as const,\n ),\n editingAuthorized: attempt(() => fn.EPDFFont_IsEditingAuthorized(id), true),\n instanced: attempt(() => fn.EPDFFont_IsInstanced(id), false),\n };\n }\n\n /**\n * Register host-owned startup fonts on this thread, in order, optionally\n * adding each to the fallback chain. Order matters: it fixes both the native\n * FontIds and the fallback precedence, so every worker thread that runs the\n * same list ends up identical.\n */\n registerStartup(specs: readonly StartupFontSpec[]): void {\n for (const spec of specs) {\n const italic = spec.italic === undefined ? -1 : spec.italic ? 1 : 0;\n this.registerFromNodeFile(\n spec.key,\n spec.familyName ?? '',\n spec.weight ?? 0,\n italic,\n spec.path,\n );\n if (spec.fallback) {\n this.addFallback(spec.key);\n }\n }\n }\n\n /** Append a registered font to the ordered glyph-fallback chain. */\n addFallback(fontKey: string): void {\n const id = this.requireId(fontKey);\n if (!this.runtime.fn.EPDFFont_AddFallbackFont(id)) {\n throw new EngineError(EngineErrorCode.InvalidArg, `addFallback failed: ${fontKey}`);\n }\n }\n\n clearFallbacks(): void {\n this.runtime.fn.EPDFFont_ClearFallbackFonts();\n }\n\n /** Unregister every font and reset the fallback chain (clears the map too). */\n clear(): void {\n this.runtime.fn.EPDFFont_ClearRegisteredFonts();\n this.ids.clear();\n this.identities.clear();\n // Native registry no longer reads through these — release the file handles.\n for (const access of this.fileHandles) {\n access.close();\n }\n this.fileHandles.length = 0;\n }\n\n /** Resolve a stable key to this thread's native FontId. Throws if unknown. */\n idFor(fontKey: string): number {\n return this.requireId(fontKey);\n }\n\n private requireId(fontKey: string): number {\n const id = this.ids.get(fontKey);\n if (id === undefined) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `font not registered on this thread: ${fontKey}`,\n );\n }\n return id;\n }\n}\n","import type { FormFieldRef } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport { readUtf16String } from '../../../runtime/memory/strings';\n\nexport interface ResolvedField {\n /** Index of the field in the native model. */\n fieldIndex: number;\n /** Indirect object number of the field dictionary; `0` for direct dicts. */\n fieldObjectNumber: number;\n}\n\n/**\n * Resolve a caller ref against the native model. `objectNumber` refs use\n * the model's reverse index; `fqn` refs compare fully qualified names.\n * Throws `NotFound` when nothing matches.\n */\nexport function resolveFieldRef(\n runtime: PdfRuntimeModule,\n model: Ptr,\n ref: FormFieldRef,\n): ResolvedField {\n const { fn } = runtime;\n if (ref.kind === 'objectNumber') {\n const fieldIndex = fn.EPDFForm_GetFieldIndexByObjNum(model, ref.fieldObjectNumber);\n if (fieldIndex < 0) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `form field not found: object ${ref.fieldObjectNumber}`,\n );\n }\n return { fieldIndex, fieldObjectNumber: ref.fieldObjectNumber };\n }\n\n const count = fn.EPDFForm_CountFields(model);\n for (let i = 0; i < count; i++) {\n const name =\n readUtf16String(runtime.mem, (buf, cap) => fn.EPDFForm_GetFieldName(model, i, buf, cap)) ??\n '';\n if (name === ref.name) {\n return { fieldIndex: i, fieldObjectNumber: fn.EPDFForm_GetFieldObjNum(model, i) };\n }\n }\n throw new EngineError(EngineErrorCode.NotFound, `form field not found: \"${ref.name}\"`);\n}\n","import type {\n FormDataFormat,\n FormFieldDTO,\n FormFieldRef,\n FormSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { withScratch } from '../../runtime/memory/scratch';\nimport { acquireFormModel } from './internal/formModelCache';\nimport { readFieldAt, readFormSnapshot } from './internal/readFormSnapshot';\nimport { resolveFieldRef } from './internal/resolveFieldRef';\n\n/**\n * Read side of the forms feature. All reads go through the session's\n * version-keyed model cache, so repeated reads between mutations reuse\n * one native snapshot build.\n */\nexport class FormReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n snapshot(signal: AbortSignal): FormSnapshot {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n return readFormSnapshot(this.runtime, model, this.session.requireDocPtr());\n }\n\n field(ref: FormFieldRef, signal: AbortSignal): FormFieldDTO {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n const { fieldIndex } = resolveFieldRef(this.runtime, model, ref);\n return readFieldAt(this.runtime, model, fieldIndex, this.session.requireDocPtr());\n }\n\n /**\n * Serialize form data. Exports read the reconciled view (recovered\n * fields included; on layers, promoted values win) straight from the\n * document — the model cache is not involved.\n */\n exportData(\n format: FormDataFormat,\n signal: AbortSignal,\n ): { format: FormDataFormat; bytes: ArrayBuffer } {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const call = format === 'fdf' ? fn.EPDFForm_ExportFDF : fn.EPDFForm_ExportXFDF;\n\n const length = call(docPtr, NULL_PTR, 0, NULL_PTR, 0);\n if (length <= 0) {\n throw new EngineError(EngineErrorCode.Unknown, `form ${format} export failed`);\n }\n return withScratch(mem, length, (buf) => {\n const written = call(docPtr, NULL_PTR, 0, buf, length);\n if (written !== length) {\n throw new EngineError(EngineErrorCode.Unknown, `form ${format} export failed`);\n }\n const view = mem.readBytes(buf, length);\n const bytes = new ArrayBuffer(view.byteLength);\n new Uint8Array(bytes).set(view);\n return { format, bytes };\n });\n }\n}\n","import type { WidgetPlacement } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../document-session/DocumentSession';\nimport { setAnnotRect } from '../../annotations/internal/write/annotationWritePrimitives';\nimport { applyWidgetStyle } from '../../annotations/internal/write/writeWidgetAnnotation';\n\nconst WIDGET_SUBTYPE_CODE = 20; // FPDF_ANNOT_WIDGET\n\n/**\n * Birth a widget through the annotation plane (EPDFPage_CreateAnnot -\n * indirect, durable object number), place it, and style it with THE\n * widget-plane writer (`applyWidgetStyle` - the same code the widget\n * annotation kind uses for create/patch). Returns the widget's object\n * number, ready for EPDFForm_AttachWidget adoption.\n */\nexport function createUnattachedWidget(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n placement: WidgetPlacement,\n): number {\n const { fn, mem } = runtime;\n const pool = session.pagePool();\n const pagePtr = pool.acquire(placement.pageObjectNumber);\n try {\n const annotPtr = fn.EPDFPage_CreateAnnot(pagePtr, WIDGET_SUBTYPE_CODE);\n if (annotPtr === NULL_PTR) {\n throw new EngineError(EngineErrorCode.Unknown, 'failed to create widget annotation');\n }\n try {\n setAnnotRect(fn, mem, annotPtr, placement.rect);\n if (placement.appearance) {\n applyWidgetStyle(fn, mem, annotPtr, placement.appearance);\n }\n const widgetObjectNumber = fn.EPDFAnnot_GetObjectNumber(annotPtr);\n if (widgetObjectNumber <= 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'widget annotation has no object number');\n }\n return widgetObjectNumber;\n } finally {\n fn.FPDFPage_CloseAnnot(annotPtr);\n }\n } finally {\n pool.release(placement.pageObjectNumber);\n }\n}\n","/**\n * /Ff bits writable through drafts and patches (1-based spec bit numbers).\n * Family-DEFINING bits (Radio 1<<15, Pushbutton 1<<16, Combo 1<<17) are set\n * once by EPDFForm_CreateField and immutable afterwards - the native\n * setter rejects them.\n */\nexport const FIELD_FLAG_BITS = {\n readOnly: 1 << 0,\n required: 1 << 1,\n noExport: 1 << 2,\n multiline: 1 << 12,\n password: 1 << 13,\n noToggleToOff: 1 << 14,\n edit: 1 << 18,\n multiSelect: 1 << 21,\n comb: 1 << 24,\n radiosInUnison: 1 << 25,\n} as const;\n\nexport type FieldFlagName = keyof typeof FIELD_FLAG_BITS;\n\n/**\n * Fold optional booleans into set/clear masks: `true` sets the bit,\n * `false` clears it, `undefined` leaves it alone.\n */\nexport function flagMasks(flags: Partial<Record<FieldFlagName, boolean | undefined>>): {\n setBits: number;\n clearBits: number;\n} {\n let setBits = 0;\n let clearBits = 0;\n for (const [name, bit] of Object.entries(FIELD_FLAG_BITS)) {\n const value = flags[name as FieldFlagName];\n if (value === true) setBits |= bit;\n else if (value === false) clearBits |= bit;\n }\n return { setBits, clearBits };\n}\n","import type {\n FormDataFormat,\n FormFieldDraft,\n FormFieldDTO,\n FormFieldPatch,\n FormFieldRef,\n FormFieldValue,\n FormImportResult,\n FormRepairResult,\n FormSetValueResult,\n FormWidgetRef,\n MutationMeta,\n WidgetPlacement,\n PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, fieldLockFor } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { withScratch, withScratchN } from '../../runtime/memory/scratch';\nimport { createUnattachedWidget } from './internal/authorWidget';\nimport { flagMasks } from './internal/fieldFlagBits';\nimport { acquireFormModel } from './internal/formModelCache';\nimport { bakeWidgetAppearance } from '../signature/internal/appearance';\nimport { readSignaturesFromModel, withSignatureModel } from '../signature/internal/readSignatureModel';\nimport { withWideStringArray } from './internal/wideStringArray';\nimport { readFieldAt, readFormSnapshot } from './internal/readFormSnapshot';\nimport { resolveFieldRef, type ResolvedField } from './internal/resolveFieldRef';\nimport { SignatureReader } from '../signature/SignatureReader';\nimport { readUtf16String } from '../../runtime/memory/strings';\n\n// Mirrors EPDF_FORMFIELD_FAMILY_* in public/epdf_form.h.\nconst FAMILY_CODE = {\n checkbox: 2,\n radio: 3,\n text: 4,\n combobox: 5,\n listbox: 6,\n signature: 7,\n} as const;\n\n/** Widgets a single value write can touch; far above any real form. */\nconst CHANGED_WIDGETS_CAPACITY = 256;\n\n// Mirrors EPDF_FORM_REPAIR_* in public/epdf_form.h.\nconst REPAIR_BAKE_APPEARANCES = 0x1;\n\n/**\n * Value writes are non-structural: no page-list revision bumps, and the\n * cloud layer computes its own cache delta server-side.\n */\nconst EMPTY_META: MutationMeta = { affectedPages: [], cacheDelta: null };\n\nconst FAMILY_BY_VALUE_TYPE: Record<FormFieldValue['type'], readonly string[]> = {\n text: ['text'],\n toggle: ['checkbox', 'radio'],\n choice: ['combobox', 'listbox'],\n};\n\n/**\n * Write side of the forms feature. Every method is a validate-then-apply\n * transaction over the native EPDFForm_* write API: a failed call leaves\n * the document untouched (on layers: nothing promoted), and each success\n * bumps the session's mutation sequence so version-keyed caches rebuild.\n */\nexport class FormMutator {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n setValue(ref: FormFieldRef, value: FormFieldValue, signal: AbortSignal): FormSetValueResult {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved);\n\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n const allowed = FAMILY_BY_VALUE_TYPE[value.type];\n if (!allowed.includes(before.family)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `value type '${value.type}' does not apply to a '${before.family}' field`,\n );\n }\n\n const changed = this.applyWrite(resolved.fieldObjectNumber, value);\n return this.readBack(resolved.fieldObjectNumber, changed);\n }\n\n reset(ref: FormFieldRef, signal: AbortSignal): FormSetValueResult {\n throwIfAborted(signal);\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved);\n\n const changed = this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_ResetField(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n buf,\n cap,\n countPtr,\n ),\n );\n if (changed === null) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'form field cannot be reset');\n }\n return this.readBack(resolved.fieldObjectNumber, changed);\n }\n\n importData(\n data: ArrayBuffer,\n format: FormDataFormat | undefined,\n signal: AbortSignal,\n ): FormImportResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const bytes = new Uint8Array(data);\n if (bytes.byteLength === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'empty form data payload');\n }\n const resolvedFormat = format ?? sniffFormat(bytes);\n const call = resolvedFormat === 'fdf' ? fn.EPDFForm_ImportFDF : fn.EPDFForm_ImportXFDF;\n const docPtr = this.session.requireDocPtr();\n\n const counters = withScratchN(mem, [bytes.byteLength, 16], ([dataPtr, resultPtr]) => {\n mem.writeBytes(dataPtr, bytes);\n const ok = call(docPtr, dataPtr, bytes.byteLength, resultPtr);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `payload is not valid ${resolvedFormat.toUpperCase()}`,\n );\n }\n return {\n fieldsTotal: Number(mem.peek(resultPtr, 'i32', 0)),\n fieldsApplied: Number(mem.peek(resultPtr, 'i32', 4)),\n fieldsSkipped: Number(mem.peek(resultPtr, 'i32', 8)),\n widgetsChanged: Number(mem.peek(resultPtr, 'i32', 12)),\n };\n });\n\n this.session.noteMutation();\n const fresh = acquireFormModel(this.runtime, this.session);\n return {\n ...counters,\n snapshot: readFormSnapshot(this.runtime, fresh, this.session.requireDocPtr()),\n meta: EMPTY_META,\n };\n }\n\n repair(bakeAppearances: boolean, signal: AbortSignal): FormRepairResult {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const flags = bakeAppearances ? REPAIR_BAKE_APPEARANCES : 0;\n\n const report = withScratch(mem, 24, (reportPtr) => {\n const ok = fn.EPDFForm_Repair(this.session.requireDocPtr(), flags, reportPtr);\n if (!ok) {\n throw new EngineError(EngineErrorCode.Unknown, 'form repair failed');\n }\n return {\n acroformCreated: Number(mem.peek(reportPtr, 'i32', 0)) !== 0,\n fieldsLinked: Number(mem.peek(reportPtr, 'i32', 4)),\n widgetsLinked: Number(mem.peek(reportPtr, 'i32', 8)),\n fieldsUnrepairable: Number(mem.peek(reportPtr, 'i32', 12)),\n appearancesBaked: Number(mem.peek(reportPtr, 'i32', 16)),\n needAppearancesCleared: Number(mem.peek(reportPtr, 'i32', 20)) !== 0,\n };\n });\n\n this.session.noteMutation();\n return { ...report, meta: EMPTY_META };\n }\n\n /**\n * Create a field and (optionally) its widgets in one composed\n * transaction: native field creation, widget birth through the\n * annotation plane, adoption, then field-plane setters. A failure\n * mid-composition throws; earlier steps stay applied (the document is\n * never inconsistent - at worst a partially configured field exists).\n */\n createField(draft: FormFieldDraft, signal: AbortSignal): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const placements = this.placementsOf(draft);\n if (draft.family === 'radio') {\n for (const placement of placements) {\n if (!placement.onState || placement.onState === 'Off') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'every radio widget needs a non-\"Off\" onState',\n );\n }\n }\n }\n\n const familyCode = FAMILY_CODE[draft.family];\n const namePtr = mem.writeU16String(draft.name);\n let fieldObjectNumber: number;\n try {\n fieldObjectNumber = fn.EPDFForm_CreateField(docPtr, familyCode, namePtr);\n } finally {\n mem.free(namePtr);\n }\n if (fieldObjectNumber <= 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `cannot create field \"${draft.name}\" (name conflict or invalid)`,\n );\n }\n\n const { setBits, clearBits } = flagMasks(\n draft as unknown as Record<string, boolean | undefined>,\n );\n if (setBits !== 0 || clearBits !== 0) {\n fn.EPDFForm_SetFieldFlags(docPtr, fieldObjectNumber, setBits, clearBits);\n }\n if ('options' in draft && draft.options) {\n this.applyOptions(fieldObjectNumber, draft.options);\n }\n if ('defaultValue' in draft && draft.defaultValue !== undefined) {\n this.applyDefaultValues(fieldObjectNumber, [draft.defaultValue]);\n }\n if ('maxLength' in draft && draft.maxLength !== undefined) {\n if (!fn.EPDFForm_SetFieldMaxLen(docPtr, fieldObjectNumber, draft.maxLength)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'maxLength rejected');\n }\n }\n if (draft.alternateName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldAlternateName,\n fieldObjectNumber,\n draft.alternateName,\n 'alternate name rejected',\n );\n }\n if (draft.mappingName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldMappingName,\n fieldObjectNumber,\n draft.mappingName,\n 'mapping name rejected',\n );\n }\n\n for (const placement of placements) {\n const widgetObjectNumber = createUnattachedWidget(this.runtime, this.session, placement);\n const onState =\n draft.family === 'radio'\n ? placement.onState!\n : draft.family === 'checkbox'\n ? (placement.onState ?? 'Yes')\n : '';\n if (!fn.EPDFForm_AttachWidget(docPtr, fieldObjectNumber, widgetObjectNumber, onState)) {\n throw new EngineError(EngineErrorCode.Unknown, 'widget adoption failed');\n }\n }\n\n this.session.noteMutation();\n return { field: this.readBackField(fieldObjectNumber) };\n }\n\n /**\n * Draw a PDF page into every widget of an UNSIGNED signature field: the\n * visual \"sign\" of a viewer without a signer. The field's value stays\n * empty and nothing is sealed; a signed field is refused (its appearance\n * is part of what the signature covers). Pages whose widgets changed are\n * reported so their renders re-pin.\n */\n setSignatureAppearance(\n ref: FormFieldRef,\n pdf: Uint8Array,\n pageIndex: number,\n signal: AbortSignal,\n ): { field: FormFieldDTO; pages: PageObjectNumber[] } {\n throwIfAborted(signal);\n const docPtr = this.session.requireDocPtr();\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved);\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, docPtr);\n if (before.family !== 'signature') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `'${before.name}' is a ${before.family} field, not a signature field`,\n );\n }\n const signed = withSignatureModel(this.runtime, docPtr, (signatures) =>\n readSignaturesFromModel(this.runtime, signatures).some(\n (s) =>\n s.signed &&\n s.field.kind === 'objectNumber' &&\n s.field.fieldObjectNumber === resolved.fieldObjectNumber,\n ),\n );\n if (signed) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `'${before.name}' is signed; its appearance is sealed with the signature`,\n );\n }\n if (before.widgets.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, `'${before.name}' has no widget to draw into`);\n }\n for (const widget of before.widgets) {\n bakeWidgetAppearance(this.runtime, docPtr, widget, pdf, pageIndex);\n }\n this.session.noteMutation();\n const pages = [...new Set(before.widgets.map((w) => w.pageObjectNumber))];\n for (const pon of pages) this.session.bumpRevision(pon);\n return { field: this.readBackField(resolved.fieldObjectNumber), pages };\n }\n\n updateField(\n ref: FormFieldRef,\n patch: FormFieldPatch,\n signal: AbortSignal,\n ): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved);\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n if (before.family !== patch.family) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `patch family '${patch.family}' does not match field family '${before.family}'`,\n );\n }\n const fieldObjectNumber = resolved.fieldObjectNumber;\n\n if (patch.name !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldName,\n fieldObjectNumber,\n patch.name,\n `cannot rename to \"${patch.name}\" (sibling conflict or invalid)`,\n );\n }\n const { setBits, clearBits } = flagMasks(\n patch as unknown as Record<string, boolean | undefined>,\n );\n if (setBits !== 0 || clearBits !== 0) {\n if (!fn.EPDFForm_SetFieldFlags(docPtr, fieldObjectNumber, setBits, clearBits)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'flag update rejected');\n }\n }\n if ('maxLength' in patch && patch.maxLength !== undefined) {\n if (!fn.EPDFForm_SetFieldMaxLen(docPtr, fieldObjectNumber, patch.maxLength ?? 0)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'maxLength rejected (current value exceeds it)',\n );\n }\n }\n if ('defaultValue' in patch && patch.defaultValue !== undefined) {\n if (patch.defaultValue === null) {\n if (!fn.EPDFForm_RemoveFieldDefaultValue(docPtr, fieldObjectNumber)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'default value removal rejected');\n }\n } else {\n this.applyDefaultValues(fieldObjectNumber, [patch.defaultValue]);\n }\n }\n if (patch.alternateName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldAlternateName,\n fieldObjectNumber,\n patch.alternateName ?? '',\n 'alternate name rejected',\n );\n }\n if (patch.mappingName !== undefined) {\n this.applyWideSetter(\n fn.EPDFForm_SetFieldMappingName,\n fieldObjectNumber,\n patch.mappingName ?? '',\n 'mapping name rejected',\n );\n }\n if ('options' in patch && patch.options) {\n this.applyOptions(fieldObjectNumber, patch.options);\n }\n\n this.session.noteMutation();\n return { field: this.readBackField(fieldObjectNumber) };\n }\n\n /**\n * Delete a terminal field. Widgets are DETACHED here (they become inert\n * annotations); the worker host cascades their annotation deletion so\n * page /Annots bookkeeping flows through the annotation feature.\n */\n deleteField(\n ref: FormFieldRef,\n signal: AbortSignal,\n ): { deletedFieldObjectNumber: number; detachedWidgets: FormWidgetRef[] } {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved);\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n\n const ok = withScratchN(mem, [256 * 4, 4], ([buf, countPtr]) => {\n mem.poke(countPtr, 'i32', 0);\n return fn.EPDFForm_DeleteField(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n buf,\n 256,\n countPtr,\n );\n });\n if (!ok) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'field cannot be deleted');\n }\n\n this.session.noteMutation();\n return {\n deletedFieldObjectNumber: resolved.fieldObjectNumber,\n detachedWidgets: before.widgets.map((w) => ({\n annotObjectNumber: w.annotObjectNumber,\n pageObjectNumber: w.pageObjectNumber,\n })),\n };\n }\n\n attachWidget(\n ref: FormFieldRef,\n widget: FormWidgetRef,\n onState: string | undefined,\n signal: AbortSignal,\n ): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved);\n const before = readFieldAt(this.runtime, model, resolved.fieldIndex, this.session.requireDocPtr());\n const toggle = before.family === 'checkbox' || before.family === 'radio';\n const state = toggle ? (onState ?? (before.family === 'checkbox' ? 'Yes' : '')) : '';\n if (toggle && (!state || state === 'Off')) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'attaching to a radio group needs a non-\"Off\" onState',\n );\n }\n if (\n !fn.EPDFForm_AttachWidget(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n widget.annotObjectNumber,\n state,\n )\n ) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'widget cannot be adopted (already attached, merged, or not a widget)',\n );\n }\n this.session.noteMutation();\n return { field: this.readBackField(resolved.fieldObjectNumber) };\n }\n\n detachWidget(\n ref: FormFieldRef,\n widget: FormWidgetRef,\n signal: AbortSignal,\n ): { field: FormFieldDTO } {\n throwIfAborted(signal);\n const { fn } = this.runtime;\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = resolveFieldRef(this.runtime, model, ref);\n this.assertWritable(resolved);\n if (\n !fn.EPDFForm_DetachWidget(\n this.session.requireDocPtr(),\n resolved.fieldObjectNumber,\n widget.annotObjectNumber,\n )\n ) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'widget is not attached to this field');\n }\n this.session.noteMutation();\n return { field: this.readBackField(resolved.fieldObjectNumber) };\n }\n\n private placementsOf(draft: FormFieldDraft): WidgetPlacement[] {\n if (draft.family === 'radio') {\n return draft.widgets ?? [];\n }\n return draft.widget ? [draft.widget] : [];\n }\n\n private applyOptions(\n fieldObjectNumber: number,\n options: ReadonlyArray<{ label: string; value: string }>,\n ): void {\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const ok = withWideStringArray(\n this.runtime,\n options.map((o) => o.label),\n (labelsPtr) =>\n withWideStringArray(\n this.runtime,\n options.map((o) => o.value),\n (exportsPtr, count) =>\n fn.EPDFForm_SetFieldOptions(docPtr, fieldObjectNumber, labelsPtr, exportsPtr, count),\n ),\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'options rejected');\n }\n }\n\n private applyWideSetter(\n setter: (docPtr: Ptr, fieldObjectNumber: number, valuePtr: Ptr) => boolean,\n fieldObjectNumber: number,\n value: string,\n errorMessage: string,\n ): void {\n const { mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const valuePtr = mem.writeU16String(value);\n try {\n if (!setter(docPtr, fieldObjectNumber, valuePtr)) {\n throw new EngineError(EngineErrorCode.InvalidArg, errorMessage);\n }\n } finally {\n mem.free(valuePtr);\n }\n }\n\n private applyDefaultValues(fieldObjectNumber: number, values: readonly string[]): void {\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const ok = withWideStringArray(this.runtime, values, (valuesPtr, count) =>\n fn.EPDFForm_SetFieldDefaultValues(docPtr, fieldObjectNumber, valuesPtr, count),\n );\n if (!ok) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'default value rejected');\n }\n }\n\n private readBackField(fieldObjectNumber: number): FormFieldDTO {\n const fresh = acquireFormModel(this.runtime, this.session);\n const fieldIndex = this.runtime.fn.EPDFForm_GetFieldIndexByObjNum(fresh, fieldObjectNumber);\n if (fieldIndex < 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'form field vanished after write');\n }\n return readFieldAt(this.runtime, fresh, fieldIndex, this.session.requireDocPtr());\n }\n\n private assertWritable(resolved: ResolvedField): void {\n if (resolved.fieldObjectNumber === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'form field is stored as a direct object and cannot be written',\n );\n }\n this.assertNotLockedBySignature(resolved);\n }\n\n /**\n * A field an earlier signature froze (its FieldMDP, or the /Lock of a\n * signed field) refuses every write: document-derived authority, the\n * same way encryption bits are. Off under `signedDocumentPolicy:\n * 'permit'`. A document whose signature model cannot be built is not\n * known to be locked.\n */\n private assertNotLockedBySignature(resolved: ResolvedField): void {\n if (this.session.signedDocumentPolicy !== 'protect') return;\n let protection;\n try {\n protection = new SignatureReader(this.runtime, this.session).readProtection();\n } catch {\n return;\n }\n if (protection.fieldLocks.length === 0) return;\n const model = acquireFormModel(this.runtime, this.session);\n const name =\n readUtf16String(this.runtime.mem, (buf, cap) =>\n this.runtime.fn.EPDFForm_GetFieldName(model, resolved.fieldIndex, buf, cap),\n ) ?? '';\n const lock = fieldLockFor(protection, name);\n if (lock) {\n throw new EngineError(\n EngineErrorCode.ProtectedDocument,\n `form field \"${name}\" is locked by signature ${lock.signatureIndex} (${lock.source === 'fieldmdp' ? 'FieldMDP' : '/Lock'})`,\n );\n }\n }\n\n /** Dispatch the typed native write. Returns the changed widget objnums. */\n private applyWrite(fieldObjectNumber: number, value: FormFieldValue): number[] {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n\n const changed = this.withChangedWidgets((buf, cap, countPtr) => {\n switch (value.type) {\n default:\n throw new EngineError(EngineErrorCode.InvalidArg, 'unknown form value type');\n case 'text': {\n const textPtr = mem.writeU16String(value.value);\n try {\n return fn.EPDFForm_SetTextValue(docPtr, fieldObjectNumber, textPtr, buf, cap, countPtr);\n } finally {\n mem.free(textPtr);\n }\n }\n case 'toggle':\n // Empty string clears the group, same as the C API's NULL.\n return fn.EPDFForm_SetToggle(\n docPtr,\n fieldObjectNumber,\n value.state ?? '',\n buf,\n cap,\n countPtr,\n );\n case 'choice':\n return withWideStringArray(this.runtime, value.values, (arrayPtr, count) =>\n fn.EPDFForm_SetChoiceValues(\n docPtr,\n fieldObjectNumber,\n arrayPtr,\n count,\n buf,\n cap,\n countPtr,\n ),\n );\n }\n });\n\n if (changed === null) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'form value rejected (unknown toggle state, length limit, or non-option choice)',\n );\n }\n return changed;\n }\n\n /** Run a native write with the changed-widgets out buffer wired up. */\n private withChangedWidgets(\n call: (buf: Ptr, cap: number, countPtr: Ptr) => boolean,\n ): number[] | null {\n const { mem } = this.runtime;\n return withScratchN(mem, [CHANGED_WIDGETS_CAPACITY * 4, 4], ([buf, countPtr]) => {\n mem.poke(countPtr, 'i32', 0);\n if (!call(buf, CHANGED_WIDGETS_CAPACITY, countPtr)) {\n return null;\n }\n const total = Number(mem.peek(countPtr, 'i32'));\n const reported = Math.min(total, CHANGED_WIDGETS_CAPACITY);\n const changed: number[] = [];\n for (let i = 0; i < reported; i++) {\n changed.push(Number(mem.peek(buf, 'i32', i * 4)));\n }\n return changed;\n });\n }\n\n /** Bump the session version, rebuild the model, and read the field back. */\n private readBack(fieldObjectNumber: number, changedObjNums: number[]): FormSetValueResult {\n this.session.noteMutation();\n const fresh = acquireFormModel(this.runtime, this.session);\n const fieldIndex = this.runtime.fn.EPDFForm_GetFieldIndexByObjNum(fresh, fieldObjectNumber);\n if (fieldIndex < 0) {\n throw new EngineError(EngineErrorCode.Unknown, 'form field vanished after write');\n }\n const field: FormFieldDTO = readFieldAt(\n this.runtime,\n fresh,\n fieldIndex,\n this.session.requireDocPtr(),\n );\n const changedSet = new Set(changedObjNums);\n const changedWidgets: FormWidgetRef[] = field.widgets\n .filter((w) => changedSet.has(w.annotObjectNumber))\n .map((w) => ({\n annotObjectNumber: w.annotObjectNumber,\n pageObjectNumber: w.pageObjectNumber,\n }));\n return { field, changedWidgets, meta: EMPTY_META };\n }\n}\n\n/** `%FDF-…` payloads are FDF; anything starting with markup is XFDF. */\nfunction sniffFormat(bytes: Uint8Array): FormDataFormat {\n for (let i = 0; i < Math.min(bytes.length, 64); i++) {\n const c = bytes[i];\n // Skip UTF-8 BOM and whitespace.\n if (c === 0xef || c === 0xbb || c === 0xbf) continue;\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d) continue;\n return c === 0x3c /* '<' */ ? 'xfdf' : 'fdf';\n }\n return 'fdf';\n}\n","import type {\n FormEffect,\n FormEffectResult,\n FormEffectsResult,\n FormFieldDTO,\n FormFieldRef,\n FormFieldValue,\n FormWidgetRef,\n MutationMeta,\n} from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode, serializeError } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { withScratchN } from '../../runtime/memory/scratch';\nimport { throwIfAborted } from '../../shared/abort';\nimport { acquireFormModel } from './internal/formModelCache';\nimport { readFieldAt } from './internal/readFormSnapshot';\nimport { resolveFieldRef } from './internal/resolveFieldRef';\nimport { withWideStringArray } from './internal/wideStringArray';\nimport { ActionReadBudgetTracker } from '../actions/ActionModelReader';\n\nconst CHANGED_WIDGETS_CAPACITY = 1024;\nconst EMPTY_META: MutationMeta = { affectedPages: [], cacheDelta: null };\nconst DISPLAY_CODE = { visible: 0, hidden: 1, noPrint: 2, noView: 3 } as const;\n\ninterface PreflightEffect {\n effect: FormEffect;\n fieldObjectNumbers: number[];\n fields: FormFieldDTO[];\n error?: ReturnType<typeof serializeError>;\n}\n\ninterface NativeEffectResult {\n ok: boolean;\n changedWidgetObjectNumbers: number[];\n}\n\n/** Ordered, non-rollback-atomic sink for one committed client script run. */\nexport class FormsEffectsApplier {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n apply(effects: FormEffect[], signal: AbortSignal): FormEffectsResult {\n throwIfAborted(signal);\n const preflightActionBudget = new ActionReadBudgetTracker();\n const resultActionBudget = new ActionReadBudgetTracker();\n const preflight = effects.map((effect) => this.preflight(effect, preflightActionBudget));\n const results: FormEffectResult[] = [];\n const allChangedWidgets = new Map<string, FormWidgetRef>();\n let mustFinalize = false;\n let stop = false;\n\n for (let index = 0; index < preflight.length; index++) {\n const item = preflight[index];\n if (stop || (signal.aborted && mustFinalize)) {\n stop = true;\n results.push(emptyResult(index, 'skipped'));\n continue;\n }\n if (signal.aborted) throwIfAborted(signal);\n if (item.error) {\n results.push({\n ...emptyResult(index, 'rejected'),\n fields: item.fields,\n error: item.error,\n });\n continue;\n }\n\n let before: FormFieldDTO[];\n try {\n before = item.fieldObjectNumbers.map((objectNumber) => this.readField(objectNumber));\n } catch (error) {\n // No write has happened for this effect. A race between preflight and\n // apply is a rejection unless an earlier effect already landed.\n const status = mustFinalize ? 'failed' : 'rejected';\n results.push({ ...emptyResult(index, status), error: serializeError(error) });\n if (status === 'failed') stop = true;\n continue;\n }\n\n if (isNoOp(item.effect, before)) {\n results.push({ ...emptyResult(index, 'unchanged'), fields: before });\n continue;\n }\n\n try {\n const native = this.applyNative(item.effect, item.fieldObjectNumbers);\n if (!native.ok) {\n // Native false is outcome-indeterminate at this layer. Finalize the\n // session and stop; compounding writes would make recovery harder.\n mustFinalize = true;\n this.session.noteMutation();\n const fields = this.readFieldsBestEffort(item.fieldObjectNumbers, resultActionBudget);\n const changedWidgets = widgetRefs(native.changedWidgetObjectNumbers, before, fields);\n rememberWidgets(allChangedWidgets, changedWidgets);\n results.push({\n index,\n status: 'failed',\n fields,\n changedWidgets,\n error: serializeError(\n new EngineError(EngineErrorCode.Unknown, 'native form effect failed after preflight'),\n ),\n });\n stop = true;\n continue;\n }\n\n const applied = effectChangedState(item.effect, before, native.changedWidgetObjectNumbers);\n if (!applied) {\n results.push({ ...emptyResult(index, 'unchanged'), fields: before });\n continue;\n }\n\n mustFinalize = true;\n this.session.noteMutation();\n const fields = this.readFieldsBestEffort(item.fieldObjectNumbers, resultActionBudget);\n const changedWidgets = widgetRefs(native.changedWidgetObjectNumbers, before, fields);\n rememberWidgets(allChangedWidgets, changedWidgets);\n results.push({ index, status: 'applied', fields, changedWidgets });\n } catch (error) {\n mustFinalize = true;\n this.session.noteMutation();\n results.push({\n index,\n status: 'failed',\n fields: this.readFieldsBestEffort(item.fieldObjectNumbers, resultActionBudget),\n changedWidgets: [],\n error: serializeError(error),\n });\n stop = true;\n }\n }\n\n return {\n results,\n changedWidgets: [...allChangedWidgets.values()],\n meta: mustFinalize ? EMPTY_META : null,\n };\n }\n\n private preflight(effect: FormEffect, actionBudget: ActionReadBudgetTracker): PreflightEffect {\n try {\n const refs = effect.kind === 'reset' ? effect.refs : [effect.ref];\n if (refs.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'reset effect requires at least one field',\n );\n }\n const model = acquireFormModel(this.runtime, this.session);\n const resolved = refs.map((ref) => this.resolve(model, ref));\n const fields = resolved.map(({ fieldIndex }) =>\n readFieldAt(this.runtime, model, fieldIndex, this.session.requireDocPtr(), actionBudget),\n );\n validateEffect(effect, fields);\n return {\n effect,\n fieldObjectNumbers: resolved.map(({ fieldObjectNumber }) => fieldObjectNumber),\n fields,\n };\n } catch (error) {\n return { effect, fieldObjectNumbers: [], fields: [], error: serializeError(error) };\n }\n }\n\n private resolve(\n model: Ptr,\n ref: FormFieldRef,\n ): { fieldIndex: number; fieldObjectNumber: number } {\n const resolved = resolveFieldRef(this.runtime, model, ref);\n if (resolved.fieldObjectNumber <= 0) {\n throw new EngineError(\n EngineErrorCode.InvalidReference,\n 'direct-object form fields cannot be mutated',\n );\n }\n return resolved;\n }\n\n private readField(\n fieldObjectNumber: number,\n actionBudget = new ActionReadBudgetTracker(),\n ): FormFieldDTO {\n const model = acquireFormModel(this.runtime, this.session);\n const index = this.runtime.fn.EPDFForm_GetFieldIndexByObjNum(model, fieldObjectNumber);\n if (index < 0) {\n throw new EngineError(EngineErrorCode.InvalidReference, 'form field disappeared');\n }\n return readFieldAt(this.runtime, model, index, this.session.requireDocPtr(), actionBudget);\n }\n\n private readFieldsBestEffort(\n fieldObjectNumbers: number[],\n actionBudget: ActionReadBudgetTracker,\n ): FormFieldDTO[] {\n const fields: FormFieldDTO[] = [];\n for (const objectNumber of fieldObjectNumbers) {\n try {\n fields.push(this.readField(objectNumber, actionBudget));\n } catch {\n // The result vocabulary already marks the effect failed. Never throw\n // here: landed state still has to reach WorkerHost.finishMutation().\n }\n }\n return fields;\n }\n\n private applyNative(effect: FormEffect, fieldObjectNumbers: number[]): NativeEffectResult {\n if (effect.kind === 'reset') {\n const changed: number[] = [];\n for (const objectNumber of fieldObjectNumbers) {\n const result = this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_ResetField(\n this.session.requireDocPtr(),\n objectNumber,\n buf,\n cap,\n countPtr,\n ),\n );\n changed.push(...result.changedWidgetObjectNumbers);\n if (!result.ok) return { ok: false, changedWidgetObjectNumbers: changed };\n }\n return { ok: true, changedWidgetObjectNumbers: changed };\n }\n\n const objectNumber = fieldObjectNumbers[0];\n switch (effect.kind) {\n case 'setValue':\n return this.applyValue(objectNumber, effect.value);\n case 'setDisplay':\n return this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_SetFieldDisplay(\n this.session.requireDocPtr(),\n objectNumber,\n DISPLAY_CODE[effect.display],\n buf,\n cap,\n countPtr,\n ),\n );\n case 'setAppearanceText': {\n const textPtr = this.runtime.mem.writeU16String(effect.text);\n try {\n return this.withChangedWidgets((buf, cap, countPtr) =>\n this.runtime.fn.EPDFForm_SetFieldAppearanceText(\n this.session.requireDocPtr(),\n objectNumber,\n textPtr,\n buf,\n cap,\n countPtr,\n ),\n );\n } finally {\n this.runtime.mem.free(textPtr);\n }\n }\n }\n }\n\n private applyValue(fieldObjectNumber: number, value: FormFieldValue): NativeEffectResult {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n return this.withChangedWidgets((buf, cap, countPtr) => {\n if (value.type === 'toggle') {\n return fn.EPDFForm_SetToggle(\n docPtr,\n fieldObjectNumber,\n value.state ?? '',\n buf,\n cap,\n countPtr,\n );\n }\n if (value.type === 'choice') {\n return withWideStringArray(this.runtime, value.values, (valuesPtr, count) =>\n fn.EPDFForm_SetChoiceValues(\n docPtr,\n fieldObjectNumber,\n valuesPtr,\n count,\n buf,\n cap,\n countPtr,\n ),\n );\n }\n const valuePtr = mem.writeU16String(value.value);\n try {\n return fn.EPDFForm_SetTextValue(docPtr, fieldObjectNumber, valuePtr, buf, cap, countPtr);\n } finally {\n mem.free(valuePtr);\n }\n });\n }\n\n private withChangedWidgets(\n call: (buf: Ptr, cap: number, countPtr: Ptr) => boolean,\n ): NativeEffectResult {\n const { mem } = this.runtime;\n return withScratchN(mem, [CHANGED_WIDGETS_CAPACITY * 4, 4], ([buf, countPtr]) => {\n mem.poke(countPtr, 'i32', 0);\n const ok = call(buf, CHANGED_WIDGETS_CAPACITY, countPtr);\n const count = Math.min(\n Math.max(0, Number(mem.peek(countPtr, 'i32'))),\n CHANGED_WIDGETS_CAPACITY,\n );\n const changedWidgetObjectNumbers: number[] = [];\n for (let index = 0; index < count; index++) {\n changedWidgetObjectNumbers.push(Number(mem.peek(buf, 'i32', index * 4)));\n }\n return { ok, changedWidgetObjectNumbers };\n });\n }\n}\n\nfunction validateEffect(effect: FormEffect, fields: FormFieldDTO[]): void {\n if (effect.kind === 'reset') {\n for (const field of fields) {\n if (field.family === 'pushbutton' || field.family === 'signature') {\n throw new EngineError(EngineErrorCode.InvalidArg, `${field.family} fields cannot be reset`);\n }\n }\n return;\n }\n const field = fields[0];\n if (effect.kind === 'setAppearanceText') {\n if (field.family !== 'text' && field.family !== 'combobox') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `appearance text does not apply to a ${field.family} field`,\n );\n }\n return;\n }\n if (effect.kind === 'setDisplay') return;\n validateValue(field, effect.value);\n}\n\nfunction validateValue(field: FormFieldDTO, value: FormFieldValue): void {\n if (value.type === 'text') {\n if (field.family !== 'text') mismatch(field, value);\n return;\n }\n if (value.type === 'toggle') {\n if (field.family !== 'checkbox' && field.family !== 'radio') mismatch(field, value);\n if (value.state !== null && !field.widgets.some((widget) => widget.onState === value.state)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'unknown toggle appearance state');\n }\n return;\n }\n if (field.family !== 'combobox' && field.family !== 'listbox') mismatch(field, value);\n if (new Set(value.values).size !== value.values.length) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'choice values must not contain duplicates');\n }\n if (field.family === 'combobox' && value.values.length > 1) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'combo boxes accept at most one value');\n }\n if (field.family === 'listbox' && !field.multiSelect && value.values.length > 1) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'single-select list boxes accept one value');\n }\n const optionValues = new Set(field.options.map((option) => option.value));\n const freeText = field.family === 'combobox' && field.edit && value.values.length === 1;\n if (!freeText && value.values.some((entry) => !optionValues.has(entry))) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'choice value is not a field option');\n }\n}\n\nfunction mismatch(field: FormFieldDTO, value: FormFieldValue): never {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `value type '${value.type}' does not apply to a '${field.family}' field`,\n );\n}\n\nfunction isNoOp(effect: FormEffect, fields: FormFieldDTO[]): boolean {\n if (effect.kind === 'setAppearanceText') return fields[0].widgets.length === 0;\n if (effect.kind === 'setDisplay') return fields[0].widgets.length === 0;\n if (effect.kind === 'reset') {\n return fields.every((field) => valueEntriesEqual(field.valueEntry, field.defaultValueEntry));\n }\n const field = fields[0];\n const value = effect.value;\n if (value.type === 'text' && field.family === 'text') return field.value === value.value;\n if (value.type === 'toggle' && (field.family === 'checkbox' || field.family === 'radio')) {\n return field.widgets.every((widget) => widget.checked === (widget.onState === value.state));\n }\n if (value.type === 'choice' && field.family === 'combobox') {\n return value.values.length === 0 ? field.value === '' : field.value === value.values[0];\n }\n if (value.type === 'choice' && field.family === 'listbox') {\n return arraysEqual(field.selectedValues, value.values);\n }\n return false;\n}\n\nfunction effectChangedState(\n effect: FormEffect,\n before: FormFieldDTO[],\n changedWidgetObjectNumbers: number[],\n): boolean {\n if (effect.kind === 'setDisplay' || effect.kind === 'setAppearanceText') {\n return changedWidgetObjectNumbers.length > 0;\n }\n return !isNoOp(effect, before) || changedWidgetObjectNumbers.length > 0;\n}\n\nfunction valueEntriesEqual(\n left: FormFieldDTO['valueEntry'],\n right: FormFieldDTO['defaultValueEntry'],\n): boolean {\n if (left.kind !== right.kind) return false;\n if (left.kind === 'scalar' && right.kind === 'scalar') return left.value === right.value;\n if (left.kind === 'array' && right.kind === 'array')\n return arraysEqual(left.values, right.values);\n return true;\n}\n\nfunction arraysEqual(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((entry, index) => entry === right[index]);\n}\n\nfunction widgetRefs(\n objectNumbers: number[],\n before: FormFieldDTO[],\n after: FormFieldDTO[],\n): FormWidgetRef[] {\n const byObjectNumber = new Map<number, FormWidgetRef>();\n for (const field of [...before, ...after]) {\n for (const widget of field.widgets) byObjectNumber.set(widget.annotObjectNumber, widget);\n }\n return [...new Set(objectNumbers)]\n .map((objectNumber) => byObjectNumber.get(objectNumber))\n .filter((widget): widget is FormWidgetRef => widget !== undefined)\n .map(({ annotObjectNumber, pageObjectNumber }) => ({ annotObjectNumber, pageObjectNumber }));\n}\n\nfunction rememberWidgets(target: Map<string, FormWidgetRef>, widgets: FormWidgetRef[]): void {\n for (const widget of widgets) {\n target.set(`${widget.pageObjectNumber}:${widget.annotObjectNumber}`, widget);\n }\n}\n\nfunction emptyResult(index: number, status: FormEffectResult['status']): FormEffectResult {\n return { index, status, fields: [], changedWidgets: [] };\n}\n","import type { FoldedText, PageObjectNumber, PageTextSnapshot } from '@embedpdf/engine-core/runtime';\nimport { foldText } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../../document-session/DocumentSession';\nimport { PageTextReader } from '../../text/PageTextReader';\n\nexport interface PageCorpus {\n /** Default-fold (`{}`) corpus; `folded.original` IS `snapshot.text`. */\n folded: FoldedText;\n /**\n * The page text snapshot the corpus was folded from — carried so match\n * ranges (text space) can be converted to CHARACTER space via the\n * engine-core charmap helpers without re-reading the page.\n */\n snapshot: PageTextSnapshot;\n}\n\ninterface PageCorpusEntry extends PageCorpus {\n /** The session mutation sequence the entry was built at. */\n seq: number;\n}\n\n/**\n * Per-session, per-page search corpus: the page's text snapshot plus its\n * DEFAULT fold (the one literal queries with default options search).\n * This is the local engine's in-memory equivalent of the server's corpus\n * artifacts — same fold version, same shape, built lazily on first search\n * and reused across slices and re-queries.\n *\n * Version-keyed on `DocumentSession.mutationSeq()` per PAGE (not per\n * session): a form fill or annotation edit bumps the sequence, and only\n * the pages actually re-read after that pay the re-extraction — untouched\n * cache entries for other pages are refreshed lazily as they're revisited.\n *\n * Capped: search touches every page of arbitrarily large documents, so\n * entries evict in insertion order past `MAX_CACHED_PAGES` (text of ~500\n * pages ≈ a few MB — bounded regardless of document size).\n */\nconst MAX_CACHED_PAGES = 512;\n\nconst cache = new WeakMap<DocumentSession, Map<PageObjectNumber, PageCorpusEntry>>();\n\nexport function acquirePageCorpus(\n runtime: PdfRuntimeModule,\n session: DocumentSession,\n pageObjectNumber: PageObjectNumber,\n signal: AbortSignal,\n): PageCorpus {\n const seq = session.mutationSeq();\n let pages = cache.get(session);\n if (!pages) {\n pages = new Map();\n cache.set(session, pages);\n }\n\n const hit = pages.get(pageObjectNumber);\n if (hit && hit.seq === seq) return hit;\n\n const snapshot = new PageTextReader(runtime, session).read(pageObjectNumber, signal);\n const entry: PageCorpusEntry = { seq, folded: foldText(snapshot.text), snapshot };\n\n pages.delete(pageObjectNumber); // re-insert = most recently used\n pages.set(pageObjectNumber, entry);\n if (pages.size > MAX_CACHED_PAGES) {\n const oldest = pages.keys().next().value;\n if (oldest !== undefined) pages.delete(oldest);\n }\n return entry;\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport type { SearchQuery, SearchRequest } from '@embedpdf/engine-core/runtime';\n\n/**\n * The local engine's resume cursor. Opaque to callers by contract; JSON\n * under the hood because a local cursor never crosses a trust boundary\n * (the server mints its own, authenticated, format for the wire).\n *\n * A cursor pins three things and refuses to resume if any moved:\n * - the query+mode identity (`key`) — a cursor is not transferable\n * between queries,\n * - the document version (`seq`) — resuming over mutated content could\n * serve stale pages or, worse, text a redaction just removed,\n * - the scan origin (`start`) — position is meaningless in a different\n * page order.\n */\nexport interface SearchCursorState {\n v: 1;\n seq: number;\n key: string;\n /** startPage pon the scan order was rotated to (0 = natural order). */\n start: number;\n /** Pages of the scan order already consumed. */\n scanned: number;\n}\n\n/** Stable identity for query + mode (option order pinned by hand). */\nexport function searchQueryKey(query: SearchQuery, mode: string): string {\n return JSON.stringify([\n query.regex ? 'r' : 'l',\n query.text,\n query.matchCase ? 1 : 0,\n query.matchDiacritics ? 1 : 0,\n query.wholeWord ? 1 : 0,\n mode,\n ]);\n}\n\nexport function encodeSearchCursor(state: SearchCursorState): string {\n return JSON.stringify(state);\n}\n\nexport function decodeSearchCursor(\n request: SearchRequest,\n cursor: string,\n expectedSeq: number,\n expectedKey: string,\n): SearchCursorState {\n let state: SearchCursorState;\n try {\n state = JSON.parse(cursor) as SearchCursorState;\n } catch {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed search cursor');\n }\n if (state?.v !== 1 || typeof state.scanned !== 'number' || typeof state.key !== 'string') {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed search cursor');\n }\n if (state.key !== expectedKey) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'search cursor belongs to a different query — restart the search',\n );\n }\n if (state.seq !== expectedSeq) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'document changed since this search cursor was issued — restart the search',\n { details: { cursorSeq: state.seq, currentSeq: expectedSeq } },\n );\n }\n // The cursor owns position; a startPage alongside it is a caller bug.\n if (request.startPage !== undefined && request.startPage !== state.start) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'startPage conflicts with the cursor — omit startPage when resuming',\n );\n }\n return state;\n}\n","import type {\n SearchMatch,\n SearchMatchRange,\n SearchRequest,\n SearchSlice,\n} from '@embedpdf/engine-core/runtime';\nimport {\n EngineError,\n EngineErrorCode,\n buildSnippet,\n charRangeForTextOffsets,\n foldOptionsFor,\n foldText,\n matchLiteral,\n matchRegex,\n buildPageTextLayout,\n textSegmentsForRange,\n validateSearchQuery,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { throwIfAborted } from '../../shared/abort';\nimport { PageGeometryReader } from '../geometry/PageGeometryReader';\nimport { acquirePageCorpus } from './internal/pageCorpusCache';\nimport { decodeSearchCursor, encodeSearchCursor, searchQueryKey } from './internal/searchCursor';\n\n/**\n * Per-slice budget defaults and ceilings. The ceiling is the worker's\n * self-defense: one `query()` call is one synchronous stretch of native\n * work, and no request — whatever budget it asks for — may hold the\n * worker longer than ~a few hundred pages. Callers wanting more issue\n * more slices; the cursor makes that cheap.\n */\nconst DEFAULT_MAX_PAGES = 64;\nconst CEILING_MAX_PAGES = 256;\nconst DEFAULT_MAX_MATCHES = 256;\nconst CEILING_MAX_MATCHES = 1024;\n\n/**\n * The whole search pipeline for one budgeted slice, running inside the\n * trust boundary (worker locally, server process in the cloud):\n *\n * extract — page text via the session corpus cache (version-keyed on\n * `mutationSeq`, so results always reflect the CURRENT layer\n * view — text a redaction removed is unfindable),\n * match — the pure engine-core matcher (identical code on every\n * engine; parity by construction),\n * anchor — geometry read only for pages that actually matched, rects\n * via the selection line-merge (one rect per visual line).\n *\n * Scope gating (`doc.text.search`, `doc.text.copy` for `'full'`) is the\n * caller's job — this reader assumes an authorized request.\n */\nexport class SearchReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n query(request: SearchRequest, signal: AbortSignal): SearchSlice {\n throwIfAborted(signal);\n const query = request.query;\n const mode = request.mode ?? 'full';\n\n // One validator covers everything: regex dialect AND flag combos\n // (regex + matchDiacritics is the rejected one). Literal queries are\n // always valid.\n const valid = validateSearchQuery(query);\n if (!valid.ok) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `invalid search query (${valid.issue}): ${valid.message}`,\n );\n }\n\n const records = this.session.allRecords();\n const totalPages = records.length;\n\n // Nothing findable — don't burn a scan on an empty needle.\n if (!query.regex && foldText(query.text).folded.trim().length === 0) {\n return { matches: [], nextCursor: null, scannedPages: 0, totalPages };\n }\n\n const seq = this.session.mutationSeq();\n const key = searchQueryKey(query, mode);\n\n let start = 0;\n let scanned = 0;\n if (request.cursor !== undefined) {\n const state = decodeSearchCursor(request, request.cursor, seq, key);\n start = state.start;\n scanned = state.scanned;\n } else {\n if (request.startPage !== undefined) {\n // Throws NotFound for an unknown page — same contract as page(pon).\n this.session.recordByObjectNumber(request.startPage);\n start = request.startPage;\n }\n if (request.skip !== undefined) {\n // Trusted-position resume: the caller pins content versions\n // externally (the cloud wire's search token carries the content\n // epoch), so no sequence check applies here. Clamp into range.\n scanned = Math.min(Math.max(0, Math.floor(request.skip)), totalPages);\n }\n }\n\n // Viewport-first: rotate display order to begin at `start`, wrapping.\n let order = records;\n if (start !== 0) {\n const at = records.findIndex((r) => r.pageObjectNumber === start);\n order = records.slice(at).concat(records.slice(0, at));\n }\n\n const maxPages = clamp(request.budget?.maxPages, DEFAULT_MAX_PAGES, CEILING_MAX_PAGES);\n const maxMatches = clamp(request.budget?.maxMatches, DEFAULT_MAX_MATCHES, CEILING_MAX_MATCHES);\n\n const matches: SearchMatch[] = [];\n let pagesThisSlice = 0;\n // Budget checks sit at page granularity: a page's matches are never\n // split across slices, so the cursor only ever points between pages.\n while (scanned < order.length && pagesThisSlice < maxPages && matches.length < maxMatches) {\n throwIfAborted(signal);\n const pon = order[scanned].pageObjectNumber;\n const corpus = acquirePageCorpus(this.runtime, this.session, pon, signal);\n\n const text = corpus.snapshot.text;\n let ranges: SearchMatchRange[];\n if (query.regex) {\n ranges = matchRegex(text, query);\n } else if (query.matchCase || query.matchDiacritics) {\n // Non-default fold options: re-fold the cached raw text per query.\n ranges = matchLiteral(foldText(text, foldOptionsFor(query)), query);\n } else {\n ranges = matchLiteral(corpus.folded, query);\n }\n\n if (ranges.length > 0) {\n const geometry = new PageGeometryReader(this.runtime, this.session).read(pon, signal);\n // One canonical layout per page, shared by every match on it.\n const layout = buildPageTextLayout(geometry);\n for (const range of ranges) {\n // Match ranges are TEXT-space (string offsets); the hit DTO and\n // the geometry layout speak CHARACTER space. Convert exactly once,\n // here — the biased range helper keeps zero-width characters\n // adjacent to the match OUTSIDE it on both sides. Snippets stay in\n // text space (their offsets are internal to the snippet string).\n const chars = charRangeForTextOffsets(corpus.snapshot, range.start, range.start + range.length);\n matches.push({\n pageObjectNumber: pon,\n charStart: chars.start,\n charCount: chars.end - chars.start,\n segments: textSegmentsForRange(layout, chars.start, chars.end - chars.start),\n ...(mode === 'full' ? { snippet: buildSnippet(text, range) } : {}),\n });\n }\n }\n\n scanned++;\n pagesThisSlice++;\n }\n\n return {\n matches,\n nextCursor:\n scanned < order.length ? encodeSearchCursor({ v: 1, seq, key, start, scanned }) : null,\n scannedPages: scanned,\n totalPages,\n };\n }\n}\n\nfunction clamp(requested: number | undefined, fallback: number, ceiling: number): number {\n if (requested === undefined || !Number.isFinite(requested)) return fallback;\n return Math.max(1, Math.min(Math.floor(requested), ceiling));\n}\n","import type { DocumentActionsSnapshot, PdfActionTree } from '@embedpdf/engine-core/runtime';\nimport { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\nimport { NULL_PTR, type PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { ActionReadBudgetTracker, readActionModel } from './ActionModelReader';\nimport { readDestination } from '../destinations/readDestination';\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { readUtf16String } from '../../runtime/memory/strings';\nimport { throwIfAborted } from '../../shared/abort';\n\nconst DOCUMENT_ACTION_EVENTS = [\n ['willClose', 0],\n ['willSave', 1],\n ['didSave', 2],\n ['willPrint', 3],\n ['didPrint', 4],\n] as const;\n\n/** Read catalog-owned actions. Extraction only; no action is executed. */\nexport class DocumentActionsReader {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n ) {}\n\n read(signal: AbortSignal): DocumentActionsSnapshot {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const budget = new ActionReadBudgetTracker();\n const count = fn.FPDFDoc_GetJavaScriptActionCount(docPtr);\n if (count < 0) {\n throw new EngineError(\n EngineErrorCode.MalformedPdf,\n 'failed to enumerate PDF name-tree scripts',\n );\n }\n\n const nameTreeScripts: DocumentActionsSnapshot['nameTreeScripts'] = [];\n for (let index = 0; index < count; index++) {\n throwIfAborted(signal);\n const namedPtr = fn.FPDFDoc_GetJavaScriptAction(docPtr, index);\n if (namedPtr === NULL_PTR) {\n throw new EngineError(EngineErrorCode.MalformedPdf, 'invalid PDF name-tree script entry', {\n details: { index },\n });\n }\n let name: string;\n try {\n name =\n readUtf16String(mem, (buf, capacity) =>\n fn.FPDFJavaScriptAction_GetName(namedPtr, buf, capacity),\n ) ?? '';\n } finally {\n fn.FPDFDoc_CloseJavaScriptAction(namedPtr);\n }\n // Name-tree keys enter the same detached snapshot as node payloads and\n // ride the same aggregate budget.\n budget.reservePayloadBytes(name.length);\n const action = requireAction(\n readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetNamedJavaScriptActionModel(docPtr, index),\n budget,\n ),\n 'name-tree script',\n index,\n );\n nameTreeScripts.push({ name, action });\n }\n\n const openAction = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetOpenActionModel(docPtr),\n budget,\n );\n // `/OpenAction` is one entry — the destination form only exists when the\n // action form does not.\n const openDestPtr = openAction ? NULL_PTR : fn.EPDFDoc_GetOpenActionDest(docPtr);\n const openDestination =\n openDestPtr !== NULL_PTR ? readDestination(fn, mem, docPtr, openDestPtr) : null;\n const additional: Partial<Record<(typeof DOCUMENT_ACTION_EVENTS)[number][0], PdfActionTree>> =\n {};\n for (const [key, event] of DOCUMENT_ACTION_EVENTS) {\n throwIfAborted(signal);\n const action = readActionModel(\n fn,\n mem,\n docPtr,\n fn.EPDFDoc_GetAdditionalActionModel(docPtr, event),\n budget,\n );\n if (action) additional[key] = action;\n }\n return { nameTreeScripts, openAction, openDestination, ...additional };\n }\n}\n\nfunction requireAction(action: PdfActionTree | null, owner: string, index: number): PdfActionTree {\n if (action) return action;\n throw new EngineError(EngineErrorCode.MalformedPdf, `failed to read ${owner}`, {\n details: { index },\n });\n}\n","import {\n EngineError,\n EngineErrorCode,\n type PageObjectNumber,\n type PieceInfoEntry,\n type PieceInfoPatch,\n type PieceInfoSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule, Ptr } from '@embedpdf/engine-runtime';\n\nimport type { DocumentSession } from '../../document-session/DocumentSession';\nimport { readUtf8String, readUtf16String, writeUtf16String } from '../../runtime/memory/strings';\nimport { throwIfAborted } from '../../shared/abort';\nimport { formatPdfDate, pdfDateToIso } from '../../shared/pdf-date';\nimport { withWideStringArray } from '../forms/internal/wideStringArray';\n\n// FPDF_OBJECT_* codes reported by EPDFDoc_Get(Page)PieceInfoValueType.\nconst OBJ_BOOLEAN = 1;\nconst OBJ_NUMBER = 2;\nconst OBJ_STRING = 3;\nconst OBJ_NAME = 4;\nconst OBJ_ARRAY = 5;\n\n/**\n * `/PieceInfo` reads and writes for one holder — the document CATALOG\n * (`pageObjectNumber` undefined) or one PAGE. Wraps the fork's symmetric\n * `EPDFDoc_*PieceInfo*` / `EPDFDoc_*PagePieceInfo*` families behind one\n * shape, so the worker host has a single code path for both levels.\n *\n * Writes stamp `content_last_modified` once per job (the worker is\n * single-threaded, so every key written by one job gets one revision date);\n * the native side fans it out to the application dict, the page dict,\n * and — for catalog writes — /Info /ModDate.\n */\nexport class PieceInfoAccessor {\n constructor(\n private readonly runtime: PdfRuntimeModule,\n private readonly session: DocumentSession,\n private readonly pageObjectNumber?: PageObjectNumber,\n ) {\n if (pageObjectNumber !== undefined) {\n // NotFound on a bad pon — same fail-fast as every page verb.\n session.recordByObjectNumber(pageObjectNumber);\n }\n }\n\n read(application: string, signal: AbortSignal): PieceInfoSnapshot | null {\n throwIfAborted(signal);\n requireApplication(application);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n\n const has =\n pon === undefined\n ? fn.EPDFDoc_HasPieceInfoEntry(docPtr, application)\n : fn.EPDFDoc_HasPagePieceInfoEntry(docPtr, pon, application);\n if (!has) return null;\n\n const keyCount =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoKeyCount(docPtr, application)\n : fn.EPDFDoc_GetPagePieceInfoKeyCount(docPtr, pon, application);\n\n const entries: Record<string, PieceInfoEntry> = {};\n for (let i = 0; i < keyCount; i++) {\n throwIfAborted(signal);\n const key = readUtf8String(mem, (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoKeyAt(docPtr, application, i, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoKeyAt(docPtr, pon, application, i, buf, cap),\n );\n if (key === null) continue;\n entries[key] = this.readEntry(application, key);\n }\n\n const lastModifiedPdf = readUtf16String(\n mem,\n (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoLastModified(docPtr, application, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoLastModified(docPtr, pon, application, buf, cap),\n null,\n );\n return {\n entries,\n lastModified: lastModifiedPdf ? pdfDateToIso(lastModifiedPdf) : null,\n };\n }\n\n update(application: string, patch: PieceInfoPatch, signal: AbortSignal): void {\n throwIfAborted(signal);\n requireApplication(application);\n requirePatch(patch);\n const keys = Object.keys(patch);\n if (keys.length === 0) return;\n validatePatch(patch, keys);\n\n // This is the apply boundary. No caller-controlled validation and no\n // cancellation check belongs below it: once the first native setter runs,\n // this deliberately non-rollback-atomic patch may be partially written if\n // a native invariant fails on a later key.\n throwIfAborted(signal);\n\n const { mem } = this.runtime;\n // One revision date per job, however many keys the patch touches.\n const lastModified = formatPdfDate(new Date());\n const lmPtr = mem.writeU16String(lastModified);\n try {\n for (const key of keys) {\n const value = patch[key];\n const ok = this.writeEntry(application, key, value, lmPtr);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `pieceInfo write rejected for key '${key}' after validation`,\n );\n }\n }\n } finally {\n mem.free(lmPtr);\n }\n }\n\n applications(signal: AbortSignal): string[] {\n throwIfAborted(signal);\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n const count =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoEntryCount(docPtr)\n : fn.EPDFDoc_GetPagePieceInfoEntryCount(docPtr, pon);\n const out: string[] = [];\n for (let i = 0; i < count; i++) {\n const name = readUtf8String(mem, (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoEntryAt(docPtr, i, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoEntryAt(docPtr, pon, i, buf, cap),\n );\n if (name !== null) out.push(name);\n }\n return out;\n }\n\n clear(application: string, signal: AbortSignal): void {\n throwIfAborted(signal);\n requireApplication(application);\n const { fn } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n const ok =\n pon === undefined\n ? fn.EPDFDoc_ClearPieceInfoEntry(docPtr, application)\n : fn.EPDFDoc_ClearPagePieceInfoEntry(docPtr, pon, application);\n if (!ok) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `pieceInfo clear rejected for application '${application}'`,\n );\n }\n }\n\n private readEntry(application: string, key: string): PieceInfoEntry {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n const type =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoValueType(docPtr, application, key)\n : fn.EPDFDoc_GetPagePieceInfoValueType(docPtr, pon, application, key);\n\n switch (type) {\n case OBJ_STRING: {\n const value = readUtf16String(\n mem,\n (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoString(docPtr, application, key, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoString(docPtr, pon, application, key, buf, cap),\n '',\n );\n return value === null ? { type: 'unknown' } : { type: 'string', value };\n }\n case OBJ_NAME: {\n const value = readUtf8String(mem, (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoName(docPtr, application, key, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoName(docPtr, pon, application, key, buf, cap),\n );\n return value === null ? { type: 'unknown' } : { type: 'name', value };\n }\n case OBJ_NUMBER: {\n const outPtr = mem.alloc(4);\n try {\n const ok =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoNumber(docPtr, application, key, outPtr)\n : fn.EPDFDoc_GetPagePieceInfoNumber(docPtr, pon, application, key, outPtr);\n if (!ok) return { type: 'unknown' };\n return { type: 'number', value: Number(mem.peek(outPtr, 'f32')) };\n } finally {\n mem.free(outPtr);\n }\n }\n case OBJ_BOOLEAN: {\n const outPtr = mem.alloc(4);\n try {\n const ok =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoBoolean(docPtr, application, key, outPtr)\n : fn.EPDFDoc_GetPagePieceInfoBoolean(docPtr, pon, application, key, outPtr);\n if (!ok) return { type: 'unknown' };\n return { type: 'boolean', value: Number(mem.peek(outPtr, 'i32')) !== 0 };\n } finally {\n mem.free(outPtr);\n }\n }\n case OBJ_ARRAY: {\n const count =\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoStringArrayCount(docPtr, application, key)\n : fn.EPDFDoc_GetPagePieceInfoStringArrayCount(docPtr, pon, application, key);\n // -1 = not a pure text-string array — preserved, not readable here.\n if (count < 0) return { type: 'unknown' };\n const value: string[] = [];\n for (let i = 0; i < count; i++) {\n const item = readUtf16String(\n mem,\n (buf, cap) =>\n pon === undefined\n ? fn.EPDFDoc_GetPieceInfoStringArrayAt(docPtr, application, key, i, buf, cap)\n : fn.EPDFDoc_GetPagePieceInfoStringArrayAt(\n docPtr,\n pon,\n application,\n key,\n i,\n buf,\n cap,\n ),\n '',\n );\n if (item === null) return { type: 'unknown' };\n value.push(item);\n }\n return { type: 'string-array', value };\n }\n default:\n return { type: 'unknown' };\n }\n }\n\n private writeEntry(\n application: string,\n key: string,\n value: PieceInfoPatch[string],\n lmPtr: Ptr,\n ): boolean {\n const { fn, mem } = this.runtime;\n const docPtr = this.session.requireDocPtr();\n const pon = this.pageObjectNumber;\n\n if (value === null) {\n return pon === undefined\n ? fn.EPDFDoc_ClearPieceInfoKey(docPtr, application, key, lmPtr)\n : fn.EPDFDoc_ClearPagePieceInfoKey(docPtr, pon, application, key, lmPtr);\n }\n if (typeof value === 'string') {\n return writeUtf16String(mem, value, (ptr) =>\n pon === undefined\n ? fn.EPDFDoc_SetPieceInfoString(docPtr, application, key, ptr, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoString(docPtr, pon, application, key, ptr, lmPtr),\n );\n }\n if (typeof value === 'number') {\n return pon === undefined\n ? fn.EPDFDoc_SetPieceInfoNumber(docPtr, application, key, value, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoNumber(docPtr, pon, application, key, value, lmPtr);\n }\n if (typeof value === 'boolean') {\n return pon === undefined\n ? fn.EPDFDoc_SetPieceInfoBoolean(docPtr, application, key, value, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoBoolean(docPtr, pon, application, key, value, lmPtr);\n }\n if (Array.isArray(value)) {\n return withWideStringArray(this.runtime, value, (arrayPtr, count) =>\n pon === undefined\n ? fn.EPDFDoc_SetPieceInfoStringArray(docPtr, application, key, arrayPtr, count, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoStringArray(\n docPtr,\n pon,\n application,\n key,\n arrayPtr,\n count,\n lmPtr,\n ),\n );\n }\n if (typeof value === 'object' && value !== null && 'name' in value) {\n return pon === undefined\n ? fn.EPDFDoc_SetPieceInfoName(docPtr, application, key, value.name, lmPtr)\n : fn.EPDFDoc_SetPagePieceInfoName(docPtr, pon, application, key, value.name, lmPtr);\n }\n // validatePatch() makes this unreachable. Keep a loud invariant failure\n // rather than silently ignoring a new wire value if the vocabulary grows.\n throw new EngineError(EngineErrorCode.Unknown, `unvalidated pieceInfo value for '${key}'`);\n }\n}\n\nfunction requireApplication(application: string): void {\n if (typeof application !== 'string' || application.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pieceInfo application must be non-empty');\n }\n}\n\nfunction requirePatch(patch: PieceInfoPatch): void {\n if (typeof patch !== 'object' || patch === null || Array.isArray(patch)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pieceInfo patch must be an object');\n }\n}\n\nfunction validatePatch(patch: PieceInfoPatch, keys: string[]): void {\n for (const key of keys) {\n if (key.length === 0) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'pieceInfo keys must be non-empty');\n }\n validatePatchValue(key, patch[key]);\n }\n}\n\nfunction validatePatchValue(key: string, value: PieceInfoPatch[string]): void {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pieceInfo number for '${key}' must be finite`,\n );\n }\n return;\n }\n\n if (Array.isArray(value)) {\n if (!value.every((item) => typeof item === 'string')) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pieceInfo string array for '${key}' must contain only strings`,\n );\n }\n return;\n }\n\n if (typeof value === 'object' && value !== null && 'name' in value) {\n if (typeof value.name !== 'string' || value.name.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `pieceInfo PDF name for '${key}' must be a non-empty string`,\n );\n }\n return;\n }\n\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `unsupported pieceInfo value for '${key}': string | number | boolean | string[] | { name } | null`,\n );\n}\n","import {\n EMPTY_TRANSFER,\n EngineError,\n EngineErrorCode,\n serializeError,\n wirePack,\n type AnnotationsCreateWorkerRequest,\n type AnnotationsDeleteWorkerRequest,\n type DocumentCheckPasswordPermissionsWorkerRequest,\n type DocumentProbeSecurityFileWorkerRequest,\n type DocumentRenderPageFileWorkerRequest,\n type DocumentSaveBufferWorkerRequest,\n type DocumentSaveFileWorkerRequest,\n type DocumentSaveLayerBufferWorkerRequest,\n type FormsAttachWidgetWorkerRequest,\n type FormsCreateFieldWorkerRequest,\n type FormsDeleteFieldWorkerRequest,\n type FormsDetachWidgetWorkerRequest,\n type FormsExportWorkerRequest,\n type FormsImportWorkerRequest,\n type FormsListWorkerRequest,\n type FormsRepairWorkerRequest,\n type FormsUpdateFieldWorkerRequest,\n type FormsSetSignatureAppearanceWorkerRequest,\n type FormsResetWorkerRequest,\n type FormsSetValueWorkerRequest,\n type SignaturesListWorkerRequest,\n type SignaturesPrepareWorkerRequest,\n type SignaturesCompleteWorkerRequest,\n type SignaturesAbortWorkerRequest,\n type SignaturesAnalyzeWorkerRequest,\n type SignaturesFinalizeCandidateWorkerRequest,\n type SignaturesContentsWorkerRequest,\n type SignaturesDigestWorkerRequest,\n type SignaturesRevisionBytesWorkerRequest,\n type DocumentVersionWorkerRequest,\n type DocumentProtection,\n type FontsRegisterWorkerRequest,\n type FontsAddFallbackWorkerRequest,\n type FontsClearFallbacksWorkerRequest,\n type FontsClearWorkerRequest,\n type FontsAuthorizeEditingWorkerRequest,\n type DocumentSetFontSettingsWorkerRequest,\n type AnnotationsListFullPageWorkerRequest,\n type AnnotationsListRawAllWorkerRequest,\n type AnnotationsListRawPageWorkerRequest,\n type AnnotationsRenderAppearancesWorkerRequest,\n type AnnotationsMoveWorkerRequest,\n type AnnotationsUpdateWorkerRequest,\n type CloseWorkerRequest,\n type LayerCloseWorkerRequest,\n type MetadataReadWorkerRequest,\n type MetadataUpdateWorkerRequest,\n type ActionsReadWorkerRequest,\n type OpenWorkerRequest,\n type PagesListWorkerRequest,\n type PagesGeometryWorkerRequest,\n type PagesMoveWorkerRequest,\n type PagesRotateWorkerRequest,\n type PagesDeleteWorkerRequest,\n type PagesSetNameWorkerRequest,\n type AnnotationsFlattenWorkerRequest,\n type AnnotationsExportAppearanceWorkerRequest,\n type PagesRemoveNameWorkerRequest,\n type PagesExtractWorkerRequest,\n type PagesInsertBlankWorkerRequest,\n type PagesInsertWorkerRequest,\n type AttachmentsListWorkerRequest,\n type AttachmentsReadFileWorkerRequest,\n type AttachmentsCreateWorkerRequest,\n type AttachmentsDeleteWorkerRequest,\n type AnnotationsReadFileWorkerRequest,\n type PagesFlattenWorkerRequest,\n type RedactionApplyWorkerRequest,\n type PieceInfoApplicationsWorkerRequest,\n type PieceInfoClearWorkerRequest,\n type PieceInfoReadWorkerRequest,\n type PieceInfoUpdateWorkerRequest,\n type PageNetworkRenderFormat,\n type PageRaster,\n type PagesRenderWorkerRequest,\n type PagesRenderEncodedWorkerRequest,\n type DocumentRenderPageFileEncodedWorkerRequest,\n type AnnotationsRenderAppearancesEncodedWorkerRequest,\n type EncodedAppearanceWire,\n type EncodedImageWire,\n type RenderEncode,\n type PagesTextWorkerRequest,\n type SearchQueryWorkerRequest,\n type FormsApplyEffectsWorkerRequest,\n type SerializedEngineError,\n type ShutdownWorkerRequest,\n type WirePack,\n type WorkerJobId,\n type WorkerRequest,\n type WorkerResponse,\n type WorkerResultPayload,\n} from '@embedpdf/engine-core/runtime';\nimport type { MutationMeta } from '@embedpdf/engine-core/runtime';\nimport type { PdfRuntimeModule } from '@embedpdf/engine-runtime';\n\nimport { DocumentSession } from '../document-session/DocumentSession';\nimport { BaseDocumentRegistry } from '../document-session/lifecycle/BaseDocumentRegistry';\nimport {\n openFatMemoryDocument,\n openLayerDocument,\n} from '../document-session/lifecycle/PdfDocumentOpener';\nimport { DocumentActionsReader } from '../features/actions';\nimport {\n AnnotationReader,\n AnnotationAppearanceReader,\n AnnotationFlattener,\n AnnotationMutator,\n RawAnnotationReader,\n} from '../features/annotations';\nimport { AttachmentMutator, AttachmentReader } from '../features/attachments';\nimport { FontRegistrar, type StartupFontSpec } from '../features/fonts';\nimport { FormMutator, FormReader, FormsEffectsApplier, disposeFormModel } from '../features/forms';\nimport { PageGeometryReader } from '../features/geometry';\nimport { MetadataMutator, MetadataReader } from '../features/metadata';\nimport {\n PagesExtractor,\n PagesFlattener,\n PagesInserter,\n PagesMutator,\n PagesReader,\n} from '../features/pages';\nimport { PieceInfoAccessor } from '../features/pieceinfo';\nimport { RedactionApplier } from '../features/redaction';\nimport { PageRenderReader } from '../features/render';\nimport { DocumentSaver } from '../features/save';\nimport { SearchReader } from '../features/search';\nimport { SecurityReader } from '../features/security';\nimport {\n CandidateFinalizer,\n SignatureAnalyzer,\n SignatureMutator,\n SignatureReader,\n disposeSignatureModel,\n hasSignedSignature,\n} from '../features/signature';\nimport { PageTextReader } from '../features/text';\nimport { ensureInitialized, destroyLibrary } from '../runtime/lifecycle/bootstrap';\nimport { generateUuid } from '../shared/uuid';\n\n/** The image a {@link WorkerImageEncoder} produced. `bytes` must OWN its\n * buffer (a fresh allocation, not a pooled `Buffer` slab view) — it is\n * placed on the transfer manifest and moved zero-copy. */\nexport interface WorkerEncodedImage {\n contentType: string;\n bytes: Uint8Array;\n}\n\n/**\n * Injected image-encode capability for the `*.renderEncoded` wire kinds.\n * Dependency inversion keeps the native encoder OUT of this shared\n * package: the cloud server's worker entry injects a sharp/libvips\n * implementation; browser/local entries inject nothing (they encode via\n * canvas) and the encoded kinds reject with `NotImplemented`.\n */\nexport interface WorkerImageEncoder {\n encode(\n raster: PageRaster,\n opts: { format: PageNetworkRenderFormat; quality?: number },\n ): Promise<WorkerEncodedImage>;\n}\n\nexport interface WorkerHostOptions {\n imageEncoder?: WorkerImageEncoder;\n /**\n * Where a file-backed session (a file base) writes its signing candidate\n * between `prepare` and `complete`. Defaults to beside the base file\n * (`<base>.signing-<id>.pdf`); a server maps it into its storage layout so\n * the sealed file can be published by rename.\n */\n signingCandidatePath?: (basePath: string, signingId: string) => string;\n}\n\n/**\n * The piece that runs \"inside the worker\": owns runtime, manages document\n * sessions, dispatches requests to the engine-services synchronous code.\n *\n * Environment-agnostic. Wrap it with a Web Worker entry, a Node\n * worker_thread entry, or an inline transport. The wrapper owns\n * postMessage plumbing and any process/lifecycle concerns; the host only\n * knows about PdfRuntimeModule, DocumentSession, AbortController, and the\n * worker wire shape from @embedpdf/engine-core.\n */\nexport class WorkerHost {\n private readonly sessions = new Map<string, DocumentSession>();\n private readonly baseDocuments: BaseDocumentRegistry;\n private readonly aborts = new Map<WorkerJobId, AbortController>();\n /**\n * Runtime-global registered fonts for this thread. The registry is\n * thread-local in PDFium, so it lives on the host (one per thread), not per\n * document session. `fontIds` maps the stable wire `fontKey` to this\n * thread's volatile native FontId.\n */\n private readonly fontIds = new Map<string, number>();\n private readonly fonts: FontRegistrar;\n private destroyed = false;\n\n constructor(\n private readonly runtime: PdfRuntimeModule,\n /**\n * Receives a fully-typed `WirePack<WorkerResponse>` (the envelope\n * payload plus its transfer manifest). The wrapper (browser\n * `worker-entry.ts`, Node `worker-entry.ts`, or `InlineTransport`)\n * is responsible for actually invoking `postMessage(pack.payload,\n * pack.transfer)` — the host doesn't know which environment it\n * runs in.\n */\n private readonly post: (pack: WirePack<WorkerResponse>) => void,\n /** Optional capabilities. See {@link WorkerHostOptions}. */\n private readonly options: WorkerHostOptions = {},\n ) {\n ensureInitialized(this.runtime);\n this.baseDocuments = new BaseDocumentRegistry(this.runtime);\n this.fonts = new FontRegistrar(this.runtime, this.fontIds);\n }\n\n /**\n * Register deployment-owned fonts on this worker thread, after init and\n * before serving requests. Server-only: the cloud engine never exposes font\n * configuration to clients, so the host (not a wire message) seeds the\n * thread's fallback fonts. Browser engines drive fonts through the\n * `fonts.*` wire path instead. Throws if any font fails to load.\n */\n registerStartupFonts(specs: readonly StartupFontSpec[]): void {\n this.fonts.registerStartup(specs);\n }\n\n receive(msg: WorkerRequest): void {\n if (msg.kind === 'abort') {\n this.aborts.get(msg.jobId)?.abort();\n return;\n }\n\n // The encoded render kinds are the protocol's ONLY async ops: their\n // raster comes from the SAME sync handlers as the raw kinds (all\n // session/registry use completes before the first await), and only\n // the injected image encode awaits. They run on a parallel async\n // path with identical resolve/reject/abort bookkeeping; everything\n // else stays on the synchronous switch below, unchanged.\n if (\n msg.kind === 'pages.renderEncoded' ||\n msg.kind === 'document.renderPageFileEncoded' ||\n msg.kind === 'annotations.renderAppearancesEncoded'\n ) {\n void this.receiveEncoded(msg);\n return;\n }\n\n const ctrl = new AbortController();\n this.aborts.set(msg.jobId, ctrl);\n\n // Abort policy: only handlers that loop over pages/annotations honor\n // `ctrl.signal` (the read/mutation paths below). One-shot native\n // operations — open, document save, security probe, close, shutdown —\n // are effectively atomic from our side and intentionally non-abortable,\n // so they do not receive the signal.\n let resultPack: WirePack<WorkerResultPayload>;\n try {\n // A parked signing candidate freezes the session: every mutating kind\n // is refused at DISPATCH, before any native write, until the signing\n // completes or aborts. Reads keep seeing the live document, which the\n // candidate never changed.\n this.assertNoPendingSigning(msg);\n switch (msg.kind) {\n case 'open.fatMem':\n case 'open.layerMemBase':\n case 'open.layerFileBase':\n resultPack = this.handleOpen(msg);\n break;\n case 'metadata.read':\n resultPack = this.handleMetadataRead(msg, ctrl.signal);\n break;\n case 'metadata.update':\n resultPack = this.handleMetadataUpdate(msg, ctrl.signal);\n break;\n case 'actions.read':\n resultPack = this.handleActionsRead(msg, ctrl.signal);\n break;\n case 'annotations.listRawAll':\n resultPack = this.handleAnnotationsListRawAll(msg, ctrl.signal);\n break;\n case 'annotations.listRawPage':\n resultPack = this.handleAnnotationsListRawPage(msg, ctrl.signal);\n break;\n case 'annotations.listFullPage':\n resultPack = this.handleAnnotationsListFullPage(msg, ctrl.signal);\n break;\n case 'annotations.renderAppearances':\n resultPack = this.handleAnnotationsRenderAppearances(msg, ctrl.signal);\n break;\n case 'annotations.create':\n resultPack = this.handleAnnotationsCreate(msg, ctrl.signal);\n break;\n case 'annotations.update':\n resultPack = this.handleAnnotationsUpdate(msg, ctrl.signal);\n break;\n case 'annotations.delete':\n resultPack = this.handleAnnotationsDelete(msg, ctrl.signal);\n break;\n case 'annotations.move':\n resultPack = this.handleAnnotationsMove(msg, ctrl.signal);\n break;\n case 'signatures.list':\n resultPack = this.handleSignaturesList(msg);\n break;\n case 'signatures.contents':\n resultPack = this.handleSignaturesContents(msg);\n break;\n case 'signatures.digest':\n resultPack = this.handleSignaturesDigest(msg);\n break;\n case 'signatures.revisionBytes':\n resultPack = this.handleSignaturesRevisionBytes(msg);\n break;\n case 'document.version':\n resultPack = this.handleDocumentVersion(msg);\n break;\n case 'signatures.prepare':\n resultPack = this.handleSignaturesPrepare(msg);\n break;\n case 'signatures.complete':\n resultPack = this.handleSignaturesComplete(msg);\n break;\n case 'signatures.abort':\n resultPack = this.handleSignaturesAbort(msg);\n break;\n case 'signatures.analyze':\n resultPack = this.handleSignaturesAnalyze(msg);\n break;\n case 'signatures.finalizeCandidate':\n resultPack = this.handleSignaturesFinalizeCandidate(msg);\n break;\n case 'forms.list':\n resultPack = this.handleFormsList(msg, ctrl.signal);\n break;\n case 'forms.setValue':\n resultPack = this.handleFormsSetValue(msg, ctrl.signal);\n break;\n case 'forms.reset':\n resultPack = this.handleFormsReset(msg, ctrl.signal);\n break;\n case 'forms.applyEffects':\n resultPack = this.handleFormsApplyEffects(msg, ctrl.signal);\n break;\n case 'forms.export':\n resultPack = this.handleFormsExport(msg, ctrl.signal);\n break;\n case 'forms.import':\n resultPack = this.handleFormsImport(msg, ctrl.signal);\n break;\n case 'forms.repair':\n resultPack = this.handleFormsRepair(msg, ctrl.signal);\n break;\n case 'forms.createField':\n resultPack = this.handleFormsCreateField(msg, ctrl.signal);\n break;\n case 'forms.updateField':\n resultPack = this.handleFormsUpdateField(msg, ctrl.signal);\n break;\n case 'forms.setSignatureAppearance':\n resultPack = this.handleFormsSetSignatureAppearance(msg, ctrl.signal);\n break;\n case 'forms.deleteField':\n resultPack = this.handleFormsDeleteField(msg, ctrl.signal);\n break;\n case 'forms.attachWidget':\n resultPack = this.handleFormsAttachWidget(msg, ctrl.signal);\n break;\n case 'forms.detachWidget':\n resultPack = this.handleFormsDetachWidget(msg, ctrl.signal);\n break;\n case 'pages.list':\n resultPack = this.handlePagesList(msg, ctrl.signal);\n break;\n case 'pages.move':\n resultPack = this.handlePagesMove(msg, ctrl.signal);\n break;\n case 'pages.rotate':\n resultPack = this.handlePagesRotate(msg, ctrl.signal);\n break;\n case 'pages.delete':\n resultPack = this.handlePagesDelete(msg, ctrl.signal);\n break;\n case 'pages.setName':\n resultPack = this.handlePagesSetName(msg, ctrl.signal);\n break;\n case 'annotations.flatten':\n resultPack = this.handleAnnotationsFlatten(msg, ctrl.signal);\n break;\n case 'annotations.exportAppearance':\n resultPack = this.handleAnnotationsExportAppearance(msg, ctrl.signal);\n break;\n case 'pages.removeName':\n resultPack = this.handlePagesRemoveName(msg, ctrl.signal);\n break;\n case 'pages.flatten':\n resultPack = this.handlePagesFlatten(msg, ctrl.signal);\n break;\n case 'redaction.apply':\n resultPack = this.handleRedactionApply(msg, ctrl.signal);\n break;\n case 'pages.extract':\n resultPack = this.handlePagesExtract(msg, ctrl.signal);\n break;\n case 'pages.insert':\n resultPack = this.handlePagesInsert(msg, ctrl.signal);\n break;\n case 'pages.insertBlank':\n resultPack = this.handlePagesInsertBlank(msg, ctrl.signal);\n break;\n case 'attachments.list':\n resultPack = this.handleAttachmentsList(msg, ctrl.signal);\n break;\n case 'attachments.readFile':\n resultPack = this.handleAttachmentsReadFile(msg, ctrl.signal);\n break;\n case 'attachments.create':\n resultPack = this.handleAttachmentsCreate(msg, ctrl.signal);\n break;\n case 'attachments.delete':\n resultPack = this.handleAttachmentsDelete(msg, ctrl.signal);\n break;\n case 'annotations.readFile':\n resultPack = this.handleAnnotationsReadFile(msg, ctrl.signal);\n break;\n case 'pieceInfo.read':\n resultPack = this.handlePieceInfoRead(msg, ctrl.signal);\n break;\n case 'pieceInfo.update':\n resultPack = this.handlePieceInfoUpdate(msg, ctrl.signal);\n break;\n case 'pieceInfo.applications':\n resultPack = this.handlePieceInfoApplications(msg, ctrl.signal);\n break;\n case 'pieceInfo.clear':\n resultPack = this.handlePieceInfoClear(msg, ctrl.signal);\n break;\n case 'pages.text':\n resultPack = this.handlePagesText(msg, ctrl.signal);\n break;\n case 'pages.geometry':\n resultPack = this.handlePagesGeometry(msg, ctrl.signal);\n break;\n case 'pages.render':\n resultPack = this.handlePagesRender(msg, ctrl.signal);\n break;\n case 'search.query':\n resultPack = this.handleSearchQuery(msg, ctrl.signal);\n break;\n case 'document.saveBuffer':\n resultPack = this.handleDocumentSaveBuffer(msg);\n break;\n case 'document.saveLayerBuffer':\n resultPack = this.handleDocumentSaveLayerBuffer(msg);\n break;\n case 'document.saveFile':\n resultPack = this.handleDocumentSaveFile(msg);\n break;\n case 'document.probeSecurityFile':\n resultPack = this.handleDocumentProbeSecurityFile(msg);\n break;\n case 'document.renderPageFile':\n resultPack = this.handleDocumentRenderPageFile(msg, ctrl.signal);\n break;\n case 'document.checkPasswordPermissions':\n resultPack = this.handleDocumentCheckPasswordPermissions(msg);\n break;\n case 'fonts.register':\n resultPack = this.handleFontsRegister(msg);\n break;\n case 'fonts.addFallback':\n resultPack = this.handleFontsAddFallback(msg);\n break;\n case 'fonts.clearFallbacks':\n resultPack = this.handleFontsClearFallbacks(msg);\n break;\n case 'fonts.clear':\n resultPack = this.handleFontsClear(msg);\n break;\n case 'fonts.authorizeEditing':\n resultPack = this.handleFontsAuthorizeEditing(msg);\n break;\n case 'document.setFontSettings':\n resultPack = this.handleDocumentSetFontSettings(msg);\n break;\n case 'layer.close':\n resultPack = this.handleLayerClose(msg);\n break;\n case 'close':\n resultPack = this.handleClose(msg);\n break;\n case 'shutdown':\n resultPack = this.handleShutdown(msg);\n break;\n default:\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `unknown request kind: ${(msg as WorkerRequest).kind}`,\n );\n }\n // Lift the handler's transfer manifest onto the response envelope\n // unchanged. The handler decided which buffers to move; the host\n // just relays that decision through the `resolve` envelope.\n this.post(\n wirePack(\n { kind: 'resolve', jobId: msg.jobId, result: resultPack.payload },\n resultPack.transfer,\n ),\n );\n } catch (err) {\n const error: SerializedEngineError = serializeError(err);\n // Reject envelopes never carry binary; explicit EMPTY_TRANSFER\n // documents that intent.\n this.post(wirePack({ kind: 'reject', jobId: msg.jobId, error }, EMPTY_TRANSFER));\n } finally {\n this.aborts.delete(msg.jobId);\n }\n }\n\n private handleOpen(req: OpenWorkerRequest): WirePack<WorkerResultPayload> {\n const key = sessionKey(req.docId, req.kind === 'open.fatMem' ? undefined : req.layerName);\n if (this.sessions.has(key)) {\n throw new EngineError(EngineErrorCode.InvalidArg, `document session already open: ${key}`);\n }\n const session = new DocumentSession(this.runtime);\n session.signedDocumentPolicy = req.signedDocumentPolicy ?? 'protect';\n session.password = req.password;\n if (req.kind === 'open.fatMem') {\n session.sessionKind = req.sessionKind ?? 'layer';\n const bytes = new Uint8Array(req.bytes);\n try {\n this.openSignedAware(session, bytes, req.password);\n } catch (error) {\n // Password failures are a STATE, not an error: park the session with\n // the already-transferred bytes and answer with a security probe that\n // says \"password required\". The client handle comes up locked\n // (`security.passwordPrompt === 'required'`); a later\n // `document.checkPasswordPermissions` performs the actual load.\n if (!isPasswordOpenError(error)) throw error;\n session.parkLocked(bytes);\n this.sessions.set(key, session);\n return wirePack({\n tag: 'open',\n docId: req.docId,\n security: passwordRequiredProbe(),\n });\n }\n } else if (req.kind === 'open.layerMemBase') {\n const base = this.baseDocuments.acquireMemoryBase({\n key: req.baseKey,\n bytes: new Uint8Array(req.baseBytes),\n password: req.password,\n knownSha256: req.baseSha256,\n });\n session.openFromHandle(openLayerDocument(this.runtime, base, req.layer, req.password));\n } else {\n const base = this.baseDocuments.acquireFileBase({\n key: req.baseKey,\n path: req.basePath,\n password: req.password,\n knownSha256: req.baseSha256,\n });\n session.openFromHandle(openLayerDocument(this.runtime, base, req.layer, req.password));\n }\n this.sessions.set(key, session);\n return wirePack({\n tag: 'open',\n docId: req.docId,\n security: new SecurityReader(this.runtime).checkPasswordPermissions(\n session,\n req.password ?? '',\n ),\n protection: this.probeProtection(session),\n });\n }\n\n /**\n * Open plain bytes into `session` in the shape it asked for. The default,\n * `layer`, makes the bytes an immutable base with a fresh layer on top:\n * reads fall through to the base, a write promotes only what it touches,\n * a save appends exactly that, and a signature keeps its validity across\n * later edits because the signature dictionary is never rewritten. The\n * `plain` shape keeps one in-memory document — unless the bytes already\n * carry a signature value, which always opens as a layer, because a plain\n * save rewrites every loaded object into the new revision and strict\n * validators reject that. Auto-layered sessions serialize no artifact per\n * mutation: the caller never asked for one.\n */\n private openSignedAware(\n session: DocumentSession,\n bytes: Uint8Array,\n password: string | null,\n ): void {\n if (session.sessionKind === 'plain') {\n const plain = openFatMemoryDocument(this.runtime, bytes, password);\n // A SIGNED signature, not merely a signature field: an unsigned form\n // with empty signature fields is an ordinary document and honours the\n // plain request. (FPDF_GetSignatureCount counts fields.)\n let signed = false;\n try {\n signed = hasSignedSignature(this.runtime, plain.docPtr);\n } catch {\n signed = false;\n }\n if (!signed) {\n session.openFromHandle(plain);\n return;\n }\n plain.close();\n }\n // The base registry reports a password failure the way a plain open\n // does, so a locked document parks and unlocks exactly as before.\n const base = this.baseDocuments.acquireMemoryBase({\n key: `signed-open:${generateUuid()}`,\n bytes,\n password,\n });\n session.openFromHandle(openLayerDocument(this.runtime, base, { kind: 'fresh' }, password));\n session.persistLayerArtifact = false;\n }\n\n /**\n * What the document's signatures forbid, read at open and after an\n * unlock so the main-thread guard can subtract capabilities before the\n * first mutation. A document whose signature model cannot be built\n * still opens: protection is then `null` (nothing is known to be\n * signed), and the reads report the failure on their own.\n */\n private probeProtection(session: DocumentSession): DocumentProtection | null {\n try {\n return new SignatureReader(this.runtime, session).readProtection();\n } catch {\n return null;\n }\n }\n\n private handleSignaturesList(req: SignaturesListWorkerRequest): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const snapshot = req.workingCopy\n ? new SignatureAnalyzer(this.runtime, session).readWorkingCopySnapshot()\n : new SignatureReader(this.runtime, session).readSnapshot();\n return wirePack({ tag: 'signatures.list', snapshot });\n }\n\n private handleSignaturesContents(\n req: SignaturesContentsWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const bytes = new SignatureReader(this.runtime, session).readContents(req.ref);\n return wirePack({ tag: 'signatures.contents', bytes }, [bytes]);\n }\n\n private handleSignaturesDigest(\n req: SignaturesDigestWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const digest = new SignatureReader(this.runtime, session).digest(req.ref, req.algorithm);\n return wirePack({ tag: 'signatures.digest', digest }, [digest]);\n }\n\n private handleSignaturesRevisionBytes(\n req: SignaturesRevisionBytesWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const bytes = new SignatureReader(this.runtime, session).revisionBytes(req.revisionIndex);\n return wirePack({ tag: 'signatures.revisionBytes', bytes, size: bytes.byteLength }, [bytes]);\n }\n\n private handleDocumentVersion(req: DocumentVersionWorkerRequest): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const version = new SignatureReader(this.runtime, session).version();\n return wirePack({ tag: 'document.version', version });\n }\n\n private handleSignaturesPrepare(\n req: SignaturesPrepareWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n // The live document is untouched: no mutation, no artifact.\n const result = new SignatureMutator(\n this.runtime,\n session,\n this.baseDocuments,\n this.options.signingCandidatePath,\n ).prepare(req.input);\n return wirePack({ tag: 'signatures.prepare', result });\n }\n\n private handleSignaturesComplete(\n req: SignaturesCompleteWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new SignatureMutator(\n this.runtime,\n session,\n this.baseDocuments,\n this.options.signingCandidatePath,\n ).complete(req.input);\n if (result.status === 'already-completed') {\n return wirePack({ tag: 'signatures.complete', result });\n }\n // The install already advanced the mutation sequence; finishMutation\n // only adds the (now empty) layer artifact for layer sessions.\n return this.finishMutation(session, { tag: 'signatures.complete', result }, req.artifactPath);\n }\n\n private handleSignaturesAnalyze(\n req: SignaturesAnalyzeWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const analysis = new SignatureAnalyzer(this.runtime, session).analyze(req.input);\n return wirePack({ tag: 'signatures.analyze', analysis });\n }\n\n /**\n * Session-less, like `document.renderPageFile`: the candidate file is\n * the caller's, patched in place and read back through a transient\n * session that is never stored in `this.sessions`.\n */\n private handleSignaturesFinalizeCandidate(\n req: SignaturesFinalizeCandidateWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const finalized = new CandidateFinalizer(this.runtime, this.baseDocuments).finalize({\n path: req.path,\n byteRange: req.byteRange,\n contentsSize: req.contentsSize,\n fieldObjectNumber: req.fieldObjectNumber,\n cms: new Uint8Array(req.cms),\n password: req.password ?? null,\n });\n return wirePack({ tag: 'signatures.finalizeCandidate', ...finalized });\n }\n\n private handleSignaturesAbort(req: SignaturesAbortWorkerRequest): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new SignatureMutator(\n this.runtime,\n session,\n this.baseDocuments,\n this.options.signingCandidatePath,\n ).abort(req.signingId);\n return wirePack({ tag: 'signatures.abort', result });\n }\n\n /**\n * The dispatch fence for a parked signing candidate. Only mutating kinds\n * are refused; a request for a session that is not open falls through\n * to its handler's own `DocNotOpen`.\n */\n private assertNoPendingSigning(msg: WorkerRequest): void {\n if (!MUTATING_KINDS.has(msg.kind) || !('docId' in msg)) return;\n const layerName = 'layerName' in msg ? msg.layerName : undefined;\n const session = this.sessions.get(sessionKey(msg.docId, layerName));\n if (session?.pendingSigning) {\n throw new EngineError(\n EngineErrorCode.SigningPending,\n `a signing is pending (${session.pendingSigning.prepared.signingId}); complete or abort it before mutating the document`,\n );\n }\n }\n\n private handleMetadataRead(\n req: MetadataReadWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const metadata = new MetadataReader(this.runtime, session).read(signal);\n return wirePack({ tag: 'metadata.read', metadata });\n }\n\n private handleMetadataUpdate(\n req: MetadataUpdateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new MetadataMutator(this.runtime, session);\n const result = mutator.update(req.patch, signal);\n return this.finishMutation(session, { tag: 'metadata.update', result }, req.artifactPath);\n }\n\n private handleActionsRead(\n req: ActionsReadWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const snapshot = new DocumentActionsReader(this.runtime, session).read(signal);\n return wirePack({ tag: 'actions.read', snapshot });\n }\n\n private handleAnnotationsListRawAll(\n req: AnnotationsListRawAllWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new RawAnnotationReader(this.runtime, session, this.fonts);\n const snapshot = reader.listAll(signal);\n return wirePack({ tag: 'annotations.listRawAll', snapshot });\n }\n\n private handleAnnotationsListRawPage(\n req: AnnotationsListRawPageWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new RawAnnotationReader(this.runtime, session, this.fonts);\n const snapshot = reader.listOne(req.pageObjectNumber, signal);\n return wirePack({ tag: 'annotations.listRawPage', snapshot });\n }\n\n private handleAnnotationsListFullPage(\n req: AnnotationsListFullPageWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new AnnotationReader(this.runtime, session, this.fonts);\n const snapshot = reader.list(req.pageObjectNumber, signal);\n return wirePack({ tag: 'annotations.listFullPage', snapshot });\n }\n\n private handleAnnotationsRenderAppearances(\n req: AnnotationsRenderAppearancesWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new AnnotationAppearanceReader(this.runtime, session);\n const result = reader.render(req.pageObjectNumber, req.options ?? {}, signal);\n // Transfer every appearance raster buffer back zero-copy, like pages.render.\n const transfer = result.appearances.map((a) => a.raster.data);\n return wirePack({ tag: 'annotations.renderAppearances', result }, transfer);\n }\n\n private handleAnnotationsCreate(\n req: AnnotationsCreateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session, this.fonts);\n const result = mutator.create(\n req.pageObjectNumber,\n req.draft,\n signal,\n req.actor,\n req.resources,\n );\n return this.finishMutation(session, { tag: 'annotations.create', result }, req.artifactPath);\n }\n\n private handleAnnotationsUpdate(\n req: AnnotationsUpdateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session, this.fonts);\n const result = mutator.update(req.ref, req.patch, signal, req.actor, req.resources);\n return this.finishMutation(session, { tag: 'annotations.update', result }, req.artifactPath);\n }\n\n private handleAnnotationsDelete(\n req: AnnotationsDeleteWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session);\n const result = mutator.delete(req.ref, signal);\n return this.finishMutation(session, { tag: 'annotations.delete', result }, req.artifactPath);\n }\n\n private handleAnnotationsFlatten(\n req: AnnotationsFlattenWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new AnnotationFlattener(this.runtime, session).flatten(\n req.pageObjectNumber,\n req.refs,\n req.usage,\n signal,\n );\n if (result.meta === null) return wirePack({ tag: 'annotations.flatten', result });\n return this.finishMutation(session, { tag: 'annotations.flatten', result }, req.artifactPath);\n }\n\n private handleAnnotationsExportAppearance(\n req: AnnotationsExportAppearanceWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const exported = new AnnotationFlattener(this.runtime, session).exportAppearance(\n req.pageObjectNumber,\n req.refs,\n signal,\n );\n // A read: no finishMutation, no layer artifact. Bytes transfer zero-copy.\n return wirePack(\n { tag: 'annotations.exportAppearance', bytes: exported.bytes, size: exported.size },\n [exported.bytes],\n );\n }\n\n private handleAnnotationsMove(\n req: AnnotationsMoveWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AnnotationMutator(this.runtime, session);\n const result = mutator.move(req.pageObjectNumber, req.refs, req.toIndex, signal);\n return this.finishMutation(session, { tag: 'annotations.move', result }, req.artifactPath);\n }\n\n private handlePagesList(\n req: PagesListWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PagesReader(this.runtime, session);\n const snapshot = reader.read(signal);\n return wirePack({ tag: 'pages.list', snapshot });\n }\n\n private handlePagesMove(\n req: PagesMoveWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.move(req.pageObjectNumbers, req.destIndex, signal);\n return this.finishMutation(session, { tag: 'pages.move', result }, req.artifactPath);\n }\n\n private handlePagesRotate(\n req: PagesRotateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.rotate(req.pageObjectNumbers, req.rotation, signal);\n return this.finishMutation(session, { tag: 'pages.rotate', result }, req.artifactPath);\n }\n\n private handlePagesDelete(\n req: PagesDeleteWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.delete(req.pageObjectNumbers, signal);\n return this.finishMutation(session, { tag: 'pages.delete', result }, req.artifactPath);\n }\n\n private handlePagesSetName(\n req: PagesSetNameWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.setName(\n {\n name: req.name,\n pageObjectNumber: req.pageObjectNumber,\n ...(req.replace !== undefined ? { replace: req.replace } : {}),\n },\n signal,\n );\n return this.finishMutation(session, { tag: 'pages.setName', result }, req.artifactPath);\n }\n\n private handlePagesRemoveName(\n req: PagesRemoveNameWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new PagesMutator(this.runtime, session);\n const result = mutator.removeName({ name: req.name }, signal);\n return this.finishMutation(session, { tag: 'pages.removeName', result }, req.artifactPath);\n }\n\n private handlePagesFlatten(\n req: PagesFlattenWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new PagesFlattener(this.runtime, session).flatten(\n req.pageObjectNumbers,\n req.usage,\n signal,\n );\n if (result.meta === null) return wirePack({ tag: 'pages.flatten', result });\n return this.finishMutation(session, { tag: 'pages.flatten', result }, req.artifactPath);\n }\n\n private handleRedactionApply(\n req: RedactionApplyWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new RedactionApplier(this.runtime, session).apply(req.scope, signal);\n if (result.meta === null) return wirePack({ tag: 'redaction.apply', result });\n return this.finishMutation(session, { tag: 'redaction.apply', result }, req.artifactPath);\n }\n\n private handlePagesExtract(\n req: PagesExtractWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const extracted = new PagesExtractor(this.runtime, session).extract(\n req.pageObjectNumbers,\n signal,\n );\n // A read: no finishMutation, no layer artifact. Bytes transfer zero-copy.\n return wirePack({ tag: 'pages.extract', bytes: extracted.bytes, size: extracted.size }, [\n extracted.bytes,\n ]);\n }\n\n private handlePagesInsert(\n req: PagesInsertWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const inserter = new PagesInserter(this.runtime, session);\n const result = inserter.insert(req.bytes, req.destIndex, signal);\n return this.finishMutation(session, { tag: 'pages.insert', result }, req.artifactPath);\n }\n\n private handlePagesInsertBlank(\n req: PagesInsertBlankWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const inserter = new PagesInserter(this.runtime, session);\n const result = inserter.insertBlank(\n { size: req.size, count: req.count },\n req.destIndex,\n signal,\n );\n return this.finishMutation(session, { tag: 'pages.insertBlank', result }, req.artifactPath);\n }\n\n private handleAttachmentsList(\n req: AttachmentsListWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const items = new AttachmentReader(this.runtime, session).list(signal);\n return wirePack({ tag: 'attachments.list', items });\n }\n\n private handleAttachmentsReadFile(\n req: AttachmentsReadFileWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const content = new AttachmentReader(this.runtime, session).readFile(\n req.ref,\n req.path,\n req.maxDecodedBytes,\n signal,\n );\n // A read: no finishMutation, no layer artifact. Buffer-mode bytes\n // transfer zero-copy; path mode carries metadata only.\n return wirePack(\n { tag: 'attachments.readFile', content },\n content.bytes !== undefined ? [content.bytes] : [],\n );\n }\n\n private handleAttachmentsCreate(\n req: AttachmentsCreateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AttachmentMutator(this.runtime, session);\n const result = mutator.create(req.file, req.resources, signal);\n return this.finishMutation(session, { tag: 'attachments.create', result }, req.artifactPath);\n }\n\n private handleAttachmentsDelete(\n req: AttachmentsDeleteWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new AttachmentMutator(this.runtime, session);\n const result = mutator.delete(req.ref, signal);\n return this.finishMutation(session, { tag: 'attachments.delete', result }, req.artifactPath);\n }\n\n private handleAnnotationsReadFile(\n req: AnnotationsReadFileWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const content = new AttachmentReader(this.runtime, session).readAnnotationFile(\n req.pageObjectNumber,\n req.ref,\n req.path,\n req.maxDecodedBytes,\n signal,\n );\n return wirePack(\n { tag: 'annotations.readFile', content },\n content.bytes !== undefined ? [content.bytes] : [],\n );\n }\n\n private handlePieceInfoRead(\n req: PieceInfoReadWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n const snapshot = accessor.read(req.application, signal);\n return wirePack({ tag: 'pieceInfo.read', snapshot });\n }\n\n private handlePieceInfoUpdate(\n req: PieceInfoUpdateWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n accessor.update(req.application, req.patch, signal);\n // A mutation: layer sessions persist the artifact like every other write.\n return this.finishMutation(session, { tag: 'pieceInfo.update' }, req.artifactPath);\n }\n\n private handlePieceInfoApplications(\n req: PieceInfoApplicationsWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n const applications = accessor.applications(signal);\n return wirePack({ tag: 'pieceInfo.applications', applications });\n }\n\n private handlePieceInfoClear(\n req: PieceInfoClearWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const accessor = new PieceInfoAccessor(this.runtime, session, req.pageObjectNumber);\n accessor.clear(req.application, signal);\n return this.finishMutation(session, { tag: 'pieceInfo.clear' }, req.artifactPath);\n }\n\n private handlePagesText(\n req: PagesTextWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PageTextReader(this.runtime, session);\n const snapshot = reader.read(req.pageObjectNumber, signal);\n return wirePack({ tag: 'pages.text', snapshot });\n }\n\n private handlePagesGeometry(\n req: PagesGeometryWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PageGeometryReader(this.runtime, session);\n const snapshot = reader.read(req.pageObjectNumber, signal);\n return wirePack({ tag: 'pages.geometry', snapshot });\n }\n\n private handleSearchQuery(\n req: SearchQueryWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new SearchReader(this.runtime, session);\n const slice = reader.query(req.request, signal);\n return wirePack({ tag: 'search.query', slice });\n }\n\n private handlePagesRender(\n req: PagesRenderWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new PageRenderReader(this.runtime, session);\n const raster = reader.render(req.pageObjectNumber, req.options ?? {}, signal);\n return wirePack({ tag: 'pages.render', raster }, [raster.data]);\n }\n\n private async receiveEncoded(\n msg:\n | PagesRenderEncodedWorkerRequest\n | DocumentRenderPageFileEncodedWorkerRequest\n | AnnotationsRenderAppearancesEncodedWorkerRequest,\n ): Promise<void> {\n // Fail-fast BEFORE any native work: a host without an injected\n // encoder (browser/local workers) rejects the job without paying for\n // a raster it could never encode.\n if (!this.options.imageEncoder) {\n this.post(\n wirePack(\n {\n kind: 'reject',\n jobId: msg.jobId,\n error: serializeError(\n new EngineError(\n EngineErrorCode.NotImplemented,\n 'this engine has no image encoder (the *.renderEncoded kinds are cloud-server surface)',\n ),\n ),\n },\n EMPTY_TRANSFER,\n ),\n );\n return;\n }\n const ctrl = new AbortController();\n this.aborts.set(msg.jobId, ctrl);\n try {\n let resultPack: WirePack<WorkerResultPayload>;\n switch (msg.kind) {\n case 'pages.renderEncoded':\n resultPack = await this.handlePagesRenderEncoded(msg, ctrl.signal);\n break;\n case 'document.renderPageFileEncoded':\n resultPack = await this.handleDocumentRenderPageFileEncoded(msg, ctrl.signal);\n break;\n case 'annotations.renderAppearancesEncoded':\n resultPack = await this.handleAnnotationsRenderAppearancesEncoded(msg, ctrl.signal);\n break;\n }\n this.post(\n wirePack(\n { kind: 'resolve', jobId: msg.jobId, result: resultPack.payload },\n resultPack.transfer,\n ),\n );\n } catch (err) {\n this.post(\n wirePack({ kind: 'reject', jobId: msg.jobId, error: serializeError(err) }, EMPTY_TRANSFER),\n );\n } finally {\n this.aborts.delete(msg.jobId);\n }\n }\n\n private async encodeRaster(\n raster: PageRaster,\n encode: RenderEncode,\n signal: AbortSignal,\n ): Promise<EncodedImageWire> {\n const encoder = this.options.imageEncoder;\n if (!encoder) {\n throw new EngineError(\n EngineErrorCode.NotImplemented,\n 'this engine has no image encoder (the *.renderEncoded kinds are cloud-server surface)',\n );\n }\n const { bytes, contentType } = await encoder.encode(raster, encode);\n // The encoder is not abortable; honor a cancellation that arrived\n // while it ran by rejecting instead of resolving a dead job.\n if (signal.aborted) {\n throw new EngineError(EngineErrorCode.Aborted, 'aborted during image encode');\n }\n return { contentType, width: raster.width, height: raster.height, bytes };\n }\n\n private async handlePagesRenderEncoded(\n req: PagesRenderEncodedWorkerRequest,\n signal: AbortSignal,\n ): Promise<WirePack<WorkerResultPayload>> {\n const inner = this.handlePagesRender({ ...req, kind: 'pages.render' }, signal);\n if (inner.payload.tag !== 'pages.render') {\n throw new EngineError(EngineErrorCode.WireFormat, `unexpected ${inner.payload.tag}`);\n }\n const image = await this.encodeRaster(inner.payload.raster, req.encode, signal);\n return wirePack({ tag: 'pages.renderEncoded', image }, [image.bytes.buffer]);\n }\n\n private async handleDocumentRenderPageFileEncoded(\n req: DocumentRenderPageFileEncodedWorkerRequest,\n signal: AbortSignal,\n ): Promise<WirePack<WorkerResultPayload>> {\n // The transient session closes inside the sync handler's finally —\n // the raster owns its pixels, so encoding after close is sound.\n const inner = this.handleDocumentRenderPageFile(\n { ...req, kind: 'document.renderPageFile' },\n signal,\n );\n if (inner.payload.tag !== 'document.renderPageFile') {\n throw new EngineError(EngineErrorCode.WireFormat, `unexpected ${inner.payload.tag}`);\n }\n const image = await this.encodeRaster(inner.payload.raster, req.encode, signal);\n return wirePack(\n {\n tag: 'document.renderPageFileEncoded',\n pageObjectNumber: inner.payload.pageObjectNumber,\n pageCount: inner.payload.pageCount,\n image,\n },\n [image.bytes.buffer],\n );\n }\n\n private async handleAnnotationsRenderAppearancesEncoded(\n req: AnnotationsRenderAppearancesEncodedWorkerRequest,\n signal: AbortSignal,\n ): Promise<WirePack<WorkerResultPayload>> {\n const inner = this.handleAnnotationsRenderAppearances(\n { ...req, kind: 'annotations.renderAppearances' },\n signal,\n );\n if (inner.payload.tag !== 'annotations.renderAppearances') {\n throw new EngineError(EngineErrorCode.WireFormat, `unexpected ${inner.payload.tag}`);\n }\n const { pageState, appearances } = inner.payload.result;\n // SEQUENTIAL encode, deliberately: the whole raster batch already\n // exists in `inner` (peak memory is set by the render, not by encode\n // order), so fanning every appearance into the process-wide encoder\n // pool at once would only let one big batch monopolize it and starve\n // the encodes of interleaved jobs. One at a time matches the\n // previous API-side encoding loop exactly and keeps the pool fair.\n const encoded: EncodedAppearanceWire[] = [];\n for (const a of appearances) {\n encoded.push({\n ref: a.ref,\n mode: a.mode,\n rect: a.rect,\n image: await this.encodeRaster(a.raster, req.encode, signal),\n });\n }\n return wirePack(\n { tag: 'annotations.renderAppearancesEncoded', result: { pageState, appearances: encoded } },\n encoded.map((e) => e.image.bytes.buffer),\n );\n }\n\n private handleDocumentSaveBuffer(\n req: DocumentSaveBufferWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n // A save that changes nothing returns the loaded bytes verbatim: a\n // signed file must come back exactly as it was sealed. Whether anything\n // changed is the saver's answer (`snapshot`): the session's counter when\n // nothing was mutated, the fork's save pass otherwise — an annotation\n // added and removed again leaves the document as loaded.\n if (req.mode === 'incremental') {\n const snap = new DocumentSaver(this.runtime, session).snapshot();\n return wirePack(\n { tag: 'document.saveBuffer', bytes: snap.bytes, size: snap.bytes.byteLength },\n [snap.bytes],\n );\n }\n const saved = new DocumentSaver(this.runtime, session).saveStandaloneToBuffer(req.mode);\n return wirePack({ tag: 'document.saveBuffer', bytes: saved.bytes, size: saved.size }, [\n saved.bytes,\n ]);\n }\n\n private handleDocumentSaveFile(\n req: DocumentSaveFileWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n // The no-op save law for files: a session whose document is still the\n // one it was opened with streams its loaded bytes — for a layer, the\n // base PLUS the loaded delta, never the base file alone — verbatim. The\n // decision is the saver's (see handleDocumentSaveBuffer); when its pass\n // wrote nothing, nothing reached the file yet.\n const unchanged =\n req.mode === 'incremental' &&\n (!session.hasUnsavedEdits() ||\n new DocumentSaver(this.runtime, session).saveStandaloneToFileEx(req.path, req.mode)\n .unchangedSinceLoad);\n if (unchanged) {\n new DocumentSaver(this.runtime, session).copyLoadedBytesToFile(req.path);\n return wirePack({ tag: 'document.saveFile', path: req.path });\n }\n if (req.mode === 'incremental') {\n return wirePack({ tag: 'document.saveFile', path: req.path });\n }\n const saved = new DocumentSaver(this.runtime, session).saveStandaloneToFile(req.path, req.mode);\n return wirePack({ tag: 'document.saveFile', path: saved.path });\n }\n\n private handleDocumentSaveLayerBuffer(\n req: DocumentSaveLayerBufferWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n if (session.kind !== 'layer') {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'document has no layer to export (opened without a layer)',\n );\n }\n const artifact = new DocumentSaver(this.runtime, session).saveLayerArtifact();\n return wirePack(\n { tag: 'document.saveLayerBuffer', bytes: artifact.bytes, size: artifact.size },\n [artifact.bytes],\n );\n }\n\n private handleDocumentProbeSecurityFile(\n req: DocumentProbeSecurityFileWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const reader = new SecurityReader(this.runtime);\n const security = reader.probeFile(req.path, req.password);\n return wirePack({ tag: 'document.probeSecurityFile', security });\n }\n\n /**\n * One-shot file render (the derived-artifact warmer's producer): open the\n * base from a file path into a TRANSIENT session — never stored in\n * `this.sessions`, so it can't collide with (or leak into) live document\n * sessions — resolve the display index to its durable page object number,\n * render, close. Shares the base parse with concurrent ad-hoc opens of\n * the same file via the registry refcount.\n */\n private handleDocumentRenderPageFile(\n req: DocumentRenderPageFileWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = new DocumentSession(this.runtime);\n const base = this.baseDocuments.acquireFileBase({\n key: `adhoc-file:${req.path}`,\n path: req.path,\n password: req.password,\n });\n try {\n session.openFromHandle(\n openLayerDocument(this.runtime, base, { kind: 'fresh' }, req.password),\n );\n const layout = new PagesReader(this.runtime, session).read(signal);\n const page = layout.pages[req.pageIndex];\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `renderPageFile: no page at index ${req.pageIndex} (pageCount=${layout.pageCount})`,\n );\n }\n const raster = new PageRenderReader(this.runtime, session).render(\n page.pageObjectNumber,\n req.options ?? {},\n signal,\n );\n return wirePack(\n {\n tag: 'document.renderPageFile',\n pageObjectNumber: page.pageObjectNumber,\n pageCount: layout.pageCount,\n raster,\n },\n [raster.data],\n );\n } finally {\n // Closing the session releases the base acquisition through the\n // open handle's close stack (same lifecycle as live sessions).\n session.close();\n }\n }\n\n private handleDocumentCheckPasswordPermissions(\n req: DocumentCheckPasswordPermissionsWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n // The one handler that accepts a LOCKED session: on a locked session,\n // \"check this password\" means \"load the parked bytes with it\". A wrong\n // password throws DocPasswordIncorrect and the session stays parked\n // (bytes retained) for the next attempt.\n const parked = this.sessions.get(sessionKey(req.docId));\n let session: DocumentSession;\n if (parked?.isLocked()) {\n this.openSignedAware(parked, parked.lockedBytes(), req.password);\n parked.password = req.password;\n session = parked;\n } else {\n session = this.requireSession(req);\n }\n const security = new SecurityReader(this.runtime).checkPasswordPermissions(\n session,\n req.password,\n req.mode ?? 'any',\n );\n return wirePack({\n tag: 'document.checkPasswordPermissions',\n security,\n protection: this.probeProtection(session),\n });\n }\n\n private handleFontsRegister(req: FontsRegisterWorkerRequest): WirePack<WorkerResultPayload> {\n this.fonts.register(\n req.fontKey,\n req.familyName,\n req.weight,\n req.italic,\n new Uint8Array(req.data),\n );\n return wirePack({\n tag: 'fonts.register',\n fontKey: req.fontKey,\n identity: this.fonts.describe(req.fontKey),\n });\n }\n\n private handleFontsAuthorizeEditing(\n req: FontsAuthorizeEditingWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n return wirePack({\n tag: 'fonts.authorizeEditing',\n identity: this.fonts.authorizeEditing(req.fontKey),\n });\n }\n\n /** Per-document font and text-layout settings (session state). */\n private handleDocumentSetFontSettings(\n req: DocumentSetFontSettingsWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const docPtr = session.requireDocPtr();\n const { fn } = this.runtime;\n if (req.embeddingPolicy !== undefined) {\n const code = { default: 0, subset: 1, full: 2 }[req.embeddingPolicy];\n if (!fn.EPDFDoc_SetFontEmbeddingPolicy(docPtr, code)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'EPDFDoc_SetFontEmbeddingPolicy failed');\n }\n }\n if (req.typographicFeatures !== undefined) {\n if (!fn.EPDFDoc_SetTypographicFeatures(docPtr, req.typographicFeatures)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'EPDFDoc_SetTypographicFeatures failed');\n }\n }\n return wirePack({ tag: 'document.setFontSettings' });\n }\n\n private handleFontsAddFallback(\n req: FontsAddFallbackWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n this.fonts.addFallback(req.fontKey);\n return wirePack({ tag: 'fonts.addFallback' });\n }\n\n private handleFontsClearFallbacks(\n _req: FontsClearFallbacksWorkerRequest,\n ): WirePack<WorkerResultPayload> {\n this.fonts.clearFallbacks();\n return wirePack({ tag: 'fonts.clearFallbacks' });\n }\n\n private handleFontsClear(_req: FontsClearWorkerRequest): WirePack<WorkerResultPayload> {\n this.fonts.clear();\n return wirePack({ tag: 'fonts.clear' });\n }\n\n /**\n * Close exactly ONE layer session — the reload seam for layer-session\n * freshness. The base document's refcount releases through the session's\n * close stack, so sibling layer sessions (and the base session) are\n * untouched. Idempotent: closing an absent session is a no-op ack,\n * because the caller may be reloading a layer this worker never held\n * (e.g. after a pool eviction).\n */\n private handleLayerClose(req: LayerCloseWorkerRequest): WirePack<WorkerResultPayload> {\n const key = sessionKey(req.docId, req.layerName);\n const session = this.sessions.get(key);\n if (session) {\n disposeFormModel(this.runtime, session);\n disposeSignatureModel(this.runtime, session);\n session.close();\n this.sessions.delete(key);\n }\n return wirePack({ tag: 'close' });\n }\n\n private handleClose(req: CloseWorkerRequest): WirePack<WorkerResultPayload> {\n for (const [key, session] of Array.from(this.sessions.entries())) {\n if (!sessionKeyBelongsToDoc(key, req.docId)) continue;\n disposeFormModel(this.runtime, session);\n disposeSignatureModel(this.runtime, session);\n session.close();\n this.sessions.delete(key);\n }\n return wirePack({ tag: 'close' });\n }\n\n private handleShutdown(_req: ShutdownWorkerRequest): WirePack<WorkerResultPayload> {\n if (!this.destroyed) {\n this.destroyed = true;\n for (const session of this.sessions.values()) {\n disposeFormModel(this.runtime, session);\n disposeSignatureModel(this.runtime, session);\n session.close();\n }\n this.sessions.clear();\n this.baseDocuments.releaseAll();\n destroyLibrary(this.runtime);\n }\n return wirePack({ tag: 'shutdown' });\n }\n\n private requireSession(req: { docId: string; layerName?: string }): DocumentSession {\n const key = sessionKey(req.docId, req.layerName);\n const session = this.sessions.get(key);\n if (session?.isLocked()) {\n // Truthful error for any operation reaching a parked session: the\n // document exists but needs `security.unlock()` first.\n throw new EngineError(\n EngineErrorCode.DocPasswordRequired,\n `document session is password-locked: ${key}`,\n );\n }\n if (!session || !session.isOpen()) {\n throw new EngineError(EngineErrorCode.DocNotOpen, `document session not open: ${key}`);\n }\n return session;\n }\n\n /**\n * Finalize a mutation response. For a standalone session the mutation\n * result is returned as-is. For a layer session we additionally persist\n * the layer artifact (to file when `artifactPath` is given, otherwise to\n * a transferable buffer) and merge it onto the response envelope. This\n * is the one place the layer-vs-standalone branch lives, shared by every\n * annotation and page mutation handler.\n */\n private handleFormsList(\n req: FormsListWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new FormReader(this.runtime, session);\n return wirePack({ tag: 'forms.list', snapshot: reader.snapshot(signal) });\n }\n\n private handleFormsSetValue(\n req: FormsSetValueWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.setValue(req.ref, req.value, signal);\n return this.finishMutation(session, { tag: 'forms.setValue', result }, req.artifactPath);\n }\n\n private handleFormsReset(\n req: FormsResetWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.reset(req.ref, signal);\n return this.finishMutation(session, { tag: 'forms.reset', result }, req.artifactPath);\n }\n\n private handleFormsApplyEffects(\n req: FormsApplyEffectsWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const result = new FormsEffectsApplier(this.runtime, session).apply(req.effects, signal);\n if (result.meta === null) return wirePack({ tag: 'forms.applyEffects', result });\n return this.finishMutation(session, { tag: 'forms.applyEffects', result }, req.artifactPath);\n }\n\n private handleFormsExport(\n req: FormsExportWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const reader = new FormReader(this.runtime, session);\n const exported = reader.exportData(req.format, signal);\n return wirePack({ tag: 'forms.export', format: exported.format, bytes: exported.bytes }, [\n exported.bytes,\n ]);\n }\n\n private handleFormsImport(\n req: FormsImportWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.importData(req.data, req.format, signal);\n return this.finishMutation(session, { tag: 'forms.import', result }, req.artifactPath);\n }\n\n private handleFormsRepair(\n req: FormsRepairWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const result = mutator.repair(req.bakeAppearances ?? false, signal);\n return this.finishMutation(session, { tag: 'forms.repair', result }, req.artifactPath);\n }\n\n private handleFormsCreateField(\n req: FormsCreateFieldWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.createField(req.draft, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.createField', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private handleFormsUpdateField(\n req: FormsUpdateFieldWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.updateField(req.ref, req.patch, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.updateField', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private handleFormsSetSignatureAppearance(\n req: FormsSetSignatureAppearanceWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const { field, pages } = new FormMutator(this.runtime, session).setSignatureAppearance(\n req.ref,\n new Uint8Array(req.pdf),\n req.pageIndex,\n signal,\n );\n const meta: MutationMeta = {\n affectedPages: pages.map((pon) => session.pageState(pon)),\n cacheDelta: null,\n };\n return this.finishMutation(\n session,\n { tag: 'forms.setSignatureAppearance', result: { field, meta } },\n req.artifactPath,\n );\n }\n\n private handleFormsDeleteField(\n req: FormsDeleteFieldWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { deletedFieldObjectNumber, detachedWidgets } = mutator.deleteField(req.ref, signal);\n\n // Cascade: the mutator detached the widgets (inert annotations now);\n // deleting them through the annotation feature keeps /Annots\n // bookkeeping, weak-ref invalidation, and page revisions in ONE place.\n const annotations = new AnnotationMutator(this.runtime, session);\n for (const widget of detachedWidgets) {\n if (widget.annotObjectNumber <= 0 || widget.pageObjectNumber <= 0) continue;\n annotations.delete(\n {\n kind: 'objectNumber',\n pageObjectNumber: widget.pageObjectNumber,\n annotObjectNumber: widget.annotObjectNumber,\n },\n signal,\n );\n }\n // The annotation deletes above mutated /Annots after the form\n // mutator's own bump; bump again so the form-model cache rebuilds.\n session.noteMutation();\n\n return this.finishMutation(\n session,\n {\n tag: 'forms.deleteField',\n result: {\n deletedFieldObjectNumber,\n removedWidgets: detachedWidgets,\n meta: EMPTY_FORM_META,\n },\n },\n req.artifactPath,\n );\n }\n\n private handleFormsAttachWidget(\n req: FormsAttachWidgetWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.attachWidget(req.ref, req.widget, req.onState, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.attachWidget', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private handleFormsDetachWidget(\n req: FormsDetachWidgetWorkerRequest,\n signal: AbortSignal,\n ): WirePack<WorkerResultPayload> {\n const session = this.requireSession(req);\n const mutator = new FormMutator(this.runtime, session);\n const { field } = mutator.detachWidget(req.ref, req.widget, signal);\n return this.finishMutation(\n session,\n { tag: 'forms.detachWidget', result: { field, meta: EMPTY_FORM_META } },\n req.artifactPath,\n );\n }\n\n private finishMutation<P extends WorkerResultPayload>(\n session: DocumentSession,\n payload: P,\n artifactPath?: string,\n ): WirePack<WorkerResultPayload> {\n // Every successful mutation funnels through here; the sequence bump\n // invalidates version-keyed caches (the forms model). Forms mutators\n // bump themselves before reading back, so their tags are skipped to\n // avoid rebuilding the model cache twice per write — as do the\n // flattener and redaction applier, which note the mutation before\n // their post-apply annotation re-read.\n if (\n !payload.tag.startsWith('forms.') &&\n payload.tag !== 'pages.flatten' &&\n payload.tag !== 'redaction.apply' &&\n payload.tag !== 'signatures.complete'\n ) {\n session.noteMutation();\n }\n if (session.kind !== 'layer' || !session.persistLayerArtifact) {\n return wirePack(payload);\n }\n const saved = this.saveLayerArtifact(session, artifactPath);\n return wirePack({ ...payload, ...saved.payload }, saved.transfer);\n }\n\n private saveLayerArtifact(session: DocumentSession, artifactPath?: string): LayerArtifactSave {\n const saver = new DocumentSaver(this.runtime, session);\n if (artifactPath) {\n const artifactFile = saver.saveLayerArtifactToFile(artifactPath);\n return { payload: { artifactFile }, transfer: [] };\n }\n const artifact = saver.saveLayerArtifact();\n return { payload: { artifact }, transfer: [artifact.bytes] };\n }\n}\n\ninterface LayerArtifactSave {\n payload: { artifact: { bytes: ArrayBuffer; size: number } } | { artifactFile: { path: string } };\n transfer: ArrayBuffer[];\n}\n\n/** Form mutations are non-structural at the page-list level. */\nconst EMPTY_FORM_META: MutationMeta = { affectedPages: [], cacheDelta: null };\n\nconst BASE_SESSION_SUFFIX = '__base__';\n\n/** Every request kind that writes to a session's document. */\nconst MUTATING_KINDS: ReadonlySet<WorkerRequest['kind']> = new Set<WorkerRequest['kind']>([\n 'metadata.update',\n 'annotations.create',\n 'annotations.update',\n 'annotations.delete',\n 'annotations.move',\n 'annotations.flatten',\n 'forms.setValue',\n 'forms.reset',\n 'forms.applyEffects',\n 'forms.import',\n 'forms.repair',\n 'forms.createField',\n 'forms.updateField',\n 'forms.setSignatureAppearance',\n 'forms.deleteField',\n 'forms.attachWidget',\n 'forms.detachWidget',\n 'pages.move',\n 'pages.rotate',\n 'pages.delete',\n 'pages.setName',\n 'pages.removeName',\n 'pages.flatten',\n 'pages.insert',\n 'pages.insertBlank',\n 'redaction.apply',\n 'attachments.create',\n 'attachments.delete',\n 'pieceInfo.update',\n 'pieceInfo.clear',\n]);\n\nfunction sessionKey(docId: string, layerName?: string): string {\n return `${docId}::${layerName ? `layer:${layerName}` : BASE_SESSION_SUFFIX}`;\n}\n\nfunction sessionKeyBelongsToDoc(key: string, docId: string): boolean {\n return key === sessionKey(docId) || key.startsWith(`${docId}::layer:`);\n}\n\nfunction isPasswordOpenError(error: unknown): boolean {\n return (\n error instanceof EngineError &&\n (error.code === EngineErrorCode.DocPasswordRequired ||\n error.code === EngineErrorCode.DocPasswordIncorrect)\n );\n}\n\n/**\n * The security probe a locked open answers with — identical to what\n * `SecurityReader.probeFile` reports for a password-protected file it\n * couldn't read: encrypted, password required, permissions unknown.\n * `securityStateFromProbe` + `passwordPromptFromState` on the client\n * turn this into `passwordPrompt: { state: 'required' }`.\n */\nfunction passwordRequiredProbe() {\n return {\n encryptionState: 'encrypted' as const,\n encryptionRequiresPassword: true,\n securityHandlerRevision: null,\n pdfPermissionsBits: null,\n pdfPermissionsAllAllowed: null,\n pdfOpenedAs: null,\n securityProbedAt: Date.now(),\n };\n}\n"],"mappings":";;;;AAEA,MAAM,8BAAc,IAAI,QAA0B;;;;;;AAOlD,SAAgB,kBAAkB,SAAiC;CACjE,IAAI,YAAY,IAAI,OAAO,GAAG;CAC9B,QAAQ,GAAG,gBAAgB;CAC3B,YAAY,IAAI,OAAO;AACzB;;;;;AAMA,SAAgB,eAAe,SAAiC;CAC9D,IAAI,CAAC,YAAY,IAAI,OAAO,GAAG;CAC/B,QAAQ,GAAG,oBAAoB;CAC/B,YAAY,OAAO,OAAO;AAC5B;;;;;;;;AChBA,SAAgB,eAAe,QAA2B;CACxD,IAAI,OAAO,SAAS;EAClB,MAAM,SAAS,OAAO;EACtB,IAAI,kBAAkB,OAAO,MAAM;EACnC,MAAM,IAAIA,8BAAAA,WAAW,MAAM;CAC7B;AACF;;;;;;;;;;;;;;;;;;;;ACIA,SAAgB,eAAuB;CACrC,MAAM,QAAQ,WAAW,OAAO,gCAAgB,IAAI,WAAW,EAAE,CAAC;CAElE,MAAM,KAAM,MAAM,KAAM,KAAQ;CAChC,MAAM,KAAM,MAAM,KAAM,KAAQ;CAChC,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;CAC7E,OAAO,GAAG,IAAI,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,GAAG,EAAE,EAAE,GAAG,IAAI,MAAM,IAAI,EAAE,EAAE,GAAG,IAAI,MAAM,IAAI,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE;AACzG;;;;;;;;;;;;;;;;;;;;;;;ACHA,SAAgB,aAAa,KAA4B;CACvD,MAAM,QACJ,gFAAgF,KAAK,GAAG;CAC1F,IAAI,CAAC,OAAO,OAAO;CAEnB,MAAM,GAAG,OAAO,QAAQ,OAAO,OAAO,OAAO,SAAS,MAAM,SAAS,WAAW;CAChF,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,KAAK,OAAO,MAAM,IAAI;CAC5B,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,IAAI,OAAO,KAAK;CACtB,MAAM,IAAI,OAAO,KAAK;CAItB,MAAM,4BAAY,IAAI,KAAK,CAAC;CAC5B,UAAU,eAAe,GAAG,IAAI,CAAC;CACjC,UAAU,YAAY,GAAG,GAAG,GAAG,CAAC;CAIhC,IACE,UAAU,eAAe,MAAM,KAC/B,UAAU,YAAY,MAAM,MAC5B,UAAU,WAAW,MAAM,KAC3B,UAAU,YAAY,MAAM,KAC5B,UAAU,cAAc,MAAM,KAC9B,UAAU,cAAc,MAAM,GAE9B,OAAO;CAGT,IAAI,gBAAgB;CACpB,IAAI,MAAM;EACR,MAAM,MAAM,OAAO,OAAO;EAC1B,MAAM,MAAM,OAAO,OAAO;EAC1B,IAAI,MAAM,MAAM,MAAM,IAAI,OAAO;EAEjC,iBAAiB,MAAM,KAAK,QAAQ,SAAS,MAAM,IAAI;CACzD;CAEA,wBAAO,IAAI,KAAK,UAAU,QAAQ,IAAI,gBAAgB,GAAM,EAAA,CAAE,YAAY;AAC5E;;;;;;;;;;;;;AAcA,SAAgB,cAAc,oBAAU,IAAI,KAAK,GAAW;CAC1D,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,IAAI,WAAW,+BAA+B;CAEnF,MAAM,OAAO,GAAW,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;CAC3D,MAAM,OAAO,EAAE,YAAY;CAC3B,IAAI,OAAO,KAAK,OAAO,MAAM,MAAM,IAAI,WAAW,qCAAqC;CAEvF,MAAM,YAAY,CAAC,EAAE,kBAAkB;CACvC,MAAM,OAAO,aAAa,IAAI,MAAM;CACpC,MAAM,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,SAAS,IAAI,EAAE,CAAC;CACpD,MAAM,MAAM,IAAI,KAAK,IAAI,SAAS,IAAI,EAAE;CACxC,OACE,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,IACxD,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,IAC5D,OAAO,IAAI,GAAG,IAAI;AAEzB;;;;;;;;ACxFA,SAAgB,IAAI,OAAuB;CACzC,OAAO,UAAU;AACnB;;;;;;;;ACAA,MAAa,oCAAoC;;AAGjD,MAAa,eAAe;;AAG5B,SAAgB,kCAAkC,MAAuB;CACvE,QACG,IAAI,IAAI,IAAI,uCAAuC,MAAM;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACIA,IAAa,WAAb,MAAqD;CAInD,YAGE,mBAA4D,QAAQ;EAClE,qBAAqB;GACnB,MAAM;EACR,CAAC;CACH,GACA;EALiB,KAAA,kBAAA;EANF,gBAAA,MAAA,6BAAY,IAAI,IAAoC,CAAA;EAC7D,gBAAA,MAAA,YAA0B,IAAA;CAU/B;CAEH,UAAU,UAAsD;EAC9D,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa;GACX,KAAK,UAAU,OAAO,QAAQ;EAChC;CACF;CAEA,QAAQ,OAA4B;EAGlC,IAAI,YAAY,OAAO;GACrB,MAAM,EAAE,aAAa,MAAM;GAC3B,IAAI,aAAa,MACf,KAAK,WAAW,KAAK,aAAa,OAAO,WAAW,KAAK,IAAI,KAAK,UAAU,QAAQ;EAExF;EAGA,KAAK,MAAM,YAAY,CAAC,GAAG,KAAK,SAAS,GACvC,IAAI;GACF,SAAS,KAAK;EAChB,SAAS,KAAK;GACZ,KAAK,gBAAgB,GAAG;EAC1B;CAEJ;CAEA,eAA8B;EAC5B,OAAO,KAAK;CACd;;CAGA,QAAc;EACZ,KAAK,UAAU,MAAM;CACvB;AACF;;;;;;;AAQA,IAAa,wBAAb,MAAmC;CACjC,YACE,KACA,WACA,MAAsC,MACtC;EAHiB,KAAA,MAAA;EACA,KAAA,YAAA;EACA,KAAA,MAAA;CAChB;;CAGH,aAAa,OAAgC;EAC3C,KAAK,IAAI,QAAQ;GACf,GAAG;GACH,QAAQ;IACN,MAAM;IACN,WAAW,KAAK;IAChB,KAAK,KAAK;IACV,IAAI,KAAK,IAAI;IACb,UAAU;GACZ;EACF,CAAkB;CACpB;AACF;;;;;;;;;;;ACxFA,SAAgB,YAAe,KAAuB,OAAe,MAA0B;CAC7F,MAAM,MAAM,IAAI,MAAM,KAAK;CAC3B,IAAI;EACF,OAAO,KAAK,GAAG;CACjB,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;AAOA,SAAgB,aACd,KACA,OACA,MACG;CACH,MAAM,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,CAAC;CAChD,IAAI;EACF,OAAO,KAAK,IAAI;CAClB,UAAU;EACR,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KACpC,IAAI,KAAK,KAAK,EAAE;CAEpB;AACF;;;;;;;;;;;;;;;;;;ACjBA,SAAgB,gBACd,KACA,MACA,UAAqB,IACN;CACf,MAAM,MAAM,KAAKC,yBAAAA,UAAU,CAAC;CAC5B,IAAI,OAAO,GAAG,OAAO;CACrB,IAAI,QAAQ,GAAG,OAAO;CACtB,OAAO,YAAY,KAAK,MAAM,QAAQ;EAEpC,IADgB,KAAK,KAAK,GAChB,KAAK,GAAG,OAAO;EACzB,OAAO,IAAI,cAAc,GAAG;CAC9B,CAAC;AACH;;;;;;;AAQA,SAAgB,eACd,KACA,MACe;CACf,MAAM,MAAM,KAAKA,yBAAAA,UAAU,CAAC;CAC5B,IAAI,OAAO,GAAG,OAAO;CACrB,OAAO,YAAY,KAAK,MAAM,QAAQ;EAEpC,IADgB,KAAK,KAAK,GAChB,KAAK,GAAG,OAAO;EACzB,OAAO,IAAI,aAAa,GAAG;CAC7B,CAAC;AACH;;;;;;AAOA,SAAgB,iBACd,KACA,OACA,KACS;CACT,MAAM,MAAM,IAAI,eAAe,KAAK;CACpC,IAAI;EACF,OAAO,IAAI,GAAG;CAChB,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;AAMA,SAAgB,gBACd,KACA,OACA,IACG;CACH,MAAM,UAAU,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;CAC9C,MAAM,QAAQ,IAAI,WAAW,QAAQ,aAAa,CAAC;CACnD,MAAM,IAAI,OAAO;CACjB,MAAM,MAAM,IAAI,MAAM,MAAM,UAAU;CACtC,IAAI;EACF,IAAI,WAAW,KAAK,KAAK;EACzB,OAAO,GAAG,GAAG;CACf,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;ACpFA,MAAMC,sBAAoB;AA0C1B,IAAa,aAAb,MAAwB;;EACL,gBAAA,MAAA,WAA6B,CAAC,CAAA;EACvC,gBAAA,MAAA,UAAS,KAAA;;CAEjB,KAAK,QAA0B;EAC7B,IAAI,KAAK,QAAQ;GACf,OAAO;GACP;EACF;EACA,KAAK,QAAQ,KAAK,MAAM;CAC1B;CAEA,QAAc;EACZ,IAAI,KAAK,QAAQ;EACjB,KAAK,SAAS;EACd,IAAI,aAAsB;EAC1B,KAAK,IAAI,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,GAAG,KAC5C,IAAI;GACF,KAAK,QAAQ,EAAE,GAAG;EACpB,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EAEF,KAAK,QAAQ,SAAS;EACtB,IAAI,YAAY,MAAM;CACxB;AACF;AAEA,SAAgB,sBACd,SACA,OACA,WAA0B,MACP;CACnB,MAAM,EAAE,KAAK,OAAO;CACpB,MAAM,QAAQ,IAAI,WAAW;CAC7B,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;CAC1C,MAAM,WAAW,IAAI,KAAK,OAAO,CAAC;CAElC,IAAI;EACF,IAAI,WAAW,SAAS,KAAK;EAC7B,MAAM,SAAS,GAAG,uBAAuB,SAAS,MAAM,YAAY,YAAY,EAAE;EAClF,IAAI,CAAC,QAAQ;GAIX,IAAI,GAAG,kBAAkB,MAAMA,qBAC7B,MAAM,WACF,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,sBAAsB,6BAA6B,IACnF,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,qBAAqB,8BAA8B;GAEzF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;EAChF;EACA,sCAAsC,SAAS,MAAM;EACrD,MAAM,WAAW,GAAG,mBAAmB,MAAM,CAAC;EAC9C,OAAO;GACL,MAAM;GACN;GACA,QAAQ;IAAE,MAAM;IAAM,OAAO;IAAM;GAAS;GAC5C,aAAa,MAAM,MAAM;EAC3B;CACF,SAAS,OAAO;EACd,MAAM,MAAM;EACZ,MAAM;CACR;AACF;AAEA,SAAgB,kBACd,SACA,MACA,QAAqB,EAAE,MAAM,QAAQ,GACrC,WAA0B,MACP;CACnB,MAAM,EAAE,KAAK,OAAO;CACpB,MAAM,QAAQ,IAAI,WAAW;CAC7B,MAAM,WAAW,KAAK,QAAQ,CAAC;CAE/B,IAAI,cAA0C;CAC9C,MAAM,YAAY,IAAI,MAAM,CAAC;CAC7B,IAAI;EACF,IAAI,KAAK,WAAW,OAAO,EAAE;EAC7B,IAAI;EACJ,IAAI,MAAM,SAAS,SACjB,SAAS,GAAG,oBAAoB,KAAK,SAASC,yBAAAA,UAAU,YAAY,IAAI,SAAS;OAC5E,IAAI,MAAM,SAAS,mBAAmB,QAAQ,SAAS,UAI5D,SAAS,gBAAgB,KAAK,MAAM,OAAO,YACzC,GAAG,oCAAoC,KAAK,SAAS,SAAS,YAAY,IAAI,SAAS,CACzF;OACK;GACL,cACE,MAAM,SAAS,kBACX,QAAQ,WAAW,aAAa,MAAM,IAAI,IAC1C,QAAQ,WAAW,WAAW,MAAM,KAAK;GAC/C,MAAM,WAAW,aAAa,MAAM,CAAC;GACrC,SACE,MAAM,SAAS,cAAc,MAAM,SAAS,kBACxC,GAAG,4BAA4B,KAAK,SAAS,YAAY,KAAK,YAAY,IAAI,SAAS,IACvF,GAAG,oBAAoB,KAAK,SAAS,YAAY,KAAK,YAAY,IAAI,SAAS;EACvF;EAEA,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;EAChD,IAAI,CAAC,UAAU,WAAW,GACxB,MAAM,eAAe,MAAM;EAG7B,sCAAsC,SAAS,MAAM;EACrD,MAAM,WAAW,GAAG,mBAAmB,MAAM,CAAC;EAC9C,MAAM,aACJ,KAAK,SAAS,UAAU,KAAK,SAAS,KAAA,IAClC;GAAE,MAAM;GAAQ,KAAK,KAAK;GAAK,MAAM,KAAK;EAAK,IAC/C;GAAE,MAAM;GAAU,KAAK,KAAK;EAAI;EACtC,OAAO;GACL,MAAM;GACN;GACA,QAAQ;IAAE,MAAM;IAAY;IAAO;GAAS;GAC5C,aAAa,MAAM,MAAM;EAC3B;CACF,SAAS,OAAO;EACd,MAAM,MAAM;EACZ,MAAM;CACR,UAAU;EACR,IAAI,KAAK,SAAS;CACpB;AACF;AAEA,SAAgB,sCACd,SACA,QACM;CACN,MAAM,EAAE,OAAO;CACf,IAAI,GAAG,oBAAoB,GAAG,mCAAmC,GAAG,iBAAiB,MAAM,GACzF,GAAG,gCAAgC,QAAQ,IAAI;AAEnD;AAEA,SAAS,eAAe,QAA6B;CACnD,QAAQ,QAAR;EACE,KAAK,GACH,OAAO,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,qBAAqB,2BAA2B;EACzF,KAAK,GACH,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,0BAA0B;EACjF,KAAK,GACH,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,cAChB,0DACF;EACF,SACE,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,+BAA+B;CACzF;AACF;;;;;;;;;;;;;;;;;;;ACpLA,IAAa,cAAb,MAAyB;CAGvB,YACE,SACA,QACA;EAFiB,KAAA,UAAA;EACA,KAAA,SAAA;EAJF,gBAAA,MAAA,0BAAS,IAAI,IAAkD,CAAA;CAK7E;CAEH,QAAQ,kBAAyC;EAC/C,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,WAAW,KAAK,OAAO,IAAI,gBAAgB;EACjD,IAAI,UAAU;GACZ,SAAS;GACT,OAAO,SAAS;EAClB;EACA,MAAM,MAAM,GAAG,yCAAyC,KAAK,QAAQ,gBAAgB;EACrF,IAAI,CAAC,KACH,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,kBAChC;EAEF,KAAK,OAAO,IAAI,kBAAkB;GAAE;GAAK,MAAM;EAAE,CAAC;EAClD,OAAO;CACT;;;;;;;;CASA,OAAO,kBAA6C;EAClD,OAAO,KAAK,OAAO,IAAI,gBAAgB;CACzC;CAEA,QAAQ,kBAA0C;EAChD,MAAM,QAAQ,KAAK,OAAO,IAAI,gBAAgB;EAC9C,IAAI,CAAC,OAAO;EACZ,MAAM;EACN,IAAI,MAAM,QAAQ,GAAG;GACnB,KAAK,QAAQ,GAAG,eAAe,MAAM,GAAG;GACxC,KAAK,OAAO,OAAO,gBAAgB;EACrC;CACF;CAEA,WAAiB;EACf,MAAM,EAAE,OAAO,KAAK;EACpB,KAAK,MAAM,EAAE,SAAS,KAAK,OAAO,OAAO,GACvC,GAAG,eAAe,GAAG;EAEvB,KAAK,OAAO,MAAM;CACpB;AACF;;;;;;;;;;;;ACvCA,IAAa,yBAAb,MAAiE;CAI/D,YAAY,cAAsC;EAAtB,KAAA,eAAA;EAHX,gBAAA,MAAA,+BAAc,IAAI,IAA8B,CAAA;EAChD,gBAAA,MAAA,wCAAuB,IAAI,IAA2C,CAAA;CAEpC;;CAGnD,QAAQ,kBAA4C;EAClD,OAAO,KAAK,YAAY,IAAI,gBAAgB,KAAK;CACnD;;CAGA,MAAM,kBAAmD;EACvD,OAAO;GACL,cAAc,KAAK;GACnB;GACA,YAAY,KAAK,QAAQ,gBAAgB;EAC3C;CACF;;;;;CAMA,KAAK,kBAAmD;EACtD,MAAM,OAAO,KAAK,QAAQ,gBAAgB,IAAI;EAC9C,KAAK,YAAY,IAAI,kBAAkB,IAAI;EAC3C,OAAO,KAAK,MAAM,gBAAgB;CACpC;;;;;CAMA,SAAS,OAA4B;EACnC,IAAI,MAAM,iBAAiB,KAAK,cAC9B,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,0DACA,EAAE,SAAS,EAAE,MAAM,EAAE,CACvB;EAEF,MAAM,UAAU,KAAK,MAAM,MAAM,gBAAgB;EACjD,IAAI,EAAA,GAAA,8BAAA,oBAAA,CAAqB,SAAS,KAAK,GACrC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,2BAA2B,EACjF,SAAS;GAAE,UAAU;GAAO;EAAQ,EACtC,CAAC;CAEL;CAEA,oBAAoB,kBAAyD;EAC3E,OAAO,KAAK,qBAAqB,IAAI,gBAAgB,KAAKC,8BAAAA;CAC5D;CAEA,0BAA0B,kBAAoC,OAAkC;EAC9F,KAAK,qBAAqB,IAAI,kBAAkB,KAAK;CACvD;CAEA,KAAK,kBAA0C;EAC7C,KAAK,YAAY,OAAO,gBAAgB;EACxC,KAAK,qBAAqB,OAAO,gBAAgB;CACnD;CAEA,QAAc;EACZ,KAAK,YAAY,MAAM;EACvB,KAAK,qBAAqB,MAAM;CAClC;AACF;;;ACjCA,IAAa,kBAAb,MAA6B;CAgD3B,YACE,SACA,WACA;EAFiB,KAAA,UAAA;EAhDX,gBAAA,MAAA,UAAqB,IAAA;EACrB,gBAAA,MAAA,iBAAqC,IAAA;EACrC,gBAAA,MAAA,SAAsC,IAAA;EACtC,gBAAA,MAAA,WAAiC,IAAA;EACxB,gBAAA,MAAA,cAAA,KAAA,CAAA;EAGA,gBAAA,MAAA,yCAAwB,IAAI,IAAkC,CAAA;EAE9D,gBAAA,MAAA,kCAAiB,IAAI,IAAwB,CAAA;EACtD,gBAAA,MAAA,mBAAkB,KAAA;EAElB,gBAAA,MAAA,aAAsC,IAAA;EACtC,gBAAA,MAAA,sBAAqB,CAAA;EACrB,gBAAA,MAAA,SAA4B,IAAA;;;;;;;;GAMpC;GAA6C;;;;;;;;;;GAO7C;GAA2B;;;;;GAE3B;GAA0B;;;;;;;;;;;GAQ1B;GAAuB;;EAEf,gBAAA,MAAA,aAAY,CAAA;EAEZ,gBAAA,MAAA,eAA4D,IAAA;;;;GAEpE;GAAwC;;;;;GAExC;GAA2C;;EAgJnC,gBAAA,MAAA,eAAiC,IAAA;EAqLxB,gBAAA,MAAA,YAA8B,CAAC,CAAA;EA/T9C,KAAK,aAAa,aAAa,kBAAkB;CACnD;CAEA,IAAI,YAAoB;EACtB,OAAO,KAAK;CACd;CAEA,IAAI,OAAqC;EACvC,OAAO,KAAK;CACd;;;;;;CAOA,IAAI,SAAyB;EAC3B,IAAI,CAAC,KAAK,SACR,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAE1E,OAAO,KAAK;CACd;CAEA,SAAkB;EAChB,OAAO,KAAK,WAAW;CACzB;CAEA,KAAK,OAAmB,WAA0B,MAAY;EAC5D,KAAK,eAAe,sBAAsB,KAAK,SAAS,OAAO,QAAQ,CAAC;CAC1E;CAEA,eAAe,QAAiC;EAC9C,IAAI,KAAK,QAAQ;GACf,OAAO,MAAM;GACb,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uBAAuB;EAC3E;EACA,KAAK,SAAS,OAAO;EACrB,KAAK,sBAAsB,OAAO,MAAM;EACxC,KAAK,QAAQ,OAAO;EACpB,KAAK,UAAU,OAAO;EACtB,KAAK,YAAY,IAAI,uBAAuB,KAAK,UAAU;EAC3D,KAAK,QAAQ,IAAI,YAAY,KAAK,SAAS,OAAO,MAAM;EACxD,KAAK,cAAc;EACnB,KAAK,YAAY,KAAK;CACxB;;;;;;CAOA,kBAA2B;EACzB,OAAO,KAAK,uBAAuB,KAAK;CAC1C;;CAGA,oBAAmC;EACjC,OAAO,KAAK,eAAe,KAAK,YAAY,cAAc,KAAK,YAC3D,KAAK,YAAY,SACjB;CACN;CAEA,oBAAoB,QAAsB;EACxC,KAAK,cAAc;GAAE,WAAW,KAAK;GAAW;EAAO;CACzD;;;;;;;;;;CAWA,QAAQ,QAAiC;EACvC,IAAI,CAAC,KAAK,QAAQ;GAChB,OAAO,MAAM;GACb,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wBAAwB;EAC5E;EACA,MAAM,gBAAgB,MAAM,KAAK,KAAK,sBAAsB,KAAK,CAAC;EAClE,IAAI,aAAsB;EAC1B,IAAI;GACF,KAAK,OAAO,SAAS;EACvB,SAAS,OAAO;GACd,aAAa;EACf;EACA,IAAI;GACF,KAAK,gBAAgB;EACvB,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EACA,KAAK,SAAS,OAAO;EACrB,KAAK,sBAAsB,OAAO,MAAM;EACxC,KAAK,QAAQ,OAAO;EACpB,KAAK,UAAU,OAAO;EACtB,KAAK,QAAQ,IAAI,YAAY,KAAK,SAAS,OAAO,MAAM;EACxD,KAAK,eAAe,MAAM;EAC1B,KAAK,sBAAsB,MAAM;EACjC,KAAK,kBAAkB;EACvB,KAAK,MAAM,OAAO,eAAe,KAAK,iBAAiB,CAAC,CAAC,KAAK,GAAG;EACjE,KAAK;EACL,KAAK,YAAY,KAAK;EACtB,KAAK,iBAAiB;EACtB,IAAI,YAAY,MAAM;CACxB;;CAGA,WAAW,YAAwC;EACjD,OAAO;GAAE;GAAY,cAAc,KAAK;EAAmB;CAC7D;;;;;;;;CASA,WAAW,OAAyB;EAClC,IAAI,KAAK,QACP,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uBAAuB;EAE3E,KAAK,cAAc;CACrB;CAEA,WAAoB;EAClB,OAAO,KAAK,WAAW,QAAQ,KAAK,gBAAgB;CACtD;;CAGA,cAA0B;EACxB,IAAI,CAAC,KAAK,aACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,gCAAgC;EAEpF,OAAO,KAAK;CACd;;CAKA,YAAoB;EAClB,OAAO,KAAK,QAAQ,GAAG,kBAAkB,KAAK,cAAc,CAAC;CAC/D;;;;;CAMA,yBAA+B;EAC7B,IAAI,KAAK,iBAAiB;EAC1B,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,cAAc;EAClC,MAAM,QAAQ,GAAG,kBAAkB,MAAM;EACzC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,IAAI,KAAK,eAAe,IAAI,CAAC,GAAG;GAChC,MAAM,MAAM,GAAG,mCAAmC,QAAQ,CAAC;GAC3D,IAAI,EAAA,GAAA,8BAAA,wBAAA,CAAyB,GAAG,GAS9B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,iBAAiB,EAAE,iHACnB,EAAE,SAAS;IAAE,WAAW;IAAG;GAAI,EAAE,CACnC;GAEF,MAAM,SAAqB;IAAE,kBAAkB;IAAK,WAAW;GAAE;GACjE,KAAK,eAAe,IAAI,GAAG,MAAM;GACjC,KAAK,sBAAsB,IAAI,KAAK,MAAM;EAC5C;EACA,KAAK,kBAAkB;CACzB;;CAGA,qBAAqB,kBAAgD;EACnE,MAAM,SAAS,KAAK,sBAAsB,IAAI,gBAAgB;EAC9D,IAAI,QAAQ,OAAO;EAInB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,cAAc;EAClC,MAAM,WAAW,GAAG,+BAA+B,QAAQ,gBAAgB;EAC3E,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,kBAChC;EAEF,GAAG,eAAe,QAAQ;EAI1B,KAAK,uBAAuB;EAC5B,MAAM,QAAQ,KAAK,sBAAsB,IAAI,gBAAgB;EAC7D,IAAI,CAAC,OACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,2BAA2B,iBAAiB,yBAC9C;EAEF,OAAO;CACT;;CAGA,aAA2B;EACzB,KAAK,uBAAuB;EAC5B,OAAO,MAAM,KAAK,KAAK,eAAe,QAAQ,CAAC,CAAC,CAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CACzB,KAAK,GAAG,OAAO,CAAC;CACrB;;;;;;;;CASA,sBAA4B;EAC1B,KAAK,eAAe,MAAM;EAC1B,KAAK,sBAAsB,MAAM;EACjC,KAAK,kBAAkB;EACvB,KAAK,uBAAuB;CAC9B;;CAGA,UAAU,kBAA+C;EAGvD,KAAK,qBAAqB,gBAAgB;EAC1C,MAAM,sBAAsB,KAAK,iBAAiB,CAAC,CAAC,oBAAoB,gBAAgB;EACxF,OAAO;GACL;GACA,UAAU,KAAK,iBAAiB,CAAC,CAAC,MAAM,gBAAgB;GACxD;EACF;CACF;;CAGA,eAAe,kBAAoC,SAAwB;EACzE,KAAK,0BAA0B,mBAAA,GAAA,8BAAA,yBAAA,CAA2C,OAAO,CAAC;CACpF;CAEA,0BAA0B,kBAAoC,OAAkC;EAC9F,KAAK,iBAAiB,CAAC,CAAC,0BAA0B,kBAAkB,KAAK;CAC3E;CAEA,oBAAoB,kBAAyD;EAC3E,OAAO,KAAK,iBAAiB,CAAC,CAAC,oBAAoB,gBAAgB;CACrE;;CAGA,aAAa,kBAAmD;EAC9D,OAAO,KAAK,iBAAiB,CAAC,CAAC,KAAK,gBAAgB;CACtD;;;;;;;;;CAUA,cAAsB;EACpB,OAAO,KAAK;CACd;;CAGA,eAAqB;EACnB,KAAK;CACP;;;;;;CAOA,cAAc,kBAA0C;EACtD,KAAK,iBAAiB,CAAC,CAAC,KAAK,gBAAgB;CAC/C;CAEA,iBAAiB,OAA4B;EAC3C,KAAK,iBAAiB,CAAC,CAAC,SAAS,KAAK;CACxC;CAEA,WAAwB;EACtB,IAAI,CAAC,KAAK,OACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAE1E,OAAO,KAAK;CACd;CAEA,gBAAqB;EACnB,IAAI,CAAC,KAAK,QACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAE1E,OAAO,KAAK;CACd;;;;;;;;;CAUA,iBAAiB,SAA2B;EAC1C,KAAK,SAAS,KAAK,OAAO;CAC5B;CAIA,QAAc;EACZ,IAAI,aAAsB;EAC1B,IAAI;GACF,KAAK,OAAO,SAAS;EACvB,SAAS,OAAO;GACd,aAAa;EACf,UAAU;GACR,KAAK,QAAQ;EACf;EAGA,IAAI,KAAK,gBAAgB,MAAM,SAAS,QACtC,IAAI;GACF,KAAK,QAAQ,UAAU,WAAW,KAAK,eAAe,MAAM,IAAI;EAClE,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EAGF,IAAI;GACF,KAAK,gBAAgB;EACvB,SAAS,OAAO;GACd,eAAA,aAAe;EACjB,UAAU;GACR,KAAK,gBAAgB;GACrB,KAAK,SAAS;GACd,KAAK,QAAQ;GACb,KAAK,UAAU;GACf,KAAK,cAAc;GACnB,KAAK,iBAAiB;GACtB,KAAK,iBAAiB;GACtB,KAAK,WAAW,MAAM;GACtB,KAAK,YAAY;GACjB,KAAK,eAAe,MAAM;GAC1B,KAAK,sBAAsB,MAAM;GACjC,KAAK,kBAAkB;EACzB;EAIA,KAAK,IAAI,IAAI,KAAK,SAAS,SAAS,GAAG,KAAK,GAAG,KAC7C,IAAI;GACF,KAAK,SAAS,EAAE,CAAC;EACnB,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EAEF,KAAK,SAAS,SAAS;EAEvB,IAAI,YAAY,MAAM;CACxB;CAEA,mBAA8C;EAC5C,IAAI,CAAC,KAAK,WACR,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAE1E,OAAO,KAAK;CACd;AACF;AASA,IAAI,iBAAiB;AAErB,SAAS,oBAA4B;CACnC,OAAO,SAAS,EAAE,eAAA,CAAgB,SAAS,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE;AAC1E;;;AC3fA,MAAMC,sBAAoB;;;;;;;AAQ1B,SAAS,cAAc,SAA2B,UAAkD;CAClG,IAAI,QAAQ,GAAG,kBAAkB,MAAMA,qBACrC,OAAO,WACH,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,sBAAsB,6BAA6B,IACnF,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,qBAAqB,8BAA8B;CAEzF,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,8BAA8B;AACtF;AAWA,IAAa,uBAAb,MAAkC;CAGhC,YAAY,SAA4C;EAA3B,KAAA,UAAA;EAFZ,gBAAA,MAAA,2BAAU,IAAI,IAAuB,CAAA;CAEG;CAEzD,kBAAkB,MAMO;EACvB,MAAM,WAAW,KAAK,OAAO,KAAK,GAAG;EACrC,IAAI,UAAU,OAAO;EAErB,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,QAAQ,IAAI,WAAW;EAC7B,MAAM,UAAU,IAAI,MAAM,KAAK,MAAM,UAAU;EAC/C,MAAM,WAAW,IAAI,KAAK,OAAO,CAAC;EAElC,IAAI;GACF,IAAI,WAAW,SAAS,KAAK,KAAK;GAClC,MAAM,UAAU,GAAG,2BACjB,SACA,KAAK,MAAM,YACX,KAAK,YAAY,EACnB;GACA,IAAI,CAAC,SACH,MAAM,cAAc,KAAK,SAAS,KAAK,QAAQ;GAEjD,sCAAsC,KAAK,SAAS,OAAO;GAC3D,MAAM,WAAW,GAAG,yBAAyB,OAAO,CAAC;GACrD,KAAK,eAAe,SAAS,KAAK,WAAW;GAC7C,OAAO,KAAK,OAAO;IAAE,KAAK,KAAK;IAAK,MAAM;IAAU;IAAS,MAAM;IAAG,aAAa,MAAM,MAAM;GAAE,CAAC;EACpG,SAAS,OAAO;GACd,MAAM,MAAM;GACZ,MAAM;EACR;CACF;CAEA,gBAAgB,MAMS;EACvB,MAAM,WAAW,KAAK,OAAO,KAAK,GAAG;EACrC,IAAI,UAAU,OAAO;EAErB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,IAAI,WAAW;EAC7B,IAAI,SAAqC;EAEzC,IAAI;GACF,SAAS,KAAK,QAAQ,WAAW,aAAa,KAAK,IAAI;GACvD,MAAM,WAAW,QAAQ,MAAM,CAAC;GAChC,MAAM,UAAU,GAAG,sBAAsB,OAAO,KAAK,KAAK,YAAY,EAAE;GACxE,IAAI,CAAC,SACH,MAAM,cAAc,KAAK,SAAS,KAAK,QAAQ;GAEjD,sCAAsC,KAAK,SAAS,OAAO;GAC3D,MAAM,WAAW,GAAG,yBAAyB,OAAO,CAAC;GACrD,KAAK,eAAe,SAAS,KAAK,WAAW;GAC7C,OAAO,KAAK,OAAO;IAAE,KAAK,KAAK;IAAK,MAAM;IAAQ,MAAM,KAAK;IAAM;IAAS,MAAM;IAAG,aAAa,MAAM,MAAM;GAAE,CAAC;EACnH,SAAS,OAAO;GACd,MAAM,MAAM;GACZ,MAAM;EACR;CACF;;;;;;;CAQA,YAAY,KAA0C;EACpD,OAAO,KAAK,OAAO,GAAG;CACxB;;;;;;CAOA,eAAuB,SAAc,WAAqC;EACxE,IAAI,CAAC,aAAa,CAAC,oBAAoB,KAAK,SAAS,GAAG;EACxD,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,wBAAQ,IAAI,WAAW,EAAE;EAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,MAAM,KAAK,SAAS,UAAU,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;EACtF,MAAM,MAAM,IAAI,MAAM,EAAE;EACxB,IAAI;GACF,IAAI,WAAW,KAAK,KAAK;GACzB,GAAG,2BAA2B,SAAS,GAAG;EAC5C,UAAU;GACR,IAAI,KAAK,GAAG;EACd;CACF;CAEA,aAAmB;EACjB,MAAM,UAAU,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;EAChD,KAAK,QAAQ,MAAM;EACnB,IAAI,aAAsB;EAC1B,KAAK,MAAM,SAAS,SAClB,IAAI;GACF,MAAM,MAAM;EACd,SAAS,OAAO;GACd,eAAA,aAAe;EACjB;EAEF,IAAI,YAAY,MAAM;CACxB;;CAGA,sBAAsB,KAAqB;EACzC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,QAAQ;CACxC;CAEA,OAAe,KAA0C;EACvD,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;EAClC,IAAI,CAAC,OAAO,OAAO;EACnB,MAAM;EACN,OAAO,KAAK,UAAU,KAAK;CAC7B;CAEA,OAAe,OAAwC;EACrD,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK;EACjC,OAAO,KAAK,UAAU,KAAK;CAC7B;CAEA,UAAkB,OAAwC;EACxD,IAAI,WAAW;EACf,OAAO;GACL,KAAK,MAAM;GACX,MAAM,MAAM;GACZ,GAAI,MAAM,SAAS,KAAA,IAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;GACvD,SAAS,MAAM;GACf,eAAe;IACb,IAAI,UAAU;IACd,WAAW;IACX,MAAM,OAAO,KAAK,QAAQ,IAAI,MAAM,GAAG;IACvC,IAAI,CAAC,MAAM;IACX,KAAK;IACL,IAAI,KAAK,OAAO,GAAG;IACnB,KAAK,QAAQ,OAAO,MAAM,GAAG;IAC7B,KAAK,MAAM;GACb;EACF;CACF;AACF;;;;;;;;;;;AC1KA,SAAgB,aACd,IACA,KACA,QACA,KACe;CACf,IAAI,CAAC,GAAG,iBAAiB,QAAQ,GAAG,GAAG,OAAO;CAC9C,OAAO,gBACL,MACC,KAAK,aAAa,GAAG,iBAAiB,QAAQ,KAAK,KAAK,QAAQ,GACjE,EACF;AACF;;;;;;;;;ACbA,SAAS,gBACP,IACA,KACA,QACA,OACA,YACe;CACf,OAAO,eAAe,MAAM,KAAK,aAC/B,GAAG,oBAAoB,QAAQ,OAAO,YAAY,KAAK,QAAQ,CACjE;AACF;;;;;;;;;AAUA,SAAgB,kBACd,IACA,KACA,QACwB;CACxB,MAAM,QAAQ,OAAO,GAAG,qBAAqB,QAAQ,IAAI,CAAC,IAAI;CAC9D,MAAM,MAA8B,CAAC;CACrC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;EAC9B,MAAM,MAAM,gBAAgB,IAAI,KAAK,QAAQ,GAAG,IAAI;EACpD,IAAI,CAAC,KAAK;EACV,MAAM,QAAQ,aAAa,IAAI,KAAK,QAAQ,GAAG;EAC/C,IAAI,SAAS,MAAM;EACnB,IAAI,OAAO;CACb;CACA,OAAO;AACT;;;ACxCA,MAAMC,iBAAe;AACrB,MAAMC,kBAAgB;AAEtB,SAAgB,YAAY,IAAkB,QAAsC;CAClF,MAAM,MAAM,OAAO,GAAG,oBAAoB,MAAM,CAAC;CACjD,IAAI,QAAQD,gBAAc,OAAO;CACjC,IAAI,QAAQC,iBAAe,OAAO;CAClC,OAAO;AACT;;;;;;;;;;;;ACKA,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,QAAuC;EAC1C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,MAAM,KAAK,QAAQ,cAAc;EAEvC,MAAM,QAAQ,aAAa,IAAI,KAAK,KAAK,OAAO;EAChD,eAAe,MAAM;EACrB,MAAM,SAAS,aAAa,IAAI,KAAK,KAAK,QAAQ;EAClD,eAAe,MAAM;EACrB,MAAM,UAAU,aAAa,IAAI,KAAK,KAAK,SAAS;EACpD,eAAe,MAAM;EACrB,MAAM,WAAW,aAAa,IAAI,KAAK,KAAK,UAAU;EACtD,eAAe,MAAM;EACrB,MAAM,WAAW,aAAa,IAAI,KAAK,KAAK,UAAU;EACtD,eAAe,MAAM;EACrB,MAAM,UAAU,aAAa,IAAI,KAAK,KAAK,SAAS;EACpD,eAAe,MAAM;EACrB,MAAM,cAAc,aAAa,IAAI,KAAK,KAAK,cAAc;EAC7D,eAAe,MAAM;EACrB,MAAM,SAAS,aAAa,IAAI,KAAK,KAAK,SAAS;EACnD,eAAe,MAAM;EACrB,MAAM,UAAU,YAAY,IAAI,GAAG;EACnC,eAAe,MAAM;EACrB,MAAM,SAAS,kBAAkB,IAAI,KAAK,GAAG;EAE7C,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA,SAAS,cAAc,aAAa,WAAW,IAAI;GACnD,UAAU,SAAS,aAAa,MAAM,IAAI;GAC1C;GACA;EACF;CACF;AACF;;;;;;;;;;;;;;;;AC7CA,SAAgB,cACd,IACA,KACA,QACA,KACA,OACS;CACT,IAAI,UAAU,MACZ,OAAO,GAAG,iBAAiB,QAAQ,KAAKC,yBAAAA,QAAQ;CAElD,OAAO,iBAAiB,KAAK,QAAQ,QAAQ,GAAG,iBAAiB,QAAQ,KAAK,GAAG,CAAC;AACpF;;;ACxBA,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;;;;;;;AAQxB,SAAgB,iBACd,IACA,QACA,QACS;CACT,MAAM,OACJ,WAAW,SAAS,eAAe,WAAW,UAAU,gBAAgB;CAC1E,OAAO,GAAG,oBAAoB,QAAQ,IAAI;AAC5C;;;;;;;;ACXA,MAAM,qCAAqB,IAAI,IAAI;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;AAOD,MAAM,gBAA8D;CAClE,CAAC,SAAS,OAAO;CACjB,CAAC,UAAU,QAAQ;CACnB,CAAC,WAAW,SAAS;CACrB,CAAC,YAAY,UAAU;CACvB,CAAC,YAAY,UAAU;CACvB,CAAC,WAAW,SAAS;AACvB;;;;;;AAOA,SAAS,iBAAiB,KAAsB;CAC9C,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,OAAO;CACrC,IAAI,mBAAmB,IAAI,GAAG,GAAG,OAAO;CACxC,IAAI,IAAI,OAAO,KAAK,OAAO;CAC3B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;EACnC,MAAM,IAAI,IAAI,WAAW,CAAC;EAC1B,IAAI,IAAI,MAAQ,IAAI,KAAM,OAAO;CACnC;CACA,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,mBACd,IACA,KACA,QACA,OACM;CACN,MAAM,QAAQ,SAAwB;EACpC,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,4BAA4B,MAAM;CACnF;CAEA,KAAK,MAAM,CAAC,OAAO,QAAQ,eAAe;EACxC,MAAM,QAAQ,MAAM;EACpB,IAAI,UAAU,KAAA,GAAW;EACzB,IAAI,CAAC,cAAc,IAAI,KAAK,QAAQ,KAAK,KAAK,GAAG,KAAK,GAAG;CAC3D;CAEA,IAAI,MAAM,YAAY,KAAA,GAEhB;MAAA,CAAC,cAAc,IAAI,KAAK,QAAQ,gBADtB,MAAM,YAAY,OAAO,OAAO,cAAc,IAAI,KAAK,MAAM,OAAO,CAAC,CAC1B,GAAG,KAAK,cAAc;CAAA;CAEjF,IAAI,MAAM,aAAa,KAAA,GAEjB;MAAA,CAAC,cAAc,IAAI,KAAK,QAAQ,WADtB,MAAM,aAAa,OAAO,OAAO,cAAc,IAAI,KAAK,MAAM,QAAQ,CAAC,CACjC,GAAG,KAAK,SAAS;CAAA;CAGvE,IAAI,MAAM,YAAY,KAAA,GAChB;MAAA,CAAC,iBAAiB,IAAI,QAAQ,MAAM,OAAO,GAAG,KAAK,SAAS;CAAA;CAGlE,IAAI,MAAM,WAAW,KAAA,GACnB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,MAAM,GAAG;EACvD,IAAI,CAAC,iBAAiB,GAAG,GAAG;EAC5B,IAAI,CAAC,cAAc,IAAI,KAAK,QAAQ,KAAK,KAAK,GAAG,KAAK,GAAG;CAC3D;AAEJ;;;;;;;;;;;;;;AC/EA,IAAa,kBAAb,MAA6B;CAC3B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OAAO,OAAsB,QAA2C;EACtE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EAGzB,mBAAmB,IAAI,KAFR,KAAK,QAAQ,cAEK,GAAG,KAAK;EACzC,eAAe,MAAM;EAMrB,OAAO;GAAE,UADQ,IAAI,eAAe,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MACrD;GAAG,OAAO;EAAK;CACjC;AACF;;;;ACvBA,MAAa,4BAA4B;CACvC,OAAO;CACP,SAAS;EACP,UAAU;EACV,UAAU;EACV,WAAW;EACX,WAAW;EACX,QAAQ;EACR,OAAO;CACT;CACA,OAAO;EACL,aAAa;EACb,cAAc;EACd,cAAc;EACd,SAAS;EACT,OAAO;EACP,OAAO;EACP,aAAa;CACf;AACF;;AAeA,SAAgB,UAAU,KAAuB,KAAU,aAAa,GAAU;CAChF,OAAO;EACL,MAAM,QAAQ,KAAK,KAAK,UAAU;EAClC,KAAK,QAAQ,KAAK,KAAK,aAAa,CAAC;EACrC,OAAO,QAAQ,KAAK,KAAK,aAAa,CAAC;EACvC,QAAQ,QAAQ,KAAK,KAAK,aAAa,EAAE;CAC3C;AACF;;AAGA,SAAgB,UAAU,KAAuB,KAAiB;CAChE,OAAO;EACL,OAAO,QAAQ,KAAK,KAAK,CAAC;EAC1B,QAAQ,QAAQ,KAAK,KAAK,CAAC;CAC7B;AACF;;AAGA,SAAgB,QAAQ,KAAuB,KAAU,aAAa,GAAW;CAC/E,OAAO,OAAO,IAAI,KAAK,KAAK,OAAO,UAAU,CAAC;AAChD;;AAGA,SAAgB,QAAQ,KAAuB,KAAU,aAAa,GAAW;CAC/E,OAAO,OAAO,IAAI,KAAK,KAAK,OAAO,UAAU,CAAC;AAChD;;;;;;;;;ACnEA,MAAa,YAAY;CACvB,SAAS;CACT,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;AACT;;AAKA,MAAa,oBAAgD;CAC3D,KAAK,UAAU;CACf,MAAM,UAAU;CAChB,MAAM,UAAU;CAChB,MAAM,UAAU;CAChB,MAAM,UAAU;CAChB,OAAO,UAAU;CACjB,OAAO,UAAU;AACnB;;;ACxBA,MAAM,kBAAkB;;;;;;;;;;;;;AAcxB,SAAgB,gBACd,IACA,KACA,QACA,SACuB;CACvB,MAAM,mBAAmB,GAAG,6BAA6B,QAAQ,OAAO;CACxE,IAAI,qBAAqB,GAAG,OAAO;CAEnC,MAAM,OAAO,aACX,KACA,CAAA,GAAY,kBAAA,CAA2B,IACtC,CAAC,UAAU,eAAe;EACzB,MAAM,OAAO,GAAG,iBAAiB,SAAS,UAAU,SAAS;EAC7D,MAAM,QAAQ,KAAK,IAAI,QAAQ,KAAK,QAAQ,GAAG,eAAe;EAC9D,MAAM,SAAmB,CAAC;EAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,WAAW,IAAA,CAAa,CAAC;EAClF,OAAO;GAAE;GAAM;EAAO;CACxB,CACF;CACA,MAAM,MAAM,MAA8B,IAAI,KAAK,OAAO,SAAS,KAAK,OAAO,KAAM;CAErF,QAAQ,KAAK,MAAb;EACE,KAAK,UAAU,KACb,OAAO;GAAE,MAAM;GAAO;GAAkB,GAAG,gBAAgB,IAAI,KAAK,OAAO;EAAE;EAC/E,KAAK,UAAU,KACb,OAAO;GAAE,MAAM;GAAO;EAAiB;EACzC,KAAK,UAAU,MACb,OAAO;GAAE,MAAM;GAAQ;GAAkB,KAAK,GAAG,CAAC;EAAE;EACtD,KAAK,UAAU,MACb,OAAO;GAAE,MAAM;GAAQ;GAAkB,MAAM,GAAG,CAAC;EAAE;EACvD,KAAK,UAAU;GAGb,IAAI,KAAK,OAAO,SAAS,GAAG,OAAO;IAAE,MAAM;IAAO;GAAiB;GACnE,OAAO;IACL,MAAM;IACN;IACA,MAAM,KAAK,OAAO;IAClB,QAAQ,KAAK,OAAO;IACpB,OAAO,KAAK,OAAO;IACnB,KAAK,KAAK,OAAO;GACnB;EAEF,KAAK,UAAU,MACb,OAAO;GAAE,MAAM;GAAQ;EAAiB;EAC1C,KAAK,UAAU,OACb,OAAO;GAAE,MAAM;GAAS;GAAkB,KAAK,GAAG,CAAC;EAAE;EACvD,KAAK,UAAU,OACb,OAAO;GAAE,MAAM;GAAS;GAAkB,MAAM,GAAG,CAAC;EAAE;EACxD,SACE,OAAO;CACX;AACF;;AAGA,SAAS,gBACP,IACA,KACA,SACkE;CAClE,OAAO,aACL,KACA;;;;;;;CAAiE,IAChE,CAAC,SAAS,QAAQ,SAAS,MAAM,KAAK,UAAU;EAC/C,IAAI,CAAC,GAAG,2BAA2B,SAAS,SAAS,QAAQ,SAAS,MAAM,KAAK,IAAI,GAEnF,OAAO;GAAE,MAAM;GAAM,KAAK;GAAM,MAAM;EAAK;EAE7C,OAAO;GACL,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI;GACnD,KAAK,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI;GAChD,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI;EACrD;CACF,CACF;AACF;;;ACxEA,MAAM,6BAA+C;CACnD,WAAW;CACX,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,qBAAqB;AACvB;AAEA,MAAM,sBAAqD;CACzD,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;;;AAQzB,SAAgB,mBAAmB,MAA6B;CAC9D,OAAO,oBAAoB,SAAS;AACtC;;;AAUA,IAAa,0BAAb,MAAqC;CAOnC,YAAY,SAA4C,4BAA4B;EAAvD,KAAA,SAAA;EANrB,gBAAA,MAAA,UAAS,CAAA;EACT,gBAAA,MAAA,SAAQ,CAAA;EACR,gBAAA,MAAA,mBAAkB,CAAA;EAClB,gBAAA,MAAA,iBAAgB,CAAA;EAChB,gBAAA,MAAA,oBAAmB,CAAA;CAE0D;CAErF,SAAS,WAAyB;EAChC,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,mBAAmB;CAC1B;CAEA,UAAU,QAAsB;EAC9B,KAAK,mBAAmB,OAAO;EAC/B,KAAK,mBAAmB;CAC1B;;CAGA,eAAe,OAAqB;EAClC,KAAK,iBAAiB;EACtB,KAAK,mBAAmB;CAC1B;;CAGA,oBAAoB,QAAsB;EACxC,KAAK,oBAAoB;EACzB,KAAK,mBAAmB;CAC1B;CAEA,qBAAmC;EACjC,IACE,KAAK,SAAS,KAAK,OAAO,aAC1B,KAAK,QAAQ,KAAK,OAAO,YACzB,KAAK,kBAAkB,KAAK,OAAO,sBACnC,KAAK,gBAAgB,KAAK,OAAO,oBACjC,KAAK,mBAAmB,KAAK,OAAO,qBAEpC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,6CACA,EACE,SAAS;GACP,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,iBAAiB,KAAK;GACtB,eAAe,KAAK;GACpB,kBAAkB,KAAK;GACvB,QAAQ,KAAK;EACf,EACF,CACF;CAEJ;AACF;;;;;;;;;;;;;;AAeA,SAAgB,gBACd,IACA,KACA,QACA,UACA,QACsB;CACtB,IAAI,aAAaC,yBAAAA,UAAU,OAAO;CAClC,IAAI;EACF,MAAM,YAAY,GAAG,wBAAwB,QAAQ;EACrD,IAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,GAC9C,MAAM,qBAAqB,sBAAsB,EAAE,UAAU,CAAC;EAEhE,OAAO,SAAS,SAAS;EAEzB,MAAM,eAAe,GAAG,2BAA2B,QAAQ,MAAM;EACjE,MAAM,aAAa,CAAC,GAAG,sBAAsB,QAAQ;EACrD,MAAM,SAAS,wBAAwB,GAAG,uBAAuB,QAAQ,GAAG,SAAS;EACrF,MAAM,2BAAW,IAAI,IAAY;EACjC,IAAI,iBAAiB;;;EAIrB,MAAM,qBAAqB,SAAgE;GACzF,MAAM,SAAS,KAAKA,yBAAAA,UAAU,CAAC;GAC/B,IAAI,UAAU,GAAG,OAAO;GACxB,OAAO,oBAAoB,MAAM;GACjC,OAAO,eAAe,KAAK,IAAI;EACjC;EAEA,MAAM,eAAe,SACnB,aAAa,KAAK,CAAA,CAAU,IAAI,CAAC,YAC/B,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,MAAM,IAAI,IAC9C;EAEF,MAAM,0BAA0B,QAAgB,UAC9C,aAAa,KAAK,CAAA,CAAU,IAAI,CAAC,YAAY;GAC3C,IAAI,CAAC,GAAG,qCAAqC,UAAU,QAAQ,OAAO,MAAM,GAC1E,OAAO;GAET,MAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM;GACvC,OAAO,UAAU,IAAI,OAAO;EAC9B,CAAC;EAEH,MAAM,eAAe,QAAgB,UAA+C;GAClF,MAAM,UAAgC,CAAC;GACvC,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;IAC1C,MAAM,OAAO,mBAAmB,KAAK,aACnC,GAAG,6BAA6B,UAAU,QAAQ,OAAO,KAAK,QAAQ,CACxE;IACA,IAAI,SAAS,MAAM;KACjB,QAAQ,KAAK;MAAE,MAAM;MAAQ;KAAK,CAAC;KACnC;IACF;IACA,MAAM,eAAe,uBAAuB,QAAQ,KAAK;IACzD,IAAI,iBAAiB,MAAM,OAAO;IAClC,QAAQ,KAAK;KAAE,MAAM;KAAgB;IAAa,CAAC;GACrD;GACA,OAAO;EACT;EAEA,MAAM,sBACJ,WAEA,aAAa,KAAK,CAAA,GAAA,CAAqB,IAAI,CAAC,cAAc,gBAAgB;GACxE,IAAI,CAAC,GAAG,4BAA4B,UAAU,QAAQ,cAAc,UAAU,GAC5E,OAAO;GAET,OAAO;IACL,WAAW,QAAQ,KAAK,YAAY,MAAM;IAC1C,SAAS,QAAQ,KAAK,UAAU,MAAM;GACxC;EACF,CAAC;EAEH,MAAM,uBAAuB,WAC3B,aAAa,KAAK,CAAA,GAAA,CAAqB,IAAI,CAAC,cAAc,cAAc;GACtE,IAAI,CAAC,GAAG,6BAA6B,UAAU,QAAQ,cAAc,QAAQ,GAC3E,OAAO;GAET,OAAO;IACL,WAAW,QAAQ,KAAK,YAAY,MAAM;IAC1C,OAAO,QAAQ,KAAK,QAAQ,MAAM;GACpC;EACF,CAAC;EAEH,MAAM,YAAY,WAAkC;GAClD,IAAI,SAAS,IAAI,MAAM,GACrB,MAAM,qBAAqB,wCAAwC,EAAE,OAAO,CAAC;GAE/E,SAAS,IAAI,MAAM;GACnB,IAAI;IACF,MAAM,OAAO,mBAAmB,GAAG,uBAAuB,UAAU,MAAM,CAAC;IAC3E,MAAM,UACJ,eAAe,MAAM,KAAK,aACxB,GAAG,0BAA0B,UAAU,QAAQ,KAAK,QAAQ,CAC9D,KAAK;IAEP,MAAM,YAAY,GAAG,wBAAwB,UAAU,MAAM;IAC7D,IAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,GAC9C,MAAM,qBAAqB,8BAA8B;KAAE;KAAQ;IAAU,CAAC;IAEhF,MAAM,OAAwB,CAAC;IAC/B,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,SAAS;KAC9C,MAAM,UAAU,gBACd,GAAG,qBAAqB,UAAU,QAAQ,KAAK,GAC/C,SACF;KACA,KAAK,KAAK,SAAS,OAAO,CAAC;IAC7B;IAEA,MAAM,iBAAgC;KACpC,iBAAiB;KACjB,OAAO;MAAE,MAAM;MAAW;MAAS;KAAK;IAC1C;IAEA,QAAQ,MAAR;KACE,KAAK,cAAc;MACjB,IAAI,CAAC,GAAG,6BAA6B,UAAU,MAAM,GAAG,OAAO,SAAS;MACxE,MAAM,SACJ,gBAAgB,MAAM,KAAK,aACzB,GAAG,6BAA6B,UAAU,QAAQ,KAAK,QAAQ,CACjE,KAAK;MACP,OAAO,UAAU,MAAM;MACvB,OAAO;OAAE;OAAM;OAAS;OAAQ;MAAK;KACvC;KACA,KAAK,aAAa;MAChB,IAAI,CAAC,GAAG,6BAA6B,UAAU,MAAM,GACnD,OAAO;OAAE;OAAM;OAAS;MAAK;MAE/B,MAAM,SACJ,gBAAgB,MAAM,KAAK,aACzB,GAAG,6BAA6B,UAAU,QAAQ,KAAK,QAAQ,CACjE,KAAK;MACP,OAAO,UAAU,MAAM;MACvB,OAAO;OAAE;OAAM;OAAS;OAAQ;MAAK;KACvC;KACA,KAAK,QAAQ;MACX,MAAM,UAAU,GAAG,uBAAuB,QAAQ,UAAU,MAAM;MAClE,MAAM,cACJ,YAAYA,yBAAAA,WAAW,gBAAgB,IAAI,KAAK,QAAQ,OAAO,IAAI;MACrE,OAAO,cAAc;OAAE;OAAM;OAAS;OAAa;MAAK,IAAI,SAAS;KACvE;KACA,KAAK,OAAO;MACV,MAAM,MAAM,mBAAmB,KAAK,aAClC,GAAG,sBAAsB,QAAQ,UAAU,QAAQ,KAAK,QAAQ,CAClE;MACA,IAAI,QAAQ,MAAM,OAAO,SAAS;MAIlC,OAAO;OAAE;OAAM;OAAS;OAAK,OAF3B,aAAa,WAAW,GAAG,2BAA2B,UAAU,QAAQ,MAAM,CAAC,KAC/E;OACkC;MAAK;KAC3C;KACA,KAAK,SAAS;MACZ,MAAM,OAAO,mBAAmB,KAAK,aACnC,GAAG,uBAAuB,UAAU,QAAQ,KAAK,QAAQ,CAC3D;MACA,OAAO,SAAS,OAAO,SAAS,IAAI;OAAE;OAAM;OAAS;OAAM;MAAK;KAClE;KACA,KAAK,QAAQ;MACX,MAAM,QAAQ,GAAG,8BAA8B,UAAU,MAAM;MAC/D,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,OAAO,SAAS;MAC3D,OAAO,eAAe,KAAK;MAC3B,MAAM,UAAU,YAAY,QAAQ,KAAK;MACzC,IAAI,YAAY,MAAM,OAAO,SAAS;MAItC,OAAO;OAAE;OAAM;OAAS;OAAS,MAF/B,aAAa,WAAW,GAAG,2BAA2B,UAAU,QAAQ,MAAM,CAAC,KAC/E;OACqC;MAAK;KAC9C;KACA,KAAK,cAAc;MACjB,MAAM,QAAQ,mBAAmB,MAAM;MACvC,MAAM,QAAQ,GAAG,8BAA8B,UAAU,MAAM;MAC/D,IAAI,UAAU,QAAQ,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,OAAO,SAAS;MAC7E,OAAO,eAAe,KAAK;MAC3B,MAAM,SAAS,MAAM,YAAY,YAAY,QAAQ,KAAK,IAAI;MAC9D,IAAI,MAAM,aAAa,WAAW,MAAM,OAAO,SAAS;MACxD,OAAO;OAAE;OAAM;OAAS;OAAQ,SAAS,MAAM;OAAS;MAAK;KAC/D;KACA,KAAK,eAAe;MAIlB,IAAI,OAAO,GAAG,iCAAiC,YAC7C,OAAO;OAAE;OAAM;OAAS;MAAK;MAE/B,MAAM,QAAQ,oBAAoB,MAAM;MAIxC,IAAI,UAAU,MAAM,OAAO,SAAS;MACpC,MAAM,MAAM,mBAAmB,KAAK,aAClC,GAAG,gCAAgC,UAAU,QAAQ,KAAK,QAAQ,CACpE;MACA,IAAI,QAAQ,MAAM,OAAO,SAAS;MAClC,MAAM,QAAQ,GAAG,8BAA8B,UAAU,MAAM;MAC/D,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG,OAAO,SAAS;MAC3D,OAAO,eAAe,KAAK;MAC3B,MAAM,SAAS,MAAM,YAAY,YAAY,QAAQ,KAAK,IAAI;MAC9D,IAAI,MAAM,aAAa,WAAW,MAAM,OAAO,SAAS;MACxD,MAAM,UAAU,mBAAmB,KAAK,aACtC,GAAG,oCAAoC,UAAU,QAAQ,KAAK,QAAQ,CACxE;MACA,OAAO;OACL;OACA;OACA,SAAS;QACP;QACA;QACA,QAAA,GAAA,8BAAA,sBAAA,CAA6B,MAAM,KAAK;QACxC,GAAI,YAAY,OAAO,CAAC,IAAI,EAAE,QAAQ;OACxC;OACA;MACF;KACF;KACA,KAAK;KACL,KAAK;KACL,KAAK,UAAU;MACb,MAAM,WAAW,mBAAmB,KAAK,aACvC,GAAG,2BAA2B,UAAU,QAAQ,KAAK,QAAQ,CAC/D;MACA,OAAO,aAAa,OAAO,SAAS,IAAI;OAAE;OAAM;OAAS;OAAU;MAAK;KAC1E;KACA,SACE,OAAO;MAAE;MAAM;MAAS;KAAK;IACjC;GACF,UAAU;IACR,SAAS,OAAO,MAAM;GACxB;EACF;EAEA,MAAM,OAAO,WAAW,OAAO,OAAO,SAAS,MAAM;EACrD,MAAM,WAAW,kBAAkB,cAAc,UAAU;EAC3D,IAAI,gBAAgB,SAAS,KAAK,iBAAiB;EACnD,OAAO;GAAE;GAAM;GAAY;GAAc;EAAS;CACpD,UAAU;EACR,GAAG,sBAAsB,QAAQ;CACnC;AACF;AAEA,SAAS,wBAAwB,KAAa,WAAkC;CAE9E,OADgB,QAAQ,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,mBACvD,OAAO,gBAAgB,KAAK,SAAS;AACxD;AAEA,SAAS,gBAAgB,KAAa,WAA2B;CAC/D,IAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,OAAO,WAC9C,MAAM,qBAAqB,mDAAmD;EAC5E;EACA;CACF,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,kBAAkB,OAAe,YAAyC;CACjF,MAAM,WAA+B,CAAC;CACtC,KAAK,QAAQ,2BAA2B,GAAG,SAAS,KAAK,eAAe;CACxE,KAAK,QAAQ,4BAA4B,GAAG,SAAS,KAAK,gBAAgB;CAC1E,KAAK,QAAQ,wBAAwB,KAAK,YAAY,SAAS,KAAK,YAAY;CAChF,OAAO;AACT;AAEA,SAAS,qBAAqB,SAAiB,SAA+C;CAC5F,OAAO,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,SAAS,EAAE,QAAQ,CAAC;AAC3E;;;AC9XA,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,UAAU;;;;;;;;AAShB,IAAa,cAAb,MAAyB;CACvB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,QAAuC;EAC1C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,UAAU,KAAK,QAAQ,WAAW;EACxC,MAAM,eAAe,IAAI,wBAAwB;EAGjD,OAAO,aACL,KACA;;;;EAAoC,IACnC,CAAC,SAAS,SAAS,iBAAiB;GACnC,MAAM,QAAsB,QAAQ,KAAK,WAAW;IAClD,eAAe,MAAM;IACrB,MAAM,QAAQ,OAAO;IACrB,MAAM,UAAU,gBAAgB,IAAI,KAAK,QAAQ,OAAO,kBAAkB,YAAY;IACtF,OAAO;KACL;KACA,kBAAkB,OAAO;KACzB,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK;KACvC,MAAM,SAAS,IAAI,KAAK,QAAQ,OAAO,OAAO;KAC9C,UAAU,aAAa,IAAI,QAAQ,KAAK;KACxC,UAAU,aAAa,IAAI,KAAK,QAAQ,OAAO,WAAW;KAC1D,OAAO,UAAU,IAAI,KAAK,QAAQ,OAAO,OAAO;KAChD,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;IAC/B;GACF,CAAC;GACD,OAAO;IAAE,WAAW,MAAM;IAAQ;IAAO,YAAY,eAAe,IAAI,KAAK,MAAM;GAAE;EACvF,CACF;CACF;AACF;AAEA,SAAS,gBACP,IACA,KACA,QACA,kBACA,QAC4B;CAC5B,MAAM,UAA0B,CAAC;CACjC,MAAM,OAAO,gBACX,IACA,KACA,QACA,GAAG,2BAA2B,QAAQ,kBAAkB,CAAC,GACzD,MACF;CACA,MAAM,QAAQ,gBACZ,IACA,KACA,QACA,GAAG,2BAA2B,QAAQ,kBAAkB,CAAC,GACzD,MACF;CACA,IAAI,MAAM,QAAQ,OAAO;CACzB,IAAI,OAAO,QAAQ,QAAQ;CAC3B,OAAO,QAAQ,QAAQ,UAAU,KAAA;AACnC;;;;;;;AAQA,SAAS,QACP,IACA,KACA,QACA,OACA,SACA,SACgB;CAChB,IAAI,CAAC,GAAG,uBAAuB,QAAQ,OAAO,SAAS,OAAO,GAAG,OAAO;CAGxE,QAAA,GAAA,8BAAA,iBAAA,CAAwB,UAAU,KAAK,OAAO,CAAC;AACjD;AAEA,SAAS,UACP,IACA,KACA,QACA,OACA,SACW;CAGX,MAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,OAAO,WAAW,OAAO,KAAK;EACnE,MAAM;EACN,QAAQ;EACR,OAAO;EACP,KAAK;CACP;CACA,MAAM,OAAO,QAAQ,IAAI,KAAK,QAAQ,OAAO,UAAU,OAAO,KAAK;CACnE,MAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,OAAO,WAAW,OAAO;CAChE,MAAM,OAAO,QAAQ,IAAI,KAAK,QAAQ,OAAO,UAAU,OAAO;CAC9D,MAAM,MAAM,QAAQ,IAAI,KAAK,QAAQ,OAAO,SAAS,OAAO;CAC5D,OAAO;EACL;EACA;EACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;EACzB,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;EACvB,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;CACvB;AACF;AAEA,SAAS,SACP,IACA,KACA,QACA,OACA,SACmC;CACnC,IAAI,CAAC,GAAG,kCAAkC,QAAQ,OAAO,OAAO,GAC9D,OAAO;EAAE,OAAO;EAAG,QAAQ;CAAE;CAE/B,OAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,aAAa,IAAkB,QAAa,OAAmC;CAGtF,QADqB,GAAG,4BAA4B,QAAQ,KACzC,GAAnB;EACE,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,aACP,IACA,KACA,QACA,OACA,aACQ;CACR,IAAI,CAAC,GAAG,4BAA4B,QAAQ,OAAO,WAAW,GAAG,OAAO;CACxE,MAAM,QAAQ,QAAQ,KAAK,aAAa,CAAC;CACzC,OAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACvD;AAEA,SAAS,UACP,IACA,KACA,QACA,OACe;CAIf,OACE,gBACE,MACC,KAAK,aAAa,GAAG,kBAAkB,QAAQ,OAAO,KAAK,QAAQ,GACpE,IACF,KAAK;AAET;AAGA,MAAM,mBAAmB,CAAC,GAAG,CAAC;AAC9B,MAAM,uBAAuB;AAC7B,MAAM,2BAA2B;;;;;;;;AASjC,SAAS,eAAe,IAAkB,KAAuB,QAA+B;CAC9F,MAAM,UAA4B,CAAC;CACnC,aAAa,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,aAAa;EAClD,KAAK,MAAM,QAAQ,kBAAkB;GACnC,MAAM,QAAQ,GAAG,0BAA0B,QAAQ,IAAI;GACvD,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;IAC1C,MAAM,OAAO,gBACX,MACC,KAAK,aACJ,GAAG,uBAAuB,QAAQ,MAAM,OAAO,KAAK,UAAU,WAAW,OAAO,GAClF,EACF;IACA,IAAI,SAAS,MAAM;IACnB,MAAM,eAAe,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM;IAC5D,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;IAC5C,QAAQ,KAAK;KACX;KACA,QACE,SAAS,uBACL;MAAE,MAAM;MAAQ,kBAAkB;KAAa,IAC/C,SAAS,2BACP;MAAE,MAAM;MAAY;KAAa,IACjC,EAAE,MAAM,WAAW;IAC7B,CAAC;GACH;EACF;CACF,CAAC;CACD,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjNA,IAAa,eAAb,MAA0B;CACxB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;;;;;;;;;;;;;CAoBH,KACE,mBACA,WACA,QACgB;EAChB,eAAe,MAAM;EACrB,KAAK,kBAAkB,cAAc,iBAAiB;EACtD,IAAI,YAAY,KAAK,CAAC,OAAO,UAAU,SAAS,GAC9C,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,4DAA4D,UAAU,EACxE;EAGF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,cADa,GAAG,kBAAkB,MACX,IAAI,kBAAkB;EACnD,IAAI,YAAY,aACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wBAAwB,UAAU,4CAA4C,aAChF;EAOF,MAAM,cAAc,kBAAkB,KAAK,QAAQ;GACjD,eAAe,MAAM;GACrB,OAAO,KAAK,QAAQ,qBAAqB,GAAG,CAAC,CAAC;EAChD,CAAC;EAGD,MAAM,SAAS,IAAI,MAAM,IAAI,YAAY,MAAM;EAC/C,IAAI;EACJ,IAAI;GACF,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KACtC,IAAI,KAAK,QAAQ,OAAO,YAAY,IAAI,IAAI,CAAC;GAE/C,KAAK,GAAG,eAAe,QAAQ,QAAQ,YAAY,QAAQ,SAAS;EACtE,UAAU;GACR,IAAI,KAAK,MAAM;EACjB;EAEA,IAAI,CAAC,IAIH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,kDAAkD,UAAU,iBAAiB,YAAY,KACvF,GACF,EAAE,GACJ;EAMF,KAAK,QAAQ,oBAAoB;EAMjC,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;;;;;;;;;;;;;;CAgBA,OACE,mBACA,UACA,QACkB;EAClB,eAAe,MAAM;EACrB,KAAK,kBAAkB,gBAAgB,iBAAiB;EACxD,IAAI,aAAa,KAAK,aAAa,MAAM,aAAa,OAAO,aAAa,KACxE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDAAwD,SAAS,EACnE;EAGF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,KAAK,MAAM,OAAO,mBAChB,KAAK,QAAQ,qBAAqB,GAAG;EAIvC,MAAM,eAAe,WAAW;EAChC,KAAK,MAAM,OAAO,mBAChB,IAAI,CAAC,GAAG,sCAAsC,QAAQ,KAAK,YAAY,GACrE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,uDAAuD,IAAI,kBAC7D;EAKJ,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;;;;;;;;;;;;;;;;;CAmBA,OAAO,mBAAuC,QAAuC;EACnF,eAAe,MAAM;EACrB,KAAK,kBAAkB,gBAAgB,iBAAiB;EAExD,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,aAAa,GAAG,kBAAkB,MAAM;EAC9C,IAAI,kBAAkB,UAAU,YAC9B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yCAAyC,kBAAkB,OAAO,MAAM,WAAW,qCACrF;EAGF,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,KAAK,MAAM,OAAO,mBAAmB;GACnC,KAAK,QAAQ,qBAAqB,GAAG;GACrC,IAAI,KAAK,OAAO,GAAG,GACjB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kDAAkD,IAAI,mCACxD;EAEJ;EAEA,KAAK,MAAM,OAAO,mBAAmB;GACnC,IAAI,CAAC,GAAG,iCAAiC,QAAQ,GAAG,GAClD,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kDAAkD,IAAI,kBACxD;GAEF,KAAK,QAAQ,cAAc,GAAG;EAChC;EAIA,KAAK,QAAQ,oBAAoB;EAGjC,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;;;;;;;CASA,QAAQ,OAAsB,QAAqC;EACjE,eAAe,MAAM;EACrB,IAAI,MAAM,KAAK,WAAW,GACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yCAAyC;EAE7F,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,KAAK,QAAQ,qBAAqB,MAAM,gBAAgB;EAExD,IAAI,MAAM,YAAY,KAAA,KAAa,MAAM,YAAY,MAAM,QAAQ,MAAM,QAAQ,SAAS,GACxF,iBAAiB,KAAK,MAAM,UAAU,QAAQ,GAAG,wBAAwB,QAAQ,GAAG,CAAC;EAKvF,IAAI,CAHO,iBAAiB,KAAK,MAAM,OAAO,QAC5C,GAAG,qBAAqB,QAAQ,KAAK,MAAM,gBAAgB,CAEvD,GAGJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kCAAkC,MAAM,KAAK,aAAa,MAAM,kBAClE;EAGF,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;CAGA,WAAW,OAA4B,QAAqC;EAC1E,eAAe,MAAM;EACrB,IAAI,MAAM,KAAK,WAAW,GACxB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,4CACF;EAEF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAI1C,IAAI,CAHY,iBAAiB,KAAK,MAAM,OAAO,QACjD,GAAG,wBAAwB,QAAQ,GAAG,CAE7B,GACT,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,oDAAoD,MAAM,KAAK,EACjE;EAGF,OAAO;GAAE,QADM,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAClD;GAAG,OAAO;EAAK;CAC/B;;CAGA,kBAA0B,IAAY,mBAA6C;EACjF,IAAI,kBAAkB,WAAW,GAC/B,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,GAAG,GAAG,4BAA4B;EAEtF,MAAM,uBAAO,IAAI,IAAsB;EACvC,KAAK,MAAM,OAAO,mBAAmB;GACnC,IAAI,KAAK,IAAI,GAAG,GACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,GAAG,GAAG,0CAA0C,KAClD;GAEF,KAAK,IAAI,GAAG;EACd;CACF;AACF;;;AC9TA,MAAMC,wBAAsB;;;;;;;;AAS5B,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;CAQH,QACE,mBACA,QACsC;EACtC,eAAe,MAAM;EACrB,IAAI,kBAAkB,WAAW,GAC/B,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,0CAA0C;EAE9F,MAAM,uBAAO,IAAI,IAAsB;EACvC,KAAK,MAAM,OAAO,mBAAmB;GACnC,IAAI,KAAK,IAAI,GAAG,GACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDAAwD,KAC1D;GAEF,KAAK,IAAI,GAAG;EACd;EAIA,MAAM,UAAU,kBAAkB,KAC/B,QAAQ,KAAK,QAAQ,qBAAqB,GAAG,CAAC,CAAC,SAClD;EAEA,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,UAAU,GAAG,uBAAuB;EAC1C,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,+BAA+B;EAEhF,MAAM,SAAS,IAAI,MAAM,IAAI,QAAQ,MAAM;EAC3C,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,IAAI,SAAqB;EACzB,IAAI;GACF,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,KAAK,QAAQ,OAAO,QAAQ,IAAI,IAAI,CAAC;GAE3C,IAAI,CAAC,GAAG,wBAAwB,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,GACxE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,0DAA0D,QAAQ,KAAK,GAAG,EAAE,GAC9E;GAGF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,SAAS,GAAG,+BAA+B,SAASF,uBAAqB,OAAO;GAChF,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,IAAI,CAAC,UAAU,QAAQ,GACrB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,gCAAgC;GAGvF,MAAM,QAAQ,IAAI,UAAU,QAAQ,IAAI;GACxC,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;GAAK;EAC/B,UAAU;GACR,IAAI,QAAQ,GAAG,gBAAgB,MAAM;GACrC,IAAI,KAAK,OAAO;GAChB,IAAI,KAAK,MAAM;GACf,GAAG,mBAAmB,OAAO;EAC/B;CACF;AACF;;;;;;;;;;;ACpEA,IAAa,gBAAb,MAA2B;CACzB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OAAO,OAAoB,WAA+B,QAAuC;EAC/F,eAAe,MAAM;EACrB,IAAI,MAAM,eAAe,GACvB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uCAAuC;EAG3F,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,UAAU,KAAK,QAAQ,cAAc;EAC3C,MAAM,cAAc,GAAG,kBAAkB,OAAO;EAChD,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,OAAO,UAAU,EAAE,KAAK,KAAK,KAAK,KAAK,aAC1C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0BAA0B,GAAG,oBAAoB,YAAY,EAC/D;EASF,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;EAC1C,IAAI,SAAqB;EACzB,IAAI,gBAAgB;EACpB,IAAI;GACF,IAAI,WAAW,SAAS,IAAI,WAAW,KAAK,CAAC;GAC7C,SAAS,GAAG,qBAAqB,SAAS,MAAM,YAAY,EAAE;GAC9D,IAAI,CAAC,QACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,6CACF;GAEF,gBAAgB,GAAG,kBAAkB,MAAM;GAC3C,IAAI,iBAAiB,GACnB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sCAAsC;GAG1F,IAAI,CAAC,GAAG,wBAAwB,SAAS,QAAQC,yBAAAA,UAAU,GAAG,EAAE,GAC9D,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,wDAAwD,IAC1D;GAEF,MAAM,cAAc;GACpB,KAAK,QAAQ,uBAAuB;IAClC,GAAG,mBAAmB,WAAW;IACjC,IAAI,KAAK,OAAO;GAClB,CAAC;EACH,SAAS,OAAO;GACd,IAAI,QAAQ,GAAG,mBAAmB,MAAM;GACxC,IAAI,KAAK,OAAO;GAChB,MAAM;EACR;EAIA,KAAK,QAAQ,oBAAoB;EAEjC,MAAM,SAAS,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAAM;EAItE,OAAO;GAAE,2BAH6C,OAAO,MAC1D,MAAM,IAAI,KAAK,aAAa,CAAC,CAC7B,KAAK,SAAS,KAAK,gBACW;GAAG;GAAQ,OAAO;EAAK;CAC1D;;;;;;;;;CAUA,YACE,MACA,WACA,QACkB;EAClB,eAAe,MAAM;EACrB,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK,SAAS;EAC5B,IACE,CAAC,OAAO,SAAS,MAAM,KAAK,KAC5B,CAAC,OAAO,SAAS,MAAM,MAAM,KAC7B,KAAK,SAAS,KACd,KAAK,UAAU,GAEf,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oEAAoE,MAAM,MAAM,GAAG,MAAM,QAC3F;EAEF,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQE,8BAAAA,6BACnD,MAAM,IAAIH,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,2BAA2B,MAAM,oBAAoBE,8BAAAA,4BAA4B,EACnF;EAGF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,UAAU,KAAK,QAAQ,cAAc;EAC3C,MAAM,cAAc,GAAG,kBAAkB,OAAO;EAChD,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,OAAO,UAAU,EAAE,KAAK,KAAK,KAAK,KAAK,aAC1C,MAAM,IAAIH,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,GAAG,oBAAoB,YAAY,EACpE;EAGF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAG9B,MAAM,UAAU,GAAG,aAAa,SAAS,KAAK,GAAG,KAAK,OAAO,KAAK,MAAM;GACxE,IAAI,CAAC,SAAS;IAGZ,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,gBAAgB,SAAS,EAAE;IAC1D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,8BAA8B,IAAI,EAAE,GAAG,MAAM,YAAY,KAAK,GAChE;GACF;GACA,GAAG,yBAAyB,OAAO;GACnC,GAAG,eAAe,OAAO;EAC3B;EAEA,KAAK,QAAQ,oBAAoB;EAEjC,MAAM,SAAS,IAAI,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,MAAM;EAItE,OAAO;GAAE,2BAH6C,OAAO,MAC1D,MAAM,IAAI,KAAK,KAAK,CAAC,CACrB,KAAK,SAAS,KAAK,gBACW;GAAG;GAAQ,OAAO;EAAK;CAC1D;AACF;;;;ACnJA,SAAgB,eACd,SACA,OACuB;CACvB,OAAO;EAAE,QAAQ,QAAQ,cAAc;EAAG,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;CAAG;AACxE;;;;;;;;ACjBA,MAAa,kBAAkB;CAC7B,WAAW;CACX,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,cAAc;CACd,gBAAgB;AAClB;AAEA,MAAM,YAAY,OAAO,KAAK,eAAe;;AAG7C,SAAgB,YAAY,MAA+B;CACzD,IAAI,SAAS,GAAG,OAAO,EAAE,GAAGG,8BAAAA,oBAAoB;CAChD,MAAM,QAAQ,EAAE,GAAGA,8BAAAA,oBAAoB;CACvC,KAAK,MAAM,OAAO,WAChB,MAAM,QAAQ,OAAO,gBAAgB,UAAU;CAEjD,OAAO;AACT;;;;;;AAOA,SAAgB,YAAY,SAAiB,SAA2C;CACtF,IAAI,OAAO;CACX,KAAK,MAAM,OAAO,WAAW;EAC3B,MAAM,QAAQ,QAAQ;EACtB,IAAI,UAAU,KAAA,GAAW;EACzB,IAAI,OACF,QAAQ,gBAAgB;OAExB,QAAQ,CAAC,gBAAgB;CAE7B;CACA,OAAO;AACT;;;;;;;;;;;;;;ACrCA,MAAM,UAAU;AAChB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;AACxB,MAAM,UAAU;AAChB,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,WAAW;AAEjB,SAAgB,iBAAiB,QAA4B;CAC3D,QAAQ,QAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,gBACH,OAAO;EACT,KAAK,kBACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,mBAAmB,MAA0B;CAC3D,QAAQ,MAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,mBACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK;EACL,SACE,OAAO;CACX;AACF;;;;;;;ACrCA,SAAgB,gBACd,IACA,KACA,UACA,KACe;CACf,IAAI,CAAC,GAAG,iBAAiB,UAAU,GAAG,GAAG,OAAO;CAChD,OAAO,gBACL,MACC,KAAK,aAAa,GAAG,yBAAyB,UAAU,KAAK,KAAK,QAAQ,GAC3E,EACF;AACF;;;;;AAMA,SAAgB,cAAc,IAAkB,KAAuB,UAAwB;CAC7F,OAAO,YAAY,KAAA,KAAmB,QAAQ;EAC5C,IAAI,CAAC,GAAG,kBAAkB,UAAU,GAAG,GACrC,OAAO;GAAE,MAAM;GAAG,QAAQ;GAAG,OAAO;GAAG,KAAK;EAAE;EAEhD,OAAO,UAAU,KAAK,GAAG;CAC3B,CAAC;AACH;AAEA,SAAgB,eAAe,IAAkB,UAAgC;CAC/E,OAAO,YAAY,GAAG,mBAAmB,QAAQ,CAAC;AACpD;;;;;;;;;;;AAYA,SAAgB,eACd,IACA,KACA,UACA,OAAe,GACD;CACd,OAAO,aAAa,KAAK;;;;CAAgC,IAAI,CAAC,GAAG,GAAG,OAAO;EACzE,IAAI,CAAC,GAAG,mBAAmB,UAAU,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO;EAC5D,OAAO;GACL,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;EACvB;CACF,CAAC;AACH;;;;;;;;AASA,SAAgB,iBACd,IACA,KACA,UACe;CACf,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAC1C,IAAI,CAAC,GAAG,qBAAqB,UAAU,GAAG,GAAG,OAAO;EACpD,QAAQ,QAAQ,KAAK,GAAG,IAAI,OAAQ;CACtC,CAAC;AACH;;;;;;;;;AAUA,SAAgB,gBACd,IACA,KACA,UACsC;CACtC,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAE1C,OAAO;GAAE,WADS,GAAG,yBAAyB,UAAU,GACvC;GAAG,OAAO,QAAQ,KAAK,GAAG;EAAE;CAC/C,CAAC;AACH;;;;;;AAOA,SAAgB,sBACd,IACA,KACA,UACU;CACV,MAAM,QAAQ,GAAG,oCAAoC,QAAQ;CAC7D,IAAI,SAAS,GAAG,OAAO,CAAC;CACxB,OAAO,YAAY,KAAK,QAAA,IAAoB,QAAQ;EAClD,IAAI,CAAC,GAAG,+BAA+B,UAAU,KAAK,KAAK,GAAG,OAAO,CAAC;EACtE,MAAM,MAAgB,CAAC;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK,IAAA,CAAa,CAAC;EACzE,OAAO;CACT,CAAC;AACH;;;;;;;;AASA,SAAgB,iBACd,IACA,KACA,UACe;CACf,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAC1C,IAAI,CAAC,GAAG,0BAA0B,UAAU,GAAG,GAAG,OAAO;EACzD,MAAM,YAAY,QAAQ,KAAK,GAAG;EAClC,OAAO,YAAY,IAAI,YAAY;CACrC,CAAC;AACH;;;;;;;AAQA,SAAgB,yBACd,IACA,KACA,UAC2B;CAC3B,OAAO,aACL,KACA;;;;;CAA2C,IAC1C,CAAC,MAAM,QAAQ,OAAO,SAAS;EAC9B,IAAI,CAAC,GAAG,kCAAkC,UAAU,MAAM,QAAQ,OAAO,GAAG,GAAG,OAAO;EACtF,OAAO;GACL,MAAM,QAAQ,KAAK,IAAI;GACvB,QAAQ,QAAQ,KAAK,MAAM;GAC3B,OAAO,QAAQ,KAAK,KAAK;GACzB,KAAK,QAAQ,KAAK,GAAG;EACvB;CACF,CACF;AACF;;;;;;;AAQA,SAAgB,aAAa,IAAkB,KAAuB,UAA2B;CAC/F,MAAM,QAAQ,GAAG,sBAAsB,UAAUC,yBAAAA,UAAU,CAAC;CAC5D,IAAI,SAAS,GAAG,OAAO,CAAC;CACxB,OAAO,YAAY,KAAK,QAAA,IAAuB,QAAQ;EACrD,MAAM,MAAM,GAAG,sBAAsB,UAAU,KAAK,KAAK;EACzD,IAAI,OAAO,GAAG,OAAO,CAAC;EACtB,MAAM,MAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;GAC5B,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK;IAAE,GAAG,QAAQ,KAAK,KAAK,GAAG;IAAG,GAAG,QAAQ,KAAK,KAAK,MAAM,CAAC;GAAE,CAAC;EACvE;EACA,OAAO;CACT,CAAC;AACH;;;;;;;;AASA,SAAgB,YAAY,IAAkB,KAAuB,UAAwB;CAC3F,MAAM,YAAY,GAAG,0BAA0B,QAAQ;CACvD,IAAI,aAAa,GAAG,OAAO,CAAC;CAC5B,MAAM,MAAe,CAAC;CACtB,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;EAClC,MAAM,QAAQ,GAAG,yBAAyB,UAAU,GAAGA,yBAAAA,UAAU,CAAC;EAClE,IAAI,SAAS,GAAG;EAChB,MAAM,SAAS,YAAY,KAAK,QAAA,IAAuB,QAAQ;GAC7D,MAAM,MAAM,GAAG,yBAAyB,UAAU,GAAG,KAAK,KAAK;GAC/D,IAAI,OAAO,GAAG,OAAO,CAAC;GACtB,MAAM,MAAkB,CAAC;GACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;IAC5B,MAAM,MAAM,IAAA;IACZ,IAAI,KAAK;KAAE,GAAG,QAAQ,KAAK,KAAK,GAAG;KAAG,GAAG,QAAQ,KAAK,KAAK,MAAM,CAAC;IAAE,CAAC;GACvE;GACA,OAAO;EACT,CAAC;EACD,IAAI,OAAO,SAAS,GAAG,IAAI,KAAK,MAAM;CACxC;CACA,OAAO;AACT;;;;;;AAOA,SAAgBC,WACd,IACA,KACA,UACmB;CACnB,OAAO,aAAa,KAAK,CAAA,GAAA,CAA2B,IAAI,CAAC,OAAO,SAAS;EACvE,IAAI,CAAC,GAAG,kBAAkB,UAAU,OAAO,GAAG,GAAG,OAAO;EACxD,OAAO;GACL,OAAO;IAAE,GAAG,QAAQ,KAAK,OAAO,CAAC;IAAG,GAAG,QAAQ,KAAK,OAAO,CAAC;GAAE;GAC9D,KAAK;IAAE,GAAG,QAAQ,KAAK,KAAK,CAAC;IAAG,GAAG,QAAQ,KAAK,KAAK,CAAC;GAAE;EAC1D;CACF,CAAC;AACH;;;;;;;AAQA,SAAgB,gBACd,IACA,KACA,UACa;CACb,OAAO,aAAa,KAAK,CAAA,GAAA,CAAqB,IAAI,CAAC,OAAO,SAAS;EACjE,IAAI,CAAC,GAAG,yBAAyB,UAAU,OAAO,GAAG,GACnD,OAAO;GAAE,OAAO;GAAQ,KAAK;EAAO;EAEtC,OAAO;GACL,OAAO,mBAAmB,QAAQ,KAAK,KAAK,CAAC;GAC7C,KAAK,mBAAmB,QAAQ,KAAK,GAAG,CAAC;EAC3C;CACF,CAAC;AACH;;;;;;;AAQA,SAAgB,sBACd,IACA,KACA,UAC6D;CAC7D,OAAO,aACL,KACA;;;;;;CAAsD,IACrD,CAAC,MAAM,MAAM,GAAG,GAAG,OAAO;EACzB,IAAI,CAAC,GAAG,+BAA+B,UAAU,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO;EAC9E,OAAO;GACL,UAAU,QAAQ,KAAK,IAAI;GAC3B,UAAU,QAAQ,KAAK,IAAI;GAC3B,OAAO;IACL,GAAG,QAAQ,KAAK,CAAC,IAAI;IACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;IACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;GACvB;EACF;CACF,CACF;AACF;;;;;;AAOA,SAAgB,kBAAkB,IAAkB,UAAuB;CACzE,OAAO,GAAG,2BAA2B,QAAQ;AAC/C;;;;;;AAOA,SAAgB,gBACd,IACA,KACA,UACe;CACf,IAAI,CAAC,GAAG,iBAAiB,UAAU,aAAa,GAAG,OAAO;CAC1D,OAAO,gBACL,MACC,KAAK,aAAa,GAAG,yBAAyB,UAAU,KAAK,QAAQ,GACtE,EACF;AACF;;;;;AAMA,SAAgB,sBAAsB,IAAkB,UAAwB;CAC9E,OAAO,GAAG,+BAA+B,QAAQ;AACnD;;;;;;;AAQA,SAAgB,WAAW,IAAkB,KAAuB,UAA8B;CAChG,MAAM,YAAY,GAAG,oBAAoB,UAAUD,yBAAAA,UAAU,CAAC;CAC9D,IAAI,aAAa,GAAG,OAAO;CAC3B,MAAM,SAAS,YAAY,KAAK;CAChC,OAAO,YAAY,KAAK,QAAQ,QAAQ;EACtC,GAAG,oBAAoB,UAAU,KAAK,KAAK;EAC3C,OAAO,IAAI,cAAc,GAAG;CAC9B,CAAC;AACH;;;;;;;AAQA,SAAgB,gBACd,IACA,KACA,UACY;CACZ,MAAM,QAAQ,GAAG,8BAA8B,QAAQ;CACvD,IAAI,SAAS,GAAG,OAAO,CAAC;CACxB,OAAO,YAAY,KAAK,QAAA,IAAuB,QAAQ;EACrD,MAAM,MAAM,GAAG,yBAAyB,UAAU,KAAK,KAAK;EAC5D,IAAI,OAAO,GAAG,OAAO,CAAC;EACtB,MAAM,MAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;GAC5B,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK;IAAE,GAAG,QAAQ,KAAK,KAAK,GAAG;IAAG,GAAG,QAAQ,KAAK,KAAK,MAAM,CAAC;GAAE,CAAC;EACvE;EACA,OAAO;CACT,CAAC;AACH;;;;;AAMA,SAAgB,eAAe,IAAkB,KAAuB,UAA0B;CAChG,MAAM,QAAQ,GAAG,gCAAgC,QAAQ;CACzD,IAAI,SAAS,GAAG,OAAO,CAAC;CAExB,OAAO,YAAY,KAAA,KAAyB,QAAQ;EAClD,MAAM,MAAiB,CAAC;EACxB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,IAAI,CAAC,GAAG,8BAA8B,UAAU,GAAG,GAAG,GAAG;GACzD,MAAM,KAAK,QAAgB,QAAQ,KAAK,KAAK,GAAG;GAIhD,IAAI,KAAK;IACP,IAAI;KAAE,GAAG,EAAE,CAAC;KAAG,GAAG,EAAE,CAAC;IAAE;IACvB,IAAI;KAAE,GAAG,EAAE,CAAC;KAAG,GAAG,EAAE,EAAE;IAAE;IACxB,IAAI;KAAE,GAAG,EAAE,EAAE;KAAG,GAAG,EAAE,EAAE;IAAE;IACzB,IAAI;KAAE,GAAG,EAAE,EAAE;KAAG,GAAG,EAAE,EAAE;IAAE;GAC3B,CAAC;EACH;EACA,OAAO;CACT,CAAC;AACH;;;;;AAMA,SAAgB,cACd,IACA,KACA,UACe;CACf,OAAO,eAAe,MAAM,KAAK,aAAa,GAAG,kBAAkB,UAAU,KAAK,QAAQ,CAAC;AAC7F;;;;;;;;;;;;;;;;;;ACvZA,MAAME,iBAAe;AACrB,MAAMC,uBAAqB;;;AAI3B,SAAgB,uBACd,IACA,KACA,UACoB;CACpB,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GAAG,OAAO,KAAA;CACrD,OAAO,YAAY,KAAA,IAAiB,QAAQ;EAC1C,IAAI,CAAC,GAAG,iCAAiC,UAAUD,gBAAc,GAAG,GAAG,OAAO,KAAA;EAC9E,MAAM,IAAI,QAAQ,KAAK,GAAG;EAC1B,OAAO,IAAI,IAAI,KAAA;CACjB,CAAC;AACH;;AAGA,SAAgB,4BACd,IACA,KACA,UACqB;CACrB,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GAAG,OAAO,KAAA;CACrD,OAAO,YAAY,KAAA,KAAmB,QAAQ;EAC5C,IAAI,CAAC,GAAG,+BAA+B,UAAUC,sBAAoB,GAAG,GAAG,OAAO,KAAA;EAElF,MAAM,IAAI,UAAU,KAAK,GAAG;EAC5B,OAAO;GAAE,MAAM,EAAE;GAAM,QAAQ,EAAE;GAAQ,OAAO,EAAE;GAAO,KAAK,EAAE;EAAI;CACtE,CAAC;AACH;;;;AClDA,MAAM,aAAa;AACnB,MAAM,yBAAyB;AAE/B,SAAgB,kBAAkB,QAA6B;CAC7D,QAAQ,QAAR;EACE,KAAK,WACH,OAAO;CACX;AACF;AAEA,SAAgB,oBAAoB,MAAyC;CAC3E,OAAO,SAAS,aAAa,YAAY;AAC3C;AAEA,SAAgB,sBAAsB,QAAiC;CACrE,QAAQ,QAAR;EACE,KAAK,uBACH,OAAO;CACX;AACF;AAEA,SAAgB,wBAAwB,MAA6C;CACnF,OAAO,SAAS,yBAAyB,wBAAwB;AACnE;;;;ACVA,MAAMC,wBAA6B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;AAExD,SAAgB,UACd,IACA,KACA,UACA,MACoB;CACpB,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAGA,sBAAoB;CAC5E,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,KAAK,yBAAyB,IAAI,KAAK,QAAQ;CACrD,MAAM,SAAS,oBAAoB,WAAW,IAAI,KAAK,QAAQ,CAAC;CAChE,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CAEnE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA,iBAAiB;EACjB,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C;AACF;;;;;;;;;;;ACjBA,SAAgB,kBACd,IACA,KACA,QACA,OACe;CACf,OAAO,gBAAgB,MAAM,KAAK,QAAQ,GAAG,yBAAyB,QAAQ,OAAO,KAAK,GAAG,CAAC;AAChG;;AAGA,SAAgB,uBACd,IACA,KACA,QACA,KACQ;CACR,MAAM,SAAS,IAAI,eAAe,IAAI,GAAG;CACzC,IAAI;EACF,OAAO,GAAG,gCAAgC,QAAQ,MAAM;CAC1D,UAAU;EACR,IAAI,KAAK,MAAM;CACjB;AACF;;;;;;;;;;AAWA,SAAgB,2BACd,IACA,KACA,eACA,QACA,MACA,UACM;CACN,MAAM,aAAa,SAAS,MAAM;CAClC,IAAI,eAAe,GAEb;MAAA,CAAC,GAAG,uBAAuB,eAAe,QAAQC,yBAAAA,UAAU,CAAC,GAC/D,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;CAAA,OAEnF;EACL,MAAM,UAAU,IAAI,MAAM,UAAU;EACpC,IAAI;GACF,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS,KAAK,CAAC;GACtD,IAAI,CAAC,GAAG,uBAAuB,eAAe,QAAQ,SAAS,UAAU,GACvE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;EAE1F,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;CACF;CAEA,IAAI,CAAC,GAAG,0BAA0B,eAAe,KAAK,YAAY,0BAA0B,GAC1F,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,0CAA0C;CAE3F,IAAI,KAAK,gBAAgB,KAAA,GAInB;MAAA,CAHO,iBAAiB,KAAK,KAAK,cAAc,QAClD,GAAG,8BAA8B,eAAe,GAAG,CAE/C,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,8CACF;CAAA;AAGN;;AAGA,SAAgB,uBACd,IACA,KACA,eACoB;CACpB,MAAM,OACJ,gBAAgB,MAAM,KAAK,QAAQ,GAAG,uBAAuB,eAAe,KAAK,GAAG,CAAC,KAAK;CAC5F,MAAM,WAAW,gBAAgB,MAAM,KAAK,QAC1C,GAAG,0BAA0B,eAAe,KAAK,GAAG,CACtD;CACA,MAAM,cAAc,gBAAgB,MAAM,KAAK,QAC7C,GAAG,8BAA8B,eAAe,KAAK,GAAG,CAC1D;CACA,MAAM,eAAe,qBAAqB,IAAI,KAAK,eAAe,cAAc;CAChF,MAAM,WAAW,kBAAkB,qBAAqB,IAAI,KAAK,eAAe,UAAU,CAAC;CAC3F,MAAM,OAAO,mBAAmB,IAAI,KAAK,aAAa;CAEtD,OAAO;EACL;EACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;EACrC,GAAI,SAAS,OAAO,EAAE,KAAK,IAAI,CAAC;EAChC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;CACzC;AACF;;;;;;AAOA,SAAgB,0BACd,SACA,eACA,iBACsC;CACtC,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,aAAa,IAAI,MAAM,CAAC;CAC9B,MAAM,UAAU,IAAI,MAAM,CAAC;CAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;CAC7B,IAAI,UAAsB;CAC1B,IAAI;EAGF,IAAI,KAAK,YAAY,OAAO,CAAC;EAC7B,IAAI,KAAK,SAAS,OAAO,CAAC;EAC1B,IAAI,KAAK,WAAW,OAAO,EAAE;EAQ7B,IAAI,CAPO,GAAG,wCACZ,eACA,OAAO,mBAAmB,CAAC,GAC3B,YACA,SACA,SAEI,GACJ,MAAM,mBAAmB,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,CAAC;EAE7D,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM;EAClD,UAAU,IAAI,KAAK,YAAY,KAAK;EACpC,IAAI,SAAS,KAAK,CAAC,SACjB,OAAO;GAAE,uBAAO,IAAI,YAAY,CAAC;GAAG,MAAM;EAAE;EAE9C,MAAM,OAAO,IAAI,UAAU,SAAS,IAAI;EACxC,MAAM,SAAS,IAAI,YAAY,KAAK,UAAU;EAC9C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,IAAI;EAC/B,OAAO;GAAE,OAAO;GAAQ;EAAK;CAC/B,UAAU;EACR,IAAI,SAAS,GAAG,gBAAgB,OAAO;EACvC,IAAI,KAAK,SAAS;EAClB,IAAI,KAAK,OAAO;EAChB,IAAI,KAAK,UAAU;CACrB;AACF;;;;;;;;AASA,SAAgB,wBACd,SACA,eACA,MACA,iBACkB;CAClB,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,UAAU,IAAI,MAAM,CAAC;CAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;CAC7B,MAAM,SAAS,QAAQ,UAAU,WAAW,IAAI;CAChD,IAAI;EACF,IAAI,KAAK,SAAS,OAAO,CAAC;EAC1B,IAAI,KAAK,WAAW,OAAO,EAAE;EAQ7B,IAAI,CAPO,GAAG,2BACZ,eACA,OAAO,KACP,OAAO,mBAAmB,CAAC,GAC3B,SACA,SAEI,GACJ,MAAM,mBAAmB,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,CAAC;EAE7D,OAAO,EAAE,MAAM,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE;CACxD,UAAU;EACR,OAAO,MAAM;EACb,IAAI,KAAK,SAAS;EAClB,IAAI,KAAK,OAAO;CAClB;AACF;;AAGA,SAAS,mBAAmB,QAA6B;CACvD,QAAQ,QAAR;EACE,KAAK,GACH,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,YAChB,sDACF;EACF,KAAK,GACH,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,uCAAuC;EAC9F,KAAK,GACH,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,YAChB,yDACF;EACF,KAAK,GACH,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;EAC3F,SACE,OAAO,IAAID,8BAAAA,YACTC,8BAAAA,gBAAgB,SAChB,wCAAwC,OAAO,EACjD;CACJ;AACF;AAEA,SAAS,qBACP,IACA,KACA,eACA,KACe;CACf,IAAI,CAAC,GAAG,sBAAsB,eAAe,GAAG,GAAG,OAAO;CAC1D,OAAO,gBACL,MACC,KAAK,QAAQ,GAAG,8BAA8B,eAAe,KAAK,KAAK,GAAG,GAC3E,IACF;AACF;AAEA,SAAS,mBACP,IACA,KACA,eACe;CACf,MAAM,MAAM,IAAI,MAAM,CAAC;CACvB,IAAI;EACF,IAAI,CAAC,GAAG,+BAA+B,eAAe,QAAQ,GAAG,GAAG,OAAO;EAC3E,MAAM,OAAO,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;EACxC,OAAO,QAAQ,IAAI,OAAO;CAC5B,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;AAGA,SAAS,kBAAkB,KAAmC;CAC5D,IAAI,CAAC,KAAK,OAAO;CACjB,MAAM,QAAQ,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI;CAC5E,OAAO,iBAAiB,KAAK,KAAK,IAAI,MAAM,YAAY,IAAI;AAC9D;;;;;;;;;;ACvQA,MAAa,oBAAwD,OAAO,OAAO;CACjF,SAAS;CACT,KAAK;CACL,MAAM;CACN,MAAM;CACN,iBAAiB;CACjB,WAAW;CACX,QAAQ;AACV,CAAC;AAED,MAAa,oBAAwD,OAAO,OAC1E,OAAO,YACL,OAAO,QAAQ,iBAAiB,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAAgB,CAAC,CAClF,CACF;AAEA,MAAa,oBAAkE,OAAO,OAAO;CAC3F,OAAO;CACP,YAAY;CACZ,WAAW;CACX,KAAK;AACP,CAAC;AAED,MAAa,oBAAkE,OAAO,OACpF,OAAO,YACL,OAAO,QAAQ,iBAAiB,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAA0B,CAAC,CAC5F,CACF;;;;ACvBA,MAAMC,kCAAuC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;;AAGpE,MAAM,+BAAmD;;;;;;;;AASzD,SAAgB,mBACd,IACA,KACA,UACA,MAC6B;CAC7B,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAGA,gCAA8B;CACtF,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,OACJ,kBAAkB,cAAc,IAAI,KAAK,QAAQ,KAAK,OAAO;CAE/D,MAAM,gBAAgB,GAAG,4BAA4B,QAAQ;CAC7D,MAAM,OAA2B,gBAC7B,uBAAuB,IAAI,KAAK,aAAa,IAC7C,EAAE,MAAM,GAAG;CAEf,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA;CACF;AACF;;;;;;;;;;;;;ACzCA,MAAa,sBAAsB;CACjC,OAAO;CACP,eAAe;CACf,cAAc;CACd,WAAW;AACb;;;;;;;;;;;;;;ACFA,MAAM,eAAe;AACrB,MAAM,uBAAuB;AAE7B,SAAgB,qBAAqB,QAAgC;CACnE,OAAO,WAAW,sBAAsB,uBAAuB;AACjE;AAEA,SAAgB,uBAAuB,MAAqC;CAC1E,OAAO,SAAS,uBAAuB,sBAAsB;AAC/D;;;;;;;;;;;;;;ACTA,MAAM,eAA6C;CACjD,SAAS;CACT,gBAAgB;CAChB,wBAAwB;CACxB,mBAAmB;CACnB,WAAW;CACX,kBAAkB;CAClB,0BAA0B;CAC1B,qBAAqB;CACrB,eAAe;CACf,cAAc;CACd,qBAAqB;CACrB,gBAAgB;CAChB,QAAQ;CACR,iBAAiB;AACnB;AAEA,MAAM,eAA6C,OAAO,YACxD,OAAO,QAAQ,YAAY,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAAoB,CAAC,CACjF;;AAGA,MAAa,wBAAsC;AAEnD,SAAgB,mBAAmB,MAA4B;CAC7D,OAAO,aAAa,SAAS,aAAA;AAC/B;;;;;;;AAQA,SAAgB,eAAe,MAA0C;CACvE,OAAO,OAAO,UAAU,eAAe,KAAK,cAAc,IAAI;AAChE;AAEA,SAAgB,qBAAqB,MAA4B;CAC/D,OAAO,aAAa,SAAA;AACtB;;;ACdA,MAAM,iBAAqD;CACzD,SAAS;EAAE,QAAQ;EAAW,QAAQ;EAAK,QAAQ;CAAM;CACzD,gBAAgB;EAAE,QAAQ;EAAW,QAAQ;EAAK,QAAQ;CAAM;CAChE,wBAAwB;EAAE,QAAQ;EAAW,QAAQ;EAAK,QAAQ;CAAK;CACvE,mBAAmB;EAAE,QAAQ;EAAW,QAAQ;EAAK,QAAQ;CAAK;CAClE,WAAW;EAAE,QAAQ;EAAa,QAAQ;EAAK,QAAQ;CAAM;CAC7D,kBAAkB;EAAE,QAAQ;EAAa,QAAQ;EAAK,QAAQ;CAAM;CACpE,0BAA0B;EAAE,QAAQ;EAAa,QAAQ;EAAK,QAAQ;CAAK;CAC3E,qBAAqB;EAAE,QAAQ;EAAa,QAAQ;EAAK,QAAQ;CAAK;CACtE,eAAe;EAAE,QAAQ;EAAS,QAAQ;EAAK,QAAQ;CAAM;CAC7D,cAAc;EAAE,QAAQ;EAAS,QAAQ;EAAK,QAAQ;CAAM;CAC5D,qBAAqB;EAAE,QAAQ;EAAS,QAAQ;EAAK,QAAQ;CAAK;CAClE,gBAAgB;EAAE,QAAQ;EAAS,QAAQ;EAAK,QAAQ;CAAK;CAC7D,QAAQ;EAAE,QAAQ;EAAU,QAAQ;EAAK,QAAQ;CAAM;CACvD,iBAAiB;EAAE,QAAQ;EAAgB,QAAQ;EAAK,QAAQ;CAAM;AACxE;;;AAIA,SAAgBC,YAAU,QAAwB;CAChD,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,cAAc,EAAE;AACtD;AAEA,MAAM,uBAA+D;CACnE,WAAW;CACX,OAAO;CACP,SAAS;CACT,WAAW;CACX,OAAO;CACP,YAAY;CACZ,eAAe;CACf,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,QAAQ;CACR,cAAc;CACd,UAAU;AACZ;;;;;;;AAQA,SAAgB,oBACd,MACA,UACa;CACb,IAAI,eAAe,IAAI,GAAG;EACxB,MAAM,OAAO,eAAe;EAC5B,OAAO;GAAE,QAAQ,KAAK;GAAQ,QAAQ,KAAK;GAAQ,QAAQ,KAAK;EAAO;CACzE;CACA,MAAM,aAAa,WAAW,IAAI;CAClC,IAAI,YACF,OAAO;EAAE,QAAQ,WAAW;EAAY,QAAQ,WAAW;EAAQ,QAAQ,WAAW;CAAO;CAE/F,OAAO,EAAE,QAAQ,KAAK;AACxB;;;;;AAMA,SAAgB,oBACd,MACA,YACc;CACd,MAAM,MAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM;CAC9D,IAAI,QAAQ,KAAA,GAAW,OAAO;CAC9B,MAAM,WAAW,qBAAqBA,YAAU,KAAK,MAAM;CAC3D,IAAI,UAAU;EACZ,MAAM,OAAO,KAAK,UAAU;EAC5B,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,cAAc,GACtD,IAAI,KAAK,WAAW,YAAY,KAAK,UAAU,QAAQ,QAAQ,KAAK,WAAW,KAAK,QAClF,OAAO;EAIX,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,cAAc,GACtD,IAAI,KAAK,WAAW,UAAU,OAAO;CAEzC;CACA,OAAO,KAAK;AACd;;;AAIA,SAAS,eACP,OACA,UACG;CACH,IAAI,MAAM,WAAW,KAAA,GAAW,OAAO;CACvC,MAAM,OAAO,oBAAoB,MAAM,QAAQ,QAAQ;CACvD,MAAM,MAAS;EAAE,GAAG;EAAO,QAAQ,KAAK;CAAO;CAG/C,IAAI,KAAK,WAAW,KAAA,KAAa,MAAM,WAAW,KAAA,GAAW,IAAI,SAAS,KAAK;CAC/E,IAAI,KAAK,WAAW,KAAA,KAAa,MAAM,WAAW,KAAA,GAAW,IAAI,SAAS,KAAK;CAC/E,OAAO;AACT;;AAGA,SAAgB,mBACd,OACA,UACQ;CACR,MAAM,OAAO,MAAM,OAAO,eAAe,MAAM,MAAM,QAAQ,IAAI,KAAA;CACjE,MAAM,aAAa,MAAM,WAAW,KAAK,OAAO;EAC9C,GAAG;EACH,MAAM,EAAE,KAAK,KAAK,MAAO,EAAE,QAAQ;GAAE,GAAG;GAAG,OAAO,eAAe,EAAE,OAAO,QAAQ;EAAE,IAAI,CAAE;CAC5F,EAAE;CACF,OAAO,KAAK,UAAU,OAAO;EAAE;EAAM;CAAW,IAAI,EAAE,WAAW,CAAC;AACpE;;;AAUA,SAAgB,oBAAoB,MAAuC;CACzE,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,IAAI;CACvB,QAAQ;EACN,OAAO;CACT;CACA,IAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,CAAC,IAAI,QAAQ,CAAC,MAAM,QAAQ,IAAI,UAAU,GAC/E,OAAO;CAET,MAAM,EAAE,QAAQ,SAAS,GAAG,aAAa,IAAI;CAY7C,OAAO;EAAE,MAAA;EAAM,YAPyB,IAAI,WAAW,KAAK,MAAM;GAChE,MAAM,EAAE,MAAM,GAAG,UAAU;GAC3B,OAAO;IACL,GAAI;IACJ,OAAO,QAAQ,CAAC,EAAA,CAAG,KAAK,MAAM,CAAiD;GACjF;EACF,CACwB;CAAE;AAC5B;;AAGA,SAAgB,mBACd,IACA,KACA,UACyB;CACzB,MAAM,OAAO,eAAe,MAAM,KAAK,QAAQ,GAAG,0BAA0B,UAAU,KAAK,GAAG,CAAC;CAC/F,OAAO,OAAO,oBAAoB,IAAI,IAAI;AAC5C;;;;;;AAOA,SAAgB,wBAAwB,OAI/B;CACP,IAAI,MAAM,YAAY,eAAe,MAAM,aAAa,KAAA,GAAW;CACnE,IAAI,MAAM,aAAa,KAAA,KAAa,MAAM,aAAa,MAAM;CAC7D,IAAI,MAAM,cAAA,GAAA,8BAAA,kBAAA,CAA+B,MAAM,QAAQ,GACrD,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yFACF;AAEJ;;;;;;;;;;ACjNA,MAAM,SAAS;AACf,MAAM,WAAW;AACjB,MAAM,UAAU;AAEhB,SAAgB,oBAAoB,OAA8B;CAChE,QAAQ,OAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,sBAAsB,MAA6B;CACjE,QAAQ,MAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK;EACL,SACE,OAAO;CACX;AACF;;;;;;;;;;;;;;ACtBA,MAAM,WAAW;AACjB,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,WAAW;AAEjB,SAAgB,kBAAkB,OAAsC;CACtE,QAAQ,OAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,oBAAoB,MAAqC;CACvE,QAAQ,MAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK;EACL,SACE,OAAO;CACX;AACF;;;;;;;ACvBA,MAAMC,kBAAuB;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;;;;;;AAelD,SAAgB,iBACd,IACA,KACA,UACc;CACd,MAAM,EAAE,WAAW,UAAU,gBAAgB,IAAI,KAAK,QAAQ;CAC9D,MAAM,YAAY,sBAAsB,IAAI,KAAK,QAAQ;CACzD,OAAO;EACL,aAAa;EACb,aAAa,oBAAoB,SAAS;EAC1C,GAAI,UAAU,SAAS,IAAI,EAAE,UAAU,IAAI,CAAC;CAC9C;AACF;;;;;;;AAQA,SAAgB,wBACd,IACA,KACA,UACqB;CACrB,MAAM,QAAQ,eAAe,IAAI,KAAK,UAAU,oBAAoB,KAAK,KAAK,EAC5E,GAAGA,gBACL;CACA,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAG7C,OAAO;EACL;EACA,SAJc,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;EAK1D,GAAG,iBAAiB,IAAI,KAAK,QAAQ;CACvC;AACF;;;;;;AAOA,SAAgB,sBACd,IACA,KACA,UACmB;CACnB,MAAM,gBAAgB,eAAe,IAAI,KAAK,UAAU,oBAAoB,aAAa;CACzF,OAAO;EACL,GAAG,wBAAwB,IAAI,KAAK,QAAQ;EAC5C,eAAe,iBAAiB;CAClC;AACF;;;;AC1DA,MAAMC,2BAAgC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;AAGzD,MAAMC,sBAAoB;AAE1B,SAAS,YAAY,GAAU,GAAmB;CAChD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AACjD;AAEA,SAAgB,aACd,IACA,KACA,UACA,MACA,cACA,KACuB;CACvB,MAAM,KAAK,sBAAsB,IAAI,KAAK,QAAQ;CAClD,MAAM,QAAQ,IAAI,SAAS,EAAE,GAAGD,yBAAuB;CAKvD,MAAM,OAAO,mBAAmB,IAAI,KAAK,QAAQ;CACjD,MAAM,QAAQ,KAAK;CACnB,MAAM,aAAa,OACf,oBACE,KAAK,MACL,SAAS,QAAQ,QAAQ,WAAW,MAAM,WAAW,QAAQ,QAAQ,MAAM,IAAI,KAAA,CACjF,IACA,KACE,qBAAqB,GAAG,QAAQ,IAChC;CACN,MAAM,WACJ,QAAQ,KAAK,KAAK,OAAO,IACrB,KAAK,KAAK,OACV,MAAM,GAAG,WAAW,IAClB,GAAG,WACHC;CACR,MAAM,WAAW,QAAQ;EACvB,MAAM;GACJ,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,OAAO;GACP,YAAY,CAAC;GACb,QAAQ;GACR,eAAe;GACf,iBAAiB;GACjB,OAAO;GACP,KAAK;EACP;EACA,YAAY,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;CACxD;CAIA,MAAM,YAAY,eAAe,IAAI,KAAK,UAAU,oBAAoB,SAAS;CACjF,MAAM,YAAY,aAAa,CAAC,YAAY,WAAW,KAAK,IAAI,YAAY,KAAA;CAG5E,MAAM,aAAa,eAAe,IAAI,KAAK,UAAU,oBAAoB,KAAK;CAE9E,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAK5D,MAAM,WAAW,sBAAsB,kBAAkB,IAAI,QAAQ,CAAC;CACtE,MAAM,YAAY,QAAQ,KAAK,KAAK,UAAU,YAAY,KAAK,KAAK,QAAQ;CAC5E,MAAM,SAAS,uBAAuB,WAAW,IAAI,KAAK,QAAQ,CAAC;CAEnE,MAAM,SAAS,gBAAgB,IAAI,KAAK,QAAQ;CAChD,MAAM,cACJ,OAAO,WAAW,IACd,CAAC,OAAO,IAAK,OAAO,EAAG,IACvB,OAAO,WAAW,IAChB;EAAC,OAAO;EAAK,OAAO;EAAK,OAAO;CAAG,IACnC,KAAA;CACR,MAAM,YAAY,gBAAgB,IAAI,KAAK,QAAQ,CAAC,CAAC;CAErD,MAAM,KAAK,yBAAyB,IAAI,KAAK,QAAQ;CACrD,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CAEnE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACA,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;EAC/C,eAAe,cAAc;EAC7B;EACA,GAAG,iBAAiB,IAAI,KAAK,QAAQ;EACrC,iBAAiB;EACjB,GAAI,gBAAgB,KAAA,IAAY,EAAE,YAAY,IAAI,CAAC;EACnD,GAAI,gBAAgB,KAAA,KAAa,cAAc,SAAS,EAAE,YAAY,UAAU,IAAI,CAAC;EACrF,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C;AACF;;;ACvIA,SAAgB,gBAAgB,QAA2B;CACzD,QAAQ,QAAR;EACE,KAAK,iBACH,OAAO;CACX;AACF;AAEA,SAAgB,kBAAkB,MAAuC;CACvE,QAAQ,MAAR;EACE,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;ACRA,SAAgB,QACd,IACA,KACA,UACA,MACkB;CAClB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,SAAS,kBAAkB,WAAW,IAAI,KAAK,QAAQ,CAAC;CAC9D,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,wBAAwB,IAAI,KAAK,QAAQ;EAC5C;EACA,SAAS,YAAY,IAAI,KAAK,QAAQ;EACtC,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;CACzC;AACF;;;;AChBA,MAAM,YAAY;CAAE,OAAO;EAAE,GAAG;EAAG,GAAG;CAAE;CAAG,KAAK;EAAE,GAAG;EAAG,GAAG;CAAE;AAAE;AAE/D,SAAgB,SACd,IACA,KACA,UACA,MACmB;CACnB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,sBAAsB,IAAI,KAAK,QAAQ;EAC1C,YAAYC,WAAe,IAAI,KAAK,QAAQ,KAAK;EACjD,aAAa,gBAAgB,IAAI,KAAK,QAAQ;EAC9C,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;CACzC;AACF;;;;;;;;;;;;;;;;;;;ACEA,SAAgB,SACd,IACA,KACA,UACA,MACA,iBACA,KACmB;CACnB,OAAO;EAAE,GAAG;EAAM,SAAS;EAAQ,QAAQ,eAAe,IAAI,KAAK,UAAU,MAAM,GAAG;CAAE;AAC1F;;;;;;AAOA,SAAgB,yBAAyB,MAA2C;CAGlF,IAAI,KAAK,YAAY,OAAO,EAAE,MAAM,cAAc;CAClD,MAAM,OAAO,KAAK;CAClB,IAAI,CAAC,MAAM,OAAO,EAAE,MAAM,cAAc;CACxC,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO;GAAE,MAAM;GAAQ,aAAa,KAAK;EAAY;EACvD,KAAK,OACH,OAAO;GAAE,MAAM;GAAO,KAAK,KAAK;EAAI;EAEtC,KAAK,eACH,OAAO;GAAE,MAAM;GAAe,MAAM,KAAK;EAAS;EACpD,KAAK,UACH,OAAO;GAAE,MAAM;GAAU,MAAM,KAAK;EAAS;EAC/C,KAAK,cAGH,OAAO,EAAE,MAAM,aAAa;EAC9B,KAAK,SACH,OAAO;GAAE,MAAM;GAAS,MAAM,KAAK;EAAK;EAC1C,SACE,OAAO,EAAE,MAAM,cAAc;CACjC;AACF;AAEA,SAAS,eACP,IACA,KACA,UACA,MACA,KACsB;CACtB,MAAM,WAAW,KAAK,SAAS;CAC/B,IAAI,UAAU,OAAO,yBAAyB,QAAQ;CAGtD,MAAM,UAAU,GAAG,kBAAkB,QAAQ;CAC7C,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,UAAU,GAAG,iBAAiB,IAAI,QAAQ,OAAO;CACvD,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,cAAc,gBAAgB,IAAI,KAAK,IAAI,QAAQ,OAAO;CAChE,OAAO,cAAc;EAAE,MAAM;EAAQ;CAAY,IAAI,EAAE,MAAM,cAAc;AAC7E;;;;;ACrEA,MAAMC,yBAA8B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;AAGzD,MAAMC,wBAA6B;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;AAKtD,MAAMC,sBAAoB;AAE1B,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,MAAM,QAAQ,eAAe,IAAI,KAAK,UAAU,oBAAoB,KAAK,KAAK,EAC5E,GAAGF,uBACL;CACA,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,gBACJ,eAAe,IAAI,KAAK,UAAU,oBAAoB,aAAa,KAAK;CAE1E,MAAM,KAAK,sBAAsB,IAAI,KAAK,QAAQ;CAClD,MAAM,aAAa,KAAK,qBAAqB,GAAG,QAAQ,IAAI;CAC5D,MAAM,WAAW,KAAK,GAAG,WAAWE;CACpC,MAAM,YAAY,IAAI,SAAS,EAAE,GAAGD,sBAAoB;CAExD,OAAO;EACL,GAAG;EACH,SAAS;EACT,YAAY,eAAe,IAAI,KAAK,QAAQ;EAC5C;EACA;EACA;EACA,aAAa,gBAAgB,IAAI,KAAK,QAAQ;EAC9C,QAAQ,sBAAsB,IAAI,QAAQ;EAC1C;EACA;EACA;EACA,WAAW,sBAAsB,kBAAkB,IAAI,QAAQ,CAAC;CAClE;AACF;;;;;;;;;;ACvCA,SAAgB,gBACd,IACA,KACA,UACuB;CACvB,MAAM,kBAAkB,iBAAiB,IAAI,KAAK,QAAQ;CAC1D,MAAM,kBAAkB,yBAAyB,IAAI,KAAK,QAAQ;CAClE,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CAEnE,OAAO;EACL,GAAG,sBAAsB,IAAI,KAAK,QAAQ;EAC1C;EACA;EACA,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C;AACF;AAEA,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,OAAO;EAAE,GAAG;EAAM,SAAS;EAAU,GAAG,gBAAgB,IAAI,KAAK,QAAQ;CAAE;AAC7E;AAEA,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,OAAO;EAAE,GAAG;EAAM,SAAS;EAAU,GAAG,gBAAgB,IAAI,KAAK,QAAQ;CAAE;AAC7E;;;;;;;;;AC1CA,SAAgB,UACd,IACA,KACA,UACA,MACoB;CACpB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,MAAM,gBAAgB,4BAA4B,IAAI,KAAK,QAAQ;CACnE,OAAO;EACL,GAAG;EACH,SAAS;EACT,MAAM,cAAc,IAAI,KAAK,QAAQ;EACrC,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;EACvC,GAAI,iBAAiB,OAAO,EAAE,cAAc,IAAI,CAAC;CACnD;AACF;;;;;;;;;;;;ACpBA,MAAM,qBAA6C;CACjD,QAAQ;CACR,QAAQ;AACV;AAEA,MAAM,eAAuC;CAC3C,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACX,MAAM;CACN,QAAQ;CACR,UAAU;AACZ;AAEA,MAAM,qBAA6C,OAAO,kBAAkB;AAC5E,MAAM,eAAuC,OAAO,YAAY;AAEhE,SAAgB,gBAAgB,OAAuB;CACrD,OAAO,mBAAmB,UAAU;AACtC;AAEA,SAAgB,kBAAkB,OAAuB;CACvD,OAAO,mBAAmB,UAAU;AACtC;AAEA,SAAgB,WAAW,OAAuB;CAChD,OAAO,aAAa,UAAU;AAChC;AAEA,SAAgB,aAAa,OAAuB;CAClD,OAAO,aAAa,UAAU;AAChC;AAEA,SAAS,OAAO,KAAqD;CACnE,OAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;AACjF;;;;AC5BA,MAAME,uBAA4B;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;;AAGzD,MAAM,oBAA8B;AAEpC,SAAgB,SACd,IACA,KACA,UACA,MACmB;CACnB,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAGA,qBAAmB;CAC3E,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAC7C,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;CAC5D,MAAM,OAAO,kBAAkB,cAAc,IAAI,KAAK,QAAQ,KAAK,OAAO;CAK1E,MAAM,WAAW,gBAAgB,IAAI,KAAK,UAAU,OAAO;CAC3D,MAAM,gBAAgB,gBAAgB,IAAI,KAAK,UAAU,YAAY;CAErE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;EACA;EACA,OAAO,aAAa,OAAO,OAAO,aAAa,QAAQ;EACvD,YAAY,kBAAkB,OAAO,OAAO,kBAAkB,aAAa;CAC7E;AACF;;;AC9BA,MAAMC,4BAAiC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAC9D,MAAMC,8BAAmC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;;;AAO5D,SAAgB,qBACd,IACA,KACA,UACA,gBAAuBA,6BAKvB;CACA,MAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK,EAAE,GAAG,cAAc;CACtE,MAAM,KAAK,iBAAiB,IAAI,KAAK,QAAQ;CAG7C,OAAO;EAAE;EAAO,SAFA,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;EAEnC,YADN,eAAe,IAAI,KAAK,QACT;CAAE;AACtC;AAEA,SAAgB,cACd,IACA,KACA,UACA,MACwB;CACxB,MAAM,SAAS,qBAAqB,IAAI,KAAK,UAAUD,yBAAuB;CAC9E,OAAO;EAAE,GAAG;EAAM,SAAS;EAAa,GAAG;CAAO;AACpD;AAEA,SAAgB,cACd,IACA,KACA,UACA,MACwB;CACxB,MAAM,SAAS,qBAAqB,IAAI,KAAK,QAAQ;CACrD,OAAO;EAAE,GAAG;EAAM,SAAS;EAAa,GAAG;CAAO;AACpD;AAEA,SAAgB,aACd,IACA,KACA,UACA,MACuB;CACvB,MAAM,SAAS,qBAAqB,IAAI,KAAK,QAAQ;CACrD,OAAO;EAAE,GAAG;EAAM,SAAS;EAAY,GAAG;CAAO;AACnD;AAEA,SAAgB,cACd,IACA,KACA,UACA,MACwB;CACxB,MAAM,SAAS,qBAAqB,IAAI,KAAK,QAAQ;CACrD,MAAM,SAAS,wBAAwB,WAAW,IAAI,KAAK,QAAQ,CAAC;CACpE,OAAO;EAAE,GAAG;EAAM,SAAS;EAAa;EAAQ,GAAG;CAAO;AAC5D;;;;;;;;ACzEA,SAAgB,gBACd,IACA,KACA,UACA,MACA,gBAC0B;CAC1B,MAAM,iBAAiB,gBAAgB,IAAI,KAAK,UAAU,SAAS;CACnE,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA;CACF;AACF;;;;;;;;;ACNA,SAAgB,iBACd,IACA,KACA,UACwB;CACxB,MAAM,WAAW,uBAAuB,IAAI,KAAK,QAAQ;CACzD,OAAO;EACL,GAAG,sBAAsB,IAAI,KAAK,QAAQ;EAC1C,UAAU,aAAa,IAAI,KAAK,QAAQ;EACxC,GAAI,YAAY,OAAO,EAAE,SAAS,IAAI,CAAC;CACzC;AACF;AAEA,SAAgB,YACd,IACA,KACA,UACA,MACsB;CACtB,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,iBAAiB,IAAI,KAAK,QAAQ;EAGrC,iBAAiB,iBAAiB,IAAI,KAAK,QAAQ;CACrD;AACF;AAEA,SAAgB,aACd,IACA,KACA,UACA,MACuB;CACvB,OAAO;EACL,GAAG;EACH,SAAS;EACT,GAAG,iBAAiB,IAAI,KAAK,QAAQ;EACrC,aAAa,gBAAgB,IAAI,KAAK,QAAQ;CAChD;AACF;;;ACjDA,MAAME,oBAAkB;AACxB,MAAMC,wBAAsB;AAC5B,MAAM,YAAY;AAElB,SAAS,YACP,IACA,KACA,UACA,OACc;CACd,OAAO,aAAa,KAAK;EAAC;EAAW;EAAW;CAAS,IAAI,CAAC,GAAG,GAAG,OAAO;EACzE,IAAI,CAAC,GAAG,qBAAqB,UAAU,OAAO,GAAG,GAAG,CAAC,GAAG,OAAO;EAC/D,OAAO;GACL,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;GACrB,GAAG,QAAQ,KAAK,CAAC,IAAI;EACvB;CACF,CAAC;AACH;;;;;;AAOA,SAAgB,WACd,IACA,KACA,UACA,MACqB;CACrB,MAAM,SAAS,iBAAiB,IAAI,KAAK,QAAQ;CACjD,MAAM,KAAK,sBAAsB,IAAI,KAAK,QAAQ;CAClD,OAAO;EACL,GAAG;EACH,SAAS;EACT,OAAO,YAAY,IAAI,KAAK,UAAUD,iBAAe;EACrD,eAAe,YAAY,IAAI,KAAK,UAAUC,qBAAmB;EACjE,aAAa,OAAO;EACpB,aAAa,OAAO;EACpB,GAAI,KACA;GACE,YAAY,qBAAqB,GAAG,QAAQ;GAC5C,UAAU,GAAG;GACb,WAAW,GAAG;EAChB,IACA,CAAC;EACL,WAAW,sBAAsB,kBAAkB,IAAI,QAAQ,CAAC;EAGhE,mBAAmB;EACnB,aAAa;CACf;AACF;;;ACbA,MAAM,oBAAiF;CACrF,WAAW;CACX,WAAW;CACX,UAAU;CACV,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,UAAU;CACV,MAAM;CACN,MAAM;CACN,KAAK;CACL,aAAa;CACb,OAAO;CACP,MAAM;CACN,OAAO;CACP,mBAAmB;CACnB,QAAQ;CACR,QAAQ;CACR,aAAa;AACf;;;;;;AAOA,SAAgB,WAAW,gBAGzB;CACA,MAAM,WAAA,GAAA,8BAAA,gBAAA,CAA0B,cAAc;CAC9C,MAAM,SAAS,kBAAkB;CACjC,IAAI,QAAQ,OAAO;EAAE;EAAQ;CAAQ;CACrC,OAAO;EAAE,QAAQ,kBAAkB;EAAc,SAAS;CAAc;AAC1E;;;;;;;;;;;;;;;;;;;;ACzDA,MAAMC,0BAAQ,IAAI,QAAyC;AAE3D,SAAgB,iBAAiB,SAA2B,SAA+B;CACzF,MAAM,MAAM,QAAQ,YAAY;CAChC,MAAM,MAAMA,QAAM,IAAI,OAAO;CAC7B,IAAI,OAAO,IAAI,QAAQ,KACrB,OAAO,IAAI;CAEb,IAAI,KAAK;EACP,QAAQ,GAAG,oBAAoB,IAAI,GAAG;EACtC,QAAM,OAAO,OAAO;CACtB;CACA,MAAM,MAAM,QAAQ,GAAG,mBAAmB,QAAQ,cAAc,CAAC;CACjE,IAAI,QAAQC,yBAAAA,UACV,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,4BAA4B;CAE7E,QAAM,IAAI,SAAS;EAAE;EAAK;CAAI,CAAC;CAC/B,OAAO;AACT;;AAGA,SAAgB,iBAAiB,SAA2B,SAAgC;CAC1F,MAAM,MAAMH,QAAM,IAAI,OAAO;CAC7B,IAAI,CAAC,KACH;CAEF,QAAQ,GAAG,oBAAoB,IAAI,GAAG;CACtC,QAAM,OAAO,OAAO;AACtB;;;ACtCA,MAAa,iBAAkD;CAC7D,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAGA,MAAM,oBAA8C;CAClD,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAGA,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,sBAAsB;AAC5B,MAAM,UAAU,KAAK;AACrB,MAAM,kBAAkB,KAAK;AAC7B,MAAM,UAAU,KAAK;AACrB,MAAM,sBAAsB,KAAK;AAEjC,SAASI,WAAS,SAA2B,MAAsD;CACjG,OAAO,gBAAgB,QAAQ,KAAK,IAAI,KAAK;AAC/C;AAEA,SAAS,eACP,SACA,MACe;CACf,OAAO,gBAAgB,QAAQ,KAAK,MAAM,IAAI;AAChD;AAEA,SAAS,kBACP,SACA,OACA,YACqB;CACrB,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,2BAA2B,OAAO,UAAU;CAC7D,MAAM,UAA+B,CAAC;CACtC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK;EACX,mBAAmB,GAAG,8BAA8B,OAAO,YAAY,CAAC;EACxE,kBAAkB,GAAG,kCAAkC,OAAO,YAAY,CAAC;EAC3E,SACE,eAAe,QAAQ,MAAM,KAAK,QAChC,GAAG,+BAA+B,OAAO,YAAY,GAAG,KAAK,GAAG,CAClE,KAAK;EACP,aAAaA,WAAS,UAAU,KAAK,QACnC,GAAG,mCAAmC,OAAO,YAAY,GAAG,KAAK,GAAG,CACtE;EACA,SAAS,GAAG,8BAA8B,OAAO,YAAY,CAAC;CAChE,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,iBACP,SACA,OACA,YACiB;CACjB,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,2BAA2B,OAAO,UAAU;CAC7D,MAAM,UAA2B,CAAC;CAClC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK;EACX,mBAAmB,GAAG,8BAA8B,OAAO,YAAY,CAAC;EACxE,kBAAkB,GAAG,kCAAkC,OAAO,YAAY,CAAC;CAC7E,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,YAAY,SAA2B,OAAY,YAAuC;CACjG,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,2BAA2B,OAAO,UAAU;CAC7D,MAAM,UAA6B,CAAC;CACpC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK;EACX,OAAOA,WAAS,UAAU,KAAK,QAC7B,GAAG,6BAA6B,OAAO,YAAY,GAAG,KAAK,GAAG,CAChE;EACA,OAAOA,WAAS,UAAU,KAAK,QAC7B,GAAG,6BAA6B,OAAO,YAAY,GAAG,KAAK,GAAG,CAChE;EACA,UAAU,GAAG,+BAA+B,OAAO,YAAY,CAAC;CAClE,CAAC;CAEH,OAAO;AACT;;AAGA,SAAgB,YACd,SACA,OACA,YACA,QACA,eAAe,IAAI,wBAAwB,GAC7B;CACd,MAAM,EAAE,OAAO;CACf,MAAM,oBAAoB,GAAG,wBAAwB,OAAO,UAAU;CACtE,MAAM,OAAOA,WAAS,UAAU,KAAK,QACnC,GAAG,sBAAsB,OAAO,YAAY,KAAK,GAAG,CACtD;CACA,MAAM,WAAW,GAAG,uBAAuB,OAAO,UAAU;CAC5D,MAAM,SAAS,eAAe,GAAG,wBAAwB,OAAO,UAAU,MAAM;CAChF,MAAM,aAAa,eAAe,SAAS,OAAO,YAAY,KAAK;CACnE,MAAM,oBAAoB,eAAe,SAAS,OAAO,YAAY,IAAI;CACzE,MAAM,UAAU,iBAAiB,SAAS,OAAO,YAAY,QAAQ,YAAY;CAEjF,MAAM,OAAsB;EAC1B,KACE,oBAAoB,IAAI;GAAE,MAAM;GAAgB;EAAkB,IAAI;GAAE,MAAM;GAAO;EAAK;EAC5F;EACA;EACA;EACA,QAAQ,GAAG,wBAAwB,OAAO,UAAU,MAAM,IAAI,cAAc;EAC5E,OAAO;GACL,WAAW,WAAW,kBAAkB;GACxC,WAAW,WAAW,iBAAiB;GACvC,WAAW,WAAW,kBAAkB;GACxC,KAAK;EACP;EACA,eAAe,eAAe,UAAU,KAAK,QAC3C,GAAG,+BAA+B,OAAO,YAAY,KAAK,GAAG,CAC/D;EACA,aAAa,eAAe,UAAU,KAAK,QACzC,GAAG,6BAA6B,OAAO,YAAY,KAAK,GAAG,CAC7D;EACA;EACA;EACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC7B,SAAS,CAAC;CACZ;CACA,MAAM,cAAc,YAAY,UAAU;CAC1C,MAAM,gBAAgB,YAAY,iBAAiB;CAEnD,QAAQ,QAAR;EACE,KAAK,QAAQ;GACX,MAAM,SAAS,GAAG,wBAAwB,OAAO,UAAU;GAC3D,OAAO;IACL,GAAG;IACH;IACA,OAAO;IACP,cAAc;IACd,WAAW,SAAS,IAAI,SAAS;IACjC,YAAY,WAAW,kBAAkB;IACzC,WAAW,WAAW,iBAAiB;IACvC,OAAO,WAAW,aAAa;IAC/B,SAAS,iBAAiB,SAAS,OAAO,UAAU;GACtD;EACF;EACA,KAAK,YAAY;GACf,MAAM,UAAU,kBAAkB,SAAS,OAAO,UAAU;GAC5D,OAAO;IACL,GAAG;IACH;IACA,SAAS,QAAQ,MAAM,MAAM,EAAE,OAAO;IACtC,aAAa,QAAQ,EAAE,EAAE,eAAe;IACxC;GACF;EACF;EACA,KAAK,SAAS;GACZ,MAAM,UAAU,kBAAkB,SAAS,OAAO,UAAU;GAC5D,OAAO;IACL,GAAG;IACH;IACA,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,CAAC,EAAE,eAAe;IAChE,iBAAiB,WAAW,yBAAyB;IACrD,gBAAgB,WAAW,yBAAyB;IACpD;GACF;EACF;EACA,KAAK,YACH,OAAO;GACL,GAAG;GACH;GACA,OAAO;GACP,cAAc;GACd,OAAO,WAAW,aAAa;GAC/B,SAAS,YAAY,SAAS,OAAO,UAAU;GAC/C,SAAS,iBAAiB,SAAS,OAAO,UAAU;EACtD;EAEF,KAAK,WAAW;GACd,MAAM,UAAU,YAAY,SAAS,OAAO,UAAU;GACtD,OAAO;IACL,GAAG;IACH;IACA,gBAAgB,QAAQ,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;IACpE,cAAc,WAAW,qBAAqB;IAC9C;IACA,SAAS,iBAAiB,SAAS,OAAO,UAAU;GACtD;EACF;EACA,KAAK;EACL,KAAK,aACH,OAAO;GAAE,GAAG;GAAM;GAAQ,SAAS,iBAAiB,SAAS,OAAO,UAAU;EAAE;EAElF,SACE,OAAO;GACL,GAAG;GACH,QAAQ;GACR,UACE,WAAW,SAAS,UAAU,WAAW,OAAO,KAAK,GAAG,IAAI,YAAY,UAAU;GACpF,SAAS,iBAAiB,SAAS,OAAO,UAAU;EACtD;CAEJ;AACF;;AAGA,SAAgB,iBAAiB,SAA2B,OAAY,QAA2B;CACjG,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,qBAAqB,KAAK;CAC3C,MAAM,SAAyB,CAAC;CAChC,MAAM,eAAe,IAAI,wBAAwB;CACjD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,OAAO,KAAK,YAAY,SAAS,OAAO,GAAG,QAAQ,YAAY,CAAC;CAElE,MAAM,mBAAqD,CAAC;CAC5D,MAAM,mBAAmB,GAAG,+BAA+B,KAAK;CAChE,KAAK,IAAI,QAAQ,GAAG,QAAQ,kBAAkB,SAAS;EACrD,MAAM,aAAa,GAAG,uCAAuC,OAAO,KAAK;EACzE,iBAAiB,KACf,cAAc,KAAK,aAAa,OAAO,SAAS,OAAO,WAAW,CAAC,MAAM,IAC3E;CACF;CACA,OAAO;EACL,UAAU,kBAAkB,GAAG,qBAAqB,KAAK,MAAM;EAC/D,kBAAkB,GAAG,4BAA4B,KAAK;EACtD;EACA;CACF;AACF;AAEA,SAAS,eACP,SACA,OACA,YACA,WACgB;CAChB,MAAM,EAAE,OAAO;CACf,MAAM,OAAO,YACT,GAAG,kCAAkC,OAAO,UAAU,IACtD,GAAG,2BAA2B,OAAO,UAAU;CACnD,IAAI,SAAS,GAAG,OAAO,EAAE,MAAM,OAAO;CACtC,IAAI,SAAS,GAAG,OAAO,EAAE,MAAM,cAAc;CAC7C,IAAI,SAAS,KAAK,SAAS,GAAG,OAAO,EAAE,MAAM,cAAc;CAC3D,MAAM,QAAQ,YACV,GAAG,iCAAiC,OAAO,UAAU,IACrD,GAAG,0BAA0B,OAAO,UAAU;CAClD,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SACjC,OAAO,KACLA,WAAS,UAAU,KAAK,aACtB,YACI,GAAG,gCAAgC,OAAO,YAAY,OAAO,KAAK,QAAQ,IAC1E,GAAG,yBAAyB,OAAO,YAAY,OAAO,KAAK,QAAQ,CACzE,CACF;CAEF,OAAO,SAAS,IAAI;EAAE,MAAM;EAAU,OAAO,OAAO,MAAM;CAAG,IAAI;EAAE,MAAM;EAAS;CAAO;AAC3F;AAEA,SAAS,YAAY,OAA+B;CAClD,IAAI,MAAM,SAAS,UAAU,OAAO,MAAM;CAC1C,IAAI,MAAM,SAAS,SAAS,OAAO,MAAM,OAAO,MAAM;CACtD,OAAO;AACT;AAEA,SAAS,iBACP,SACA,OACA,YACA,QACA,QAC6B;CAC7B,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,UAAU;EACd,CAAC,aAAa,CAAC;EACf,CAAC,UAAU,CAAC;EACZ,CAAC,YAAY,CAAC;EACd,CAAC,aAAa,CAAC;CACjB;CACA,MAAM,UAA2B,CAAC;CAClC,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS;EAClC,MAAM,SAAS,gBACb,IACA,KACA,QACA,GAAG,6BAA6B,OAAO,YAAY,KAAK,GACxD,MACF;EACA,IAAI,QAAQ,QAAQ,OAAO;CAC7B;CACA,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,UAAU,KAAA;AACrD;;;;;;;;;ACrTA,SAAgB,+BACd,SACA,SACA,mBACQ;CACR,IAAI,qBAAqB,GAAG,OAAO;CACnC,MAAM,QAAQ,iBAAiB,SAAS,OAAO;CAC/C,MAAM,aAAa,QAAQ,GAAG,gCAAgC,OAAO,iBAAiB;CACtF,IAAI,aAAa,GAAG,OAAO;CAC3B,OAAO,QAAQ,GAAG,wBAAwB,OAAO,UAAU;AAC7D;;AAGA,SAAgB,uBACd,SACA,SACA,aACM;CACN,KAAK,MAAM,cAAc,aAAa;EACpC,IAAI,WAAW,YAAY,UAAU;EACrC,IAAI,WAAW,IAAI,SAAS,gBAAgB;EAC5C,MAAM,QAAQ,iBAAiB,SAAS,OAAO;EAC/C,MAAM,aAAa,QAAQ,GAAG,gCAC5B,OACA,WAAW,IAAI,iBACjB;EACA,IAAI,aAAa,GAAG;GAClB,WAAW,oBAAoB;GAC/B,WAAW,cAAc;GACzB;EACF;EACA,WAAW,oBAAoB,QAAQ,GAAG,wBAAwB,OAAO,UAAU;EACnF,WAAW,cACT,eAAe,QAAQ,GAAG,wBAAwB,OAAO,UAAU,MAAM;CAC7E;AACF;;;;;;;;;;;;;;ACxBA,SAAgB,uBACd,IACA,KACA,UACA,kBACA,OACA,UACoB;CACpB,MAAM,eAAe,GAAG,0BAA0B,QAAQ;CAC1D,MAAM,KAAK,gBAAgB,IAAI,KAAK,UAAU,IAAI;CAElD,IAAI,eAAe,GACjB,OAAO;EACL,KAAK;GACH,MAAM;GACN;GACA,mBAAmB;EACrB;EACA,iBAAiB;EACjB,IAAI,MAAM;CACZ;CAGF,IAAI,MAAM,GAAG,SAAS,GACpB,OAAO;EACL,KAAK;GAAE,MAAM;GAAM;GAAkB;EAAG;EACxC,iBAAiB;EACjB;CACF;CAGF,OAAO;EACL,KAAK;GAAE,MAAM;GAAS;GAAkB;GAAO;EAAS;EACxD,iBAAiB;EACjB,IAAI,MAAM;CACZ;AACF;;;;;;;;ACxCA,SAAgB,kBAAkB,MAAmC;CACnE,OAAO,SAAA,IAAoB,UAAU;AACvC;;AAGA,SAAgB,gBAAgB,WAAwC;CACtE,OAAO,cAAc,UAAA,IAAA;AACvB;;;ACfA,MAAM,kBAA0C;CAAE,WAAW;CAAM,WAAW;AAAK;;;;;;;;;;;;;;;;;;AAmBnF,SAAgB,2BACd,IACA,KACA,UACA,kBACwB;CACxB,MAAM,YAAY,GAAG,yBAAyB,UAAU,KAAK;CAC7D,IAAI,CAAC,WAAW,OAAO;CAEvB,IAAI;EACF,MAAM,YAAY,cAAc,IAAI,KAAK,WAAW,gBAAgB;EACpE,IAAI,CAAC,WAAW,OAAO;EACvB,OAAO;GAAE;GAAW,WAAW,kBAAkB,GAAG,uBAAuB,QAAQ,CAAC;EAAE;CACxF,UAAU;EACR,GAAG,oBAAoB,SAAS;CAClC;AACF;AAEA,SAAS,cACP,IACA,KACA,WACA,kBACsB;CACtB,MAAM,eAAe,GAAG,0BAA0B,SAAS;CAC3D,IAAI,eAAe,GACjB,OAAO;EAAE,MAAM;EAAgB;EAAkB,mBAAmB;CAAa;CAEnF,MAAM,KAAK,gBAAgB,IAAI,KAAK,WAAW,IAAI;CACnD,IAAI,MAAM,GAAG,SAAS,GACpB,OAAO;EAAE,MAAM;EAAM;EAAkB;CAAG;CAE5C,OAAO;AACT;;;;;;;;;;;;;AChCA,SAAgB,kBACd,IACA,KACA,UACsB;CACtB,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GAAG,OAAO;CAErD,MAAM,gBAAgB,eAAe,IAAI,KAAK,UAAU,eAAe;CACvE,MAAM,SAAS,eAAe,IAAI,KAAK,UAAU,QAAQ;CACzD,MAAM,UAAU,eAAe,IAAI,KAAK,UAAU,SAAS;CAC3D,MAAM,YAAY,eAAe,IAAI,KAAK,UAAU,WAAW;CAC/D,MAAM,YAAY,eAAe,IAAI,KAAK,UAAU,WAAW;CAE/D,MAAM,MAAqB,CAAC;CAC5B,IAAI,kBAAkB,KAAA,GAAW,IAAI,gBAAgB;CACrD,IAAI,WAAW,KAAA,GAAW,IAAI,SAAS;CACvC,IAAI,YAAY,KAAA,GAAW,IAAI,UAAU;CACzC,IAAI,cAAc,KAAA,GAAW,IAAI,YAAY;CAC7C,IAAI,cAAc,KAAA,GAAW,IAAI,YAAY;CAC7C,OAAO;AACT;AAEA,SAAS,eACP,IACA,KACA,UACA,KACoB;CAKpB,MAAM,MAAM,GAAG,iCAAiC,UAAU,KAAKC,yBAAAA,UAAU,CAAC;CAC1E,IAAI,OAAO,GAAG,OAAO,KAAA;CACrB,IAAI,QAAQ,GAAG,OAAO;CAEtB,MAAM,MAAM,IAAI,MAAM,GAAG;CACzB,IAAI;EAEF,IADgB,GAAG,iCAAiC,UAAU,KAAK,KAAK,GAC9D,KAAK,GAAG,OAAO,KAAA;EACzB,OAAO,IAAI,cAAc,GAAG;CAC9B,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;AAEA,SAAS,eACP,IACA,KACA,UACA,KACoB;CACpB,MAAM,MAAM,IAAI,MAAM,CAAC;CACvB,IAAI;EAEF,IAAI,CADO,GAAG,iCAAiC,UAAU,KAAK,GACxD,GAAG,OAAO,KAAA;EAChB,OAAO,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;CACpC,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;AC5FA,SAAgB,gBAAgB,MAAyB;CACvD,QAAQ,MAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,eACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,cACH,OAAO;CACX;AACF;AAEA,SAAgB,kBAAkB,MAAyB;CACzD,QAAQ,MAAR;EACE,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,KAAK,IACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;;;;;;;ACrDA,SAAgB,mBACd,IACA,KACA,QACA,UACA,kBACA,OACA,UACA,eAAe,IAAI,wBAAwB,GAC3B;CAChB,MAAM,WAAW,uBAAuB,IAAI,KAAK,UAAU,kBAAkB,OAAO,QAAQ;CAC5F,MAAM,OAAO,cAAc,IAAI,KAAK,QAAQ;CAC5C,MAAM,QAAQ,eAAe,IAAI,QAAQ;CACzC,MAAM,WAAW,gBAAgB,IAAI,KAAK,UAAU,UAAU;CAC9D,MAAM,UAAU,gBAAgB,IAAI,KAAK,UAAU,MAAM;CACzD,MAAM,SAAS,gBAAgB,IAAI,KAAK,UAAU,GAAG;CACrD,MAAM,aAAa,gBAAgB,IAAI,KAAK,UAAU,cAAc;CACpE,MAAM,cAAc,gBAAgB,IAAI,KAAK,UAAU,GAAG;CAC1D,MAAM,YAAY,kBAAkB,GAAG,uBAAuB,QAAQ,CAAC;CAIvE,MAAM,OAAO,kBAAkB,IAAI,KAAK,QAAQ;CAChD,MAAM,eAAe,2BAA2B,IAAI,KAAK,UAAU,gBAAgB;CACnF,MAAM,UAAU,sBAAsB,IAAI,KAAK,QAAQ,UAAU,YAAY;CAE7E,OAAO;EACL,KAAK,SAAS;EACd;EACA;EACA,iBAAiB,SAAS;EAC1B,IAAI,SAAS;EACb;EACA;EACA;EACA;EACA;EACA,SAAS,aAAa,aAAa,UAAU,IAAI;EACjD,UAAU,cAAc,aAAa,WAAW,IAAI;EACpD;EACA,WAAW,aAAa;EACxB,WAAW,aAAa;EACxB,GAAI,MAAM,WAAW,KAAA,IAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAC5D,GAAI,MAAM,YAAY,KAAA,IAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;EAC/D,GAAI,MAAM,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;EACrE,GAAI,MAAM,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;EACrE,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;CAC/B;AACF;AAEA,SAAS,sBACP,IACA,KACA,QACA,UACA,QACkC;CAClC,MAAM,SAAS;EACb,CAAC,YAAY,CAAC;EACd,CAAC,eAAe,CAAC;EACjB,CAAC,cAAc,CAAC;EAChB,CAAC,aAAa,CAAC;EACf,CAAC,WAAW,CAAC;EACb,CAAC,SAAS,CAAC;EACX,CAAC,QAAQ,CAAC;EACV,CAAC,YAAY,CAAC;EACd,CAAC,aAAa,CAAC;EACf,CAAC,eAAe,CAAC;EACjB,CAAC,iBAAiB,EAAE;CACtB;CACA,MAAM,UAAgC,CAAC;CACvC,KAAK,MAAM,CAAC,KAAK,UAAU,QAAQ;EACjC,MAAM,SAAS,gBACb,IACA,KACA,QACA,GAAG,yBAAyB,UAAU,KAAK,GAC3C,MACF;EACA,IAAI,QAAQ,QAAQ,OAAO;CAC7B;CACA,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,UAAU,KAAA;AACrD;;;;;;;;;;;;;;AC7EA,SAAgB,uBAAuB,OAQR;CAC7B,MAAM,EAAE,SAAS,SAAS,kBAAkB,OAAO,eAAe,QAAQ,UAAU;CACpF,MAAM,EAAE,IAAI,QAAQ;CAEpB,MAAM,cAA+B,CAAC;CACtC,IAAI,UAAU;CACd,MAAM,WAAW,QAAQ,UAAU,gBAAgB,CAAC,CAAC;CACrD,MAAM,eAAe,IAAI,wBAAwB;CACjD,MAAM,UAAU,eAAe,SAAS,KAAK;CAE7C,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;EAC9B,eAAe,MAAM;EACrB,MAAM,WAAW,cAAc,CAAC;EAChC,IAAI,CAAC,UAAU;EACf,IAAI;GACF,MAAM,OAAO,mBACX,IACA,KACA,QAAQ,QACR,UACA,kBACA,GACA,UACA,YACF;GACA,MAAM,cAAc,GAAG,qBAAqB,QAAQ;GACpD,MAAM,EAAE,WAAW,WAAW,WAAW;GACzC,MAAM,MAAM,OAAO,IAAI,KAAK,UAAU,MAAM,aAAa,OAAO;GAChE,YAAY,KAAK,GAAG;GACpB,IAAI,IAAI,oBAAoB,QAAQ,UAAU;EAChD,UAAU;GACR,GAAG,oBAAoB,QAAQ;EACjC;CACF;CAEA,uBAAuB,SAAS,SAAS,WAAW;CACpD,QAAQ,eAAe,kBAAkB,OAAO;CAChD,OAAO;EAAE,WAAW,QAAQ,UAAU,gBAAgB;EAAG;CAAY;AACvE;;;;;;;;;;;;;ACvDA,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SAEA,OACA;EAJiB,KAAA,UAAA;EACA,KAAA,UAAA;EAEA,KAAA,QAAA;CAChB;CAEH,KAAK,kBAAoC,QAAiD;EACxF,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,MAAM,QAAQ,GAAG,uBAAuB,OAAO;GAC/C,OAAO,uBAAuB;IAC5B,SAAS,KAAK;IACd,SAAS,KAAK;IACd;IACA;IACA,gBAAgB,MAAM,GAAG,kBAAkB,SAAS,CAAC;IACrD;IACA,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;GAC5C,CAAC;EACH,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;AACF;;;;;;;;;;;;AC3BA,MAAM,mBAAmB;;;;;;;;;;AAgBzB,SAAgB,0BACd,MACA,UACA,MACA,MACO;CACP,MAAM,OAAO,KAAK;CAClB,MAAM,SAAS,KAAK;CACpB,MAAM,QAAQ,KAAK,QAAQ,KAAK;CAChC,MAAM,SAAS,KAAK,MAAM,KAAK;CAC/B,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,OAAO;CACnB,MAAM,OAAO,OAAO;CACpB,MAAM,OAAO,OAAO;CAEpB,QAAQ,UAAR;EACE,KAAK,IACH,OAAO;GAAC;GAAG;GAAM,CAAC;GAAM;GAAG,QAAQ,SAAS;GAAS,CAAC,OAAO;EAAI;EACnE,KAAK,KACH,OAAO;GAAC,CAAC;GAAK;GAAG;GAAG,CAAC;GAAK,OAAO,OAAO;GAAQ,OAAO,SAAS;EAAO;EACzE,KAAK,KACH,OAAO;GAAC;GAAG,CAAC;GAAM;GAAM;GAAG,CAAC,OAAO;GAAQ,QAAQ,OAAO;EAAM;EAClE,KAAK,GACH,OAAO;GAAC;GAAK;GAAG;GAAG;GAAK,CAAC,MAAM;GAAM,CAAC,MAAM;EAAM;CACtD;AACF;;;;;AAMA,SAAgB,WACd,MACA,UACA,UACmC;CACnC,MAAM,YAAY,KAAK,QAAQ,KAAK;CACpC,MAAM,aAAa,KAAK,MAAM,KAAK;CACnC,MAAM,OAAO,aAAa,MAAM,aAAa;CAC7C,MAAM,YAAY,OAAO,aAAa;CACtC,MAAM,aAAa,OAAO,YAAY;CAEtC,IAAI,SAAS,SAAS,SAAS;EAC7B,IAAI,CAAC,OAAO,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,GACxD,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wCAAwC;EAE5F,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,KAAK,CAAC;EACpD,OAAO;GAAE;GAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAO,QAAQ,aAAc,SAAS,CAAC;EAAE;CACpF;CAEA,MAAM,QAAQ,SAAS,SAAS;CAChC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GACtC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wCAAwC;CAE5F,OAAO;EACL,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,KAAK,CAAC;EAChD,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,KAAK,CAAC;CACpD;AACF;;;;;;;AAiCA,SAAgB,UAAU,SAA2B,MAA2C;CAC9F,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,EAAE,MAAM,MAAM,UAAU,UAAU,YAAY,SAAS;CAI7D,IAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,OAAO,KAAK,QAAQ,OAAO;CAE/D,MAAM,cAAc,qBAAqB,MAAM,KAAK,MAAM;CAC1D,MAAM,EAAE,OAAO,WAAW,WAAW,aAAa,UAAU,QAAQ;CACpE,IAAI,KAAK,oBAAoB,KAAA,KAAa,QAAQ,SAAS,KAAK,iBAC9D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iBAAiB,MAAM,GAAG,OAAO,eAAe,KAAK,gBAAgB,mEAEvE;CAEF,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,SAAS;CAEvB,IAAI,WAAuB;CAC3B,IAAI,YAAwB;CAC5B,IAAI,YAAwB;CAC5B,IAAI,UAAsB;CAC1B,IAAI;EACF,WAAW,IAAI,MAAM,KAAK;EAC1B,YAAY,GAAG,oBAAoB,OAAO,QAAQ,kBAAkB,UAAU,MAAM;EACpF,IAAI,CAAC,WAAW,OAAO;EAEvB,GAAG,oBACD,WACA,GACA,GACA,OACA,QACA,eAAe,gBAAgB,IAAa,UAC9C;EAEA,YAAY,IAAI,MAAM,EAAK;EAC3B,UAAU,KAAK,WAAW,0BAA0B,aAAa,UAAU,OAAO,MAAM,CAAC;EAEzF,UAAU,IAAI,MAAM,EAAK;EACzB,IAAI,KAAK,SAAS,OAAO,GAAG,CAAC;EAC7B,IAAI,KAAK,SAAS,OAAO,GAAG,CAAC;EAC7B,IAAI,KAAK,SAAS,OAAO,OAAO,CAAC;EACjC,IAAI,KAAK,SAAS,OAAO,QAAQ,EAAE;EAEnC,IAAI,CAAC,KAAK,WAAW,WAAW,OAAO,GAAG,OAAO;EAGjD,OAAO;GACL;GACA;GACA;GACA,OAAO;GACP,oBAAoB;GACpB,MAAM,mBAPO,IAAI,UAAU,UAAU,KAOP,CAAC;EACjC;CACF,UAAU;EACR,IAAI,WAAW,GAAG,mBAAmB,SAAS;EAC9C,IAAI,SAAS,IAAI,KAAK,OAAO;EAC7B,IAAI,WAAW,IAAI,KAAK,SAAS;EACjC,IAAI,UAAU,IAAI,KAAK,QAAQ;CACjC;AACF;AAEA,SAAS,qBAAqB,MAAe,YAA6B;CACxE,OAAO;EACL,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,QAAQ,aAAa,KAAK;EAC1B,KAAK,aAAa,KAAK;CACzB;AACF;AAEA,SAAS,UAAU,KAA8B,KAAU,GAAgB;CACzE,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,IAAI,IAAI,CAAC;AAC9D;AAEA,SAAS,mBAAmB,OAAgC;CAC1D,MAAM,MAAM,IAAI,WAAW,MAAM,UAAU;CAC3C,IAAI,IAAI,KAAK;CACb,OAAO,IAAI;AACb;;;;ACzLA,MAAM,uBAAuB;;AAG7B,MAAM,yBAAyB;;;;;;;;;;;AAY/B,MAAM,sCAA2C,IAAI,IAAI;CAAC;CAAG;CAAG;CAAG;CAAI;AAAE,CAAC;;;;;;;;AAS1E,MAAM,yBAAyB;;;;;;AAO/B,MAAM,mBAID;CACH;EAAE,MAAM;EAAU,SAAS;EAAG,KAAK;CAAE;CACrC;EAAE,MAAM;EAAY,SAAS;EAAG,KAAK;CAAE;CACvC;EAAE,MAAM;EAAQ,SAAS;EAAG,KAAK;CAAE;AACrC;;;;;;;;;;;AAYA,IAAa,6BAAb,MAAwC;CACtC,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OACE,kBACA,SACA,QAC6B;EAC7B,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,MAAM,QAAQ,eAAe,QAAQ,KAAK;EAC1C,MAAM,WAAY,QAAQ,YAAY;EACtC,MAAM,QAAQ,aAAa,QAAQ,KAAK;EACxC,MAAM,WAAW,KAAK,QAAQ,UAAU,gBAAgB,CAAC,CAAC;EAE1D,MAAM,cAA4C,CAAC;EAEnD,IAAI;GACF,MAAM,OAAO;IACX,OAAO,GAAG,mBAAmB,OAAO;IACpC,QAAQ,GAAG,oBAAoB,OAAO;GACxC;GACA,MAAM,QAAQ,GAAG,uBAAuB,OAAO;GAC/C,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;IAC9B,eAAe,MAAM;IACrB,MAAM,WAAW,GAAG,kBAAkB,SAAS,CAAC;IAChD,IAAI,CAAC,UAAU;IAEf,IAAI;KACF,MAAM,YAAY,GAAG,sCAAsC,QAAQ;KAEnE,IAAI,CAAC,WAAW;KAEhB,MAAM,WAAW,uBAAuB,IAAI,KAAK,UAAU,kBAAkB,GAAG,QAAQ;KAaxF,MAAM,cAAc,GAAG,qBAAqB,QAAQ;KACpD,MAAM,YACJ,gBAAgB,0BAChB,uBAAuB,WAAW,IAAI,KAAK,QAAQ,CAAC,MAAM;KAK5D,MAAM,gBAHJ,oBAAoB,IAAI,WAAW,KACnC,CAAC,aACD,uBAAuB,IAAI,KAAK,QAAQ,MAAM,KAAA,IAE5C,4BAA4B,IAAI,KAAK,QAAQ,IAC7C,KAAA;KAGJ,MAAM,QAAA,GAAA,8BAAA,iBAAA,CAAwB,iBAAiB,cAAc,IAAI,KAAK,QAAQ,CAAC;KAE/E,KAAK,MAAM,QAAQ,OAAO;MACxB,IAAI,EAAE,YAAY,KAAK,MAAM;MAC7B,MAAM,SAAS,KAAK,UAClB,SACA,UACA,KAAK,SACL,MACA,MACA,UACA,OACA,kBAAkB,KAAA,GAClB,QAAQ,eACV;MACA,IAAI,CAAC,QAAQ;MACb,YAAY,KAAK;OACf,KAAK,SAAS;OACd,MAAM,KAAK;OACX;OACA;MACF,CAAC;KACH;IACF,UAAU;KACR,GAAG,oBAAoB,QAAQ;IACjC;GACF;GAEA,OAAO;IAAE,WAAW,KAAK,QAAQ,UAAU,gBAAgB;IAAG;GAAY;EAC5E,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;;;;;;CAOA,UACE,SACA,UACA,SACA,MACA,MACA,UACA,OACA,eACA,iBACmB;EACnB,MAAM,EAAE,OAAO,KAAK;EAEpB,IAAI,CAAC,GAAG,8BAA8B,UAAU,OAAO,GAIrD,IADgB,GAAG,qBAAqB,QAC9B,MAAM,wBAAwB,CAAC,GAAG,iBAAiB,UAAU,IAAI,GAAG;GAC5E,GAAG,8BAA8B,QAAQ;GACzC,IAAI,CAAC,GAAG,8BAA8B,UAAU,OAAO,GAAG,OAAO;EACnE,OACE,OAAO;EAcX,MAAM,WAAW,KAAK,IAAI,IAAI,KAAK,QAAQ,KAAK,SAAS,KAAK,MAAM,KAAK,OAAO;EAChF,MAAM,WAAW,KAAK,IAAI,OAAO,KAAK,KAAK,yBAAyB,QAAQ,CAAC;EAM7E,OAAO,UAAU,KAAK,SAAS;GAC7B;GACA;GACA;GACA,UAAU;IAAE,MAAM;IAAS,OAAO;GAAS;GAC3C,GAAI,oBAAoB,KAAA,IAAY,EAAE,gBAAgB,IAAI,CAAC;GAC3D,YAAY;GAIZ,OAAO,WAAW,eACf,gBAAgB,GAAG,kCAAkC,GAAG,uBAAA,CACvD,WACA,SACA,UACA,SACA,WAAA,EAEF;EACJ,CAAC;CACH;AACF;AAEA,SAAS,aACP,WACkD;CAClD,IAAI,CAAC,aAAa,UAAU,WAAW,GACrC,OAAO,iBAAiB,QAAQ,MAAM,EAAE,SAAS,QAAQ;CAE3D,MAAM,SAAS,IAAI,IAAI,SAAS;CAChC,OAAO,iBAAiB,QAAQ,MAAM,OAAO,IAAI,EAAE,IAAI,CAAC;AAC1D;AAEA,SAAS,eAAe,OAAmC;CACzD,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG,OAAO;CAClD,OAAO;AACT;;;;;;;;;;;;;AC5OA,IAAa,sBAAb,MAAiC;CAC/B,YACE,SACA,SAEA,OACA;EAJiB,KAAA,UAAA;EACA,KAAA,UAAA;EAEA,KAAA,QAAA;CAChB;CAEH,QAAQ,QAAqD;EAC3D,eAAe,MAAM;EACrB,KAAK,QAAQ,uBAAuB;EACpC,MAAM,UAAU,KAAK,QAAQ,WAAW;EACxC,MAAM,QAAsC,CAAC;EAC7C,KAAK,MAAM,UAAU,SAAS;GAC5B,eAAe,MAAM;GACrB,MAAM,KAAK,KAAK,QAAQ,OAAO,kBAAkB,MAAM,CAAC;EAC1D;EACA,OAAO,EAAE,MAAM;CACjB;CAEA,QAAQ,kBAAoC,QAAiD;EAC3F,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,SAAS,KAAK,QAAQ,qBAAqB,gBAAgB;EAEjE,MAAM,QAAQ,GAAG,0BAA0B,QAAQ,OAAO,SAAS;EACnE,IAAI,QAAQ,GACV,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,sCAAsC,MAAM,YAAY,kBAC1D;EAGF,OAAO,uBAAuB;GAC5B,SAAS,KAAK;GACd,SAAS,KAAK;GACd;GACA;GACA,gBAAgB,MAAM,GAAG,qBAAqB,QAAQ,OAAO,WAAW,CAAC;GACzE;GACA,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;EAC5C,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;AC9BA,SAAgB,cACd,IACA,UACA,OACA,OAAe,oBAAoB,OAC7B;CAEN,IAAI,CADO,GAAG,mBAAmB,UAAU,MAAM,MAAM,IAAI,KAAM,MAAM,IAAI,KAAM,MAAM,IAAI,GACrF,GACJ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,mCAAmC;AAEtF;;;;;;AAOA,SAAgB,gBAAgB,IAAkB,UAAe,MAAoB;CACnF,GAAG,qBAAqB,UAAU,IAAI;AACxC;;;;;;;AAQA,SAAgB,gBAAgB,IAAkB,UAAe,SAAuB;CACtF,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,UAAU,GAAG,CAAC,CAAC;CAClE,IAAI,CAAC,GAAG,qBAAqB,UAAU,KAAK,GAC1C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;AAExF;;;;;;;;AASA,SAAgB,cACd,IACA,UACA,SACM;CACN,MAAM,OAAO,YAAY,GAAG,mBAAmB,QAAQ,GAAG,OAAO;CACjE,IAAI,CAAC,GAAG,mBAAmB,UAAU,IAAI,GACvC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,mCAAmC;AAEtF;;;;;;;AAQA,SAAgB,aACd,IACA,KACA,UACA,MACM;CACN,MAAM,MAAM,IAAI,MAAA,EAAiB;CACjC,IAAI;EACF,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC;EACjC,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC;EAChC,IAAI,KAAK,KAAK,OAAO,KAAK,OAAO,CAAC;EAClC,IAAI,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE;EACpC,IAAI,CAAC,GAAG,kBAAkB,UAAU,GAAG,GACrC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;CAErF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;AAMA,SAAgB,iBACd,IACA,KACA,UACA,KACA,OACM;CACN,MAAM,MAAM,IAAI,eAAe,KAAK;CACpC,IAAI;EACF,GAAG,yBAAyB,UAAU,KAAK,GAAG;CAChD,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;AAWA,SAAgB,wBACd,IACA,KACA,UACA,KACA,OACM;CACN,IAAI,UAAU,MAAM;EAClB,GAAG,oBAAoB,UAAU,GAAG;EACpC;CACF;CACA,iBAAiB,IAAI,KAAK,UAAU,KAAK,KAAK;AAChD;;;;;;;AAQA,SAAgB,eACd,IACA,UACA,WACA,OACM;CACN,IAAI,CAAC,GAAG,yBAAyB,UAAU,WAAW,KAAK,GACzD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;AAE5F;;;;;AAMA,SAAgB,qBACd,IACA,KACA,UACA,WACM;CACN,MAAM,MAAM,IAAI,MAAM,UAAU,SAAA,CAAkB;CAClD,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KACpC,IAAI,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,UAAU,EAAG,GAAG,IAAA,CAAa;EAEhE,IAAI,CAAC,GAAG,+BAA+B,UAAU,KAAK,UAAU,MAAM,GACpE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+CACF;CAEJ,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;AAGA,SAAgB,gBAAgB,IAAkB,UAAe,WAAyB;CACxF,IAAI,CAAC,GAAG,0BAA0B,UAAU,SAAS,GACnD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,0CAA0C;AAE7F;;;;;AAMA,SAAgB,kBAAkB,IAAkB,UAAqB;CACvE,GAAG,4BAA4B,QAAQ;AACzC;;;;;;;AAQA,SAAgB,wBACd,IACA,UACA,IACM;CACN,IAAI,CAAC,GAAG,kCAAkC,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,GACtF,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kDACF;AAEJ;;;;;AAMA,SAAgB,0BAA0B,IAAkB,UAAqB;CAC/E,GAAG,oCAAoC,QAAQ;AACjD;;;;;;AAOA,SAAgB,YACd,IACA,KACA,UACA,UACM;CACN,MAAM,MAAM,IAAI,MAAM,SAAS,SAAA,CAAqB;CACpD,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GACxC,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK,KAAK,OAAO,SAAS,EAAE,CAAE,GAAG,GAAG;GACxC,IAAI,KAAK,KAAK,OAAO,SAAS,EAAE,CAAE,GAAG,MAAM,CAAC;EAC9C;EACA,IAAI,CAAC,GAAG,sBAAsB,UAAU,KAAK,SAAS,MAAM,GAC1D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;CAEzF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;AAOA,SAAgB,QACd,IACA,KACA,UACA,MACM;CACN,MAAM,QAAQ,IAAI,MAAA,CAAkB;CACpC,MAAM,MAAM,IAAI,MAAA,CAAkB;CAClC,IAAI;EACF,IAAI,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG,CAAC;EACtC,IAAI,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG,CAAC;EACtC,IAAI,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC;EAClC,IAAI,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC;EAClC,IAAI,CAAC,GAAG,kBAAkB,UAAU,OAAO,GAAG,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;CAErF,UAAU;EACR,IAAI,KAAK,KAAK;EACd,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;AAUA,SAAgB,WACd,IACA,KACA,UACA,SACM;CACN,GAAG,wBAAwB,QAAQ;CACnC,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,WAAW,GAAG;EACzB,MAAM,MAAM,IAAI,MAAM,OAAO,SAAA,CAAqB;EAClD,IAAI;GACF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACtC,MAAM,MAAM,IAAA;IACZ,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,GAAG;IACtC,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,MAAM,CAAC;GAC5C;GACA,IAAI,GAAG,uBAAuB,UAAU,KAAK,OAAO,MAAM,IAAI,GAC5D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;EAExF,UAAU;GACR,IAAI,KAAK,GAAG;EACd;CACF;AACF;;;;;;AAOA,SAAgB,eAAe,IAAkB,UAAe,SAA4B;CAC1F,IACE,CAAC,GAAG,yBACF,UACA,iBAAiB,QAAQ,KAAK,GAC9B,iBAAiB,QAAQ,GAAG,CAC9B,GAEA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;AAE5F;;;;;;;;;AAUA,SAAgB,qBACd,IACA,UACA,UACA,UACA,OACM;CACN,IACE,CAAC,GAAG,+BACF,UACA,UACA,UACA,MAAM,IAAI,KACV,MAAM,IAAI,KACV,MAAM,IAAI,GACZ,GAEA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,+CAA+C;AAElG;;;;;;;;AASA,SAAgB,mCACd,IACA,UACA,QACA,UACA,OACM;CACN,IACE,CAAC,GAAG,6CACF,UACA,QACA,UACA,MAAM,IAAI,KACV,MAAM,IAAI,KACV,MAAM,IAAI,GACZ,GAEA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,6DACF;AAEJ;;;;;;AAOA,SAAgB,iBAAiB,IAAkB,UAAe,MAAoB;CACpF,IAAI,CAAC,GAAG,2BAA2B,UAAU,IAAI,GAC/C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,2CAA2C;AAE9F;;;;;;AAOA,SAAgB,UAAU,IAAkB,UAAe,MAAoB;CAC7E,IAAI,CAAC,GAAG,oBAAoB,UAAU,IAAI,GACxC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC;AAEvF;;;;;;;;;;;;AAaA,SAAgB,eACd,IACA,KACA,UACA,MACM;CACN,MAAM,MAAM,IAAI,eAAe,IAAI;CACnC,IAAI;EACF,IAAI,CAAC,GAAG,yBAAyB,UAAU,GAAG,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;CAE5F,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;AAMA,SAAgB,qBAAqB,IAAkB,UAAe,QAAuB;CAC3F,IAAI,CAAC,GAAG,+BAA+B,UAAU,MAAM,GACrD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,+CAA+C;AAElG;AAEA,SAAgB,eACd,IACA,KACA,UACA,QACM;CACN,MAAM,MAAM,IAAI,MAAM,OAAO,SAAA,CAAqB;CAClD,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACtC,MAAM,MAAM,IAAA;GACZ,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,GAAG;GACtC,IAAI,KAAK,KAAK,OAAO,OAAO,EAAE,CAAE,GAAG,MAAM,CAAC;EAC5C;EACA,IAAI,CAAC,GAAG,yBAAyB,UAAU,KAAK,OAAO,MAAM,GAC3D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;CAE5F,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;;;;;;;AC5cA,SAAgB,yBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,aAAa,KAAA,GACrB,wBAAwB,IAAI,KAAK,UAAU,YAAY,MAAM,QAAQ;CAEvE,IAAI,MAAM,YAAY,KAAA,GACpB,wBAAwB,IAAI,KAAK,UAAU,QAAQ,MAAM,OAAO;CAElE,IAAI,MAAM,OAAO,KAAA,KAAa,MAAM,GAAG,SAAS,GAC9C,iBAAiB,IAAI,KAAK,UAAU,MAAM,MAAM,EAAE;CAEpD,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;AAE3C;;;;;;;;;;;;;AAcA,SAAgB,yBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,aAAa,KAAA,GACrB,wBAAwB,IAAI,KAAK,UAAU,YAAY,MAAM,QAAQ;CAEvE,IAAI,MAAM,YAAY,KAAA,GACpB,wBAAwB,IAAI,KAAK,UAAU,QAAQ,MAAM,OAAO;CAElE,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;AAE3C;;;;;;;AAQA,SAAgB,sBACd,IACA,KACA,UACA,aACM;CACN,IAAI,YAAY,WAAW,GAAG;CAC9B,iBAAiB,IAAI,KAAK,UAAU,KAAK,WAAW;AACtD;;;;;;AAOA,SAAgB,kBACd,IACA,KACA,UACA,IACM;CACN,IAAI,GAAG,WAAW,GAAG;CACrB,iBAAiB,IAAI,KAAK,UAAU,MAAM,EAAE;AAC9C;;;;;;;;;;;;;;;AAgBA,SAAgB,wBACd,IACA,KACA,UACA,sBAAY,IAAI,KAAK,GACf;CACN,iBAAiB,IAAI,KAAK,UAAU,KAAK,cAAc,GAAG,CAAC;AAC7D;;;;;;;;;;;;;AC3GA,SAAgB,uBACd,SACA,UACoB;CACpB,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,SAAS,GAAG,0BAA0B,QAAQ;CACpD,IAAI,SAAS,GAAG,OAAO;EAAE,MAAM;EAAgB,OAAO;CAAO;CAC7D,MAAM,KAAK,gBAAgB,IAAI,KAAK,UAAU,IAAI;CAClD,IAAI,OAAO,QAAQ,GAAG,SAAS,GAAG,OAAO;EAAE,MAAM;EAAM,OAAO;CAAG;CACjE,MAAM,SAAS,aAAa;CAC5B,kBAAkB,IAAI,KAAK,UAAU,MAAM;CAC3C,OAAO;EAAE,MAAM;EAAM,OAAO;CAAO;AACrC;;;;;;;;;;;;;;;;ACVA,SAAgB,gBACd,SACA,SACA,SACA,KACK;CACL,MAAM,EAAE,IAAI,QAAQ;CACpB,QAAQ,IAAI,MAAZ;EACE,KAAK,gBAAgB;GACnB,MAAM,WAAW,GAAG,gCAAgC,SAAS,IAAI,iBAAiB;GAClF,IAAI,CAAC,UACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,oCAAoC,IAAI,kBAAkB,WAAW,IAAI,kBAC3E;GAEF,OAAO;EACT;EACA,KAAK,MAAM;GACT,MAAM,UAAU,IAAI,eAAe,IAAI,EAAE;GACzC,IAAI;IACF,MAAM,WAAW,GAAG,wBAAwB,SAAS,OAAO;IAC5D,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,2BAA2B,IAAI,GAAG,YAAY,IAAI,kBACpD;IAEF,OAAO;GACT,UAAU;IACR,IAAI,KAAK,OAAO;GAClB;EACF;EACA,KAAK,SAAS;GACZ,QAAQ,iBAAiB,IAAI,QAAQ;GACrC,MAAM,WAAW,GAAG,kBAAkB,SAAS,IAAI,KAAK;GACxD,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,SAAS,IAAI,MAAM,wBAAwB,IAAI,kBACjD;GAEF,OAAO;EACT;CACF;CACA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;AACrF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkDA,SAAgB,sBAAsB,QAAkD;CACtF,MAAM,EAAE,UAAU,iBAAiB,gBAAgB,YAAY;CAE/D,IAAI,EAAA,GAAA,8BAAA,gCAAA,CAAiC,QAAQ,GAC3C,OAAO;EACL,eAAe,CAAC,cAAc;EAC9B,YAAY;EACZ;EACA,qBAAqB;EACrB,eAAe;CACjB;CAIF,MAAM,uBAAA,GAAA,8BAAA,yBAAA,CACJ,UACA,gBAAgB,mBAClB;CACA,OAAO;EACL,eAAe,CAAC,cAAc;EAC9B,YAAY;EACZ;EACA;EACA,eAAe,sBAAsB,EAAE,QAAQ,sBAAsB,IAAI;CAC3E;AACF;;;;;;;;;;;;;;;ACzHA,SAAgB,sBACd,IACA,KACA,UACA,kBACA,OACA,UACA,KACe;CACf,MAAM,OAAO,mBAAmB,IAAI,KAAK,IAAI,QAAQ,UAAU,kBAAkB,OAAO,QAAQ;CAChG,MAAM,cAAc,GAAG,qBAAqB,QAAQ;CACpD,MAAM,EAAE,WAAW,WAAW,WAAW;CACzC,OAAO,OAAO,IAAI,KAAK,UAAU,MAAM,aAAa,GAAG;AACzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACHA,MAAM,qBAAqB;AAC3B,MAAM,cAAc;AACpB,MAAM,eAAe;AACrB,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;;;;;;;;;;;;AAoBvB,SAAgB,2BACd,IACA,KACA,UACA,OACM;CACN,IAAI,CAAC,SAAU,CAAC,MAAM,UAAU,CAAC,MAAM,SAAU;CAEjD,GAAG,iCAAiC,UAAU,oBAAA,CAAgD;CAE9F,IAAI,MAAM,QAAQ;EAChB,kBAAkB,IAAI,KAAK,UAAU,aAAa,MAAM,MAAM;EAC9D,kBAAkB,IAAI,KAAK,UAAU,gBAAgB,MAAM,MAAM;EACjE,kBAAkB,IAAI,KAAK,UAAU,gBAAgB,MAAM,MAAM;CACnE;CACA,IAAI,MAAM,SACR,kBAAkB,IAAI,KAAK,UAAU,cAAc,MAAM,OAAO;AAEpE;;;;;;;;;;;;;;;;;AAkBA,SAAgB,2BACd,IACA,KACA,UACA,OACM;CACN,IAAI,CAAC,SAAU,CAAC,MAAM,UAAU,CAAC,MAAM,SAAU;CAEjD,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GACzC,GAAG,iCAAiC,UAAU,oBAAA,CAAgD;CAEhG,IAAI,MAAM,QACR,kBAAkB,IAAI,KAAK,UAAU,gBAAgB,MAAM,MAAM;CAEnE,IAAI,MAAM,SACR,kBAAkB,IAAI,KAAK,UAAU,cAAc,MAAM,OAAO;AAEpE;AAEA,SAAS,kBACP,IACA,KACA,UACA,KACA,OACM;CAIN,MAAM,MAAM,IAAI,eAAe,KAAK;CACpC,IAAI;EACF,GAAG,iCAAiC,UAAU,KAAK,GAAG;CACxD,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA,MAAM,eAAe;AACrB,MAAM,qBAAqB;;;AAa3B,SAAS,oBAAoB,IAAkB,UAAqB;CAClE,IAAI,CAAC,GAAG,2BAA2B,QAAQ,GACzC,GAAG,iCAAiC,UAAU,iBAAA,CAA6C;AAE/F;AAEA,SAAS,YAAY,IAAkB,UAAe,UAAwB;CAC5E,oBAAoB,IAAI,QAAQ;CAChC,GAAG,iCAAiC,UAAU,cAAc,QAAQ;AACtE;AAEA,SAAS,iBACP,IACA,KACA,UACA,MACM;CACN,oBAAoB,IAAI,QAAQ;CAChC,MAAM,MAAM,IAAI,MAAA,EAAiB;CACjC,IAAI;EAEF,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC;EACjC,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC;EAChC,IAAI,KAAK,KAAK,OAAO,KAAK,OAAO,CAAC;EAClC,IAAI,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE;EACpC,GAAG,+BAA+B,UAAU,oBAAoB,GAAG;CACrE,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;AASA,SAAgB,0BACd,IACA,KACA,UACA,GACM;CACN,IAAI,EAAE,aAAa,KAAA,GACjB,IAAI,EAAE,aAAa,QAAQ,EAAE,aAAa,GAAG;EAI3C,IAAI,EAFF,EAAE,iBAAiB,QAClB,EAAE,kBAAkB,KAAA,KAAa,4BAA4B,IAAI,KAAK,QAAQ,KAAK,OAEpF,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iHACF;EAEF,YAAY,IAAI,UAAU,EAAE,QAAQ;CACtC,OACE,GAAG,gCAAgC,UAAU,YAAY;CAG7D,IAAI,EAAE,kBAAkB,KAAA,GACtB,IAAI,EAAE,kBAAkB,MAAM,iBAAiB,IAAI,KAAK,UAAU,EAAE,aAAa;MAC5E,GAAG,gCAAgC,UAAU,kBAAkB;AAExE;;;;;;;;AASA,SAAgB,6BACd,IACA,UACA,GACM;CACN,IAAI,EAAE,aAAa,KAAA,GAAW;CAC9B,IAAI,EAAE,aAAa,QAAQ,EAAE,aAAa,GAAG,YAAY,IAAI,UAAU,EAAE,QAAQ;MAC5E,GAAG,gCAAgC,UAAU,YAAY;CAC9D,GAAG,gCAAgC,UAAU,kBAAkB;AACjE;;;;AC1HA,MAAM,sBAA6B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;AAGxD,MAAMC,oBAAkB;;;;;;;;;AAUxB,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE1C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CACD,cAAc,IAAI,UAAU,MAAM,SAAS,mBAAmB;CAC9D,gBAAgB,IAAI,UAAU,MAAM,WAAWA,iBAAe;CAC9D,IAAI,MAAM,WAAW,KAAA,GAAW,UAAU,IAAI,UAAU,kBAAkB,MAAM,MAAM,CAAC;CACvF,IAAI,MAAM,mBAAmB,MAC3B,wBAAwB,IAAI,UAAU,MAAM,eAAe;AAE/D;;;;;AAMA,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,aAAa,KAAA,KAAa,MAAM,kBAAkB,KAAA,GAC1D,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CAEH,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,WAAW,KAAA,GACnB,UAAU,IAAI,UAAU,kBAAkB,MAAM,MAAM,CAAC;CAEzD,IAAI,MAAM,oBAAoB,MAC5B,0BAA0B,IAAI,QAAQ;MACjC,IAAI,MAAM,oBAAoB,KAAA,GACnC,wBAAwB,IAAI,UAAU,MAAM,eAAe;AAE/D;;;;;AAMA,SAAgB,eAAe,SAAqC;CAClE,OAAO,YAAY;AACrB;;;;AC3EA,MAAM,gCAAuC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAEpE,MAAMC,oBAAkB;;;;;;AAOxB,SAAgB,6BACd,OACA,KACM;CACN,oBAAoB,MAAM,MAAM,GAAG;CACnC,IAAI,KAAK,WAAW,KAAA,GAClB,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,6DACF;AAEJ;;;;;;;;;;;;;;AAeA,SAAgB,yBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,cAAc,IAAI,UAAU,MAAM,SAAS,6BAA6B;CACxE,gBAAgB,IAAI,UAAU,MAAM,WAAWF,iBAAe;CAC9D,sBAAsB,IAAI,UAAU,MAAM,QAAQ,WAAW;CAC7D,WAAW,IAAI,KAAK,UAAU,MAAM,MAAM,oBAAoB,MAAM,MAAM,GAAG,GAAG,IAAK,MAAO;AAC9F;;AAGA,SAAgB,yBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,SAAS,KAAA,GACjB,sBAAsB,IAAI,UAAU,MAAM,IAAI;AAElD;AAEA,SAAgB,wBAAwB,SAA+C;CACrF,OAAO,YAAY;AACrB;AAEA,SAAS,sBACP,IACA,UACA,MACM;CACN,IAAI,CAAC,GAAG,kBAAkB,UAAU,kBAAkB,KAAK,GACzD,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;AAErF;AAEA,SAAS,oBACP,MACA,KACc;CACd,MAAM,WAAW,KAAK,YAAY,KAAK;CACvC,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wCAAwC,KAAK,SAAS,sDACxD;CAEF,OAAO;AACT;AAEA,SAAS,WACP,IACA,KACA,UACA,MACA,UACA,QACM;CACN,MAAM,UAAU,IAAI,eAAe,KAAK,IAAI;CAC5C,IAAI;CACJ,IAAI;EACF,gBAAgB,GAAG,4BAA4B,UAAU,OAAO;CAClE,UAAU;EACR,IAAI,KAAK,OAAO;CAClB;CACA,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,2CAA2C;CAG5F,2BAA2B,IAAI,KAAK,eAAe,QAAQ,MAAM,QAAQ;AAC3E;;;;;;;;;;;;;AChHA,SAAgB,uBACd,IACA,UACA,YACA,UACA,OACA,KACM;CACN,IAAI,eAAe,UAAU,GAAG;EAC9B,qBAAqB,IAAI,UAAU,mBAAmB,UAAU,GAAG,UAAU,KAAK;EAClF;CACF;CACA,IAAI,CAAC,KAAK,yBACR,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,eAAe,WAAW,wEAC5B;CAEF,mCACE,IACA,UACA,IAAI,wBAAwB,UAAU,GACtC,UACA,KACF;AACF;ACnBA,MAAa,gBAAuB;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;;;;;;;;AAUzD,SAAgB,wBACd,IACA,KACA,UACA,OACM;CACN,cAAc,IAAI,UAAU,MAAM,SAAS,aAAa;CACxD,gBAAgB,IAAI,UAAU,MAAM,WAAA,CAA0B;CAC9D,iBAAiB,IAAI,KAAK,UAAU,KAAK;AAC3C;;;;;;;AAQA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,eACE,IACA,UACA,kBAAkB,MAAM,eAAe,OAAO,GAC9C,MAAM,eAAA,CACR;CACA,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,UAAU,SAAS,GAC5D,qBAAqB,IAAI,KAAK,UAAU,MAAM,SAAS;AAE3D;;;;;;;AAQA,SAAgB,wBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,iBAAiB,IAAI,KAAK,UAAU,KAAK;AAC3C;;;;;;;;AASA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,gBAAgB,KAAA,KAAa,MAAM,gBAAgB,KAAA,GAAW;EACtE,MAAM,UAAU,gBAAgB,IAAI,KAAK,QAAQ;EACjD,MAAM,QAAQ,MAAM,eAAe,oBAAoB,QAAQ,SAAS;EACxE,MAAM,QAAQ,MAAM,eAAe,QAAQ;EAC3C,eAAe,IAAI,UAAU,kBAAkB,KAAK,GAAG,KAAK;CAC9D;CACA,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,UAAU,SAAS,GAC5D,qBAAqB,IAAI,KAAK,UAAU,MAAM,SAAS;AAE3D;;;;;;AAOA,SAAgB,sBACd,IACA,KACA,UACA,OACM;CACN,MAAM,WAAW,MAAM,iBAAiB;CACxC,IAAI,aAAa,MACf,gBAAgB,IAAI,UAAU,oBAAoB,aAAa;MAE/D,cAAc,IAAI,UAAU,UAAU,oBAAoB,aAAa;CAEzE,wBAAwB,IAAI,KAAK,UAAU,KAAK;AAClD;;;;;AAMA,SAAgB,sBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,kBAAkB,KAAA,GAC1B,IAAI,MAAM,kBAAkB,MAC1B,gBAAgB,IAAI,UAAU,oBAAoB,aAAa;MAE/D,cAAc,IAAI,UAAU,MAAM,eAAe,oBAAoB,aAAa;CAGtF,wBAAwB,IAAI,KAAK,UAAU,KAAK;AAClD;;;;;;;;ACtHA,MAAM,yBAAgC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;;;AAOzD,SAAS,cACP,IACA,UACA,OACA,KACM;CACN,MAAM,OAAO,mBAAmB,OAAO,KAAK,sBAAsB;CAClE,IAAI,CAAC,GAAG,0BAA0B,UAAU,IAAI,GAC9C,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oFACF;AAEJ;;AAGA,SAAS,SAAS,OAAsB;CACtC,MAAM,OAAO,MACX,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CACtC,SAAS,EAAE,CAAC,CACZ,SAAS,GAAG,GAAG;CACpB,OAAO,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,YAAY;AACtE;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,mBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE1C,MAAM,aAAa,MAAM,iBAAiB;CAC1C,IAAI,eAAe,MACjB,gBAAgB,IAAI,UAAU,oBAAoB,KAAK;MAEvD,cAAc,IAAI,UAAU,YAAY,oBAAoB,KAAK;CAEnE,gBAAgB,IAAI,UAAU,MAAM,WAAA,CAA0B;CAE9D,iBAAiB,IAAI,KAAK,UAAU,KAAK;CAEzC,MAAM,UAAU,MAAM,SAAS;CAC/B,uBAAuB,IAAI,UAAU,MAAM,YAAY,MAAM,UAAU,SAAS,GAAG;CACnF,IAAI,MAAM,cAAc,KAAA,GACtB,cAAc,IAAI,UAAU,MAAM,WAAW,oBAAoB,SAAS;CAG5E,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;CACnE,UAAU,IAAI,UAAU,qBAAqB,MAAM,MAAM,CAAC;CAE1D,IAAI,MAAM,mBAAmB,MAC3B,wBAAwB,IAAI,UAAU,MAAM,eAAe;CAG7D,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,KAAK,UAAU,MAAM,WAAW;CAErD,IAAI,MAAM,eAAe,KAAA,GACvB,eAAe,IAAI,UAAU;EAAE,OAAO;EAAQ,KAAK,MAAM;CAAW,CAAC;CAMvE,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CAQD,cACE,IACA,UACA,MAAM,YAAY,EAAE,aAAA,GAAA,8BAAA,gCAAA,CAA4C,MAAM,YAAY,EAAE,EAAE,GACtF,GACF;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,mBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAK5C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CAED,IAAI,MAAM,kBAAkB,KAAA,GAC1B,IAAI,MAAM,kBAAkB,MAC1B,gBAAgB,IAAI,UAAU,oBAAoB,KAAK;MAEvD,cAAc,IAAI,UAAU,MAAM,eAAe,oBAAoB,KAAK;CAG9E,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAG7C,iBAAiB,IAAI,KAAK,UAAU,KAAK;CAOzC,MAAM,UAAU,mBAAmB,IAAI,KAAK,QAAQ;CACpD,IAAI,MAAM,UAAU,KAAA,GAAW;EAC7B,MAAM,MAAM,sBAAsB,IAAI,KAAK,QAAQ;EACnD,uBACE,IACA,UACA,MAAM,qBAAqB,IAAI,QAAQ,IAAI,uBAC3C,OAAO,IAAI,WAAW,IAAI,IAAI,WAAW,IACzC,MAAM,OACN,GACF;CACF;CACA,IAAI,MAAM,cAAc,KAAA,GACtB,cAAc,IAAI,UAAU,MAAM,WAAW,oBAAoB,SAAS;CAG1E,IAAI,MAAM,aAAa,KAAA,GAGrB,cAAc,IAAI,UAAU,MAAM,UAAU,GAAG;MAC1C,IAAI,MAAM,aAAa,KAAA,GAI5B,cACE,IACA,UACA,EAAE,aAAA,GAAA,8BAAA,gCAAA,CAA4C,MAAM,YAAY,EAAE,EAAE,GACpE,GACF;MACK,IACL,YACC,MAAM,eAAe,KAAA,KACpB,MAAM,aAAa,KAAA,KACnB,MAAM,cAAc,KAAA,KACpB,MAAM,cAAc,KAAA,IACtB;EAKA,MAAM,OAAO,EAAE,GAAG,QAAQ,KAAK;EAC/B,IAAI,MAAM,eAAe,KAAA,GAAW;GAClC,MAAM,OAAO,oBAAoB,MAAM,YAAY,KAAK,sBAAsB;GAC9E,KAAK,SAAS,KAAK;GACnB,IAAI,KAAK,WAAW,KAAA,GAAW,KAAK,SAAS,KAAK;GAClD,IAAI,KAAK,WAAW,KAAA,GAAW,KAAK,SAAS,KAAK;EACpD;EACA,IAAI,MAAM,aAAa,KAAA,GAAW,KAAK,OAAO,MAAM;EACpD,IAAI,MAAM,cAAc,KAAA,GAAW,KAAK,QAAQ,SAAS,MAAM,SAAS;EACxE,IAAI,MAAM,cAAc,KAAA,GAAW,KAAK,QAAQ,MAAM;EACtD,cAAc,IAAI,UAAU;GAAE;GAAM,YAAY,QAAQ;EAAW,GAAG,GAAG;CAC3E;CAGF,IAAI,MAAM,cAAc,KAAA,GACtB,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;CAErE,IAAI,MAAM,WAAW,KAAA,GACnB,UAAU,IAAI,UAAU,qBAAqB,MAAM,MAAM,CAAC;CAG5D,IAAI,MAAM,oBAAoB,MAC5B,0BAA0B,IAAI,QAAQ;MACjC,IAAI,MAAM,oBAAoB,KAAA,GACnC,wBAAwB,IAAI,UAAU,MAAM,eAAe;CAG7D,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,KAAK,UAAU,MAAM,WAAW;CAErD,IAAI,MAAM,eAAe,KAAA,GACvB,eAAe,IAAI,UAAU;EAAE,OAAO;EAAQ,KAAK,MAAM;CAAW,CAAC;AAEzE;;;;;AAMA,SAAgB,kBAAkB,SAAyC;CACzE,OAAO,YAAY;AACrB;;;;;;;;;;;;AC5QA,SAAgB,cACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,WAAW,KAAA,GAAW,UAAU,IAAI,UAAU,gBAAgB,MAAM,MAAM,CAAC;CACrF,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,wBAAwB,IAAI,KAAK,UAAU,KAAK;CAChD,WAAW,IAAI,KAAK,UAAU,MAAM,OAAO;CAE3C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,cACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,WAAW,KAAA,GAAW,UAAU,IAAI,UAAU,gBAAgB,MAAM,MAAM,CAAC;CACrF,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,wBAAwB,IAAI,KAAK,UAAU,KAAK;CAChD,IAAI,MAAM,YAAY,KAAA,GACpB,WAAW,IAAI,KAAK,UAAU,MAAM,OAAO;CAG7C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;;;;;AAMA,SAAgB,aAAa,SAAmC;CAC9D,OAAO,YAAY;AACrB;;;;ACjDA,MAAMC,yBAAuB;CAAE,OAAO;CAAQ,KAAK;AAAO;;;;;;;;;AAU1D,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,QAAQ,IAAI,KAAK,UAAU,MAAM,UAAU;CAC3C,eAAe,IAAI,UAAU,MAAM,eAAeA,sBAAoB;CAEtE,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,IAAI,MAAM,eAAe,KAAA,GACvB,QAAQ,IAAI,KAAK,UAAU,MAAM,UAAU;CAG7C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;CACvE,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,UAAU,MAAM,WAAW;AAElD;;;;;AAMA,SAAgB,cAAc,SAAoC;CAChE,OAAO,YAAY;AACrB;;;;;;;;;;;;;ACjCA,SAAgB,eACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAG1C,IAAI,MAAM,QAAQ,gBAAgB,IAAI,KAAK,UAAU,MAAM,QAAQ,GAAG;AACxE;AAEA,SAAgB,eACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GAAW,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CACxE,IAAI,MAAM,WAAW,MAAM,gBAAgB,IAAI,QAAQ;MAClD,IAAI,MAAM,WAAW,KAAA,GAAW,gBAAgB,IAAI,KAAK,UAAU,MAAM,QAAQ,GAAG;AAC3F;;;;;;;AAQA,SAAS,gBAAgB,IAAkB,UAAqB;CAC9D,IAAI,CAAC,GAAG,uBAAuB,QAAQ,KAAK,CAAC,GAAG,qBAAqB,QAAQ,GAC3E,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,6BAA6B;AAEhF;AAEA,SAAgB,cAAc,SAAoC;CAChE,OAAO,YAAY;AACrB;AAEA,SAAS,gBACP,IACA,KACA,UACA,QACA,KACM;CACN,MAAM,SAAS,KAAK;CACpB,IAAI,CAAC,QACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wEACF;CAGF,MAAM,YACJ,OAAO,SAAS,QACZ,GAAG,qBAAqB,QAAQ,OAAO,GAAG,IAC1C,GAAG,sBAAsB,QAAQ,kBAAkB,IAAI,KAAK,QAAQ,OAAO,WAAW,CAAC;CAC7F,IAAI,CAAC,WACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qBAAqB,OAAO,KAAK,SAAS;CAE3F,IAAI,CAAC,GAAG,oBAAoB,UAAU,SAAS,GAC7C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;AAExF;;;;;;AAOA,SAAS,kBACP,IACA,KACA,QACA,MACK;CACL,MAAM,UAAU,GAAG,+BAA+B,QAAQ,KAAK,gBAAgB;CAC/E,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,qDAAqD,KAAK,kBAC5D;CAEF,IAAI;EACF,MAAM,UACJ,KAAK,SAAS,QAEV,GAAG,mBACD,SACA,KAAK,QAAQ,MACb,KAAK,QAAQ,GACb,KAAK,OAAO,MACZ,KAAK,OAAO,GACZ,KAAK,QAAQ,MACb,KAAK,QAAQ,CACf,IACA,sBAAsB,IAAI,KAAK,SAAS,IAAI;EAClD,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qBAAqB,KAAK,KAAK,cAAc;EAE9F,OAAO;CACT,UAAU;EACR,GAAG,eAAe,OAAO;CAC3B;AACF;AAEA,SAAS,sBACP,IACA,KACA,SACA,MACK;CAIL,MAAM,gBAA0B;EAC9B,QAAQ,KAAK,MAAb;GACE,KAAK;GACL,KAAK,SACH,OAAO,KAAK,OAAO,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;GAC1C,KAAK;GACL,KAAK,SACH,OAAO,KAAK,QAAQ,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;GAC5C,KAAK,QACH,OAAO;IAAC,KAAK;IAAM,KAAK;IAAQ,KAAK;IAAO,KAAK;GAAG;GACtD,SACE,OAAO,CAAC;EACZ;CACF,EAAA,CAAG;CAEH,MAAM,OAAO,kBAAkB,KAAK;CACpC,IAAI,CAAC,OAAO,QAAQ,OAAO,GAAG,oBAAoB,SAAS,MAAMC,yBAAAA,UAAU,CAAC;CAC5E,OAAO,YAAY,KAAK,OAAO,SAAA,IAAqB,QAAQ;EAC1D,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,IAAI,KAAK,KAAK,OAAO,OAAO,IAAK,IAAA,CAAa;EACtF,OAAO,GAAG,oBAAoB,SAAS,MAAM,KAAK,OAAO,MAAM;CACjE,CAAC;AACH;;;;;;;;AC3IA,MAAMC,oBAAkB;;;;;AAMxB,MAAM,0BAAiC;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAC9D,MAAM,4BAAmC;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;;;;;;;;;;;;AAgB5D,SAAgB,qBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,MAAM,aAAa,MAAM;CACzB,IAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GACtD,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sBAAsB,MAAM,QAAQ,kCACtC;CAEF,iBAAiB,IAAI,KAAK,UAAU,UAAU;CAC9C,sBAAsB,IAAI,KAAK,UAAU,UAAU;CAEnD,MAAM,WACJ,MAAM,YAAY,cAAc,0BAA0B;CAC5D,cAAc,IAAI,UAAU,MAAM,SAAS,QAAQ;CACnD,gBAAgB,IAAI,UAAU,MAAM,WAAWF,iBAAe;CAC9D,IAAI,MAAM,YAAY,eAAe,MAAM,WAAW,KAAA,GACpD,UAAU,IAAI,UAAU,sBAAsB,MAAM,MAAM,CAAC;AAE/D;;;;;;;;;;;;;;AAeA,SAAgB,qBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,YAAY,eAAe,MAAM,WAAW,KAAA,GACpD,UAAU,IAAI,UAAU,sBAAsB,MAAM,MAAM,CAAC;CAE7D,IAAI,MAAM,eAAe,KAAA,GAAW;EAClC,IAAI,MAAM,WAAW,WAAW,GAC9B,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+DACF;EAEF,kBAAkB,IAAI,KAAK,UAAU,MAAM,UAAU;EACrD,sBAAsB,IAAI,KAAK,UAAU,MAAM,UAAU;CAC3D;AACF;;;;;;AAOA,SAAgB,oBACd,SACiE;CACjE,OACE,YAAY,eACZ,YAAY,eACZ,YAAY,cACZ,YAAY;AAEhB;AAEA,SAAgB,iBACd,IACA,KACA,UACA,YACM;CACN,MAAM,MAAM,IAAI,MAAM,EAAE;CACxB,IAAI;EACF,KAAK,MAAM,MAAM,YAAY;GAC3B,qBAAqB,KAAK,KAAK,EAAE;GAEjC,IAAI,CADO,GAAG,iCAAiC,UAAU,GACnD,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,iDACF;EAEJ;CACF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;;;;;;AAWA,SAAgB,kBACd,IACA,KACA,UACA,YACM;CACN,MAAM,WAAW,GAAG,gCAAgC,QAAQ;CAC5D,IAAI,WAAW,SAAS,UACtB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oDAAoD,SAAS,mBAAmB,WAAW,OAAO,EACpG;CAGF,MAAM,MAAM,IAAI,MAAM,EAAE;CACxB,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;GACjC,qBAAqB,KAAK,KAAK,WAAW,EAAG;GAE7C,IAAI,CADO,GAAG,8BAA8B,UAAU,GAAG,GACnD,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,iDAAiD,GACnD;EAEJ;EACA,KAAK,IAAI,IAAI,UAAU,IAAI,WAAW,QAAQ,KAAK;GACjD,qBAAqB,KAAK,KAAK,WAAW,EAAG;GAE7C,IAAI,CADO,GAAG,iCAAiC,UAAU,GACnD,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,oDAAoD,GACtD;EAEJ;CACF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;AAEA,SAAS,qBAAqB,KAAuB,KAAU,IAAmB;CAGhF,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;CAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;CAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,CAAC;CAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;CAChC,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,GAAG,EAAE;AAClC;AAEA,SAAgB,sBACd,IACA,KACA,UACA,YACM;CACN,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,KAAK,MAAM,MAAM,YACf,KAAK,MAAM,KAAK;EAAC,GAAG;EAAI,GAAG;EAAI,GAAG;EAAI,GAAG;CAAE,GAAG;EAC5C,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;EACzB,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;EACzB,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;EACzB,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;CAC3B;CAIF,aAAa,IAAI,KAAK,UAAU;EAAE,MAAM;EAAM,KAAK;EAAM,OAAO;EAAM,QAAQ;CAAK,CAAC;AACtF;;;;;AC1NA,MAAM,uBAA8B;CAAE,GAAG;CAAK,GAAG;CAAG,GAAG;AAAE;;;;AAKzD,MAAM,sBAA6B;CAAE,GAAG;CAAG,GAAG;CAAG,GAAG;AAAE;AAEtD,MAAM,oBAAoB;;;;;;;AAQ1B,SAAS,kBAAkB,GAKf;CACV,OACG,EAAE,gBAAgB,KAAA,KAAa,EAAE,gBAAgB,QAClD,EAAE,eAAe,KAAA,KACjB,EAAE,aAAa,KAAA,KACf,EAAE,cAAc,KAAA;AAEpB;;;;;;;;;;;;;;;;;AAkBA,SAAgB,iBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,IAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAChD,iBAAiB,IAAI,KAAK,UAAU,MAAM,UAAU;CAGtD,cAAc,IAAI,UAAU,MAAM,SAAS,sBAAsB,oBAAoB,KAAK;CAC1F,gBAAgB,IAAI,UAAU,MAAM,WAAA,CAA0B;CAC9D,MAAM,OAAO,MAAM,iBAAiB;CACpC,IAAI,SAAS,MACX,cAAc,IAAI,UAAU,MAAM,oBAAoB,aAAa;CAGrE,IAAI,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,SAAS,GAChE,eAAe,IAAI,KAAK,UAAU,MAAM,WAAW;CAErD,IAAI,MAAM,QACR,qBAAqB,IAAI,UAAU,IAAI;CAEzC,IAAI,kBAAkB,KAAK,GACzB,uBACE,IACA,UACA,MAAM,cAAA,aACN,MAAM,YAAY,mBAClB,MAAM,aAAa,qBACnB,GACF;CAEF,IAAI,MAAM,cAAc,KAAA,GACtB,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;AAEvE;;;;;;;;;AAUA,SAAgB,iBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,eAAe,KAAA,GAAW;EAClC,kBAAkB,IAAI,KAAK,UAAU,MAAM,UAAU;EACrD,IAAI,MAAM,SAAS,KAAA,GACjB,sBAAsB,IAAI,KAAK,UAAU,MAAM,UAAU;CAE7D;CAEA,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,OAAO,oBAAoB,KAAK;CAEpE,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,kBAAkB,KAAA,GAC1B,IAAI,MAAM,kBAAkB,MAC1B,gBAAgB,IAAI,UAAU,oBAAoB,aAAa;MAE/D,cAAc,IAAI,UAAU,MAAM,eAAe,oBAAoB,aAAa;CAItF,IAAI,MAAM,gBAAgB,KAAA,GAGxB,eAAe,IAAI,KAAK,UAAU,MAAM,eAAe,EAAE;CAE3D,IAAI,MAAM,WAAW,KAAA,GACnB,qBAAqB,IAAI,UAAU,MAAM,MAAM;CAEjD,IAAI,kBAAkB,KAAK,GACzB,uBACE,IACA,UACA,MAAM,cAAA,aACN,MAAM,YAAY,mBAClB,MAAM,aAAa,qBACnB,GACF;CAEF,IAAI,MAAM,cAAc,KAAA,GACtB,iBAAiB,IAAI,UAAU,oBAAoB,MAAM,SAAS,CAAC;AAEvE;;;;;AAMA,SAAgB,gBAAgB,SAAsC;CACpE,OAAO,YAAY;AACrB;;;;;;;;;;;;ACxJA,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAE9C,IAAI,MAAM,mBAAmB,QAAQ,MAAM,kBAAkB,GAC3D,gBAAgB,IAAI,UAAU,MAAM,eAAe;CAErD,IAAI,MAAM,mBAAmB,MAC3B,wBAAwB,IAAI,UAAU,MAAM,eAAe;CAI7D,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;AACH;;;;;;AAOA,SAAgB,gBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CAEjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAK5C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CACD,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAE9C,IAAI,MAAM,oBAAoB,KAAA,GAC5B,IAAI,MAAM,oBAAoB,QAAQ,MAAM,kBAAkB,GAC5D,gBAAgB,IAAI,UAAU,MAAM,eAAe;MAKnD,kBAAkB,IAAI,QAAQ;CAGlC,IAAI,MAAM,oBAAoB,MAC5B,0BAA0B,IAAI,QAAQ;MACjC,IAAI,MAAM,oBAAoB,KAAA,GACnC,wBAAwB,IAAI,UAAU,MAAM,eAAe;AAE/D;;;;;AAMA,SAAgB,eAAe,SAAiD;CAC9E,OAAO,YAAY,YAAY,YAAY;AAC7C;;;;AClFA,MAAM,oBAA8C;CAClD,SAAS;CACT,OAAO;CACP,MAAM;AACR;;;;;;AAOA,SAAgB,oBAAoB,OAAuB,KAAoC;CAC7F,IAAI,MAAM,SAAS,KAAA,GAAW,iBAAiB,MAAM,IAAI;CACzD,gBAAgB,MAAM,OAAO,SAAS;CACtC,oBAAoB,MAAM,QAAQ,GAAG;AACvC;AAEA,SAAgB,oBAAoB,OAAuB,KAAoC;CAC7F,IAAI,MAAM,SAAS,KAAA,KAAa,MAAM,SAAS,MAAM,iBAAiB,MAAM,IAAI;CAChF,gBAAgB,MAAM,OAAO,SAAS;CACtC,IAAI,MAAM,WAAW,KAAA,GAAW,oBAAoB,MAAM,QAAQ,GAAG;AACvE;;;;;;;;;;;;AAaA,SAAgB,gBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,UAAU,MAAM,IAAI;CAEvC,sBACE,IACA,KACA,UACA,MAAM,QACN,MAAM,OAAO,WACb;EACE,MAAM,MAAM;EAGZ,eAAe,MAAM,iBAAiB,KAAA;EACtC,UAAU,MAAM,YAAY,KAAA;CAC9B,GACA,GACF;AACF;AAEA,SAAgB,gBACd,IACA,KACA,UACA,OACA,KACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,MAGjB,GAAG,oBAAoB,UAAU,MAAM;MAClC,IAAI,MAAM,SAAS,KAAA,GACxB,aAAa,IAAI,UAAU,MAAM,IAAI;CAEvC,IAAI,MAAM,WAAW,KAAA,GAAW;EAI9B,MAAM,OAAO,MAAM,QAAQ,cAAc,IAAI,KAAK,QAAQ;EAC1D,sBACE,IACA,KACA,UACA,MAAM,QACN,MAAM,OAAO,WACb;GACE;GACA,eAAe,MAAM,iBAAiB,KAAA;GACtC,UAAU,MAAM,YAAY,KAAA;EAC9B,GACA,GACF;EACA;CACF;CAEA,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAM5C,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,MAAM;EAChB,eAAe,MAAM;CACvB,CAAC;CACD,IACE,MAAM,SAAS,KAAA,KACf,MAAM,QAAQ,KAAA,KACd,MAAM,aAAa,KAAA,KACnB,MAAM,kBAAkB,KAAA,GAGxB,gBAAgB,IAAI,UAAU,MAAM,OAAO,SAAS;AAExD;AAEA,SAAgB,eAAe,SAAqC;CAClE,OAAO,YAAY;AACrB;;;;AAKA,SAAS,aAAa,IAAkB,UAAe,MAAoB;CACzE,IAAI,CAAC,GAAG,kBAAkB,UAAU,IAAI,GACtC,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;AAErF;AAEA,SAAS,iBAAiB,MAAoB;CAC5C,IAAI,KAAK,WAAW,GAClB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,8BAA8B;AAEpF;AAEA,SAAS,gBAAgB,KAAqB;CAC5C,IAAI,kBAAkB,SAAS,KAAA,GAC7B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sBAAsB,OAAO,GAAG,EAAE,oCACpC;AAEJ;AAEA,SAAS,qBACP,KACA,KACc;CACd,MAAM,WAAW,KAAK,YAAY,IAAI;CACtC,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,qCAAqC,IAAI,SAAS,sDACpD;CAEF,OAAO;AACT;AAEA,SAAS,oBAAoB,KAAkB,KAA+C;CAC5F,MAAM,WAAW,qBAAqB,KAAK,GAAG;CAC9C,IAAI,EAAE,SAAS,iBAAiB,gBAAgB,EAAA,GAAA,8BAAA,oBAAA,CAAqB,SAAS,KAAK,GACjF,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0DACF;CAEF,IAAI,KAAK,WAAW,KAAA,KAAa,IAAI,YAAY,KAAA,GAC/C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,2DACF;AAEJ;;;;;;;;;;;;;;;;;;;;AA+BA,SAAS,sBACP,IACA,KACA,UACA,QACA,KACA,KACA,KACM;CAEN,IAAI,EADY,CAAC,CAAC,IAAI,YAAY,IAAI,kBAAkB,KAAA,IAC1C;EACZ,aAAa,IAAI,KAAK,UAAU,IAAI,IAAI;EACxC,gBAAgB,IAAI,KAAK,UAAU,QAAQ,KAAK,IAAI,MAAM,GAAG;EAC7D;CACF;CACA,MAAM,YAAY,IAAI;CAGtB,0BAA0B,IAAI,KAAK,UAAU,CAAC,CAAC;CAC/C,aAAa,IAAI,KAAK,UAAU,SAAS;CACzC,gBAAgB,IAAI,KAAK,UAAU,QAAQ,KAAK,WAAW,GAAG;CAG9D,0BAA0B,IAAI,KAAK,UAAU;EAC3C,UAAU,IAAI;EACd,eAAe;CACjB,CAAC;CACD,aAAa,IAAI,KAAK,UAAU,IAAI,IAAI;CACxC,gBAAgB,IAAI,UAAU,GAAG;AACnC;AAEA,SAAS,gBACP,IACA,KACA,UACA,KACA,KACA,MACA,KACM;CACN,MAAM,WAAW,KAAK,YAAY,IAAI;CACtC,MAAM,OAAO,YAAA,GAAA,8BAAA,oBAAA,CAA+B,SAAS,KAAK,IAAI;CAC9D,IAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,WAAW,KAAA,KAAa,IAAI,YAAY,KAAA,GACrE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,0CAA0C;CAI3F,KAAK,IAAI,IAAI,GAAG,yBAAyB,QAAQ,IAAI,GAAG,KAAK,GAAG,KAC9D,GAAG,uBAAuB,UAAU,CAAC;CAGvC,IAAI,KAAK,aAAa,mBACpB,0BAA0B,IAAI,KAAK,UAAU,SAAS,KAAK;MAE3D,kBAAkB,IAAI,KAAK,UAAU,IAAI,QAAQ,IAAI,SAAS,SAAS,OAAO,MAAM,MAAM,GAAG;CAK/F,gBAAgB,IAAI,UAAU,GAAG;AACnC;AAEA,SAAS,gBAAgB,IAAkB,UAAe,KAAqB;CAC7E,IAAI,CAAC,GAAG,iCAAiC,UAAU,kBAAkB,IAAI,GACvE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,iDACF;AAEJ;;;;;;;;;;;;AAaA,SAAS,kBACP,IACA,KACA,UACA,QACA,SACA,OACA,MACA,MACA,KACM;CACN,MAAM,cAAc,GAAG,wBAAwB,MAAM;CACrD,IAAI,CAAC,aACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;CAGxF,IAAI,WAAW;CACf,IAAI;EACF,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;EAC1C,IAAI;GACF,IAAI,WAAW,SAAS,IAAI,WAAW,KAAK,CAAC;GAK7C,IAAI,EAHF,KAAK,aAAa,cACd,GAAG,oBAAoB,SAAS,GAAG,aAAa,SAAS,MAAM,UAAU,IACzE,GAAG,qBAAqB,SAAS,GAAG,aAAa,SAAS,MAAM,UAAU,IAE9E,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,GAAG,KAAK,aAAa,cAAc,wBAAwB,uBAAuB,yBACpF;EAEJ,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;EAEA,MAAM,YAAY,YAAY,KAAK,OAAO,KAAK,QAAQ,MAAM,GAAG;EAChE,eAAe,IAAI,KAAK,aAAa,UAAU,OAAO,UAAU,MAAM;EACtE,GAAG,sBAAsB,aAAa,GAAG,GAAG,GAAG,GAAG,UAAU,MAAM,UAAU,MAAM;EAElF,IAAI,CAAC,GAAG,uBAAuB,UAAU,WAAW,GAClD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,uCAAuC;EAExF,WAAW;CACb,UAAU;EAER,IAAI,CAAC,UACH,GAAG,oBAAoB,WAAW;CAEtC;AACF;;AAGA,SAAS,YACP,GACA,GACA,MACA,KACiE;CACjE,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,KAAK,IAAI;CAC/C,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM;CAC/C,IAAI,QAAQ,UAAU,KAAK,KAAK,KAAK,GACnC,OAAO;EAAE,MAAM,KAAK;EAAM,QAAQ,KAAK;EAAQ,OAAO;EAAM,QAAQ;CAAK;CAE3E,MAAM,QAAQ,QAAQ,YAAY,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC;CAC5F,MAAM,QAAQ,IAAI;CAClB,MAAM,SAAS,IAAI;CACnB,OAAO;EACL,MAAM,KAAK,QAAQ,OAAO,SAAS;EACnC,QAAQ,KAAK,UAAU,OAAO,UAAU;EACxC;EACA;CACF;AACF;;AAGA,SAAS,eACP,IACA,KACA,aACA,OACA,QACM;CACN,MAAM,MAAM,IAAI,MAAM,EAAa;CACnC,IAAI;EACF,IAAI,KAAK,KAAK,OAAO,OAAO,CAAC;EAC7B,IAAI,KAAK,KAAK,OAAO,GAAG,CAAC;EACzB,IAAI,KAAK,KAAK,OAAO,GAAG,CAAC;EACzB,IAAI,KAAK,KAAK,OAAO,QAAQ,EAAE;EAC/B,IAAI,KAAK,KAAK,OAAO,GAAG,EAAE;EAC1B,IAAI,KAAK,KAAK,OAAO,GAAG,EAAE;EAC1B,IAAI,CAAC,GAAG,sBAAsB,aAAa,GAAG,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;CAEzF,UAAU;EACR,IAAI,KAAK,GAAG;CACd;AACF;;;;;AAMA,SAAS,0BACP,IACA,KACA,UACA,OACM;CACN,MAAM,UAAU,IAAI,MAAM,MAAM,UAAU;CAC1C,IAAI;EACF,IAAI,WAAW,SAAS,IAAI,WAAW,KAAK,CAAC;EAC7C,MAAM,aAAa,GAAG,qBAAqB,SAAS,MAAM,YAAY,EAAE;EACxE,IAAI,CAAC,YACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,sCAAsC;EAE5F,IAAI;GACF,IAAI,CAAC,GAAG,gCAAgC,UAAU,YAAY,CAAC,GAC7D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,gDACF;EAEJ,UAAU;GACR,GAAG,mBAAmB,UAAU;EAClC;CACF,UAAU;EACR,IAAI,KAAK,OAAO;CAClB;AACF;;;;ACvaA,MAAM,qBAA4B;CAAE,GAAG;CAAK,GAAG;CAAK,GAAG;AAAE;AAEzD,MAAM,kBAAkB;;;;;;;;AASxB,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,UAAU,KAAA,KAAa,MAAM,eAAe,KAAA,GACpD,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,6DACF;CAEF,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,cAAc,IAAI,UAAU,MAAM,SAAS,kBAAkB;CAC7D,gBAAgB,IAAI,UAAU,MAAM,WAAW,eAAe;CAC9D,YAAY,IAAI,UAAU,MAAM,QAAQ,MAAM;CAC9C,IAAI,MAAM,eAAe,KAAA,GACvB,iBAAiB,IAAI,KAAK,UAAU,cAAc,gBAAgB,MAAM,UAAU,CAAC;CAErF,IAAI,MAAM,UAAU,KAAA,GAClB,iBAAiB,IAAI,KAAK,UAAU,SAAS,WAAW,MAAM,KAAK,CAAC;AAExE;AAEA,SAAgB,eACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,IAAI,MAAM,UAAU,KAAA,GAClB,cAAc,IAAI,UAAU,MAAM,KAAK;CAEzC,IAAI,MAAM,YAAY,KAAA,GACpB,gBAAgB,IAAI,UAAU,MAAM,OAAO;CAE7C,IAAI,MAAM,SAAS,KAAA,GACjB,YAAY,IAAI,UAAU,MAAM,IAAI;CAItC,IAAI,MAAM,eAAe,KAAA,GACvB,wBACE,IACA,KACA,UACA,cACA,MAAM,eAAe,OAAO,OAAO,gBAAgB,MAAM,UAAU,CACrE;CAEF,IAAI,MAAM,UAAU,KAAA,GAClB,wBACE,IACA,KACA,UACA,SACA,MAAM,UAAU,OAAO,OAAO,WAAW,MAAM,KAAK,CACtD;AAEJ;AAEA,SAAgB,cAAc,SAAoC;CAChE,OAAO,YAAY;AACrB;AAEA,SAAS,YAAY,IAAkB,UAAe,MAA4C;CAChG,IAAI,CAAC,GAAG,kBAAkB,UAAU,kBAAkB,KAAK,GACzD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,kCAAkC;AAErF;;;;AC9EA,MAAM,uBAAuB;CAAE,OAAO;CAAQ,KAAK;AAAO;;;;;;;;;;;;;AAc1D,SAAgB,kBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAE7C,IAAI,MAAM,mBAAmB,QAAQ,MAAM,kBAAkB,GAC3D,gBAAgB,IAAI,UAAU,MAAM,eAAe;CAGrD,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,kBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,IAAI,MAAM,aAAa,KAAA,GACrB,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAG/C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;CACvE,IAAI,MAAM,oBAAoB,KAAA,GAC5B,IAAI,MAAM,oBAAoB,QAAQ,MAAM,kBAAkB,GAC5D,gBAAgB,IAAI,UAAU,MAAM,eAAe;MAKnD,kBAAkB,IAAI,QAAQ;AAGpC;;;;;;;;;AAUA,SAAgB,mBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAC7C,eAAe,IAAI,UAAU,MAAM,eAAe,oBAAoB;CAEtE,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE;AAEA,SAAgB,mBACd,IACA,KACA,UACA,OACM;CACN,yBAAyB,IAAI,KAAK,UAAU,KAAK;CACjD,IAAI,MAAM,SAAS,KAAA,GACjB,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,sBAAsB,IAAI,KAAK,UAAU,KAAK;CAC9C,IAAI,MAAM,aAAa,KAAA,GACrB,YAAY,IAAI,KAAK,UAAU,MAAM,QAAQ;CAG/C,6BAA6B,IAAI,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;CACvE,IAAI,MAAM,gBAAgB,KAAA,GACxB,eAAe,IAAI,UAAU,MAAM,WAAW;AAElD;;;;;AAMA,SAAgB,gBAAgB,SAAoD;CAClF,OAAO,YAAY,aAAa,YAAY;AAC9C;;;ACxHA,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAE5B,SAAgB,gBAAgB,SAAiD;CAC/E,OAAO,YAAY;AACrB;;;;;;;AAQA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,UAAU,MAClB,GAAG,uBAAuB,UAAU,eAAe;MAC9C,IAAI,MAAM,OACf,GAAG,qBAAqB,UAAU,iBAAiB,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;CAEhG,IAAI,MAAM,kBAAkB,MAC1B,GAAG,uBAAuB,UAAU,mBAAmB;MAClD,IAAI,MAAM,eACf,GAAG,qBACD,UACA,qBACA,MAAM,cAAc,GACpB,MAAM,cAAc,GACpB,MAAM,cAAc,CACtB;CAGF,IAAI,MAAM,gBAAgB,KAAA,KAAa,MAAM,gBAAgB,KAAA,GAC3D,GAAG,yBACD,UACA,kBAAkB,MAAM,eAAe,OAAO,GAC9C,MAAM,eAAe,CACvB;CAGF,IACE,MAAM,eAAe,KAAA,KACrB,MAAM,aAAa,KAAA,KACnB,MAAM,cAAc,KAAA,GACpB;EACA,MAAM,QAAQ,MAAM,aAAa;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;EAAE;EACpD,GAAG,+BACD,UACA,mBAAmB,MAAM,cAAc,WAAW,GAClD,MAAM,YAAY,IAClB,MAAM,GACN,MAAM,GACN,MAAM,CACR;CACF;CAEA,IAAI,MAAM,cAAc,KAAA,GACtB,GAAG,2BAA2B,UAAU,oBAAoB,MAAM,SAAS,CAAC;AAEhF;;AAGA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAC1C,iBAAiB,IAAI,KAAK,UAAU,KAAK;AAC3C;;;;;;AAOA,SAAgB,iBACd,IACA,KACA,UACA,OACM;CACN,IAAI,MAAM,MACR,aAAa,IAAI,KAAK,UAAU,MAAM,IAAI;CAE5C,iBAAiB,IAAI,KAAK,UAAU,KAAK;CACzC,GAAG,8BAA8B,QAAQ;AAC3C;;;;ACtBA,SAAgB,eAAe,OAA4B,KAAoC;CAC7F,IAAI,eAAe,MAAM,OAAO,GAC9B,oBAAoB,OAAyB,GAAG;CAElD,IAAI,wBAAwB,MAAM,OAAO,GACvC,6BAA6B,OAAkC,GAAG;AAEtE;;AAGA,SAAgB,eAAe,OAA4B,KAAoC;CAC7F,IAAI,eAAe,MAAM,OAAO,GAC9B,oBAAoB,OAAyB,GAAG;AAEpD;;;;;;;;;;AAWA,SAAgB,WACd,IACA,KACA,UACA,OACA,KACM;CACN,IAAI,oBAAoB,MAAM,OAAO,GAAG;EACtC,qBAAqB,IAAI,KAAK,UAAU,KAAwB;EAChE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,IAAI,MAAM,YAAY,WACpB,kBAAkB,IAAI,KAAK,UAAU,KAAqB;OAE1D,mBAAmB,IAAI,KAAK,UAAU,KAAsB;EAE9D;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,OAAoB,GAAG;EACzD;CACF;CACA,IAAI,aAAa,MAAM,OAAO,GAAG;EAC/B,cAAc,IAAI,KAAK,UAAU,KAAiB;EAClD;CACF;CACA,IAAI,kBAAkB,MAAM,OAAO,GAAG;EACpC,mBAAmB,IAAI,KAAK,UAAU,OAAwB,GAAG;EACjE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,OAAyB,GAAG;EAC/D;CACF;CACA,IAAI,wBAAwB,MAAM,OAAO,GAAG;EAC1C,yBAAyB,IAAI,KAAK,UAAU,OAAkC,GAAG;EACjF;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,KAAoB;EACxD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,OAAsB,GAAG;EAC7D;CACF;CAMA,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,2CAA4C,MAA8B,QAAQ,EACpF;AACF;AAEA,SAAgB,WACd,IACA,KACA,UACA,OACA,KACM;CACN,IAAI,oBAAoB,MAAM,OAAO,GAAG;EACtC,qBAAqB,IAAI,KAAK,UAAU,KAAwB;EAChE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,IAAI,MAAM,YAAY,WACpB,kBAAkB,IAAI,KAAK,UAAU,KAAqB;OAE1D,mBAAmB,IAAI,KAAK,UAAU,KAAsB;EAE9D;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,OAAoB,GAAG;EACzD;CACF;CACA,IAAI,aAAa,MAAM,OAAO,GAAG;EAC/B,cAAc,IAAI,KAAK,UAAU,KAAiB;EAClD;CACF;CACA,IAAI,kBAAkB,MAAM,OAAO,GAAG;EACpC,mBAAmB,IAAI,KAAK,UAAU,OAAwB,GAAG;EACjE;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,KAAmB;EACtD;CACF;CACA,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,eAAe,IAAI,KAAK,UAAU,KAAkB;EACpD;CACF;CACA,IAAI,eAAe,MAAM,OAAO,GAAG;EACjC,gBAAgB,IAAI,KAAK,UAAU,OAAyB,GAAG;EAC/D;CACF;CACA,IAAI,wBAAwB,MAAM,OAAO,GAAG;EAC1C,yBAAyB,IAAI,KAAK,UAAU,KAA4B;EACxE;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,KAAoB;EACxD;CACF;CACA,IAAI,gBAAgB,MAAM,OAAO,GAAG;EAClC,iBAAiB,IAAI,KAAK,UAAU,OAAsB,GAAG;EAC7D;CACF;CACA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,2CAA4C,MAA8B,QAAQ,EACpF;AACF;;;;;;;;;;;;;;;;;;;;;;ACzMA,SAAgB,4BACd,SACA,SACA,SACA,UACA,kBACA,KAC2B;CAC3B,MAAM,EAAE,OAAO;CAGf,IAAI,IAAI,cAAc,MAAM;EAC1B,GAAG,yBAAyB,UAAU,OAAOC,yBAAAA,QAAQ;EACrD,GAAG,uBAAuB,UAAA,CAAoB;EAC9C,OAAO;CACT;CAGA,IAAI,IAAI,WAAW;EACjB,IAAI,IAAI,UAAU,qBAAqB,kBACrC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,kEAAkE,IAAI,UAAU,iBAAiB,eAAe,iBAAiB,EACnI;EAEF,MAAM,YAAY,gBAAgB,SAAS,SAAS,SAAS,IAAI,SAAS;EAC1E,IAAI;GAGF,MAAM,iBAAiB,uBAAuB,SAAS,SAAS;GAChE,IAAI,CAAC,GAAG,yBAAyB,UAAU,OAAO,SAAS,GACzD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;GAEvF,GAAG,uBAAuB,UAAU,gBAAgB,IAAI,aAAa,OAAO,CAAC;GAC7E,OAAO;EACT,UAAU;GACR,GAAG,oBAAoB,SAAS;EAClC;CACF;CAKA,IAAI,IAAI,cAAc,KAAA,GAAW;EAC/B,MAAM,YAAY,GAAG,yBAAyB,UAAU,KAAK;EAC7D,IAAI,WACF,IAAI;GACF,GAAG,uBAAuB,UAAU,gBAAgB,IAAI,SAAS,CAAC;EACpE,UAAU;GACR,GAAG,oBAAoB,SAAS;EAClC;CAEJ;CACA,OAAO;AACT;;;;AC7CA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B/B,IAAa,oBAAb,MAA+B;CAC7B,YACE,SACA,SAOA,OACA;EATiB,KAAA,UAAA;EACA,KAAA,UAAA;EAOA,KAAA,QAAA;CAChB;;;CAIH,aAAqB,SAAc,WAAqD;EACtF,MAAM,QAAQ,KAAK;EACnB,OAAO;GACL,GAAI,QACA;IACE,0BAA0B,QAAgB,MAAM,MAAM,GAAG;IACzD,yBAAyB,QAAgB,MAAM,oBAAoB,GAAG;GACxE,IACA,CAAC;GACL,QAAQ,KAAK,QAAQ,cAAc;GACnC;GACA,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACnC;CACF;CAEA,OACE,kBACA,OACA,QACA,OACA,WACwB;EACxB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,cAAcC,8BAAAA,oBAAoB,MAAM;EAE9C,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI;GACF,KAAK,6BAA6B,kBAAkB,OAAO;GAC3D,MAAM,WAAW,KAAK,aAAa,SAAS,SAAS;GACrD,eAAe,OAAO,QAAQ;GAC9B,wBAAwB,KAAK;GAQ7B,MAAM,kBAAkB,KAAK,QAAQ,UAAU,gBAAgB;GAC/D,eAAe,MAAM;GAErB,MAAM,WAAW,GAAG,qBAAqB,SAAS,WAAW;GAC7D,IAAI,CAAC,UACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mDAAmD,MAAM,QAAQ,EACnE;GAGF,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI,iBAA4C;GAChD,IAAI;IACF,WAAW,IAAI,KAAK,UAAU,OAAO,QAAQ;IAK7C,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,cAAc,KAAA,GACvD,iBAAiB,4BACf,KAAK,SACL,KAAK,SACL,SACA,UACA,kBACA;KAAE,WAAW,MAAM;KAAW,WAAW,MAAM;IAAU,CAC3D;IAOF,IAAI,OAAO,aACT,sBAAsB,IAAI,KAAK,UAAU,MAAM,WAAW;IAE5D,wBAAwB,IAAI,KAAK,QAAQ;IACzC,2BAA2B,IAAI,KAAK,UAAU,KAAK;IAInD,KAAK,qBAAqB,UAAU,SAAS,MAAM,SAAS;IAE5D,YAAY,GAAG,0BAA0B,QAAQ;IACjD,IAAI,aAAa,GAEf,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+FACF;IAEF,WAAW,GAAG,uBAAuB,SAAS,QAAQ;IACtD,IAAI,WAAW,GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,SAAS,gCAC9C;IAGF,MAAM,sBACJ,IACA,KACA,UACA,kBACA,UACA,gBAAgB,UAChB,eAAe,KAAK,SAAS,KAAK,KAAK,CACzC;IACA,uBAAuB,KAAK,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC;GAC1D,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;GAEA,MAAM,YAAgC;IAAE,MAAM;IAAgB,OAAO;GAAU;GAI/E,IAAI,gBAAgB,KAAK,wBAAwB,kBAAkB,OAAO;GAE1E,MAAM,OAAmC,sBAAsB;IAC7D,UAAU;IACV;IACA,gBAJqB,KAAK,QAAQ,UAAU,gBAI/B;IACb,SAAS,iBAAiB,CAAC,WAAW,cAAc,IAAI,CAAC,SAAS;GACpE,CAAC;GAED,OAAO;IAAE,SAAS;IAAK;GAAK;EAC9B,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;CAEA,OACE,KACA,OACA,QACA,OACA,WACwB;EACxB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,IAAI,gBAAgB;EACjD,IAAI,WAAuB;EAC3B,IAAI;GACF,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GACnE,eAAe,MAAM;GAErB,MAAM,WAAW,KAAK,aAAa,SAAS,SAAS;GACrD,eAAe,OAAO,QAAQ;GAC9B,wBAAwB,KAAK;GAE7B,KAAK,6BAA6B,IAAI,kBAAkB,OAAO;GAC/D,MAAM,kBAAkB,KAAK,QAAQ,UAAU,IAAI,gBAAgB;GAInE,eAAe,MAAM;GAMrB,MAAM,WAAW,KAAK,uBAAuB,QAAQ;GAKrD,MAAM,oBAAoB,kBAAkB,GAAG,uBAAuB,QAAQ,CAAC;GAK/E,MAAM,WAAW,GAAG,uBAAuB,SAAS,QAAQ;GAC5D,IAAI,WAAW,GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,SAAS,eAC9C;GAEF,MAAM,aAAa,sBACjB,IACA,KACA,UACA,IAAI,kBACJ,UACA,gBAAgB,UAChB,eAAe,KAAK,SAAS,KAAK,KAAK,CACzC;GAGA,WAAW,IAAI,KAAK,UAAU,OAAO,QAAQ;GAI7C,IAAI,iBAA4C;GAChD,IAAI,MAAM,cAAc,KAAA,KAAa,MAAM,cAAc,KAAA,GACvD,iBAAiB,4BACf,KAAK,SACL,KAAK,SACL,SACA,UACA,IAAI,kBACJ;IAAE,WAAW,MAAM;IAAW,WAAW,MAAM;GAAU,CAC3D;GAMF,wBAAwB,IAAI,KAAK,QAAQ;GACzC,2BAA2B,IAAI,KAAK,UAAU,KAAK;GAanD,MAAM,UAAA,GAAA,8BAAA,mBAAA,CAA4B,YAAY,KAAK;GACnD,IAAI;GACJ,IACE,WAAW,WACV,WAAW,iBACV,GAAG,8BAA8B,UAAU,sBAAsB,GAEnE,aAAa;IAAE,QAAQ;IAAa,SAAS;GAAM;QAOnD,aALW,KAAK,qBACd,UACA,SACA,MAAM,aAAa,iBAEP,IACV;IAAE,QAAQ;IAAe,SAAS;GAAK,IAKvC;IAAE,QAAQ;IAA0B,SAAS,WAAW;GAAa;GAO3E,GAAG,oBAAoB,QAAQ;GAC/B,WAAW;GACX,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GAInE,MAAM,WAAW,GAAG,uBAAuB,SAAS,QAAQ;GAC5D,IAAI,WAAW,GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,SAAS,cAC9C;GAEF,MAAM,MAAM,sBACV,IACA,KACA,UACA,IAAI,kBACJ,UACA,gBAAgB,UAChB,eAAe,KAAK,SAAS,KAAK,KAAK,CACzC;GACA,uBAAuB,KAAK,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC;GAExD,KAAK,wBAAwB,IAAI,kBAAkB,OAAO;GAE1D,MAAM,OAAO,sBAAsB;IACjC,UAAU;IACV;IACA,gBAJqB,KAAK,QAAQ,UAAU,IAAI,gBAInC;IACb,SAAS,iBAAiB,CAAC,UAAU,cAAc,IAAI,CAAC,QAAQ;GAClE,CAAC;GACD,OAAO;IAAE,SAAS;IAAK;IAAY;GAAK;EAC1C,UAAU;GACR,IAAI,aAAa,MAAM,GAAG,oBAAoB,QAAQ;GACtD,KAAK,QAAQ,IAAI,gBAAgB;EACnC;CACF;;;;;;CAOA,wBAAgC,UAAqB;EACnD,MAAM,EAAE,OAAO,KAAK;EACpB,IAAI,GAAG,qBAAqB,QAAQ,MAAMC,8BAAAA,yBAAyB,QAAQ;EAC3E,MAAM,oBAAoB,GAAG,0BAA0B,QAAQ;EAC/D,IAAI,+BAA+B,KAAK,SAAS,KAAK,SAAS,iBAAiB,MAAM,GACpF;EAEF,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0FACF;CACF;CAEA,OAAO,KAAoB,QAA6C;EACtE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,IAAI,gBAAgB;EACjD,IAAI,gBAAgB;EACpB,IAAI;GACF,KAAK,6BAA6B,IAAI,kBAAkB,OAAO;GAC/D,MAAM,kBAAkB,KAAK,QAAQ,UAAU,IAAI,gBAAgB;GACnE,eAAe,MAAM;GAErB,IAAI;GACJ,IAAI,KAAK;GACT,QAAQ,IAAI,MAAZ;IACE,KAAK,gBAAgB;KAKnB,MAAM,QAAQ,GAAG,gCAAgC,SAAS,IAAI,iBAAiB;KAC/E,IAAI,CAAC,OACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,oCAAoC,IAAI,kBAAkB,WAAW,IAAI,kBAC3E;KAEF,IAAI;MACF,KAAK,wBAAwB,KAAK;KACpC,UAAU;MACR,GAAG,oBAAoB,KAAK;KAC9B;KACA,gBAAgB;KAChB,KAAK,GAAG,mCAAmC,SAAS,IAAI,iBAAiB;KACzE,UAAU;MAAE,MAAM;MAAgB,OAAO,IAAI;KAAkB;KAC/D;IACF;IACA,KAAK,MAAM;KACT,MAAM,UAAU,IAAI,eAAe,IAAI,EAAE;KACzC,IAAI;MACF,MAAM,QAAQ,GAAG,wBAAwB,SAAS,OAAO;MACzD,IAAI,CAAC,OACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,2BAA2B,IAAI,GAAG,YAAY,IAAI,kBACpD;MAEF,IAAI;OACF,KAAK,wBAAwB,KAAK;MACpC,UAAU;OACR,GAAG,oBAAoB,KAAK;MAC9B;MACA,gBAAgB;MAChB,KAAK,GAAG,2BAA2B,SAAS,OAAO;KACrD,UAAU;MACR,IAAI,KAAK,OAAO;KAClB;KACA,UAAU;MAAE,MAAM;MAAM,OAAO,IAAI;KAAG;KACtC;IACF;IACA,KAAK,SAAS;KACZ,KAAK,QAAQ,iBAAiB,IAAI,QAAQ;KAC1C,MAAM,WAAW,GAAG,kBAAkB,SAAS,IAAI,KAAK;KACxD,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,SAAS,IAAI,MAAM,wBAAwB,IAAI,kBACjD;KAEF,IAAI;KACJ,IAAI;KACJ,IAAI;MACF,eAAe,GAAG,0BAA0B,QAAQ;MACpD,WAAW,gBAAgB,IAAI,KAAK,UAAU,IAAI;KACpD,UAAU;MACR,GAAG,oBAAoB,QAAQ;KACjC;KACA,UACE,eAAe,IACX;MAAE,MAAM;MAAgB,OAAO;KAAa,IAC5C,aAAa,QAAQ,SAAS,SAAS,IACrC;MAAE,MAAM;MAAM,OAAO;KAAS,IAC9B;KACR,gBAAgB;KAIhB,KAAK,GAAG,qBAAqB,SAAS,IAAI,KAAK;KAC/C;IACF;GACF;GACA,IAAI,CAAC,IACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,gCAAgC,IAAI,MAAM;GAO3F,KAAK,QAAQ,aAAa,IAAI,gBAAgB;GAC9C,gBAAgB;GAChB,KAAK,wBAAwB,IAAI,kBAAkB,OAAO;GAG1D,MAAM,OAAO,sBAAsB;IACjC,UAAU;IACV;IACA,gBALqB,KAAK,QAAQ,UAAU,IAAI,gBAKnC;IACb,SAAS,UAAU,CAAC,OAAO,IAAI,CAAC;GAClC,CAAC;GACD,OAAO;IAAE;IAAS;GAAK;EACzB,UAAU;GACR,IAAI,eAAe,KAAK,QAAQ,aAAa,IAAI,gBAAgB;GACjE,KAAK,QAAQ,IAAI,gBAAgB;EACnC;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCA,KACE,kBACA,MACA,SACA,QACsB;EACtB,eAAe,MAAM;EACrB,IAAI,KAAK,WAAW,GAClB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,gCAAgC;EAEpF,IAAI,UAAU,KAAK,CAAC,OAAO,UAAU,OAAO,GAC1C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oDAAoD,QAAQ,EAC9D;EAEF,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,qBAAqB,kBACzB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,kCAAkC,iBAAiB,oBAAoB,EAAE,kBAC3E;EAIJ,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI,gBAAgB;EAEpB,IAAI;GACF,KAAK,6BAA6B,kBAAkB,OAAO;GAC3D,MAAM,kBAAkB,KAAK,QAAQ,UAAU,gBAAgB;GAC/D,eAAe,MAAM;GAOrB,MAAM,cAAwB,IAAI,MAAM,KAAK,MAAM;GACnD,MAAM,YAAkC,IAAI,MAAM,KAAK,MAAM;GAC7D,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,eAAe,MAAM;IACrB,MAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,KAAK,EAAE;IAC7E,IAAI;KACF,MAAM,MAAM,GAAG,uBAAuB,SAAS,QAAQ;KACvD,IAAI,MAAM,GACR,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,IAAI,wBACzC;KAEF,YAAY,KAAK;KACjB,UAAU,KAAK,KAAK,uBAAuB,QAAQ;IACrD,UAAU;KACR,GAAG,oBAAoB,QAAQ;IACjC;GACF;GAKA,MAAM,uBAAO,IAAI,IAAY;GAC7B,KAAK,MAAM,OAAO,aAAa;IAC7B,IAAI,KAAK,IAAI,GAAG,GACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gDAAgD,KAClD;IAEF,KAAK,IAAI,GAAG;GACd;GAKA,MAAM,mBADQ,GAAG,uBAAuB,OACX,IAAI,YAAY;GAC7C,IAAI,UAAU,kBACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gBAAgB,QAAQ,uCAAuC,kBACjE;GAMF,MAAM,WAAW,IAAI,YAAY;GACjC,MAAM,SAAS,IAAI,MAAM,QAAQ;GACjC,IAAI;GACJ,IAAI;IACF,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KACtC,IAAI,KAAK,QAAQ,OAAO,YAAY,IAAI,IAAI,CAAC;IAE/C,gBAAgB;IAChB,KAAK,GAAG,oBAAoB,SAAS,QAAQ,YAAY,QAAQ,OAAO;GAC1E,UAAU;IACR,IAAI,KAAK,MAAM;GACjB;GAEA,IAAI,CAAC,IAAI;IAIP,gBAAgB;IAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,qDAAqD,QAAQ,iBAAiB,YAAY,KACxF,GACF,EAAE,GACJ;GACF;GAMA,MAAM,YAAY,KAAK,QAAQ,aAAa,gBAAgB;GAC5D,gBAAgB;GAEhB,MAAM,QAAyB,IAAI,MAAM,YAAY,MAAM;GAC3D,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;IAC3C,eAAe,MAAM;IACrB,MAAM,SAAS,UAAU;IACzB,MAAM,WAAW,GAAG,kBAAkB,SAAS,MAAM;IACrD,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+CAA+C,QACjD;IAEF,IAAI;KACF,MAAM,KAAK,sBACT,IACA,KACA,UACA,kBACA,QACA,WACA,eAAe,KAAK,SAAS,KAAK,KAAK,CACzC;IACF,UAAU;KACR,GAAG,oBAAoB,QAAQ;IACjC;GACF;GAEA,KAAK,wBAAwB,kBAAkB,OAAO;GAQtD,OAAO;IAAE;IAAO,MANyB,sBAAsB;KAC7D,UAAU;KACV;KACA,gBAJqB,KAAK,QAAQ,UAAU,gBAI/B;KACb,SAAS;IACX,CACmB;GAAE;EACvB,UAAU;GACR,IAAI,eAAe,KAAK,QAAQ,aAAa,gBAAgB;GAC7D,KAAK,QAAQ,gBAAgB;EAC/B;CACF;;;;;;;;;;;;;;;CAgBA,qBAA6B,UAAe,SAAc,WAAgC;EACxF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,KACJ,cAAc,KAAA,IACV,GAAG,6BAA6B,QAAQ,IACxC,GAAG,sCAAsC,UAAU,gBAAgB,SAAS,CAAC;EACnF,GAAG,yBAAyB,OAAO;EACnC,OAAO;CACT;CAEA,uBAA+B,UAAmC;EAChE,OAAO,uBAAuB,KAAK,SAAS,QAAQ;CACtD;CAEA,6BAAqC,kBAAoC,SAAoB;EAC3F,IAAI,KAAK,QAAQ,oBAAoB,gBAAgB,CAAC,CAAC,SAAS,SAC9D;EAEF,KAAK,wBAAwB,kBAAkB,OAAO;CACxD;CAEA,wBAAgC,kBAAoC,SAAoB;EACtF,KAAK,QAAQ,eAAe,kBAAkB,KAAK,0BAA0B,OAAO,CAAC;CACvF;CAEA,0BAAkC,SAAuB;EACvD,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,GAAG,uBAAuB,OAAO;EAC/C,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,mCAAmC,MAAM,kCAC3C;EAEF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,MAAM,WAAW,GAAG,kBAAkB,SAAS,CAAC;GAChD,IAAI,CAAC,UACH;GAEF,IAAI;IAEF,IADe,GAAG,0BAA0B,QACnC,IAAI,GACX;IAEF,MAAM,KAAK,gBAAgB,IAAI,KAAK,UAAU,IAAI;IAClD,IAAI,OAAO,QAAQ,GAAG,WAAW,GAC/B,OAAO;GAEX,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;EACF;EACA,OAAO;CACT;AACF;;;ACtwBA,MAAME,iBAAe;AACrB,MAAMC,oBAAkB;AACxB,MAAMC,0BAAwB;AAC9B,MAAM,iBAAiB;AAEvB,MAAM,qBAAqB;AAC3B,MAAMC,wBAAsB;;;;;;;;AAS5B,IAAa,sBAAb,MAAiC;CAC/B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,QACE,kBACA,MACA,OACA,QACyB;EACzB,eAAe,MAAM;EACrB,KAAK,YAAY,uBAAuB,kBAAkB,IAAI;EAC9D,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI;GACF,MAAM,YAAY,KAAK,WAAW,SAAS,IAAI;GAC/C,IAAI;GACJ,IAAI;GACJ,IAAI;IACF,CAAC,MAAM,YAAY,KAAK,gBAAgB,YAAY,aAClD,YAAY,KAAK,IAAI,KAAK,SAAS,cAAc;KAC/C,MAAM,KAAK,GAAG,4BACZ,SACA,UACA,KAAK,QACL,UAAU,UAAU,IAAI,GACxB,SACF;KACA,MAAM,MAAgB,CAAC;KACvB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,OAAO,IAAI,CAAC,CAAC,CAAC;KAEpD,OAAO,CAAC,IAAI,GAAG;IACjB,CAAC,CACH;GACF,UAAU;IACR,KAAK,MAAM,YAAY,WAAW,GAAG,oBAAoB,QAAQ;GACnE;GAEA,IAAI,SAASH,gBAAc;IAGzB,MAAM,UAAU,SAAS,WAAW,WAAW,WAAW,kBAAkB;IAC5E,MAAM,IAAII,8BAAAA,YACR,WAAW,IAAIC,8BAAAA,gBAAgB,aAAaA,8BAAAA,gBAAgB,SAC5D,WAAW,IACP,4BAA4B,QAAQ,gCAAgC,qBACpE,kDACN;GACF;GAEA,MAAM,UAAU,KAAK,KAAK,KAAK,OAAO;IACpC;IACA,QAAQ,SAAS,OAAO,iBAAkB,YAAuB;GACnE,EAAE;GACF,IAAI,SAASH,2BAAyB,SAASD,mBAC7C,OAAO;IAAE;IAAkB;IAAO;IAAS,MAAM;GAAK;GAKxD,KAAK,QAAQ,aAAa;GAC1B,KAAK,QAAQ,aAAa,gBAAgB;GAC1C,IAAI;IACF,IAAI,iBAAiB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,kBAAkB,MAAM;GAChF,QAAQ,CAGR;GAKA,OAAO;IAAE;IAAkB;IAAO;IAAS,MAAA;KAHzC,eAAe,CAAC,KAAK,QAAQ,UAAU,gBAAgB,CAAC;KACxD,YAAY;IAEgC;GAAE;EAClD,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;CAEA,iBACE,kBACA,MACA,QACsC;EACtC,eAAe,MAAM;EACrB,KAAK,YAAY,gCAAgC,kBAAkB,IAAI;EACvE,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI,cAA0B;EAC9B,IAAI,SAAqB;EACzB,IAAI;GACF,MAAM,YAAY,KAAK,WAAW,SAAS,IAAI;GAC/C,IAAI;IACF,cAAc,KAAK,gBAAgB,YAAY,aAC7C,GAAG,qCAAqC,SAAS,UAAU,KAAK,MAAM,CACxE;GACF,UAAU;IACR,KAAK,MAAM,YAAY,WAAW,GAAG,oBAAoB,QAAQ;GACnE;GACA,IAAI,CAAC,aAGH,MAAM,IAAIG,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,4GACF;GAEF,OAAO,YAAY,KAAK,IAAI,YAAY;IACtC,IAAI,KAAK,SAAS,OAAO,CAAC;IAC1B,SAAS,GAAG,+BAA+B,aAAcF,uBAAqB,OAAO;IACrF,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;IAC5C,IAAI,CAAC,UAAU,QAAQ,GACrB,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,eAChB,qCACF;IAEF,MAAM,QAAQ,IAAI,UAAU,QAAQ,IAAI;IACxC,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;IAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;IAChC,OAAO;KAAE,OAAO;KAAQ;IAAK;GAC/B,CAAC;EACH,UAAU;GACR,IAAI,QAAQ,GAAG,gBAAgB,MAAM;GACrC,IAAI,aAAa,GAAG,mBAAmB,WAAW;GAClD,KAAK,QAAQ,gBAAgB;EAC/B;CACF;;;CAIA,WAAmB,SAAc,MAA8B;EAC7D,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,YAAmB,CAAC;EAC1B,IAAI;GACF,KAAK,MAAM,OAAO,MAChB,UAAU,KAAK,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG,CAAC;GAE1E,OAAO;EACT,SAAS,OAAO;GACd,KAAK,MAAM,YAAY,WAAW,GAAG,oBAAoB,QAAQ;GACjE,MAAM;EACR;CACF;;CAGA,gBAA2B,WAAkB,MAA+B;EAC1E,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,SAAS,KAAK,QAAQ,SAAS;EACrC,MAAM,UAAU,SAAS,IAAI;EAC7B,OAAO,YAAY,KAAK,KAAK,IAAI,GAAG,UAAU,SAAS,OAAO,IAAI,aAAa;GAC7E,UAAU,SAAS,KAAK,MACtB,SACI,IAAI,KAAK,UAAU,OAAO,OAAO,GAAG,GAAG,IAAI,CAAC,IAC5C,IAAI,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC,CAC1C;GACA,OAAO,KAAK,QAAQ;EACtB,CAAC;CACH;CAEA,YAAoB,IAAY,kBAAoC,MAA6B;EAC/F,IAAI,KAAK,WAAW,GAClB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,GAAG,GAAG,2BAA2B;EAErF,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,qBAAqB,kBAC3B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,GAAG,GAAG,6BAA6B,iBAAiB,oBAAoB,IAAI,kBAC9E;CAGN;AACF;;;ACpMA,MAAM,eAAe;AACrB,MAAM,kBAAkB;AACxB,MAAM,wBAAwB;;AAG9B,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,QACE,mBACA,OACA,QACmB;EACnB,eAAe,MAAM;EACrB,mBAAmB,iBAAiB;EACpC,KAAK,MAAM,oBAAoB,mBAC7B,KAAK,QAAQ,qBAAqB,gBAAgB;EAGpD,MAAM,UAAwC,CAAC;EAC/C,MAAM,2BAAW,IAAI,IAAsB;EAC3C,IAAI,OAAO;EACX,KAAK,MAAM,oBAAoB,mBAAmB;GAChD,IAAI,QAAS,OAAO,WAAW,SAAS,OAAO,GAAI;IACjD,OAAO;IACP,QAAQ,KAAK;KAAE;KAAkB,QAAQ;IAAU,CAAC;IACpD;GACF;GACA,IAAI,OAAO,SAAS,eAAe,MAAM;GAEzC,MAAM,OAAO,KAAK,QAAQ,SAAS;GACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;GAC7C,IAAI;GACJ,IAAI;IACF,OAAO,KAAK,QAAQ,GAAG,iBAAiB,SAAS,UAAU,UAAU,IAAI,CAAC;GAC5E,SAAS,OAAO;IACd,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KAAE;KAAkB,QAAQ;KAAU,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAAE,CAAC;IACjF,OAAO;IACP;GACF,UAAU;IACR,KAAK,QAAQ,gBAAgB;GAC/B;GAEA,IAAI,SAAS,uBACX,QAAQ,KAAK;IAAE;IAAkB,QAAQ;GAAY,CAAC;QACjD,IAAI,SAAS,iBAAiB;IACnC,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KAAE;KAAkB,QAAQ;IAAU,CAAC;GACtD,OAAO;IACL,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KACX;KACA,QAAQ;KACR,QAAA,GAAA,8BAAA,eAAA,CACE,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,SAChB,SAAS,eACL,+CACA,gDAAgD,MACtD,CACF;IACF,CAAC;IACD,OAAO;GACT;EACF;EAEA,IAAI,SAAS,SAAS,GAAG,OAAO;GAAE;GAAmB;GAAO;GAAS,MAAM;EAAK;EAEhF,KAAK,QAAQ,aAAa;EAC1B,KAAK,MAAM,oBAAoB,UAAU;GACvC,KAAK,QAAQ,aAAa,gBAAgB;GAC1C,IAAI;IAEF,IAAI,iBAAiB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,kBAAkB,MAAM;GAChF,QAAQ,CAGR;EACF;EAOA,OAAO;GAAE;GAAmB;GAAO;GAAS,MAAA;IAL1C,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,qBAChC,KAAK,QAAQ,UAAU,gBAAgB,CACzC;IACA,YAAY;GAEiC;EAAE;CACnD;AACF;AAEA,SAAS,mBAAmB,mBAA6C;CACvE,IAAI,kBAAkB,WAAW,GAC/B,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,0CAA0C;CAE9F,MAAM,uBAAO,IAAI,IAAsB;CACvC,KAAK,MAAM,oBAAoB,mBAAmB;EAChD,IAAI,KAAK,IAAI,gBAAgB,GAC3B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDAAwD,kBAC1D;EAEF,KAAK,IAAI,gBAAgB;CAC3B;AACF;;;;;;;;;;;;;;;;;;;;ACjFA,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,MAAM,OAA4B,QAA2C;EAC3E,eAAe,MAAM;EAErB,MAAM,OAAO,KAAK,UAAU,KAAK;EACjC,KAAK,MAAM,oBAAoB,KAAK,KAAK,GACvC,KAAK,QAAQ,qBAAqB,gBAAgB;EAEpD,KAAK,UAAU,MAAM,MAAM;EAE3B,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,UAA2C,CAAC;EAClD,MAAM,2BAAW,IAAI,IAAsB;EAC3C,IAAI,eAAe;EACnB,IAAI,OAAO;EAEX,KAAK,MAAM,CAAC,kBAAkB,SAAS,MAAM;GAC3C,IAAI,QAAS,OAAO,WAAW,SAAS,OAAO,GAAI;IACjD,OAAO;IACP,QAAQ,KAAK;KAAE;KAAkB,QAAQ;KAAW,wBAAwB;IAAE,CAAC;IAC/E;GACF;GACA,IAAI,OAAO,SAAS,eAAe,MAAM;GAEzC,MAAM,OAAO,KAAK,QAAQ,SAAS;GACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;GAC7C,IAAI;IACF,MAAM,UACJ,SAAS,OAAO,KAAK,eAAe,OAAO,IAAI,KAAK,gBAAgB,SAAS,IAAI;IACnF,IAAI,QAAQ,WAAW,WAAW;KAChC,GAAG,yBAAyB,OAAO;KACnC,SAAS,IAAI,gBAAgB;KAC7B,gBAAgB,QAAQ;IAC1B;IACA,QAAQ,KAAK;KACX;KACA,QAAQ,QAAQ;KAChB,wBAAwB,QAAQ;IAClC,CAAC;GACH,SAAS,OAAO;IACd,SAAS,IAAI,gBAAgB;IAC7B,QAAQ,KAAK;KACX;KACA,QAAQ;KACR,wBAAwB;KACxB,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAC7B,CAAC;IACD,OAAO;GACT,UAAU;IACR,KAAK,QAAQ,gBAAgB;GAC/B;EACF;EAEA,IAAI,SAAS,SAAS,GACpB,OAAO;GAAE;GAAO;GAAS,wBAAwB;GAAc,MAAM;EAAK;EAG5E,KAAK,QAAQ,aAAa;EAC1B,KAAK,MAAM,oBAAoB,UAAU;GACvC,KAAK,QAAQ,aAAa,gBAAgB;GAC1C,IAAI;IAEF,IAAI,iBAAiB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,kBAAkB,MAAM;GAChF,QAAQ,CAGR;EACF;EACA,MAAM,OAAqB;GACzB,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,qBAChC,KAAK,QAAQ,UAAU,gBAAgB,CACzC;GACA,YAAY;EACd;EACA,OAAO;GAAE;GAAO;GAAS,wBAAwB;GAAc;EAAK;CACtE;;;;;CAMA,UAAkB,OAA2E;EAC3F,MAAM,uBAAO,IAAI,IAA8C;EAC/D,IAAI,MAAM,SAAS,SAAS;GAC1B,IAAI,MAAM,kBAAkB,WAAW,GACrC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,4CACF;GAEF,KAAK,MAAM,oBAAoB,MAAM,mBAAmB;IACtD,IAAI,KAAK,IAAI,gBAAgB,GAC3B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0DAA0D,kBAC5D;IAEF,KAAK,IAAI,kBAAkB,IAAI;GACjC;GACA,OAAO;EACT;EAEA,IAAI,MAAM,KAAK,WAAW,GACxB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sDACF;EAEF,KAAK,MAAM,OAAO,MAAM,MAAM;GAC5B,MAAM,WAAW,KAAK,IAAI,IAAI,gBAAgB;GAC9C,IAAI,aAAa,MACf,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oCAAoC;GAExF,IAAI,UAAU,SAAS,KAAK,GAAG;QAC1B,KAAK,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC;EAC3C;EAIA,KAAK,MAAM,CAAC,kBAAkB,SAAS,MACrC,IAAI,SAAS,QAAQ,KAAK,SAAS,KAAK,KAAK,MAAM,MAAM,EAAE,SAAS,OAAO,GACzE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,iBAAiB,4GAClD;EAGJ,OAAO;CACT;;;;;;CAOA,UACE,MACA,QACM;EACN,MAAM,EAAE,OAAO,KAAK;EACpB,KAAK,MAAM,CAAC,kBAAkB,SAAS,MAAM;GAC3C,IAAI,SAAS,MAAM;GACnB,eAAe,MAAM;GACrB,MAAM,OAAO,KAAK,QAAQ,SAAS;GACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;GAC7C,IAAI;IACF,KAAK,MAAM,OAAO,MAAM;KACtB,MAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;KACzE,IAAI;MACF,MAAM,WAAA,GAAA,8BAAA,gBAAA,CAA0B,GAAG,qBAAqB,QAAQ,CAAC;MACjE,IAAI,YAAY,UACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,iBAAiB,kBAAkB,QAAQ,sCAC5E;KAEJ,UAAU;MACR,GAAG,oBAAoB,QAAQ;KACjC;IACF;GACF,UAAU;IACR,KAAK,QAAQ,gBAAgB;GAC/B;EACF;CACF;CAEA,eAAuB,SAAoE;EACzF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,gBAAgB,KAAK,yBAAyB,OAAO;EAC3D,OAAO,YAAY,KAAA,IAAiB,aAAa;GAE/C,IAAI,CADO,GAAG,yBAAyB,SAAS,QAC1C,GAAG;IAKP,IAAI,eACF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC;IAErF,OAAO;KAAE,QAAQ;KAAsB,SAAS;IAAE;GACpD;GACA,OAAO;IAAE,QAAQ;IAAoB,SAAS,QAAQ,KAAK,QAAQ,MAAM;GAAE;EAC7E,CAAC;CACH;CAEA,yBAAiC,SAAuB;EACtD,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,GAAG,uBAAuB,OAAO;EAC/C,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;GAC1C,MAAM,WAAW,GAAG,kBAAkB,SAAS,KAAK;GACpD,IAAI,CAAC,UAAU;GACf,IAAI;IACF,KAAA,GAAA,8BAAA,gBAAA,CAAoB,GAAG,qBAAqB,QAAQ,CAAC,MAAM,UAAU,OAAO;GAC9E,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;EACF;EACA,OAAO;CACT;CAEA,gBACE,SACA,MACwC;EACxC,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,IAAI,UAAU;EACd,KAAK,MAAM,OAAO,MAAM;GAItB,MAAM,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GACzE,IAAI;IAMF,IAAI,CALO,YAAY,KAAA,IAAiB,aAAa;KACnD,MAAM,UAAU,GAAG,yBAAyB,SAAS,UAAU,QAAQ;KACvE,IAAI,SAAS,WAAW,QAAQ,KAAK,QAAQ,MAAM;KACnD,OAAO;IACT,CACM,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+CACF;GAEJ,UAAU;IACR,GAAG,oBAAoB,QAAQ;GACjC;EACF;EACA,OAAO;GAAE,QAAQ;GAAW;EAAQ;CACtC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;AClPA,IAAa,iBAAb,MAA4B;CAC1B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,kBAAoC,QAAuC;EAC9E,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,eAAe,MAAM;GACrB,MAAM,cAAc,GAAG,kBAAkB,OAAO;GAChD,IAAI,CAAC,aACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,mDAAmD,kBACrD;GAEF,IAAI;IACF,eAAe,MAAM;IACrB,MAAM,YAAY,KAAK,IAAI,GAAG,oBAAoB,WAAW,GAAG,CAAC;IACjE,MAAM,OAAO,aAAa,KAAK,SAAS,aAAa,SAAS;IAC9D,MAAM,UAAU,YAAY,KAAK,SAAS,aAAa,gBAAgB;IAIvE,MAAM,aAAA,GAAA,8BAAA,iBAAA,CAA6B,WAAW,KAAK,QAAQ,OAAO;IAClE,IAAI,cAAc,MAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,+CAA+C,iBAAiB,IAAI,WACtE;IAEF,OAAO,QAAQ,SAAS,IAAI;KAAE;KAAM;KAAW;IAAQ,IAAI;KAAE;KAAM;IAAU;GAC/E,UAAU;IACR,GAAG,mBAAmB,WAAW;GACnC;EACF,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;AACF;;;;;;;AAQA,SAAS,aACP,SACA,aACA,WACQ;CACR,IAAI,aAAa,GAAG,OAAO;CAC3B,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,WAAW,YAAY,IAAI;CACjC,OAAO,YAAY,KAAK,WAAW,IAAI,QAAQ;EAC7C,MAAM,UAAU,GAAG,qBAAqB,aAAa,KAAK,QAAQ;EAClE,IAAI,WAAW,GAAG,OAAO;EACzB,OAAO,cAAc,IAAI,UAAU,MAAM,UAAU,KAAK,CAAC,CAAC;CAC5D,CAAC;AACH;AAEA,SAAS,cAAc,OAA2B;CAChD,MAAM,QAAQ,IAAI,YAAY,MAAM,QAAQ,MAAM,YAAY,MAAM,cAAc,CAAC;CACnF,IAAI,MAAM;CACV,MAAM,QAAQ;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,OACrC,OAAO,OAAO,aAAa,GAAG,MAAM,SAAS,GAAG,KAAK,IAAI,IAAI,OAAO,MAAM,MAAM,CAAC,CAAC;CAEpF,OAAO;AACT;;AAGA,MAAM,eAAe;AAErB,SAAS,YACP,SACA,aACA,kBACiB;CACjB,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,QAAQ,GAAG,0BAA0B,aAAaC,yBAAAA,UAAU,CAAC;CACnE,IAAI,QAAQ,GACV,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,oDAAoD,kBACtD;CAEF,IAAI,UAAU,GAAG,OAAO,CAAC;CACzB,OAAO,YAAY,KAAK,QAAQ,eAAe,QAAQ;EACrD,GAAG,0BAA0B,aAAa,KAAK,KAAK;EACpD,MAAM,QAAQ,IAAI,UAAU,KAAK,QAAQ,YAAY;EACrD,MAAM,QAAQ,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,QAAQ,CAAC;EACtE,MAAM,UAA2B,IAAI,MAAM,KAAK;EAChD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,QAAQ,KAAK,CAAC,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;EAE9C,OAAO;CACT,CAAC;AACH;;;;;;;;ACxGA,MAAM,2BAA2B;;;;;;;;;;;;;;AAgDjC,IAAa,qBAAb,MAAgC;CAC9B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,kBAAoC,QAA2C;EAClF,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,eAAe,MAAM;GACrB,MAAM,cAAc,GAAG,kBAAkB,OAAO;GAChD,IAAI,CAAC,aACH,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,mDAAmD,kBACrD;GAEF,IAAI;IACF,eAAe,MAAM;IACrB,MAAM,aAAa,KAAK,IAAI,GAAG,oBAAoB,WAAW,GAAG,CAAC;IAClE,MAAM,UAAoC,CAAC;IAC3C,MAAM,cAAc,IAAI,MAAM,0BAA0B,KAAK;IAE7D,IAAI;KACF,IAAI,gBAAwC;KAC5C,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;MACnC,eAAe,MAAM;MACrB,MAAM,YAAY,GAAG,uBAAuB,aAAa,CAAC;MAC1D,MAAM,SAAiC;OACrC;OACA,GAAG,KAAK,aAAa,aAAa,GAAG,WAAW;MAClD;MACA,IAAI,cAAc,eAAe;OAC/B,OAAO,WAAW,GAAG,qBAAqB,aAAa,CAAC;OACxD,gBAAgB;MAClB;MACA,QAAQ,KAAK,MAAM;KACrB;IACF,UAAU;KACR,IAAI,KAAK,WAAW;IACtB;IAEA,OAAO,EAAE,MAAM,uBAAuB,OAAO,EAAE;GACjD,UAAU;IACR,GAAG,mBAAmB,WAAW;GACnC;EACF,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;CAEA,aACE,aACA,WACA,aACwD;EACxD,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,IAAI,CAAC,GAAG,yBAAyB,aAAa,WAAW,WAAW,GAClE,OAAO,cAAc;EAGvB,MAAM,EAAE,SAAS,OAAO,SAAS;EACjC,MAAM,SAAS,QAAQ,KAAK,aAAa,QAAQ,KAAK,MAAM;EAG5D,IAAI,SAAS,KAAK,OAChB,OAAO,cAAc;EAGvB,MAAM,UAAU,QAAQ,SAAS,KAAK,OAAO;EAC7C,MAAM,MAA8D;GAClE,OAAO,SAAS,KAAK,QAAQ,IAAI;GACjC,WAAA,GAAA,8BAAA,iBAAA,CAA2B,UAAU,KAAK,aAAa,QAAQ,QAAQ,CAAC;GACxE;GACA,UAAU;GACV,YAAY;EACd;EACA,IAAI,SAAS,KAAK,aAChB,IAAI,YAAA,GAAA,8BAAA,iBAAA,CAA4B,UAAU,KAAK,aAAa,QAAQ,QAAQ,CAAC;EAE/E,IAAI,SAAS,KAAK,cAAc;GAC9B,IAAI,YAAY,SAAS,KAAK,aAAa,QAAQ,SAAS;GAC5D,IAAI,SAAS,KAAK,cAChB,IAAI,YAAY,SAAS,KAAK,aAAa,QAAQ,SAAS;GAE9D,IAAI,CAAC,SAAS;IACZ,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,MAAM;IAClD,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,SAAS,CAAC;IACtD,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,SAAS,CAAC;IACtD,MAAM,IAAI,QAAQ,KAAK,aAAa,QAAQ,SAAS,EAAE;IACvD,IAAI,WAAW,KAAK,MAAM,GAAG,CAAC;IAC9B,IAAI,aAAa,IAAI,IAAI,IAAI,IAAI;GACnC;EACF;EACA,OAAO;CACT;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,uBAAuB,SAAsD;CAC3F,MAAM,OAA0B,CAAC;CACjC,IAAI,SAAmC,CAAC;CACxC,IAAI,YAAY;CAChB,IAAI;CACJ,IAAI,YAAoC;CACxC,IAAI;CAEJ,MAAM,SAAS,cAAsB;EACnC,IAAI,OAAO,SAAS,GAAG;GACrB,KAAK,KAAK,eAAe,QAAQ,WAAW,UAAU,GAAG,CAAC;GAC1D,SAAS,CAAC;GACV,MAAM,KAAA;EACR;EACA,YAAY;CACd;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,SAAS,QAAQ;EACvB,IAAI,OAAO,cAAc,WAAW;GAClC,MAAM,CAAC;GACP,YAAY,OAAO;GACnB,WAAW,OAAO;EACpB;EACA,MAAM,cAAc,QAAQ,MAAM;EAClC,IAAI,aAAa;GACf,IAAI,OAAO,CAAC,UAAU,KAAK,WAAW,GAAG,MAAM,CAAC;GAChD,IAAI,CAAC,KAAK,MAAM;EAClB;EACA,OAAO,KAAK,MAAM;CACpB;CACA,MAAM,QAAQ,MAAM;CACpB,OAAO;AACT;AAEA,SAAS,QAAQ,QAAsD;CACrE,IAAI,OAAO,QAAQ,GAAG,OAAO,KAAA;CAC7B,IAAI,OAAO,aAAa,CAAC,OAAO,SAC9B,OAAO;EAAE,SAAS;EAAO,UAAU,OAAO;EAAU,YAAY,OAAO;CAAW;CAEpF,OAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,UAAU,GAAa,GAAsB;CACpD,IAAI,EAAE,WAAW,EAAE,SAAS,OAAO,EAAE,YAAY,EAAE;CACnD,IAAI,EAAE,eAAe,EAAE,YAAY,OAAO;CAC1C,MAAM,QAAQ,EAAE,WAAW,EAAE;CAC7B,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK;AACnE;AAEA,SAAS,eACP,QACA,WACA,UACA,KACiB;CACjB,IAAI,OAAO,CAAC,IAAI,SAAS;EACvB,MAAM,SAAiC,OAAO,KAAK,MACjD,EAAE,YACE;GACE,WAAW,EAAE;GACb,OAAO,EAAE;GACT,GAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;EAClD,IAGA;GAAE,WAAW,SAAS;GAAG,OAAO,EAAE;EAAM,CAC9C;EACA,OAAO;GACL,MAAM,UAAU,SAAS,MAAO,EAAE,aAAA,GAAA,8BAAA,cAAA,CAA0B,EAAE,SAAS,IAAI,SAAU;GACrF;GACA;GACA,UAAU,IAAI;GACd,YAAY,IAAI;GAChB,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;EAC/C;CACF;CAMA,MAAM,SAA8B,OAAO,KAAK,OAAO;EACrD,UAAU,EAAE;EACZ,OAAO,EAAE;EACT,GAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;CAC/C,EAAE;CACF,OAAO;EACL,MAAM,UAAU,SAAS,MAAM,EAAE,QAAQ;EACzC;EACA;EACA,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;CAC/C;AACF;;AAGA,SAAS,UACP,QACA,UACS;CACT,MAAM,OAAO,SAAS,OAAO,EAAE;CAC/B,MAAM,OAAO;EAAE,MAAM,KAAK;EAAM,QAAQ,KAAK;EAAQ,OAAO,KAAK;EAAO,KAAK,KAAK;CAAI;CACtF,KAAK,MAAM,KAAK,QAAQ;EACtB,IAAI,EAAE,QAAQ,GAAG;EACjB,MAAM,IAAI,SAAS,CAAC;EACpB,KAAK,OAAO,KAAK,IAAI,KAAK,MAAM,EAAE,IAAI;EACtC,KAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,EAAE,MAAM;EAC5C,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,EAAE,KAAK;EACzC,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,EAAE,GAAG;CACrC;CACA,OAAO;AACT;AAEA,MAAM,YAAqB;CAAE,MAAM;CAAG,QAAQ;CAAG,OAAO;CAAG,KAAK;AAAE;AAElE,SAAS,WAAoB;CAC3B,OAAO;EAAE,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;CAAE;AAC1F;AAEA,SAAS,gBAAwE;CAC/E,OAAO;EACL,OAAO;EACP,UAAU;GAAE,MAAM;GAAG,QAAQ;GAAG,OAAO;GAAG,KAAK;EAAE;EACjD,SAAS;EACT,UAAU;EACV,YAAY;CACd;AACF;AAEA,SAAS,SAAS,KAAuB,KAAU,YAA6B;CAC9E,MAAM,KAAK,WAAmB,QAAQ,KAAK,KAAK,aAAa,MAAM;CACnE,OAAO;EACL,IAAI;GAAE,GAAG,EAAE,CAAC;GAAG,GAAG,EAAE,CAAC;EAAE;EACvB,IAAI;GAAE,GAAG,EAAE,CAAC;GAAG,GAAG,EAAE,EAAE;EAAE;EACxB,IAAI;GAAE,GAAG,EAAE,EAAE;GAAG,GAAG,EAAE,EAAE;EAAE;EACzB,IAAI;GAAE,GAAG,EAAE,EAAE;GAAG,GAAG,EAAE,EAAE;EAAE;CAC3B;AACF;;;AC/TA,MAAM,oBAAoB;AAE1B,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,OAAO,kBAAoC,SAA4B,QAAqB;EAC1F,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAE7C,IAAI;GACF,eAAe,MAAM;GAErB,MAAM,YAAY,GAAG,mBAAmB,OAAO;GAC/C,MAAM,aAAa,GAAG,oBAAoB,OAAO;GACjD,MAAM,SAAS,cAAc,QAAQ,QAAQ,WAAW,UAAU;GAClE,MAAM,WAAW,QAAQ,YAAY;GACrC,MAAM,WAAW,QAAQ,YAAY;IAAE,MAAM;IAAS,OAAO;GAAE;GAE/D,IAAI,QAAA;GACJ,IAAI,QAAQ,sBAAsB,MAAM,SAAS;GAEjD,MAAM,SAAS,UAAU,KAAK,SAAS;IACrC,MAAM;IACN,MAAM;KAAE,OAAO;KAAW,QAAQ;IAAW;IAC7C;IACA;IACA,GAAI,QAAQ,oBAAoB,KAAA,IAC5B,EAAE,iBAAiB,QAAQ,gBAAgB,IAC3C,CAAC;IACL,YAAY,QAAQ,eAAe,gBAAgB,gBAAgB;IACnE,OAAO,WAAW,WAAW,YAAY;KACvC,eAAe,MAAM;KACrB,GAAG,gCAAgC,WAAW,SAAS,WAAW,SAAS,KAAK;KAChF,eAAe,MAAM;KACrB,OAAO;IACT;GACF,CAAC;GACD,IAAI,CAAC,QACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,oBAChB,gCAAgC,kBAClC;GAEF,OAAO;EACT,UAAU;GACR,KAAK,QAAQ,gBAAgB;EAC/B;CACF;AACF;;AAGA,SAAS,cACP,QACA,WACA,YACS;CACT,IAAI,CAAC,UAAU,OAAO,SAAS,QAC7B,OAAO;EAAE,MAAM;EAAG,QAAQ;EAAG,OAAO;EAAW,KAAK;CAAW;CAEjE,MAAM,QAAA,GAAA,8BAAA,iBAAA,CAAwB,OAAO,IAAI;CACzC,IAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,OAAO,KAAK,QAC9C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,qCAAqC;CAEzF,OAAO;AACT;;;;;;;;;;;;;;;ACjDA,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;CAGH,KAAK,QAAyC;EAC5C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,QAAQ,GAAG,2BAA2B,MAAM;EAClD,MAAM,QAA4B,CAAC;EACnC,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;GAC1C,MAAM,gBAAgB,GAAG,sBAAsB,QAAQ,KAAK;GAC5D,IAAI,CAAC,eAAe;GACpB,MAAM,MAAM,kBAAkB,IAAI,KAAK,QAAQ,KAAK,KAAK;GACzD,MAAM,KAAK;IAAE,GAAG,uBAAuB,IAAI,KAAK,aAAa;IAAG;IAAK;GAAM,CAAC;EAC9E;EACA,OAAO;CACT;;CAGA,SACE,KACA,MACA,iBACA,QAC6B;EAC7B,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ,GAAG;EACzD,IAAI,QAAQ,GACV,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,IAAI,IAAI,kBACxC;EAEF,MAAM,gBAAgB,GAAG,sBAAsB,QAAQ,KAAK;EAC5D,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,2BAA2B,IAAI,IAAI,sBAAsB,MAAM,yBACjE;EAEF,MAAM,OAAO,uBAAuB,IAAI,KAAK,aAAa;EAC1D,OAAO,KAAK,QAAQ,eAAe,KAAK,MAAM,KAAK,UAAU,MAAM,eAAe;CACpF;;CAGA,mBACE,kBACA,KACA,MACA,iBACA,QAC6B;EAC7B,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,SAAS;EACnC,MAAM,UAAU,KAAK,QAAQ,gBAAgB;EAC7C,IAAI,WAAuB;EAC3B,IAAI;GACF,WAAW,gBAAgB,KAAK,SAAS,KAAK,SAAS,SAAS,GAAG;GACnE,MAAM,gBAAgB,GAAG,4BAA4B,QAAQ;GAC7D,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uEACF;GAEF,MAAM,OAAO,uBAAuB,IAAI,KAAK,aAAa;GAC1D,OAAO,KAAK,QAAQ,eAAe,KAAK,MAAM,KAAK,UAAU,MAAM,eAAe;EACpF,UAAU;GACR,IAAI,aAAa,MAAM,GAAG,oBAAoB,QAAQ;GACtD,KAAK,QAAQ,gBAAgB;EAC/B;CACF;CAEA,QACE,eACA,MACA,UACA,MACA,iBAC6B;EAC7B,IAAI,SAAS,KAAA,GAAW;GACtB,MAAM,EAAE,SAAS,wBAAwB,KAAK,SAAS,eAAe,MAAM,eAAe;GAC3F,OAAO;IAAE;IAAM,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;IAAI;IAAM;GAAK;EAC/D;EACA,MAAM,EAAE,OAAO,SAAS,0BAA0B,KAAK,SAAS,eAAe,eAAe;EAC9F,OAAO;GAAE;GAAM,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;GAAI;GAAM;EAAM;CAChE;AACF;;;;;;;;;;;;;;;ACjGA,IAAa,oBAAb,MAA+B;CAC7B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;CAQH,OACE,MACA,WACA,QACwB;EACxB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,WAAW,YAAY,KAAK;EAClC,IAAI,CAAC,UACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wCAAwC,KAAK,SAAS,sDACxD;EAEF,IAAI,KAAK,KAAK,WAAW,GACvB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;EAMrF,IAAI,uBAAuB,IAAI,KAAK,QAAQ;GAAE,MAAM;GAAO,KAAK,KAAK;EAAK,CAAC,MAAM,IAC/E,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,8BAA8B,KAAK,KAAK,qDAC1C;EAGF,eAAe,MAAM;EACrB,MAAM,UAAU,IAAI,eAAe,KAAK,IAAI;EAC5C,IAAI;EACJ,IAAI;GACF,gBAAgB,GAAG,sBAAsB,QAAQ,OAAO;EAC1D,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;EACA,IAAI,CAAC,eACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,qCAAqC;EAGtF,2BAA2B,IAAI,KAAK,eAAe,QAAQ,MAAM,QAAQ;EAGzE,MAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ;GAAE,MAAM;GAAO,KAAK,KAAK;EAAK,CAAC;EACrF,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,2DACF;EAEF,OAAO;GACL,SAAS;IAAE,GAAG,uBAAuB,IAAI,KAAK,aAAa;IAAG,KAAK,KAAK;IAAM;GAAM;GAEpF,OAAO;EACT;CACF;;CAGA,OAAO,KAAsB,QAA6C;EACxE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ,GAAG;EACzD,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,IAAI,IAAI,kBACxC;EAEF,IAAI,CAAC,GAAG,yBAAyB,QAAQ,KAAK,GAC5C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,yCAAyC;EAE1F,OAAO;GAAE,SAAS;GAAK,OAAO;EAAK;CACrC;AACF;;;;;;;;;;;;;;;ACrGA,SAAgB,kBAAkB,OAKJ;CAC5B,MAAM,YAAY,MAAM,aAAa;CACrC,OAAO;EACL,iBAAiB,YAAY,cAAc;EAC3C,4BAA4B;EAC5B,yBAAyB,YAAY,MAAM,0BAA0B;EACrE,oBAAoB,MAAM;EAC1B,0BAA0B,kCAAkC,MAAM,eAAe;EACjF,aAAa,MAAM;EACnB,kBAAkB,MAAM;CAC1B;AACF;;;;;AAMA,SAAgB,iBAAiB,MAAwB;CACvD,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,SAAS,GAAG,OAAO;CACvB,OAAO;AACT;;;ACnCA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;;;;;;;;;;;AAY1B,IAAa,iBAAb,MAA4B;CAC1B,YAAY,SAA4C;EAA3B,KAAA,UAAA;EAI3B,kBAAkB,KAAK,OAAO;CAChC;CAEA,UAAU,MAAc,WAA0B,MAAiC;EACjF,MAAM,MAAM,KAAK,IAAI;EACrB,IAAI,SAA4E;EAChF,IAAI,SAAqB;EACzB,IAAI;GACF,SAAS,KAAK,QAAQ,WAAW,aAAa,IAAI;GAClD,SAAS,KAAK,QAAQ,GAAG,wBAAwB,OAAO,KAAK,YAAY,EAAE;GAC3E,IAAI,CAAC,QAAQ;IACX,MAAM,MAAM,KAAK,QAAQ,GAAG,kBAAkB;IAC9C,IAAI,QAAQ,mBACV,OAAO;KACL,iBAAiB;KACjB,4BAA4B;KAC5B,yBAAyB;KACzB,oBAAoB;KACpB,0BAA0B;KAC1B,aAAa;KACb,kBAAkB;IACpB;IAEF,IAAI,QAAQ,mBACV,OAAO;KACL,iBAAiB;KACjB,4BAA4B;KAC5B,yBAAyB;KACzB,oBAAoB;KACpB,0BAA0B;KAC1B,aAAa;KACb,kBAAkB;IACpB;IAEF,OAAO,gBAAgB,GAAG;GAC5B;GAEA,MAAM,YAAY,KAAK,QAAQ,GAAG,iBAAiB,MAAM;GAKzD,MAAM,OAAO,aAAa,KAAK,QAAQ,GAAG,uBAAuB,MAAM,CAAC;GAMxE,OAAO,kBAAkB;IACvB,UANe,CAAC,YACd,SACA,KAAK,QAAQ,GAAG,qBAAqB,MAAM,IACzC,UACA;IAGJ,iBAAiB;IACjB,yBAAyB,YACrB,KAAK,QAAQ,GAAG,gCAAgC,MAAM,IACtD;IACJ,UAAU;GACZ,CAAC;EACH,UAAU;GACR,IAAI,QAAQ,KAAK,QAAQ,GAAG,mBAAmB,MAAM;GACrD,QAAQ,MAAM;EAChB;CACF;;;;;;;CAQA,qBAAqB,SAAqD;EACxE,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,QAAQ,cAAc;EACrC,MAAM,YAAY,GAAG,iBAAiB,MAAM;EAC5C,MAAM,OAAO,aAAa,GAAG,2BAA2B,MAAM,CAAC;EAE/D,OAAO,kBAAkB;GACvB,UAFe,CAAC,YAAY,SAAS,GAAG,qBAAqB,MAAM,IAAI,UAAU;GAGjF,iBAAiB;GACjB,yBAAyB,YAAY,GAAG,gCAAgC,MAAM,IAAI;GAClF,UAAU,KAAK,IAAI;EACrB,CAAC;CACH;;;;;;;CAQA,yBACE,SACA,UACA,OAAwB,OACG;EAC3B,MAAM,SAAS,QAAQ,cAAc;EACrC,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,MAAM,qBAAqB,IAAI,MAAM,CAAC;EACtC,MAAM,0BAA0B,IAAI,MAAM,CAAC;EAC3C,MAAM,cAAc,IAAI,MAAM,CAAC;EAC/B,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,IAAI,KAAK,oBAAoB,OAAO,CAAC;GACrC,IAAI,KAAK,yBAAyB,OAAO,CAAC;GAC1C,IAAI,KAAK,aAAa,OAAO,CAAC;GAS9B,IAAI,CARO,GAAG,8BACZ,QACA,UACA,SACA,oBACA,yBACA,WAEI,GACJ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,sBAAsB,6BAA6B;GAE3F,MAAM,WAAW,iBAAiB,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,CAAC;GAClE,IAAI,SAAS,WAAW,aAAa,SACnC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,sBAAsB,yBAAyB;GAEvF,OAAO,kBAAkB;IACvB;IACA,iBAAiB,aAAa,OAAO,IAAI,KAAK,yBAAyB,KAAK,CAAC,CAAC;IAC9E,yBAAyB,OAAO,IAAI,KAAK,aAAa,KAAK,CAAC;IAC5D,UAAU,KAAK,IAAI;GACrB,CAAC;EACH,UAAU;GACR,IAAI,KAAK,WAAW;GACpB,IAAI,KAAK,uBAAuB;GAChC,IAAI,KAAK,kBAAkB;GAC3B,IAAI,KAAK,OAAO;EAClB;CACF;AACF;AAEA,SAAS,gBAAgB,KAAwC;CAC/D,OAAO;EACL,iBAAiB;EACjB,4BAA4B;EAC5B,yBAAyB;EACzB,oBAAoB;EACpB,0BAA0B;EAC1B,aAAa;EACb,kBAAkB;CACpB;AACF;;;ACzKA,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAE5B,SAAgB,iBAAiB,MAA2B;CAC1D,OAAO,SAAS,gBAAgB,mBAAmB;AACrD;AAEA,SAAgB,eAAe,QAA6B;CAC1D,IAAI,WAAW,GACb,OAAO,IAAIC,8BAAAA,YACTC,8BAAAA,gBAAgB,eAChB,uFACF;CAEF,OAAO,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,+BAA+B;AACvF;;;;;;;;ACVA,SAAgB,QAAQ,KAAuB,KAAU,OAAe,aAAa,GAAS;CAC5F,MAAM,MAAM,OAAO,KAAK;CACxB,IAAI,KAAK,KAAK,OAAO,OAAO,MAAM,WAAW,IAAI,GAAG,UAAU;CAC9D,IAAI,KAAK,KAAK,OAAO,OAAQ,OAAO,MAAO,WAAW,IAAI,GAAG,aAAa,CAAC;AAC7E;AAEA,SAAgB,QAAQ,KAAuB,KAAU,aAAa,GAAW;CAC/E,MAAM,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,UAAU,CAAC,MAAM;CAExD,QADW,OAAO,IAAI,KAAK,KAAK,OAAO,aAAa,CAAC,CAAC,MAAM,KAChD,aAAc;AAC5B;;;ACEA,MAAM,qBAAqB;AAC3B,MAAM,mBAAsD;CAC1D,GAAG;CACH,GAAG;CACH,GAAG;AACL;AACA,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AACzB,MAAM,cAAc;AACpB,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAC5B,MAAM,WAAW;AACjB,MAAM,uBAAgE;CACpE,GAAG;CACH,GAAG;CACH,GAAG;AACL;AACA,MAAM,kBAAkB;AACxB,MAAM,cAAc;AACpB,MAAM,OAAO;AAKb,MAAM,SAAS,KAAK;AACpB,MAAM,oBAAoB;AAC1B,MAAM,wBAAwB;AAC9B,MAAM,kBAAkB;;AAExB,MAAM,+BAA+B;AACrC,MAAM,0BACJ;AAEF,SAAS,SACP,SACA,MACe;CACf,OAAO,gBAAgB,QAAQ,KAAK,MAAM,EAAE;AAC9C;AAEA,SAAS,aAAa,OAA0C;CAC9D,OAAO,UAAU,KAAK,UAAU,KAAK,UAAU;AACjD;AAEA,SAAgB,cACd,SACA,OACA,OACyC;CACzC,MAAM,EAAE,IAAI,QAAQ;CACpB,OAAO,YAAY,KAAK,KAAgB,QAAQ;EAC9C,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,KAAK,KAAK,GAAG,IAAA,CAAa;EAC9D,IAAI,CAAC,GAAG,qBAAqB,OAAO,OAAO,GAAG,GAAG,OAAO;EACxD,OAAO;GACL,QAAQ,KAAK,KAAK,CAAC;GACnB,QAAQ,KAAK,KAAA,CAAc;GAC3B,QAAQ,KAAK,KAAK,EAAa;GAC/B,QAAQ,KAAK,KAAK,EAAa;EACjC;CACF,CAAC;AACH;AAEA,SAAS,SACP,SACA,OACA,OACA,OACsB;CACtB,MAAM,EAAE,OAAO;CACf,MAAM,OACJ,UAAU,cACN,GAAG,sBAAsB,OAAO,KAAK,IACrC,GAAG,0BAA0B,OAAO,KAAK;CAC/C,MAAM,SAAS,qBAAqB;CACpC,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,SAAmB,CAAC;CAC1B,MAAM,QAAQ,GAAG,0BAA0B,OAAO,OAAO,KAAK;CAC9D,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,OAAO,KACL,SAAS,UAAU,KAAK,QACtB,GAAG,uBAAuB,OAAO,OAAO,OAAO,GAAG,KAAK,GAAG,CAC5D,KAAK,EACP;CAEF,MAAM,OAAsB;EAAE;EAAQ;CAAO;CAC7C,IAAI,UAAU,aAAa;EACzB,MAAM,aAAa,GAAG,0BAA0B,OAAO,KAAK;EAC5D,IAAI,aAAa,UAAU,GAAG,KAAK,aAAa;CAClD;CACA,OAAO;AACT;AAEA,SAAS,cACP,SACA,OACA,OAC2B;CAC3B,MAAM,EAAE,OAAO;CACf,IAAI,CAAC,GAAG,qBAAqB,OAAO,KAAK,GAAG,OAAO;CACnD,MAAM,gBAAgB,GAAG,kCAAkC,OAAO,KAAK,MAAM;CAC7E,MAAM,eAAe,GAAG,iCAAiC,OAAO,KAAK,MAAM;CAC3E,MAAM,UAAU,GAAG,4BAA4B,OAAO,KAAK;CAC3D,MAAM,MAAM,GAAG,wBAAwB,OAAO,KAAK;CACnD,MAAM,QAAQ,UAA4B;EACxC,MAAM,QAAQ,GAAG,8BAA8B,OAAO,OAAO,KAAK;EAClE,MAAM,QAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KACzB,MAAM,KACJ,SAAS,UAAU,KAAK,QACtB,GAAG,2BAA2B,OAAO,OAAO,OAAO,GAAG,KAAK,GAAG,CAChE,KAAK,EACP;EAEF,OAAO;CACT;CACA,OAAO;EACL;EACA;EACA,SAAS,UAAU,IAAI,UAAU;EACjC,MAAM,eAAe,YAAY,KAAK,OAAO,KAAK,OAAO,IAAK,MAAwB;EACtF,QAAQ,SAAS,UAAU,KAAK,QAAQ,GAAG,2BAA2B,OAAO,OAAO,KAAK,GAAG,CAAC;EAC7F,YAAY,KAAK,iBAAiB;EAClC,eAAe,KAAK,qBAAqB;EACzC,SAAS,KAAK,eAAe;EAC7B,sBACG,gBAAgB,6BAA6B,MAC5C,gBAAgB,UAAU,KAAK,UAAU;CAC/C;AACF;;AAGA,SAAgB,wBAAwB,SAA2B,OAA4B;CAC7F,MAAM,EAAE,OAAO;CACf,MAAM,QAAQ,GAAG,cAAc,KAAK;CACpC,MAAM,MAAsB,CAAC;CAC7B,MAAM,OAAO,GAAW,QACtB,SAAS,UAAU,KAAK,QAAQ,GAAG,kBAAkB,OAAO,GAAG,KAAK,KAAK,GAAG,CAAC;CAC/E,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;EAC9B,MAAM,SAAS,GAAG,iBAAiB,OAAO,CAAC;EAC3C,MAAM,eAAe,GAAG,wBAAwB,OAAO,CAAC;EACxD,MAAM,gBAAgB,GAAG,yBAAyB,OAAO,CAAC;EAC1D,MAAM,SAAS,GAAG,4BAA4B,OAAO,CAAC;EACtD,IAAI,KAAK;GACP,OAAO;GACP,OAAO;IAAE,MAAM;IAAgB,mBAAmB,GAAG,uBAAuB,OAAO,CAAC;GAAE;GACtF,WAAW,SAAS,UAAU,KAAK,QAAQ,GAAG,qBAAqB,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK;GAC3F,QACE,eAAe,IACX;IACE,mBAAmB;IACnB,kBAAkB,GAAG,4BAA4B,OAAO,CAAC;GAC3D,IACA;GACN;GACA,MAAM,GAAG,gBAAgB,OAAO,CAAC,MAAM,qBAAqB,cAAc;GAC1E,QAAQ,IAAI,GAAG,aAAa;GAC5B,WAAW,IAAI,GAAG,gBAAgB;GAClC,WAAW,SAAS,cAAc,SAAS,OAAO,CAAC,IAAI;GACvD,cAAc,SAAS,KAAK,IAAI,GAAG,GAAG,oBAAoB,OAAO,GAAGC,yBAAAA,UAAU,CAAC,CAAC,IAAI;GACpF,UAAU,SAAU,iBAAiB,GAAG,oBAAoB,OAAO,CAAC,MAAM,cAAe;GACzF,eAAe,UAAU,iBAAiB,IAAI,gBAAgB;GAC9D,QAAQ;IACN,MAAM,IAAI,GAAG,WAAW;IACxB,QAAQ,IAAI,GAAG,aAAa;IAC5B,UAAU,IAAI,GAAG,eAAe;IAChC,aAAa,IAAI,GAAG,mBAAmB;IACvC,aAAa,IAAI,GAAG,QAAQ;GAC9B;GACA,QAAQ,aAAa,MAAM,IAAI,SAAS;GACxC,sBAAsB,GAAG,+BAA+B,OAAO,CAAC;GAChE,UAAU,SAAS,SAAS,OAAO,GAAG,eAAe;GACrD,MAAM,SAAS,SAAS,OAAO,GAAG,WAAW;GAC7C,WAAW,cAAc,SAAS,OAAO,CAAC;EAC5C,CAAC;CACH;CACA,OAAO;AACT;;AAGA,SAAgB,eAAe,SAA2B,OAAY,OAA2B;CAC/F,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,SAAS,GAAG,oBAAoB,OAAO,OAAOA,yBAAAA,UAAU,CAAC;CAC/D,IAAI,UAAU,GACZ,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,wDACF;CAEF,OAAO,YAAY,KAAK,SAAS,QAAQ;EAEvC,IADgB,GAAG,oBAAoB,OAAO,OAAO,KAAK,MAChD,MAAM,QACd,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,mCAAmC;EAEpF,MAAM,MAAM,IAAI,WAAW,MAAM;EACjC,IAAI,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC;EAClC,OAAO;CACT,CAAC;AACH;;AAGA,SAAgB,cACd,SACA,QACA,YACe;CACf,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,QAAQ,GAAG,yBAAyB,MAAM;CAChD,MAAM,YAA2B,CAAC;CAClC,IAAI,SAAS,GAAG,OAAO;CACvB,aAAa,KAAK,CAAA,GAAA,CAAqB,IAAI,CAAC,QAAQ,aAAa;EAC/D,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,QAAQ,KAAK,QAAQ,CAAC;GACtB,QAAQ,KAAK,SAAS,CAAC;GACvB,IAAI,CAAC,GAAG,oBAAoB,QAAQ,GAAG,QAAQ,OAAO,GACpD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,2BAA2B,GAAG;GAE/E,MAAM,WAAW,WAAW,MAAM,MAAM,EAAE,kBAAkB,CAAC;GAC7D,UAAU,KAAK;IACb,OAAO;IACP,KAAK,QAAQ,KAAK,MAAM;IACxB,YAAY,QAAQ,KAAK,OAAO;IAChC,gBAAgB,WAAW,SAAS,QAAQ;GAC9C,CAAC;EACH;CACF,CAAC;CACD,OAAO;AACT;;AAGA,SAAgB,mBAAmB,SAA2B,QAAsB;CAClF,MAAM,EAAE,OAAO;CACf,OAAO,mBAAmB,SAAS,SAAS,UAAU;EACpD,MAAM,QAAQ,GAAG,cAAc,KAAK;EACpC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,iBAAiB,OAAO,CAAC,GAAG,OAAO;EAC1E,OAAO;CACT,CAAC;AACH;;AAGA,SAAgB,mBACd,SACA,QACA,MACG;CACH,MAAM,QAAQ,QAAQ,GAAG,kBAAkB,MAAM;CACjD,IAAI,UAAUF,yBAAAA,UACZ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,iCAAiC;CAElF,IAAI;EACF,OAAO,KAAK,KAAK;CACnB,UAAU;EACR,QAAQ,GAAG,mBAAmB,KAAK;CACrC;AACF;;;;;;;AAQA,SAAgB,cAAc,SAA2B,QAAgC;CACvF,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,CAAC,MAAM,UAAU,aAAa,aAAa,KAAK;EAAC;EAAG;EAAG;CAAC,IAAI,CAAC,GAAG,GAAG,OAAO;EAC9E,IAAI,KAAK,GAAG,OAAO,CAAC;EACpB,IAAI,KAAK,GAAG,OAAO,CAAC;EACpB,IAAI,KAAK,GAAG,OAAO,CAAC;EACpB,GAAG,kCAAkC,QAAQ,GAAG,GAAG,CAAC;EACpD,OAAO;GACL,OAAO,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM;GAC/B,OAAO,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM;GAC/B,OAAO,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM;EACjC;CACF,CAAC;CACD,MAAM,QAAkB,CAAC;CACzB,MAAM,YAAY,GAAG,kBAAkB,MAAM;CAC7C,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK,MAAM,KAAK,GAAG,mCAAmC,QAAQ,CAAC,CAAC;CAE/F,MAAM,SAA0B,CAAC;CACjC,MAAM,YAAY,GAAG,mBAAmB,MAAM;CAC9C,IAAI,cAAcF,yBAAAA,UAChB,IAAI;EACF,MAAM,WAAW,iBAAiB,SAAS,WAAW,MAAM;EAC5D,KAAK,MAAM,KAAK,SAAS,QACvB,OAAO,KAAK;GACV,cAAc,EAAE;GAChB,MAAM,EAAE;GACR,QAAQ,EAAE;GACV,SAAS,EAAE,QAAQ,KAAK,MAAM,EAAE,iBAAiB;GACjD,OAAO,EAAE,MAAM;EACjB,CAAC;CAEL,UAAU;EACR,GAAG,oBAAoB,SAAS;CAClC;CAKF,OAAO;EAAE;EAAM;EAAU;EAAW;EAAO;EAAQ,YAHhC,mBAAmB,SAAS,SAAS,UACtD,wBAAwB,SAAS,KAAK,CAEoB;CAAE;AAChE;;;;;;;;;AChTA,MAAMG,0BAAQ,IAAI,QAA8C;AAEhE,SAAgB,sBAAsB,SAA2B,SAA+B;CAC9F,MAAM,MAAM,QAAQ,YAAY;CAChC,MAAM,MAAMA,QAAM,IAAI,OAAO;CAC7B,IAAI,OAAO,IAAI,QAAQ,KACrB,OAAO,IAAI;CAEb,IAAI,KAAK;EACP,QAAQ,GAAG,mBAAmB,IAAI,GAAG;EACrC,QAAM,OAAO,OAAO;CACtB;CACA,MAAM,MAAM,QAAQ,GAAG,kBAAkB,QAAQ,cAAc,CAAC;CAChE,IAAI,QAAQC,yBAAAA,UACV,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,iCAAiC;CAElF,QAAM,IAAI,SAAS;EAAE;EAAK;CAAI,CAAC;CAC/B,OAAO;AACT;AAEA,SAAgB,sBAAsB,SAA2B,SAAgC;CAC/F,MAAM,MAAMH,QAAM,IAAI,OAAO;CAC7B,IAAI,CAAC,KACH;CAEF,QAAQ,GAAG,mBAAmB,IAAI,GAAG;CACrC,QAAM,OAAO,OAAO;AACtB;;;ACpBA,MAAa,cAA+C;CAC1D,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;AACV;AACA,MAAM,gBAAiD;CACrD,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;AACV;;;;;;;;AASA,IAAa,kBAAb,MAA6B;CAC3B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,eAAkC;EAChC,MAAM,QAAQ,sBAAsB,KAAK,SAAS,KAAK,OAAO;EAC9D,MAAM,aAAa,KAAK,QAAQ,GAAG,6BAA6B,KAAK;EACrE,MAAM,aAAa,wBAAwB,KAAK,SAAS,KAAK;EAI9D,OAAO;GAAE;GAAY,WAHH,aACd,cAAc,KAAK,SAAS,KAAK,QAAQ,cAAc,GAAG,UAAU,IACpE,CAAC;GAC2B;GAAY,aAAA,GAAA,8BAAA,iBAAA,CAA6B,UAAU;EAAE;CACvF;;CAGA,iBAAqC;EACnC,MAAM,QAAQ,sBAAsB,KAAK,SAAS,KAAK,OAAO;EAC9D,QAAA,GAAA,8BAAA,iBAAA,CAAwB,wBAAwB,KAAK,SAAS,KAAK,CAAC;CACtE;;CAGA,aAAa,KAAgC;EAC3C,MAAM,QAAQ,sBAAsB,KAAK,SAAS,KAAK,OAAO;EAC9D,MAAM,QAAQ,KAAK,mBAAmB,OAAO,GAAG;EAChD,OAAO,eAAe,KAAK,SAAS,OAAO,KAAK,CAAC,CAAC;CACpD;;CAGA,OAAO,KAAmB,WAAyC;EACjE,MAAM,QAAQ,sBAAsB,KAAK,SAAS,KAAK,OAAO;EAC9D,MAAM,QAAQ,KAAK,mBAAmB,OAAO,GAAG;EAChD,MAAM,QAAQ,cAAc,KAAK,SAAS,OAAO,KAAK;EACtD,IAAI,CAAC,OACH,MAAM,IAAII,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,oCAAoC;EAEtF,OAAO,KAAK,YAAY,OAAO,SAAS;CAC1C;;CAGA,cAAc,eAAoC;EAChD,MAAM,WAAW,KAAK,aAAa;EACnC,IAAI,CAAC,SAAS,YACZ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,6BAA6B;EAEnF,MAAM,WAAW,SAAS,UAAU;EACpC,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,eAAe,eAAe;EAEhF,OAAO,KAAK,gBAAgB,GAAG,SAAS,GAAG;CAC7C;;CAGA,aAAa,KAKX;EACA,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,sBAAsB,KAAK,SAAS,KAAK,OAAO;EAC9D,MAAM,QAAQ,KAAK,QAAQ,OAAO,GAAG;EACrC,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,IAAI,SAAS,iBACT,qCAAqC,IAAI,sBACzC,+BAA+B,IAAI,KAAK,EAC9C;EAEF,MAAM,eAAe,GAAG,wBAAwB,OAAO,KAAK;EAC5D,OAAO;GACL;GACA,mBAAmB,GAAG,uBAAuB,OAAO,KAAK;GACzD,QAAQ,GAAG,iBAAiB,OAAO,KAAK;GACxC,QACE,eAAe,IACX;IACE,mBAAmB;IACnB,kBAAkB,GAAG,4BAA4B,OAAO,KAAK;GAC/D,IACA;EACR;CACF;;CAGA,4BAA4B,mBAAyC;EAEnE,MAAM,QADW,KAAK,aACD,CAAC,CAAC,WAAW,MAC/B,MAAM,EAAE,MAAM,SAAS,kBAAkB,EAAE,MAAM,sBAAsB,iBAC1E;EACA,IAAI,CAAC,OACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,qCAAqC,mBACvC;EAEF,OAAO;CACT;;CAGA,cAA2B;EACzB,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG,2BAA2B,KAAK,QAAQ,cAAc,CAAC,CAAC;EAC5F,OAAO,KAAK,gBAAgB,GAAG,IAAI;CACrC;;;;;;CAOA,UAA2B;EACzB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,aAAa,OAAO,GAAG,yBAAyB,MAAM,CAAC;EAC7D,IAAI,cAAc,GAChB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,8BAA8B;EAElF,IAAI,KAAK,QAAQ,SAAS,SAOxB,OAAO;GAAE,QANM,YAAY,KAAK,KAAK,QAAQ;IAC3C,IAAI,CAAC,GAAG,wBAAwB,QAAQ,GAAG,GACzC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,8BAA8B;IAE/E,OAAO,MAAM,IAAI,UAAU,KAAK,EAAE,CAAC;GACrC,CACc;GAAG;EAAW;EAE9B,MAAM,SAAS,KAAK,QAAQ,kBAAkB;EAC9C,IAAI,QAAQ,OAAO;GAAE,QAAQ;GAAQ;EAAW;EAEhD,MAAM,SAAS,MAAM,IADF,WAAW,KAAK,YAAY;GAAC;GAAG;GAAY;GAAY;EAAC,GAAG,QAAQ,CAC7D,CAAC;EAC3B,KAAK,QAAQ,oBAAoB,MAAM;EACvC,OAAO;GAAE;GAAQ;EAAW;CAC9B;CAIA,YACE,OACA,WACa;EACb,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,YAAY,cAAc;EAChC,OAAO,aACL,KACA;GAAC;GAAe;;EAAoB,IACnC,CAAC,UAAU,QAAQ,YAAY;GAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,KAAK,UAAU,MAAM,IAAI,IAAA,CAAa;GAG1E,QAAQ,KAAK,QAAQ,SAAS;GAQ9B,IAAI,CAPO,GAAG,wBACZ,QACA,UACA,YAAY,YACZ,QACA,MAEI,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,2CACF;GAEF,MAAM,UAAU,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;GAC9C,OAAOC,UAAQ,IAAI,UAAU,QAAQ,OAAO,CAAC;EAC/C,CACF;CACF;;CAGA,gBAAgB,QAAgB,QAA6B;EAC3D,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,IAAI,WAAW,GAAG,uBAAO,IAAI,YAAY,CAAC;EAC1C,OAAO,YAAY,KAAK,SAAS,QAAQ;GAEvC,IADa,GAAG,wBAAwB,QAAQ,OAAO,MAAM,GAAG,KAAK,MAC9D,MAAM,QACX,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,iCAAiC;GAElF,OAAOC,UAAQ,IAAI,UAAU,KAAK,MAAM,CAAC;EAC3C,CAAC;CACH;CAEA,QAAgB,OAAY,KAA2B;EACrD,MAAM,EAAE,OAAO,KAAK;EACpB,IAAI,IAAI,SAAS,gBACf,OAAO,GAAG,8BAA8B,OAAO,IAAI,iBAAiB;EAEtE,MAAM,QAAQ,GAAG,cAAc,KAAK;EACpC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAEzB,IADa,KAAK,UAAU,KAAK,QAAQ,GAAG,qBAAqB,OAAO,GAAG,KAAK,GAAG,CAC5E,MAAM,IAAI,MAAM,OAAO;EAEhC,OAAO;CACT;CAEA,mBAA2B,OAAY,KAA2B;EAChE,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,KAAK,QAAQ,OAAO,GAAG;EACrC,IAAI,QAAQ,GACV,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,IAAI,SAAS,iBACT,qCAAqC,IAAI,sBACzC,+BAA+B,IAAI,KAAK,EAC9C;EAEF,IAAI,CAAC,GAAG,iBAAiB,OAAO,KAAK,GACnC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,+BAA+B;EAEjF,OAAO;CACT;CAEA,WAAmB,OAAY,OAAe,KAA4B;EACxE,OAAO,KAAK,UAAU,KAAK,QACzB,KAAK,QAAQ,GAAG,kBAAkB,OAAO,OAAO,KAAK,KAAK,GAAG,CAC/D;CACF;CAEA,SAAiB,MAA6D;EAC5E,OAAO,gBAAgB,KAAK,QAAQ,KAAK,MAAM,EAAE;CACnD;AACF;AAEA,SAASC,UAAQ,MAA+B;CAC9C,MAAM,SAAS,IAAI,YAAY,KAAK,UAAU;CAC9C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,IAAI;CAC/B,OAAO;AACT;AAEA,SAAS,MAAM,OAA2B;CACxC,IAAI,MAAM;CACV,KAAK,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;CAC5D,OAAO;AACT;;;;AC7QA,MAAM,oBAAoB;AAC1B,MAAM,iCAAiC;;;;;;;;;;;;;;;AAgBvC,IAAa,gBAAb,MAA2B;CACzB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;;;;;;CAaH,WAAuD;EACrD,IAAI,CAAC,KAAK,QAAQ,gBAAgB,GAChC,OAAO;GAAE,OAAO,KAAK,YAAY;GAAG,QAAQ;EAAS;EAEvD,MAAM,QAAQ,KAAK,yBAAyB,aAAa;EACzD,IAAI,MAAM,oBACR,OAAO;GAAE,OAAO,KAAK,YAAY;GAAG,QAAQ;EAAS;EAEvD,OAAO;GAAE,OAAO,MAAM;GAAO,QAAQ;EAAe;CACtD;;CAGA,cAA2B;EACzB,OAAO,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,YAAY;CACrE;;;;;;CAOA,sBAAsB,MAAoB;EACxC,MAAM,SAAS,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO;EAC7D,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG,2BAA2B,KAAK,QAAQ,cAAc,CAAC,CAAC;EAC5F,MAAM,QAAQ,IAAI,OAAO;EACzB,KAAK,QAAQ,UAAU,WAAW,IAAI;EACtC,KAAK,IAAI,SAAS,GAAG,SAAS,MAAM,UAAU,OAAO;GACnD,MAAM,SAAS,KAAK,IAAI,OAAO,OAAO,MAAM;GAC5C,KAAK,QAAQ,UAAU,YAAY,MAAM,IAAI,WAAW,OAAO,gBAAgB,QAAQ,MAAM,CAAC,CAAC;EACjG;EACA,IAAI,SAAS,GAAG,KAAK,QAAQ,UAAU,YAAY,sBAAM,IAAI,WAAW,CAAC,CAAC;CAC5E;;;;;;CAOA,eAAe,MAAoD;EACjE,IAAI,CAAC,KAAK,QAAQ,gBAAgB,GAAG;GACnC,KAAK,sBAAsB,IAAI;GAC/B,OAAO;IAAE;IAAM,QAAQ;GAAS;EAClC;EAEA,IADc,KAAK,uBAAuB,MAAM,aACxC,CAAC,CAAC,oBAAoB;GAC5B,KAAK,sBAAsB,IAAI;GAC/B,OAAO;IAAE;IAAM,QAAQ;GAAS;EAClC;EACA,OAAO;GAAE;GAAM,QAAQ;EAAe;CACxC;;CAGA,uBAAgC;EAC9B,OAAO,KAAK,QAAQ,SAAS,YAAY,KAAK,QAAQ,OAAO,MAAM,SAAS;CAC9E;CAEA,oBAA0D;EACxD,MAAM,QAAQ,KAAK,sBAAqC,KAAK;EAC7D,IAAI,MAAM,QAAQ,GAChB,MAAM,eAAe,EAAE;EAEzB,OAAO;GAAE,OAAO,MAAM;GAAO,MAAM,MAAM;EAAK;CAChD;;;;;;;;CASA,sBAAuF;EACrF,OAAO,KAAK,sBAAqC,IAAI;CACvD;;;;;;CAOA,0BAA0B,MAA2D;EACnF,KAAK,aAAa;EAClB,OAAO,KAAK,oBAAoB,MAAM,UAAU;CAClD;;CAGA,uBAAuB,MAA2D;EAChF,KAAK,aAAa;EAClB,OAAO,KAAK,oBAAoB,MAAM,OAAO;CAC/C;CAEA,oBACE,MACA,MAC6C;EAC7C,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,MAAM,aAAa,IAAI,MAAM,CAAC;EAC9B,KAAK,QAAQ,UAAU,WAAW,IAAI;EACtC,MAAM,SAAS,KAAK,QAAQ,UAAU,WAAW,IAAI;EACrD,IAAI;GACF,IAAI,KAAK,WAAW,OAAO,EAAE;GAC7B,IAAI,KAAK,YAAY,OAAO,CAAC;GAC7B,MAAM,KACJ,SAAS,aACL,GAAG,8BAA8B,KAAK,QAAQ,cAAc,GAAG,OAAO,KAAK,WAAW,UAAU,IAChG,GAAG,sBAAsB,KAAK,QAAQ,cAAc,GAAG,OAAO,KAAK,WAAW,UAAU;GAC9F,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,IAAI,CAAC,MAAM,WAAW,GACpB,MAAM,eAAe,MAAM;GAE7B,OAAO;IAAE;IAAM,kBAAkB,OAAO,IAAI,KAAK,YAAY,KAAK,CAAC,MAAM;GAAE;EAC7E,UAAU;GACR,OAAO,MAAM;GACb,IAAI,KAAK,UAAU;GACnB,IAAI,KAAK,SAAS;EACpB;CACF;CAEA,sBAA8B,WAI5B;EACA,KAAK,aAAa;EAElB,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,MAAM,aAAa,IAAI,MAAM,CAAC;EAC9B,IAAI,cAA0B;EAC9B,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,IAAI,KAAK,WAAW,OAAO,EAAE;GAC7B,IAAI,KAAK,YAAY,OAAO,CAAC;GAC7B,cAAc,YACV,GAAG,2CACD,KAAK,QAAQ,cAAc,GAC3B,SACA,WACA,UACF,IACA,GAAG,yCACD,KAAK,QAAQ,cAAc,GAC3B,SACA,SACF;GACJ,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,MAAM,mBAAmB,YAAY,OAAO,IAAI,KAAK,YAAY,KAAK,CAAC,MAAM,IAAI;GACjF,IAAI,WAAW,GACb,MAAM,eAAe,MAAM;GAE7B,IAAI,aAAa,CAAC,kBAChB,OAAO;IAAE,uBAAO,IAAI,YAAY,CAAC;IAAG,MAAM;IAAG,kBAAkB;GAAM;GAEvE,IAAI,CAAC,eAAe,QAAQ,GAC1B,MAAM,eAAe,MAAM;GAG7B,MAAM,QAAQ,IAAI,UAAU,aAAa,IAAI;GAC7C,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;IAAM;GAAiB;EACjD,UAAU;GACR,IAAI,aAAa,GAAG,gBAAgB,WAAW;GAC/C,IAAI,KAAK,UAAU;GACnB,IAAI,KAAK,SAAS;GAClB,IAAI,KAAK,OAAO;EAClB;CACF;;;;;;;CAQA,iBAAuD;EACrD,MAAM,QAAQ,KAAK,mBAAkC,KAAK;EAC1D,OAAO;GAAE,OAAO,MAAM;GAAO,MAAM,MAAM;EAAK;CAChD;;;;;;;CAQA,mBAAoF;EAClF,OAAO,KAAK,mBAAkC,IAAI;CACpD;CAEA,mBAA2B,WAIzB;EACA,KAAK,aAAa;EAElB,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,MAAM,aAAa,IAAI,MAAM,CAAC;EAC9B,IAAI,WAAuB;EAC3B,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,IAAI,KAAK,WAAW,OAAO,EAAE;GAC7B,IAAI,KAAK,YAAY,OAAO,CAAC;GAC7B,WAAW,YACP,GAAG,mCACD,KAAK,QAAQ,cAAc,GAC3B,SACA,WACA,UACF,IACA,GAAG,iCAAiC,KAAK,QAAQ,cAAc,GAAG,SAAS,SAAS;GACxF,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,MAAM,mBAAmB,YAAY,OAAO,IAAI,KAAK,YAAY,KAAK,CAAC,MAAM,IAAI;GACjF,IAAI,WAAW,GACb,MAAM,eAAe,MAAM;GAE7B,IAAI,CAAC,YAAY,QAAQ,GACvB,OAAO;IAAE,uBAAO,IAAI,YAAY,CAAC;IAAG,MAAM;IAAG;GAAiB;GAEhE,MAAM,QAAQ,IAAI,UAAU,UAAU,IAAI;GAC1C,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;IAAM;GAAiB;EACjD,UAAU;GACR,IAAI,UAAU,GAAG,gBAAgB,QAAQ;GACzC,IAAI,KAAK,UAAU;GACnB,IAAI,KAAK,SAAS;GAClB,IAAI,KAAK,OAAO;EAClB;CACF;CAEA,wBAAwB,MAAgC;EACtD,KAAK,aAAa;EAElB,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,MAAM,SAAS,KAAK,QAAQ,UAAU,WAAW,IAAI;EACrD,IAAI;GACF,IAAI,KAAK,WAAW,OAAO,EAAE;GAC7B,MAAM,KAAK,GAAG,4BACZ,KAAK,QAAQ,cAAc,GAC3B,OAAO,KACP,SACF;GACA,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,IAAI,CAAC,MAAM,WAAW,GACpB,MAAM,eAAe,MAAM;GAE7B,OAAO,EAAE,KAAK;EAChB,UAAU;GACR,OAAO,MAAM;GACb,IAAI,KAAK,SAAS;EACpB;CACF;CAEA,uBAAuB,MAAyD;EAC9E,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,IAAI,SAAqB;EACzB,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAK1B,SAAS,GAAG,+BACV,KAAK,QAAQ,cAAc,GAC3B,iBAAiB,IAAI,GACrB,OACF;GACA,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,IAAI,CAAC,UAAU,QAAQ,GACrB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;GAGhF,MAAM,QAAQ,IAAI,UAAU,QAAQ,IAAI;GACxC,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;GAAK;EAC/B,UAAU;GACR,IAAI,QAAQ,GAAG,gBAAgB,MAAM;GACrC,IAAI,KAAK,OAAO;EAClB;CACF;;;;;;;;CASA,yBAAyB,MAIvB;EACA,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,UAAU,IAAI,MAAM,CAAC;EAC3B,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,IAAI,SAAqB;EACzB,IAAI;GACF,IAAI,KAAK,SAAS,OAAO,CAAC;GAC1B,IAAI,KAAK,WAAW,OAAO,CAAC;GAC5B,SAAS,GAAG,iCACV,KAAK,QAAQ,cAAc,GAC3B,iBAAiB,IAAI,GACrB,GACA,SACA,SACF;GACA,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,IAAI,WAAW,gCACb,OAAO;IAAE,uBAAO,IAAI,YAAY,CAAC;IAAG,MAAM;IAAG,oBAAoB;GAAK;GAExE,MAAM,OAAO,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;GAC5C,IAAI,CAAC,UAAU,QAAQ,KAAK,WAAW,mBACrC,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;GAEhF,MAAM,QAAQ,IAAI,UAAU,QAAQ,IAAI;GACxC,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;GAC/C,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,KAAK;GAChC,OAAO;IAAE,OAAO;IAAQ;IAAM,oBAAoB;GAAM;EAC1D,UAAU;GACR,IAAI,QAAQ,GAAG,gBAAgB,MAAM;GACrC,IAAI,KAAK,SAAS;GAClB,IAAI,KAAK,OAAO;EAClB;CACF;CAEA,qBAAqB,MAAc,MAAqC;EACtE,MAAM,SAAS,KAAK,QAAQ,UAAU,WAAW,IAAI;EACrD,IAAI;GAQF,IAAI,CALO,KAAK,QAAQ,GAAG,gBACzB,KAAK,QAAQ,cAAc,GAC3B,OAAO,KACP,iBAAiB,IAAI,CAEjB,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;GAEhF,OAAO,EAAE,KAAK;EAChB,UAAU;GACR,OAAO,MAAM;EACf;CACF;;;;;;CAOA,uBAAuB,MAAc,MAAkE;EACrG,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,UAAU,WAAW,IAAI;EACrD,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,IAAI;GACF,IAAI,KAAK,WAAW,OAAO,CAAC;GAC5B,MAAM,KAAK,GAAG,kBACZ,KAAK,QAAQ,cAAc,GAC3B,OAAO,KACP,iBAAiB,IAAI,GACrB,SACF;GACA,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;GAChD,IAAI,CAAC,MAAM,WAAW,GACpB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,eAAe,yBAAyB;GAEhF,OAAO;IAAE;IAAM,oBAAoB,WAAW;GAA+B;EAC/E,UAAU;GACR,IAAI,KAAK,SAAS;GAClB,OAAO,MAAM;EACf;CACF;CAEA,eAA6B;EAC3B,IAAI,KAAK,QAAQ,SAAS,SACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;CAEvF;AACF;;;ACvYA,SAAS,QAAQ,MAA8B;CAC7C,MAAM,MAAM,IAAI,WAAW,KAAK,UAAU;CAC1C,IAAI,IAAI,IAAI;CACZ,OAAO;AACT;;AAGA,SAAS,eACP,SACA,SACA,YACA,cACA,YACiC;CACjC,MAAM,EAAE,IAAI,QAAQ;CACpB,OAAO,aAAa,KAAK;EAAC;;;CAAmC,IAAI,CAAC,UAAU,OAAO,WAAW;EAC5F,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,KAAK,UAAU,GAAG,IAAA,CAAa;EACnE,QAAQ,KAAK,OAAO,CAAC;EACrB,QAAQ,KAAK,OAAO,CAAC;EAUrB,IAAI,CATO,GAAG,iBACZ,SACA,OAAO,UAAU,GACjB,OAAO,YAAY,GACnB,OAAO,UAAU,GACjB,UACA,OACA,KAEI,GACJ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;EAEvF,OAAO;GACL,WAAW;IACT,QAAQ,KAAK,UAAU,CAAC;IACxB,QAAQ,KAAK,UAAA,CAAmB;IAChC,QAAQ,KAAK,UAAU,EAAa;IACpC,QAAQ,KAAK,UAAU,EAAa;GACtC;GACA,gBAAgB,QAAQ,KAAK,KAAK;GAClC,mBAAmB,QAAQ,KAAK,KAAK;EACvC;CACF,CAAC;AACH;;AAGA,SAAS,oBACP,SACA,QACA,cACA,cACA,QACA,KACM;CACN,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,SAAS,IAAI,MAAM,IAAI,UAAU;CACvC,IAAI;EACF,IAAI,WAAW,QAAQ,GAAG;EAS1B,IAAI,CARO,GAAG,sBACZ,QACA,OAAO,YAAY,GACnB,OAAO,OAAO,iBAAiB,YAAY,GAC3C,OAAO,OAAO,iBAAiB,GAC/B,QACA,IAAI,UAEA,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,gEACF;CAEJ,UAAU;EACR,IAAI,KAAK,MAAM;CACjB;AACF;;;;;;AAOA,SAAgB,sBACd,SACA,MACA,MACA,KACM;CACN,MAAM,EAAE,QAAQ;CAChB,MAAM,OAAO,QAAQ,WAAW,UAAU,MAAM,KAAK,YAAY,KAAK,YAAY,CAAC;CACnF,IACE,KAAK,eAAe,KAAK,YAAY,KACrC,KAAK,OAAO,MACZ,KAAK,KAAK,aAAa,OAAO,IAE9B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gEACF;CAEF,MAAM,UAAU,IAAI,MAAM,KAAK,UAAU;CACzC,IAAI;EACF,IAAI,WAAW,SAAS,IAAI;EAC5B,oBACE,SACA,SACA,KAAK,YACL,KAAK,YACL;GACE,WAAW;IAAC;IAAG;IAAG;IAAG;GAAC;GACtB,gBAAgB,KAAK,aAAa;GAClC,mBAAmB,KAAK;GACxB,wBAAQ,IAAI,WAAW;EACzB,GACA,GACF;EACA,QAAQ,UAAU,WAAW,MAAM,KAAK,YAAY,IAAI,UAAU,SAAS,KAAK,UAAU,CAAC;CAC7F,UAAU;EACR,IAAI,KAAK,OAAO;CAClB;AACF;AAIA,IAAa,uBAAb,MAA4D;CAC1D,YACE,SACA,eACA;EAFiB,KAAA,UAAA;EACA,KAAA,gBAAA;CAChB;CAEH,KAAK,iBAAsB,WAAmC;EAC5D,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,OAAO,aAAa,KAAK;;;;EAAgC,IAAI,CAAC,SAAS,QAAQ,YAAY;GACzF,QAAQ,KAAK,SAAS,CAAC;GACvB,QAAQ,KAAK,QAAQ,CAAC;GACtB,QAAQ,KAAK,QAAQ,CAAC;GACtB,MAAM,SAAS,GAAG,mCAChB,iBACA,WACA,SACA,QACA,MACF;GACA,IAAI,CAAC,QACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;GAEvF,IAAI;IACF,MAAM,OAAO,QAAQ,KAAK,OAAO;IACjC,OAAO;KACL,MAAM;KACN,OAAO,QAAQ,IAAI,UAAU,QAAQ,IAAI,CAAC;KAC1C;KACA,cAAc,QAAQ,KAAK,MAAM;KACjC,cAAc,QAAQ,KAAK,MAAM;IACnC;GACF,UAAU;IACR,GAAG,gBAAgB,MAAM;GAC3B;EACF,CAAC;CACH;CAEA,KAAK,OAAuB,WAA8D;EACxF,IAAI,MAAM,SAAS,UACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wBAAwB;EAC5E,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,UAAU;EAC/C,IAAI;GACF,IAAI,WAAW,QAAQ,MAAM,KAAK;GAClC,OAAO,aACL,KACA;IAAC;;;IAAqC;;GAAa,IAClD,CAAC,UAAU,OAAO,OAAO,WAAW,YAAY;IAC/C,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,KAAK,UAAU,GAAG,IAAA,CAAa;IACnE,QAAQ,KAAK,OAAO,CAAC;IACrB,QAAQ,KAAK,OAAO,CAAC;IACrB,QAAQ,KAAK,QAAQ,EAAE;IAavB,IAAI,CAZO,GAAG,aACZ,QACA,OAAO,MAAM,MAAM,UAAU,GAC7B,OAAO,MAAM,YAAY,GACzB,OAAO,MAAM,YAAY,GACzB,YAAY,YACZ,UACA,OACA,OACA,WACA,MAEI,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;IAEvF,MAAM,QAAQ,QAAQ,IAAI,UAAU,QAAQ,MAAM,MAAM,UAAU,CAAC;IACnE,MAAM,eAAe,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;IACnD,OAAO;KACL,WAAW;MACT,QAAQ,KAAK,UAAU,CAAC;MACxB,QAAQ,KAAK,UAAA,CAAmB;MAChC,QAAQ,KAAK,UAAU,EAAa;MACpC,QAAQ,KAAK,UAAU,EAAa;KACtC;KACA,gBAAgB,QAAQ,KAAK,KAAK;KAClC,mBAAmB,QAAQ,KAAK,KAAK;KACrC,QAAQ,QAAQ,IAAI,UAAU,WAAW,YAAY,CAAC;IACxD;GACF,CACF;EACF,UAAU;GACR,IAAI,KAAK,MAAM;EACjB;CACF;CAEA,cAAc,OAAuB,QAAyB,KAAuB;EACnF,IAAI,MAAM,SAAS,UACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wBAAwB;EAC5E,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,UAAU;EAC/C,IAAI;GACF,IAAI,WAAW,QAAQ,MAAM,KAAK;GAClC,oBAAoB,KAAK,SAAS,QAAQ,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG;GAChF,MAAM,QAAQ,QAAQ,IAAI,UAAU,QAAQ,MAAM,MAAM,UAAU,CAAC;EACrE,UAAU;GACR,IAAI,KAAK,MAAM;EACjB;CACF;CAEA,WAAW,OAAuB,UAA4C;EAC5E,IAAI,MAAM,SAAS,UACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wBAAwB;EAC5E,MAAM,OAAO,KAAK,cAAc,kBAAkB;GAChD,KAAK,UAAU,aAAa;GAC5B,OAAO,MAAM;GACb;EACF,CAAC;EACD,OAAO,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,QAAQ;CAC1E;CAEA,UAAgB,CAEhB;AACF;;;;;;;;AAWA,IAAa,qBAAb,MAA0D;CACxD,YACE,SACA,eACA,UACA,gBAGc,sBACd;EAPiB,KAAA,UAAA;EACA,KAAA,gBAAA;EACA,KAAA,WAAA;EACA,KAAA,gBAAA;CAIhB;CAEH,KAAK,iBAAsB,WAAmB,WAAmC;EAC/E,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,OAAO,KAAK,cAAc,KAAK,UAAU,SAAS;EACxD,KAAK,QAAQ,UAAU,WAAW,IAAI;EACtC,MAAM,SAAS,KAAK,QAAQ,UAAU,WAAW,IAAI;EACrD,IAAI;GACF,OAAO,aAAa,KAAK;;;;GAAgC,IAAI,CAAC,SAAS,QAAQ,YAAY;IACzF,QAAQ,KAAK,SAAS,CAAC;IACvB,QAAQ,KAAK,QAAQ,CAAC;IACtB,QAAQ,KAAK,QAAQ,CAAC;IAStB,IAAI,CARO,GAAG,sBACZ,iBACA,WACA,OAAO,KACP,SACA,QACA,MAEI,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sCAAsC;IAEvF,OAAO;KACL,MAAM;KACN;KACA,MAAM,QAAQ,KAAK,OAAO;KAC1B,cAAc,QAAQ,KAAK,MAAM;KACjC,cAAc,QAAQ,KAAK,MAAM;IACnC;GACF,CAAC;EACH,SAAS,OAAO;GACd,OAAO,MAAM;GACb,KAAK,QAAQ,UAAU,WAAW,IAAI;GACtC,MAAM;EACR,UAAU;GACR,OAAO,MAAM;EACf;CACF;CAEA,KAAK,OAAuB,WAA8D;EACxF,IAAI,MAAM,SAAS,QACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAC1E,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,OAAO,KAAK,QAAQ,WAAW,UACnC,MAAM,MACN,MAAM,cACN,MAAM,YACR;EACA,IAAI,KAAK,eAAe,MAAM,cAC5B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,4DACF;EAEF,MAAM,UAAU,IAAI,MAAM,KAAK,UAAU;EACzC,IAAI;EACJ,IAAI;GACF,IAAI,WAAW,SAAS,IAAI;GAC5B,OAAO,eAAe,KAAK,SAAS,SAAS,KAAK,YAAY,MAAM,cAAc,MAAM,IAAI;GAC5F,KAAK,QAAQ,UAAU,WACrB,MAAM,MACN,MAAM,cACN,IAAI,UAAU,SAAS,KAAK,UAAU,CACxC;EACF,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;EACA,MAAM,SAAS,KAAK,QAAQ,WAAW,aAAa,MAAM,IAAI;EAC9D,IAAI;GACF,MAAM,SAAS,aACb,KACA;IAAC;IAAe;;GAAa,IAC5B,CAAC,UAAU,WAAW,YAAY;IACjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,KAAK,UAAU,KAAK,UAAU,IAAI,IAAA,CAAa;IACnF,QAAQ,KAAK,QAAQ,EAAE;IAQvB,IAAI,CAPO,GAAG,wBACZ,OAAO,KACP,UACA,YAAY,YACZ,WACA,MAEI,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,6CACF;IAEF,OAAO,QAAQ,IAAI,UAAU,WAAW,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC,CAAC,CAAC;GAC1E,CACF;GACA,OAAO;IAAE,GAAG;IAAM;GAAO;EAC3B,UAAU;GACR,OAAO,MAAM;EACf;CACF;CAEA,cAAc,OAAuB,QAAyB,KAAuB;EACnF,IAAI,MAAM,SAAS,QACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAC1E,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,OAAO,KAAK,QAAQ,WAAW,UACnC,MAAM,MACN,MAAM,cACN,MAAM,YACR;EACA,MAAM,UAAU,IAAI,MAAM,KAAK,UAAU;EACzC,IAAI;GACF,IAAI,WAAW,SAAS,IAAI;GAC5B,oBAAoB,KAAK,SAAS,SAAS,KAAK,YAAY,MAAM,cAAc,QAAQ,GAAG;GAC3F,KAAK,QAAQ,UAAU,WACrB,MAAM,MACN,MAAM,cACN,IAAI,UAAU,SAAS,KAAK,UAAU,CACxC;EACF,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;CACF;CAEA,WAAW,OAAuB,UAA4C;EAC5E,IAAI,MAAM,SAAS,QACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAC1E,MAAM,OAAO,KAAK,cAAc,gBAAgB;GAC9C,KAAK,UAAU,MAAM;GACrB,MAAM,MAAM;GACZ;EACF,CAAC;EACD,OAAO,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,QAAQ;CAC1E;CAEA,QAAQ,OAA6B;EACnC,IAAI,MAAM,SAAS,QAAQ,KAAK,QAAQ,UAAU,WAAW,MAAM,IAAI;CACzE;AACF;;AAGA,SAAgB,qBAAqB,UAAkB,WAA2B;CAChF,OAAO,GAAG,SAAS,WAAW,UAAU;AAC1C;;;;;;AAOA,SAAgB,YAAY,UAAkB,KAAa,IAAY,KAAqB;CAC1F,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,GAAG,GAAG;AACrC;;;;AC5bA,MAAM,cAAc;;;;;;;;;;;;;AAcpB,SAAgB,qBACd,SACA,QACA,QACA,KACA,WACM;CACN,MAAM,EAAE,KAAK,OAAO;CACpB,MAAM,QAAQ,IAAI,WAAW;CAC7B,IAAI;EACF,MAAM,UAAU,GAAG,+BAA+B,QAAQ,OAAO,gBAAgB;EACjF,IAAI,CAAC,SACH,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,qCAAqC;EAEvF,MAAM,WAAW,GAAG,eAAe,OAAO,CAAC;EAC3C,MAAM,WAAW,GAAG,gCAAgC,SAAS,OAAO,iBAAiB;EACrF,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,0CAA0C;EAE5F,MAAM,WAAW,GAAG,oBAAoB,QAAQ,CAAC;EACjD,MAAM,UAAU,IAAI,MAAM,IAAI,UAAU;EACxC,MAAM,WAAW,IAAI,KAAK,OAAO,CAAC;EAClC,IAAI,WAAW,SAAS,GAAG;EAC3B,MAAM,aAAa,GAAG,uBAAuB,SAAS,IAAI,YAAY,EAAE;EACxE,IAAI,CAAC,YACH,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,wCAAwC;EAE9F,MAAM,WAAW,GAAG,mBAAmB,UAAU,CAAC;EAClD,IAAI,CAAC,GAAG,gCAAgC,UAAU,YAAY,SAAS,GACrE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDACF;EAEF,IAAI,CAAC,GAAG,iCAAiC,UAAU,WAAW,GAC5D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,yDACF;CAEJ,UAAU;EACR,MAAM,MAAM;CACd;AACF;;;;;;;;;;;;;ACtCA,SAAgB,sBACd,SACA,QACA,OACA,UACc;CACd,MAAM,UAAU,QACd,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,oBAAoB,KAAK;CAC7E,MAAM,aAAa,wBAAwB,SAAS,KAAK;CACzD,MAAM,YAAY,WAAW,MAC1B,MACC,EAAE,MAAM,SAAS,kBAAkB,EAAE,MAAM,sBAAsB,SAAS,iBAC9E;CACA,IAAI,CAAC,WAAW,MAAM,OAAO,0BAA0B;CACvD,IAAI,CAAC,UAAU,UAAU,UAAU,aAAa,oBAAoB,CAAC,UAAU,WAC7E,MAAM,OAAO,sDAAsD;CAErE,IAAI,CAAC,UAAU,UAAU,WAAW,SAAS,SAAS,GACpD,MAAM,OACJ,qBAAqB,UAAU,UAAU,KAAK,GAAG,EAAE,WAAW,SAAS,UAAU,KAAK,GAAG,EAAE,aAC7F;CAEF,IAAI,CAAC,QAAQ,GAAG,6BAA6B,KAAK,GAChD,MAAM,OAAO,qCAAqC;CAEpD,MAAM,YAAY,cAAc,SAAS,QAAQ,UAAU;CAC3D,IAAI,UAAU,kBAAkB,UAAU,SAAS,GACjD,MAAM,OAAO,6CAA6C;CAE5D,IAAI,CAAC,WAAW,eAAe,SAAS,OAAO,UAAU,KAAK,GAAG,SAAS,GAAG,GAC3E,MAAM,OAAO,gDAAgD;CAE/D,OAAO;AACT;AAEA,SAAgB,UACd,GACA,GACS;CACT,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;AACvE;AAEA,SAAgB,WAAW,GAAe,GAAwB;CAChE,IAAI,EAAE,eAAe,EAAE,YAAY,OAAO;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,EAAE,IAAI,OAAO;CACjE,OAAO;AACT;;;;;;;;;AC7DA,SAAgB,oBACd,SACA,QACA,MACG;CACH,MAAM,EAAE,QAAQ;CAChB,MAAM,aAAa,OAAO,KAAK,UAAU,IAAI,eAAe,KAAK,CAAC;CAClE,MAAM,SAAS,QAAQ,SAAS;CAChC,MAAM,UAAU,SAAS,IAAI;CAC7B,IAAI;EACF,OAAO,YAAY,KAAK,KAAK,IAAI,GAAG,WAAW,SAAS,OAAO,IAAI,aAAa;GAC9E,WAAW,SAAS,KAAK,MACvB,SACI,IAAI,KAAK,UAAU,OAAO,OAAO,GAAG,GAAG,IAAI,CAAC,IAC5C,IAAI,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC,CAC1C;GACA,OAAO,KAAK,UAAU,WAAW,MAAM;EACzC,CAAC;CACH,UAAU;EACR,KAAK,IAAI,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAC1C,IAAI,KAAK,WAAW,EAAE;CAE1B;AACF;;;ACIA,MAAM,iBAAiB;CACrB,uBAAuB;CACvB,uBAAuB;CACvB,gBAAgB;AAClB;AACA,MAAM,oBAAoB;CAAE,KAAK;CAAG,SAAS;CAAG,SAAS;AAAE;AAC3D,MAAM,wBAAwB;AAC9B,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB,IAAI,OAAO;AAyBrC,MAAM,gBAA+B;CACnC,OAAO;CACP,UAAU;CACV,WAAW;CACX,QAAQ;CACR,cAAc;CACd,MAAM;CACN,QAAQ;CACR,UAAU;CACV,aAAa;CACb,aAAa;CACb,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB,oBAAoB;CACpB,gBAAgB;AAClB;AACA,MAAM,eAA8B;CAClC,OAAO;CACP,UAAU;CACV,WAAW;CACX,QAAQ;CACR,cAAc;CACd,MAAM;CACN,QAAQ;CACR,UAAU;CACV,aAAa;CACb,aAAa;CACb,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB,oBAAoB;CACpB,gBAAgB;AAClB;;;;;;;;;;;;;AAcA,IAAa,mBAAb,MAA8B;CAC5B,YACE,SACA,SACA,eAEA,eACA;EALiB,KAAA,UAAA;EACA,KAAA,UAAA;EACA,KAAA,gBAAA;EAEA,KAAA,gBAAA;CAChB;CAEH,QAAQ,OAAiD;EACvD,IAAI,KAAK,QAAQ,gBACf,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,yBAAyB,KAAK,QAAQ,eAAe,SAAS,UAAU,8BAC1E;EAEF,MAAM,SAAS,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO;EAC7D,MAAM,QAAQ,OAAO,aAAa,MAAM,KAAK;EAC7C,IAAI,MAAM,QACR,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,uCACF;EAEF,IAAI,MAAM,cAAc,CAAC,MAAM,QAC7B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,0DACF;EAEF,MAAM,YAA8C,MAAM,UAAU;EACpE,IAAI,EAAE,aAAa,gBAAgB,cAAe,QAChD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,uBAAuB,UAAU,EAAE;EAG7F,MAAM,aADO,MAAM,QAAQ,iBAEhB,cAAc,iBAAkB,MAAM,aAAa;EAC9D,IAAI,EAAE,aAAa,iBACjB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,0BAA0B,UAAU,EACtC;EAEF,MAAM,eAAe,MAAM,gBAAgB;EAC3C,IACE,CAAC,OAAO,UAAU,YAAY,KAC9B,eAAe,qBACf,eAAe,mBAEf,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,uCAAuC,kBAAkB,IAAI,kBAAkB,EACjF;EAEF,MAAM,kBAAkB,KAAK,QAAQ,WAAW,OAAO,QAAQ,CAAC,CAAC,MAAM;EAEvE,MAAM,YAAY,aAAa;EAC/B,MAAM,QAAQ,IAAI,WAAW;EAC7B,IAAI;GAIF,MAAM,YAAY,KAAK,cAAc,WAAW,KAAK;GACrD,MAAM,WAAW,UAAU,MAAM,CAAC;GAGlC,MAAM,cACJ,MAAM,eACL,MAA4D;GAC/D,MAAM,cAAc,KAAK,YAAY,UAAU,QAAQ,MAAM,mBAAmB;IAC9E,WAAW,eAAe;IAC1B,QAAQ,YAAY;IACpB;IACA,MAAM,aAAa,QAAQ;IAC3B,QAAQ,aAAa,UAAU;IAC/B,UAAU,aAAa,YAAY;IACnC,aAAa,aAAa,eAAe;IACzC,aAAa,MAAM,eAAe;IAClC,kBAAkB,MAAM,SAAS,cAAc;IAC/C,gBAAgB,MAAM,OAAO,kBAAkB,MAAM,KAAK,UAAU;IACpE,gBAAgB,MAAM,MAAM,WAAW,QAAQ,CAAC,IAAK,MAAM,MAAM,UAAU,CAAC;IAC5E,gBAAgB,MAAM,MAAM,cAAc;GAC5C,CAAC;GACD,IAAI,gBAAgB,GAClB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,6MACF;GAEF,IAAI,MAAM,cAAc,MAAM,QAC5B,qBAAqB,KAAK,SACxB,UAAU,QACV,MAAM,QACN,MAAM,WAAW,KACjB,MAAM,WAAW,aAAa,CAChC;GAGF,MAAM,QAAQ,KAAK,SAAS;GAC5B,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,aAAa,SAAS;GACjE,IAAI;GACJ,IAAI;IACF,SAAS,MAAM,KAAK,OAAO,SAAS;GACtC,SAAS,OAAO;IACd,MAAM,QAAQ,KAAK;IACnB,MAAM;GACR;GACA,MAAM,WAA8B;IAClC;IACA,QAAQ,OAAO;IACf;IACA,WAAW,OAAO;IAClB;IACA;IACA;IACA,WAAW;GACb;GACA,KAAK,QAAQ,iBAAiB;IAC5B;IACA,mBAAmB,MAAM;IACzB;IACA,gBAAgB,OAAO;IACvB,mBAAmB,OAAO;GAC5B;GACA,OAAO;EACT,UAAU;GACR,MAAM,MAAM;EACd;CACF;CAEA,SAAS,OAAwD;EAC/D,MAAM,UAAU,KAAK,QAAQ;EAC7B,IAAI,CAAC,WAAW,QAAQ,SAAS,cAAc,MAAM,WAAW;GAC9D,MAAM,OAAO,KAAK,QAAQ;GAC1B,IAAI,QAAQ,KAAK,cAAc,MAAM,WAAW;IAC9C,IAAI,CAAC,WAAW,KAAK,KAAK,MAAM,GAAG,GACjC,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,qDACF;IAEF,OAAO;KAAE,GAAG,KAAK;KAAQ,QAAQ;IAAoB;GACvD;GACA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,uBAAuB,MAAM,UAAU,EAAE;EAC3F;EACA,IAAI,CAAC,YAAY,QAAQ,SAAS,iBAAiB,MAAM,eAAe,GACtE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,wBAChB,kEACF;EAEF,IAAI,MAAM,IAAI,eAAe,KAAK,MAAM,IAAI,OAAO,IACjD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,+BAA+B;EAEzF,IAAI,MAAM,IAAI,aAAa,QAAQ,SAAS,cAC1C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,YAAY,MAAM,IAAI,WAAW,oCAAoC,QAAQ,SAAS,aAAa,OACrG;EAGF,MAAM,QAAQ,KAAK,SAAS;EAC5B,MAAM,SAAS;GACb,WAAW,QAAQ,SAAS;GAC5B,gBAAgB,QAAQ;GACxB,mBAAmB,QAAQ;GAC3B,QAAQ,QAAQ,SAAS;EAC3B;EACA,MAAM,cAAc,QAAQ,OAAO,QAAQ,MAAM,GAAG;EACpD,MAAM,SAAS,MAAM,WAAW,QAAQ,OAAO,KAAK,QAAQ,QAAQ;EACpE,KAAK,aAAa,QAAQ;GACxB,mBAAmB,QAAQ;GAC3B,WAAW,QAAQ,SAAS;GAC5B,KAAK,MAAM;EACb,CAAC;EAGD,KAAK,QAAQ,QAAQ,MAAM;EAC3B,iBAAiB,KAAK,SAAS,KAAK,OAAO;EAC3C,sBAAsB,KAAK,SAAS,KAAK,OAAO;EAEhD,MAAM,SAAS,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO;EAC7D,MAAM,WAAW,OAAO,aAAa;EACrC,MAAM,YAAY,SAAS,WAAW,MACnC,MACC,EAAE,MAAM,SAAS,kBAAkB,EAAE,MAAM,sBAAsB,QAAQ,iBAC7E;EACA,IAAI,CAAC,WACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,iDACF;EAEF,MAAM,SAAkC;GACtC,QAAQ;GACR;GACA,SAAS,OAAO,QAAQ;GACxB,UAAU,QAAQ,SAAS;GAC3B,YAAY,SAAS;GACrB,MAAM;IACJ,eAAe,KAAK,QACjB,WAAW,CAAC,CACZ,KAAK,MAAM,KAAK,QAAQ,UAAU,EAAE,gBAAgB,CAAC;IACxD,YAAY;GACd;EACF;EACA,KAAK,QAAQ,iBAAiB;GAAE,WAAW,MAAM;GAAW,KAAK,MAAM,IAAI,MAAM;GAAG;EAAO;EAC3F,OAAO;CACT;CAEA,MAAM,WAAyC;EAC7C,MAAM,UAAU,KAAK,QAAQ;EAC7B,IAAI,WAAW,QAAQ,SAAS,cAAc,WAAW;GACvD,KAAK,QAAQ,iBAAiB;GAC9B,KAAK,SAAS,CAAC,CAAC,QAAQ,QAAQ,KAAK;GACrC,OAAO,EAAE,QAAQ,UAAU;EAC7B;EACA,IAAI,KAAK,QAAQ,gBAAgB,cAAc,WAC7C,OAAO,EAAE,QAAQ,oBAAoB;EAEvC,OAAO,EAAE,QAAQ,UAAU;CAC7B;CAIA,YACE,QACA,mBACA,MAcQ;EACR,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,SAAS,SAAS,gBAAgB;EAC9D,MAAM,QAAe,CAAC;EACtB,MAAM,QAAQ,UAA8B;GAC1C,IAAI,UAAU,MAAM,OAAOC,yBAAAA;GAC3B,MAAM,MAAM,IAAI,eAAe,KAAK;GACpC,MAAM,KAAK,GAAG;GACd,OAAO;EACT;EACA,MAAM,QAAQ,UAA8B;GAC1C,IAAI,UAAU,MAAM,OAAOA,yBAAAA;GAC3B,MAAM,MAAM,IAAI,cAAc,KAAK;GACnC,MAAM,KAAK,GAAG;GACd,OAAO;EACT;EACA,IAAI;GACF,OAAO,oBAAoB,KAAK,SAAS,KAAK,iBAAiB,WAAW,eACxE,YAAY,KAAK,OAAO,QAAQ,cAAc;IAC5C,KAAK,IAAI,MAAM,GAAG,MAAM,OAAO,OAAO,OAAO,GAAG,IAAI,KAAK,WAAW,OAAO,GAAG,GAAG;IACjF,MAAM,WAAW,QAAgB,QAAa;KAC5C,IAAI,OAAO,aAAa,GAAG,IAAI,KAAK,WAAW,OAAO,OAAO,GAAG,GAAG,MAAM;UACpE,IAAI,KAAK,WAAW,OAAO,KAAK,MAAM;IAC7C;IACA,IAAI,KAAK,WAAW,OAAO,KAAK,WAAW,OAAO,SAAS;IAC3D,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,OAAO,MAAM;IAErD,IAAI,KAAK,WAAW,OAAO,KAAK,cAAc,OAAO,YAAY;IACjE,QAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC;IACpC,QAAQ,OAAO,QAAQ,KAAK,KAAK,MAAM,CAAC;IACxC,QAAQ,OAAO,UAAU,KAAK,KAAK,QAAQ,CAAC;IAC5C,QAAQ,OAAO,aAAa,KAAK,KAAK,WAAW,CAAC;IAClD,QAAQ,OAAO,aAAa,KAAK,KAAK,WAAW,CAAC;IAClD,IAAI,KAAK,WAAW,OAAO,KAAK,kBAAkB,OAAO,gBAAgB;IACzE,IAAI,KAAK,WAAW,OAAO,KAAK,gBAAgB,OAAO,cAAc;IACrE,QAAQ,OAAO,gBAAgB,aAAa,IAAI,YAAYA,yBAAAA,QAAQ;IACpE,IAAI,KAAK,WAAW,OAAO,YAAY,OAAO,kBAAkB;IAChE,IAAI,KAAK,WAAW,OAAO,KAAK,gBAAgB,OAAO,cAAc;IACrE,OAAO,GAAG,gBAAgB,QAAQ,mBAAmB,SAAS;GAChE,CAAC,CACH;EACF,UAAU;GACR,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,MAAM,EAAE;EAC/D;CACF;;;;;;;CASA,WAAmC;EACjC,MAAM,OAAO,KAAK,QAAQ,OAAO;EACjC,IAAI,MAAM,SAAS,QACjB,OAAO,IAAI,mBACT,KAAK,SACL,KAAK,eACL,KAAK,MACL,KAAK,aACP;EAEF,OAAO,IAAI,qBAAqB,KAAK,SAAS,KAAK,aAAa;CAClE;;;;;;;;;;;CAYA,aAAqB,QAA2B,UAAiC;EAC/E,MAAM,EAAE,OAAO,KAAK;EACpB,IAAI;GACF,MAAM,QAAQ,GAAG,kBAAkB,OAAO,MAAM;GAChD,IAAI,CAAC,OACH,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,0CAA0C;GAE3F,IAAI;IACF,sBAAsB,KAAK,SAAS,OAAO,QAAQ,OAAO,QAAQ;GACpE,UAAU;IACR,GAAG,mBAAmB,KAAK;GAC7B;GACA,IAAI,KAAK,QAAQ,SAAS,SACxB,KAAK,QAAQ,uBAAuB;EAExC,SAAS,OAAO;GACd,OAAO,MAAM;GACb,MAAM;EACR;CACF;;;;;;;;;;;;CAaA,cAAsB,WAAmB,OAAsC;EAC7E,MAAM,WAAW,KAAK,QAAQ;EAC9B,MAAM,SAAS,KAAK,QAAQ;EAC5B,MAAM,QAAQ,IAAI,cAAc,KAAK,SAAS,KAAK,OAAO;EAK1D,MAAM,UAAU,MAAM,qBAAqB,KAAK,OAAO,MAAM,SAAS,SAAS,OAAO,KAAK,OAAO;EAClG,IAAI,KAAK,QAAQ,SAAS,WAAW,OAAO,QAAQ,CAAC,KAAK,4BAA4B,GAAG;GACvF,MAAM,OAAO,KAAK,cAAc,YAAY,OAAO,KAAK,GAAG;GAC3D,IAAI,MAAM;IAKR,IAAI,QAAqB,OAAO,SAAS,EAAE,MAAM,QAAQ;IACzD,IAAI,KAAK,QAAQ,gBAAgB,GAC/B,IAAI,SAAS;KACX,MAAM,OAAO,YAAY,SAAS,WAAW,WAAW,OAAO;KAC/D,MAAM,WAAW,KAAK,QAAQ,UAAU,WAAW,IAAI,CAAC;KAExD,IADc,MAAM,0BAA0B,IACtC,CAAC,CAAC,kBACR,QAAQ;MAAE,MAAM;MAAiB;KAAK;IAE1C,OAAO;KACL,MAAM,WAAW,MAAM,oBAAoB;KAC3C,IAAI,SAAS,kBACX,QAAQ;MAAE,MAAM;MAAY,OAAO,SAAS;KAAM;IAEtD;IAEF,OAAO,kBAAkB,KAAK,SAAS,MAAM,OAAO,QAAQ;GAC9D;EACF;EACA,IAAI,SAAS;GAEX,MAAM,OAAO,YAAY,SAAS,WAAW,WAAW,UAAU;GAClE,MAAM,WAAW,KAAK,QAAQ,UAAU,WAAW,IAAI,CAAC;GACxD,MAAM,eAAe,IAAI;GACzB,MAAM,OAAO,KAAK,cAAc,gBAAgB;IAC9C,KAAK,aAAa;IAClB;IACA;GACF,CAAC;GACD,OAAO,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,QAAQ;EAC1E;EACA,MAAM,iBAAiB,MAAM,SAAS,CAAC,CAAC;EACxC,MAAM,OAAO,KAAK,cAAc,kBAAkB;GAChD,KAAK,aAAa;GAClB,OAAO,IAAI,WAAW,cAAc;GACpC;EACF,CAAC;EACD,OAAO,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,QAAQ;CAC1E;;CAGA,8BAA+C;EAC7C,MAAM,QAAQ,KAAK,QAAQ,OAAO;EAClC,IAAI,CAAC,SAAS,MAAM,SAAS,SAAS,OAAO;EAC7C,MAAM,WAAW,OAAO,KAAK,QAAQ,GAAG,yBAAyB,KAAK,QAAQ,cAAc,CAAC,CAAC;EAE9F,OADiB,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,aACnD,CAAC,CAAC,WAAW,MACxB,MAAM,EAAE,UAAU,EAAE,cAAc,QAAQ,EAAE,UAAU,KAAK,EAAE,UAAU,KAAK,QAC/E;CACF;AACF;AAEA,SAAS,YAAY,GAAuB,GAAgC;CAC1E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE;AAC/D;;;ACteA,MAAM,iBAAmD;CAAE,GAAG;CAAS,GAAG;CAAY,GAAG;AAAQ;AACjG,MAAM,eAAiD;CACrD,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AACA,MAAM,WAAW;AACjB,MAAM,WAAW;;AAEjB,MAAM,eAAiD;CAAE,GAAG;CAAM,GAAG;CAAU,GAAG;AAAS;;AAG3F,SAAS,UAAU,GAAsB,SAA2C;CAClF,MAAM,sBAAM,IAAI,IAAY;EAAC;EAAG,EAAE;EAAM,EAAE;EAAW,GAAG,EAAE;EAAO,GAAG;CAAO,CAAC;CAC5E,IAAI,EAAE,UAAU,IAAI,IAAI,EAAE,QAAQ;CAClC,KAAK,MAAM,KAAK,EAAE,QAAQ;EACxB,IAAI,IAAI,EAAE,YAAY;EACtB,KAAK,MAAM,KAAK,EAAE,SAAS,IAAI,IAAI,CAAC;CACtC;CACA,OAAO;AACT;;;;;;;;AASA,IAAa,oBAAb,MAA+B;CAC7B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;;;;;;;CAQH,0BAA6C;EAC3C,MAAM,QAAQ,IAAI,WAAW;EAC7B,IAAI;GACF,MAAM,OAAO,KAAK,gBAAgB,KAAK;GACvC,IAAI,KAAK,WAAW,UAClB,OAAO,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,aAAa;GAEtE,MAAM,SAAS,KAAK;GACpB,OAAO,mBAAmB,KAAK,SAAS,SAAS,UAAU;IACzD,MAAM,aAAa,KAAK,QAAQ,GAAG,6BAA6B,KAAK;IACrE,MAAM,aAAa,wBAAwB,KAAK,SAAS,KAAK;IAE9D,OAAO;KAAE;KAAY,WADH,aAAa,cAAc,KAAK,SAAS,QAAQ,UAAU,IAAI,CAAC;KAClD;KAAY,aAAA,GAAA,8BAAA,iBAAA,CAA6B,UAAU;IAAE;GACvF,CAAC;EACH,UAAU;GACR,MAAM,MAAM;EACd;CACF;CAEA,QAAQ,OAAqC;EAC3C,MAAM,SAAS,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO;EAC7D,MAAM,WAAW,OAAO,aAAa;EACrC,MAAM,UAAU,OAAO,QAAQ;EAC/B,MAAM,OAAO,MAAM,mBAAmB,gBAAgB;EACtD,MAAM,SAAS,MAAM,UAAU;EAK/B,IAAI,cAA4C;EAChD,MAAM,eAAe,KAAK,QAAQ,YAAY;EAE9C,IAAI;EACJ,IAAI,iBAAgC;EACpC,IAAI,oBAAoB,MAAM,OAAO;GACnC,MAAM,MAAM,SAAS,WAAW,MAAM,MAAM;GAC5C,IAAI,CAAC,KACH,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,gBAAgB,MAAM,MAAM,gBAC9B;GAEF,IAAI,CAAC,IAAI,UAAU,IAAI,kBAAkB,MACvC,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,aAAa,MAAM,MAAM,eAAe,kDAC1C;GAEF,gBAAgB,IAAI;GACpB,iBAAiB,IAAI;EACvB,OACE,gBAAgB,MAAM,MAAM;EAE9B,IAAI,CAAC,SAAS,YAAY;GACxB,MAAM,UAAU;IACd,SAAS;IACT,UAAU;IACV,UAAU,CACR;KACE,MAAM;KACN,SAAS;KACT,cAAc;KACd,QAAQ;IACV,CACF;IACA,QAAQ;GACV;GACA,OAAO;IACL;IACA,eAAeC,8BAAAA;IACf,OAAO;KAAE;KAAS;KAAc,QAAQ;IAAY;IACpD,OAAO;KAAE,eAAe;KAAe,gBAAgB;IAAe;IACtE,OAAO,EAAE,eAAe,cAAc;IACtC,cAAc,CAAC;IACf,SAAS;KAAE,GAAG;KAAS,SAAS,QAAQ,SAAS;IAAG;IACpD,OAAO;KAAE,eAAe;KAAG,qBAAqB,CAAC;IAAE;IACnD,SAAS;IACT,OAAO,CAAC;GACV;EACF;EACA,IACE,CAAC,OAAO,UAAU,aAAa,KAC/B,gBAAgB,KAChB,iBAAiB,SAAS,UAAU,QAEpC,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,eAAe,eAAe;EAGlF,MAAM,QAAQ,IAAI,WAAW;EAC7B,IAAI;GAEF,IAAI,SAAS,KAAK,QAAQ,cAAc;GACxC,IAAI,YAA2B,SAAS;GACxC,MAAM,OAAO,MAAM,UAAU,iBAAiB,KAAK,gBAAgB,KAAK,IAAI;GAC5E,IAAI,QAAQ,KAAK,WAAW,gBAAgB;IAC1C,cAAc;IACd,SAAS,KAAK;IACd,MAAM,aAAa,mBAAmB,KAAK,SAAS,SAAS,MAC3D,wBAAwB,KAAK,SAAS,CAAC,CACzC;IACA,YAAY,cAAc,KAAK,SAAS,QAAQ,UAAU;IAC1D,IAAI,UAAU,WAAW,GACvB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,8CACF;GAEJ;GACA,IAAI,gBAAgB,UAAU,SAAS;GACvC,IAAI,OAAO,MAAM,UAAU,UAAU;IACnC,gBAAgB,MAAM,MAAM;IAC5B,IACE,CAAC,OAAO,UAAU,aAAa,KAC/B,gBAAgB,iBAChB,iBAAiB,UAAU,QAE3B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,eAAe,cAAc,eAAe,eAC9C;GAEJ;GAMA,MAAM,OAAO,IAAI,WAAW;GAC5B,IAAI;GACJ,IAAI;GACJ,IAAI,UAA0B,CAAC;GAC/B,IAAI;GACJ,IAAI;IACF,MAAM,SAAS,KAAK,WAAW,QAAQ,WAAW,eAAe,IAAI;IACrE,MAAM,SACJ,kBAAkB,UAAU,SAAS,IACjC,SACA,KAAK,WAAW,QAAQ,WAAW,eAAe,IAAI;IAC5D,SAAS,cAAc,KAAK,SAAS,MAAM;IAC3C,QAAQ,kBAAkB,gBAAgB,SAAS,cAAc,KAAK,SAAS,MAAM;IACrF,IAAI,gBAAgB,eAClB,CAAC,CAAE,SAAS,UAAW,KAAK,QAAQ,QAAQ,QAAQ,QAAQ,KAAK;GAErE,UAAU;IACR,KAAK,MAAM;GACb;GAEA,MAAM,kBACJ,mBAAmB,OAAO,OAAQ,OAAO,WAAW,mBAAmB;GACzE,MAAM,gBAAA,GAAA,8BAAA,gBAAA,CAA+B,QAAQ,eAAe;GAC5D,MAAM,gBAAgB,MAAM;GAC5B,MAAM,OAAA,GAAA,8BAAA,aAAA,CAAmB;IACvB,OAAO;IACP,OAAO;IACP;IACA;IACA;IACA;IACA,cAAc;KAAE,OAAO,aAAa;KAAO,OAAO,aAAa;IAAM;IACrE;GACF,CAAC;GAMD,MAAM,YAAY,aAAa,QAAQ,MAAM,MAAM,EAAE,WAAW,YAAY,EAAE,GAAG;GACjF,MAAM,eAAe,gBAAgB;GACrC,IAAI;GACJ,IAAI,gBAAgB,GAClB,QAAQ,iBAAiB,IAAI,CAAC,GAAG,IAAI,CAAC;QACjC,IAAI,aAAa,WAAW,QACjC,QAAQ,KAAK,UAAU,QAAQ,WAAW,eAAe,eAAe,QAAQ;IAC9E,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB;GACF,CAAC;QAED,QAAQ,CAAC;GAEX,MAAM,UAAU,YACZ;IAAE,IAAA,GAAA,8BAAA,QAAA,CAAW,KAAK,KAAK;IAAG,QAAQ;GAA4B,IAC9D;IAAE,IAAA,GAAA,8BAAA,aAAA,CAAgB,GAAG;IAAG,QAAQ;GAAqB;GACzD,OAAO;IACL;IACA,eAAeC,8BAAAA;IACf,OAAO;KAAE;KAAS;KAAc,QAAQ;IAAY;IACpD,OAAO;KAAE,eAAe;KAAe,gBAAgB;IAAe;IACtE,OAAO,EAAE,eAAe,cAAc;IACtC,cAAc,aAAa;IAC3B;IACA,OAAO;KACL,eAAe;KACf,qBAAqB,QAAQ,OAAOC,8BAAAA,kBAAkB,CAAC,CAAC,KAAK,MAAM,EAAE,YAAY;IACnF;IACA,SAAS,QAAQ;IACjB;GACF;EACF,UAAU;GACR,MAAM,MAAM;EACd;CACF;;CAGA,WAAmB,QAAa,WAA0B,OAAe,OAAwB;EAC/F,MAAM,SAAS,KAAK,QAAQ,GAAG,qBAAqB,QAAQ,OAAO,UAAU,MAAM,CAAC,GAAG,CAAC;EACxF,IAAI,WAAWC,yBAAAA,UACb,MAAM,IAAIJ,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,YAAY,MAAM,6BAA6B;EAErG,MAAM,WAAW,KAAK,QAAQ,GAAG,mBAAmB,MAAM,CAAC;EAC3D,OAAO;CACT;;;;;;;CAQA,UACE,QACA,WACA,OACA,OACA,iBACA,cACoB;EACpB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAA4B,CAAC;EACnC,IAAI,QAAQ,KAAK,WAAW,QAAQ,WAAW,OAAO,IAAI,WAAW,CAAC;EACtE,IAAI,iBAAiB;EACrB,IAAI;GACF,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,OAAO,KAAK;IACvC,MAAM,QAAQ,MAAM,UAAU,SAAS,IAAI,SAAS,KAAK,WAAW,QAAQ,WAAW,GAAG,IAAI,WAAW,CAAC;IAC1G,IAAI;KACF,MAAM,iBAAiB,cAAc,KAAK,SAAS,KAAK;KACxD,MAAM,EAAE,SAAS,WAAW,KAAK,QAAQ,OAAO,OAAO,gBAAgB,cAAc;KACrF,MAAM,MAAA,GAAA,8BAAA,aAAA,CACS;MACX,OAAO,IAAI;MACX,OAAO;MACP;MACA,QAAQ;MACR,OAAO;MACP;MACA,cAAc;OAAE,OAAO,aAAa;OAAO,OAAO,aAAa;MAAM;MACrE,eAAe,aAAa;KAC9B,CAAC,CACH;KACA,iBAAiB;IACnB,UAAU;KACR,GAAG,mBAAmB,KAAK;KAC3B,QAAQ;IACV;GACF;EACF,UAAU;GACR,IAAI,UAAU,QAAQ,GAAG,mBAAmB,KAAK;EACnD;EACA,OAAO;CACT;;;;;;;;;;;;;;CAeA,gBAAwB,OAAuE;EAC7F,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,IAAI,CAAC,KAAK,QAAQ,gBAAgB,GAAG,OAAO;GAAE,QAAQ;GAAQ,QAAQ;EAAS;EAC/E,MAAM,QAAQ,IAAI,cAAc,KAAK,SAAS,KAAK,OAAO;EAC1D,IAAI,KAAK,QAAQ,SAAS,SAAS;GACjC,MAAM,OAAO,KAAK,QAAQ,OAAO;GACjC,IAAI,MAAM,qBAAqB,KAAK,MAAM,SAAS,QAAQ;IAIzD,MAAM,OAAO,YAAY,KAAK,MAAM,gBAAgB,aAAa,GAAG,OAAO;IAC3E,MAAM,WAAW,KAAK,QAAQ,UAAU,WAAW,IAAI,CAAC;IAExD,IAAI,CADU,MAAM,uBAAuB,IAClC,CAAC,CAAC,kBAAkB,OAAO;KAAE,QAAQ;KAAQ,QAAQ;IAAS;IACvE,IAAI,KAAK,QAAQ,WAAW,OAAO,IAAI,MAAM,GAAG,OAAO,KAAK,mBAAmB,KAAK;IACpF,MAAM,UAAU,gBAAgB,KAAK,OAAO,YAC1C,GAAG,gCAAgC,QAAQ,OAAO,CACpD;IACA,IAAI,YAAYG,yBAAAA,UACd,MAAM,IAAIJ,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,iDACF;IAEF,MAAM,WAAW,GAAG,mBAAmB,OAAO,CAAC;IAC/C,OAAO;KAAE,QAAQ;KAAS,QAAQ;IAAe;GACnD;GACA,MAAM,QAAQ,MAAM,iBAAiB;GACrC,IAAI,CAAC,MAAM,kBAAkB,OAAO;IAAE,QAAQ;IAAQ,QAAQ;GAAS;GACvE,IAAI,MAAM,SAAS,GAAG,OAAO,KAAK,mBAAmB,KAAK;GAC1D,MAAM,QAAQ,IAAI,WAAW,MAAM,KAAK;GACxC,MAAM,MAAM,IAAI,MAAM,MAAM,UAAU;GACtC,IAAI;IACF,IAAI,WAAW,KAAK,KAAK;IACzB,MAAM,UAAU,GAAG,wBAAwB,QAAQ,KAAK,MAAM,UAAU;IACxE,IAAI,YAAYG,yBAAAA,UACd,MAAM,IAAIJ,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,iDACF;IAEF,MAAM,WAAW,GAAG,mBAAmB,OAAO,CAAC;IAC/C,OAAO;KAAE,QAAQ;KAAS,QAAQ;IAAe;GACnD,UAAU;IACR,IAAI,KAAK,GAAG;GACd;EACF;EACA,MAAM,QAAQ,MAAM,yBAAyB,aAAa;EAC1D,IAAI,MAAM,oBAAoB,OAAO;GAAE,QAAQ;GAAQ,QAAQ;EAAS;EACxE,MAAM,SAAS,sBACb,KAAK,SACL,IAAI,WAAW,MAAM,KAAK,GAC1B,KAAK,QAAQ,QACf;EACA,MAAM,WAAW,OAAO,MAAM,CAAC;EAC/B,OAAO;GAAE,QAAQ,OAAO;GAAQ,QAAQ;EAAe;CACzD;;CAGA,mBAA2B,OAA4D;EACrF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,GAAG,0BAA0B,KAAK,QAAQ,cAAc,CAAC;EACtE,MAAM,YAAY,IAAI,MAAM,CAAC;EAC7B,IAAI;GACF,IAAI,KAAK,WAAW,OAAO,EAAE;GAC7B,MAAM,QAAQ,GAAG,oBAAoB,MAAMG,yBAAAA,UAAU,KAAK,QAAQ,YAAY,IAAI,SAAS;GAC3F,IAAI,UAAUA,yBAAAA,YAAY,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM,GAC/D,MAAM,IAAIJ,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,oDACF;GAEF,MAAM,WAAW,GAAG,mBAAmB,KAAK,CAAC;GAC7C,OAAO;IAAE,QAAQ;IAAO,QAAQ;GAAe;EACjD,UAAU;GACR,IAAI,KAAK,SAAS;EACpB;CACF;;;;;;CAOA,QACE,OACA,OACA,QACA,OACmF;EACnF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,OAAO,GAAG,yBAAyB,OAAO,KAAK;EACrD,IAAI,SAASG,yBAAAA,UACX,MAAM,IAAIJ,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,2CACF;EAEF,IAAI;GACF,MAAM,QAAQ,GAAG,wBAAwB,IAAI;GAC7C,MAAM,UAA0B,CAAC;GACjC,aACE,KACA;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;GAAC,IAChB,CAAC,QAAQ,WAAW,SAAS,WAAW,WAAW,eAAe;IACjE,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;KAC9B,KAAK,MAAM,KAAK;MAAC;MAAQ;MAAW;MAAS;MAAW;MAAW;KAAS,GAC1E,IAAI,KAAK,GAAG,OAAO,CAAC;KACtB,IACE,CAAC,GAAG,wBACF,MACA,GACA,QACA,WACA,SACA,WACA,WACA,SACF,GAEA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,6BAA6B,GAAG;KAEjF,MAAM,eAAe,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC,MAAM;KACzD,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;KAChD,MAAM,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;KAChD,MAAM,WAAW,KAAK,UAAU,MAAM,GAAG,QAAQ;KACjD,MAAM,WAAW,KAAK,UAAU,MAAM,GAAG,QAAQ;KACjD,IAAI,YAAY,SAAS,aAAa,SAAS;KAC/C,IAAI,YAAY;KAChB,IAAI,YAAY;KAChB,IAAI;MACF,YACE,SAAS,SAAS,QAAQ,SAAS,YAAY,QAAA,GAAA,8BAAA,cAAA,CAAqB,SAAS,IAAI;MACnF,YACE,SAAS,SAAS,QAAQ,SAAS,YAAY,QAAA,GAAA,8BAAA,cAAA,CAAqB,SAAS,IAAI;KACrF,QAAQ;MAEN,YAAY;KACd;KACA,MAAM,SAAS,eAAe,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM;KACrE,QAAQ,KAAK;MACX;MACA;MACA,MAAM,aAAa,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM;MAExD,SAAS;OAAE,KAAK,WAAW;OAAS,KAAK,WAAW;MAAQ;MAC5D,YAAY;OAAE,KAAK,SAAS,IAAI,OAAO;OAAQ,KAAK,SAAS,IAAI,OAAO;MAAO;MAC/E,OAAO;OAAE,KAAK;OAAW,KAAK;OAAW;MAAU;MACnD,KAAK;OAAE,KAAK,SAAS;OAAM,KAAK,SAAS;MAAK;MAI9C,MAAM;OACJ,KAAK,aAAa,GAAG,6BAA6B,MAAM,GAAG,QAAQ,MAAM;OACzE,KAAK,aAAa,GAAG,6BAA6B,MAAM,GAAG,QAAQ,MAAM;MAC3E;MACA,mBAAmB,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM;MAC1D,OAAO;OAAE,KAAK,CAAC;OAAG,KAAK,CAAC;MAAE;KAC5B,CAAC;IACH;GACF,CACF;GACA,OAAO;IACL,SAAS,KAAK,kBAAkB,MAAM,SAAS,QAAQ,KAAK;IAC5D,QAAQ;KAAE,KAAK,KAAK,WAAW,MAAM,QAAQ;KAAG,KAAK,KAAK,WAAW,MAAM,QAAQ;IAAE;GACvF;EACF,UAAU;GACR,GAAG,qBAAqB,IAAI;EAC9B;CACF;;CAGA,WAAmB,MAAW,OAA+B;EAC3D,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,OAAO,aAAa,KAAK;GAAC;GAAG;GAAG;EAAC,IAAI,CAAC,WAAW,SAAS,iBAAiB;GACzE,KAAK,MAAM,KAAK;IAAC;IAAW;IAAS;GAAW,GAAG,IAAI,KAAK,GAAG,OAAO,CAAC;GACvE,IAAI,CAAC,GAAG,iCAAiC,MAAM,OAAO,WAAW,SAAS,WAAW,GACnF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,gCAAgC;GAEjF,OAAO;IACL,YAAY,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM;IACnD,gBAAgB,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM;IACrD,mBAAmB,OAAO,IAAI,KAAK,aAAa,KAAK,CAAC,MAAM;GAC9D;EACF,CAAC;CACH;;;;;;;;CASA,kBACE,MACA,SACA,QACA,OACgB;EAChB,MAAM,UAAU,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,YAAY,CAAC;EAC1D,MAAM,YAAY;GAChB,KAAK,IAAII,8BAAAA,cACN,MAAM,KAAK,cAAc,MAAM,UAAU,CAAC,GAC3C,UAAU,QAAQ,OAAO,CAC3B;GACA,KAAK,IAAIA,8BAAAA,cACN,MAAM,KAAK,cAAc,MAAM,UAAU,CAAC,GAC3C,UAAU,OAAO,OAAO,CAC1B;EACF;EACA,OAAO,QAAQ,KAAK,MAAM;GACxB,MAAM,MAAM,EAAE,QAAQ,MAAM,UAAU,IAAI,QAAQ,EAAE,YAAY,IAAI,CAAC;GACrE,MAAM,MAAM,EAAE,QAAQ,MAAM,UAAU,IAAI,QAAQ,EAAE,YAAY,IAAI,CAAC;GACrE,MAAM,aAAa,QAAQC,8BAAAA,oBAAoB,QAAQA,8BAAAA;GACvD,OAAO;IACL,GAAG;IACH,OAAO;KACL,KAAK,QAAQA,8BAAAA,mBAAmB,CAAC,IAAI;KACrC,KAAK,QAAQA,8BAAAA,mBAAmB,CAAC,IAAI;IACvC;IACA,GAAI,aAAa,EAAE,iBAAiB,KAAK,IAAI,CAAC;GAChD;EACF,CAAC;CACH;CAEA,UACE,MACA,OACA,OAC6C;EAC7C,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,OAAO,YAAY,KAAK,IAAI,aAAa;GACvC,IAAI,KAAK,UAAU,OAAO,CAAC;GAC3B,MAAM,SAAS,GAAG,wBAAwB,MAAM,OAAO,OAAOF,yBAAAA,UAAU,GAAG,QAAQ;GAEnF,MAAM,iBAAiB,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC,MAAM;GAC7D,IAAI,UAAU,GAAG,OAAO;IAAE,MAAM;IAAM,WAAW;GAAe;GAChE,OAAO,YAAY,KAAK,SAAS,QAAQ;IACvC,IAAI,KAAK,UAAU,OAAO,CAAC;IAC3B,MAAM,UAAU,GAAG,wBAAwB,MAAM,OAAO,OAAO,KAAK,QAAQ,QAAQ;IACpF,MAAM,YAAY,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC,MAAM;IACxD,IAAI,WAAW,GAAG,OAAO;KAAE,MAAM;KAAM;IAAU;IAEjD,MAAM,QAAQ,IAAI,UAAU,KAAK,UAAU,CAAC;IAC5C,IAAI,OAAO;IACX,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,aAAa,CAAC;IACpD,OAAO;KAAE;KAAM;IAAU;GAC3B,CAAC;EACH,CAAC;CACH;CAEA,cAAsB,MAAW,OAAe,cAAwC;EACtF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,GAAG,gCAAgC,MAAM,OAAO,YAAY;EAC1E,MAAM,MAAwB,CAAC;EAC/B,IAAI,SAAS,GAAG,OAAO;EACvB,YAAY,KAAK,IAAI,cAAc;GACjC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;IAC9B,IAAI,KAAK,WAAW,OAAO,CAAC;IAC5B,MAAM,SAAS,GAAG,2BAChB,MACA,OACA,cACA,GACA,WACAA,yBAAAA,UACA,CACF;IACA,MAAM,QACJ,UAAU,IACN,KACA,YAAY,KAAK,SAAS,QAAQ;KAChC,MAAM,UAAU,GAAG,2BACjB,MACA,OACA,cACA,GACA,WACA,KACA,MACF;KACA,IAAI,WAAW,GAAG,OAAO;KACzB,MAAM,QAAQ,IAAI,UAAU,KAAK,UAAU,CAAC;KAC5C,IAAI,OAAO;KACX,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,aAAa,CAAC;KACpD,OAAO;IACT,CAAC;IACP,IAAI,KAAK;KAAE,QAAQ,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM;KAAG;IAAM,CAAC;GACtE;EACF,CAAC;EACD,OAAO;CACT;AACF;;;;;;;;;;;;;;AC5mBA,IAAa,qBAAb,MAAgC;CAC9B,YACE,SACA,eACA;EAFiB,KAAA,UAAA;EACA,KAAA,gBAAA;CAChB;CAEH,SAAS,OAAmD;EAC1D,MAAM,CAAC,IAAI,IAAI,IAAI,MAAM,MAAM;EAC/B,MAAM,OAAO,KAAK,QAAQ,WAAW,OAAO,MAAM,IAAI;EACtD,MAAM,YAAY,MAAc,OAAO,cAAc,CAAC,KAAK,KAAK;EAChE,IAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,OAAO,KAAK,MAAM,MAAM,KAAK,OAAO,MAC1E,MAAM,IAAIG,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,cAAc,MAAM,UAAU,KAAK,GAAG,EAAE,oBAAoB,KAAK,gBACnE;EAGF,MAAM,YAAY,KAAK,KAAK;EAC5B,IAAI,CAAC,OAAO,cAAc,MAAM,YAAY,KAAK,cAAc,IAAI,MAAM,cACvE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,4BAA4B,UAAU,uBAAuB,IAAI,MAAM,aAAa,iBACtF;EAEF,IAAI,MAAM,IAAI,eAAe,KAAK,MAAM,IAAI,OAAO,IACjD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,+BAA+B;EAEzF,IAAI,MAAM,IAAI,aAAa,MAAM,cAC/B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,YAAY,MAAM,IAAI,WAAW,oCAAoC,MAAM,aAAa,OAC1F;EAGF,sBAAsB,KAAK,SAAS,MAAM,MAAM;GAAE,YAAY;GAAI;EAAU,GAAG,MAAM,GAAG;EAIxF,MAAM,UAAU,IAAI,gBAAgB,KAAK,OAAO;EAChD,MAAM,OAAO,KAAK,cAAc,gBAAgB;GAC9C,KAAK,YAAY,aAAa;GAC9B,MAAM,MAAM;GACZ,UAAU,MAAM;EAClB,CAAC;EACD,IAAI;GACF,QAAQ,eACN,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CACzE;GACA,MAAM,QAAQ,sBAAsB,KAAK,SAAS,OAAO;GACzD,sBAAsB,KAAK,SAAS,QAAQ,cAAc,GAAG,OAAO;IAClE,mBAAmB,MAAM;IACzB,WAAW,MAAM;IACjB,KAAK,MAAM;GACb,CAAC;GACD,MAAM,SAAS,IAAI,gBAAgB,KAAK,SAAS,OAAO;GACxD,MAAM,WAAW,OAAO,aAAa;GAKrC,OAAO;IAAE,WAJS,SAAS,WAAW,MACnC,MACC,EAAE,MAAM,SAAS,kBAAkB,EAAE,MAAM,sBAAsB,MAAM,iBAE1D;IAAG,YAAY,SAAS;IAAY,SAAS,OAAO,QAAQ;GAAE;EACjF,UAAU;GAER,QAAQ,MAAM;EAChB;CACF;AACF;;;;;AClGA,SAAS,mBAAmB,MAAuC;CACjE,QAAQ,MAAR;EACE,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;AAGA,SAAS,UAAU,QAAwB;CACzC,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,cAAc,EAAE;AACtD;;;;;;;;;;;;;;;;;;;AA0CA,IAAa,gBAAb,MAA2B;CAYzB,YACE,SAEA,KACA;EAHiB,KAAA,UAAA;EAEA,KAAA,MAAA;EARF,gBAAA,MAAA,eAAqC,CAAC,CAAA;EAGtC,gBAAA,MAAA,8BAAa,IAAI,IAA8B,CAAA;CAM7D;;;;;;;;;CAUH,SACE,SACA,YACA,QACA,QACA,OACM;EACN,IAAI,MAAM,eAAe,GACvB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oBAAoB,SAAS;EAEjF,MAAM,EAAE,KAAK,OAAO,KAAK;EACzB,MAAM,MAAM,IAAI,MAAM,MAAM,UAAU;EACtC,IAAI;GACF,IAAI,WAAW,KAAK,KAAK;GACzB,MAAM,KAAK,GAAG,2BAA2B,YAAY,QAAQ,QAAQ,KAAK,MAAM,UAAU;GAC1F,IAAI,OAAO,GACT,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uDAAuD,SACzD;GAEF,KAAK,IAAI,IAAI,SAAS,EAAE;GACxB,KAAK,WAAW,IAAI,SAAS,KAAK,aAAa,IAAI;IAAE;IAAY;IAAQ;GAAO,CAAC,CAAC;EACpF,UAAU;GACR,IAAI,KAAK,GAAG;EACd;CACF;;;;;;;;CASA,qBACE,SACA,YACA,QACA,QACA,MACM;EACN,MAAM,SAAS,KAAK,QAAQ,WAAW,aAAa,IAAI;EACxD,IAAI,KAAK;EACT,IAAI;GACF,KAAK,KAAK,QAAQ,GAAG,sBAAsB,YAAY,QAAQ,QAAQ,OAAO,GAAG;EACnF,SAAS,OAAO;GACd,OAAO,MAAM;GACb,MAAM;EACR;EACA,IAAI,OAAO,GAAG;GACZ,OAAO,MAAM;GACb,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uDAAuD,QAAQ,IAAI,KAAK,EAC1E;EACF;EACA,KAAK,IAAI,IAAI,SAAS,EAAE;EACxB,KAAK,WAAW,IAAI,SAAS,KAAK,aAAa,IAAI;GAAE;GAAY;GAAQ;EAAO,CAAC,CAAC;EAClF,KAAK,YAAY,KAAK,MAAM;CAC9B;;CAGA,SAAS,SAAmC;EAC1C,MAAM,WAAW,KAAK,WAAW,IAAI,OAAO;EAC5C,IAAI,CAAC,UACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uCAAuC,SACzC;EAEF,OAAO;CACT;;CAGA,oBAAoB,SAA+C;EACjE,OAAO,KAAK,WAAW,IAAI,OAAO;CACpC;;;;;;CAOA,WAAW,QAAgB,QAAgB,QAAqC;EAC9E,MAAM,SAAS,UAAU,MAAM;EAC/B,IAAI;EACJ,KAAK,MAAM,CAAC,KAAK,aAAa,KAAK,YAAY;GAC7C,IAAI,UAAU,SAAS,UAAU,MAAM,QAAQ;GAC/C,MAAM,QAAQ,KAAK,IAAI,SAAS,SAAS,MAAM,KAAK,SAAS,WAAW,SAAS,IAAI;GACrF,IAAI,CAAC,QAAQ,QAAQ,KAAK,OAAO,OAAO;IAAE;IAAK;GAAM;EACvD;EACA,OAAO,MAAM;CACf;;CAGA,iBAAiB,SAAmC;EAClD,MAAM,KAAK,KAAK,UAAU,OAAO;EACjC,IAAI,CAAC,KAAK,QAAQ,GAAG,0BAA0B,EAAE,GAC/C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,4BAA4B,SAAS;EAEzF,MAAM,WAAW,KAAK,SAAS,OAAO;EACtC,MAAM,WAAW,KAAK,aAAa,IAAI;GACrC,YAAY,SAAS;GACrB,QAAQ,SAAS;GACjB,QAAQ,SAAS,SAAS,IAAI;EAChC,CAAC;EACD,KAAK,WAAW,IAAI,SAAS,QAAQ;EACrC,OAAO;CACT;CAEA,aACE,IACA,OACkB;EAClB,MAAM,EAAE,IAAI,QAAQ,KAAK;EAKzB,MAAM,WAAc,MAAe,aAAmB;GACpD,IAAI;IACF,OAAO,KAAK;GACd,QAAQ;IACN,OAAO;GACT;EACF;EACA,OAAO;GACL,YAAY,cAER,eAAe,MAAM,KAAK,QAAQ,GAAG,uBAAuB,IAAI,KAAK,GAAG,CAAC,KACzE,MAAM,YACR,MAAM,UACR;GACA,QAAQ,cAAc,GAAG,mBAAmB,EAAE,GAAG,MAAM,UAAU,GAAG;GACpE,QAAQ,cAAc,GAAG,kBAAkB,EAAE,GAAG,MAAM,WAAW,CAAC;GAClE,qBAAqB,cACb,mBAAmB,GAAG,gCAAgC,EAAE,CAAC,GAC/D,aACF;GACA,mBAAmB,cAAc,GAAG,6BAA6B,EAAE,GAAG,IAAI;GAC1E,WAAW,cAAc,GAAG,qBAAqB,EAAE,GAAG,KAAK;EAC7D;CACF;;;;;;;CAQA,gBAAgB,OAAyC;EACvD,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,KAAK,WAAW,KAAA,IAAY,KAAK,KAAK,SAAS,IAAI;GAClE,KAAK,qBACH,KAAK,KACL,KAAK,cAAc,IACnB,KAAK,UAAU,GACf,QACA,KAAK,IACP;GACA,IAAI,KAAK,UACP,KAAK,YAAY,KAAK,GAAG;EAE7B;CACF;;CAGA,YAAY,SAAuB;EACjC,MAAM,KAAK,KAAK,UAAU,OAAO;EACjC,IAAI,CAAC,KAAK,QAAQ,GAAG,yBAAyB,EAAE,GAC9C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uBAAuB,SAAS;CAEtF;CAEA,iBAAuB;EACrB,KAAK,QAAQ,GAAG,4BAA4B;CAC9C;;CAGA,QAAc;EACZ,KAAK,QAAQ,GAAG,8BAA8B;EAC9C,KAAK,IAAI,MAAM;EACf,KAAK,WAAW,MAAM;EAEtB,KAAK,MAAM,UAAU,KAAK,aACxB,OAAO,MAAM;EAEf,KAAK,YAAY,SAAS;CAC5B;;CAGA,MAAM,SAAyB;EAC7B,OAAO,KAAK,UAAU,OAAO;CAC/B;CAEA,UAAkB,SAAyB;EACzC,MAAM,KAAK,KAAK,IAAI,IAAI,OAAO;EAC/B,IAAI,OAAO,KAAA,GACT,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uCAAuC,SACzC;EAEF,OAAO;CACT;AACF;;;;;;;;AC1RA,SAAgB,gBACd,SACA,OACA,KACe;CACf,MAAM,EAAE,OAAO;CACf,IAAI,IAAI,SAAS,gBAAgB;EAC/B,MAAM,aAAa,GAAG,+BAA+B,OAAO,IAAI,iBAAiB;EACjF,IAAI,aAAa,GACf,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,gCAAgC,IAAI,mBACtC;EAEF,OAAO;GAAE;GAAY,mBAAmB,IAAI;EAAkB;CAChE;CAEA,MAAM,QAAQ,GAAG,qBAAqB,KAAK;CAC3C,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAIzB,KAFE,gBAAgB,QAAQ,MAAM,KAAK,QAAQ,GAAG,sBAAsB,OAAO,GAAG,KAAK,GAAG,CAAC,KACvF,QACW,IAAI,MACf,OAAO;EAAE,YAAY;EAAG,mBAAmB,GAAG,wBAAwB,OAAO,CAAC;CAAE;CAGpF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,UAAU,0BAA0B,IAAI,KAAK,EAAE;AACvF;;;;;;;;ACxBA,IAAa,aAAb,MAAwB;CACtB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,SAAS,QAAmC;EAC1C,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,OAAO,iBAAiB,KAAK,SAAS,OAAO,KAAK,QAAQ,cAAc,CAAC;CAC3E;CAEA,MAAM,KAAmB,QAAmC;EAC1D,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,EAAE,eAAe,gBAAgB,KAAK,SAAS,OAAO,GAAG;EAC/D,OAAO,YAAY,KAAK,SAAS,OAAO,YAAY,KAAK,QAAQ,cAAc,CAAC;CAClF;;;;;;CAOA,WACE,QACA,QACgD;EAChD,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,OAAO,WAAW,QAAQ,GAAG,qBAAqB,GAAG;EAE3D,MAAM,SAAS,KAAK,QAAQC,yBAAAA,UAAU,GAAGA,yBAAAA,UAAU,CAAC;EACpD,IAAI,UAAU,GACZ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,QAAQ,OAAO,eAAe;EAE/E,OAAO,YAAY,KAAK,SAAS,QAAQ;GAEvC,IADgB,KAAK,QAAQF,yBAAAA,UAAU,GAAG,KAAK,MACrC,MAAM,QACd,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,QAAQ,OAAO,eAAe;GAE/E,MAAM,OAAO,IAAI,UAAU,KAAK,MAAM;GACtC,MAAM,QAAQ,IAAI,YAAY,KAAK,UAAU;GAC7C,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,IAAI;GAC9B,OAAO;IAAE;IAAQ;GAAM;EACzB,CAAC;CACH;AACF;;;AC7DA,MAAM,sBAAsB;;;;;;;;AAS5B,SAAgB,uBACd,SACA,SACA,WACQ;CACR,MAAM,EAAE,IAAI,QAAQ;CACpB,MAAM,OAAO,QAAQ,SAAS;CAC9B,MAAM,UAAU,KAAK,QAAQ,UAAU,gBAAgB;CACvD,IAAI;EACF,MAAM,WAAW,GAAG,qBAAqB,SAAS,mBAAmB;EACrE,IAAI,aAAaC,yBAAAA,UACf,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC;EAErF,IAAI;GACF,aAAa,IAAI,KAAK,UAAU,UAAU,IAAI;GAC9C,IAAI,UAAU,YACZ,iBAAiB,IAAI,KAAK,UAAU,UAAU,UAAU;GAE1D,MAAM,qBAAqB,GAAG,0BAA0B,QAAQ;GAChE,IAAI,sBAAsB,GACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,wCAAwC;GAEzF,OAAO;EACT,UAAU;GACR,GAAG,oBAAoB,QAAQ;EACjC;CACF,UAAU;EACR,KAAK,QAAQ,UAAU,gBAAgB;CACzC;AACF;;;;;;;;;ACxCA,MAAa,kBAAkB;CAC7B,UAAU;CACV,UAAU;CACV,UAAU;CACV,WAAW;CACX,UAAU;CACV,eAAe;CACf,MAAM,KAAK;CACX,aAAa,KAAK;CAClB,MAAM,KAAK;CACX,gBAAgB,KAAK;AACvB;;;;;AAQA,SAAgB,UAAU,OAGxB;CACA,IAAI,UAAU;CACd,IAAI,YAAY;CAChB,KAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,eAAe,GAAG;EACzD,MAAM,QAAQ,MAAM;EACpB,IAAI,UAAU,MAAM,WAAW;OAC1B,IAAI,UAAU,OAAO,aAAa;CACzC;CACA,OAAO;EAAE;EAAS;CAAU;AAC9B;;;ACJA,MAAM,cAAc;CAClB,UAAU;CACV,OAAO;CACP,MAAM;CACN,UAAU;CACV,SAAS;CACT,WAAW;AACb;;AAGA,MAAMC,6BAA2B;AAGjC,MAAM,0BAA0B;;;;;AAMhC,MAAMC,eAA2B;CAAE,eAAe,CAAC;CAAG,YAAY;AAAK;AAEvE,MAAM,uBAA0E;CAC9E,MAAM,CAAC,MAAM;CACb,QAAQ,CAAC,YAAY,OAAO;CAC5B,QAAQ,CAAC,YAAY,SAAS;AAChC;;;;;;;AAQA,IAAa,cAAb,MAAyB;CACvB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,SAAS,KAAmB,OAAuB,QAAyC;EAC1F,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,QAAQ;EAE5B,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EAEjG,IAAI,CADY,qBAAqB,MAAM,KAC/B,CAAC,SAAS,OAAO,MAAM,GACjC,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,eAAe,MAAM,KAAK,yBAAyB,OAAO,OAAO,QACnE;EAGF,MAAM,UAAU,KAAK,WAAW,SAAS,mBAAmB,KAAK;EACjE,OAAO,KAAK,SAAS,SAAS,mBAAmB,OAAO;CAC1D;CAEA,MAAM,KAAmB,QAAyC;EAChE,eAAe,MAAM;EACrB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,QAAQ;EAE5B,MAAM,UAAU,KAAK,oBAAoB,KAAK,KAAK,aACjD,KAAK,QAAQ,GAAG,oBACd,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,KACA,KACA,QACF,CACF;EACA,IAAI,YAAY,MACd,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,4BAA4B;EAEhF,OAAO,KAAK,SAAS,SAAS,mBAAmB,OAAO;CAC1D;CAEA,WACE,MACA,QACA,QACkB;EAClB,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,IAAI,WAAW,IAAI;EACjC,IAAI,MAAM,eAAe,GACvB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;EAE7E,MAAM,iBAAiB,UAAU,YAAY,KAAK;EAClD,MAAM,OAAO,mBAAmB,QAAQ,GAAG,qBAAqB,GAAG;EACnE,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,WAAW,aAAa,KAAK,CAAC,MAAM,YAAY,EAAE,IAAI,CAAC,SAAS,eAAe;GACnF,IAAI,WAAW,SAAS,KAAK;GAE7B,IAAI,CADO,KAAK,QAAQ,SAAS,MAAM,YAAY,SAC7C,GACJ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wBAAwB,eAAe,YAAY,GACrD;GAEF,OAAO;IACL,aAAa,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACjD,eAAe,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACnD,eAAe,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACnD,gBAAgB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC;GACvD;EACF,CAAC;EAED,KAAK,QAAQ,aAAa;EAC1B,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,OAAO;GACL,GAAG;GACH,UAAU,iBAAiB,KAAK,SAAS,OAAO,KAAK,QAAQ,cAAc,CAAC;GAC5E,MAAMF;EACR;CACF;CAEA,OAAO,iBAA0B,QAAuC;EACtE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,kBAAkB,0BAA0B;EAE1D,MAAM,SAAS,YAAY,KAAK,KAAK,cAAc;GAEjD,IAAI,CADO,GAAG,gBAAgB,KAAK,QAAQ,cAAc,GAAG,OAAO,SAC7D,GACJ,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oBAAoB;GAErE,OAAO;IACL,iBAAiB,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC,MAAM;IAC3D,cAAc,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IAClD,eAAe,OAAO,IAAI,KAAK,WAAW,OAAO,CAAC,CAAC;IACnD,oBAAoB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC;IACzD,kBAAkB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC;IACvD,wBAAwB,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE,CAAC,MAAM;GACrE;EACF,CAAC;EAED,KAAK,QAAQ,aAAa;EAC1B,OAAO;GAAE,GAAG;GAAQ,MAAMF;EAAW;CACvC;;;;;;;;CASA,YAAY,OAAuB,QAA8C;EAC/E,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,aAAa,KAAK,aAAa,KAAK;EAC1C,IAAI,MAAM,WAAW,SACd;QAAA,MAAM,aAAa,YACtB,IAAI,CAAC,UAAU,WAAW,UAAU,YAAY,OAC9C,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gDACF;EAAA;EAKN,MAAM,aAAa,YAAY,MAAM;EACrC,MAAM,UAAU,IAAI,eAAe,MAAM,IAAI;EAC7C,IAAI;EACJ,IAAI;GACF,oBAAoB,GAAG,qBAAqB,QAAQ,YAAY,OAAO;EACzE,UAAU;GACR,IAAI,KAAK,OAAO;EAClB;EACA,IAAI,qBAAqB,GACvB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wBAAwB,MAAM,KAAK,6BACrC;EAGF,MAAM,EAAE,SAAS,cAAc,UAC7B,KACF;EACA,IAAI,YAAY,KAAK,cAAc,GACjC,GAAG,uBAAuB,QAAQ,mBAAmB,SAAS,SAAS;EAEzE,IAAI,aAAa,SAAS,MAAM,SAC9B,KAAK,aAAa,mBAAmB,MAAM,OAAO;EAEpD,IAAI,kBAAkB,SAAS,MAAM,iBAAiB,KAAA,GACpD,KAAK,mBAAmB,mBAAmB,CAAC,MAAM,YAAY,CAAC;EAEjE,IAAI,eAAe,SAAS,MAAM,cAAc,KAAA,GAC1C;OAAA,CAAC,GAAG,wBAAwB,QAAQ,mBAAmB,MAAM,SAAS,GACxE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oBAAoB;EAAA;EAG1E,IAAI,MAAM,kBAAkB,KAAA,GAC1B,KAAK,gBACH,GAAG,gCACH,mBACA,MAAM,eACN,yBACF;EAEF,IAAI,MAAM,gBAAgB,KAAA,GACxB,KAAK,gBACH,GAAG,8BACH,mBACA,MAAM,aACN,uBACF;EAGF,KAAK,MAAM,aAAa,YAAY;GAClC,MAAM,qBAAqB,uBAAuB,KAAK,SAAS,KAAK,SAAS,SAAS;GACvF,MAAM,UACJ,MAAM,WAAW,UACb,UAAU,UACV,MAAM,WAAW,aACd,UAAU,WAAW,QACtB;GACR,IAAI,CAAC,GAAG,sBAAsB,QAAQ,mBAAmB,oBAAoB,OAAO,GAClF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,wBAAwB;EAE3E;EAEA,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,iBAAiB,EAAE;CACxD;;;;;;;;CASA,uBACE,KACA,KACA,WACA,QACoD;EACpD,eAAe,MAAM;EACrB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,QAAQ;EAC5B,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,MAAM;EAC3E,IAAI,OAAO,WAAW,aACpB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,IAAI,OAAO,KAAK,SAAS,OAAO,OAAO,8BACzC;EAUF,IARe,mBAAmB,KAAK,SAAS,SAAS,eACvD,wBAAwB,KAAK,SAAS,UAAU,CAAC,CAAC,MAC/C,MACC,EAAE,UACF,EAAE,MAAM,SAAS,kBACjB,EAAE,MAAM,sBAAsB,SAAS,iBAC3C,CAEO,GACP,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,IAAI,OAAO,KAAK,yDAClB;EAEF,IAAI,OAAO,QAAQ,WAAW,GAC5B,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,IAAI,OAAO,KAAK,6BAA6B;EAEjG,KAAK,MAAM,UAAU,OAAO,SAC1B,qBAAqB,KAAK,SAAS,QAAQ,QAAQ,KAAK,SAAS;EAEnE,KAAK,QAAQ,aAAa;EAC1B,MAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK,MAAM,EAAE,gBAAgB,CAAC,CAAC;EACxE,KAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,aAAa,GAAG;EACtD,OAAO;GAAE,OAAO,KAAK,cAAc,SAAS,iBAAiB;GAAG;EAAM;CACxE;CAEA,YACE,KACA,OACA,QACyB;EACzB,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,QAAQ;EAC5B,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EACjG,IAAI,OAAO,WAAW,MAAM,QAC1B,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iBAAiB,MAAM,OAAO,iCAAiC,OAAO,OAAO,EAC/E;EAEF,MAAM,oBAAoB,SAAS;EAEnC,IAAI,MAAM,SAAS,KAAA,GACjB,KAAK,gBACH,GAAG,uBACH,mBACA,MAAM,MACN,qBAAqB,MAAM,KAAK,gCAClC;EAEF,MAAM,EAAE,SAAS,cAAc,UAC7B,KACF;EACA,IAAI,YAAY,KAAK,cAAc,GAC7B;OAAA,CAAC,GAAG,uBAAuB,QAAQ,mBAAmB,SAAS,SAAS,GAC1E,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB;EAAA;EAG5E,IAAI,eAAe,SAAS,MAAM,cAAc,KAAA,GAC1C;OAAA,CAAC,GAAG,wBAAwB,QAAQ,mBAAmB,MAAM,aAAa,CAAC,GAC7E,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+CACF;EAAA;EAGJ,IAAI,kBAAkB,SAAS,MAAM,iBAAiB,KAAA,GACpD,IAAI,MAAM,iBAAiB,MACrB;OAAA,CAAC,GAAG,iCAAiC,QAAQ,iBAAiB,GAChE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,gCAAgC;EAAA,OAGpF,KAAK,mBAAmB,mBAAmB,CAAC,MAAM,YAAY,CAAC;EAGnE,IAAI,MAAM,kBAAkB,KAAA,GAC1B,KAAK,gBACH,GAAG,gCACH,mBACA,MAAM,iBAAiB,IACvB,yBACF;EAEF,IAAI,MAAM,gBAAgB,KAAA,GACxB,KAAK,gBACH,GAAG,8BACH,mBACA,MAAM,eAAe,IACrB,uBACF;EAEF,IAAI,aAAa,SAAS,MAAM,SAC9B,KAAK,aAAa,mBAAmB,MAAM,OAAO;EAGpD,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,iBAAiB,EAAE;CACxD;;;;;;CAOA,YACE,KACA,QACwE;EACxE,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,QAAQ;EAC5B,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EAYjG,IAAI,CAVO,aAAa,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc;GAC9D,IAAI,KAAK,UAAU,OAAO,CAAC;GAC3B,OAAO,GAAG,qBACR,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,KACA,KACA,QACF;EACF,CACM,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;EAG7E,KAAK,QAAQ,aAAa;EAC1B,OAAO;GACL,0BAA0B,SAAS;GACnC,iBAAiB,OAAO,QAAQ,KAAK,OAAO;IAC1C,mBAAmB,EAAE;IACrB,kBAAkB,EAAE;GACtB,EAAE;EACJ;CACF;CAEA,aACE,KACA,QACA,SACA,QACyB;EACzB,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,QAAQ;EAC5B,MAAM,SAAS,YAAY,KAAK,SAAS,OAAO,SAAS,YAAY,KAAK,QAAQ,cAAc,CAAC;EACjG,MAAM,SAAS,OAAO,WAAW,cAAc,OAAO,WAAW;EACjE,MAAM,QAAQ,SAAU,YAAY,OAAO,WAAW,aAAa,QAAQ,MAAO;EAClF,IAAI,WAAW,CAAC,SAAS,UAAU,QACjC,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,wDACF;EAEF,IACE,CAAC,GAAG,sBACF,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,OAAO,mBACP,KACF,GAEA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,sEACF;EAEF,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,SAAS,iBAAiB,EAAE;CACjE;CAEA,aACE,KACA,QACA,QACyB;EACzB,eAAe,MAAM;EACrB,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,KAAK,eAAe,QAAQ;EAC5B,IACE,CAAC,GAAG,sBACF,KAAK,QAAQ,cAAc,GAC3B,SAAS,mBACT,OAAO,iBACT,GAEA,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sCAAsC;EAE1F,KAAK,QAAQ,aAAa;EAC1B,OAAO,EAAE,OAAO,KAAK,cAAc,SAAS,iBAAiB,EAAE;CACjE;CAEA,aAAqB,OAA0C;EAC7D,IAAI,MAAM,WAAW,SACnB,OAAO,MAAM,WAAW,CAAC;EAE3B,OAAO,MAAM,SAAS,CAAC,MAAM,MAAM,IAAI,CAAC;CAC1C;CAEA,aACE,mBACA,SACM;EACN,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAY1C,IAAI,CAXO,oBACT,KAAK,SACL,QAAQ,KAAK,MAAM,EAAE,KAAK,IACzB,cACC,oBACE,KAAK,SACL,QAAQ,KAAK,MAAM,EAAE,KAAK,IACzB,YAAY,UACX,GAAG,yBAAyB,QAAQ,mBAAmB,WAAW,YAAY,KAAK,CACvF,CAEE,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,kBAAkB;CAExE;CAEA,gBACE,QACA,mBACA,OACA,cACM;EACN,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,WAAW,IAAI,eAAe,KAAK;EACzC,IAAI;GACF,IAAI,CAAC,OAAO,QAAQ,mBAAmB,QAAQ,GAC7C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY;EAElE,UAAU;GACR,IAAI,KAAK,QAAQ;EACnB;CACF;CAEA,mBAA2B,mBAA2B,QAAiC;EACrF,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAI1C,IAAI,CAHO,oBAAoB,KAAK,SAAS,SAAS,WAAW,UAC/D,GAAG,+BAA+B,QAAQ,mBAAmB,WAAW,KAAK,CAEzE,GACJ,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,wBAAwB;CAE9E;CAEA,cAAsB,mBAAyC;EAC7D,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,aAAa,KAAK,QAAQ,GAAG,+BAA+B,OAAO,iBAAiB;EAC1F,IAAI,aAAa,GACf,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,iCAAiC;EAElF,OAAO,YAAY,KAAK,SAAS,OAAO,YAAY,KAAK,QAAQ,cAAc,CAAC;CAClF;CAEA,eAAuB,UAA+B;EACpD,IAAI,SAAS,sBAAsB,GACjC,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+DACF;EAEF,KAAK,2BAA2B,QAAQ;CAC1C;;;;;;;;CASA,2BAAmC,UAA+B;EAChE,IAAI,KAAK,QAAQ,yBAAyB,WAAW;EACrD,IAAI;EACJ,IAAI;GACF,aAAa,IAAI,gBAAgB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,eAAe;EAC9E,QAAQ;GACN;EACF;EACA,IAAI,WAAW,WAAW,WAAW,GAAG;EACxC,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,OACJ,gBAAgB,KAAK,QAAQ,MAAM,KAAK,QACtC,KAAK,QAAQ,GAAG,sBAAsB,OAAO,SAAS,YAAY,KAAK,GAAG,CAC5E,KAAK;EACP,MAAM,QAAA,GAAA,8BAAA,aAAA,CAAoB,YAAY,IAAI;EAC1C,IAAI,MACF,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,mBAChB,eAAe,KAAK,2BAA2B,KAAK,eAAe,IAAI,KAAK,WAAW,aAAa,aAAa,QAAQ,EAC3H;CAEJ;;CAGA,WAAmB,mBAA2B,OAAiC;EAC7E,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAE1C,MAAM,UAAU,KAAK,oBAAoB,KAAK,KAAK,aAAa;GAC9D,QAAQ,MAAM,MAAd;IACE,SACE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;IAC7E,KAAK,QAAQ;KACX,MAAM,UAAU,IAAI,eAAe,MAAM,KAAK;KAC9C,IAAI;MACF,OAAO,GAAG,sBAAsB,QAAQ,mBAAmB,SAAS,KAAK,KAAK,QAAQ;KACxF,UAAU;MACR,IAAI,KAAK,OAAO;KAClB;IACF;IACA,KAAK,UAEH,OAAO,GAAG,mBACR,QACA,mBACA,MAAM,SAAS,IACf,KACA,KACA,QACF;IACF,KAAK,UACH,OAAO,oBAAoB,KAAK,SAAS,MAAM,SAAS,UAAU,UAChE,GAAG,yBACD,QACA,mBACA,UACA,OACA,KACA,KACA,QACF,CACF;GACJ;EACF,CAAC;EAED,IAAI,YAAY,MACd,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gFACF;EAEF,OAAO;CACT;;CAGA,mBACE,MACiB;EACjB,MAAM,EAAE,QAAQ,KAAK;EACrB,OAAO,aAAa,KAAK,CAACH,6BAA2B,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc;GAC/E,IAAI,KAAK,UAAU,OAAO,CAAC;GAC3B,IAAI,CAAC,KAAK,KAAKA,4BAA0B,QAAQ,GAC/C,OAAO;GAET,MAAM,QAAQ,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC;GAC9C,MAAM,WAAW,KAAK,IAAI,OAAOA,0BAAwB;GACzD,MAAM,UAAoB,CAAC;GAC3B,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAC5B,QAAQ,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;GAElD,OAAO;EACT,CAAC;CACH;;CAGA,SAAiB,mBAA2B,gBAA8C;EACxF,KAAK,QAAQ,aAAa;EAC1B,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,aAAa,KAAK,QAAQ,GAAG,+BAA+B,OAAO,iBAAiB;EAC1F,IAAI,aAAa,GACf,MAAM,IAAIE,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,iCAAiC;EAElF,MAAM,QAAsB,YAC1B,KAAK,SACL,OACA,YACA,KAAK,QAAQ,cAAc,CAC7B;EACA,MAAM,aAAa,IAAI,IAAI,cAAc;EAOzC,OAAO;GAAE;GAAO,gBANwB,MAAM,QAC3C,QAAQ,MAAM,WAAW,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAClD,KAAK,OAAO;IACX,mBAAmB,EAAE;IACrB,kBAAkB,EAAE;GACtB,EAC2B;GAAG,MAAMF;EAAW;CACnD;AACF;;AAGA,SAAS,YAAY,OAAmC;CACtD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,QAAQ,EAAE,GAAG,KAAK;EACnD,MAAM,IAAI,MAAM;EAEhB,IAAI,MAAM,OAAQ,MAAM,OAAQ,MAAM,KAAM;EAC5C,IAAI,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,IAAM;EAC1D,OAAO,MAAM,KAAiB,SAAS;CACzC;CACA,OAAO;AACT;;;AC9qBA,MAAM,2BAA2B;AACjC,MAAM,aAA2B;CAAE,eAAe,CAAC;CAAG,YAAY;AAAK;AACvE,MAAM,eAAe;CAAE,SAAS;CAAG,QAAQ;CAAG,SAAS;CAAG,QAAQ;AAAE;;AAepE,IAAa,sBAAb,MAAiC;CAC/B,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,MAAM,SAAuB,QAAwC;EACnE,eAAe,MAAM;EACrB,MAAM,wBAAwB,IAAI,wBAAwB;EAC1D,MAAM,qBAAqB,IAAI,wBAAwB;EACvD,MAAM,YAAY,QAAQ,KAAK,WAAW,KAAK,UAAU,QAAQ,qBAAqB,CAAC;EACvF,MAAM,UAA8B,CAAC;EACrC,MAAM,oCAAoB,IAAI,IAA2B;EACzD,IAAI,eAAe;EACnB,IAAI,OAAO;EAEX,KAAK,IAAI,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS;GACrD,MAAM,OAAO,UAAU;GACvB,IAAI,QAAS,OAAO,WAAW,cAAe;IAC5C,OAAO;IACP,QAAQ,KAAK,YAAY,OAAO,SAAS,CAAC;IAC1C;GACF;GACA,IAAI,OAAO,SAAS,eAAe,MAAM;GACzC,IAAI,KAAK,OAAO;IACd,QAAQ,KAAK;KACX,GAAG,YAAY,OAAO,UAAU;KAChC,QAAQ,KAAK;KACb,OAAO,KAAK;IACd,CAAC;IACD;GACF;GAEA,IAAI;GACJ,IAAI;IACF,SAAS,KAAK,mBAAmB,KAAK,iBAAiB,KAAK,UAAU,YAAY,CAAC;GACrF,SAAS,OAAO;IAGd,MAAM,SAAS,eAAe,WAAW;IACzC,QAAQ,KAAK;KAAE,GAAG,YAAY,OAAO,MAAM;KAAG,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAAE,CAAC;IAC5E,IAAI,WAAW,UAAU,OAAO;IAChC;GACF;GAEA,IAAI,OAAO,KAAK,QAAQ,MAAM,GAAG;IAC/B,QAAQ,KAAK;KAAE,GAAG,YAAY,OAAO,WAAW;KAAG,QAAQ;IAAO,CAAC;IACnE;GACF;GAEA,IAAI;IACF,MAAM,SAAS,KAAK,YAAY,KAAK,QAAQ,KAAK,kBAAkB;IACpE,IAAI,CAAC,OAAO,IAAI;KAGd,eAAe;KACf,KAAK,QAAQ,aAAa;KAC1B,MAAM,SAAS,KAAK,qBAAqB,KAAK,oBAAoB,kBAAkB;KACpF,MAAM,iBAAiB,WAAW,OAAO,4BAA4B,QAAQ,MAAM;KACnF,gBAAgB,mBAAmB,cAAc;KACjD,QAAQ,KAAK;MACX;MACA,QAAQ;MACR;MACA;MACA,QAAA,GAAA,8BAAA,eAAA,CACE,IAAIG,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,2CAA2C,CACtF;KACF,CAAC;KACD,OAAO;KACP;IACF;IAGA,IAAI,CADY,mBAAmB,KAAK,QAAQ,QAAQ,OAAO,0BACpD,GAAG;KACZ,QAAQ,KAAK;MAAE,GAAG,YAAY,OAAO,WAAW;MAAG,QAAQ;KAAO,CAAC;KACnE;IACF;IAEA,eAAe;IACf,KAAK,QAAQ,aAAa;IAC1B,MAAM,SAAS,KAAK,qBAAqB,KAAK,oBAAoB,kBAAkB;IACpF,MAAM,iBAAiB,WAAW,OAAO,4BAA4B,QAAQ,MAAM;IACnF,gBAAgB,mBAAmB,cAAc;IACjD,QAAQ,KAAK;KAAE;KAAO,QAAQ;KAAW;KAAQ;IAAe,CAAC;GACnE,SAAS,OAAO;IACd,eAAe;IACf,KAAK,QAAQ,aAAa;IAC1B,QAAQ,KAAK;KACX;KACA,QAAQ;KACR,QAAQ,KAAK,qBAAqB,KAAK,oBAAoB,kBAAkB;KAC7E,gBAAgB,CAAC;KACjB,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;IAC7B,CAAC;IACD,OAAO;GACT;EACF;EAEA,OAAO;GACL;GACA,gBAAgB,CAAC,GAAG,kBAAkB,OAAO,CAAC;GAC9C,MAAM,eAAe,aAAa;EACpC;CACF;CAEA,UAAkB,QAAoB,cAAwD;EAC5F,IAAI;GACF,MAAM,OAAO,OAAO,SAAS,UAAU,OAAO,OAAO,CAAC,OAAO,GAAG;GAChE,IAAI,KAAK,WAAW,GAClB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0CACF;GAEF,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;GACzD,MAAM,WAAW,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAO,GAAG,CAAC;GAC3D,MAAM,SAAS,SAAS,KAAK,EAAE,iBAC7B,YAAY,KAAK,SAAS,OAAO,YAAY,KAAK,QAAQ,cAAc,GAAG,YAAY,CACzF;GACA,eAAe,QAAQ,MAAM;GAC7B,OAAO;IACL;IACA,oBAAoB,SAAS,KAAK,EAAE,wBAAwB,iBAAiB;IAC7E;GACF;EACF,SAAS,OAAO;GACd,OAAO;IAAE;IAAQ,oBAAoB,CAAC;IAAG,QAAQ,CAAC;IAAG,QAAA,GAAA,8BAAA,eAAA,CAAsB,KAAK;GAAE;EACpF;CACF;CAEA,QACE,OACA,KACmD;EACnD,MAAM,WAAW,gBAAgB,KAAK,SAAS,OAAO,GAAG;EACzD,IAAI,SAAS,qBAAqB,GAChC,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,kBAChB,6CACF;EAEF,OAAO;CACT;CAEA,UACE,mBACA,eAAe,IAAI,wBAAwB,GAC7B;EACd,MAAM,QAAQ,iBAAiB,KAAK,SAAS,KAAK,OAAO;EACzD,MAAM,QAAQ,KAAK,QAAQ,GAAG,+BAA+B,OAAO,iBAAiB;EACrF,IAAI,QAAQ,GACV,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,kBAAkB,wBAAwB;EAElF,OAAO,YAAY,KAAK,SAAS,OAAO,OAAO,KAAK,QAAQ,cAAc,GAAG,YAAY;CAC3F;CAEA,qBACE,oBACA,cACgB;EAChB,MAAM,SAAyB,CAAC;EAChC,KAAK,MAAM,gBAAgB,oBACzB,IAAI;GACF,OAAO,KAAK,KAAK,UAAU,cAAc,YAAY,CAAC;EACxD,QAAQ,CAGR;EAEF,OAAO;CACT;CAEA,YAAoB,QAAoB,oBAAkD;EACxF,IAAI,OAAO,SAAS,SAAS;GAC3B,MAAM,UAAoB,CAAC;GAC3B,KAAK,MAAM,gBAAgB,oBAAoB;IAC7C,MAAM,SAAS,KAAK,oBAAoB,KAAK,KAAK,aAChD,KAAK,QAAQ,GAAG,oBACd,KAAK,QAAQ,cAAc,GAC3B,cACA,KACA,KACA,QACF,CACF;IACA,QAAQ,KAAK,GAAG,OAAO,0BAA0B;IACjD,IAAI,CAAC,OAAO,IAAI,OAAO;KAAE,IAAI;KAAO,4BAA4B;IAAQ;GAC1E;GACA,OAAO;IAAE,IAAI;IAAM,4BAA4B;GAAQ;EACzD;EAEA,MAAM,eAAe,mBAAmB;EACxC,QAAQ,OAAO,MAAf;GACE,KAAK,YACH,OAAO,KAAK,WAAW,cAAc,OAAO,KAAK;GACnD,KAAK,cACH,OAAO,KAAK,oBAAoB,KAAK,KAAK,aACxC,KAAK,QAAQ,GAAG,yBACd,KAAK,QAAQ,cAAc,GAC3B,cACA,aAAa,OAAO,UACpB,KACA,KACA,QACF,CACF;GACF,KAAK,qBAAqB;IACxB,MAAM,UAAU,KAAK,QAAQ,IAAI,eAAe,OAAO,IAAI;IAC3D,IAAI;KACF,OAAO,KAAK,oBAAoB,KAAK,KAAK,aACxC,KAAK,QAAQ,GAAG,gCACd,KAAK,QAAQ,cAAc,GAC3B,cACA,SACA,KACA,KACA,QACF,CACF;IACF,UAAU;KACR,KAAK,QAAQ,IAAI,KAAK,OAAO;IAC/B;GACF;EACF;CACF;CAEA,WAAmB,mBAA2B,OAA2C;EACvF,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,OAAO,KAAK,oBAAoB,KAAK,KAAK,aAAa;GACrD,IAAI,MAAM,SAAS,UACjB,OAAO,GAAG,mBACR,QACA,mBACA,MAAM,SAAS,IACf,KACA,KACA,QACF;GAEF,IAAI,MAAM,SAAS,UACjB,OAAO,oBAAoB,KAAK,SAAS,MAAM,SAAS,WAAW,UACjE,GAAG,yBACD,QACA,mBACA,WACA,OACA,KACA,KACA,QACF,CACF;GAEF,MAAM,WAAW,IAAI,eAAe,MAAM,KAAK;GAC/C,IAAI;IACF,OAAO,GAAG,sBAAsB,QAAQ,mBAAmB,UAAU,KAAK,KAAK,QAAQ;GACzF,UAAU;IACR,IAAI,KAAK,QAAQ;GACnB;EACF,CAAC;CACH;CAEA,mBACE,MACoB;EACpB,MAAM,EAAE,QAAQ,KAAK;EACrB,OAAO,aAAa,KAAK,CAAC,2BAA2B,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc;GAC/E,IAAI,KAAK,UAAU,OAAO,CAAC;GAC3B,MAAM,KAAK,KAAK,KAAK,0BAA0B,QAAQ;GACvD,MAAM,QAAQ,KAAK,IACjB,KAAK,IAAI,GAAG,OAAO,IAAI,KAAK,UAAU,KAAK,CAAC,CAAC,GAC7C,wBACF;GACA,MAAM,6BAAuC,CAAC;GAC9C,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SACjC,2BAA2B,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC;GAEzE,OAAO;IAAE;IAAI;GAA2B;EAC1C,CAAC;CACH;AACF;AAEA,SAAS,eAAe,QAAoB,QAA8B;CACxE,IAAI,OAAO,SAAS,SAAS;EAC3B,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,WAAW,gBAAgB,MAAM,WAAW,aACpD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,GAAG,MAAM,OAAO,wBAAwB;EAG9F;CACF;CACA,MAAM,QAAQ,OAAO;CACrB,IAAI,OAAO,SAAS,qBAAqB;EACvC,IAAI,MAAM,WAAW,UAAU,MAAM,WAAW,YAC9C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,uCAAuC,MAAM,OAAO,OACtD;EAEF;CACF;CACA,IAAI,OAAO,SAAS,cAAc;CAClC,cAAc,OAAO,OAAO,KAAK;AACnC;AAEA,SAAS,cAAc,OAAqB,OAA6B;CACvE,IAAI,MAAM,SAAS,QAAQ;EACzB,IAAI,MAAM,WAAW,QAAQ,SAAS,OAAO,KAAK;EAClD;CACF;CACA,IAAI,MAAM,SAAS,UAAU;EAC3B,IAAI,MAAM,WAAW,cAAc,MAAM,WAAW,SAAS,SAAS,OAAO,KAAK;EAClF,IAAI,MAAM,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,WAAW,OAAO,YAAY,MAAM,KAAK,GACxF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,iCAAiC;EAErF;CACF;CACA,IAAI,MAAM,WAAW,cAAc,MAAM,WAAW,WAAW,SAAS,OAAO,KAAK;CACpF,IAAI,IAAI,IAAI,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,OAAO,QAC9C,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,2CAA2C;CAE/F,IAAI,MAAM,WAAW,cAAc,MAAM,OAAO,SAAS,GACvD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sCAAsC;CAE1F,IAAI,MAAM,WAAW,aAAa,CAAC,MAAM,eAAe,MAAM,OAAO,SAAS,GAC5E,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,2CAA2C;CAE/F,MAAM,eAAe,IAAI,IAAI,MAAM,QAAQ,KAAK,WAAW,OAAO,KAAK,CAAC;CAExE,IAAI,EADa,MAAM,WAAW,cAAc,MAAM,QAAQ,MAAM,OAAO,WAAW,MACrE,MAAM,OAAO,MAAM,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC,GACpE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oCAAoC;AAE1F;AAEA,SAAS,SAAS,OAAqB,OAA8B;CACnE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,eAAe,MAAM,KAAK,yBAAyB,MAAM,OAAO,QAClE;AACF;AAEA,SAAS,OAAO,QAAoB,QAAiC;CACnE,IAAI,OAAO,SAAS,qBAAqB,OAAO,OAAO,EAAE,CAAC,QAAQ,WAAW;CAC7E,IAAI,OAAO,SAAS,cAAc,OAAO,OAAO,EAAE,CAAC,QAAQ,WAAW;CACtE,IAAI,OAAO,SAAS,SAClB,OAAO,OAAO,OAAO,UAAU,kBAAkB,MAAM,YAAY,MAAM,iBAAiB,CAAC;CAE7F,MAAM,QAAQ,OAAO;CACrB,MAAM,QAAQ,OAAO;CACrB,IAAI,MAAM,SAAS,UAAU,MAAM,WAAW,QAAQ,OAAO,MAAM,UAAU,MAAM;CACnF,IAAI,MAAM,SAAS,aAAa,MAAM,WAAW,cAAc,MAAM,WAAW,UAC9E,OAAO,MAAM,QAAQ,OAAO,WAAW,OAAO,aAAa,OAAO,YAAY,MAAM,MAAM;CAE5F,IAAI,MAAM,SAAS,YAAY,MAAM,WAAW,YAC9C,OAAO,MAAM,OAAO,WAAW,IAAI,MAAM,UAAU,KAAK,MAAM,UAAU,MAAM,OAAO;CAEvF,IAAI,MAAM,SAAS,YAAY,MAAM,WAAW,WAC9C,OAAO,YAAY,MAAM,gBAAgB,MAAM,MAAM;CAEvD,OAAO;AACT;AAEA,SAAS,mBACP,QACA,QACA,4BACS;CACT,IAAI,OAAO,SAAS,gBAAgB,OAAO,SAAS,qBAClD,OAAO,2BAA2B,SAAS;CAE7C,OAAO,CAAC,OAAO,QAAQ,MAAM,KAAK,2BAA2B,SAAS;AACxE;AAEA,SAAS,kBACP,MACA,OACS;CACT,IAAI,KAAK,SAAS,MAAM,MAAM,OAAO;CACrC,IAAI,KAAK,SAAS,YAAY,MAAM,SAAS,UAAU,OAAO,KAAK,UAAU,MAAM;CACnF,IAAI,KAAK,SAAS,WAAW,MAAM,SAAS,SAC1C,OAAO,YAAY,KAAK,QAAQ,MAAM,MAAM;CAC9C,OAAO;AACT;AAEA,SAAS,YAAY,MAAyB,OAAmC;CAC/E,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,OAAO,UAAU,UAAU,MAAM,MAAM;AAC5F;AAEA,SAAS,WACP,eACA,QACA,OACiB;CACjB,MAAM,iCAAiB,IAAI,IAA2B;CACtD,KAAK,MAAM,SAAS,CAAC,GAAG,QAAQ,GAAG,KAAK,GACtC,KAAK,MAAM,UAAU,MAAM,SAAS,eAAe,IAAI,OAAO,mBAAmB,MAAM;CAEzF,OAAO,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC,CAAC,CAC/B,KAAK,iBAAiB,eAAe,IAAI,YAAY,CAAC,CAAC,CACvD,QAAQ,WAAoC,WAAW,KAAA,CAAS,CAAC,CACjE,KAAK,EAAE,mBAAmB,wBAAwB;EAAE;EAAmB;CAAiB,EAAE;AAC/F;AAEA,SAAS,gBAAgB,QAAoC,SAAgC;CAC3F,KAAK,MAAM,UAAU,SACnB,OAAO,IAAI,GAAG,OAAO,iBAAiB,GAAG,OAAO,qBAAqB,MAAM;AAE/E;AAEA,SAAS,YAAY,OAAe,QAAsD;CACxF,OAAO;EAAE;EAAO;EAAQ,QAAQ,CAAC;EAAG,gBAAgB,CAAC;CAAE;AACzD;;;;;;;;;;;;;;;;;;;AC5ZA,MAAM,mBAAmB;AAEzB,MAAM,wBAAQ,IAAI,QAAiE;AAEnF,SAAgB,kBACd,SACA,SACA,kBACA,QACY;CACZ,MAAM,MAAM,QAAQ,YAAY;CAChC,IAAI,QAAQ,MAAM,IAAI,OAAO;CAC7B,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,MAAM,IAAI,SAAS,KAAK;CAC1B;CAEA,MAAM,MAAM,MAAM,IAAI,gBAAgB;CACtC,IAAI,OAAO,IAAI,QAAQ,KAAK,OAAO;CAEnC,MAAM,WAAW,IAAI,eAAe,SAAS,OAAO,CAAC,CAAC,KAAK,kBAAkB,MAAM;CACnF,MAAM,QAAyB;EAAE;EAAK,SAAA,GAAA,8BAAA,SAAA,CAAiB,SAAS,IAAI;EAAG;CAAS;CAEhF,MAAM,OAAO,gBAAgB;CAC7B,MAAM,IAAI,kBAAkB,KAAK;CACjC,IAAI,MAAM,OAAO,kBAAkB;EACjC,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;EACnC,IAAI,WAAW,KAAA,GAAW,MAAM,OAAO,MAAM;CAC/C;CACA,OAAO;AACT;;;;AC1CA,SAAgB,eAAe,OAAoB,MAAsB;CACvE,OAAO,KAAK,UAAU;EACpB,MAAM,QAAQ,MAAM;EACpB,MAAM;EACN,MAAM,YAAY,IAAI;EACtB,MAAM,kBAAkB,IAAI;EAC5B,MAAM,YAAY,IAAI;EACtB;CACF,CAAC;AACH;AAEA,SAAgB,mBAAmB,OAAkC;CACnE,OAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAgB,mBACd,SACA,QACA,aACA,aACmB;CACnB,IAAI;CACJ,IAAI;EACF,QAAQ,KAAK,MAAM,MAAM;CAC3B,QAAQ;EACN,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;CAC7E;CACA,IAAI,OAAO,MAAM,KAAK,OAAO,MAAM,YAAY,YAAY,OAAO,MAAM,QAAQ,UAC9E,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;CAE7E,IAAI,MAAM,QAAQ,aAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iEACF;CAEF,IAAI,MAAM,QAAQ,aAChB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,6EACA,EAAE,SAAS;EAAE,WAAW,MAAM;EAAK,YAAY;CAAY,EAAE,CAC/D;CAGF,IAAI,QAAQ,cAAc,KAAA,KAAa,QAAQ,cAAc,MAAM,OACjE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oEACF;CAEF,OAAO;AACT;;;;;;;;;;AC5CA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;;;;;;;;;;;;;;;;AAiB5B,IAAa,eAAb,MAA0B;CACxB,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,MAAM,SAAwB,QAAkC;EAC9D,eAAe,MAAM;EACrB,MAAM,QAAQ,QAAQ;EACtB,MAAM,OAAO,QAAQ,QAAQ;EAK7B,MAAM,SAAA,GAAA,8BAAA,oBAAA,CAA4B,KAAK;EACvC,IAAI,CAAC,MAAM,IACT,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yBAAyB,MAAM,MAAM,KAAK,MAAM,SAClD;EAGF,MAAM,UAAU,KAAK,QAAQ,WAAW;EACxC,MAAM,aAAa,QAAQ;EAG3B,IAAI,CAAC,MAAM,UAAA,GAAA,8BAAA,SAAA,CAAkB,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,WAAW,GAChE,OAAO;GAAE,SAAS,CAAC;GAAG,YAAY;GAAM,cAAc;GAAG;EAAW;EAGtE,MAAM,MAAM,KAAK,QAAQ,YAAY;EACrC,MAAM,MAAM,eAAe,OAAO,IAAI;EAEtC,IAAI,QAAQ;EACZ,IAAI,UAAU;EACd,IAAI,QAAQ,WAAW,KAAA,GAAW;GAChC,MAAM,QAAQ,mBAAmB,SAAS,QAAQ,QAAQ,KAAK,GAAG;GAClE,QAAQ,MAAM;GACd,UAAU,MAAM;EAClB,OAAO;GACL,IAAI,QAAQ,cAAc,KAAA,GAAW;IAEnC,KAAK,QAAQ,qBAAqB,QAAQ,SAAS;IACnD,QAAQ,QAAQ;GAClB;GACA,IAAI,QAAQ,SAAS,KAAA,GAInB,UAAU,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,UAAU;EAExE;EAGA,IAAI,QAAQ;EACZ,IAAI,UAAU,GAAG;GACf,MAAM,KAAK,QAAQ,WAAW,MAAM,EAAE,qBAAqB,KAAK;GAChE,QAAQ,QAAQ,MAAM,EAAE,CAAC,CAAC,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC;EACvD;EAEA,MAAM,WAAW,MAAM,QAAQ,QAAQ,UAAU,mBAAmB,iBAAiB;EACrF,MAAM,aAAa,MAAM,QAAQ,QAAQ,YAAY,qBAAqB,mBAAmB;EAE7F,MAAM,UAAyB,CAAC;EAChC,IAAI,iBAAiB;EAGrB,OAAO,UAAU,MAAM,UAAU,iBAAiB,YAAY,QAAQ,SAAS,YAAY;GACzF,eAAe,MAAM;GACrB,MAAM,MAAM,MAAM,QAAQ,CAAC;GAC3B,MAAM,SAAS,kBAAkB,KAAK,SAAS,KAAK,SAAS,KAAK,MAAM;GAExE,MAAM,OAAO,OAAO,SAAS;GAC7B,IAAI;GACJ,IAAI,MAAM,OACR,UAAA,GAAA,8BAAA,WAAA,CAAoB,MAAM,KAAK;QAC1B,IAAI,MAAM,aAAa,MAAM,iBAElC,UAAA,GAAA,8BAAA,aAAA,EAAA,GAAA,8BAAA,SAAA,CAA+B,OAAA,GAAA,8BAAA,eAAA,CAAqB,KAAK,CAAC,GAAG,KAAK;QAElE,UAAA,GAAA,8BAAA,aAAA,CAAsB,OAAO,QAAQ,KAAK;GAG5C,IAAI,OAAO,SAAS,GAAG;IAGrB,MAAM,UAAA,GAAA,8BAAA,oBAAA,CAFW,IAAI,mBAAmB,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK,MAEpC,CAAC;IAC3C,KAAK,MAAM,SAAS,QAAQ;KAM1B,MAAM,SAAA,GAAA,8BAAA,wBAAA,CAAgC,OAAO,UAAU,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM;KAC9F,QAAQ,KAAK;MACX,kBAAkB;MAClB,WAAW,MAAM;MACjB,WAAW,MAAM,MAAM,MAAM;MAC7B,WAAA,GAAA,8BAAA,qBAAA,CAA+B,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,KAAK;MAC3E,GAAI,SAAS,SAAS,EAAE,UAAA,GAAA,8BAAA,aAAA,CAAsB,MAAM,KAAK,EAAE,IAAI,CAAC;KAClE,CAAC;IACH;GACF;GAEA;GACA;EACF;EAEA,OAAO;GACL;GACA,YACE,UAAU,MAAM,SAAS,mBAAmB;IAAE,GAAG;IAAG;IAAK;IAAK;IAAO;GAAQ,CAAC,IAAI;GACpF,cAAc;GACd;EACF;CACF;AACF;AAEA,SAAS,MAAM,WAA+B,UAAkB,SAAyB;CACvF,IAAI,cAAc,KAAA,KAAa,CAAC,OAAO,SAAS,SAAS,GAAG,OAAO;CACnE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,SAAS,GAAG,OAAO,CAAC;AAC7D;;;ACrKA,MAAM,yBAAyB;CAC7B,CAAC,aAAa,CAAC;CACf,CAAC,YAAY,CAAC;CACd,CAAC,WAAW,CAAC;CACb,CAAC,aAAa,CAAC;CACf,CAAC,YAAY,CAAC;AAChB;;AAGA,IAAa,wBAAb,MAAmC;CACjC,YACE,SACA,SACA;EAFiB,KAAA,UAAA;EACA,KAAA,UAAA;CAChB;CAEH,KAAK,QAA8C;EACjD,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,SAAS,IAAI,wBAAwB;EAC3C,MAAM,QAAQ,GAAG,iCAAiC,MAAM;EACxD,IAAI,QAAQ,GACV,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,cAChB,2CACF;EAGF,MAAM,kBAA8D,CAAC;EACrE,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS;GAC1C,eAAe,MAAM;GACrB,MAAM,WAAW,GAAG,4BAA4B,QAAQ,KAAK;GAC7D,IAAI,aAAaC,yBAAAA,UACf,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,sCAAsC,EACxF,SAAS,EAAE,MAAM,EACnB,CAAC;GAEH,IAAI;GACJ,IAAI;IACF,OACE,gBAAgB,MAAM,KAAK,aACzB,GAAG,6BAA6B,UAAU,KAAK,QAAQ,CACzD,KAAK;GACT,UAAU;IACR,GAAG,8BAA8B,QAAQ;GAC3C;GAGA,OAAO,oBAAoB,KAAK,MAAM;GACtC,MAAM,SAAS,cACb,gBACE,IACA,KACA,QACA,GAAG,sCAAsC,QAAQ,KAAK,GACtD,MACF,GACA,oBACA,KACF;GACA,gBAAgB,KAAK;IAAE;IAAM;GAAO,CAAC;EACvC;EAEA,MAAM,aAAa,gBACjB,IACA,KACA,QACA,GAAG,2BAA2B,MAAM,GACpC,MACF;EAGA,MAAM,cAAc,aAAaC,yBAAAA,WAAW,GAAG,0BAA0B,MAAM;EAC/E,MAAM,kBACJ,gBAAgBA,yBAAAA,WAAW,gBAAgB,IAAI,KAAK,QAAQ,WAAW,IAAI;EAC7E,MAAM,aACJ,CAAC;EACH,KAAK,MAAM,CAAC,KAAK,UAAU,wBAAwB;GACjD,eAAe,MAAM;GACrB,MAAM,SAAS,gBACb,IACA,KACA,QACA,GAAG,iCAAiC,QAAQ,KAAK,GACjD,MACF;GACA,IAAI,QAAQ,WAAW,OAAO;EAChC;EACA,OAAO;GAAE;GAAiB;GAAY;GAAiB,GAAG;EAAW;CACvE;AACF;AAEA,SAAS,cAAc,QAA8B,OAAe,OAA8B;CAChG,IAAI,QAAQ,OAAO;CACnB,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,cAAc,kBAAkB,SAAS,EAC7E,SAAS,EAAE,MAAM,EACnB,CAAC;AACH;;;AC1FA,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,WAAW;AACjB,MAAM,YAAY;;;;;;;;;;;;AAalB,IAAa,oBAAb,MAA+B;CAC7B,YACE,SACA,SACA,kBACA;EAHiB,KAAA,UAAA;EACA,KAAA,UAAA;EACA,KAAA,mBAAA;EAEjB,IAAI,qBAAqB,KAAA,GAEvB,QAAQ,qBAAqB,gBAAgB;CAEjD;CAEA,KAAK,aAAqB,QAA+C;EACvE,eAAe,MAAM;EACrB,mBAAmB,WAAW;EAC9B,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAMjB,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,0BAA0B,QAAQ,WAAW,IAChD,GAAG,8BAA8B,QAAQ,KAAK,WAAW,IACrD,OAAO;EAEjB,MAAM,WACJ,QAAQ,KAAA,IACJ,GAAG,6BAA6B,QAAQ,WAAW,IACnD,GAAG,iCAAiC,QAAQ,KAAK,WAAW;EAElE,MAAM,UAA0C,CAAC;EACjD,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;GACjC,eAAe,MAAM;GACrB,MAAM,MAAM,eAAe,MAAM,KAAK,QACpC,QAAQ,KAAA,IACJ,GAAG,0BAA0B,QAAQ,aAAa,GAAG,KAAK,GAAG,IAC7D,GAAG,8BAA8B,QAAQ,KAAK,aAAa,GAAG,KAAK,GAAG,CAC5E;GACA,IAAI,QAAQ,MAAM;GAClB,QAAQ,OAAO,KAAK,UAAU,aAAa,GAAG;EAChD;EAEA,MAAM,kBAAkB,gBACtB,MACC,KAAK,QACJ,QAAQ,KAAA,IACJ,GAAG,iCAAiC,QAAQ,aAAa,KAAK,GAAG,IACjE,GAAG,qCAAqC,QAAQ,KAAK,aAAa,KAAK,GAAG,GAChF,IACF;EACA,OAAO;GACL;GACA,cAAc,kBAAkB,aAAa,eAAe,IAAI;EAClE;CACF;CAEA,OAAO,aAAqB,OAAuB,QAA2B;EAC5E,eAAe,MAAM;EACrB,mBAAmB,WAAW;EAC9B,aAAa,KAAK;EAClB,MAAM,OAAO,OAAO,KAAK,KAAK;EAC9B,IAAI,KAAK,WAAW,GAAG;EACvB,cAAc,OAAO,IAAI;EAMzB,eAAe,MAAM;EAErB,MAAM,EAAE,QAAQ,KAAK;EAErB,MAAM,eAAe,8BAAc,IAAI,KAAK,CAAC;EAC7C,MAAM,QAAQ,IAAI,eAAe,YAAY;EAC7C,IAAI;GACF,KAAK,MAAM,OAAO,MAAM;IACtB,MAAM,QAAQ,MAAM;IAEpB,IAAI,CADO,KAAK,WAAW,aAAa,KAAK,OAAO,KAC9C,GACJ,MAAM,IAAIE,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,qCAAqC,IAAI,mBAC3C;GAEJ;EACF,UAAU;GACR,IAAI,KAAK,KAAK;EAChB;CACF;CAEA,aAAa,QAA+B;EAC1C,eAAe,MAAM;EACrB,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EACjB,MAAM,QACJ,QAAQ,KAAA,IACJ,GAAG,+BAA+B,MAAM,IACxC,GAAG,mCAAmC,QAAQ,GAAG;EACvD,MAAM,MAAgB,CAAC;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC9B,MAAM,OAAO,eAAe,MAAM,KAAK,QACrC,QAAQ,KAAA,IACJ,GAAG,4BAA4B,QAAQ,GAAG,KAAK,GAAG,IAClD,GAAG,gCAAgC,QAAQ,KAAK,GAAG,KAAK,GAAG,CACjE;GACA,IAAI,SAAS,MAAM,IAAI,KAAK,IAAI;EAClC;EACA,OAAO;CACT;CAEA,MAAM,aAAqB,QAA2B;EACpD,eAAe,MAAM;EACrB,mBAAmB,WAAW;EAC9B,MAAM,EAAE,OAAO,KAAK;EACpB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAKjB,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,4BAA4B,QAAQ,WAAW,IAClD,GAAG,gCAAgC,QAAQ,KAAK,WAAW,IAE/D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,6CAA6C,YAAY,EAC3D;CAEJ;CAEA,UAAkB,aAAqB,KAA6B;EAClE,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAMjB,QAJE,QAAQ,KAAA,IACJ,GAAG,8BAA8B,QAAQ,aAAa,GAAG,IACzD,GAAG,kCAAkC,QAAQ,KAAK,aAAa,GAAG,GAExE;GACE,KAAK,YAAY;IACf,MAAM,QAAQ,gBACZ,MACC,KAAK,QACJ,QAAQ,KAAA,IACJ,GAAG,2BAA2B,QAAQ,aAAa,KAAK,KAAK,GAAG,IAChE,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,KAAK,GAAG,GAC/E,EACF;IACA,OAAO,UAAU,OAAO,EAAE,MAAM,UAAU,IAAI;KAAE,MAAM;KAAU;IAAM;GACxE;GACA,KAAK,UAAU;IACb,MAAM,QAAQ,eAAe,MAAM,KAAK,QACtC,QAAQ,KAAA,IACJ,GAAG,yBAAyB,QAAQ,aAAa,KAAK,KAAK,GAAG,IAC9D,GAAG,6BAA6B,QAAQ,KAAK,aAAa,KAAK,KAAK,GAAG,CAC7E;IACA,OAAO,UAAU,OAAO,EAAE,MAAM,UAAU,IAAI;KAAE,MAAM;KAAQ;IAAM;GACtE;GACA,KAAK,YAAY;IACf,MAAM,SAAS,IAAI,MAAM,CAAC;IAC1B,IAAI;KAKF,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,2BAA2B,QAAQ,aAAa,KAAK,MAAM,IAC9D,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,MAAM,IACpE,OAAO,EAAE,MAAM,UAAU;KAClC,OAAO;MAAE,MAAM;MAAU,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;KAAE;IAClE,UAAU;KACR,IAAI,KAAK,MAAM;IACjB;GACF;GACA,KAAK,aAAa;IAChB,MAAM,SAAS,IAAI,MAAM,CAAC;IAC1B,IAAI;KAKF,IAAI,EAHF,QAAQ,KAAA,IACJ,GAAG,4BAA4B,QAAQ,aAAa,KAAK,MAAM,IAC/D,GAAG,gCAAgC,QAAQ,KAAK,aAAa,KAAK,MAAM,IACrE,OAAO,EAAE,MAAM,UAAU;KAClC,OAAO;MAAE,MAAM;MAAW,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC,MAAM;KAAE;IACzE,UAAU;KACR,IAAI,KAAK,MAAM;IACjB;GACF;GACA,KAAK,WAAW;IACd,MAAM,QACJ,QAAQ,KAAA,IACJ,GAAG,qCAAqC,QAAQ,aAAa,GAAG,IAChE,GAAG,yCAAyC,QAAQ,KAAK,aAAa,GAAG;IAE/E,IAAI,QAAQ,GAAG,OAAO,EAAE,MAAM,UAAU;IACxC,MAAM,QAAkB,CAAC;IACzB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;KAC9B,MAAM,OAAO,gBACX,MACC,KAAK,QACJ,QAAQ,KAAA,IACJ,GAAG,kCAAkC,QAAQ,aAAa,KAAK,GAAG,KAAK,GAAG,IAC1E,GAAG,sCACD,QACA,KACA,aACA,KACA,GACA,KACA,GACF,GACN,EACF;KACA,IAAI,SAAS,MAAM,OAAO,EAAE,MAAM,UAAU;KAC5C,MAAM,KAAK,IAAI;IACjB;IACA,OAAO;KAAE,MAAM;KAAgB;IAAM;GACvC;GACA,SACE,OAAO,EAAE,MAAM,UAAU;EAC7B;CACF;CAEA,WACE,aACA,KACA,OACA,OACS;EACT,MAAM,EAAE,IAAI,QAAQ,KAAK;EACzB,MAAM,SAAS,KAAK,QAAQ,cAAc;EAC1C,MAAM,MAAM,KAAK;EAEjB,IAAI,UAAU,MACZ,OAAO,QAAQ,KAAA,IACX,GAAG,0BAA0B,QAAQ,aAAa,KAAK,KAAK,IAC5D,GAAG,8BAA8B,QAAQ,KAAK,aAAa,KAAK,KAAK;EAE3E,IAAI,OAAO,UAAU,UACnB,OAAO,iBAAiB,KAAK,QAAQ,QACnC,QAAQ,KAAA,IACJ,GAAG,2BAA2B,QAAQ,aAAa,KAAK,KAAK,KAAK,IAClE,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,KAAK,KAAK,CACjF;EAEF,IAAI,OAAO,UAAU,UACnB,OAAO,QAAQ,KAAA,IACX,GAAG,2BAA2B,QAAQ,aAAa,KAAK,OAAO,KAAK,IACpE,GAAG,+BAA+B,QAAQ,KAAK,aAAa,KAAK,OAAO,KAAK;EAEnF,IAAI,OAAO,UAAU,WACnB,OAAO,QAAQ,KAAA,IACX,GAAG,4BAA4B,QAAQ,aAAa,KAAK,OAAO,KAAK,IACrE,GAAG,gCAAgC,QAAQ,KAAK,aAAa,KAAK,OAAO,KAAK;EAEpF,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,oBAAoB,KAAK,SAAS,QAAQ,UAAU,UACzD,QAAQ,KAAA,IACJ,GAAG,gCAAgC,QAAQ,aAAa,KAAK,UAAU,OAAO,KAAK,IACnF,GAAG,oCACD,QACA,KACA,aACA,KACA,UACA,OACA,KACF,CACN;EAEF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,OAC3D,OAAO,QAAQ,KAAA,IACX,GAAG,yBAAyB,QAAQ,aAAa,KAAK,MAAM,MAAM,KAAK,IACvE,GAAG,6BAA6B,QAAQ,KAAK,aAAa,KAAK,MAAM,MAAM,KAAK;EAItF,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,oCAAoC,IAAI,EAAE;CAC3F;AACF;AAEA,SAAS,mBAAmB,aAA2B;CACrD,IAAI,OAAO,gBAAgB,YAAY,YAAY,WAAW,GAC5D,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yCAAyC;AAE/F;AAEA,SAAS,aAAa,OAA6B;CACjD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,mCAAmC;AAEzF;AAEA,SAAS,cAAc,OAAuB,MAAsB;CAClE,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,IAAI,WAAW,GACjB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,kCAAkC;EAEtF,mBAAmB,KAAK,MAAM,IAAI;CACpC;AACF;AAEA,SAAS,mBAAmB,KAAa,OAAqC;CAC5E,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;CAE/E,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI,CAAC,OAAO,SAAS,KAAK,GACxB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yBAAyB,IAAI,iBAC/B;EAEF;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,IAAI,CAAC,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ,GACjD,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,IAAI,4BACrC;EAEF;CACF;CAEA,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,OAAO;EAClE,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,GAC1D,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,2BAA2B,IAAI,6BACjC;EAEF;CACF;CAEA,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oCAAoC,IAAI,0DAC1C;AACF;;;;;;;;;;;;;ACrLA,IAAa,aAAb,MAAwB;CActB,YACE,SASA,MAEA,UAA8C,CAAC,GAC/C;EAZiB,KAAA,UAAA;EASA,KAAA,OAAA;EAEA,KAAA,UAAA;EAzBF,gBAAA,MAAA,4BAAW,IAAI,IAA6B,CAAA;EAC5C,gBAAA,MAAA,iBAAA,KAAA,CAAA;EACA,gBAAA,MAAA,0BAAS,IAAI,IAAkC,CAAA;EAO/C,gBAAA,MAAA,2BAAU,IAAI,IAAoB,CAAA;EAClC,gBAAA,MAAA,SAAA,KAAA,CAAA;EACT,gBAAA,MAAA,aAAY,KAAA;EAgBlB,kBAAkB,KAAK,OAAO;EAC9B,KAAK,gBAAgB,IAAI,qBAAqB,KAAK,OAAO;EAC1D,KAAK,QAAQ,IAAI,cAAc,KAAK,SAAS,KAAK,OAAO;CAC3D;;;;;;;;CASA,qBAAqB,OAAyC;EAC5D,KAAK,MAAM,gBAAgB,KAAK;CAClC;CAEA,QAAQ,KAA0B;EAChC,IAAI,IAAI,SAAS,SAAS;GACxB,KAAK,OAAO,IAAI,IAAI,KAAK,CAAC,EAAE,MAAM;GAClC;EACF;EAQA,IACE,IAAI,SAAS,yBACb,IAAI,SAAS,oCACb,IAAI,SAAS,wCACb;GACA,KAAU,eAAe,GAAG;GAC5B;EACF;EAEA,MAAM,OAAO,IAAI,gBAAgB;EACjC,KAAK,OAAO,IAAI,IAAI,OAAO,IAAI;EAO/B,IAAI;EACJ,IAAI;GAKF,KAAK,uBAAuB,GAAG;GAC/B,QAAQ,IAAI,MAAZ;IACE,KAAK;IACL,KAAK;IACL,KAAK;KACH,aAAa,KAAK,WAAW,GAAG;KAChC;IACF,KAAK;KACH,aAAa,KAAK,mBAAmB,KAAK,KAAK,MAAM;KACrD;IACF,KAAK;KACH,aAAa,KAAK,qBAAqB,KAAK,KAAK,MAAM;KACvD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,4BAA4B,KAAK,KAAK,MAAM;KAC9D;IACF,KAAK;KACH,aAAa,KAAK,6BAA6B,KAAK,KAAK,MAAM;KAC/D;IACF,KAAK;KACH,aAAa,KAAK,8BAA8B,KAAK,KAAK,MAAM;KAChE;IACF,KAAK;KACH,aAAa,KAAK,mCAAmC,KAAK,KAAK,MAAM;KACrE;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,KAAK,KAAK,MAAM;KACxD;IACF,KAAK;KACH,aAAa,KAAK,qBAAqB,GAAG;KAC1C;IACF,KAAK;KACH,aAAa,KAAK,yBAAyB,GAAG;KAC9C;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,GAAG;KAC5C;IACF,KAAK;KACH,aAAa,KAAK,8BAA8B,GAAG;KACnD;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,GAAG;KAC3C;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,GAAG;KAC7C;IACF,KAAK;KACH,aAAa,KAAK,yBAAyB,GAAG;KAC9C;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,GAAG;KAC3C;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,GAAG;KAC7C;IACF,KAAK;KACH,aAAa,KAAK,kCAAkC,GAAG;KACvD;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,KAAK,KAAK,MAAM;KACtD;IACF,KAAK;KACH,aAAa,KAAK,iBAAiB,KAAK,KAAK,MAAM;KACnD;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,kCAAkC,KAAK,KAAK,MAAM;KACpE;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,mBAAmB,KAAK,KAAK,MAAM;KACrD;IACF,KAAK;KACH,aAAa,KAAK,yBAAyB,KAAK,KAAK,MAAM;KAC3D;IACF,KAAK;KACH,aAAa,KAAK,kCAAkC,KAAK,KAAK,MAAM;KACpE;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,KAAK,KAAK,MAAM;KACxD;IACF,KAAK;KACH,aAAa,KAAK,mBAAmB,KAAK,KAAK,MAAM;KACrD;IACF,KAAK;KACH,aAAa,KAAK,qBAAqB,KAAK,KAAK,MAAM;KACvD;IACF,KAAK;KACH,aAAa,KAAK,mBAAmB,KAAK,KAAK,MAAM;KACrD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,KAAK,KAAK,MAAM;KACzD;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,KAAK,KAAK,MAAM;KACxD;IACF,KAAK;KACH,aAAa,KAAK,0BAA0B,KAAK,KAAK,MAAM;KAC5D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,wBAAwB,KAAK,KAAK,MAAM;KAC1D;IACF,KAAK;KACH,aAAa,KAAK,0BAA0B,KAAK,KAAK,MAAM;KAC5D;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,KAAK,KAAK,MAAM;KACtD;IACF,KAAK;KACH,aAAa,KAAK,sBAAsB,KAAK,KAAK,MAAM;KACxD;IACF,KAAK;KACH,aAAa,KAAK,4BAA4B,KAAK,KAAK,MAAM;KAC9D;IACF,KAAK;KACH,aAAa,KAAK,qBAAqB,KAAK,KAAK,MAAM;KACvD;IACF,KAAK;KACH,aAAa,KAAK,gBAAgB,KAAK,KAAK,MAAM;KAClD;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,KAAK,KAAK,MAAM;KACtD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,kBAAkB,KAAK,KAAK,MAAM;KACpD;IACF,KAAK;KACH,aAAa,KAAK,yBAAyB,GAAG;KAC9C;IACF,KAAK;KACH,aAAa,KAAK,8BAA8B,GAAG;KACnD;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,GAAG;KAC5C;IACF,KAAK;KACH,aAAa,KAAK,gCAAgC,GAAG;KACrD;IACF,KAAK;KACH,aAAa,KAAK,6BAA6B,KAAK,KAAK,MAAM;KAC/D;IACF,KAAK;KACH,aAAa,KAAK,uCAAuC,GAAG;KAC5D;IACF,KAAK;KACH,aAAa,KAAK,oBAAoB,GAAG;KACzC;IACF,KAAK;KACH,aAAa,KAAK,uBAAuB,GAAG;KAC5C;IACF,KAAK;KACH,aAAa,KAAK,0BAA0B,GAAG;KAC/C;IACF,KAAK;KACH,aAAa,KAAK,iBAAiB,GAAG;KACtC;IACF,KAAK;KACH,aAAa,KAAK,4BAA4B,GAAG;KACjD;IACF,KAAK;KACH,aAAa,KAAK,8BAA8B,GAAG;KACnD;IACF,KAAK;KACH,aAAa,KAAK,iBAAiB,GAAG;KACtC;IACF,KAAK;KACH,aAAa,KAAK,YAAY,GAAG;KACjC;IACF,KAAK;KACH,aAAa,KAAK,eAAe,GAAG;KACpC;IACF,SACE,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,yBAA0B,IAAsB,MAClD;GACJ;GAIA,KAAK,MAAA,GAAA,8BAAA,SAAA,CAED;IAAE,MAAM;IAAW,OAAO,IAAI;IAAO,QAAQ,WAAW;GAAQ,GAChE,WAAW,QACb,CACF;EACF,SAAS,KAAK;GACZ,MAAM,SAAA,GAAA,8BAAA,eAAA,CAA8C,GAAG;GAGvD,KAAK,MAAA,GAAA,8BAAA,SAAA,CAAc;IAAE,MAAM;IAAU,OAAO,IAAI;IAAO;GAAM,GAAGC,8BAAAA,cAAc,CAAC;EACjF,UAAU;GACR,KAAK,OAAO,OAAO,IAAI,KAAK;EAC9B;CACF;CAEA,WAAmB,KAAuD;EACxE,MAAM,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS,gBAAgB,KAAA,IAAY,IAAI,SAAS;EACxF,IAAI,KAAK,SAAS,IAAI,GAAG,GACvB,MAAM,IAAIF,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,kCAAkC,KAAK;EAE3F,MAAM,UAAU,IAAI,gBAAgB,KAAK,OAAO;EAChD,QAAQ,uBAAuB,IAAI,wBAAwB;EAC3D,QAAQ,WAAW,IAAI;EACvB,IAAI,IAAI,SAAS,eAAe;GAC9B,QAAQ,cAAc,IAAI,eAAe;GACzC,MAAM,QAAQ,IAAI,WAAW,IAAI,KAAK;GACtC,IAAI;IACF,KAAK,gBAAgB,SAAS,OAAO,IAAI,QAAQ;GACnD,SAAS,OAAO;IAMd,IAAI,CAAC,oBAAoB,KAAK,GAAG,MAAM;IACvC,QAAQ,WAAW,KAAK;IACxB,KAAK,SAAS,IAAI,KAAK,OAAO;IAC9B,QAAA,GAAA,8BAAA,SAAA,CAAgB;KACd,KAAK;KACL,OAAO,IAAI;KACX,UAAU,sBAAsB;IAClC,CAAC;GACH;EACF,OAAO,IAAI,IAAI,SAAS,qBAAqB;GAC3C,MAAM,OAAO,KAAK,cAAc,kBAAkB;IAChD,KAAK,IAAI;IACT,OAAO,IAAI,WAAW,IAAI,SAAS;IACnC,UAAU,IAAI;IACd,aAAa,IAAI;GACnB,CAAC;GACD,QAAQ,eAAe,kBAAkB,KAAK,SAAS,MAAM,IAAI,OAAO,IAAI,QAAQ,CAAC;EACvF,OAAO;GACL,MAAM,OAAO,KAAK,cAAc,gBAAgB;IAC9C,KAAK,IAAI;IACT,MAAM,IAAI;IACV,UAAU,IAAI;IACd,aAAa,IAAI;GACnB,CAAC;GACD,QAAQ,eAAe,kBAAkB,KAAK,SAAS,MAAM,IAAI,OAAO,IAAI,QAAQ,CAAC;EACvF;EACA,KAAK,SAAS,IAAI,KAAK,OAAO;EAC9B,QAAA,GAAA,8BAAA,SAAA,CAAgB;GACd,KAAK;GACL,OAAO,IAAI;GACX,UAAU,IAAI,eAAe,KAAK,OAAO,CAAC,CAAC,yBACzC,SACA,IAAI,YAAY,EAClB;GACA,YAAY,KAAK,gBAAgB,OAAO;EAC1C,CAAC;CACH;;;;;;;;;;;;;CAcA,gBACE,SACA,OACA,UACM;EACN,IAAI,QAAQ,gBAAgB,SAAS;GACnC,MAAM,QAAQ,sBAAsB,KAAK,SAAS,OAAO,QAAQ;GAIjE,IAAI,SAAS;GACb,IAAI;IACF,SAAS,mBAAmB,KAAK,SAAS,MAAM,MAAM;GACxD,QAAQ;IACN,SAAS;GACX;GACA,IAAI,CAAC,QAAQ;IACX,QAAQ,eAAe,KAAK;IAC5B;GACF;GACA,MAAM,MAAM;EACd;EAGA,MAAM,OAAO,KAAK,cAAc,kBAAkB;GAChD,KAAK,eAAe,aAAa;GACjC;GACA;EACF,CAAC;EACD,QAAQ,eAAe,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,QAAQ,CAAC;EACzF,QAAQ,uBAAuB;CACjC;;;;;;;;CASA,gBAAwB,SAAqD;EAC3E,IAAI;GACF,OAAO,IAAI,gBAAgB,KAAK,SAAS,OAAO,CAAC,CAAC,eAAe;EACnE,QAAQ;GACN,OAAO;EACT;CACF;CAEA,qBAA6B,KAAiE;EAC5F,MAAM,UAAU,KAAK,eAAe,GAAG;EAIvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAmB,UAHzB,IAAI,cACjB,IAAI,kBAAkB,KAAK,SAAS,OAAO,CAAC,CAAC,wBAAwB,IACrE,IAAI,gBAAgB,KAAK,SAAS,OAAO,CAAC,CAAC,aAAa;EACT,CAAC;CACtD;CAEA,yBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,QAAQ,IAAI,gBAAgB,KAAK,SAAS,OAAO,CAAC,CAAC,aAAa,IAAI,GAAG;EAC7E,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAuB;EAAM,GAAG,CAAC,KAAK,CAAC;CAChE;CAEA,uBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,gBAAgB,KAAK,SAAS,OAAO,CAAC,CAAC,OAAO,IAAI,KAAK,IAAI,SAAS;EACvF,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAqB;EAAO,GAAG,CAAC,MAAM,CAAC;CAChE;CAEA,8BACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,QAAQ,IAAI,gBAAgB,KAAK,SAAS,OAAO,CAAC,CAAC,cAAc,IAAI,aAAa;EACxF,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA4B;GAAO,MAAM,MAAM;EAAW,GAAG,CAAC,KAAK,CAAC;CAC7F;CAEA,sBAA8B,KAAkE;EAC9F,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAoB,SAD3B,IAAI,gBAAgB,KAAK,SAAS,OAAO,CAAC,CAAC,QACV;EAAE,CAAC;CACtD;CAEA,wBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAQvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAsB,QAN9B,IAAI,iBACjB,KAAK,SACL,SACA,KAAK,eACL,KAAK,QAAQ,oBACf,CAAC,CAAC,QAAQ,IAAI,KACoC;EAAE,CAAC;CACvD;CAEA,yBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,iBACjB,KAAK,SACL,SACA,KAAK,eACL,KAAK,QAAQ,oBACf,CAAC,CAAC,SAAS,IAAI,KAAK;EACpB,IAAI,OAAO,WAAW,qBACpB,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAuB;EAAO,CAAC;EAIxD,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAuB;EAAO,GAAG,IAAI,YAAY;CAC9F;CAEA,wBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAsB,UAD5B,IAAI,kBAAkB,KAAK,SAAS,OAAO,CAAC,CAAC,QAAQ,IAAI,KACtB;EAAE,CAAC;CACzD;;;;;;CAOA,kCACE,KAC+B;EAS/B,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgC,GARrC,IAAI,mBAAmB,KAAK,SAAS,KAAK,aAAa,CAAC,CAAC,SAAS;IAClF,MAAM,IAAI;IACV,WAAW,IAAI;IACf,cAAc,IAAI;IAClB,mBAAmB,IAAI;IACvB,KAAK,IAAI,WAAW,IAAI,GAAG;IAC3B,UAAU,IAAI,YAAY;GAC5B,CACkE;EAAE,CAAC;CACvE;CAEA,sBAA8B,KAAkE;EAC9F,MAAM,UAAU,KAAK,eAAe,GAAG;EAOvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAoB,QAN5B,IAAI,iBACjB,KAAK,SACL,SACA,KAAK,eACL,KAAK,QAAQ,oBACf,CAAC,CAAC,MAAM,IAAI,SACoC;EAAE,CAAC;CACrD;;;;;;CAOA,uBAA+B,KAA0B;EACvD,IAAI,CAAC,eAAe,IAAI,IAAI,IAAI,KAAK,EAAE,WAAW,MAAM;EACxD,MAAM,YAAY,eAAe,MAAM,IAAI,YAAY,KAAA;EACvD,MAAM,UAAU,KAAK,SAAS,IAAI,WAAW,IAAI,OAAO,SAAS,CAAC;EAClE,IAAI,SAAS,gBACX,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,yBAAyB,QAAQ,eAAe,SAAS,UAAU,qDACrE;CAEJ;CAEA,mBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiB,UADvB,IAAI,eAAe,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MACjB;EAAE,CAAC;CACpD;CAEA,qBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,gBAAgB,KAAK,SAAS,OAC7B,CAAC,CAAC,OAAO,IAAI,OAAO,MAAM;EAC/C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAmB;EAAO,GAAG,IAAI,YAAY;CAC1F;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB,UADtB,IAAI,sBAAsB,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MACzB;EAAE,CAAC;CACnD;CAEA,4BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA0B,UADhC,IADE,oBAAoB,KAAK,SAAS,SAAS,KAAK,KAC7C,CAAC,CAAC,QAAQ,MACwB;EAAE,CAAC;CAC7D;CAEA,6BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA2B,UADjC,IADE,oBAAoB,KAAK,SAAS,SAAS,KAAK,KAC7C,CAAC,CAAC,QAAQ,IAAI,kBAAkB,MACG;EAAE,CAAC;CAC9D;CAEA,8BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA4B,UADlC,IADE,iBAAiB,KAAK,SAAS,SAAS,KAAK,KAC1C,CAAC,CAAC,KAAK,IAAI,kBAAkB,MACO;EAAE,CAAC;CAC/D;CAEA,mCACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADI,2BAA2B,KAAK,SAAS,OACxC,CAAC,CAAC,OAAO,IAAI,kBAAkB,IAAI,WAAW,CAAC,GAAG,MAAM;EAE5E,MAAM,WAAW,OAAO,YAAY,KAAK,MAAM,EAAE,OAAO,IAAI;EAC5D,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiC;EAAO,GAAG,QAAQ;CAC5E;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,SAAS,KAAK,KAC7C,CAAC,CAAC,OACrB,IAAI,kBACJ,IAAI,OACJ,QACA,IAAI,OACJ,IAAI,SACN;EACA,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,SAAS,KAAK,KAC7C,CAAC,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,QAAQ,IAAI,OAAO,IAAI,SAAS;EAClF,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,OAAO,IAAI,KAAK,MAAM;EAC7C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,yBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,oBAAoB,KAAK,SAAS,OAAO,CAAC,CAAC,QAC5D,IAAI,kBACJ,IAAI,MACJ,IAAI,OACJ,MACF;EACA,IAAI,OAAO,SAAS,MAAM,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAuB;EAAO,CAAC;EAChF,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAuB;EAAO,GAAG,IAAI,YAAY;CAC9F;CAEA,kCACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,WAAW,IAAI,oBAAoB,KAAK,SAAS,OAAO,CAAC,CAAC,iBAC9D,IAAI,kBACJ,IAAI,MACJ,MACF;EAEA,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAAgC,OAAO,SAAS;GAAO,MAAM,SAAS;EAAK,GAClF,CAAC,SAAS,KAAK,CACjB;CACF;CAEA,sBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,KAAK,IAAI,kBAAkB,IAAI,MAAM,IAAI,SAAS,MAAM;EAC/E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAoB;EAAO,GAAG,IAAI,YAAY;CAC3F;CAEA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAc,UADpB,IADE,YAAY,KAAK,SAAS,OACvB,CAAC,CAAC,KAAK,MACe;EAAE,CAAC;CACjD;CAEA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,KAAK,IAAI,mBAAmB,IAAI,WAAW,MAAM;EACxE,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAc;EAAO,GAAG,IAAI,YAAY;CACrF;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,OAAO,IAAI,mBAAmB,IAAI,UAAU,MAAM;EACzE,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,OAAO,IAAI,mBAAmB,MAAM;EAC3D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,mBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,QACrB;GACE,MAAM,IAAI;GACV,kBAAkB,IAAI;GACtB,GAAI,IAAI,YAAY,KAAA,IAAY,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;EAC9D,GACA,MACF;EACA,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAiB;EAAO,GAAG,IAAI,YAAY;CACxF;CAEA,sBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,aAAa,KAAK,SAAS,OAC1B,CAAC,CAAC,WAAW,EAAE,MAAM,IAAI,KAAK,GAAG,MAAM;EAC5D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAoB;EAAO,GAAG,IAAI,YAAY;CAC3F;CAEA,mBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,eAAe,KAAK,SAAS,OAAO,CAAC,CAAC,QACvD,IAAI,mBACJ,IAAI,OACJ,MACF;EACA,IAAI,OAAO,SAAS,MAAM,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiB;EAAO,CAAC;EAC1E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAiB;EAAO,GAAG,IAAI,YAAY;CACxF;CAEA,qBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM;EAClF,IAAI,OAAO,SAAS,MAAM,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAmB;EAAO,CAAC;EAC5E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAmB;EAAO,GAAG,IAAI,YAAY;CAC1F;CAEA,mBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,YAAY,IAAI,eAAe,KAAK,SAAS,OAAO,CAAC,CAAC,QAC1D,IAAI,mBACJ,MACF;EAEA,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAiB,OAAO,UAAU;GAAO,MAAM,UAAU;EAAK,GAAG,CACtF,UAAU,KACZ,CAAC;CACH;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADM,cAAc,KAAK,SAAS,OAC3B,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,WAAW,MAAM;EAC/D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADM,cAAc,KAAK,SAAS,OAC3B,CAAC,CAAC,YACtB;GAAE,MAAM,IAAI;GAAM,OAAO,IAAI;EAAM,GACnC,IAAI,WACJ,MACF;EACA,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAqB;EAAO,GAAG,IAAI,YAAY;CAC5F;CAEA,sBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAoB,OAD7B,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MAChB;EAAE,CAAC;CACpD;CAEA,0BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,UAAU,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,SAC1D,IAAI,KACJ,IAAI,MACJ,IAAI,iBACJ,MACF;EAGA,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAAwB;EAAQ,GACvC,QAAQ,UAAU,KAAA,IAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,CACnD;CACF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,OAAO,IAAI,MAAM,IAAI,WAAW,MAAM;EAC7D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,kBAAkB,KAAK,SAAS,OAC/B,CAAC,CAAC,OAAO,IAAI,KAAK,MAAM;EAC7C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,0BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,UAAU,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,mBAC1D,IAAI,kBACJ,IAAI,KACJ,IAAI,MACJ,IAAI,iBACJ,MACF;EACA,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAAwB;EAAQ,GACvC,QAAQ,UAAU,KAAA,IAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,CACnD;CACF;CAEA,oBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAkB,UADxB,IADI,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBAC1C,CAAC,CAAC,KAAK,IAAI,aAAa,MACA;EAAE,CAAC;CACrD;CAEA,sBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,IADqB,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBAC3D,CAAC,CAAC,OAAO,IAAI,aAAa,IAAI,OAAO,MAAM;EAElD,OAAO,KAAK,eAAe,SAAS,EAAE,KAAK,mBAAmB,GAAG,IAAI,YAAY;CACnF;CAEA,4BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA0B,cAD5B,IADA,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBACtC,CAAC,CAAC,aAAa,MACiB;EAAE,CAAC;CACjE;CAEA,qBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,IADqB,kBAAkB,KAAK,SAAS,SAAS,IAAI,gBAC3D,CAAC,CAAC,MAAM,IAAI,aAAa,MAAM;EACtC,OAAO,KAAK,eAAe,SAAS,EAAE,KAAK,kBAAkB,GAAG,IAAI,YAAY;CAClF;CAEA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAc,UADpB,IADE,eAAe,KAAK,SAAS,OAC1B,CAAC,CAAC,KAAK,IAAI,kBAAkB,MACP;EAAE,CAAC;CACjD;CAEA,oBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAkB,UADxB,IADE,mBAAmB,KAAK,SAAS,OAC9B,CAAC,CAAC,KAAK,IAAI,kBAAkB,MACH;EAAE,CAAC;CACrD;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAGvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB,OADzB,IADK,aAAa,KAAK,SAAS,OAC3B,CAAC,CAAC,MAAM,IAAI,SAAS,MACG;EAAE,CAAC;CAChD;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADI,iBAAiB,KAAK,SAAS,OAC9B,CAAC,CAAC,OAAO,IAAI,kBAAkB,IAAI,WAAW,CAAC,GAAG,MAAM;EAC5E,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB;EAAO,GAAG,CAAC,OAAO,IAAI,CAAC;CAChE;CAEA,MAAc,eACZ,KAIe;EAIf,IAAI,CAAC,KAAK,QAAQ,cAAc;GAC9B,KAAK,MAAA,GAAA,8BAAA,SAAA,CAED;IACE,MAAM;IACN,OAAO,IAAI;IACX,QAAA,GAAA,8BAAA,eAAA,CACE,IAAID,8BAAAA,YACFC,8BAAAA,gBAAgB,gBAChB,uFACF,CACF;GACF,GACAC,8BAAAA,cACF,CACF;GACA;EACF;EACA,MAAM,OAAO,IAAI,gBAAgB;EACjC,KAAK,OAAO,IAAI,IAAI,OAAO,IAAI;EAC/B,IAAI;GACF,IAAI;GACJ,QAAQ,IAAI,MAAZ;IACE,KAAK;KACH,aAAa,MAAM,KAAK,yBAAyB,KAAK,KAAK,MAAM;KACjE;IACF,KAAK;KACH,aAAa,MAAM,KAAK,oCAAoC,KAAK,KAAK,MAAM;KAC5E;IACF,KAAK;KACH,aAAa,MAAM,KAAK,0CAA0C,KAAK,KAAK,MAAM;KAClF;GACJ;GACA,KAAK,MAAA,GAAA,8BAAA,SAAA,CAED;IAAE,MAAM;IAAW,OAAO,IAAI;IAAO,QAAQ,WAAW;GAAQ,GAChE,WAAW,QACb,CACF;EACF,SAAS,KAAK;GACZ,KAAK,MAAA,GAAA,8BAAA,SAAA,CACM;IAAE,MAAM;IAAU,OAAO,IAAI;IAAO,QAAA,GAAA,8BAAA,eAAA,CAAsB,GAAG;GAAE,GAAGA,8BAAAA,cAAc,CAC3F;EACF,UAAU;GACR,KAAK,OAAO,OAAO,IAAI,KAAK;EAC9B;CACF;CAEA,MAAc,aACZ,QACA,QACA,QAC2B;EAC3B,MAAM,UAAU,KAAK,QAAQ;EAC7B,IAAI,CAAC,SACH,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,gBAChB,uFACF;EAEF,MAAM,EAAE,OAAO,gBAAgB,MAAM,QAAQ,OAAO,QAAQ,MAAM;EAGlE,IAAI,OAAO,SACT,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,6BAA6B;EAE9E,OAAO;GAAE;GAAa,OAAO,OAAO;GAAO,QAAQ,OAAO;GAAQ;EAAM;CAC1E;CAEA,MAAc,yBACZ,KACA,QACwC;EACxC,MAAM,QAAQ,KAAK,kBAAkB;GAAE,GAAG;GAAK,MAAM;EAAe,GAAG,MAAM;EAC7E,IAAI,MAAM,QAAQ,QAAQ,gBACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,cAAc,MAAM,QAAQ,KAAK;EAErF,MAAM,QAAQ,MAAM,KAAK,aAAa,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM;EAC9E,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAuB;EAAM,GAAG,CAAC,MAAM,MAAM,MAAM,CAAC;CAC7E;CAEA,MAAc,oCACZ,KACA,QACwC;EAGxC,MAAM,QAAQ,KAAK,6BACjB;GAAE,GAAG;GAAK,MAAM;EAA0B,GAC1C,MACF;EACA,IAAI,MAAM,QAAQ,QAAQ,2BACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,cAAc,MAAM,QAAQ,KAAK;EAErF,MAAM,QAAQ,MAAM,KAAK,aAAa,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM;EAC9E,QAAA,GAAA,8BAAA,SAAA,CACE;GACE,KAAK;GACL,kBAAkB,MAAM,QAAQ;GAChC,WAAW,MAAM,QAAQ;GACzB;EACF,GACA,CAAC,MAAM,MAAM,MAAM,CACrB;CACF;CAEA,MAAc,0CACZ,KACA,QACwC;EACxC,MAAM,QAAQ,KAAK,mCACjB;GAAE,GAAG;GAAK,MAAM;EAAgC,GAChD,MACF;EACA,IAAI,MAAM,QAAQ,QAAQ,iCACxB,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,cAAc,MAAM,QAAQ,KAAK;EAErF,MAAM,EAAE,WAAW,gBAAgB,MAAM,QAAQ;EAOjD,MAAM,UAAmC,CAAC;EAC1C,KAAK,MAAM,KAAK,aACd,QAAQ,KAAK;GACX,KAAK,EAAE;GACP,MAAM,EAAE;GACR,MAAM,EAAE;GACR,OAAO,MAAM,KAAK,aAAa,EAAE,QAAQ,IAAI,QAAQ,MAAM;EAC7D,CAAC;EAEH,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAAwC,QAAQ;IAAE;IAAW,aAAa;GAAQ;EAAE,GAC3F,QAAQ,KAAK,MAAM,EAAE,MAAM,MAAM,MAAM,CACzC;CACF;CAEA,yBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAMvC,IAAI,IAAI,SAAS,eAAe;GAC9B,MAAM,OAAO,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,SAAS;GAC/D,QAAA,GAAA,8BAAA,SAAA,CACE;IAAE,KAAK;IAAuB,OAAO,KAAK;IAAO,MAAM,KAAK,MAAM;GAAW,GAC7E,CAAC,KAAK,KAAK,CACb;EACF;EACA,MAAM,QAAQ,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,uBAAuB,IAAI,IAAI;EACtF,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAuB,OAAO,MAAM;GAAO,MAAM,MAAM;EAAK,GAAG,CACpF,MAAM,KACR,CAAC;CACH;CAEA,uBACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAWvC,IAJE,IAAI,SAAS,kBACZ,CAAC,QAAQ,gBAAgB,KACxB,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,uBAAuB,IAAI,MAAM,IAAI,IAAI,CAAC,CAChF,qBACQ;GACb,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,sBAAsB,IAAI,IAAI;GACvE,QAAA,GAAA,8BAAA,SAAA,CAAgB;IAAE,KAAK;IAAqB,MAAM,IAAI;GAAK,CAAC;EAC9D;EACA,IAAI,IAAI,SAAS,eACf,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAqB,MAAM,IAAI;EAAK,CAAC;EAG9D,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAqB,MAD9B,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,qBAAqB,IAAI,MAAM,IAAI,IACpC,CAAC,CAAC;EAAK,CAAC;CAChE;CAEA,8BACE,KAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,IAAI,QAAQ,SAAS,SACnB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0DACF;EAEF,MAAM,WAAW,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,CAAC,kBAAkB;EAC5E,QAAA,GAAA,8BAAA,SAAA,CACE;GAAE,KAAK;GAA4B,OAAO,SAAS;GAAO,MAAM,SAAS;EAAK,GAC9E,CAAC,SAAS,KAAK,CACjB;CACF;CAEA,gCACE,KAC+B;EAG/B,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAA8B,UADpC,IADE,eAAe,KAAK,OACjB,CAAC,CAAC,UAAU,IAAI,MAAM,IAAI,QACY;EAAE,CAAC;CACjE;;;;;;;;;CAUA,6BACE,KACA,QAC+B;EAC/B,MAAM,UAAU,IAAI,gBAAgB,KAAK,OAAO;EAChD,MAAM,OAAO,KAAK,cAAc,gBAAgB;GAC9C,KAAK,cAAc,IAAI;GACvB,MAAM,IAAI;GACV,UAAU,IAAI;EAChB,CAAC;EACD,IAAI;GACF,QAAQ,eACN,kBAAkB,KAAK,SAAS,MAAM,EAAE,MAAM,QAAQ,GAAG,IAAI,QAAQ,CACvE;GACA,MAAM,SAAS,IAAI,YAAY,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,MAAM;GACjE,MAAM,OAAO,OAAO,MAAM,IAAI;GAC9B,IAAI,CAAC,MACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,oCAAoC,IAAI,UAAU,cAAc,OAAO,UAAU,EACnF;GAEF,MAAM,SAAS,IAAI,iBAAiB,KAAK,SAAS,OAAO,CAAC,CAAC,OACzD,KAAK,kBACL,IAAI,WAAW,CAAC,GAChB,MACF;GACA,QAAA,GAAA,8BAAA,SAAA,CACE;IACE,KAAK;IACL,kBAAkB,KAAK;IACvB,WAAW,OAAO;IAClB;GACF,GACA,CAAC,OAAO,IAAI,CACd;EACF,UAAU;GAGR,QAAQ,MAAM;EAChB;CACF;CAEA,uCACE,KAC+B;EAK/B,MAAM,SAAS,KAAK,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC;EACtD,IAAI;EACJ,IAAI,QAAQ,SAAS,GAAG;GACtB,KAAK,gBAAgB,QAAQ,OAAO,YAAY,GAAG,IAAI,QAAQ;GAC/D,OAAO,WAAW,IAAI;GACtB,UAAU;EACZ,OACE,UAAU,KAAK,eAAe,GAAG;EAOnC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GACd,KAAK;GACL,UAPe,IAAI,eAAe,KAAK,OAAO,CAAC,CAAC,yBAChD,SACA,IAAI,UACJ,IAAI,QAAQ,KAIL;GACP,YAAY,KAAK,gBAAgB,OAAO;EAC1C,CAAC;CACH;CAEA,oBAA4B,KAAgE;EAC1F,KAAK,MAAM,SACT,IAAI,SACJ,IAAI,YACJ,IAAI,QACJ,IAAI,QACJ,IAAI,WAAW,IAAI,IAAI,CACzB;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB;GACd,KAAK;GACL,SAAS,IAAI;GACb,UAAU,KAAK,MAAM,SAAS,IAAI,OAAO;EAC3C,CAAC;CACH;CAEA,4BACE,KAC+B;EAC/B,QAAA,GAAA,8BAAA,SAAA,CAAgB;GACd,KAAK;GACL,UAAU,KAAK,MAAM,iBAAiB,IAAI,OAAO;EACnD,CAAC;CACH;;CAGA,8BACE,KAC+B;EAE/B,MAAM,SADU,KAAK,eAAe,GACf,CAAC,CAAC,cAAc;EACrC,MAAM,EAAE,OAAO,KAAK;EACpB,IAAI,IAAI,oBAAoB,KAAA,GAAW;GACrC,MAAM,OAAO;IAAE,SAAS;IAAG,QAAQ;IAAG,MAAM;GAAE,EAAE,IAAI;GACpD,IAAI,CAAC,GAAG,+BAA+B,QAAQ,IAAI,GACjD,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uCAAuC;EAE7F;EACA,IAAI,IAAI,wBAAwB,KAAA,GAC1B;OAAA,CAAC,GAAG,+BAA+B,QAAQ,IAAI,mBAAmB,GACpE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,uCAAuC;EAAA;EAG7F,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,2BAA2B,CAAC;CACrD;CAEA,uBACE,KAC+B;EAC/B,KAAK,MAAM,YAAY,IAAI,OAAO;EAClC,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,oBAAoB,CAAC;CAC9C;CAEA,0BACE,MAC+B;EAC/B,KAAK,MAAM,eAAe;EAC1B,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,uBAAuB,CAAC;CACjD;CAEA,iBAAyB,MAA8D;EACrF,KAAK,MAAM,MAAM;EACjB,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,cAAc,CAAC;CACxC;;;;;;;;;CAUA,iBAAyB,KAA6D;EACpF,MAAM,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS;EAC/C,MAAM,UAAU,KAAK,SAAS,IAAI,GAAG;EACrC,IAAI,SAAS;GACX,iBAAiB,KAAK,SAAS,OAAO;GACtC,sBAAsB,KAAK,SAAS,OAAO;GAC3C,QAAQ,MAAM;GACd,KAAK,SAAS,OAAO,GAAG;EAC1B;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,QAAQ,CAAC;CAClC;CAEA,YAAoB,KAAwD;EAC1E,KAAK,MAAM,CAAC,KAAK,YAAY,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;GAChE,IAAI,CAAC,uBAAuB,KAAK,IAAI,KAAK,GAAG;GAC7C,iBAAiB,KAAK,SAAS,OAAO;GACtC,sBAAsB,KAAK,SAAS,OAAO;GAC3C,QAAQ,MAAM;GACd,KAAK,SAAS,OAAO,GAAG;EAC1B;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,QAAQ,CAAC;CAClC;CAEA,eAAuB,MAA4D;EACjF,IAAI,CAAC,KAAK,WAAW;GACnB,KAAK,YAAY;GACjB,KAAK,MAAM,WAAW,KAAK,SAAS,OAAO,GAAG;IAC5C,iBAAiB,KAAK,SAAS,OAAO;IACtC,sBAAsB,KAAK,SAAS,OAAO;IAC3C,QAAQ,MAAM;GAChB;GACA,KAAK,SAAS,MAAM;GACpB,KAAK,cAAc,WAAW;GAC9B,eAAe,KAAK,OAAO;EAC7B;EACA,QAAA,GAAA,8BAAA,SAAA,CAAgB,EAAE,KAAK,WAAW,CAAC;CACrC;CAEA,eAAuB,KAA6D;EAClF,MAAM,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS;EAC/C,MAAM,UAAU,KAAK,SAAS,IAAI,GAAG;EACrC,IAAI,SAAS,SAAS,GAGpB,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,qBAChB,wCAAwC,KAC1C;EAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,OAAO,GAC9B,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,8BAA8B,KAAK;EAEvF,OAAO;CACT;;;;;;;;;CAUA,gBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAc,UAAU,IAD5B,WAAW,KAAK,SAAS,OACQ,CAAC,CAAC,SAAS,MAAM;EAAE,CAAC;CAC1E;CAEA,oBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,SAAS,IAAI,KAAK,IAAI,OAAO,MAAM;EAC1D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAkB;EAAO,GAAG,IAAI,YAAY;CACzF;CAEA,iBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,MAAM,IAAI,KAAK,MAAM;EAC5C,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAe;EAAO,GAAG,IAAI,YAAY;CACtF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,SAAS,IAAI,oBAAoB,KAAK,SAAS,OAAO,CAAC,CAAC,MAAM,IAAI,SAAS,MAAM;EACvF,IAAI,OAAO,SAAS,MAAM,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAsB;EAAO,CAAC;EAC/E,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAsB;EAAO,GAAG,IAAI,YAAY;CAC7F;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,WAAW,IADE,WAAW,KAAK,SAAS,OACtB,CAAC,CAAC,WAAW,IAAI,QAAQ,MAAM;EACrD,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,KAAK;GAAgB,QAAQ,SAAS;GAAQ,OAAO,SAAS;EAAM,GAAG,CACvF,SAAS,KACX,CAAC;CACH;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,WAAW,IAAI,MAAM,IAAI,QAAQ,MAAM;EAC9D,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,kBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,SAAS,IADK,YAAY,KAAK,SAAS,OACzB,CAAC,CAAC,OAAO,IAAI,mBAAmB,OAAO,MAAM;EAClE,OAAO,KAAK,eAAe,SAAS;GAAE,KAAK;GAAgB;EAAO,GAAG,IAAI,YAAY;CACvF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,YAAY,IAAI,OAAO,MAAM;EACvD,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAqB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACrE,IAAI,YACN;CACF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,YAAY,IAAI,KAAK,IAAI,OAAO,MAAM;EAChE,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAqB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACrE,IAAI,YACN;CACF;CAEA,kCACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EACvC,MAAM,EAAE,OAAO,UAAU,IAAI,YAAY,KAAK,SAAS,OAAO,CAAC,CAAC,uBAC9D,IAAI,KACJ,IAAI,WAAW,IAAI,GAAG,GACtB,IAAI,WACJ,MACF;EACA,MAAM,OAAqB;GACzB,eAAe,MAAM,KAAK,QAAQ,QAAQ,UAAU,GAAG,CAAC;GACxD,YAAY;EACd;EACA,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAgC,QAAQ;IAAE;IAAO;GAAK;EAAE,GAC/D,IAAI,YACN;CACF;CAEA,uBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,0BAA0B,oBAAoB,IADlC,YAAY,KAAK,SAAS,OACc,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM;EAKzF,MAAM,cAAc,IAAI,kBAAkB,KAAK,SAAS,OAAO;EAC/D,KAAK,MAAM,UAAU,iBAAiB;GACpC,IAAI,OAAO,qBAAqB,KAAK,OAAO,oBAAoB,GAAG;GACnE,YAAY,OACV;IACE,MAAM;IACN,kBAAkB,OAAO;IACzB,mBAAmB,OAAO;GAC5B,GACA,MACF;EACF;EAGA,QAAQ,aAAa;EAErB,OAAO,KAAK,eACV,SACA;GACE,KAAK;GACL,QAAQ;IACN;IACA,gBAAgB;IAChB,MAAM;GACR;EACF,GACA,IAAI,YACN;CACF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,aAAa,IAAI,KAAK,IAAI,QAAQ,IAAI,SAAS,MAAM;EAC/E,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAsB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACtE,IAAI,YACN;CACF;CAEA,wBACE,KACA,QAC+B;EAC/B,MAAM,UAAU,KAAK,eAAe,GAAG;EAEvC,MAAM,EAAE,UAAU,IADE,YAAY,KAAK,SAAS,OACtB,CAAC,CAAC,aAAa,IAAI,KAAK,IAAI,QAAQ,MAAM;EAClE,OAAO,KAAK,eACV,SACA;GAAE,KAAK;GAAsB,QAAQ;IAAE;IAAO,MAAM;GAAgB;EAAE,GACtE,IAAI,YACN;CACF;CAEA,eACE,SACA,SACA,cAC+B;EAO/B,IACE,CAAC,QAAQ,IAAI,WAAW,QAAQ,KAChC,QAAQ,QAAQ,mBAChB,QAAQ,QAAQ,qBAChB,QAAQ,QAAQ,uBAEhB,QAAQ,aAAa;EAEvB,IAAI,QAAQ,SAAS,WAAW,CAAC,QAAQ,sBACvC,QAAA,GAAA,8BAAA,SAAA,CAAgB,OAAO;EAEzB,MAAM,QAAQ,KAAK,kBAAkB,SAAS,YAAY;EAC1D,QAAA,GAAA,8BAAA,SAAA,CAAgB;GAAE,GAAG;GAAS,GAAG,MAAM;EAAQ,GAAG,MAAM,QAAQ;CAClE;CAEA,kBAA0B,SAA0B,cAA0C;EAC5F,MAAM,QAAQ,IAAI,cAAc,KAAK,SAAS,OAAO;EACrD,IAAI,cAEF,OAAO;GAAE,SAAS,EAAE,cADC,MAAM,wBAAwB,YACpB,EAAE;GAAG,UAAU,CAAC;EAAE;EAEnD,MAAM,WAAW,MAAM,kBAAkB;EACzC,OAAO;GAAE,SAAS,EAAE,SAAS;GAAG,UAAU,CAAC,SAAS,KAAK;EAAE;CAC7D;AACF;;AAQA,MAAM,kBAAgC;CAAE,eAAe,CAAC;CAAG,YAAY;AAAK;AAE5E,MAAM,sBAAsB;;AAG5B,MAAM,iCAAqD,IAAI,IAA2B;CACxF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,WAAW,OAAe,WAA4B;CAC7D,OAAO,GAAG,MAAM,IAAI,YAAY,SAAS,cAAc;AACzD;AAEA,SAAS,uBAAuB,KAAa,OAAwB;CACnE,OAAO,QAAQ,WAAW,KAAK,KAAK,IAAI,WAAW,GAAG,MAAM,SAAS;AACvE;AAEA,SAAS,oBAAoB,OAAyB;CACpD,OACE,iBAAiBD,8BAAAA,gBAChB,MAAM,SAASC,8BAAAA,gBAAgB,uBAC9B,MAAM,SAASA,8BAAAA,gBAAgB;AAErC;;;;;;;;AASA,SAAS,wBAAwB;CAC/B,OAAO;EACL,iBAAiB;EACjB,4BAA4B;EAC5B,yBAAyB;EACzB,oBAAoB;EACpB,0BAA0B;EAC1B,aAAa;EACb,kBAAkB,KAAK,IAAI;CAC7B;AACF"}
|